Source Code

;; milestone-escrow.clar
;; Escrow with milestone release

(define-map escrows uint {payer: principal, payee: principal, amount: uint, released: bool})
(define-data-var escrow-count uint u0)

(define-public (create-escrow (payee principal) (amount uint))
    (let ((id (+ (var-get escrow-count) u1)))
        (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
        (map-set escrows id {payer: tx-sender, payee: payee, amount: amount, released: false})
        (var-set escrow-count id)
        (ok id)
    )
)

(define-public (release (id uint))
    (let ((escrow (unwrap! (map-get? escrows id) (err u404))))
        (asserts! (is-eq tx-sender (get payer escrow)) (err u403))
        (asserts! (not (get released escrow)) (err u400))
        (try! (as-contract (stx-transfer? (get amount escrow) tx-sender (get payee escrow))))
        (map-set escrows id (merge escrow {released: true}))
        (ok true)
    )
)

Functions (2)

FunctionAccessArgs
create-escrowpublicpayee: principal, amount: uint
releasepublicid: uint