Source Code

;; @contract Vault State
;; @version 1

(use-trait ft .sip-010-trait.sip-010-trait)

;;-------------------------------------
;; Constants
;;-------------------------------------

(define-constant ERR_NOT_SILO (err u102001))
(define-constant ERR_NOT_TRADING_ASSET (err u102002))
(define-constant ERR_NOT_STANDARD_PRINCIPAL (err u102003))
(define-constant ERR_NOT_CONNECTION (err u102004))
(define-constant ERR_TRANSFER_DISABLED (err u102005))
(define-constant ERR_VAULT_DISABLED (err u102006))
(define-constant ERR_DEPOSIT_DISABLED (err u102007))
(define-constant ERR_WITHDRAW_DISABLED (err u102008))
(define-constant ERR_TRADING_DISABLED (err u102009))
(define-constant ERR_ABOVE_MAX (err u102010))
(define-constant ERR_BELOW_MIN (err u102011))
(define-constant ERR_UPDATE_WINDOW_CLOSED (err u102012))
(define-constant ERR_NO_ENTRY (err u102013))
(define-constant ERR_ENTRY_ALREADY_EXISTS (err u102014))
(define-constant ERR_ACTIVATION (err u102015))

(define-constant max-reward u20)                                  ;; bps                                   
(define-constant min-update-window u60)                           ;; 1 minute in seconds
(define-constant max-slippage u500)                               ;; bps; 5%
(define-constant max-exit-fee u100)                               ;; bps; 1% 
(define-constant max-perf-fee u2000)                              ;; bps; 20%
(define-constant max-mgmt-fee u54)                                ;; 1/100 of bps; 0.0054% per day / 2% annualized

(define-constant max-cooldown-window u2592000)                    ;; 30 days in seconds
(define-constant max-block-delay u7200)                           ;; 5 min in stacks blocks (block time = 5 sec)

(define-constant init-ts (some (get-current-ts)))

(define-constant bps-base (pow u10 u4))                           ;; 100%
(define-constant hbtc-base (pow u10 u8))                          ;; 10**8

;;-------------------------------------
;; Variables
;;-------------------------------------


(define-data-var fee-address principal 'SP1GBFF44X014QYZ9V6K03GN2H5JF9S59GKKTRGAS)
(define-data-var fees 
  { mgmt-fee: uint, perf-fee: uint, exit-fee: uint } 
  { mgmt-fee: u0, perf-fee: u1000, exit-fee: u0 })
(define-data-var token-price uint hbtc-base)
(define-data-var cooldown-window uint u120)                       ;; time in s (2 minutes)
(define-data-var deposit-cap uint u10000000)                      ;; 0.1 BTC 
(define-data-var min-deposit-amount uint u0)

(define-data-var max-reward-per-window uint u5)                   ;; bps
(define-data-var update-window uint u60)                          ;; 1 minute in seconds
(define-data-var reserve-rate uint u500)                          ;; bps
(define-data-var last-log-ts uint u0)                             ;; timestamp
(define-data-var block-delay uint u10)                            ;; block delay for staleness check (=~50 seconds)

(define-data-var vault-enabled bool true)
(define-data-var transfer-enabled bool true)
(define-data-var deposit-enabled bool true)
(define-data-var withdraw-enabled bool true)
(define-data-var trading-enabled bool true)

;;-------------------------------------
;; Maps
;;-------------------------------------

;; sip-010 tokens that can be traded by the vault
(define-map trading-assets
  {
    address: principal
  }
  {
    active: bool,
    ts: (optional uint),
    price-feed-id: (buff 32),                                     ;; pyth price feed id to identify the asset 
    token-base: uint,
    max-slippage: uint,                                           ;; bps; max swap slippage allowed for the asset
    is-stablecoin: bool,                                          ;; whether the asset is a stablecoin. True for USD stablecoins (uses fixed $1.00 price), False for other assets (uses pyth oracle).
  }
)

;; external contracts that interface contracts can interact with
(define-map connections 
  {
    address: principal
  }
  {
    active: bool,
    ts: (optional uint)
  }
)

;; silo contracts to which pending withdraws can be transferred to
(define-map silos 
  {
    address: principal
  }
  {
    active: bool,
    ts: (optional uint)
  }
)

(define-map custom-cooldown
  { 
    address: principal
  }
  {
    cooldown-window: uint
  }
)

(define-map custom-exit-fee
  {
    address: principal
  }
  {
    exit-fee: uint
  }
)

;;-------------------------------------
;; Helper
;;-------------------------------------

(define-private (get-current-ts)
  (unwrap-panic (get-stacks-block-info? time (- stacks-block-height u1)))
)

;;-------------------------------------
;; Getters
;;-------------------------------------

(define-read-only (get-fee-address)
  (var-get fee-address)
)

(define-read-only (get-fees)
  (var-get fees)
)

(define-read-only (get-token-price)
  (var-get token-price)
)

(define-read-only (get-cooldown-window)
  (var-get cooldown-window)
)

(define-read-only (get-custom-cooldown (address principal))
  (get cooldown-window
    (default-to
      { cooldown-window: (get-cooldown-window) }
      (map-get? custom-cooldown { address: address }))
  )
)

(define-read-only (get-custom-exit-fee (address principal))
  (get exit-fee
    (default-to
      { exit-fee: (get exit-fee (get-fees)) }
      (map-get? custom-exit-fee { address: address }))
  )
)

(define-read-only (get-deposit-cap)
  (var-get deposit-cap)
)

(define-read-only (get-max-reward-per-window)
  (var-get max-reward-per-window)
)

(define-read-only (get-update-window)
  (var-get update-window)
)

(define-read-only (get-reserve-rate)
  (var-get reserve-rate)
)

(define-read-only (get-last-log-ts)
  (var-get last-log-ts)
)

(define-read-only (get-block-delay)
  (var-get block-delay)
)

(define-read-only (get-vault-enabled)
  (var-get vault-enabled)
)

(define-read-only (get-transfer-enabled)
  (var-get transfer-enabled)
)

(define-read-only (get-deposit-enabled)
  (var-get deposit-enabled)
)

(define-read-only (get-withdraw-enabled)
  (var-get withdraw-enabled)
)

(define-read-only (get-trading-enabled)
  (var-get trading-enabled))

(define-read-only (get-trading-asset (address principal))
  (default-to 
    { active: false, ts: none, price-feed-id: 0x, token-base: u0, max-slippage: u0, is-stablecoin: false } 
    (map-get? trading-assets { address: address })
  )
)

(define-read-only (get-connection (address principal))
  (default-to 
    { active: false, ts: none } 
    (map-get? connections { address: address })
  )
)

(define-read-only (get-silo (address principal))
  (default-to 
    { active: false, ts: none }  
    (map-get? silos { address: address })
  )
)

(define-read-only (get-min-deposit-amount)
  (var-get min-deposit-amount)
)

;;-------------------------------------
;; Checks
;;-------------------------------------

(define-read-only (check-is-vault-enabled)
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-protocol-enabled))
    (ok (asserts! (get-vault-enabled) ERR_VAULT_DISABLED))
  )
)

(define-read-only (check-is-deposit-enabled)
  (begin
    (try! (check-is-vault-enabled))
    (ok (asserts! (get-deposit-enabled) ERR_DEPOSIT_DISABLED))
  )
)

(define-read-only (check-is-withdraw-enabled)
  (begin
    (try! (check-is-vault-enabled))
    (ok (asserts! (get-withdraw-enabled) ERR_WITHDRAW_DISABLED))
  )
)

(define-read-only (check-is-transfer-enabled)
  (begin
    (try! (check-is-vault-enabled))
    (ok (asserts! (get-transfer-enabled) ERR_TRANSFER_DISABLED))
  )
)

(define-read-only (check-is-trading-enabled)
  (begin
    (try! (check-is-vault-enabled))
    (ok (asserts! (get-trading-enabled) ERR_TRADING_DISABLED))
  )
) 

(define-read-only (check-is-trading-asset (address principal))
  (ok (asserts! (get active (get-trading-asset address)) ERR_NOT_TRADING_ASSET))
)

(define-read-only (check-is-connection (address principal))
  (ok (asserts! (get active (get-connection address)) ERR_NOT_CONNECTION))
)

(define-read-only (check-is-silo (address principal))
  (ok (asserts! (get active (get-silo address)) ERR_NOT_SILO))
)

(define-read-only (check-is-update-window-open)
  (ok (asserts! (> (get-current-ts) (+ (get-last-log-ts) (get-update-window))) ERR_UPDATE_WINDOW_CLOSED))
)

(define-read-only (check-max-reward (amount uint) (vault-balance uint))
    (ok (asserts! (<= amount (/ (* (get-max-reward-per-window) vault-balance) bps-base)) ERR_ABOVE_MAX))
)

(define-public (check-connections-and-assets (connection-a principal) (connection-b (optional principal)) (asset-a (optional principal)) (asset-b (optional principal)))
  (begin
    (try! (check-is-connection connection-a))
    (match connection-b value (try! (check-is-connection value)) true)
    (match asset-a value (try! (check-is-trading-asset value)) true)
    (ok (match asset-b value (try! (check-is-trading-asset value)) true))
  )
)

;;-------------------------------------
;; Setters
;;-------------------------------------

(define-public (set-fee-address (address principal))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (asserts! (is-standard address) ERR_NOT_STANDARD_PRINCIPAL)
    (print { action: "set-fee-address", user: contract-caller, data: { old-value: (get-fee-address), new-value: address } })
    (ok (var-set fee-address address))
  )
)

(define-public (set-fees (mgmt-fee uint) (perf-fee uint) (exit-fee uint))
  (let (
    (new-fees { mgmt-fee: mgmt-fee, perf-fee: perf-fee, exit-fee: exit-fee })
  )
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (asserts! (<= mgmt-fee max-mgmt-fee) ERR_ABOVE_MAX)
    (asserts! (<= perf-fee max-perf-fee) ERR_ABOVE_MAX)
    (asserts! (<= exit-fee max-exit-fee) ERR_ABOVE_MAX)
    (print { action: "set-fees", user: contract-caller, data: { old-value: (get-fees), new-value: new-fees } })
    (ok (var-set fees new-fees))
  )
)

(define-public (set-token-price (price uint))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-protocol contract-caller))
    (print { action: "set-token-price", user: contract-caller, data: { old-value: (get-token-price), new-value: price } })
    (ok (var-set token-price price))
  )
)

(define-public (set-cooldown-window (new-window uint))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (asserts! (<= new-window max-cooldown-window ) ERR_ABOVE_MAX)
    (print { action: "set-cooldown-window", user: contract-caller, data: { old-value: (get-cooldown-window), new-value: new-window } })
    (ok (var-set cooldown-window new-window))
  )
)

(define-public (set-custom-cooldown (address principal) (new-window uint))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (asserts! (<= new-window max-cooldown-window) ERR_ABOVE_MAX)
    (print {action: "set-custom-cooldown", user: contract-caller, data: { address: address, old-value: (get-custom-cooldown address), new-value: new-window}})
    (ok (map-set custom-cooldown {  address: address } { cooldown-window: new-window }))
  )
)

(define-public (set-custom-exit-fee (address principal) (new-exit-fee uint))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-fee-setter contract-caller))
    (asserts! (<= new-exit-fee max-exit-fee) ERR_ABOVE_MAX)
    (print { action: "set-custom-exit-fee", user: contract-caller, data: { address: address, old-value: (get-custom-exit-fee address), new-value: new-exit-fee } })
    (ok (map-set custom-exit-fee { address: address } { exit-fee: new-exit-fee }))
  )
)

(define-public (set-deposit-cap (amount uint))  
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (print { action: "set-deposit-cap", user: contract-caller, data: { old-value: (get-deposit-cap), new-value: amount } })
    (ok (var-set deposit-cap amount))
  )
)

(define-public (set-max-reward-per-window (new-max-reward-per-window uint))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (asserts! (<= new-max-reward-per-window max-reward) ERR_ABOVE_MAX)
    (print { 
      action: "set-max-reward-per-window", user: contract-caller, data: { old-value: (get-max-reward-per-window), new-value: new-max-reward-per-window } 
    })
    (ok (var-set max-reward-per-window new-max-reward-per-window))
  )
)

(define-public (set-update-window (new-update-window uint))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (asserts! (>= new-update-window min-update-window) ERR_BELOW_MIN)
    (print { 
      action: "set-update-window", user: contract-caller, data: { old-value: (get-update-window), new-value: new-update-window } 
    })
    (ok (var-set update-window new-update-window))
  )
)

(define-public (set-reserve-rate (new-reserve-rate uint))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (print { 
      action: "set-reserve-rate", user: contract-caller, data: { old-value: (get-reserve-rate), new-value: new-reserve-rate } 
    })
    (ok (var-set reserve-rate new-reserve-rate))
  )
)

(define-public (set-block-delay (new-block-delay uint))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (asserts! (<= new-block-delay max-block-delay) ERR_ABOVE_MAX)
    (print { 
      action: "set-block-delay", user: contract-caller, data: { old-value: (get-block-delay), new-value: new-block-delay } 
    })
    (ok (var-set block-delay new-block-delay))
  )
)

(define-public (update-last-log-ts)
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-protocol contract-caller))
    (print { action: "update-last-log-ts", user: contract-caller, data: { old-value: (get-last-log-ts), new-value: (get-current-ts) } })
    (ok (var-set last-log-ts (get-current-ts)))
  )
)

(define-public (set-vault-enabled (enabled bool))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (print { action: "set-vault-enabled", user: contract-caller, data: { old-value: (get-vault-enabled), new-value: enabled } })
    (ok (var-set vault-enabled enabled))
  )
)

(define-public (disable-vault)
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-guardian contract-caller))
    (print { action: "disable-vault", user: contract-caller, data: { old-value: (get-vault-enabled), new-value: false } })
    (ok (var-set vault-enabled false))
  )
)

(define-public (set-transfer-enabled (enabled bool))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (print { action: "set-transfer-enabled", user: contract-caller, data: { old-value: (get-transfer-enabled), new-value: enabled } })
    (ok (var-set transfer-enabled enabled))
  )
)

(define-public (disable-transfer)
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-guardian contract-caller))
    (print { action: "disable-transfer", user: contract-caller, data: { old-value: (get-transfer-enabled), new-value: false } })
    (ok (var-set transfer-enabled false))
  )
)

(define-public (set-deposit-enabled (enabled bool))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (print { action: "set-deposit-enabled", user: contract-caller, data: { old-value: (get-deposit-enabled), new-value: enabled } })
    (ok (var-set deposit-enabled enabled))
  )
)

(define-public (disable-deposits)
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-guardian contract-caller))
    (print { action: "disable-deposits", user: contract-caller, data: { old-value: (get-deposit-enabled), new-value: false } })
    (ok (var-set deposit-enabled false))
  )
)

(define-public (set-withdraw-enabled (enabled bool))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (print { action: "set-withdraw-enabled", user: contract-caller, data: { old-value: (get-withdraw-enabled), new-value: enabled } })
    (ok (var-set withdraw-enabled enabled))
  )
)

(define-public (disable-withdraw)
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-guardian contract-caller))
    (print { action: "disable-withdraw", user: contract-caller, data: { old-value: (get-withdraw-enabled), new-value: false } })
    (ok (var-set withdraw-enabled false))

  )
)

(define-public (set-trading-enabled (enabled bool))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (print { action: "set-trading-enabled", user: contract-caller, data: { old-value: (get-trading-enabled), new-value: enabled } })
    (ok (var-set trading-enabled enabled))
  )
)

(define-public (disable-trading)
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-guardian contract-caller))
    (print { action: "disable-trading", user: contract-caller, data: { old-value: (get-trading-enabled), new-value: false } })
    (ok (var-set trading-enabled false))
  )
)

(define-public (request-new-trading-asset (token <ft>) (price-feed-id (buff 32)) (new-max-slippage uint) (is-stablecoin bool))
  (let (
    (token-address (contract-of token))
    (token-base (pow u10 (unwrap-panic (contract-call? token get-decimals))))
    (new-entry { active: false, ts: (some (get-current-ts)), price-feed-id: price-feed-id, token-base: token-base, max-slippage: new-max-slippage, is-stablecoin: is-stablecoin })
  )
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (asserts! (<= new-max-slippage max-slippage) ERR_ABOVE_MAX)
    (print { action: "request-new-trading-asset", user: contract-caller, data: { token-address: token-address, old-value: (get-trading-asset token-address), new-value: new-entry } })
    (ok (asserts! (map-insert trading-assets { address: token-address } new-entry) ERR_ENTRY_ALREADY_EXISTS))
  )
)

(define-public (remove-trading-asset (address principal))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (print { action: "remove-trading-asset", user: contract-caller, data: { address: address, old-value: (get-trading-asset address) } })
    (ok (map-delete trading-assets { address: address }))
  )
)

(define-public (activate-trading-asset (address principal))
  (let (
    (entry (get-trading-asset address))
    (ts (unwrap! (get ts entry) ERR_NO_ENTRY))
    (updated-entry (merge entry { active: true }))
  )
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (asserts! (>= (get-current-ts) (+ ts (contract-call? .test-hq-vaults-v1-1 get-activation-delay))) ERR_ACTIVATION)
    (print { action: "activate-trading-asset", user: contract-caller, data: { address: address, old-value: entry, new-value: updated-entry } })
    (ok (map-set trading-assets { address: address } updated-entry))
  )
)

(define-public (set-max-slippage (address principal) (new-max-slippage uint))
  (let (
    (entry (get-trading-asset address))
    (updated-entry (merge entry { max-slippage: new-max-slippage }))
  )
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (asserts! (<= new-max-slippage max-slippage) ERR_ABOVE_MAX)
    (print { action: "set-max-slippage", user: contract-caller, data: { address: address, old-value: entry, new-value: updated-entry } })
    (ok (map-set trading-assets { address: address } updated-entry))
  )
)

(define-public (request-new-connection (address principal))
  (let (
    (new-entry { active: false, ts: (some (get-current-ts)) })
  )
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (print { action: "request-new-connection", user: contract-caller, data: { address: address, old-value: (get-connection address), new-value: new-entry } })
    (ok (asserts! (map-insert connections { address: address } new-entry) ERR_ENTRY_ALREADY_EXISTS))
  )
)

(define-public (remove-connection (address principal))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (print { action: "remove-connection", user: contract-caller, data: { address: address, old-value: (get-connection address) } })
    (ok (map-delete connections { address: address }))
  )
)

(define-public (activate-connection (address principal))
  (let (
    (entry (get-connection address))
    (ts (unwrap! (get ts entry) ERR_NO_ENTRY))
    (updated-entry (merge entry { active: true }))
  )
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (asserts! (>= (get-current-ts) (+ ts (contract-call? .test-hq-vaults-v1-1 get-activation-delay))) ERR_ACTIVATION)
    (print { action: "activate-connection", user: contract-caller, data: { address: address, old-value: entry, new-value: updated-entry } })
    (ok (map-set connections { address: address } updated-entry))
  )
)

(define-public (request-new-silo (address principal))
  (let (
    (new-entry { active: false, ts: (some (get-current-ts)) })
  )
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (print { action: "request-new-silo", user: contract-caller, data: { address: address, old-value: (get-silo address), new-value: new-entry } })
    (ok (asserts! (map-insert silos { address: address } new-entry) ERR_ENTRY_ALREADY_EXISTS))
  )
)

(define-public (remove-silo (address principal))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (print { action: "remove-silo", user: contract-caller, data: { address: address, old-value: (get-silo address) } })
    (ok (map-delete silos { address: address }))
  )
)

(define-public (activate-silo (address principal))
  (let (
    (entry (get-silo address))
    (ts (unwrap! (get ts entry) ERR_NO_ENTRY))
    (updated-entry (merge entry { active: true }))
  )
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-owner contract-caller))
    (asserts! (>= (get-current-ts) (+ ts (contract-call? .test-hq-vaults-v1-1 get-activation-delay))) ERR_ACTIVATION)
    (print { action: "activate-silo", user: contract-caller, data: { address: address, old-value: entry, new-value: updated-entry } })
    (ok (map-set silos { address: address } updated-entry))
  )
)

(define-public (set-min-deposit-amount (amount uint))
  (begin
    (try! (contract-call? .test-hq-vaults-v1-1 check-is-admin contract-caller))
    (print { action: "set-min-deposit-amount", user: contract-caller, data: { old-value: (get-min-deposit-amount), new-value: amount } })
    (ok (var-set min-deposit-amount amount))
  )
)

;;-------------------------------------
;; Init
;;-------------------------------------

;; Initialize trading assets
(map-set trading-assets { address: 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token } { active: true, ts: init-ts, price-feed-id: 0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43, token-base: (pow u10 u8), max-slippage: u100, is-stablecoin: false })
(map-set trading-assets { address: 'SPN5AKG35QZSK2M8GAMR4AFX45659RJHDW353HSG.usdh-token-v1 } { active: true, ts: init-ts, price-feed-id: 0x00, token-base: (pow u10 u8), max-slippage: u100, is-stablecoin: true })
(map-set trading-assets { address: 'SPN5AKG35QZSK2M8GAMR4AFX45659RJHDW353HSG.susdh-token-v1 } { active: true, ts: init-ts, price-feed-id: 0x01, token-base: (pow u10 u8), max-slippage: u100, is-stablecoin: false })
(map-set trading-assets { address: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc } { active: true, ts: init-ts, price-feed-id: 0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a, token-base: (pow u10 u6), max-slippage: u1000, is-stablecoin: true })
(map-set trading-assets { address: 'SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.wstx } { active: true, ts: init-ts, price-feed-id: 0xec7a775f46379b5e943c3526b1c8d54cd49749176b0b98e02dde68d1bd335c17, token-base: (pow u10 u6), max-slippage: u1000, is-stablecoin: false })
(map-set trading-assets { address: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2 } { active: true, ts: init-ts, price-feed-id: 0xec7a775f46379b5e943c3526b1c8d54cd49749176b0b98e02dde68d1bd335c17, token-base: (pow u10 u6), max-slippage: u1000, is-stablecoin: false })

(map-set connections { address: 'SPN5AKG35QZSK2M8GAMR4AFX45659RJHDW353HSG.staking-v1-1 } { active: true, ts: init-ts })
(map-set connections { address: 'SPN5AKG35QZSK2M8GAMR4AFX45659RJHDW353HSG.staking-silo-v1-1 } { active: true, ts: init-ts })
(map-set connections { address: 'SPN5AKG35QZSK2M8GAMR4AFX45659RJHDW353HSG.minting-auto-v1-2 } { active: true, ts: init-ts })
(map-set connections { address: 'SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v2-1-7 } { active: true, ts: init-ts })
(map-set connections { address: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-core-v-1-2 } { active: true, ts: init-ts })
(map-set connections { address: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-core-v-1-2 } { active: true, ts: init-ts })
(map-set connections { address: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-swap-helper-v-1-3 } { active: true, ts: init-ts })
(map-set connections { address: 'SP26NGV9AFZBX7XBDBS2C7EC7FCPSAV9PKREQNMVS.borrower-v1 } { active: true, ts: init-ts })
;; Initialize Bitflow pool contracts
(map-set connections { address: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdh-v-1-2 } { active: true, ts: init-ts })
(map-set connections { address: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-2 } { active: true, ts: init-ts })
(map-set connections { address: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-sbtc-stx-v-1-1 } { active: true, ts: init-ts })

;; Initialize silos
(map-set silos { address: .test-silo-hbtc-v1-1 } { active: true, ts: init-ts })

Functions (66)

FunctionAccessArgs
get-current-tsprivate
get-fee-addressread-only
get-feesread-only
get-token-priceread-only
get-cooldown-windowread-only
get-custom-cooldownread-onlyaddress: principal
get-custom-exit-feeread-onlyaddress: principal
get-deposit-capread-only
get-max-reward-per-windowread-only
get-update-windowread-only
get-reserve-rateread-only
get-last-log-tsread-only
get-block-delayread-only
get-vault-enabledread-only
get-transfer-enabledread-only
get-deposit-enabledread-only
get-withdraw-enabledread-only
get-trading-enabledread-only
get-trading-assetread-onlyaddress: principal
get-connectionread-onlyaddress: principal
get-siloread-onlyaddress: principal
get-min-deposit-amountread-only
check-is-vault-enabledread-only
check-is-deposit-enabledread-only
check-is-withdraw-enabledread-only
check-is-transfer-enabledread-only
check-is-trading-enabledread-only
check-is-trading-assetread-onlyaddress: principal
check-is-connectionread-onlyaddress: principal
check-is-siloread-onlyaddress: principal
check-is-update-window-openread-only
check-max-rewardread-onlyamount: uint, vault-balance: uint
check-connections-and-assetspublicconnection-a: principal, connection-b: (optional principal
set-fee-addresspublicaddress: principal
set-feespublicmgmt-fee: uint, perf-fee: uint, exit-fee: uint
set-token-pricepublicprice: uint
set-cooldown-windowpublicnew-window: uint
set-custom-cooldownpublicaddress: principal, new-window: uint
set-custom-exit-feepublicaddress: principal, new-exit-fee: uint
set-deposit-cappublicamount: uint
set-max-reward-per-windowpublicnew-max-reward-per-window: uint
set-update-windowpublicnew-update-window: uint
set-reserve-ratepublicnew-reserve-rate: uint
set-block-delaypublicnew-block-delay: uint
update-last-log-tspublic
set-vault-enabledpublicenabled: bool
disable-vaultpublic
set-transfer-enabledpublicenabled: bool
disable-transferpublic
set-deposit-enabledpublicenabled: bool
disable-depositspublic
set-withdraw-enabledpublicenabled: bool
disable-withdrawpublic
set-trading-enabledpublicenabled: bool
disable-tradingpublic
request-new-trading-assetpublictoken: <ft>, price-feed-id: (buff 32
remove-trading-assetpublicaddress: principal
activate-trading-assetpublicaddress: principal
set-max-slippagepublicaddress: principal, new-max-slippage: uint
request-new-connectionpublicaddress: principal
remove-connectionpublicaddress: principal
activate-connectionpublicaddress: principal
request-new-silopublicaddress: principal
remove-silopublicaddress: principal
activate-silopublicaddress: principal
set-min-deposit-amountpublicamount: uint