Source Code

;; Comprehensive Protocol Initialization Proposal
;;
;; This proposal configures the entire Zest Protocol in a single transaction:
;;   1. Initialize assets (register tokens + oracles)
;;   2. Initialize market-vault (set market as implementation)
;;   3. Set vault caps and authorize market
;;   4. Create 25 egroups (collateral/debt combinations)
;;   5. Set interest rate curves for all vaults
;;
;; NOTE: Vault initialization (minting minimum liquidity) is done
;; via script AFTER this proposal executes.

(impl-trait .st-dao-traits.proposal-script)

;; Oracle type constants
(define-constant TYPE-PYTH 0x00)
(define-constant TYPE-DIA 0x01)

;; Callcode constants for price transformations
(define-constant CALLCODE-STSTX 0x00)
(define-constant CALLCODE-ZSTX 0x01)
(define-constant CALLCODE-ZSBTC 0x02)
(define-constant CALLCODE-ZSTSTX 0x03)
(define-constant CALLCODE-ZUSDC 0x04)
(define-constant CALLCODE-ZUSDH 0x05)

;; Mainnet Pyth price feed IDs
(define-constant STX-FEED-ID 0xec7a775f46379b5e943c3526b1c8d54cd49749176b0b98e02dde68d1bd335c17)
(define-constant BTC-FEED-ID 0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43)
(define-constant USDC-FEED-ID 0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a)

;; USDh uses DIA oracle
(define-constant USDH-DIA-KEY "USDh/USD")

;; Production staleness threshold: 120 seconds (2 minutes)
(define-constant MAX-STALENESS u120)

;; Mainnet token contract references
(define-constant SBTC-TOKEN 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token)
(define-constant STSTX-TOKEN 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token)
(define-constant USDC-TOKEN 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx)
(define-constant USDH-TOKEN 'SPN5AKG35QZSK2M8GAMR4AFX45659RJHDW353HSG.usdh-token-v1)
(define-constant STSTXBTC-TOKEN 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststxbtc-token-v2)

;; Vault caps (conservative initial limits)
(define-constant CAP-STX-SUPPLY u10000000000000)
(define-constant CAP-STX-DEBT u10000000000000)
(define-constant CAP-SBTC-SUPPLY u10000000000)
(define-constant CAP-SBTC-DEBT u10000000000)
(define-constant CAP-STSTX-SUPPLY u10000000000000)
(define-constant CAP-STSTX-DEBT u10000000000000)
(define-constant CAP-USDC-SUPPLY u10000000000000)
(define-constant CAP-USDC-DEBT u10000000000000)
(define-constant CAP-USDH-SUPPLY u1000000000000000)
(define-constant CAP-USDH-DEBT u1000000000000000)

;; Interest rate curves (utilization to APR mapping)
(define-constant UTIL-POINTS (list u0 u2500 u5000 u7000 u7500 u8500 u9000 u10000))
(define-constant RATE-POINTS (list u200 u250 u400 u600 u800 u1800 u2500 u10000))
(define-constant RESERVE-FACTOR u1000)

(define-public (execute)
  (begin
    ;; STEP 1: INITIALIZE ASSETS
    
    ;; Asset ID 0: wSTX
    (try! (contract-call? .st-assets insert .st-wstx
      { type: TYPE-PYTH, ident: STX-FEED-ID, callcode: none, max-staleness: MAX-STALENESS }))
    
    ;; Asset ID 1: sBTC
    (try! (contract-call? .st-assets insert SBTC-TOKEN
      { type: TYPE-PYTH, ident: BTC-FEED-ID, callcode: none, max-staleness: MAX-STALENESS }))
    
    ;; Asset ID 2: stSTX
    (try! (contract-call? .st-assets insert STSTX-TOKEN
      { type: TYPE-PYTH, ident: STX-FEED-ID, callcode: (some CALLCODE-STSTX), max-staleness: MAX-STALENESS }))
    
    ;; Asset ID 3: USDC
    (try! (contract-call? .st-assets insert USDC-TOKEN
      { type: TYPE-PYTH, ident: USDC-FEED-ID, callcode: none, max-staleness: MAX-STALENESS }))
    
    ;; Asset ID 4: USDh
    (try! (contract-call? .st-assets insert USDH-TOKEN
      { type: TYPE-DIA, ident: (unwrap-panic (to-consensus-buff? USDH-DIA-KEY)), callcode: none, max-staleness: MAX-STALENESS }))
    
    ;; Asset ID 5: zSTX
    (try! (contract-call? .st-assets insert .st-vault-stx
      { type: TYPE-PYTH, ident: STX-FEED-ID, callcode: (some CALLCODE-ZSTX), max-staleness: MAX-STALENESS }))
    
    ;; Asset ID 6: zsBTC
    (try! (contract-call? .st-assets insert .st-vault-sbtc
      { type: TYPE-PYTH, ident: BTC-FEED-ID, callcode: (some CALLCODE-ZSBTC), max-staleness: MAX-STALENESS }))
    
    ;; Asset ID 7: zstSTX
    (try! (contract-call? .st-assets insert .st-vault-ststx
      { type: TYPE-PYTH, ident: STX-FEED-ID, callcode: (some CALLCODE-ZSTSTX), max-staleness: MAX-STALENESS }))
    
    ;; Asset ID 8: zUSDC
    (try! (contract-call? .st-assets insert .st-vault-usdc
      { type: TYPE-PYTH, ident: USDC-FEED-ID, callcode: (some CALLCODE-ZUSDC), max-staleness: MAX-STALENESS }))
    
    ;; Asset ID 9: zUSDh
    (try! (contract-call? .st-assets insert .st-vault-usdh
      { type: TYPE-DIA, ident: (unwrap-panic (to-consensus-buff? USDH-DIA-KEY)), callcode: (some CALLCODE-ZUSDH), max-staleness: MAX-STALENESS }))

    ;; Asset ID 10: stSTXbtc
    (try! (contract-call? .st-assets insert STSTXBTC-TOKEN
      { type: TYPE-PYTH, ident: STX-FEED-ID, callcode: none, max-staleness: MAX-STALENESS }))
    
    ;; Enable underlying tokens for collateral and debt
    (try! (contract-call? .st-assets enable .st-wstx true))
    (try! (contract-call? .st-assets enable .st-wstx false))
    (try! (contract-call? .st-assets enable SBTC-TOKEN true))
    (try! (contract-call? .st-assets enable SBTC-TOKEN false))
    (try! (contract-call? .st-assets enable STSTX-TOKEN true))
    (try! (contract-call? .st-assets enable STSTX-TOKEN false))
    (try! (contract-call? .st-assets enable USDC-TOKEN true))
    (try! (contract-call? .st-assets enable USDC-TOKEN false))
    (try! (contract-call? .st-assets enable USDH-TOKEN true))
    (try! (contract-call? .st-assets enable USDH-TOKEN false))
    
    ;; Enable ztokens for collateral only
    (try! (contract-call? .st-assets enable .st-vault-stx true))
    (try! (contract-call? .st-assets enable .st-vault-sbtc true))
    (try! (contract-call? .st-assets enable .st-vault-ststx true))
    (try! (contract-call? .st-assets enable .st-vault-usdc true))
    (try! (contract-call? .st-assets enable .st-vault-usdh true))

    ;; Enable stSTXbtc for collateral only
    (try! (contract-call? .st-assets enable STSTXBTC-TOKEN true))

    ;; STEP 2: INITIALIZE MARKET-VAULT
    (try! (contract-call? .st-market-vault set-impl .st-market))
    
    ;; STEP 3: CONFIGURE VAULTS
    
    ;; Set vault caps
    (try! (contract-call? .st-vault-stx set-cap-supply CAP-STX-SUPPLY))
    (try! (contract-call? .st-vault-stx set-cap-debt CAP-STX-DEBT))
    (try! (contract-call? .st-vault-sbtc set-cap-supply CAP-SBTC-SUPPLY))
    (try! (contract-call? .st-vault-sbtc set-cap-debt CAP-SBTC-DEBT))
    (try! (contract-call? .st-vault-ststx set-cap-supply CAP-STSTX-SUPPLY))
    (try! (contract-call? .st-vault-ststx set-cap-debt CAP-STSTX-DEBT))
    (try! (contract-call? .st-vault-usdc set-cap-supply CAP-USDC-SUPPLY))
    (try! (contract-call? .st-vault-usdc set-cap-debt CAP-USDC-DEBT))
    (try! (contract-call? .st-vault-usdh set-cap-supply CAP-USDH-SUPPLY))
    (try! (contract-call? .st-vault-usdh set-cap-debt CAP-USDH-DEBT))
    
    ;; Authorize market contract in all vaults
    (try! (contract-call? .st-vault-stx set-authorized-contract .st-market true))
    (try! (contract-call? .st-vault-sbtc set-authorized-contract .st-market true))
    (try! (contract-call? .st-vault-ststx set-authorized-contract .st-market true))
    (try! (contract-call? .st-vault-usdc set-authorized-contract .st-market true))
    (try! (contract-call? .st-vault-usdh set-authorized-contract .st-market true))
    
    ;; STEP 4: CREATE EGROUPS
    
    ;; Group 1: sBTC to USDC+USDh (70% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u442721857769029238786, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u7000, LTV-LIQ-PARTIAL: u8500, LTV-LIQ-FULL: u9000 }))
    ;; Group 2: STX to USDC+USDh (40% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u442721857769029238785, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u4000, LTV-LIQ-PARTIAL: u6000, LTV-LIQ-FULL: u7500 }))
    ;; Group 3: stSTX to USDC+USDh (40% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u442721857769029238788, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u4000, LTV-LIQ-PARTIAL: u6000, LTV-LIQ-FULL: u7500 }))
    ;; Group 4: USDC to STX (30% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u18446744073709551624, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u3000, LTV-LIQ-PARTIAL: u5000, LTV-LIQ-FULL: u6500 }))
    ;; Group 5: sBTC to STX+USDC+USDh+stSTX+sBTC (30% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u571849066284996100098, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u3000, LTV-LIQ-PARTIAL: u4000, LTV-LIQ-FULL: u5500 }))
    ;; Group 6: STX to sBTC+USDC+USDh+stSTX+STX (20% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u571849066284996100097, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u2000, LTV-LIQ-PARTIAL: u4000, LTV-LIQ-FULL: u5500 }))
    ;; Group 7: stSTX to sBTC+USDC+USDh+STX+stSTX (20% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u571849066284996100100, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u2000, LTV-LIQ-PARTIAL: u4000, LTV-LIQ-FULL: u5500 }))
    ;; Group 8: STX to stSTX+STX (80% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u92233720368547758081, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u8000, LTV-LIQ-PARTIAL: u9000, LTV-LIQ-FULL: u9500 }))
    ;; Group 9: stSTX to stSTX+STX (80% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u92233720368547758084, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u8000, LTV-LIQ-PARTIAL: u9000, LTV-LIQ-FULL: u9500 }))
    ;; Group 10: sBTC to sBTC (80% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u36893488147419103234, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u8000, LTV-LIQ-PARTIAL: u9000, LTV-LIQ-FULL: u9500 }))
    ;; Group 11: USDC to USDh (50% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u295147905179352825864, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u5000, LTV-LIQ-PARTIAL: u6000, LTV-LIQ-FULL: u7500 }))
    
    ;; Group 12: zsBTC to USDC+USDh (70% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u442721857769029238848, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u7000, LTV-LIQ-PARTIAL: u8500, LTV-LIQ-FULL: u9000 }))
    ;; Group 13: zSTX to USDC+USDh (40% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u442721857769029238816, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u4000, LTV-LIQ-PARTIAL: u6000, LTV-LIQ-FULL: u7500 }))
    ;; Group 14: zstSTX to USDC+USDh (40% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u442721857769029238912, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u4000, LTV-LIQ-PARTIAL: u6000, LTV-LIQ-FULL: u7500 }))
    ;; Group 15: zUSDC to STX (30% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u18446744073709551872, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u3000, LTV-LIQ-PARTIAL: u5000, LTV-LIQ-FULL: u6500 }))
    ;; Group 16: zsBTC to STX+USDC+USDh+stSTX+sBTC (30% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u571849066284996100160, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u3000, LTV-LIQ-PARTIAL: u4000, LTV-LIQ-FULL: u5500 }))
    ;; Group 17: zSTX to sBTC+USDC+USDh+stSTX+STX (20% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u571849066284996100128, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u2000, LTV-LIQ-PARTIAL: u4000, LTV-LIQ-FULL: u5500 }))
    ;; Group 18: zstSTX to sBTC+USDC+USDh+STX+stSTX (20% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u571849066284996100224, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u2000, LTV-LIQ-PARTIAL: u4000, LTV-LIQ-FULL: u5500 }))
    ;; Group 19: zSTX to stSTX+STX (80% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u92233720368547758112, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u8000, LTV-LIQ-PARTIAL: u9000, LTV-LIQ-FULL: u9500 }))
    ;; Group 20: zstSTX to stSTX+STX (80% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u92233720368547758208, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u8000, LTV-LIQ-PARTIAL: u9000, LTV-LIQ-FULL: u9500 }))
    ;; Group 21: zsBTC to sBTC (80% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u36893488147419103296, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u8000, LTV-LIQ-PARTIAL: u9000, LTV-LIQ-FULL: u9500 }))
    ;; Group 22: zUSDC to USDh (50% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u295147905179352826112, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u5000, LTV-LIQ-PARTIAL: u6000, LTV-LIQ-FULL: u7500 }))
    ;; Group 23: stSTXbtc to USDC+USDh (40% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u442721857769029239808, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u4000, LTV-LIQ-PARTIAL: u6000, LTV-LIQ-FULL: u7500 }))
    ;; Group 24: stSTXbtc to sBTC+USDC+USDh+STX+stSTX (20% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u571849066284996101120, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u2000, LTV-LIQ-PARTIAL: u4000, LTV-LIQ-FULL: u5500 }))
    ;; Group 25: stSTXbtc to stSTX+STX (80% LTV)
    (try! (contract-call? .st-egroup insert { BORROW-DISABLED-MASK: u0, MASK: u92233720368547759104, LIQ-CURVE-EXP: u10000, LIQ-PENALTY-MIN: u500, LIQ-PENALTY-MAX: u1000, LTV-BORROW: u8000, LTV-LIQ-PARTIAL: u9000, LTV-LIQ-FULL: u9500 }))

    ;; STEP 5: SET INTEREST RATES
    
    (try! (contract-call? .st-vault-stx set-points-util UTIL-POINTS))
    (try! (contract-call? .st-vault-stx set-points-rate RATE-POINTS))
    (try! (contract-call? .st-vault-stx set-fee-reserve RESERVE-FACTOR))
    (try! (contract-call? .st-vault-sbtc set-points-util UTIL-POINTS))
    (try! (contract-call? .st-vault-sbtc set-points-rate RATE-POINTS))
    (try! (contract-call? .st-vault-sbtc set-fee-reserve RESERVE-FACTOR))
    (try! (contract-call? .st-vault-ststx set-points-util UTIL-POINTS))
    (try! (contract-call? .st-vault-ststx set-points-rate RATE-POINTS))
    (try! (contract-call? .st-vault-ststx set-fee-reserve RESERVE-FACTOR))
    (try! (contract-call? .st-vault-usdc set-points-util UTIL-POINTS))
    (try! (contract-call? .st-vault-usdc set-points-rate RATE-POINTS))
    (try! (contract-call? .st-vault-usdc set-fee-reserve RESERVE-FACTOR))
    (try! (contract-call? .st-vault-usdh set-points-util UTIL-POINTS))
    (try! (contract-call? .st-vault-usdh set-points-rate RATE-POINTS))
    (try! (contract-call? .st-vault-usdh set-fee-reserve RESERVE-FACTOR))
    
    (ok true)))

Functions (1)

FunctionAccessArgs
executepublic