;; Escrow Service V47 - DeFi Contract
;; Generated by Clarity Hub
;; Category: DeFi
(define-constant ERR_UNAUTHORIZED (err u100))
(define-constant ERR_NOT_OWNER (err u101))
(define-constant ERR_INVALID_AMOUNT (err u102))
(define-constant ERR_ALREADY_EXISTS (err u103))
(define-constant ERR_NOT_FOUND (err u104))
(define-data-var contract-owner principal tx-sender)
(define-public (set-owner (new-owner principal))
(begin
(asserts! (is-eq tx-sender (var-get contract-owner)) ERR_NOT_OWNER)
(var-set contract-owner new-owner)
(ok true))
)
(define-map escrows uint { buyer: principal, seller: principal, amount: uint, state: (string-ascii 10) })
(define-data-var escrow-id uint u0)
(define-public (create (seller principal) (amount uint))
(let ((id (+ (var-get escrow-id) u1)))
(var-set escrow-id id)
(try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
(map-set escrows id { buyer: tx-sender, seller: seller, amount: amount, state: "OPEN" })
(ok id)
)
)
(define-public (confirm (id uint))
(let ((escrow (unwrap! (map-get? escrows id) ERR_NOT_FOUND)))
(asserts! (is-eq tx-sender (get buyer escrow)) ERR_UNAUTHORIZED)
(map-set escrows id (merge escrow { state: "RELEASED" }))
(as-contract (stx-transfer? (get amount escrow) tx-sender (get seller escrow)))
)
)