Source Code

;; ============================================
;; VAULT - Asset & Secret Locker
;; Clarity 4 Smart Contract
;; ============================================

(define-constant ERR_NOT_AUTHORIZED (err u401))
(define-constant ERR_INVALID_PARAM (err u400))
(define-constant ERR_TRIGGERED (err u410))
(define-constant ERR_NOT_TRIGGERED (err u411))
(define-constant ERR_INSUFFICIENT_FUNDS (err u402))

(define-map secrets principal {
  message-hash: (buff 32),
  message-uri: (string-ascii 200)
})

(define-map deposits principal uint)

(define-public (deposit-stx (amount uint))
  (begin
    (asserts! (> amount u0) ERR_INVALID_PARAM)
    (try! (stx-transfer? amount tx-sender .vault))
    (map-set deposits tx-sender (+ (default-to u0 (map-get? deposits tx-sender)) amount))
    (ok true)
  )
)

(define-public (set-message (hash (buff 32)) (uri (string-ascii 200)))
  (begin
    (asserts! (> (len uri) u0) ERR_INVALID_PARAM)
    (asserts! (> (len hash) u0) ERR_INVALID_PARAM)
    (map-set secrets tx-sender { message-hash: hash, message-uri: uri })
    (ok true)
  )
)

(define-public (withdraw-stx (amount uint))
  (let
    (
      (user tx-sender)
      (triggered (contract-call? .heartbeat-core is-triggered user))
      (balance (default-to u0 (map-get? deposits user)))
    )
    (asserts! (not triggered) ERR_TRIGGERED)
    (asserts! (<= amount balance) ERR_INSUFFICIENT_FUNDS)
    
    (try! (as-contract (stx-transfer? amount tx-sender user)))
    (map-set deposits user (- balance amount))
    (ok true)
  )
)

;; Called by trigger-actions contract to distribute funds
(define-public (distribute-stx (owner principal) (recipient principal) (amount uint))
  (let
    (
      (triggered (contract-call? .heartbeat-core is-triggered owner))
      (balance (default-to u0 (map-get? deposits owner)))
    )
    (asserts! (is-eq contract-caller .trigger-actions) ERR_NOT_AUTHORIZED)
    (asserts! triggered ERR_NOT_TRIGGERED)
    (asserts! (<= amount balance) ERR_INSUFFICIENT_FUNDS)
    (asserts! (not (is-eq owner recipient)) ERR_INVALID_PARAM)
    
    (try! (as-contract (stx-transfer? amount tx-sender recipient)))
    (map-set deposits owner (- balance amount))
    (ok true)
  )
)

(define-read-only (get-balance (user principal))
  (default-to u0 (map-get? deposits user))
)

(define-read-only (get-secret (user principal))
  (let ((triggered (contract-call? .heartbeat-core is-triggered user)))
     (if triggered
       (ok (map-get? secrets user))
       (err ERR_NOT_TRIGGERED)
     )
  )
)

;; Owner can always see their own secret
(define-read-only (get-my-secret)
  (ok (map-get? secrets tx-sender))
)

Functions (7)

FunctionAccessArgs
deposit-stxpublicamount: uint
set-messagepublichash: (buff 32
withdraw-stxpublicamount: uint
distribute-stxpublicowner: principal, recipient: principal, amount: uint
get-balanceread-onlyuser: principal
get-secretread-onlyuser: principal
get-my-secretread-only