;; Vesting Wallet V76 - 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 vestings principal { total: uint, released: uint, start: uint, duration: uint })
(define-public (add-beneficiary (beneficiary principal) (amount uint) (duration uint))
(begin
(asserts! (is-eq tx-sender (var-get contract-owner)) ERR_UNAUTHORIZED)
(map-set vestings beneficiary { total: amount, released: u0, start: block-height, duration: duration })
(stx-transfer? amount tx-sender (as-contract tx-sender))
)
)
(define-public (release)
(let (
(vesting (unwrap! (map-get? vestings tx-sender) ERR_NOT_FOUND))
(time-passed (- block-height (get start vesting)))
(vested (/ (* (get total vesting) time-passed) (get duration vesting)))
(claimable (- vested (get released vesting)))
)
(asserts! (> claimable u0) ERR_INVALID_AMOUNT)
(map-set vestings tx-sender (merge vesting { released: vested }))
(as-contract (stx-transfer? claimable tx-sender tx-sender))
)
)