Source Code

;; deadman-fee-vault
;; Collects protocol fees on vault creation.
;; Fee rate is configurable by deployer (in basis points).
;; Accumulated fees can be withdrawn by the deployer.

(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-AUTHORIZED (err u700))
(define-constant ERR-INVALID-RATE (err u701))
(define-constant ERR-NOTHING-TO-WITHDRAW (err u702))
(define-constant ERR-TRANSFER-FAILED (err u703))

;; Fee rate in basis points (100 = 1%)
(define-data-var fee-rate-bps uint u50) ;; 0.5% default
(define-data-var total-collected uint u0)
(define-data-var authorized-caller principal CONTRACT-OWNER)

;; --- Authorization ---

(define-public (set-authorized-caller (caller principal))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (ok (var-set authorized-caller caller))))

(define-private (is-authorized)
  (or (is-eq contract-caller (var-get authorized-caller))
      (is-eq contract-caller CONTRACT-OWNER)))

;; --- Configuration ---

(define-public (set-fee-rate (rate uint))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (asserts! (<= rate u1000) ERR-INVALID-RATE) ;; max 10%
    (ok (var-set fee-rate-bps rate))))

;; --- Fee Collection ---

;; Collects fee from tx-sender based on vault amount.
;; Called by deadman-vault-core-v2 during create-vault.
;; Returns the fee amount collected.
(define-public (collect-fee (vault-amount uint))
  (let ((fee (/ (* vault-amount (var-get fee-rate-bps)) u10000)))
    (asserts! (is-authorized) ERR-NOT-AUTHORIZED)
    (if (> fee u0)
      (begin
        (try! (stx-transfer? fee tx-sender (as-contract tx-sender)))
        (var-set total-collected (+ (var-get total-collected) fee))
        (print { event: "fee-collected", amount: fee, payer: tx-sender })
        (ok fee))
      (ok u0))))

;; --- Fee Withdrawal ---

;; Withdraws accumulated fees to deployer
(define-public (withdraw-fees)
  (let ((balance (var-get total-collected)))
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (asserts! (> balance u0) ERR-NOTHING-TO-WITHDRAW)
    (var-set total-collected u0)
    (match (as-contract (stx-transfer? balance tx-sender CONTRACT-OWNER))
      success (begin
        (print { event: "fees-withdrawn", amount: balance, recipient: CONTRACT-OWNER })
        (ok balance))
      error ERR-TRANSFER-FAILED)))

;; --- Read Functions ---

(define-read-only (get-fee-rate)
  (var-get fee-rate-bps))

(define-read-only (get-total-collected)
  (var-get total-collected))

(define-read-only (calculate-fee (vault-amount uint))
  (/ (* vault-amount (var-get fee-rate-bps)) u10000))

Functions (8)

FunctionAccessArgs
set-authorized-callerpubliccaller: principal
is-authorizedprivate
set-fee-ratepublicrate: uint
collect-feepublicvault-amount: uint
withdraw-feespublic
get-fee-rateread-only
get-total-collectedread-only
calculate-feeread-onlyvault-amount: uint