;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; balances - read-only balance aggregation contract
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Returns a user's total underlying holdings per asset across:
;; 1. Vault shares (converted to underlying)
;; 2. Underlying collateral in market-vault
;; 3. zToken collateral in market-vault (converted to underlying)
;; -- Asset IDs (Paired: underlying_id, vault_id = underlying_id + 1)
(define-constant STX u0)
(define-constant zSTX u1)
(define-constant sBTC u2)
(define-constant zsBTC u3)
(define-constant stSTX u4)
(define-constant zstSTX u5)
(define-constant USDC u6)
(define-constant zUSDC u7)
(define-constant USDH u8)
(define-constant zUSDH u9)
(define-constant stSTXbtc u10)
(define-constant zstSTXbtc u11)
;; -- Helpers ------------------------------------------------------------------
(define-private (find-collateral-amount-iter
(entry { aid: uint, amount: uint })
(acc { target: uint, amount: uint }))
(if (is-eq (get aid entry) (get target acc))
{ target: (get target acc), amount: (get amount entry) }
acc))
(define-private (get-collateral-amount
(account principal)
(enabled-mask uint)
(asset-id uint))
(match (contract-call? .v0-market-vault get-position account enabled-mask)
position
(get amount (fold find-collateral-amount-iter
(get collateral position)
{target: asset-id, amount: u0}))
err-no-position u0))
;; -- Balance functions --------------------------------------------------------
(define-read-only (get-zest-stx-balance (account principal))
(let (
(vault-shares (unwrap-panic (contract-call? .v0-vault-stx get-balance account)))
(vault-underlying (unwrap-panic (contract-call? .v0-vault-stx convert-to-assets vault-shares)))
(enabled-mask (contract-call? .v0-assets get-bitmap))
(market-underlying (get-collateral-amount account enabled-mask STX))
(market-ztoken-shares (get-collateral-amount account enabled-mask zSTX))
(market-ztoken-underlying (unwrap-panic (contract-call? .v0-vault-stx convert-to-assets market-ztoken-shares))))
(ok (+ vault-underlying market-underlying market-ztoken-underlying))))
(define-read-only (get-zest-sbtc-balance (account principal))
(let (
(vault-shares (unwrap-panic (contract-call? .v0-vault-sbtc get-balance account)))
(vault-underlying (unwrap-panic (contract-call? .v0-vault-sbtc convert-to-assets vault-shares)))
(enabled-mask (contract-call? .v0-assets get-bitmap))
(market-underlying (get-collateral-amount account enabled-mask sBTC))
(market-ztoken-shares (get-collateral-amount account enabled-mask zsBTC))
(market-ztoken-underlying (unwrap-panic (contract-call? .v0-vault-sbtc convert-to-assets market-ztoken-shares))))
(ok (+ vault-underlying market-underlying market-ztoken-underlying))))
(define-read-only (get-zest-ststx-balance (account principal))
(let (
(vault-shares (unwrap-panic (contract-call? .v0-vault-ststx get-balance account)))
(vault-underlying (unwrap-panic (contract-call? .v0-vault-ststx convert-to-assets vault-shares)))
(enabled-mask (contract-call? .v0-assets get-bitmap))
(market-underlying (get-collateral-amount account enabled-mask stSTX))
(market-ztoken-shares (get-collateral-amount account enabled-mask zstSTX))
(market-ztoken-underlying (unwrap-panic (contract-call? .v0-vault-ststx convert-to-assets market-ztoken-shares))))
(ok (+ vault-underlying market-underlying market-ztoken-underlying))))
(define-read-only (get-zest-usdc-balance (account principal))
(let (
(vault-shares (unwrap-panic (contract-call? .v0-vault-usdc get-balance account)))
(vault-underlying (unwrap-panic (contract-call? .v0-vault-usdc convert-to-assets vault-shares)))
(enabled-mask (contract-call? .v0-assets get-bitmap))
(market-underlying (get-collateral-amount account enabled-mask USDC))
(market-ztoken-shares (get-collateral-amount account enabled-mask zUSDC))
(market-ztoken-underlying (unwrap-panic (contract-call? .v0-vault-usdc convert-to-assets market-ztoken-shares))))
(ok (+ vault-underlying market-underlying market-ztoken-underlying))))
(define-read-only (get-zest-usdh-balance (account principal))
(let (
(vault-shares (unwrap-panic (contract-call? .v0-vault-usdh get-balance account)))
(vault-underlying (unwrap-panic (contract-call? .v0-vault-usdh convert-to-assets vault-shares)))
(enabled-mask (contract-call? .v0-assets get-bitmap))
(market-underlying (get-collateral-amount account enabled-mask USDH))
(market-ztoken-shares (get-collateral-amount account enabled-mask zUSDH))
(market-ztoken-underlying (unwrap-panic (contract-call? .v0-vault-usdh convert-to-assets market-ztoken-shares))))
(ok (+ vault-underlying market-underlying market-ztoken-underlying))))
(define-read-only (get-zest-ststxbtc-balance (account principal))
(let (
(vault-shares (unwrap-panic (contract-call? .v0-vault-ststxbtc get-balance account)))
(vault-underlying (unwrap-panic (contract-call? .v0-vault-ststxbtc convert-to-assets vault-shares)))
(enabled-mask (contract-call? .v0-assets get-bitmap))
(market-underlying (get-collateral-amount account enabled-mask stSTXbtc))
(market-ztoken-shares (get-collateral-amount account enabled-mask zstSTXbtc))
(market-ztoken-underlying (unwrap-panic (contract-call? .v0-vault-ststxbtc convert-to-assets market-ztoken-shares))))
(ok (+ vault-underlying market-underlying market-ztoken-underlying))))