Source Code

;; Vesting Wallet V6 - 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))
    )
)

Functions (3)

FunctionAccessArgs
set-ownerpublicnew-owner: principal
add-beneficiarypublicbeneficiary: principal, amount: uint, duration: uint
releasepublic