Source Code

;; Aegis Treasury
;; Manages penalty fees from emergency withdrawals
;; Holds 2% penalties and allows admin fund management

;; ============================================
;; CONSTANTS
;; ============================================

(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-AUTHORIZED (err u2001))
(define-constant ERR-INSUFFICIENT-FUNDS (err u2002))
(define-constant ERR-INVALID-AMOUNT (err u2003))
(define-constant ERR-VAULT-ONLY (err u2004))

;; ============================================
;; DATA VARIABLES
;; ============================================

(define-data-var total-penalties-collected uint u0)
(define-data-var total-withdrawn uint u0)

;; ============================================
;; DATA MAPS
;; ============================================

;; Authorized vaults that can deposit penalties
(define-map authorized-vaults principal bool)

;; ============================================
;; PRIVATE FUNCTIONS
;; ============================================

(define-private (is-authorized-vault (vault principal))
  (default-to false (map-get? authorized-vaults vault))
)

;; ============================================
;; PUBLIC FUNCTIONS
;; ============================================

;; Receive penalty deposit from staking vault
(define-public (deposit-penalty (amount uint))
  (begin
    ;; Only authorized vaults can deposit
    (asserts! (is-authorized-vault contract-caller) ERR-VAULT-ONLY)
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    
    ;; Transfer STX to treasury
    (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
    
    ;; Update total collected
    (var-set total-penalties-collected (+ (var-get total-penalties-collected) amount))
    
    (print { 
      event: "penalty-deposited", 
      amount: amount, 
      from-vault: contract-caller,
      total-collected: (var-get total-penalties-collected)
    })
    (ok true)
  )
)

;; Admin withdraw funds from treasury
(define-public (withdraw-funds (amount uint) (recipient principal))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (asserts! (> amount u0) ERR-INVALID-AMOUNT)
    (asserts! (<= amount (get-treasury-balance)) ERR-INSUFFICIENT-FUNDS)
    
    ;; Transfer STX from treasury
    (try! (as-contract (stx-transfer? amount tx-sender recipient)))
    
    ;; Update total withdrawn
    (var-set total-withdrawn (+ (var-get total-withdrawn) amount))
    
    (print { 
      event: "treasury-withdrawal", 
      amount: amount, 
      recipient: recipient,
      remaining-balance: (get-treasury-balance)
    })
    (ok true)
  )
)

;; ============================================
;; ADMIN FUNCTIONS
;; ============================================

;; Add authorized vault
(define-public (add-vault (vault principal))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (map-set authorized-vaults vault true)
    (print { event: "vault-added", vault: vault })
    (ok true)
  )
)

;; Remove authorized vault
(define-public (remove-vault (vault principal))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (map-delete authorized-vaults vault)
    (print { event: "vault-removed", vault: vault })
    (ok true)
  )
)

;; ============================================
;; READ-ONLY FUNCTIONS
;; ============================================

(define-read-only (get-treasury-balance)
  (stx-get-balance (as-contract tx-sender))
)

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

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

(define-read-only (get-contract-owner)
  CONTRACT-OWNER
)

(define-read-only (is-vault-authorized (vault principal))
  (is-authorized-vault vault)
)

;; Get treasury stats
(define-read-only (get-treasury-stats)
  {
    balance: (get-treasury-balance),
    total-collected: (var-get total-penalties-collected),
    total-withdrawn: (var-get total-withdrawn)
  }
)

Functions (11)

FunctionAccessArgs
is-authorized-vaultprivatevault: principal
deposit-penaltypublicamount: uint
withdraw-fundspublicamount: uint, recipient: principal
add-vaultpublicvault: principal
remove-vaultpublicvault: principal
get-treasury-balanceread-only
get-total-penalties-collectedread-only
get-total-withdrawnread-only
get-contract-ownerread-only
is-vault-authorizedread-onlyvault: principal
get-treasury-statsread-only