@lombard.finance/sdk 4.3.2 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +6 -6
- package/dist/api-functions/generateDepositBtcAddress/generateDepositBtcAddress.d.ts.map +1 -1
- package/dist/api-functions/getDepositBtcAddress/getDepositBtcAddress.d.ts.map +1 -1
- package/dist/api.cjs +1 -1
- package/dist/api.js +29 -29
- package/dist/bridge.cjs +1 -1
- package/dist/bridge.js +7 -7
- package/dist/btc.cjs +1 -1
- package/dist/btc.js +10 -10
- package/dist/chains/btc/actions/deposit/BtcDeposit.d.ts +7 -4
- package/dist/chains/btc/actions/deposit/BtcDeposit.d.ts.map +1 -1
- package/dist/chains/btc/actions/deposit/config/index.d.ts +16 -8
- package/dist/chains/btc/actions/deposit/config/index.d.ts.map +1 -1
- package/dist/chains/btc/actions/deposit/config/solana.d.ts +20 -0
- package/dist/chains/btc/actions/deposit/config/solana.d.ts.map +1 -0
- package/dist/chains/btc/actions/deposit/config/types.d.ts +4 -3
- package/dist/chains/btc/actions/deposit/config/types.d.ts.map +1 -1
- package/dist/chains/evm/EvmActions.d.ts +4 -4
- package/dist/chains/evm/actions/deposit/config/evm.d.ts +3 -3
- package/dist/chains/evm/actions/deposit/config/evm.d.ts.map +1 -1
- package/dist/chains/evm/actions/deposit/config/types.d.ts +1 -1
- package/dist/chains/evm/actions/deposit/config/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/deposit/factory.d.ts +1 -1
- package/dist/chains/evm/actions/deposit/types.d.ts +1 -1
- package/dist/chains/evm/actions/deposit/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/redeem/EvmRedeem.d.ts.map +1 -1
- package/dist/chains/evm/actions/unstake/EvmUnstake.d.ts.map +1 -1
- package/dist/chains/solana/SolanaActions.d.ts +10 -0
- package/dist/chains/solana/SolanaActions.d.ts.map +1 -1
- package/dist/chains/solana/actions/index.d.ts +1 -0
- package/dist/chains/solana/actions/index.d.ts.map +1 -1
- package/dist/chains/solana/actions/redeem/SolanaRedeem.d.ts +37 -0
- package/dist/chains/solana/actions/redeem/SolanaRedeem.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/config/index.d.ts +8 -0
- package/dist/chains/solana/actions/redeem/config/index.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/config/solana.d.ts +22 -0
- package/dist/chains/solana/actions/redeem/config/solana.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/config/types.d.ts +35 -0
- package/dist/chains/solana/actions/redeem/config/types.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/factory.d.ts +12 -0
- package/dist/chains/solana/actions/redeem/factory.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/index.d.ts +9 -0
- package/dist/chains/solana/actions/redeem/index.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/types.d.ts +52 -0
- package/dist/chains/solana/actions/redeem/types.d.ts.map +1 -0
- package/dist/chains/solana/utils.d.ts +15 -0
- package/dist/chains/solana/utils.d.ts.map +1 -0
- package/dist/chunks/BtcActions-BOVJrdTI.cjs +2 -0
- package/dist/chunks/BtcActions-BOVJrdTI.cjs.map +1 -0
- package/dist/chunks/{BtcActions-k-qs1uO0.js → BtcActions-_a8r3Q7c.js} +457 -414
- package/dist/chunks/BtcActions-_a8r3Q7c.js.map +1 -0
- package/dist/chunks/{EvmActions-B_dF42So.js → EvmActions-D4vFpbYk.js} +163 -173
- package/dist/chunks/EvmActions-D4vFpbYk.js.map +1 -0
- package/dist/chunks/EvmActions-VrDbgMDy.cjs +2 -0
- package/dist/chunks/EvmActions-VrDbgMDy.cjs.map +1 -0
- package/dist/chunks/ReferralsClient-Cmrjo9bN.cjs +2 -0
- package/dist/chunks/ReferralsClient-Cmrjo9bN.cjs.map +1 -0
- package/dist/chunks/{ReferralsClient-DbFWWtVi.js → ReferralsClient-DvEsA3II.js} +160 -160
- package/dist/chunks/ReferralsClient-DvEsA3II.js.map +1 -0
- package/dist/chunks/{api-config-CtcP3TVl.js → api-config-Dm6dR85f.js} +6 -6
- package/dist/chunks/{api-config-CtcP3TVl.js.map → api-config-Dm6dR85f.js.map} +1 -1
- package/dist/chunks/{approveLBTC-CZiZmdcX.cjs → approveLBTC-CUXEC3kw.cjs} +2 -2
- package/dist/chunks/{approveLBTC-CZiZmdcX.cjs.map → approveLBTC-CUXEC3kw.cjs.map} +1 -1
- package/dist/chunks/approveLBTC-Du2El1tW.js +26 -0
- package/dist/chunks/{approveLBTC-B5-ZWqct.js.map → approveLBTC-Du2El1tW.js.map} +1 -1
- package/dist/chunks/{array-Cev6kyLJ.js → array-DYttUPf5.js} +7 -7
- package/dist/chunks/{array-Cev6kyLJ.js.map → array-DYttUPf5.js.map} +1 -1
- package/dist/chunks/{blockchain-identifier-BzMQWh-C.cjs → blockchain-identifier-BTPGxLio.cjs} +2 -2
- package/dist/chunks/{blockchain-identifier-BzMQWh-C.cjs.map → blockchain-identifier-BTPGxLio.cjs.map} +1 -1
- package/dist/chunks/{blockchain-identifier-BmadkNtK.js → blockchain-identifier-CTVaEPpY.js} +24 -24
- package/dist/chunks/{blockchain-identifier-BmadkNtK.js.map → blockchain-identifier-CTVaEPpY.js.map} +1 -1
- package/dist/chunks/{bridge-CTsiodO1.js → bridge-DqGabhIY.js} +13 -13
- package/dist/chunks/{bridge-CTsiodO1.js.map → bridge-DqGabhIY.js.map} +1 -1
- package/dist/chunks/{bridge-BzRlY9pP.cjs → bridge-dWaKrMKm.cjs} +2 -2
- package/dist/chunks/{bridge-BzRlY9pP.cjs.map → bridge-dWaKrMKm.cjs.map} +1 -1
- package/dist/chunks/{config-hFKqUyg3.js → config-DghboRx0.js} +10 -10
- package/dist/chunks/{config-hFKqUyg3.js.map → config-DghboRx0.js.map} +1 -1
- package/dist/chunks/{config-l4ZaZw_g.cjs → config-DmCmanM_.cjs} +2 -2
- package/dist/chunks/{config-l4ZaZw_g.cjs.map → config-DmCmanM_.cjs.map} +1 -1
- package/dist/chunks/constants-D1FnS2Z8.js +6 -0
- package/dist/chunks/constants-D1FnS2Z8.js.map +1 -0
- package/dist/chunks/constants-ueShGH9R.cjs +2 -0
- package/dist/chunks/constants-ueShGH9R.cjs.map +1 -0
- package/dist/chunks/{defi-registry-BIRv_zkp.cjs → defi-registry-DDNavtO1.cjs} +2 -2
- package/dist/chunks/{defi-registry-BIRv_zkp.cjs.map → defi-registry-DDNavtO1.cjs.map} +1 -1
- package/dist/chunks/{defi-registry-wNFN3qyB.js → defi-registry-DxjjBQTV.js} +13 -13
- package/dist/chunks/{defi-registry-wNFN3qyB.js.map → defi-registry-DxjjBQTV.js.map} +1 -1
- package/dist/chunks/{depositStatus-DM7fRmbN.js → depositStatus-05_X7FVs.js} +42 -42
- package/dist/chunks/{depositStatus-DM7fRmbN.js.map → depositStatus-05_X7FVs.js.map} +1 -1
- package/dist/chunks/{depositStatus-C3-EgT2a.cjs → depositStatus-CUjHpXFJ.cjs} +2 -2
- package/dist/chunks/{depositStatus-C3-EgT2a.cjs.map → depositStatus-CUjHpXFJ.cjs.map} +1 -1
- package/dist/chunks/events-5c8IHjEF.cjs +2 -0
- package/dist/chunks/events-5c8IHjEF.cjs.map +1 -0
- package/dist/chunks/{events-DdV_xi-2.js → events-rgJZNpHd.js} +414 -303
- package/dist/chunks/events-rgJZNpHd.js.map +1 -0
- package/dist/chunks/evm-by-btc-address-CZvE15lx.js +39 -0
- package/dist/chunks/{evm-by-btc-address-CwLiENtM.js.map → evm-by-btc-address-CZvE15lx.js.map} +1 -1
- package/dist/chunks/fee-requirements-CCNsxAvJ.js +14 -0
- package/dist/chunks/{fee-requirements-x8-8mpJ7.js.map → fee-requirements-CCNsxAvJ.js.map} +1 -1
- package/dist/chunks/get-exchange-ratio-B-xzYND1.js +20 -0
- package/dist/chunks/{get-exchange-ratio-NtnkG1kZ.js.map → get-exchange-ratio-B-xzYND1.js.map} +1 -1
- package/dist/chunks/{get-exchange-ratio-C-7DadfD.cjs → get-exchange-ratio-BEhD4gLB.cjs} +2 -2
- package/dist/chunks/{get-exchange-ratio-C-7DadfD.cjs.map → get-exchange-ratio-BEhD4gLB.cjs.map} +1 -1
- package/dist/chunks/{get-positions-summary-DkZZYbGP.cjs → get-positions-summary-Dh1QPLYO.cjs} +2 -2
- package/dist/chunks/{get-positions-summary-DkZZYbGP.cjs.map → get-positions-summary-Dh1QPLYO.cjs.map} +1 -1
- package/dist/chunks/{get-positions-summary-B_MmGHLv.js → get-positions-summary-iYshN1RQ.js} +28 -28
- package/dist/chunks/{get-positions-summary-B_MmGHLv.js.map → get-positions-summary-iYshN1RQ.js.map} +1 -1
- package/dist/chunks/{get-vault-tvl-YAXePAW3.js → get-vault-tvl-Ct_Zkg7C.js} +41 -41
- package/dist/chunks/{get-vault-tvl-YAXePAW3.js.map → get-vault-tvl-Ct_Zkg7C.js.map} +1 -1
- package/dist/chunks/{get-vault-tvl-DmTUbOY7.cjs → get-vault-tvl-D_tQIDAs.cjs} +2 -2
- package/dist/chunks/{get-vault-tvl-DmTUbOY7.cjs.map → get-vault-tvl-D_tQIDAs.cjs.map} +1 -1
- package/dist/chunks/{get-vault-withdrawals-CWcYy_sH.cjs → get-vault-withdrawals-8ALlEiAC.cjs} +2 -2
- package/dist/chunks/{get-vault-withdrawals-CWcYy_sH.cjs.map → get-vault-withdrawals-8ALlEiAC.cjs.map} +1 -1
- package/dist/chunks/get-vault-withdrawals-jk7Sv4S4.js +161 -0
- package/dist/chunks/{get-vault-withdrawals-BrpZlt6s.js.map → get-vault-withdrawals-jk7Sv4S4.js.map} +1 -1
- package/dist/chunks/{getSharesByAddress-BEgOf1C0.cjs → getSharesByAddress-D8hehnP1.cjs} +2 -2
- package/dist/chunks/{getSharesByAddress-BEgOf1C0.cjs.map → getSharesByAddress-D8hehnP1.cjs.map} +1 -1
- package/dist/chunks/{getSharesByAddress-BiruCDp6.js → getSharesByAddress-_tBaIBsw.js} +38 -38
- package/dist/chunks/{getSharesByAddress-BiruCDp6.js.map → getSharesByAddress-_tBaIBsw.js.map} +1 -1
- package/dist/chunks/getUserStakeAndBakeSignature-CSEyzgMc.cjs +2 -0
- package/dist/chunks/getUserStakeAndBakeSignature-CSEyzgMc.cjs.map +1 -0
- package/dist/chunks/getUserStakeAndBakeSignature-Su-k10ap.js +125 -0
- package/dist/chunks/getUserStakeAndBakeSignature-Su-k10ap.js.map +1 -0
- package/dist/chunks/lbtc-addresses-D8MYCdsx.js +10 -0
- package/dist/chunks/{lbtc-addresses-BLRmtR3c.js.map → lbtc-addresses-D8MYCdsx.js.map} +1 -1
- package/dist/chunks/{lbtc-addresses-xyTYV7hx.cjs → lbtc-addresses-Kil252DX.cjs} +2 -2
- package/dist/chunks/{lbtc-addresses-xyTYV7hx.cjs.map → lbtc-addresses-Kil252DX.cjs.map} +1 -1
- package/dist/chunks/numbers-CclN2Ohk.js +15 -0
- package/dist/chunks/{numbers-CM-lcmt4.js.map → numbers-CclN2Ohk.js.map} +1 -1
- package/dist/chunks/parameters-C_16L5ft.js +11 -0
- package/dist/chunks/{parameters-CDV-6Hk5.js.map → parameters-C_16L5ft.js.map} +1 -1
- package/dist/chunks/satoshi-CSoJBXc6.js +19 -0
- package/dist/chunks/{satoshi-Ch6y8aYG.js.map → satoshi-CSoJBXc6.js.map} +1 -1
- package/dist/chunks/statusConstants-Cri7yswV.cjs +2 -0
- package/dist/chunks/statusConstants-Cri7yswV.cjs.map +1 -0
- package/dist/chunks/{statusConstants-DFxMrVob.js → statusConstants-Zii1786K.js} +1134 -1113
- package/dist/chunks/statusConstants-Zii1786K.js.map +1 -0
- package/dist/chunks/{storeNetworkFeeSignature-BZGL2Zn_.js → storeNetworkFeeSignature-BODIpq3Y.js} +26 -26
- package/dist/chunks/{storeNetworkFeeSignature-BZGL2Zn_.js.map → storeNetworkFeeSignature-BODIpq3Y.js.map} +1 -1
- package/dist/chunks/{storeNetworkFeeSignature-D7yo6lDV.cjs → storeNetworkFeeSignature-Buk4091C.cjs} +2 -2
- package/dist/chunks/{storeNetworkFeeSignature-D7yo6lDV.cjs.map → storeNetworkFeeSignature-Buk4091C.cjs.map} +1 -1
- package/dist/chunks/time-Sa5gggPG.js +24 -0
- package/dist/chunks/{time-QPeEEEnQ.js.map → time-Sa5gggPG.js.map} +1 -1
- package/dist/chunks/{token-addresses-FKpA3uc4.js → token-addresses-D0v5cR1j.js} +174 -163
- package/dist/chunks/{token-addresses-FKpA3uc4.js.map → token-addresses-D0v5cR1j.js.map} +1 -1
- package/dist/chunks/{token-addresses-DRBecUa7.cjs → token-addresses-nzvTOi24.cjs} +2 -2
- package/dist/chunks/{token-addresses-DRBecUa7.cjs.map → token-addresses-nzvTOi24.cjs.map} +1 -1
- package/dist/chunks/{tokens-D_HeVB5p.cjs → tokens-BkvA0Gp1.cjs} +2 -2
- package/dist/chunks/{tokens-D_HeVB5p.cjs.map → tokens-BkvA0Gp1.cjs.map} +1 -1
- package/dist/chunks/{tokens-C6qZHzph.js → tokens-DgC1hfkm.js} +18 -18
- package/dist/chunks/{tokens-C6qZHzph.js.map → tokens-DgC1hfkm.js.map} +1 -1
- package/dist/chunks/{unstakeLBTC-H0zdYQa6.cjs → unstakeLBTC-CmoCaGX9.cjs} +2 -2
- package/dist/chunks/{unstakeLBTC-H0zdYQa6.cjs.map → unstakeLBTC-CmoCaGX9.cjs.map} +1 -1
- package/dist/chunks/{unstakeLBTC-DAIR9NO_.js → unstakeLBTC-DtvVbpbU.js} +50 -50
- package/dist/chunks/{unstakeLBTC-DAIR9NO_.js.map → unstakeLBTC-DtvVbpbU.js.map} +1 -1
- package/dist/chunks/{withdraw-hHueI2p7.js → withdraw-DgjuaUN3.js} +45 -45
- package/dist/chunks/{withdraw-hHueI2p7.js.map → withdraw-DgjuaUN3.js.map} +1 -1
- package/dist/chunks/{withdraw-C1fMFSwy.cjs → withdraw-i0AueZ_C.cjs} +2 -2
- package/dist/chunks/{withdraw-C1fMFSwy.cjs.map → withdraw-i0AueZ_C.cjs.map} +1 -1
- package/dist/common/constants.d.ts +1 -0
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/contracts.cjs +1 -1
- package/dist/contracts.js +16 -16
- package/dist/core/assets/catalog.d.ts.map +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.js +85 -85
- package/dist/debug.js +4 -4
- package/dist/defi.cjs +1 -1
- package/dist/defi.js +10 -10
- package/dist/evm.cjs +1 -1
- package/dist/evm.js +34 -34
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +287 -283
- package/dist/index.js.map +1 -1
- package/dist/metrics.cjs +1 -1
- package/dist/metrics.js +6 -6
- package/dist/stories/arg-types.d.ts +1 -0
- package/dist/stories/arg-types.d.ts.map +1 -1
- package/dist/tokens/token-addresses.d.ts +2 -2
- package/dist/tokens/token-addresses.d.ts.map +1 -1
- package/dist/utils/chain.d.ts +7 -0
- package/dist/utils/chain.d.ts.map +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +76 -76
- package/dist/vaults.cjs +1 -1
- package/dist/vaults.js +14 -14
- package/package.json +19 -6
- package/dist/chunks/BtcActions-XbVRQEcM.cjs +0 -2
- package/dist/chunks/BtcActions-XbVRQEcM.cjs.map +0 -1
- package/dist/chunks/BtcActions-k-qs1uO0.js.map +0 -1
- package/dist/chunks/EvmActions-BVzQ3fLK.cjs +0 -2
- package/dist/chunks/EvmActions-BVzQ3fLK.cjs.map +0 -1
- package/dist/chunks/EvmActions-B_dF42So.js.map +0 -1
- package/dist/chunks/ReferralsClient-BC-1wT1q.cjs +0 -2
- package/dist/chunks/ReferralsClient-BC-1wT1q.cjs.map +0 -1
- package/dist/chunks/ReferralsClient-DbFWWtVi.js.map +0 -1
- package/dist/chunks/approveLBTC-B5-ZWqct.js +0 -26
- package/dist/chunks/constants-BBK-JNcY.cjs +0 -2
- package/dist/chunks/constants-BBK-JNcY.cjs.map +0 -1
- package/dist/chunks/constants-CuT4axsy.js +0 -5
- package/dist/chunks/constants-CuT4axsy.js.map +0 -1
- package/dist/chunks/events-DdV_xi-2.js.map +0 -1
- package/dist/chunks/events-DqIJRzJo.cjs +0 -2
- package/dist/chunks/events-DqIJRzJo.cjs.map +0 -1
- package/dist/chunks/evm-by-btc-address-CwLiENtM.js +0 -39
- package/dist/chunks/fee-requirements-x8-8mpJ7.js +0 -14
- package/dist/chunks/get-exchange-ratio-NtnkG1kZ.js +0 -20
- package/dist/chunks/get-vault-withdrawals-BrpZlt6s.js +0 -161
- package/dist/chunks/getUserStakeAndBakeSignature-BxRq2cI1.cjs +0 -2
- package/dist/chunks/getUserStakeAndBakeSignature-BxRq2cI1.cjs.map +0 -1
- package/dist/chunks/getUserStakeAndBakeSignature-NGGblnJl.js +0 -120
- package/dist/chunks/getUserStakeAndBakeSignature-NGGblnJl.js.map +0 -1
- package/dist/chunks/lbtc-addresses-BLRmtR3c.js +0 -10
- package/dist/chunks/numbers-CM-lcmt4.js +0 -15
- package/dist/chunks/parameters-CDV-6Hk5.js +0 -11
- package/dist/chunks/satoshi-Ch6y8aYG.js +0 -19
- package/dist/chunks/statusConstants-BLiNBT6s.cjs +0 -2
- package/dist/chunks/statusConstants-BLiNBT6s.cjs.map +0 -1
- package/dist/chunks/statusConstants-DFxMrVob.js.map +0 -1
- package/dist/chunks/time-QPeEEEnQ.js +0 -24
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
import r from "axios";
|
|
2
2
|
import n from "bignumber.js";
|
|
3
|
-
import {
|
|
3
|
+
import { getApiConfig as d } from "./api-config-Dm6dR85f.js";
|
|
4
4
|
import { zeroAddress as u } from "viem";
|
|
5
|
-
import {
|
|
5
|
+
import { Token as l } from "./token-addresses-D0v5cR1j.js";
|
|
6
6
|
async function w({
|
|
7
7
|
account: a,
|
|
8
|
-
env:
|
|
8
|
+
env: o
|
|
9
9
|
}) {
|
|
10
10
|
if (!a)
|
|
11
11
|
throw new Error("Missing account address");
|
|
12
|
-
const { baseApiUrl: i } = d(
|
|
12
|
+
const { baseApiUrl: i } = d(o), e = `${i}/api/v1/analytics/${a}/additional-rewards`, { data: t } = await r.get(e);
|
|
13
13
|
return {
|
|
14
|
-
distributed: t.btc_distributed.map((
|
|
15
|
-
amount: n(
|
|
16
|
-
name:
|
|
14
|
+
distributed: t.btc_distributed.map((s) => ({
|
|
15
|
+
amount: n(s.amount),
|
|
16
|
+
name: s.name
|
|
17
17
|
})),
|
|
18
|
-
undistributed: t.btc_undistributed.map((
|
|
19
|
-
amount: n(
|
|
20
|
-
name:
|
|
18
|
+
undistributed: t.btc_undistributed.map((s) => ({
|
|
19
|
+
amount: n(s.amount),
|
|
20
|
+
name: s.name
|
|
21
21
|
}))
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
async function A({
|
|
25
25
|
account: a,
|
|
26
|
-
env:
|
|
26
|
+
env: o
|
|
27
27
|
}) {
|
|
28
|
-
const { baseApiUrl: i } = d(
|
|
28
|
+
const { baseApiUrl: i } = d(o), e = `${i}/api/v1/analytics/${a || u}/apy`, { data: t } = await r.get(e);
|
|
29
29
|
return {
|
|
30
30
|
baseApy: n(t.lbtc_base_apy),
|
|
31
31
|
effectiveApy: n(t.lbtc_effective_apy)
|
|
@@ -33,24 +33,24 @@ async function A({
|
|
|
33
33
|
}
|
|
34
34
|
async function $({
|
|
35
35
|
partnerId: a,
|
|
36
|
-
env:
|
|
36
|
+
env: o
|
|
37
37
|
}) {
|
|
38
|
-
const { baseApiUrl: i } = d(
|
|
38
|
+
const { baseApiUrl: i } = d(o), e = `${i}/api/v1/analytics/estimated-apy?partner_id=${a || ""}`, { data: t } = await r.get(e);
|
|
39
39
|
return {
|
|
40
40
|
estimatedApy: n(t.lbtc_estimated_apy)
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
async function v(a) {
|
|
44
|
-
const
|
|
44
|
+
const o = a == null ? void 0 : a.env, i = a == null ? void 0 : a.partnerId, { bffApiUrl: e } = d(o);
|
|
45
45
|
if (!e)
|
|
46
46
|
throw new Error(
|
|
47
|
-
`Could not determine API endpoint for provided environment: ${
|
|
47
|
+
`Could not determine API endpoint for provided environment: ${o}`
|
|
48
48
|
);
|
|
49
49
|
const { data: t } = await r.get(
|
|
50
50
|
`${e}/dune-api/query/getLBTCStats?partnerId=${i || ""}`
|
|
51
51
|
), { data: p } = await r.get(
|
|
52
52
|
`${e}/dune-api/query/lbtc-holders?partnerId=${i || ""}`
|
|
53
|
-
), { data:
|
|
53
|
+
), { data: s } = await r.get(
|
|
54
54
|
`${e}/dune-api/query/getTotalLBTCUsers?partnerId=${i || ""}`
|
|
55
55
|
);
|
|
56
56
|
return {
|
|
@@ -58,7 +58,7 @@ async function v(a) {
|
|
|
58
58
|
supply: n(t[0].supply),
|
|
59
59
|
tvl: n(t[0].tvl),
|
|
60
60
|
holders: n(p),
|
|
61
|
-
historicalHolders: n(
|
|
61
|
+
historicalHolders: n(s)
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
64
|
function y(a) {
|
|
@@ -71,10 +71,10 @@ function y(a) {
|
|
|
71
71
|
}
|
|
72
72
|
async function h({
|
|
73
73
|
account: a,
|
|
74
|
-
env:
|
|
74
|
+
env: o
|
|
75
75
|
}) {
|
|
76
|
-
var
|
|
77
|
-
const { baseApiUrl: i } = d(
|
|
76
|
+
var s;
|
|
77
|
+
const { baseApiUrl: i } = d(o), e = `${i}/api/v1/analytics/${a}/summary`, { data: t } = await r.get(e);
|
|
78
78
|
return {
|
|
79
79
|
btcPrice: {
|
|
80
80
|
price: n(t.btc_price_usd.price || 0),
|
|
@@ -82,7 +82,7 @@ async function h({
|
|
|
82
82
|
},
|
|
83
83
|
btcValue: n(t.btc_value || 0),
|
|
84
84
|
btcPnl: n(t.btc_pnl || 0),
|
|
85
|
-
snapshot: (
|
|
85
|
+
snapshot: (s = t.snapshot) == null ? void 0 : s.map((c) => ({
|
|
86
86
|
token: y(c.asset),
|
|
87
87
|
type: c.type,
|
|
88
88
|
balance: n(c.balance || 0),
|
|
@@ -94,10 +94,10 @@ async function h({
|
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
96
|
export {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
97
|
+
w as getAdditionalRewards,
|
|
98
|
+
A as getApy,
|
|
99
|
+
$ as getEstimatedApy,
|
|
100
|
+
v as getLBTCStats,
|
|
101
|
+
h as getPositionsSummary
|
|
102
102
|
};
|
|
103
|
-
//# sourceMappingURL=get-positions-summary-
|
|
103
|
+
//# sourceMappingURL=get-positions-summary-iYshN1RQ.js.map
|
package/dist/chunks/{get-positions-summary-B_MmGHLv.js.map → get-positions-summary-iYshN1RQ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-positions-summary-B_MmGHLv.js","sources":["../../src/metrics/get-additional-rewards.ts","../../src/metrics/get-lbtc-apy.ts","../../src/metrics/get-lbtc-stats.ts","../../src/metrics/get-positions-summary.ts"],"sourcesContent":["import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address } from 'viem';\n\nimport { getApiConfig } from '../common/api-config';\nimport { IEnvParam } from '../common/parameters';\n\ntype Response = {\n btc_distributed: { name: string; amount: number }[];\n btc_undistributed: { name: string; amount: number }[];\n};\n\nexport type RewardsDistribution = {\n /**\n * List of campaigns where rewards have been successfully distributed.\n */\n distributed: {\n /** Name of the reward campaign. */\n name: string;\n /** Amount of BTC distributed for this campaign. */\n amount: BigNumber;\n }[];\n\n /**\n * List of campaigns where rewards are pending or not yet distributed.\n */\n undistributed: {\n /** Name of the reward campaign. */\n name: string;\n /** Amount of BTC yet to be distributed. */\n amount: BigNumber;\n }[];\n};\n\n/**\n * Retrieves additional rewards that have been distributed or are pending\n * for a specific account.\n */\nexport async function getAdditionalRewards({\n account,\n env,\n}: {\n account: Address;\n} & IEnvParam) {\n if (!account) {\n throw new Error('Missing account address');\n }\n\n const { baseApiUrl } = getApiConfig(env);\n\n const url = `${baseApiUrl}/api/v1/analytics/${account}/additional-rewards`;\n const { data } = await axios.get<Response>(url);\n\n const distribution: RewardsDistribution = {\n distributed: data.btc_distributed.map(d => ({\n amount: BigNumber(d.amount),\n name: d.name,\n })),\n undistributed: data.btc_undistributed.map(u => ({\n amount: BigNumber(u.amount),\n name: u.name,\n })),\n };\n\n return distribution;\n}\n\n// url: https://bft-dev.stage.lombard-fi.com/api/v1/analytics/0x2513196b4fD01Ed5888d1dB49AB9a42208E9fF90/additional-rewards\n// {\"btc_distributed\":[{\"name\":\"ledger\", \"amount\":0.7691864317643695}], \"btc_undistributed\":[{\"name\":\"ledger\", \"amount\":0.5699985451505658}]}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address, zeroAddress } from 'viem';\n\nimport { getApiConfig } from '../common/api-config';\nimport { IEnvParam } from '../common/parameters';\n\ntype Response = {\n lbtc_base_apy: number;\n lbtc_effective_apy: number;\n};\n\nexport type LbtcApy = {\n /**\n * The base APY for LBTC, representing the nominal yield without any bonuses\n * or adjustments.\n */\n baseApy: BigNumber;\n /**\n * The effective APY for LBTC, including any additional rewards,\n * compounding effects, or protocol-specific incentives.\n */\n effectiveApy: BigNumber;\n};\n\n/** Returns the current APY (annual percentage yield) for LBTC. */\nexport async function getApy({\n account,\n env,\n}: {\n /** The optional account address. Pass it for more accurate APY data. */\n account?: Address;\n} & IEnvParam) {\n const { baseApiUrl } = getApiConfig(env);\n\n const url = `${baseApiUrl}/api/v1/analytics/${account || zeroAddress}/apy`;\n const { data } = await axios.get<Response>(url);\n\n const apy: LbtcApy = {\n baseApy: BigNumber(data.lbtc_base_apy),\n effectiveApy: BigNumber(data.lbtc_effective_apy),\n };\n\n return apy;\n}\n\ntype EstimatedApyResponse = { lbtc_estimated_apy: number };\nexport type LbtcEstimatedApy = {\n /**\n * The estimated APY for LBTC based on the specified partner context.\n *\n * This value reflects a projected annual percentage yield that may vary\n * depending on the `partnerId`, taking into account potential partner-specific\n * incentives, compounding assumptions, or estimated future rewards.\n */\n estimatedApy: BigNumber;\n};\n\n/** Returns the estimated APY for LBTC. */\nexport async function getEstimatedApy({\n partnerId,\n env,\n}: { partnerId?: string } & IEnvParam) {\n const { baseApiUrl } = getApiConfig(env);\n\n const url = `${baseApiUrl}/api/v1/analytics/estimated-apy?partner_id=${partnerId || ''}`;\n const { data } = await axios.get<EstimatedApyResponse>(url);\n\n const apy: LbtcEstimatedApy = {\n estimatedApy: BigNumber(data.lbtc_estimated_apy),\n };\n\n return apy;\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\n\nimport { getApiConfig } from '../common/api-config';\nimport { IEnvParam } from '../common/parameters';\n\ntype LBTCStatsResponse = { price: number; supply: number; tvl: number }[];\n\ntype LBTCHoldersResponse = number;\n\ntype Stats = {\n /** The BTC price */\n price: BigNumber;\n /** The LBTC supply */\n supply: BigNumber;\n /** The LBTC TVL (supply * price) */\n tvl: BigNumber;\n /** The number of LBTC holders */\n holders: BigNumber;\n /** The total (historical) number of LBTC holders */\n historicalHolders: BigNumber;\n};\n\n/** Gets the Lombard's TVL. */\nexport async function getLBTCStats(\n parameters?: { partnerId?: string; accountAddress?: string } & IEnvParam,\n) {\n const env = parameters?.env;\n const partnerId = parameters?.partnerId;\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const { data } = await axios.get<LBTCStatsResponse>(\n `${bffApiUrl}/dune-api/query/getLBTCStats?partnerId=${partnerId || ''}`,\n );\n\n const { data: holders } = await axios.get<LBTCHoldersResponse>(\n `${bffApiUrl}/dune-api/query/lbtc-holders?partnerId=${partnerId || ''}`,\n );\n\n const { data: historicalHolders } = await axios.get<LBTCHoldersResponse>(\n `${bffApiUrl}/dune-api/query/getTotalLBTCUsers?partnerId=${partnerId || ''}`,\n );\n\n const stats: Stats = {\n price: BigNumber(data[0].price),\n supply: BigNumber(data[0].supply),\n tvl: BigNumber(data[0].tvl),\n holders: BigNumber(holders),\n historicalHolders: BigNumber(historicalHolders),\n };\n\n return stats;\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address } from 'viem';\n\nimport { getApiConfig } from '../common/api-config';\nimport { IEnvParam } from '../common/parameters';\nimport { Token } from '../tokens/token-addresses';\n\ntype PositionAsset = 'ASSET_LBTC' | 'ASSET_UNSPECIFIED';\ntype PositionType = 'BALANCE_TYPE_HOLDING' | 'BALANCE_TYPE_DEFI';\n\ntype Response = {\n btc_price_usd: { price: number; timestamp: string };\n btc_value: number;\n btc_pnl: number;\n snapshot: [\n {\n asset: PositionAsset;\n type: PositionType;\n balance: number;\n pnl: number;\n rate: number;\n },\n ];\n last_updated: string;\n in_progress: boolean;\n};\n\nfunction mapRewardAssetToToken(asset: PositionAsset) {\n switch (asset) {\n case 'ASSET_LBTC':\n return Token.LBTC;\n default:\n return undefined;\n }\n}\n\nexport type PositionsSummary = {\n /**\n * The current BTC price in USD, along with the timestamp\n * when the price was last fetched.\n */\n btcPrice: {\n /** The price of 1 BTC in USD. */\n price: BigNumber;\n /** Timestamp of the price data. */\n timestamp: Date;\n };\n /**\n * Total value of all holdings, denominated in BTC.\n */\n btcValue: BigNumber;\n /**\n * Total profit or loss across all assets, represented in BTC.\n */\n btcPnl: BigNumber;\n /**\n * A detailed snapshot of position data used in PnL calculation.\n */\n snapshot: {\n /**\n * The token associated with this position (e.g., `Token.LBTC`).\n * Can be `undefined` if unspecified.\n */\n token: Token | undefined;\n /**\n * The classification or source of the position.\n */\n type: PositionType;\n /**\n * The quantity of the token held.\n */\n balance: BigNumber;\n /**\n * The profit or loss for this specific position, in BTC.\n */\n pnl: BigNumber;\n /**\n * The conversion rate used to determine the BTC value of the balance.\n * `balance * rate = BTC equivalent`\n */\n rate: BigNumber;\n }[];\n /**\n * The timestamp when the PnL data was last updated.\n */\n lastUpdated: Date;\n /**\n * Indicates whether the backend is currently processing the PnL calculation.\n *\n * - `true`: A new calculation request was received, but the backend is experiencing high load\n * or processing is not yet complete. The latest data is not yet available.\n *\n * - `false`: The most recent calculation has been completed and cached.\n * Use `lastUpdated` to understand how fresh the data is:\n * - If `lastUpdated` is recent (e.g., within the last few seconds), you're seeing the latest data.\n * - If `lastUpdated` is up to 30 minutes old, you're seeing cached data from a recent request.\n * The backend avoids recalculating within this caching window.\n */\n inProgress: boolean;\n};\n\n/** Retrieves the yield positions summary for the specified account address. */\nexport async function getPositionsSummary({\n account,\n env,\n}: { account: Address } & IEnvParam) {\n const { baseApiUrl } = getApiConfig(env);\n\n const url = `${baseApiUrl}/api/v1/analytics/${account}/summary`;\n const { data } = await axios.get<Response>(url);\n\n const info: PositionsSummary = {\n btcPrice: {\n price: BigNumber(data.btc_price_usd.price || 0),\n timestamp: new Date(data.btc_price_usd.timestamp),\n },\n btcValue: BigNumber(data.btc_value || 0),\n btcPnl: BigNumber(data.btc_pnl || 0),\n snapshot: data.snapshot?.map(ds => ({\n token: mapRewardAssetToToken(ds.asset),\n type: ds.type,\n balance: BigNumber(ds.balance || 0),\n pnl: BigNumber(ds.pnl || 0),\n rate: BigNumber(ds.rate || 0),\n })),\n lastUpdated: new Date(data.last_updated),\n inProgress: Boolean(data.in_progress),\n };\n\n return info;\n}\n"],"names":["getAdditionalRewards","account","env","baseApiUrl","getApiConfig","url","data","axios","d","BigNumber","u","getApy","zeroAddress","getEstimatedApy","partnerId","getLBTCStats","parameters","bffApiUrl","holders","historicalHolders","mapRewardAssetToToken","asset","Token","getPositionsSummary","_a","ds"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-positions-summary-iYshN1RQ.js","sources":["../../src/metrics/get-additional-rewards.ts","../../src/metrics/get-lbtc-apy.ts","../../src/metrics/get-lbtc-stats.ts","../../src/metrics/get-positions-summary.ts"],"sourcesContent":["import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address } from 'viem';\n\nimport { getApiConfig } from '../common/api-config';\nimport { IEnvParam } from '../common/parameters';\n\ntype Response = {\n btc_distributed: { name: string; amount: number }[];\n btc_undistributed: { name: string; amount: number }[];\n};\n\nexport type RewardsDistribution = {\n /**\n * List of campaigns where rewards have been successfully distributed.\n */\n distributed: {\n /** Name of the reward campaign. */\n name: string;\n /** Amount of BTC distributed for this campaign. */\n amount: BigNumber;\n }[];\n\n /**\n * List of campaigns where rewards are pending or not yet distributed.\n */\n undistributed: {\n /** Name of the reward campaign. */\n name: string;\n /** Amount of BTC yet to be distributed. */\n amount: BigNumber;\n }[];\n};\n\n/**\n * Retrieves additional rewards that have been distributed or are pending\n * for a specific account.\n */\nexport async function getAdditionalRewards({\n account,\n env,\n}: {\n account: Address;\n} & IEnvParam) {\n if (!account) {\n throw new Error('Missing account address');\n }\n\n const { baseApiUrl } = getApiConfig(env);\n\n const url = `${baseApiUrl}/api/v1/analytics/${account}/additional-rewards`;\n const { data } = await axios.get<Response>(url);\n\n const distribution: RewardsDistribution = {\n distributed: data.btc_distributed.map(d => ({\n amount: BigNumber(d.amount),\n name: d.name,\n })),\n undistributed: data.btc_undistributed.map(u => ({\n amount: BigNumber(u.amount),\n name: u.name,\n })),\n };\n\n return distribution;\n}\n\n// url: https://bft-dev.stage.lombard-fi.com/api/v1/analytics/0x2513196b4fD01Ed5888d1dB49AB9a42208E9fF90/additional-rewards\n// {\"btc_distributed\":[{\"name\":\"ledger\", \"amount\":0.7691864317643695}], \"btc_undistributed\":[{\"name\":\"ledger\", \"amount\":0.5699985451505658}]}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address, zeroAddress } from 'viem';\n\nimport { getApiConfig } from '../common/api-config';\nimport { IEnvParam } from '../common/parameters';\n\ntype Response = {\n lbtc_base_apy: number;\n lbtc_effective_apy: number;\n};\n\nexport type LbtcApy = {\n /**\n * The base APY for LBTC, representing the nominal yield without any bonuses\n * or adjustments.\n */\n baseApy: BigNumber;\n /**\n * The effective APY for LBTC, including any additional rewards,\n * compounding effects, or protocol-specific incentives.\n */\n effectiveApy: BigNumber;\n};\n\n/** Returns the current APY (annual percentage yield) for LBTC. */\nexport async function getApy({\n account,\n env,\n}: {\n /** The optional account address. Pass it for more accurate APY data. */\n account?: Address;\n} & IEnvParam) {\n const { baseApiUrl } = getApiConfig(env);\n\n const url = `${baseApiUrl}/api/v1/analytics/${account || zeroAddress}/apy`;\n const { data } = await axios.get<Response>(url);\n\n const apy: LbtcApy = {\n baseApy: BigNumber(data.lbtc_base_apy),\n effectiveApy: BigNumber(data.lbtc_effective_apy),\n };\n\n return apy;\n}\n\ntype EstimatedApyResponse = { lbtc_estimated_apy: number };\nexport type LbtcEstimatedApy = {\n /**\n * The estimated APY for LBTC based on the specified partner context.\n *\n * This value reflects a projected annual percentage yield that may vary\n * depending on the `partnerId`, taking into account potential partner-specific\n * incentives, compounding assumptions, or estimated future rewards.\n */\n estimatedApy: BigNumber;\n};\n\n/** Returns the estimated APY for LBTC. */\nexport async function getEstimatedApy({\n partnerId,\n env,\n}: { partnerId?: string } & IEnvParam) {\n const { baseApiUrl } = getApiConfig(env);\n\n const url = `${baseApiUrl}/api/v1/analytics/estimated-apy?partner_id=${partnerId || ''}`;\n const { data } = await axios.get<EstimatedApyResponse>(url);\n\n const apy: LbtcEstimatedApy = {\n estimatedApy: BigNumber(data.lbtc_estimated_apy),\n };\n\n return apy;\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\n\nimport { getApiConfig } from '../common/api-config';\nimport { IEnvParam } from '../common/parameters';\n\ntype LBTCStatsResponse = { price: number; supply: number; tvl: number }[];\n\ntype LBTCHoldersResponse = number;\n\ntype Stats = {\n /** The BTC price */\n price: BigNumber;\n /** The LBTC supply */\n supply: BigNumber;\n /** The LBTC TVL (supply * price) */\n tvl: BigNumber;\n /** The number of LBTC holders */\n holders: BigNumber;\n /** The total (historical) number of LBTC holders */\n historicalHolders: BigNumber;\n};\n\n/** Gets the Lombard's TVL. */\nexport async function getLBTCStats(\n parameters?: { partnerId?: string; accountAddress?: string } & IEnvParam,\n) {\n const env = parameters?.env;\n const partnerId = parameters?.partnerId;\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const { data } = await axios.get<LBTCStatsResponse>(\n `${bffApiUrl}/dune-api/query/getLBTCStats?partnerId=${partnerId || ''}`,\n );\n\n const { data: holders } = await axios.get<LBTCHoldersResponse>(\n `${bffApiUrl}/dune-api/query/lbtc-holders?partnerId=${partnerId || ''}`,\n );\n\n const { data: historicalHolders } = await axios.get<LBTCHoldersResponse>(\n `${bffApiUrl}/dune-api/query/getTotalLBTCUsers?partnerId=${partnerId || ''}`,\n );\n\n const stats: Stats = {\n price: BigNumber(data[0].price),\n supply: BigNumber(data[0].supply),\n tvl: BigNumber(data[0].tvl),\n holders: BigNumber(holders),\n historicalHolders: BigNumber(historicalHolders),\n };\n\n return stats;\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address } from 'viem';\n\nimport { getApiConfig } from '../common/api-config';\nimport { IEnvParam } from '../common/parameters';\nimport { Token } from '../tokens/token-addresses';\n\ntype PositionAsset = 'ASSET_LBTC' | 'ASSET_UNSPECIFIED';\ntype PositionType = 'BALANCE_TYPE_HOLDING' | 'BALANCE_TYPE_DEFI';\n\ntype Response = {\n btc_price_usd: { price: number; timestamp: string };\n btc_value: number;\n btc_pnl: number;\n snapshot: [\n {\n asset: PositionAsset;\n type: PositionType;\n balance: number;\n pnl: number;\n rate: number;\n },\n ];\n last_updated: string;\n in_progress: boolean;\n};\n\nfunction mapRewardAssetToToken(asset: PositionAsset) {\n switch (asset) {\n case 'ASSET_LBTC':\n return Token.LBTC;\n default:\n return undefined;\n }\n}\n\nexport type PositionsSummary = {\n /**\n * The current BTC price in USD, along with the timestamp\n * when the price was last fetched.\n */\n btcPrice: {\n /** The price of 1 BTC in USD. */\n price: BigNumber;\n /** Timestamp of the price data. */\n timestamp: Date;\n };\n /**\n * Total value of all holdings, denominated in BTC.\n */\n btcValue: BigNumber;\n /**\n * Total profit or loss across all assets, represented in BTC.\n */\n btcPnl: BigNumber;\n /**\n * A detailed snapshot of position data used in PnL calculation.\n */\n snapshot: {\n /**\n * The token associated with this position (e.g., `Token.LBTC`).\n * Can be `undefined` if unspecified.\n */\n token: Token | undefined;\n /**\n * The classification or source of the position.\n */\n type: PositionType;\n /**\n * The quantity of the token held.\n */\n balance: BigNumber;\n /**\n * The profit or loss for this specific position, in BTC.\n */\n pnl: BigNumber;\n /**\n * The conversion rate used to determine the BTC value of the balance.\n * `balance * rate = BTC equivalent`\n */\n rate: BigNumber;\n }[];\n /**\n * The timestamp when the PnL data was last updated.\n */\n lastUpdated: Date;\n /**\n * Indicates whether the backend is currently processing the PnL calculation.\n *\n * - `true`: A new calculation request was received, but the backend is experiencing high load\n * or processing is not yet complete. The latest data is not yet available.\n *\n * - `false`: The most recent calculation has been completed and cached.\n * Use `lastUpdated` to understand how fresh the data is:\n * - If `lastUpdated` is recent (e.g., within the last few seconds), you're seeing the latest data.\n * - If `lastUpdated` is up to 30 minutes old, you're seeing cached data from a recent request.\n * The backend avoids recalculating within this caching window.\n */\n inProgress: boolean;\n};\n\n/** Retrieves the yield positions summary for the specified account address. */\nexport async function getPositionsSummary({\n account,\n env,\n}: { account: Address } & IEnvParam) {\n const { baseApiUrl } = getApiConfig(env);\n\n const url = `${baseApiUrl}/api/v1/analytics/${account}/summary`;\n const { data } = await axios.get<Response>(url);\n\n const info: PositionsSummary = {\n btcPrice: {\n price: BigNumber(data.btc_price_usd.price || 0),\n timestamp: new Date(data.btc_price_usd.timestamp),\n },\n btcValue: BigNumber(data.btc_value || 0),\n btcPnl: BigNumber(data.btc_pnl || 0),\n snapshot: data.snapshot?.map(ds => ({\n token: mapRewardAssetToToken(ds.asset),\n type: ds.type,\n balance: BigNumber(ds.balance || 0),\n pnl: BigNumber(ds.pnl || 0),\n rate: BigNumber(ds.rate || 0),\n })),\n lastUpdated: new Date(data.last_updated),\n inProgress: Boolean(data.in_progress),\n };\n\n return info;\n}\n"],"names":["getAdditionalRewards","account","env","baseApiUrl","getApiConfig","url","data","axios","d","BigNumber","u","getApy","zeroAddress","getEstimatedApy","partnerId","getLBTCStats","parameters","bffApiUrl","holders","historicalHolders","mapRewardAssetToToken","asset","Token","getPositionsSummary","_a","ds"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import v from "axios";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { getApiConfig as P } from "./api-config-Dm6dR85f.js";
|
|
3
|
+
import { getAssetInfo as N, fromBaseDenomination as V } from "./tokens-DgC1hfkm.js";
|
|
4
|
+
import { unique as T, orderBy as $ } from "./array-DYttUPf5.js";
|
|
5
|
+
import { ensureHex as _ } from "./time-Sa5gggPG.js";
|
|
6
|
+
import { Vault as A, isVedaVaultChain as k, VAULTS as b, VEDA_VAULT_CHAIN_TO_NETWORK_MAP as U, NETWORK_TO_VEDA_VAULT_CHAIN_MAP as O } from "./config-DghboRx0.js";
|
|
7
7
|
import w from "bignumber.js";
|
|
8
|
-
import {
|
|
8
|
+
import { ChainId as f } from "./token-addresses-D0v5cR1j.js";
|
|
9
9
|
import "viem";
|
|
10
10
|
import "viem/chains";
|
|
11
11
|
const D = (e) => {
|
|
@@ -38,30 +38,30 @@ async function S({
|
|
|
38
38
|
throw new Error(
|
|
39
39
|
`Could not determine API endpoint for provided environment: ${u}`
|
|
40
40
|
);
|
|
41
|
-
const p = `${i}/sevenseas-api/deposits/${o}/${n.vaultContract.address}/${e}`, { data:
|
|
42
|
-
l.map((
|
|
41
|
+
const p = `${i}/sevenseas-api/deposits/${o}/${n.vaultContract.address}/${e}`, { data: r } = await v.get(p), l = D(r), d = T(
|
|
42
|
+
l.map((s) => _(s.deposit_asset))
|
|
43
43
|
), h = {};
|
|
44
|
-
for (const
|
|
45
|
-
const m = await N(
|
|
46
|
-
m ? h[
|
|
44
|
+
for (const s of d) {
|
|
45
|
+
const m = await N(s, t, a);
|
|
46
|
+
m ? h[s] = {
|
|
47
47
|
address: m.address,
|
|
48
48
|
decimals: m.decimals,
|
|
49
49
|
symbol: m.symbol
|
|
50
|
-
} : h[
|
|
50
|
+
} : h[s] = void 0;
|
|
51
51
|
}
|
|
52
|
-
const C = l.map((
|
|
53
|
-
const m = h[_(
|
|
52
|
+
const C = l.map((s) => {
|
|
53
|
+
const m = h[_(s.deposit_asset)], y = V(s.deposit_amount, (m == null ? void 0 : m.decimals) || 0), E = V(s.share_amount, n.decimals);
|
|
54
54
|
return {
|
|
55
|
-
txHash: _(
|
|
56
|
-
blockNumber:
|
|
57
|
-
chainId: O[
|
|
55
|
+
txHash: _(s.tx_hash),
|
|
56
|
+
blockNumber: s.block_number,
|
|
57
|
+
chainId: O[s.chain],
|
|
58
58
|
amount: y,
|
|
59
59
|
shareAmount: E,
|
|
60
60
|
token: m,
|
|
61
|
-
toAddress: _(
|
|
61
|
+
toAddress: _(s.user)
|
|
62
62
|
};
|
|
63
63
|
});
|
|
64
|
-
return
|
|
64
|
+
return $(C, (s) => s.blockNumber, "desc");
|
|
65
65
|
}
|
|
66
66
|
async function X({
|
|
67
67
|
account: e,
|
|
@@ -74,7 +74,7 @@ async function X({
|
|
|
74
74
|
const u = a.chains.map(
|
|
75
75
|
(i) => S({ account: e, chainId: i, vaultKey: t, rpcUrl: c }).catch((p) => (console.error(`Failed to fetch deposits for chain ${i}:`, p), []))
|
|
76
76
|
), o = (await Promise.all(u)).flat();
|
|
77
|
-
return
|
|
77
|
+
return $(o, (i) => i.blockNumber, "desc");
|
|
78
78
|
}
|
|
79
79
|
const R = (e) => {
|
|
80
80
|
if (!e)
|
|
@@ -99,20 +99,20 @@ async function Y({
|
|
|
99
99
|
vaultKey: c,
|
|
100
100
|
env: a
|
|
101
101
|
})).map((o) => {
|
|
102
|
-
const i = Object.entries(o.chain_allocation).map(([
|
|
103
|
-
|
|
102
|
+
const i = Object.entries(o.chain_allocation).map(([r, l]) => [
|
|
103
|
+
g[r],
|
|
104
104
|
w(l)
|
|
105
105
|
]).reduce(
|
|
106
|
-
(
|
|
106
|
+
(r, l) => {
|
|
107
107
|
const [d, h] = l;
|
|
108
|
-
return
|
|
108
|
+
return r[d] = h, r;
|
|
109
109
|
},
|
|
110
110
|
{}
|
|
111
|
-
), p = o.real_apy_breakdown.map((
|
|
112
|
-
allocations: w(
|
|
113
|
-
apy: w(
|
|
114
|
-
chainId:
|
|
115
|
-
protocol:
|
|
111
|
+
), p = o.real_apy_breakdown.map((r) => ({
|
|
112
|
+
allocations: w(r.allocation),
|
|
113
|
+
apy: w(r.apy),
|
|
114
|
+
chainId: g[r.chain],
|
|
115
|
+
protocol: r.protocol
|
|
116
116
|
}));
|
|
117
117
|
return {
|
|
118
118
|
apy: w(o.apy),
|
|
@@ -121,7 +121,7 @@ async function Y({
|
|
|
121
121
|
timestamp: new Date(o.timestamp)
|
|
122
122
|
};
|
|
123
123
|
});
|
|
124
|
-
return
|
|
124
|
+
return $(n, (o) => o.timestamp.getTime(), "desc");
|
|
125
125
|
}
|
|
126
126
|
const I = {
|
|
127
127
|
// NOTE: For now only `ethereum` is supported by the API.
|
|
@@ -131,7 +131,7 @@ const I = {
|
|
|
131
131
|
[f.base]: "base",
|
|
132
132
|
[f.binanceSmartChain]: "bnb",
|
|
133
133
|
[f.corn]: "corn"
|
|
134
|
-
},
|
|
134
|
+
}, g = {
|
|
135
135
|
ethereum: f.ethereum,
|
|
136
136
|
base: f.base,
|
|
137
137
|
bnb: f.binanceSmartChain,
|
|
@@ -163,8 +163,8 @@ async function j({
|
|
|
163
163
|
const i = new URLSearchParams({
|
|
164
164
|
aggregation_period: String(e),
|
|
165
165
|
historical: "true"
|
|
166
|
-
}), p = `${o}/sevenseas-api/performance/${n}/${u.vaultContract.address}?${i.toString()}`, { data:
|
|
167
|
-
return R(
|
|
166
|
+
}), p = `${o}/sevenseas-api/performance/${n}/${u.vaultContract.address}?${i.toString()}`, { data: r } = await v.get(p);
|
|
167
|
+
return R(r);
|
|
168
168
|
}
|
|
169
169
|
const B = "https://api.veda.tech/points/user/{account}";
|
|
170
170
|
async function Z({
|
|
@@ -180,9 +180,9 @@ async function Z({
|
|
|
180
180
|
"Content-Type": "application/json"
|
|
181
181
|
}
|
|
182
182
|
}), n = {}, o = Object.entries(u.Response);
|
|
183
|
-
for (const [p,
|
|
183
|
+
for (const [p, r] of o) {
|
|
184
184
|
if (p === "userTotalVedaPointsSum") continue;
|
|
185
|
-
const l = Object.entries(
|
|
185
|
+
const l = Object.entries(r.vaults).find(
|
|
186
186
|
([d]) => d === c.vaultContract.address
|
|
187
187
|
);
|
|
188
188
|
if (l) {
|
|
@@ -217,10 +217,10 @@ async function K({
|
|
|
217
217
|
};
|
|
218
218
|
}
|
|
219
219
|
export {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
220
|
+
Y as getVaultApy,
|
|
221
|
+
S as getVaultDeposits,
|
|
222
|
+
X as getVaultDepositsAllChains,
|
|
223
|
+
Z as getVaultPoints,
|
|
224
|
+
K as getVaultTVL
|
|
225
225
|
};
|
|
226
|
-
//# sourceMappingURL=get-vault-tvl-
|
|
226
|
+
//# sourceMappingURL=get-vault-tvl-Ct_Zkg7C.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-vault-tvl-YAXePAW3.js","sources":["../../src/vaults/lib/ops/get-vault-deposits.ts","../../src/vaults/lib/metrics/get-vault-apy.ts","../../src/vaults/lib/metrics/get-vault-points.ts","../../src/vaults/lib/metrics/get-vault-tvl.ts"],"sourcesContent":["import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address, Hash } from 'viem';\n\nimport { getApiConfig } from '../../../common/api-config';\nimport { ChainId } from '../../../common/chains';\nimport { IEnvParam } from '../../../common/parameters';\nimport {\n fromBaseDenomination,\n getAssetInfo,\n TokenInfo,\n} from '../../../tokens/tokens';\nimport { orderBy, unique } from '../../../utils/array';\nimport { ensureHex } from '../../../utils/hex';\nimport {\n isVedaVaultChain,\n NETWORK_TO_VEDA_VAULT_CHAIN_MAP,\n Vault,\n VAULTS,\n VEDA_VAULT_CHAIN_TO_NETWORK_MAP,\n VedaVaultChain,\n} from '../config';\n\ntype SevenSeasDepositEntry = {\n block_number: number;\n chain: string;\n deposit_amount: number;\n deposit_asset: string;\n share_amount: number;\n tx_hash: string;\n user: string;\n vault_address: string;\n};\n\ntype SevenSeasDepositsPayload =\n | SevenSeasDepositEntry\n | SevenSeasDepositEntry[]\n | { Response: SevenSeasDepositEntry }\n | { Response: SevenSeasDepositEntry[] };\n\nconst normalizeSevenSeasDeposits = (\n payload: SevenSeasDepositsPayload | undefined,\n): SevenSeasDepositEntry[] => {\n if (!payload) {\n return [];\n }\n\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if ('Response' in payload) {\n const response = payload.Response;\n if (Array.isArray(response)) {\n return response;\n }\n if (response) {\n return [response];\n }\n return [];\n }\n\n return [payload];\n};\n\nexport type GetVaultDepositsParameters = IEnvParam & {\n account: Address;\n chainId: ChainId;\n vaultKey?: Vault;\n rpcUrl?: string;\n};\n\nexport type VaultDeposit = {\n /** The transaction hash */\n txHash: Hash;\n /** The transaction's block number */\n blockNumber: number;\n /** The chain id */\n chainId: VedaVaultChain;\n /** The deposited amount */\n amount: BigNumber;\n /** The amount of shares received */\n shareAmount: BigNumber;\n /** The deposit token */\n token?: Omit<TokenInfo, 'abi'>;\n /** The user wallet address that made the deposit */\n toAddress: Address;\n};\n\n/**\n * Retrieves the deposits made by specified address.\n * @param parameters - The parameters.\n * @param parameters.account - The account address.\n * @param parameters.chainId - The chain id.\n * @param parameters.vaultKey - The optional vault identifier.\n * @param parameters.rpcUrl - The optional RPC url.\n *\n * @returns {Promise<VaultDeposit[]>}\n */\nexport async function getVaultDeposits({\n account,\n chainId,\n vaultKey = Vault.Veda,\n rpcUrl,\n env,\n}: GetVaultDepositsParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n if (!isVedaVaultChain(chainId)) {\n throw new Error(\n `Unsupported chain id: ${chainId}. Please switch to one of the supported chains: ${vault.chains.join(', ')}`,\n );\n }\n\n const network = VEDA_VAULT_CHAIN_TO_NETWORK_MAP[chainId];\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n const url = `${bffApiUrl}/sevenseas-api/deposits/${network}/${vault.vaultContract.address}/${account}`;\n\n const { data } = await axios.get<SevenSeasDepositsPayload>(url);\n const entries = normalizeSevenSeasDeposits(data);\n\n const depositAssetsAddresses = unique(\n entries.map(d => ensureHex(d.deposit_asset)),\n );\n\n const depositAssets: Record<Address, Omit<TokenInfo, 'abi'> | undefined> = {};\n for (const asset of depositAssetsAddresses) {\n const assetInfo = await getAssetInfo(asset, chainId, rpcUrl);\n if (assetInfo) {\n depositAssets[asset] = {\n address: assetInfo.address,\n decimals: assetInfo.decimals,\n symbol: assetInfo.symbol,\n };\n } else {\n depositAssets[asset] = undefined;\n }\n }\n\n const deposits = entries.map(d => {\n const token = depositAssets[ensureHex(d.deposit_asset)];\n const amount = fromBaseDenomination(d.deposit_amount, token?.decimals || 0);\n const shareAmount = fromBaseDenomination(d.share_amount, vault.decimals);\n\n const vaultDeposit: VaultDeposit = {\n txHash: ensureHex(d.tx_hash),\n blockNumber: d.block_number,\n chainId: NETWORK_TO_VEDA_VAULT_CHAIN_MAP[d.chain],\n amount,\n shareAmount,\n token,\n toAddress: ensureHex(d.user),\n };\n\n return vaultDeposit;\n });\n\n return orderBy(deposits, d => d.blockNumber, 'desc');\n}\n\nexport type GetVaultDepositsAllChainsParameters = {\n account: Address;\n vaultKey?: Vault;\n rpcUrl?: string;\n};\n\n/**\n * Retrieves the deposits made by specified address across all supported chains for a vault.\n * This is useful for getting a complete view of all deposits regardless of the currently connected chain.\n *\n * @param parameters - The parameters.\n * @param parameters.account - The account address.\n * @param parameters.vaultKey - The optional vault identifier (defaults to Veda).\n * @param parameters.rpcUrl - The optional RPC url.\n *\n * @returns {Promise<VaultDeposit[]>} All deposits across all supported chains, sorted by block number (newest first)\n */\nexport async function getVaultDepositsAllChains({\n account,\n vaultKey = Vault.Veda,\n rpcUrl,\n}: GetVaultDepositsAllChainsParameters): Promise<VaultDeposit[]> {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n // Fetch deposits from all supported chains in parallel\n const depositsPromises = vault.chains.map(chainId =>\n getVaultDeposits({ account, chainId, vaultKey, rpcUrl }).catch(error => {\n console.error(`Failed to fetch deposits for chain ${chainId}:`, error);\n return []; // Return empty array on error to not break the entire query\n }),\n );\n\n const depositsArrays = await Promise.all(depositsPromises);\n\n // Flatten and sort all deposits by block number (newest first)\n const allDeposits = depositsArrays.flat();\n return orderBy(allDeposits, d => d.blockNumber, 'desc');\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\n\nimport { getApiConfig } from '../../../common/api-config';\nimport { ChainId } from '../../../common/chains';\nimport { IEnvParam } from '../../../common/parameters';\nimport { orderBy } from '../../../utils/array';\nimport { isVedaVaultChain, Vault, VAULTS, VedaVaultChain } from '../config';\n\ntype PerformanceEntry = {\n aggregation_period: string;\n apy: number;\n chain_allocation: { [network: string]: number };\n fees: number;\n real_apy_breakdown: {\n allocation: number;\n apy: number;\n /** network */\n chain: string;\n protocol: string;\n }[];\n timestamp: string;\n};\n\ntype PerformancePayload =\n | PerformanceEntry\n | PerformanceEntry[]\n | { Response: PerformanceEntry }\n | { Response: PerformanceEntry[] };\n\nconst normalizeSevenSeasPerformance = (\n payload: PerformancePayload | undefined,\n): PerformanceEntry[] => {\n if (!payload) {\n return [];\n }\n\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if ('Response' in payload) {\n const response = payload.Response;\n if (Array.isArray(response)) {\n return response;\n }\n if (response) {\n return [response];\n }\n return [];\n }\n\n return [payload];\n};\n\nexport type GetVaultApyParameters = IEnvParam & {\n aggregationPeriod?: 7 | 14 | 30;\n chainId?: ChainId;\n vaultKey?: Vault;\n};\n\n/** Gets the trailing APY performance history. */\nexport async function getVaultApy({\n aggregationPeriod = 7,\n chainId = ChainId.ethereum,\n vaultKey = Vault.Veda,\n env,\n}: GetVaultApyParameters) {\n const response = await getVaultPerformance({\n aggregationPeriod,\n chainId,\n vaultKey,\n env,\n });\n\n const apys = response.map(r => {\n const allocations = Object.entries(r.chain_allocation)\n .map(([network, value]) => [\n NETWORK_TO_CHAIN_ID_MAP[network],\n BigNumber(value),\n ])\n .reduce(\n (acc, cur) => {\n const [chainId, value] = cur as [ChainId, BigNumber];\n acc[chainId] = value;\n return acc;\n },\n {} as Partial<Record<ChainId, BigNumber>>,\n );\n\n const breakdown = r.real_apy_breakdown.map(b => ({\n allocations: BigNumber(b.allocation),\n apy: BigNumber(b.apy),\n chainId: NETWORK_TO_CHAIN_ID_MAP[b.chain],\n protocol: b.protocol,\n }));\n\n return {\n apy: BigNumber(r.apy),\n allocations,\n breakdown,\n timestamp: new Date(r.timestamp),\n };\n });\n\n return orderBy(apys, a => a.timestamp.getTime(), 'desc');\n}\n\ntype GetVaultPerformanceParameters = {\n aggregationPeriod?: 7 | 14 | 30;\n chainId: ChainId;\n vaultKey?: Vault;\n} & IEnvParam;\n\nconst CHAIN_ID_TO_NETWORK_MAP: Record<VedaVaultChain, string> = {\n // NOTE: For now only `ethereum` is supported by the API.\n [ChainId.ethereum]: 'ethereum',\n\n // NOTE: The following networks are not supported for now. The API is supposed\n // to return the aggregated data for all vault chains.\n [ChainId.base]: 'base',\n [ChainId.binanceSmartChain]: 'bnb',\n [ChainId.corn]: 'corn',\n};\n\nconst NETWORK_TO_CHAIN_ID_MAP: Record<string, VedaVaultChain> = {\n ethereum: ChainId.ethereum,\n base: ChainId.base,\n bnb: ChainId.binanceSmartChain,\n corn: ChainId.corn,\n};\n\n/**\n * Gets the raw response of the performance apy api for the provided vault.\n */\nasync function getVaultPerformance({\n aggregationPeriod = 7,\n chainId,\n vaultKey = Vault.Veda,\n env,\n}: GetVaultPerformanceParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n if (!isVedaVaultChain(chainId)) {\n throw new Error(\n `Unsupported chain id: ${chainId}. Please switch to one of the supported chains: ${vault.chains.join(', ')}`,\n );\n }\n\n const network = CHAIN_ID_TO_NETWORK_MAP[chainId];\n if (network !== 'ethereum') {\n throw new Error(\n `Unsupported network ${network}. Please switch to 'ethereum'.`,\n );\n }\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const params = new URLSearchParams({\n aggregation_period: String(aggregationPeriod),\n historical: 'true',\n });\n const url = `${bffApiUrl}/sevenseas-api/performance/${network}/${vault.vaultContract.address}?${params.toString()}`;\n\n const { data } = await axios.get<PerformancePayload>(url);\n\n return normalizeSevenSeasPerformance(data);\n}\n","import axios from 'axios';\nimport { Address } from 'viem';\n\nimport { Vault, VAULTS } from '../config';\n\nexport type GetVaultPointsParameters = {\n /** The account address. */\n account: Address;\n /** The optional vault identifier */\n vaultKey?: Vault;\n};\n\nconst POINTS_URL = 'https://api.veda.tech/points/user/{account}';\n\ntype Response = {\n Response: {\n [network: string]: {\n userChainVedaPointsSum: number;\n vaults: {\n [vaultAddress: string]: {\n name: string;\n timestamp: string;\n totalPoints: number;\n };\n };\n };\n };\n};\n\n/**\n * Gets the points earned by specified account in the DeFi vault.\n */\nexport async function getVaultPoints({\n account,\n vaultKey = Vault.Veda,\n}: GetVaultPointsParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const url = POINTS_URL.replace('{account}', account);\n const { data } = await axios.get<Response>(url, {\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Content-Type': 'application/json',\n },\n });\n\n const vedaPointsBreakdown: Record<string, number> = {};\n const entries = Object.entries(data.Response);\n for (const [network, points] of entries) {\n if (network === 'userTotalVedaPointsSum') continue;\n\n const vaultPoints = Object.entries(points.vaults).find(\n ([v]) => v === vault.vaultContract.address,\n );\n if (vaultPoints) {\n const [, data] = vaultPoints;\n const p = Number.isNaN(data.totalPoints) ? 0 : data.totalPoints;\n vedaPointsBreakdown[network] = p;\n }\n }\n\n let totalPoints = 0;\n for (const p of Object.values(vedaPointsBreakdown)) {\n totalPoints += p;\n }\n\n return {\n totalPoints,\n pointsBreakdown: vedaPointsBreakdown,\n };\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { extractChain, PublicClient } from 'viem';\nimport * as chains from 'viem/chains';\n\nimport { makePublicClient } from '../../../clients/public-client';\nimport { getApiConfig } from '../../../common/api-config';\nimport { IEnvParam } from '../../../common/parameters';\nimport { Token } from '../../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenContractInfo,\n retrieveTokenProperties,\n} from '../../../tokens/tokens';\nimport { Vault, VAULTS, VedaVaultChain } from '../config';\n\nexport type GetVaultBtcHolding = {\n vaultKey?: Vault;\n rpcUrls?: Record<VedaVaultChain, string>;\n};\nexport async function getVaultBtcHolding({\n vaultKey = Vault.Veda,\n rpcUrls,\n}: GetVaultBtcHolding) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const clients: Partial<Record<VedaVaultChain, PublicClient>> = {};\n for (const chainId of vault.chains) {\n const publicClient = makePublicClient({\n chainId: chainId,\n rpcUrl: rpcUrls?.[chainId],\n });\n clients[chainId] = publicClient;\n }\n\n const balances = [];\n\n for (const [token, chainIds] of Object.entries(vault.tokens)) {\n for (const chainId of chainIds) {\n const tokenContract = await getTokenContractInfo(token as Token, chainId);\n\n const publicClient = clients[chainId];\n if (!publicClient) continue;\n\n const tokenInfo = await retrieveTokenProperties(\n publicClient,\n tokenContract,\n );\n\n if (!tokenInfo) continue;\n\n const balanceRaw = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'balanceOf',\n args: [vault.vaultContract.address],\n });\n\n const balance = fromBaseDenomination(\n balanceRaw ? String(balanceRaw) : 0,\n tokenInfo.decimals,\n );\n\n const ch = extractChain({ chains: Object.values(chains), id: chainId });\n console.info(`Balance of ${token} on ${ch.name}: ${balance}`);\n\n balances.push(balance);\n }\n }\n\n return BigNumber.sum.apply(null, balances);\n}\n\nexport type GetVaultTVLParameters = {\n vaultKey?: Vault;\n} & IEnvParam;\n\ntype DuneQueryResult = {\n net_btc_balance: number;\n price: number;\n vault_tvl: number;\n};\n\ntype Response = {\n /** The TVL represented in BTC locked in the vault */\n btcBalance: BigNumber;\n /** The BTC price in US dollars */\n btcPrice: BigNumber;\n /** The TVL represented us US dollars */\n tvl: BigNumber;\n};\nexport async function getVaultTVL({\n vaultKey = Vault.Veda,\n env,\n}: GetVaultTVLParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const url = `${bffApiUrl}/dune-api/query/vault-tvl`;\n const { data } = await axios.get<DuneQueryResult>(url);\n\n const response: Response = {\n btcBalance: BigNumber(data.net_btc_balance),\n btcPrice: BigNumber(data.price),\n tvl: BigNumber(data.vault_tvl),\n };\n\n return response;\n}\n"],"names":["normalizeSevenSeasDeposits","payload","response","getVaultDeposits","account","chainId","vaultKey","Vault","rpcUrl","env","vault","VAULTS","isVedaVaultChain","network","VEDA_VAULT_CHAIN_TO_NETWORK_MAP","bffApiUrl","getApiConfig","url","data","axios","entries","depositAssetsAddresses","unique","d","ensureHex","depositAssets","asset","assetInfo","getAssetInfo","deposits","token","amount","fromBaseDenomination","shareAmount","NETWORK_TO_VEDA_VAULT_CHAIN_MAP","orderBy","getVaultDepositsAllChains","depositsPromises","error","allDeposits","normalizeSevenSeasPerformance","getVaultApy","aggregationPeriod","ChainId","apys","getVaultPerformance","r","allocations","value","NETWORK_TO_CHAIN_ID_MAP","BigNumber","acc","cur","breakdown","b","a","CHAIN_ID_TO_NETWORK_MAP","params","POINTS_URL","getVaultPoints","vedaPointsBreakdown","points","vaultPoints","v","p","totalPoints","getVaultTVL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-vault-tvl-Ct_Zkg7C.js","sources":["../../src/vaults/lib/ops/get-vault-deposits.ts","../../src/vaults/lib/metrics/get-vault-apy.ts","../../src/vaults/lib/metrics/get-vault-points.ts","../../src/vaults/lib/metrics/get-vault-tvl.ts"],"sourcesContent":["import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address, Hash } from 'viem';\n\nimport { getApiConfig } from '../../../common/api-config';\nimport { ChainId } from '../../../common/chains';\nimport { IEnvParam } from '../../../common/parameters';\nimport {\n fromBaseDenomination,\n getAssetInfo,\n TokenInfo,\n} from '../../../tokens/tokens';\nimport { orderBy, unique } from '../../../utils/array';\nimport { ensureHex } from '../../../utils/hex';\nimport {\n isVedaVaultChain,\n NETWORK_TO_VEDA_VAULT_CHAIN_MAP,\n Vault,\n VAULTS,\n VEDA_VAULT_CHAIN_TO_NETWORK_MAP,\n VedaVaultChain,\n} from '../config';\n\ntype SevenSeasDepositEntry = {\n block_number: number;\n chain: string;\n deposit_amount: number;\n deposit_asset: string;\n share_amount: number;\n tx_hash: string;\n user: string;\n vault_address: string;\n};\n\ntype SevenSeasDepositsPayload =\n | SevenSeasDepositEntry\n | SevenSeasDepositEntry[]\n | { Response: SevenSeasDepositEntry }\n | { Response: SevenSeasDepositEntry[] };\n\nconst normalizeSevenSeasDeposits = (\n payload: SevenSeasDepositsPayload | undefined,\n): SevenSeasDepositEntry[] => {\n if (!payload) {\n return [];\n }\n\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if ('Response' in payload) {\n const response = payload.Response;\n if (Array.isArray(response)) {\n return response;\n }\n if (response) {\n return [response];\n }\n return [];\n }\n\n return [payload];\n};\n\nexport type GetVaultDepositsParameters = IEnvParam & {\n account: Address;\n chainId: ChainId;\n vaultKey?: Vault;\n rpcUrl?: string;\n};\n\nexport type VaultDeposit = {\n /** The transaction hash */\n txHash: Hash;\n /** The transaction's block number */\n blockNumber: number;\n /** The chain id */\n chainId: VedaVaultChain;\n /** The deposited amount */\n amount: BigNumber;\n /** The amount of shares received */\n shareAmount: BigNumber;\n /** The deposit token */\n token?: Omit<TokenInfo, 'abi'>;\n /** The user wallet address that made the deposit */\n toAddress: Address;\n};\n\n/**\n * Retrieves the deposits made by specified address.\n * @param parameters - The parameters.\n * @param parameters.account - The account address.\n * @param parameters.chainId - The chain id.\n * @param parameters.vaultKey - The optional vault identifier.\n * @param parameters.rpcUrl - The optional RPC url.\n *\n * @returns {Promise<VaultDeposit[]>}\n */\nexport async function getVaultDeposits({\n account,\n chainId,\n vaultKey = Vault.Veda,\n rpcUrl,\n env,\n}: GetVaultDepositsParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n if (!isVedaVaultChain(chainId)) {\n throw new Error(\n `Unsupported chain id: ${chainId}. Please switch to one of the supported chains: ${vault.chains.join(', ')}`,\n );\n }\n\n const network = VEDA_VAULT_CHAIN_TO_NETWORK_MAP[chainId];\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n const url = `${bffApiUrl}/sevenseas-api/deposits/${network}/${vault.vaultContract.address}/${account}`;\n\n const { data } = await axios.get<SevenSeasDepositsPayload>(url);\n const entries = normalizeSevenSeasDeposits(data);\n\n const depositAssetsAddresses = unique(\n entries.map(d => ensureHex(d.deposit_asset)),\n );\n\n const depositAssets: Record<Address, Omit<TokenInfo, 'abi'> | undefined> = {};\n for (const asset of depositAssetsAddresses) {\n const assetInfo = await getAssetInfo(asset, chainId, rpcUrl);\n if (assetInfo) {\n depositAssets[asset] = {\n address: assetInfo.address,\n decimals: assetInfo.decimals,\n symbol: assetInfo.symbol,\n };\n } else {\n depositAssets[asset] = undefined;\n }\n }\n\n const deposits = entries.map(d => {\n const token = depositAssets[ensureHex(d.deposit_asset)];\n const amount = fromBaseDenomination(d.deposit_amount, token?.decimals || 0);\n const shareAmount = fromBaseDenomination(d.share_amount, vault.decimals);\n\n const vaultDeposit: VaultDeposit = {\n txHash: ensureHex(d.tx_hash),\n blockNumber: d.block_number,\n chainId: NETWORK_TO_VEDA_VAULT_CHAIN_MAP[d.chain],\n amount,\n shareAmount,\n token,\n toAddress: ensureHex(d.user),\n };\n\n return vaultDeposit;\n });\n\n return orderBy(deposits, d => d.blockNumber, 'desc');\n}\n\nexport type GetVaultDepositsAllChainsParameters = {\n account: Address;\n vaultKey?: Vault;\n rpcUrl?: string;\n};\n\n/**\n * Retrieves the deposits made by specified address across all supported chains for a vault.\n * This is useful for getting a complete view of all deposits regardless of the currently connected chain.\n *\n * @param parameters - The parameters.\n * @param parameters.account - The account address.\n * @param parameters.vaultKey - The optional vault identifier (defaults to Veda).\n * @param parameters.rpcUrl - The optional RPC url.\n *\n * @returns {Promise<VaultDeposit[]>} All deposits across all supported chains, sorted by block number (newest first)\n */\nexport async function getVaultDepositsAllChains({\n account,\n vaultKey = Vault.Veda,\n rpcUrl,\n}: GetVaultDepositsAllChainsParameters): Promise<VaultDeposit[]> {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n // Fetch deposits from all supported chains in parallel\n const depositsPromises = vault.chains.map(chainId =>\n getVaultDeposits({ account, chainId, vaultKey, rpcUrl }).catch(error => {\n console.error(`Failed to fetch deposits for chain ${chainId}:`, error);\n return []; // Return empty array on error to not break the entire query\n }),\n );\n\n const depositsArrays = await Promise.all(depositsPromises);\n\n // Flatten and sort all deposits by block number (newest first)\n const allDeposits = depositsArrays.flat();\n return orderBy(allDeposits, d => d.blockNumber, 'desc');\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\n\nimport { getApiConfig } from '../../../common/api-config';\nimport { ChainId } from '../../../common/chains';\nimport { IEnvParam } from '../../../common/parameters';\nimport { orderBy } from '../../../utils/array';\nimport { isVedaVaultChain, Vault, VAULTS, VedaVaultChain } from '../config';\n\ntype PerformanceEntry = {\n aggregation_period: string;\n apy: number;\n chain_allocation: { [network: string]: number };\n fees: number;\n real_apy_breakdown: {\n allocation: number;\n apy: number;\n /** network */\n chain: string;\n protocol: string;\n }[];\n timestamp: string;\n};\n\ntype PerformancePayload =\n | PerformanceEntry\n | PerformanceEntry[]\n | { Response: PerformanceEntry }\n | { Response: PerformanceEntry[] };\n\nconst normalizeSevenSeasPerformance = (\n payload: PerformancePayload | undefined,\n): PerformanceEntry[] => {\n if (!payload) {\n return [];\n }\n\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if ('Response' in payload) {\n const response = payload.Response;\n if (Array.isArray(response)) {\n return response;\n }\n if (response) {\n return [response];\n }\n return [];\n }\n\n return [payload];\n};\n\nexport type GetVaultApyParameters = IEnvParam & {\n aggregationPeriod?: 7 | 14 | 30;\n chainId?: ChainId;\n vaultKey?: Vault;\n};\n\n/** Gets the trailing APY performance history. */\nexport async function getVaultApy({\n aggregationPeriod = 7,\n chainId = ChainId.ethereum,\n vaultKey = Vault.Veda,\n env,\n}: GetVaultApyParameters) {\n const response = await getVaultPerformance({\n aggregationPeriod,\n chainId,\n vaultKey,\n env,\n });\n\n const apys = response.map(r => {\n const allocations = Object.entries(r.chain_allocation)\n .map(([network, value]) => [\n NETWORK_TO_CHAIN_ID_MAP[network],\n BigNumber(value),\n ])\n .reduce(\n (acc, cur) => {\n const [chainId, value] = cur as [ChainId, BigNumber];\n acc[chainId] = value;\n return acc;\n },\n {} as Partial<Record<ChainId, BigNumber>>,\n );\n\n const breakdown = r.real_apy_breakdown.map(b => ({\n allocations: BigNumber(b.allocation),\n apy: BigNumber(b.apy),\n chainId: NETWORK_TO_CHAIN_ID_MAP[b.chain],\n protocol: b.protocol,\n }));\n\n return {\n apy: BigNumber(r.apy),\n allocations,\n breakdown,\n timestamp: new Date(r.timestamp),\n };\n });\n\n return orderBy(apys, a => a.timestamp.getTime(), 'desc');\n}\n\ntype GetVaultPerformanceParameters = {\n aggregationPeriod?: 7 | 14 | 30;\n chainId: ChainId;\n vaultKey?: Vault;\n} & IEnvParam;\n\nconst CHAIN_ID_TO_NETWORK_MAP: Record<VedaVaultChain, string> = {\n // NOTE: For now only `ethereum` is supported by the API.\n [ChainId.ethereum]: 'ethereum',\n\n // NOTE: The following networks are not supported for now. The API is supposed\n // to return the aggregated data for all vault chains.\n [ChainId.base]: 'base',\n [ChainId.binanceSmartChain]: 'bnb',\n [ChainId.corn]: 'corn',\n};\n\nconst NETWORK_TO_CHAIN_ID_MAP: Record<string, VedaVaultChain> = {\n ethereum: ChainId.ethereum,\n base: ChainId.base,\n bnb: ChainId.binanceSmartChain,\n corn: ChainId.corn,\n};\n\n/**\n * Gets the raw response of the performance apy api for the provided vault.\n */\nasync function getVaultPerformance({\n aggregationPeriod = 7,\n chainId,\n vaultKey = Vault.Veda,\n env,\n}: GetVaultPerformanceParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n if (!isVedaVaultChain(chainId)) {\n throw new Error(\n `Unsupported chain id: ${chainId}. Please switch to one of the supported chains: ${vault.chains.join(', ')}`,\n );\n }\n\n const network = CHAIN_ID_TO_NETWORK_MAP[chainId];\n if (network !== 'ethereum') {\n throw new Error(\n `Unsupported network ${network}. Please switch to 'ethereum'.`,\n );\n }\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const params = new URLSearchParams({\n aggregation_period: String(aggregationPeriod),\n historical: 'true',\n });\n const url = `${bffApiUrl}/sevenseas-api/performance/${network}/${vault.vaultContract.address}?${params.toString()}`;\n\n const { data } = await axios.get<PerformancePayload>(url);\n\n return normalizeSevenSeasPerformance(data);\n}\n","import axios from 'axios';\nimport { Address } from 'viem';\n\nimport { Vault, VAULTS } from '../config';\n\nexport type GetVaultPointsParameters = {\n /** The account address. */\n account: Address;\n /** The optional vault identifier */\n vaultKey?: Vault;\n};\n\nconst POINTS_URL = 'https://api.veda.tech/points/user/{account}';\n\ntype Response = {\n Response: {\n [network: string]: {\n userChainVedaPointsSum: number;\n vaults: {\n [vaultAddress: string]: {\n name: string;\n timestamp: string;\n totalPoints: number;\n };\n };\n };\n };\n};\n\n/**\n * Gets the points earned by specified account in the DeFi vault.\n */\nexport async function getVaultPoints({\n account,\n vaultKey = Vault.Veda,\n}: GetVaultPointsParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const url = POINTS_URL.replace('{account}', account);\n const { data } = await axios.get<Response>(url, {\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Content-Type': 'application/json',\n },\n });\n\n const vedaPointsBreakdown: Record<string, number> = {};\n const entries = Object.entries(data.Response);\n for (const [network, points] of entries) {\n if (network === 'userTotalVedaPointsSum') continue;\n\n const vaultPoints = Object.entries(points.vaults).find(\n ([v]) => v === vault.vaultContract.address,\n );\n if (vaultPoints) {\n const [, data] = vaultPoints;\n const p = Number.isNaN(data.totalPoints) ? 0 : data.totalPoints;\n vedaPointsBreakdown[network] = p;\n }\n }\n\n let totalPoints = 0;\n for (const p of Object.values(vedaPointsBreakdown)) {\n totalPoints += p;\n }\n\n return {\n totalPoints,\n pointsBreakdown: vedaPointsBreakdown,\n };\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { extractChain, PublicClient } from 'viem';\nimport * as chains from 'viem/chains';\n\nimport { makePublicClient } from '../../../clients/public-client';\nimport { getApiConfig } from '../../../common/api-config';\nimport { IEnvParam } from '../../../common/parameters';\nimport { Token } from '../../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenContractInfo,\n retrieveTokenProperties,\n} from '../../../tokens/tokens';\nimport { Vault, VAULTS, VedaVaultChain } from '../config';\n\nexport type GetVaultBtcHolding = {\n vaultKey?: Vault;\n rpcUrls?: Record<VedaVaultChain, string>;\n};\nexport async function getVaultBtcHolding({\n vaultKey = Vault.Veda,\n rpcUrls,\n}: GetVaultBtcHolding) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const clients: Partial<Record<VedaVaultChain, PublicClient>> = {};\n for (const chainId of vault.chains) {\n const publicClient = makePublicClient({\n chainId: chainId,\n rpcUrl: rpcUrls?.[chainId],\n });\n clients[chainId] = publicClient;\n }\n\n const balances = [];\n\n for (const [token, chainIds] of Object.entries(vault.tokens)) {\n for (const chainId of chainIds) {\n const tokenContract = await getTokenContractInfo(token as Token, chainId);\n\n const publicClient = clients[chainId];\n if (!publicClient) continue;\n\n const tokenInfo = await retrieveTokenProperties(\n publicClient,\n tokenContract,\n );\n\n if (!tokenInfo) continue;\n\n const balanceRaw = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'balanceOf',\n args: [vault.vaultContract.address],\n });\n\n const balance = fromBaseDenomination(\n balanceRaw ? String(balanceRaw) : 0,\n tokenInfo.decimals,\n );\n\n const ch = extractChain({ chains: Object.values(chains), id: chainId });\n console.info(`Balance of ${token} on ${ch.name}: ${balance}`);\n\n balances.push(balance);\n }\n }\n\n return BigNumber.sum.apply(null, balances);\n}\n\nexport type GetVaultTVLParameters = {\n vaultKey?: Vault;\n} & IEnvParam;\n\ntype DuneQueryResult = {\n net_btc_balance: number;\n price: number;\n vault_tvl: number;\n};\n\ntype Response = {\n /** The TVL represented in BTC locked in the vault */\n btcBalance: BigNumber;\n /** The BTC price in US dollars */\n btcPrice: BigNumber;\n /** The TVL represented us US dollars */\n tvl: BigNumber;\n};\nexport async function getVaultTVL({\n vaultKey = Vault.Veda,\n env,\n}: GetVaultTVLParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const url = `${bffApiUrl}/dune-api/query/vault-tvl`;\n const { data } = await axios.get<DuneQueryResult>(url);\n\n const response: Response = {\n btcBalance: BigNumber(data.net_btc_balance),\n btcPrice: BigNumber(data.price),\n tvl: BigNumber(data.vault_tvl),\n };\n\n return response;\n}\n"],"names":["normalizeSevenSeasDeposits","payload","response","getVaultDeposits","account","chainId","vaultKey","Vault","rpcUrl","env","vault","VAULTS","isVedaVaultChain","network","VEDA_VAULT_CHAIN_TO_NETWORK_MAP","bffApiUrl","getApiConfig","url","data","axios","entries","depositAssetsAddresses","unique","d","ensureHex","depositAssets","asset","assetInfo","getAssetInfo","deposits","token","amount","fromBaseDenomination","shareAmount","NETWORK_TO_VEDA_VAULT_CHAIN_MAP","orderBy","getVaultDepositsAllChains","depositsPromises","error","allDeposits","normalizeSevenSeasPerformance","getVaultApy","aggregationPeriod","ChainId","apys","getVaultPerformance","r","allocations","value","NETWORK_TO_CHAIN_ID_MAP","BigNumber","acc","cur","breakdown","b","a","CHAIN_ID_TO_NETWORK_MAP","params","POINTS_URL","getVaultPoints","vedaPointsBreakdown","points","vaultPoints","v","p","totalPoints","getVaultTVL"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const g=require("axios"),C=require("./api-config-DkXqqfCK.cjs"),_=require("./tokens-
|
|
2
|
-
//# sourceMappingURL=get-vault-tvl-
|
|
1
|
+
"use strict";const g=require("axios"),C=require("./api-config-DkXqqfCK.cjs"),_=require("./tokens-BkvA0Gp1.cjs"),b=require("./array-DKG6Pz4i.cjs"),V=require("./time-I-BeyUkG.cjs"),a=require("./config-DmCmanM_.cjs"),w=require("bignumber.js"),m=require("./token-addresses-nzvTOi24.cjs");require("viem");require("viem/chains");const T=t=>{if(!t)return[];if(Array.isArray(t))return t;if("Response"in t){const e=t.Response;return Array.isArray(e)?e:e?[e]:[]}return[t]};async function P({account:t,chainId:e,vaultKey:u=a.Vault.Veda,rpcUrl:i,env:l}){const n=a.VAULTS[u];if(!n)throw new Error(`Unknown vault key: ${u}`);if(!a.isVedaVaultChain(e))throw new Error(`Unsupported chain id: ${e}. Please switch to one of the supported chains: ${n.chains.join(", ")}`);const r=a.VEDA_VAULT_CHAIN_TO_NETWORK_MAP[e],{bffApiUrl:c}=C.getApiConfig(l);if(!c)throw new Error(`Could not determine API endpoint for provided environment: ${l}`);const p=`${c}/sevenseas-api/deposits/${r}/${n.vaultContract.address}/${t}`,{data:s}=await g.get(p),d=T(s),h=b.unique(d.map(o=>V.ensureHex(o.deposit_asset))),A={};for(const o of h){const f=await _.getAssetInfo(o,e,i);f?A[o]={address:f.address,decimals:f.decimals,symbol:f.symbol}:A[o]=void 0}const k=d.map(o=>{const f=A[V.ensureHex(o.deposit_asset)],$=_.fromBaseDenomination(o.deposit_amount,(f==null?void 0:f.decimals)||0),y=_.fromBaseDenomination(o.share_amount,n.decimals);return{txHash:V.ensureHex(o.tx_hash),blockNumber:o.block_number,chainId:a.NETWORK_TO_VEDA_VAULT_CHAIN_MAP[o.chain],amount:$,shareAmount:y,token:f,toAddress:V.ensureHex(o.user)}});return b.orderBy(k,o=>o.blockNumber,"desc")}async function U({account:t,vaultKey:e=a.Vault.Veda,rpcUrl:u}){const i=a.VAULTS[e];if(!i)throw new Error(`Unknown vault key: ${e}`);const l=i.chains.map(c=>P({account:t,chainId:c,vaultKey:e,rpcUrl:u}).catch(p=>(console.error(`Failed to fetch deposits for chain ${c}:`,p),[]))),r=(await Promise.all(l)).flat();return b.orderBy(r,c=>c.blockNumber,"desc")}const I=t=>{if(!t)return[];if(Array.isArray(t))return t;if("Response"in t){const e=t.Response;return Array.isArray(e)?e:e?[e]:[]}return[t]};async function E({aggregationPeriod:t=7,chainId:e=m.ChainId.ethereum,vaultKey:u=a.Vault.Veda,env:i}){const n=(await S({aggregationPeriod:t,chainId:e,vaultKey:u,env:i})).map(r=>{const c=Object.entries(r.chain_allocation).map(([s,d])=>[v[s],w(d)]).reduce((s,d)=>{const[h,A]=d;return s[h]=A,s},{}),p=r.real_apy_breakdown.map(s=>({allocations:w(s.allocation),apy:w(s.apy),chainId:v[s.chain],protocol:s.protocol}));return{apy:w(r.apy),allocations:c,breakdown:p,timestamp:new Date(r.timestamp)}});return b.orderBy(n,r=>r.timestamp.getTime(),"desc")}const N={[m.ChainId.ethereum]:"ethereum",[m.ChainId.base]:"base",[m.ChainId.binanceSmartChain]:"bnb",[m.ChainId.corn]:"corn"},v={ethereum:m.ChainId.ethereum,base:m.ChainId.base,bnb:m.ChainId.binanceSmartChain,corn:m.ChainId.corn};async function S({aggregationPeriod:t=7,chainId:e,vaultKey:u=a.Vault.Veda,env:i}){const l=a.VAULTS[u];if(!l)throw new Error(`Unknown vault key: ${u}`);if(!a.isVedaVaultChain(e))throw new Error(`Unsupported chain id: ${e}. Please switch to one of the supported chains: ${l.chains.join(", ")}`);const n=N[e];if(n!=="ethereum")throw new Error(`Unsupported network ${n}. Please switch to 'ethereum'.`);const{bffApiUrl:r}=C.getApiConfig(i);if(!r)throw new Error(`Could not determine API endpoint for provided environment: ${i}`);const c=new URLSearchParams({aggregation_period:String(t),historical:"true"}),p=`${r}/sevenseas-api/performance/${n}/${l.vaultContract.address}?${c.toString()}`,{data:s}=await g.get(p);return I(s)}const D="https://api.veda.tech/points/user/{account}";async function O({account:t,vaultKey:e=a.Vault.Veda}){const u=a.VAULTS[e];if(!u)throw new Error(`Unknown vault key: ${e}`);const i=D.replace("{account}",t),{data:l}=await g.get(i,{headers:{"Access-Control-Allow-Origin":"*","Content-Type":"application/json"}}),n={},r=Object.entries(l.Response);for(const[p,s]of r){if(p==="userTotalVedaPointsSum")continue;const d=Object.entries(s.vaults).find(([h])=>h===u.vaultContract.address);if(d){const[,h]=d,A=Number.isNaN(h.totalPoints)?0:h.totalPoints;n[p]=A}}let c=0;for(const p of Object.values(n))c+=p;return{totalPoints:c,pointsBreakdown:n}}async function q({vaultKey:t=a.Vault.Veda,env:e}){if(!a.VAULTS[t])throw new Error(`Unknown vault key: ${t}`);const{bffApiUrl:i}=C.getApiConfig(e);if(!i)throw new Error(`Could not determine API endpoint for provided environment: ${e}`);const l=`${i}/dune-api/query/vault-tvl`,{data:n}=await g.get(l);return{btcBalance:w(n.net_btc_balance),btcPrice:w(n.price),tvl:w(n.vault_tvl)}}exports.getVaultApy=E;exports.getVaultDeposits=P;exports.getVaultDepositsAllChains=U;exports.getVaultPoints=O;exports.getVaultTVL=q;
|
|
2
|
+
//# sourceMappingURL=get-vault-tvl-D_tQIDAs.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-vault-tvl-DmTUbOY7.cjs","sources":["../../src/vaults/lib/ops/get-vault-deposits.ts","../../src/vaults/lib/metrics/get-vault-apy.ts","../../src/vaults/lib/metrics/get-vault-points.ts","../../src/vaults/lib/metrics/get-vault-tvl.ts"],"sourcesContent":["import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address, Hash } from 'viem';\n\nimport { getApiConfig } from '../../../common/api-config';\nimport { ChainId } from '../../../common/chains';\nimport { IEnvParam } from '../../../common/parameters';\nimport {\n fromBaseDenomination,\n getAssetInfo,\n TokenInfo,\n} from '../../../tokens/tokens';\nimport { orderBy, unique } from '../../../utils/array';\nimport { ensureHex } from '../../../utils/hex';\nimport {\n isVedaVaultChain,\n NETWORK_TO_VEDA_VAULT_CHAIN_MAP,\n Vault,\n VAULTS,\n VEDA_VAULT_CHAIN_TO_NETWORK_MAP,\n VedaVaultChain,\n} from '../config';\n\ntype SevenSeasDepositEntry = {\n block_number: number;\n chain: string;\n deposit_amount: number;\n deposit_asset: string;\n share_amount: number;\n tx_hash: string;\n user: string;\n vault_address: string;\n};\n\ntype SevenSeasDepositsPayload =\n | SevenSeasDepositEntry\n | SevenSeasDepositEntry[]\n | { Response: SevenSeasDepositEntry }\n | { Response: SevenSeasDepositEntry[] };\n\nconst normalizeSevenSeasDeposits = (\n payload: SevenSeasDepositsPayload | undefined,\n): SevenSeasDepositEntry[] => {\n if (!payload) {\n return [];\n }\n\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if ('Response' in payload) {\n const response = payload.Response;\n if (Array.isArray(response)) {\n return response;\n }\n if (response) {\n return [response];\n }\n return [];\n }\n\n return [payload];\n};\n\nexport type GetVaultDepositsParameters = IEnvParam & {\n account: Address;\n chainId: ChainId;\n vaultKey?: Vault;\n rpcUrl?: string;\n};\n\nexport type VaultDeposit = {\n /** The transaction hash */\n txHash: Hash;\n /** The transaction's block number */\n blockNumber: number;\n /** The chain id */\n chainId: VedaVaultChain;\n /** The deposited amount */\n amount: BigNumber;\n /** The amount of shares received */\n shareAmount: BigNumber;\n /** The deposit token */\n token?: Omit<TokenInfo, 'abi'>;\n /** The user wallet address that made the deposit */\n toAddress: Address;\n};\n\n/**\n * Retrieves the deposits made by specified address.\n * @param parameters - The parameters.\n * @param parameters.account - The account address.\n * @param parameters.chainId - The chain id.\n * @param parameters.vaultKey - The optional vault identifier.\n * @param parameters.rpcUrl - The optional RPC url.\n *\n * @returns {Promise<VaultDeposit[]>}\n */\nexport async function getVaultDeposits({\n account,\n chainId,\n vaultKey = Vault.Veda,\n rpcUrl,\n env,\n}: GetVaultDepositsParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n if (!isVedaVaultChain(chainId)) {\n throw new Error(\n `Unsupported chain id: ${chainId}. Please switch to one of the supported chains: ${vault.chains.join(', ')}`,\n );\n }\n\n const network = VEDA_VAULT_CHAIN_TO_NETWORK_MAP[chainId];\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n const url = `${bffApiUrl}/sevenseas-api/deposits/${network}/${vault.vaultContract.address}/${account}`;\n\n const { data } = await axios.get<SevenSeasDepositsPayload>(url);\n const entries = normalizeSevenSeasDeposits(data);\n\n const depositAssetsAddresses = unique(\n entries.map(d => ensureHex(d.deposit_asset)),\n );\n\n const depositAssets: Record<Address, Omit<TokenInfo, 'abi'> | undefined> = {};\n for (const asset of depositAssetsAddresses) {\n const assetInfo = await getAssetInfo(asset, chainId, rpcUrl);\n if (assetInfo) {\n depositAssets[asset] = {\n address: assetInfo.address,\n decimals: assetInfo.decimals,\n symbol: assetInfo.symbol,\n };\n } else {\n depositAssets[asset] = undefined;\n }\n }\n\n const deposits = entries.map(d => {\n const token = depositAssets[ensureHex(d.deposit_asset)];\n const amount = fromBaseDenomination(d.deposit_amount, token?.decimals || 0);\n const shareAmount = fromBaseDenomination(d.share_amount, vault.decimals);\n\n const vaultDeposit: VaultDeposit = {\n txHash: ensureHex(d.tx_hash),\n blockNumber: d.block_number,\n chainId: NETWORK_TO_VEDA_VAULT_CHAIN_MAP[d.chain],\n amount,\n shareAmount,\n token,\n toAddress: ensureHex(d.user),\n };\n\n return vaultDeposit;\n });\n\n return orderBy(deposits, d => d.blockNumber, 'desc');\n}\n\nexport type GetVaultDepositsAllChainsParameters = {\n account: Address;\n vaultKey?: Vault;\n rpcUrl?: string;\n};\n\n/**\n * Retrieves the deposits made by specified address across all supported chains for a vault.\n * This is useful for getting a complete view of all deposits regardless of the currently connected chain.\n *\n * @param parameters - The parameters.\n * @param parameters.account - The account address.\n * @param parameters.vaultKey - The optional vault identifier (defaults to Veda).\n * @param parameters.rpcUrl - The optional RPC url.\n *\n * @returns {Promise<VaultDeposit[]>} All deposits across all supported chains, sorted by block number (newest first)\n */\nexport async function getVaultDepositsAllChains({\n account,\n vaultKey = Vault.Veda,\n rpcUrl,\n}: GetVaultDepositsAllChainsParameters): Promise<VaultDeposit[]> {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n // Fetch deposits from all supported chains in parallel\n const depositsPromises = vault.chains.map(chainId =>\n getVaultDeposits({ account, chainId, vaultKey, rpcUrl }).catch(error => {\n console.error(`Failed to fetch deposits for chain ${chainId}:`, error);\n return []; // Return empty array on error to not break the entire query\n }),\n );\n\n const depositsArrays = await Promise.all(depositsPromises);\n\n // Flatten and sort all deposits by block number (newest first)\n const allDeposits = depositsArrays.flat();\n return orderBy(allDeposits, d => d.blockNumber, 'desc');\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\n\nimport { getApiConfig } from '../../../common/api-config';\nimport { ChainId } from '../../../common/chains';\nimport { IEnvParam } from '../../../common/parameters';\nimport { orderBy } from '../../../utils/array';\nimport { isVedaVaultChain, Vault, VAULTS, VedaVaultChain } from '../config';\n\ntype PerformanceEntry = {\n aggregation_period: string;\n apy: number;\n chain_allocation: { [network: string]: number };\n fees: number;\n real_apy_breakdown: {\n allocation: number;\n apy: number;\n /** network */\n chain: string;\n protocol: string;\n }[];\n timestamp: string;\n};\n\ntype PerformancePayload =\n | PerformanceEntry\n | PerformanceEntry[]\n | { Response: PerformanceEntry }\n | { Response: PerformanceEntry[] };\n\nconst normalizeSevenSeasPerformance = (\n payload: PerformancePayload | undefined,\n): PerformanceEntry[] => {\n if (!payload) {\n return [];\n }\n\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if ('Response' in payload) {\n const response = payload.Response;\n if (Array.isArray(response)) {\n return response;\n }\n if (response) {\n return [response];\n }\n return [];\n }\n\n return [payload];\n};\n\nexport type GetVaultApyParameters = IEnvParam & {\n aggregationPeriod?: 7 | 14 | 30;\n chainId?: ChainId;\n vaultKey?: Vault;\n};\n\n/** Gets the trailing APY performance history. */\nexport async function getVaultApy({\n aggregationPeriod = 7,\n chainId = ChainId.ethereum,\n vaultKey = Vault.Veda,\n env,\n}: GetVaultApyParameters) {\n const response = await getVaultPerformance({\n aggregationPeriod,\n chainId,\n vaultKey,\n env,\n });\n\n const apys = response.map(r => {\n const allocations = Object.entries(r.chain_allocation)\n .map(([network, value]) => [\n NETWORK_TO_CHAIN_ID_MAP[network],\n BigNumber(value),\n ])\n .reduce(\n (acc, cur) => {\n const [chainId, value] = cur as [ChainId, BigNumber];\n acc[chainId] = value;\n return acc;\n },\n {} as Partial<Record<ChainId, BigNumber>>,\n );\n\n const breakdown = r.real_apy_breakdown.map(b => ({\n allocations: BigNumber(b.allocation),\n apy: BigNumber(b.apy),\n chainId: NETWORK_TO_CHAIN_ID_MAP[b.chain],\n protocol: b.protocol,\n }));\n\n return {\n apy: BigNumber(r.apy),\n allocations,\n breakdown,\n timestamp: new Date(r.timestamp),\n };\n });\n\n return orderBy(apys, a => a.timestamp.getTime(), 'desc');\n}\n\ntype GetVaultPerformanceParameters = {\n aggregationPeriod?: 7 | 14 | 30;\n chainId: ChainId;\n vaultKey?: Vault;\n} & IEnvParam;\n\nconst CHAIN_ID_TO_NETWORK_MAP: Record<VedaVaultChain, string> = {\n // NOTE: For now only `ethereum` is supported by the API.\n [ChainId.ethereum]: 'ethereum',\n\n // NOTE: The following networks are not supported for now. The API is supposed\n // to return the aggregated data for all vault chains.\n [ChainId.base]: 'base',\n [ChainId.binanceSmartChain]: 'bnb',\n [ChainId.corn]: 'corn',\n};\n\nconst NETWORK_TO_CHAIN_ID_MAP: Record<string, VedaVaultChain> = {\n ethereum: ChainId.ethereum,\n base: ChainId.base,\n bnb: ChainId.binanceSmartChain,\n corn: ChainId.corn,\n};\n\n/**\n * Gets the raw response of the performance apy api for the provided vault.\n */\nasync function getVaultPerformance({\n aggregationPeriod = 7,\n chainId,\n vaultKey = Vault.Veda,\n env,\n}: GetVaultPerformanceParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n if (!isVedaVaultChain(chainId)) {\n throw new Error(\n `Unsupported chain id: ${chainId}. Please switch to one of the supported chains: ${vault.chains.join(', ')}`,\n );\n }\n\n const network = CHAIN_ID_TO_NETWORK_MAP[chainId];\n if (network !== 'ethereum') {\n throw new Error(\n `Unsupported network ${network}. Please switch to 'ethereum'.`,\n );\n }\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const params = new URLSearchParams({\n aggregation_period: String(aggregationPeriod),\n historical: 'true',\n });\n const url = `${bffApiUrl}/sevenseas-api/performance/${network}/${vault.vaultContract.address}?${params.toString()}`;\n\n const { data } = await axios.get<PerformancePayload>(url);\n\n return normalizeSevenSeasPerformance(data);\n}\n","import axios from 'axios';\nimport { Address } from 'viem';\n\nimport { Vault, VAULTS } from '../config';\n\nexport type GetVaultPointsParameters = {\n /** The account address. */\n account: Address;\n /** The optional vault identifier */\n vaultKey?: Vault;\n};\n\nconst POINTS_URL = 'https://api.veda.tech/points/user/{account}';\n\ntype Response = {\n Response: {\n [network: string]: {\n userChainVedaPointsSum: number;\n vaults: {\n [vaultAddress: string]: {\n name: string;\n timestamp: string;\n totalPoints: number;\n };\n };\n };\n };\n};\n\n/**\n * Gets the points earned by specified account in the DeFi vault.\n */\nexport async function getVaultPoints({\n account,\n vaultKey = Vault.Veda,\n}: GetVaultPointsParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const url = POINTS_URL.replace('{account}', account);\n const { data } = await axios.get<Response>(url, {\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Content-Type': 'application/json',\n },\n });\n\n const vedaPointsBreakdown: Record<string, number> = {};\n const entries = Object.entries(data.Response);\n for (const [network, points] of entries) {\n if (network === 'userTotalVedaPointsSum') continue;\n\n const vaultPoints = Object.entries(points.vaults).find(\n ([v]) => v === vault.vaultContract.address,\n );\n if (vaultPoints) {\n const [, data] = vaultPoints;\n const p = Number.isNaN(data.totalPoints) ? 0 : data.totalPoints;\n vedaPointsBreakdown[network] = p;\n }\n }\n\n let totalPoints = 0;\n for (const p of Object.values(vedaPointsBreakdown)) {\n totalPoints += p;\n }\n\n return {\n totalPoints,\n pointsBreakdown: vedaPointsBreakdown,\n };\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { extractChain, PublicClient } from 'viem';\nimport * as chains from 'viem/chains';\n\nimport { makePublicClient } from '../../../clients/public-client';\nimport { getApiConfig } from '../../../common/api-config';\nimport { IEnvParam } from '../../../common/parameters';\nimport { Token } from '../../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenContractInfo,\n retrieveTokenProperties,\n} from '../../../tokens/tokens';\nimport { Vault, VAULTS, VedaVaultChain } from '../config';\n\nexport type GetVaultBtcHolding = {\n vaultKey?: Vault;\n rpcUrls?: Record<VedaVaultChain, string>;\n};\nexport async function getVaultBtcHolding({\n vaultKey = Vault.Veda,\n rpcUrls,\n}: GetVaultBtcHolding) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const clients: Partial<Record<VedaVaultChain, PublicClient>> = {};\n for (const chainId of vault.chains) {\n const publicClient = makePublicClient({\n chainId: chainId,\n rpcUrl: rpcUrls?.[chainId],\n });\n clients[chainId] = publicClient;\n }\n\n const balances = [];\n\n for (const [token, chainIds] of Object.entries(vault.tokens)) {\n for (const chainId of chainIds) {\n const tokenContract = await getTokenContractInfo(token as Token, chainId);\n\n const publicClient = clients[chainId];\n if (!publicClient) continue;\n\n const tokenInfo = await retrieveTokenProperties(\n publicClient,\n tokenContract,\n );\n\n if (!tokenInfo) continue;\n\n const balanceRaw = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'balanceOf',\n args: [vault.vaultContract.address],\n });\n\n const balance = fromBaseDenomination(\n balanceRaw ? String(balanceRaw) : 0,\n tokenInfo.decimals,\n );\n\n const ch = extractChain({ chains: Object.values(chains), id: chainId });\n console.info(`Balance of ${token} on ${ch.name}: ${balance}`);\n\n balances.push(balance);\n }\n }\n\n return BigNumber.sum.apply(null, balances);\n}\n\nexport type GetVaultTVLParameters = {\n vaultKey?: Vault;\n} & IEnvParam;\n\ntype DuneQueryResult = {\n net_btc_balance: number;\n price: number;\n vault_tvl: number;\n};\n\ntype Response = {\n /** The TVL represented in BTC locked in the vault */\n btcBalance: BigNumber;\n /** The BTC price in US dollars */\n btcPrice: BigNumber;\n /** The TVL represented us US dollars */\n tvl: BigNumber;\n};\nexport async function getVaultTVL({\n vaultKey = Vault.Veda,\n env,\n}: GetVaultTVLParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const url = `${bffApiUrl}/dune-api/query/vault-tvl`;\n const { data } = await axios.get<DuneQueryResult>(url);\n\n const response: Response = {\n btcBalance: BigNumber(data.net_btc_balance),\n btcPrice: BigNumber(data.price),\n tvl: BigNumber(data.vault_tvl),\n };\n\n return response;\n}\n"],"names":["normalizeSevenSeasDeposits","payload","response","getVaultDeposits","account","chainId","vaultKey","Vault","rpcUrl","env","vault","VAULTS","isVedaVaultChain","network","VEDA_VAULT_CHAIN_TO_NETWORK_MAP","bffApiUrl","getApiConfig","url","data","axios","entries","depositAssetsAddresses","unique","d","ensureHex","depositAssets","asset","assetInfo","getAssetInfo","deposits","token","amount","fromBaseDenomination","shareAmount","NETWORK_TO_VEDA_VAULT_CHAIN_MAP","orderBy","getVaultDepositsAllChains","depositsPromises","error","allDeposits","normalizeSevenSeasPerformance","getVaultApy","aggregationPeriod","ChainId","apys","getVaultPerformance","allocations","value","NETWORK_TO_CHAIN_ID_MAP","BigNumber","acc","cur","breakdown","b","a","CHAIN_ID_TO_NETWORK_MAP","params","POINTS_URL","getVaultPoints","vedaPointsBreakdown","points","vaultPoints","v","p","totalPoints","getVaultTVL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-vault-tvl-D_tQIDAs.cjs","sources":["../../src/vaults/lib/ops/get-vault-deposits.ts","../../src/vaults/lib/metrics/get-vault-apy.ts","../../src/vaults/lib/metrics/get-vault-points.ts","../../src/vaults/lib/metrics/get-vault-tvl.ts"],"sourcesContent":["import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { Address, Hash } from 'viem';\n\nimport { getApiConfig } from '../../../common/api-config';\nimport { ChainId } from '../../../common/chains';\nimport { IEnvParam } from '../../../common/parameters';\nimport {\n fromBaseDenomination,\n getAssetInfo,\n TokenInfo,\n} from '../../../tokens/tokens';\nimport { orderBy, unique } from '../../../utils/array';\nimport { ensureHex } from '../../../utils/hex';\nimport {\n isVedaVaultChain,\n NETWORK_TO_VEDA_VAULT_CHAIN_MAP,\n Vault,\n VAULTS,\n VEDA_VAULT_CHAIN_TO_NETWORK_MAP,\n VedaVaultChain,\n} from '../config';\n\ntype SevenSeasDepositEntry = {\n block_number: number;\n chain: string;\n deposit_amount: number;\n deposit_asset: string;\n share_amount: number;\n tx_hash: string;\n user: string;\n vault_address: string;\n};\n\ntype SevenSeasDepositsPayload =\n | SevenSeasDepositEntry\n | SevenSeasDepositEntry[]\n | { Response: SevenSeasDepositEntry }\n | { Response: SevenSeasDepositEntry[] };\n\nconst normalizeSevenSeasDeposits = (\n payload: SevenSeasDepositsPayload | undefined,\n): SevenSeasDepositEntry[] => {\n if (!payload) {\n return [];\n }\n\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if ('Response' in payload) {\n const response = payload.Response;\n if (Array.isArray(response)) {\n return response;\n }\n if (response) {\n return [response];\n }\n return [];\n }\n\n return [payload];\n};\n\nexport type GetVaultDepositsParameters = IEnvParam & {\n account: Address;\n chainId: ChainId;\n vaultKey?: Vault;\n rpcUrl?: string;\n};\n\nexport type VaultDeposit = {\n /** The transaction hash */\n txHash: Hash;\n /** The transaction's block number */\n blockNumber: number;\n /** The chain id */\n chainId: VedaVaultChain;\n /** The deposited amount */\n amount: BigNumber;\n /** The amount of shares received */\n shareAmount: BigNumber;\n /** The deposit token */\n token?: Omit<TokenInfo, 'abi'>;\n /** The user wallet address that made the deposit */\n toAddress: Address;\n};\n\n/**\n * Retrieves the deposits made by specified address.\n * @param parameters - The parameters.\n * @param parameters.account - The account address.\n * @param parameters.chainId - The chain id.\n * @param parameters.vaultKey - The optional vault identifier.\n * @param parameters.rpcUrl - The optional RPC url.\n *\n * @returns {Promise<VaultDeposit[]>}\n */\nexport async function getVaultDeposits({\n account,\n chainId,\n vaultKey = Vault.Veda,\n rpcUrl,\n env,\n}: GetVaultDepositsParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n if (!isVedaVaultChain(chainId)) {\n throw new Error(\n `Unsupported chain id: ${chainId}. Please switch to one of the supported chains: ${vault.chains.join(', ')}`,\n );\n }\n\n const network = VEDA_VAULT_CHAIN_TO_NETWORK_MAP[chainId];\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n const url = `${bffApiUrl}/sevenseas-api/deposits/${network}/${vault.vaultContract.address}/${account}`;\n\n const { data } = await axios.get<SevenSeasDepositsPayload>(url);\n const entries = normalizeSevenSeasDeposits(data);\n\n const depositAssetsAddresses = unique(\n entries.map(d => ensureHex(d.deposit_asset)),\n );\n\n const depositAssets: Record<Address, Omit<TokenInfo, 'abi'> | undefined> = {};\n for (const asset of depositAssetsAddresses) {\n const assetInfo = await getAssetInfo(asset, chainId, rpcUrl);\n if (assetInfo) {\n depositAssets[asset] = {\n address: assetInfo.address,\n decimals: assetInfo.decimals,\n symbol: assetInfo.symbol,\n };\n } else {\n depositAssets[asset] = undefined;\n }\n }\n\n const deposits = entries.map(d => {\n const token = depositAssets[ensureHex(d.deposit_asset)];\n const amount = fromBaseDenomination(d.deposit_amount, token?.decimals || 0);\n const shareAmount = fromBaseDenomination(d.share_amount, vault.decimals);\n\n const vaultDeposit: VaultDeposit = {\n txHash: ensureHex(d.tx_hash),\n blockNumber: d.block_number,\n chainId: NETWORK_TO_VEDA_VAULT_CHAIN_MAP[d.chain],\n amount,\n shareAmount,\n token,\n toAddress: ensureHex(d.user),\n };\n\n return vaultDeposit;\n });\n\n return orderBy(deposits, d => d.blockNumber, 'desc');\n}\n\nexport type GetVaultDepositsAllChainsParameters = {\n account: Address;\n vaultKey?: Vault;\n rpcUrl?: string;\n};\n\n/**\n * Retrieves the deposits made by specified address across all supported chains for a vault.\n * This is useful for getting a complete view of all deposits regardless of the currently connected chain.\n *\n * @param parameters - The parameters.\n * @param parameters.account - The account address.\n * @param parameters.vaultKey - The optional vault identifier (defaults to Veda).\n * @param parameters.rpcUrl - The optional RPC url.\n *\n * @returns {Promise<VaultDeposit[]>} All deposits across all supported chains, sorted by block number (newest first)\n */\nexport async function getVaultDepositsAllChains({\n account,\n vaultKey = Vault.Veda,\n rpcUrl,\n}: GetVaultDepositsAllChainsParameters): Promise<VaultDeposit[]> {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n // Fetch deposits from all supported chains in parallel\n const depositsPromises = vault.chains.map(chainId =>\n getVaultDeposits({ account, chainId, vaultKey, rpcUrl }).catch(error => {\n console.error(`Failed to fetch deposits for chain ${chainId}:`, error);\n return []; // Return empty array on error to not break the entire query\n }),\n );\n\n const depositsArrays = await Promise.all(depositsPromises);\n\n // Flatten and sort all deposits by block number (newest first)\n const allDeposits = depositsArrays.flat();\n return orderBy(allDeposits, d => d.blockNumber, 'desc');\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\n\nimport { getApiConfig } from '../../../common/api-config';\nimport { ChainId } from '../../../common/chains';\nimport { IEnvParam } from '../../../common/parameters';\nimport { orderBy } from '../../../utils/array';\nimport { isVedaVaultChain, Vault, VAULTS, VedaVaultChain } from '../config';\n\ntype PerformanceEntry = {\n aggregation_period: string;\n apy: number;\n chain_allocation: { [network: string]: number };\n fees: number;\n real_apy_breakdown: {\n allocation: number;\n apy: number;\n /** network */\n chain: string;\n protocol: string;\n }[];\n timestamp: string;\n};\n\ntype PerformancePayload =\n | PerformanceEntry\n | PerformanceEntry[]\n | { Response: PerformanceEntry }\n | { Response: PerformanceEntry[] };\n\nconst normalizeSevenSeasPerformance = (\n payload: PerformancePayload | undefined,\n): PerformanceEntry[] => {\n if (!payload) {\n return [];\n }\n\n if (Array.isArray(payload)) {\n return payload;\n }\n\n if ('Response' in payload) {\n const response = payload.Response;\n if (Array.isArray(response)) {\n return response;\n }\n if (response) {\n return [response];\n }\n return [];\n }\n\n return [payload];\n};\n\nexport type GetVaultApyParameters = IEnvParam & {\n aggregationPeriod?: 7 | 14 | 30;\n chainId?: ChainId;\n vaultKey?: Vault;\n};\n\n/** Gets the trailing APY performance history. */\nexport async function getVaultApy({\n aggregationPeriod = 7,\n chainId = ChainId.ethereum,\n vaultKey = Vault.Veda,\n env,\n}: GetVaultApyParameters) {\n const response = await getVaultPerformance({\n aggregationPeriod,\n chainId,\n vaultKey,\n env,\n });\n\n const apys = response.map(r => {\n const allocations = Object.entries(r.chain_allocation)\n .map(([network, value]) => [\n NETWORK_TO_CHAIN_ID_MAP[network],\n BigNumber(value),\n ])\n .reduce(\n (acc, cur) => {\n const [chainId, value] = cur as [ChainId, BigNumber];\n acc[chainId] = value;\n return acc;\n },\n {} as Partial<Record<ChainId, BigNumber>>,\n );\n\n const breakdown = r.real_apy_breakdown.map(b => ({\n allocations: BigNumber(b.allocation),\n apy: BigNumber(b.apy),\n chainId: NETWORK_TO_CHAIN_ID_MAP[b.chain],\n protocol: b.protocol,\n }));\n\n return {\n apy: BigNumber(r.apy),\n allocations,\n breakdown,\n timestamp: new Date(r.timestamp),\n };\n });\n\n return orderBy(apys, a => a.timestamp.getTime(), 'desc');\n}\n\ntype GetVaultPerformanceParameters = {\n aggregationPeriod?: 7 | 14 | 30;\n chainId: ChainId;\n vaultKey?: Vault;\n} & IEnvParam;\n\nconst CHAIN_ID_TO_NETWORK_MAP: Record<VedaVaultChain, string> = {\n // NOTE: For now only `ethereum` is supported by the API.\n [ChainId.ethereum]: 'ethereum',\n\n // NOTE: The following networks are not supported for now. The API is supposed\n // to return the aggregated data for all vault chains.\n [ChainId.base]: 'base',\n [ChainId.binanceSmartChain]: 'bnb',\n [ChainId.corn]: 'corn',\n};\n\nconst NETWORK_TO_CHAIN_ID_MAP: Record<string, VedaVaultChain> = {\n ethereum: ChainId.ethereum,\n base: ChainId.base,\n bnb: ChainId.binanceSmartChain,\n corn: ChainId.corn,\n};\n\n/**\n * Gets the raw response of the performance apy api for the provided vault.\n */\nasync function getVaultPerformance({\n aggregationPeriod = 7,\n chainId,\n vaultKey = Vault.Veda,\n env,\n}: GetVaultPerformanceParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n if (!isVedaVaultChain(chainId)) {\n throw new Error(\n `Unsupported chain id: ${chainId}. Please switch to one of the supported chains: ${vault.chains.join(', ')}`,\n );\n }\n\n const network = CHAIN_ID_TO_NETWORK_MAP[chainId];\n if (network !== 'ethereum') {\n throw new Error(\n `Unsupported network ${network}. Please switch to 'ethereum'.`,\n );\n }\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const params = new URLSearchParams({\n aggregation_period: String(aggregationPeriod),\n historical: 'true',\n });\n const url = `${bffApiUrl}/sevenseas-api/performance/${network}/${vault.vaultContract.address}?${params.toString()}`;\n\n const { data } = await axios.get<PerformancePayload>(url);\n\n return normalizeSevenSeasPerformance(data);\n}\n","import axios from 'axios';\nimport { Address } from 'viem';\n\nimport { Vault, VAULTS } from '../config';\n\nexport type GetVaultPointsParameters = {\n /** The account address. */\n account: Address;\n /** The optional vault identifier */\n vaultKey?: Vault;\n};\n\nconst POINTS_URL = 'https://api.veda.tech/points/user/{account}';\n\ntype Response = {\n Response: {\n [network: string]: {\n userChainVedaPointsSum: number;\n vaults: {\n [vaultAddress: string]: {\n name: string;\n timestamp: string;\n totalPoints: number;\n };\n };\n };\n };\n};\n\n/**\n * Gets the points earned by specified account in the DeFi vault.\n */\nexport async function getVaultPoints({\n account,\n vaultKey = Vault.Veda,\n}: GetVaultPointsParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const url = POINTS_URL.replace('{account}', account);\n const { data } = await axios.get<Response>(url, {\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Content-Type': 'application/json',\n },\n });\n\n const vedaPointsBreakdown: Record<string, number> = {};\n const entries = Object.entries(data.Response);\n for (const [network, points] of entries) {\n if (network === 'userTotalVedaPointsSum') continue;\n\n const vaultPoints = Object.entries(points.vaults).find(\n ([v]) => v === vault.vaultContract.address,\n );\n if (vaultPoints) {\n const [, data] = vaultPoints;\n const p = Number.isNaN(data.totalPoints) ? 0 : data.totalPoints;\n vedaPointsBreakdown[network] = p;\n }\n }\n\n let totalPoints = 0;\n for (const p of Object.values(vedaPointsBreakdown)) {\n totalPoints += p;\n }\n\n return {\n totalPoints,\n pointsBreakdown: vedaPointsBreakdown,\n };\n}\n","import axios from 'axios';\nimport BigNumber from 'bignumber.js';\nimport { extractChain, PublicClient } from 'viem';\nimport * as chains from 'viem/chains';\n\nimport { makePublicClient } from '../../../clients/public-client';\nimport { getApiConfig } from '../../../common/api-config';\nimport { IEnvParam } from '../../../common/parameters';\nimport { Token } from '../../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenContractInfo,\n retrieveTokenProperties,\n} from '../../../tokens/tokens';\nimport { Vault, VAULTS, VedaVaultChain } from '../config';\n\nexport type GetVaultBtcHolding = {\n vaultKey?: Vault;\n rpcUrls?: Record<VedaVaultChain, string>;\n};\nexport async function getVaultBtcHolding({\n vaultKey = Vault.Veda,\n rpcUrls,\n}: GetVaultBtcHolding) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const clients: Partial<Record<VedaVaultChain, PublicClient>> = {};\n for (const chainId of vault.chains) {\n const publicClient = makePublicClient({\n chainId: chainId,\n rpcUrl: rpcUrls?.[chainId],\n });\n clients[chainId] = publicClient;\n }\n\n const balances = [];\n\n for (const [token, chainIds] of Object.entries(vault.tokens)) {\n for (const chainId of chainIds) {\n const tokenContract = await getTokenContractInfo(token as Token, chainId);\n\n const publicClient = clients[chainId];\n if (!publicClient) continue;\n\n const tokenInfo = await retrieveTokenProperties(\n publicClient,\n tokenContract,\n );\n\n if (!tokenInfo) continue;\n\n const balanceRaw = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'balanceOf',\n args: [vault.vaultContract.address],\n });\n\n const balance = fromBaseDenomination(\n balanceRaw ? String(balanceRaw) : 0,\n tokenInfo.decimals,\n );\n\n const ch = extractChain({ chains: Object.values(chains), id: chainId });\n console.info(`Balance of ${token} on ${ch.name}: ${balance}`);\n\n balances.push(balance);\n }\n }\n\n return BigNumber.sum.apply(null, balances);\n}\n\nexport type GetVaultTVLParameters = {\n vaultKey?: Vault;\n} & IEnvParam;\n\ntype DuneQueryResult = {\n net_btc_balance: number;\n price: number;\n vault_tvl: number;\n};\n\ntype Response = {\n /** The TVL represented in BTC locked in the vault */\n btcBalance: BigNumber;\n /** The BTC price in US dollars */\n btcPrice: BigNumber;\n /** The TVL represented us US dollars */\n tvl: BigNumber;\n};\nexport async function getVaultTVL({\n vaultKey = Vault.Veda,\n env,\n}: GetVaultTVLParameters) {\n const vault = VAULTS[vaultKey];\n if (!vault) {\n throw new Error(`Unknown vault key: ${vaultKey}`);\n }\n\n const { bffApiUrl } = getApiConfig(env);\n if (!bffApiUrl) {\n throw new Error(\n `Could not determine API endpoint for provided environment: ${env}`,\n );\n }\n\n const url = `${bffApiUrl}/dune-api/query/vault-tvl`;\n const { data } = await axios.get<DuneQueryResult>(url);\n\n const response: Response = {\n btcBalance: BigNumber(data.net_btc_balance),\n btcPrice: BigNumber(data.price),\n tvl: BigNumber(data.vault_tvl),\n };\n\n return response;\n}\n"],"names":["normalizeSevenSeasDeposits","payload","response","getVaultDeposits","account","chainId","vaultKey","Vault","rpcUrl","env","vault","VAULTS","isVedaVaultChain","network","VEDA_VAULT_CHAIN_TO_NETWORK_MAP","bffApiUrl","getApiConfig","url","data","axios","entries","depositAssetsAddresses","unique","d","ensureHex","depositAssets","asset","assetInfo","getAssetInfo","deposits","token","amount","fromBaseDenomination","shareAmount","NETWORK_TO_VEDA_VAULT_CHAIN_MAP","orderBy","getVaultDepositsAllChains","depositsPromises","error","allDeposits","normalizeSevenSeasPerformance","getVaultApy","aggregationPeriod","ChainId","apys","getVaultPerformance","allocations","value","NETWORK_TO_CHAIN_ID_MAP","BigNumber","acc","cur","breakdown","b","a","CHAIN_ID_TO_NETWORK_MAP","params","POINTS_URL","getVaultPoints","vedaPointsBreakdown","points","vaultPoints","v","p","totalPoints","getVaultTVL"],"mappings":"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"}
|