;; sbtc-reader-tusdc-tbtc-v-1-bps-10
;; Error constants
(define-constant ERR_INVALID_PRINCIPAL (err u8001))
(define-constant ERR_NO_BIN_SHARES (err u8002))
(define-constant ERR_NO_RESULT_DATA (err u8003))
;; Used to determine which token is sBTC in this pool
(define-constant SBTC_IS_X_TOKEN false)
;; Get total sBTC balance in this pool
(define-read-only (get-pool-sbtc-balance)
(ok (contract-call? .token-tbtc-v-0-2 get-balance .dlmm-pool-h-v-0-1))
)
;; Get sBTC balance for an user across multiple bins in this pool
(define-read-only (get-user-sbtc-balance
(bin-ids (list 1001 uint)) (user principal)
)
(let (
;; Assert user is standard principal
(user-address-check (asserts! (is-standard user) ERR_INVALID_PRINCIPAL))
;; Get sBTC balance for an user across multiple bins in this pool
(get-user-sbtc-balance-result (try! (fold fold-get-user-sbtc-balance bin-ids (ok {balance: u0, user: user}))))
)
(ok (get balance get-user-sbtc-balance-result))
)
)
;; Fold function to get sBTC balance for an user across multiple bins in this pool
(define-private (fold-get-user-sbtc-balance (bin-id uint) (result (response {balance: uint, user: principal} uint)))
(let (
;; Get result data
(result-data (unwrap! result ERR_NO_RESULT_DATA))
(user (get user result-data))
;; Get balances at bin and calculate bin sBTC balance
(bin-balances (unwrap-panic (contract-call? .dlmm-pool-h-v-0-1 get-bin-balances bin-id)))
(bin-sbtc-balance (if SBTC_IS_X_TOKEN (get x-balance bin-balances) (get y-balance bin-balances)))
(bin-shares (get bin-shares bin-balances))
;; Assert bin shares is greater than 0
(bin-shares-check (asserts! (> bin-shares u0) ERR_NO_BIN_SHARES))
;; Get user LP balance at bin and calculate user sBTC balance
(user-lp-balance (unwrap-panic (contract-call? .dlmm-pool-h-v-0-1 get-balance bin-id user)))
(user-sbtc-balance (/ (* user-lp-balance bin-sbtc-balance) bin-shares))
)
(ok {balance: (+ (get balance result-data) user-sbtc-balance), user: user})
)
)