Source Code

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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))))

Functions (8)

FunctionAccessArgs
find-collateral-amount-iterprivateentry: { aid: uint, amount: uint }, acc: { target: uint, amount: uint }
get-collateral-amountprivateaccount: principal, enabled-mask: uint, asset-id: uint
get-zest-stx-balanceread-onlyaccount: principal
get-zest-sbtc-balanceread-onlyaccount: principal
get-zest-ststx-balanceread-onlyaccount: principal
get-zest-usdc-balanceread-onlyaccount: principal
get-zest-usdh-balanceread-onlyaccount: principal
get-zest-ststxbtc-balanceread-onlyaccount: principal