Source Code

(use-trait ft .ft-trait.ft-trait)

(define-constant wstx .wstx)
(define-constant zsbtc 'SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.zsbtc-v2-0)
(define-constant sbtc 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token)

(define-constant err-not-found (err u8000000))

(define-constant one u100000000)

(define-read-only (get-sbtc-rewards (who principal))
    (let (
        ;; gets with interest
        (reward-balance (unwrap-panic (convert-to sbtc wstx (unwrap-panic (contract-call? 'SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.zsbtc-v2-0 get-balance who)))))
        (reward-decimals (unwrap-panic (get-precision wstx)))
        (reward-program-income-state (unwrap-panic (get-reward-program-income sbtc wstx)))
        )
        ;; get increase in rewards
        (let (
            (cumulated-balance (unwrap-panic
                (calculate-cumulated-balance
                    who
                    'SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.zsbtc-v2-0
                    sbtc
                    wstx
                    reward-balance
                    reward-decimals)))
            (balance-increase (- cumulated-balance reward-balance))
            (new-user-index (get-normalized-income
                (get liquidity-rate reward-program-income-state)
                (get last-updated-block reward-program-income-state)
                (get last-liquidity-cumulative-index reward-program-income-state))))
            ;; update income of the rewarded asset to latest
            balance-increase
        )
    )
)

(define-read-only (get-precision (asset <ft>))
    (contract-call? .incentives get-precision asset)
)

(define-read-only (convert-to
    (from <ft>)
    (to <ft>)
    (from-amount uint))
    (begin
        (contract-call? .incentives convert-to
            from
            to
            from-amount
        )
    )
)


(define-read-only (calculate-cumulated-balance
  (who principal)
  (lp-supplied-asset <ft>)
  (supplied-asset <ft>)
  (reward-asset <ft>)
  (asset-balance uint)
  (asset-decimals uint))
  (let (
    (rewarded-reserve-data (unwrap! (get-reward-program-income supplied-asset reward-asset) err-not-found))
    (reserve-normalized-income
      (get-normalized-income
        (get liquidity-rate rewarded-reserve-data)
        (get last-updated-block rewarded-reserve-data)
        (get last-liquidity-cumulative-index rewarded-reserve-data))))
      (ok 
        (mul-precision-with-factor
          asset-balance
          asset-decimals
          (div
            reserve-normalized-income
            (unwrap! (get-user-program-index-eval who) err-not-found)))
      )
  )
)

(define-read-only (get-user-program-index-eval
    (who principal)
    )
    (match (get-user-program-index who sbtc wstx)
        index (ok index)
        (let ((balance (unwrap-panic (contract-call? 'SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.zsbtc-v2-0 get-balance who))))
            (if (> balance u0)
                ;; if had a balance already, receive all income
                (ok one)
                ;; if had no balance, receive the asset's last liquidity index
                (ok (get last-liquidity-cumulative-index (unwrap! (get-reward-program-income sbtc wstx) err-not-found)))
            )
        )
    )
)


(define-read-only (get-normalized-income
    (current-liquidity-rate uint)
    (last-updated-block uint)
    (last-liquidity-cumulative-index uint))
    (begin
        (contract-call? .pool-0-reserve-v2-0 get-normalized-income
            current-liquidity-rate
            last-updated-block
            last-liquidity-cumulative-index
        )
    )
)

(define-private (get-user-program-index
    (who principal)
    (supplied-asset <ft>)
    (reward-asset <ft>)
    )
    (contract-call? .incentives get-user-program-index
        who
        supplied-asset
        reward-asset
    )
)

(define-private (get-reward-program-income
    (supplied-asset <ft>)
    (reward-asset <ft>)
    )
    (contract-call? .incentives get-reward-program-income
        supplied-asset
        reward-asset
    )
)

(define-read-only (mul (x uint) (y uint)) (contract-call? .math-v2-0 mul x y))
(define-read-only (div (x uint) (y uint)) (contract-call? .math-v2-0 div x y))
(define-read-only (mul-precision-with-factor (a uint) (decimals-a uint) (b-fixed uint))
  (contract-call? .math-v2-0 mul-precision-with-factor a decimals-a b-fixed))

Functions (8)

FunctionAccessArgs
get-sbtc-rewardsread-onlywho: principal
get-precisionread-onlyasset: <ft>
convert-toread-onlyfrom: <ft>, to: <ft>, from-amount: uint
calculate-cumulated-balanceread-onlywho: principal, lp-supplied-asset: <ft>, supplied-asset: <ft>, reward-asset: <ft>, asset-balance: uint, asset-decimals: uint
get-normalized-incomeread-onlycurrent-liquidity-rate: uint, last-updated-block: uint, last-liquidity-cumulative-index: uint
mulread-onlyx: uint, y: uint
divread-onlyx: uint, y: uint
mul-precision-with-factorread-onlya: uint, decimals-a: uint, b-fixed: uint