Source Code

;; orbit-reserve - Multi-Asset Treasury Vault
;; Secure on-chain asset management and reserve protocol

(define-constant CONTRACT-OWNER tx-sender)
(define-constant WITHDRAWAL-DELAY u72)
(define-constant MAX-WITHDRAWAL-PCT u20)
(define-constant ERR-OWNER-ONLY (err u100))
(define-constant ERR-ZERO-AMOUNT (err u101))
(define-constant ERR-INSUFFICIENT-BALANCE (err u102))
(define-constant ERR-DELAY-NOT-MET (err u103))
(define-constant ERR-EXCEEDS-LIMIT (err u104))
(define-constant ERR-NOT-AUTHORIZED (err u105))

(define-map depositors principal
  { balance: uint, last-deposit: uint, total-deposited: uint })

(define-map authorized-withdrawers principal bool)
(define-map pending-withdrawals principal
  { amount: uint, requested-at: uint })

(define-data-var total-assets uint u0)
(define-data-var vault-locked bool false)
(define-data-var emergency-contact principal CONTRACT-OWNER)

(define-public (deposit (amount uint))
  (begin
    (asserts! (not (var-get vault-locked)) (err u106))
    (asserts! (> amount u0) ERR-ZERO-AMOUNT)
    (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
    (match (map-get? depositors tx-sender)
      d (map-set depositors tx-sender
          { balance: (+ (get balance d) amount),
            last-deposit: block-height,
            total-deposited: (+ (get total-deposited d) amount) })
      (map-set depositors tx-sender
          { balance: amount, last-deposit: block-height, total-deposited: amount }))
    (var-set total-assets (+ (var-get total-assets) amount))
    (ok true)))

(define-public (request-withdrawal (amount uint))
  (let ((depositor (unwrap! (map-get? depositors tx-sender) ERR-INSUFFICIENT-BALANCE))
        (max-allowed (/ (* (get balance depositor) MAX-WITHDRAWAL-PCT) u100)))
    (asserts! (>= (get balance depositor) amount) ERR-INSUFFICIENT-BALANCE)
    (asserts! (<= amount max-allowed) ERR-EXCEEDS-LIMIT)
    (map-set pending-withdrawals tx-sender { amount: amount, requested-at: block-height })
    (ok true)))

(define-public (execute-withdrawal)
  (let ((pending (unwrap! (map-get? pending-withdrawals tx-sender) ERR-INSUFFICIENT-BALANCE))
        (depositor (unwrap! (map-get? depositors tx-sender) ERR-INSUFFICIENT-BALANCE)))
    (asserts! (>= block-height (+ (get requested-at pending) WITHDRAWAL-DELAY)) ERR-DELAY-NOT-MET)
    (let ((amount (get amount pending)))
      (map-delete pending-withdrawals tx-sender)
      (map-set depositors tx-sender (merge depositor { balance: (- (get balance depositor) amount) }))
      (var-set total-assets (- (var-get total-assets) amount))
      (as-contract (stx-transfer? amount tx-sender contract-caller)))))

(define-public (emergency-lock)
  (begin
    (asserts! (or (is-eq tx-sender CONTRACT-OWNER) (is-eq tx-sender (var-get emergency-contact))) ERR-NOT-AUTHORIZED)
    (ok (var-set vault-locked true))))

(define-read-only (get-balance (depositor principal)) (ok (map-get? depositors depositor)))
(define-read-only (get-total-assets) (ok (var-get total-assets)))
(define-read-only (get-vault-status) (ok { locked: (var-get vault-locked), total: (var-get total-assets) }))

Functions (7)

FunctionAccessArgs
depositpublicamount: uint
request-withdrawalpublicamount: uint
execute-withdrawalpublic
emergency-lockpublic
get-balanceread-onlydepositor: principal
get-total-assetsread-only
get-vault-statusread-only