upshift-finance 1.0.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/LICENSE +21 -0
- package/README.md +349 -0
- package/lib/abis/AddressResolver.d.ts +28 -0
- package/lib/abis/AddressResolver.js +23 -0
- package/lib/abis/ChainlinkV3.d.ts +87 -0
- package/lib/abis/ChainlinkV3.js +117 -0
- package/lib/abis/ERC20.d.ts +168 -0
- package/lib/abis/ERC20.js +226 -0
- package/lib/abis/ERC20_Bytes32.d.ts +139 -0
- package/lib/abis/ERC20_Bytes32.js +196 -0
- package/lib/abis/ERC4626.d.ts +364 -0
- package/lib/abis/ERC4626.js +507 -0
- package/lib/abis/ERC721.d.ts +231 -0
- package/lib/abis/ERC721.js +321 -0
- package/lib/abis/FeeOracle.d.ts +120 -0
- package/lib/abis/FeeOracle.js +162 -0
- package/lib/abis/LendingPool.d.ts +1393 -0
- package/lib/abis/LendingPool.js +1807 -0
- package/lib/abis/LendingPoolV2.d.ts +1413 -0
- package/lib/abis/LendingPoolV2.js +1833 -0
- package/lib/abis/LendingPoolV3.d.ts +1677 -0
- package/lib/abis/LendingPoolV3.js +1160 -0
- package/lib/abis/Loan.d.ts +837 -0
- package/lib/abis/Loan.js +1080 -0
- package/lib/abis/MultiAssetNativeDepositWrapper.d.ts +137 -0
- package/lib/abis/MultiAssetNativeDepositWrapper.js +125 -0
- package/lib/abis/Multicall3.d.ts +30 -0
- package/lib/abis/Multicall3.js +97 -0
- package/lib/abis/OFT.d.ts +116 -0
- package/lib/abis/OFT.js +85 -0
- package/lib/abis/PoolAdapter.d.ts +36 -0
- package/lib/abis/PoolAdapter.js +51 -0
- package/lib/abis/RewardDistributor.d.ts +267 -0
- package/lib/abis/RewardDistributor.js +352 -0
- package/lib/abis/RwaRedeemSubaccount.d.ts +747 -0
- package/lib/abis/RwaRedeemSubaccount.js +548 -0
- package/lib/abis/SmartAccount.d.ts +17 -0
- package/lib/abis/SmartAccount.js +19 -0
- package/lib/abis/SwapRouter.d.ts +1043 -0
- package/lib/abis/SwapRouter.js +740 -0
- package/lib/abis/TextResolver.d.ts +16 -0
- package/lib/abis/TextResolver.js +16 -0
- package/lib/abis/TokenizedVaultV2.d.ts +1364 -0
- package/lib/abis/TokenizedVaultV2.js +1041 -0
- package/lib/abis/TokenizedVaultV2DepositWithPermit.d.ts +1456 -0
- package/lib/abis/TokenizedVaultV2DepositWithPermit.js +1878 -0
- package/lib/abis/TokenizedVaultV2Receipt.d.ts +1568 -0
- package/lib/abis/TokenizedVaultV2Receipt.js +1061 -0
- package/lib/abis/TokenizedVaultV2SenderAllocationWhitelist.d.ts +454 -0
- package/lib/abis/TokenizedVaultV2SenderAllocationWhitelist.js +327 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAllocation.d.ts +1466 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAllocation.js +1092 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAssets.d.ts +274 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAssets.js +167 -0
- package/lib/abis/UniversalResolverResolve.d.ts +69 -0
- package/lib/abis/UniversalResolverResolve.js +35 -0
- package/lib/abis/UniversalSignatureValidator.d.ts +17 -0
- package/lib/abis/UniversalSignatureValidator.js +30 -0
- package/lib/abis/WrapperAdapter.d.ts +71 -0
- package/lib/abis/WrapperAdapter.js +77 -0
- package/lib/abis/index.d.ts +34 -0
- package/lib/abis/index.js +51 -0
- package/lib/adapters/evm/getters.d.ts +19 -0
- package/lib/adapters/evm/getters.js +209 -0
- package/lib/adapters/evm/index.d.ts +353 -0
- package/lib/adapters/evm/index.js +434 -0
- package/lib/adapters/evm/utils.d.ts +8 -0
- package/lib/adapters/evm/utils.js +51 -0
- package/lib/adapters/solana/constants.d.ts +33 -0
- package/lib/adapters/solana/constants.js +52 -0
- package/lib/adapters/solana/getters.d.ts +11 -0
- package/lib/adapters/solana/getters.js +165 -0
- package/lib/adapters/solana/idl/vault-idl.d.ts +272 -0
- package/lib/adapters/solana/idl/vault-idl.js +1084 -0
- package/lib/adapters/solana/index.d.ts +233 -0
- package/lib/adapters/solana/index.js +291 -0
- package/lib/adapters/solana/types.d.ts +67 -0
- package/lib/adapters/solana/types.js +3 -0
- package/lib/adapters/solana/utils.d.ts +141 -0
- package/lib/adapters/solana/utils.js +595 -0
- package/lib/adapters/solana/vault.actions.d.ts +57 -0
- package/lib/adapters/solana/vault.actions.js +379 -0
- package/lib/adapters/stellar/actions.d.ts +28 -0
- package/lib/adapters/stellar/actions.js +77 -0
- package/lib/adapters/stellar/constants.d.ts +43 -0
- package/lib/adapters/stellar/constants.js +53 -0
- package/lib/adapters/stellar/getters.d.ts +68 -0
- package/lib/adapters/stellar/getters.js +290 -0
- package/lib/adapters/stellar/index.d.ts +114 -0
- package/lib/adapters/stellar/index.js +175 -0
- package/lib/adapters/stellar/soroban.d.ts +123 -0
- package/lib/adapters/stellar/soroban.js +613 -0
- package/lib/adapters/stellar/submit.d.ts +34 -0
- package/lib/adapters/stellar/submit.js +149 -0
- package/lib/adapters/stellar/types.d.ts +58 -0
- package/lib/adapters/stellar/types.js +6 -0
- package/lib/adapters/stellar/utils.d.ts +24 -0
- package/lib/adapters/stellar/utils.js +34 -0
- package/lib/adapters/sui/constants.d.ts +14 -0
- package/lib/adapters/sui/constants.js +29 -0
- package/lib/adapters/sui/getters.d.ts +9 -0
- package/lib/adapters/sui/getters.js +60 -0
- package/lib/adapters/sui/index.d.ts +45 -0
- package/lib/adapters/sui/index.js +101 -0
- package/lib/adapters/sui/transformer.d.ts +10 -0
- package/lib/adapters/sui/transformer.js +107 -0
- package/lib/adapters/sui/types.d.ts +66 -0
- package/lib/adapters/sui/types.js +3 -0
- package/lib/adapters/sui/utils.d.ts +10 -0
- package/lib/adapters/sui/utils.js +29 -0
- package/lib/core/analytics/chain-name.d.ts +9 -0
- package/lib/core/analytics/chain-name.js +34 -0
- package/lib/core/analytics/constants.d.ts +5 -0
- package/lib/core/analytics/constants.js +9 -0
- package/lib/core/analytics/env.d.ts +29 -0
- package/lib/core/analytics/env.js +59 -0
- package/lib/core/analytics/index.d.ts +36 -0
- package/lib/core/analytics/index.js +79 -0
- package/lib/core/analytics/instrumentation.d.ts +29 -0
- package/lib/core/analytics/instrumentation.js +277 -0
- package/lib/core/analytics/method-taxonomy.d.ts +19 -0
- package/lib/core/analytics/method-taxonomy.js +128 -0
- package/lib/core/analytics/metrics.d.ts +33 -0
- package/lib/core/analytics/metrics.js +116 -0
- package/lib/core/analytics/sanitize.d.ts +44 -0
- package/lib/core/analytics/sanitize.js +260 -0
- package/lib/core/analytics/sentry-runtime.d.ts +15 -0
- package/lib/core/analytics/sentry-runtime.js +97 -0
- package/lib/core/analytics/sentry.d.ts +67 -0
- package/lib/core/analytics/sentry.js +613 -0
- package/lib/core/analytics/types.d.ts +48 -0
- package/lib/core/analytics/types.js +3 -0
- package/lib/core/analytics/user-identity.d.ts +41 -0
- package/lib/core/analytics/user-identity.js +141 -0
- package/lib/core/analytics/version.d.ts +6 -0
- package/lib/core/analytics/version.js +10 -0
- package/lib/core/attribution.d.ts +111 -0
- package/lib/core/attribution.js +142 -0
- package/lib/core/auth/index.d.ts +1 -0
- package/lib/core/auth/index.js +18 -0
- package/lib/core/auth/verify.d.ts +2 -0
- package/lib/core/auth/verify.js +31 -0
- package/lib/core/base.class.d.ts +152 -0
- package/lib/core/base.class.js +172 -0
- package/lib/core/cache.d.ts +9 -0
- package/lib/core/cache.js +31 -0
- package/lib/core/constants/adapters.d.ts +103 -0
- package/lib/core/constants/adapters.js +180 -0
- package/lib/core/constants/core.d.ts +133 -0
- package/lib/core/constants/core.js +209 -0
- package/lib/core/constants/swap-router.d.ts +150 -0
- package/lib/core/constants/swap-router.js +169 -0
- package/lib/core/constants/vaults.d.ts +93 -0
- package/lib/core/constants/vaults.js +273 -0
- package/lib/core/constants/web3.d.ts +91 -0
- package/lib/core/constants/web3.js +229 -0
- package/lib/core/errors/index.d.ts +114 -0
- package/lib/core/errors/index.js +183 -0
- package/lib/core/fetcher.d.ts +198 -0
- package/lib/core/fetcher.js +903 -0
- package/lib/core/helpers/adapters.d.ts +13 -0
- package/lib/core/helpers/adapters.js +39 -0
- package/lib/core/helpers/chain-address.d.ts +13 -0
- package/lib/core/helpers/chain-address.js +47 -0
- package/lib/core/helpers/chain-error.d.ts +207 -0
- package/lib/core/helpers/chain-error.js +682 -0
- package/lib/core/helpers/chain-support.d.ts +80 -0
- package/lib/core/helpers/chain-support.js +115 -0
- package/lib/core/helpers/core.d.ts +68 -0
- package/lib/core/helpers/core.js +285 -0
- package/lib/core/helpers/explorer-link.d.ts +16 -0
- package/lib/core/helpers/explorer-link.js +26 -0
- package/lib/core/helpers/multicall.d.ts +68 -0
- package/lib/core/helpers/multicall.js +103 -0
- package/lib/core/helpers/revert-decode.d.ts +248 -0
- package/lib/core/helpers/revert-decode.js +515 -0
- package/lib/core/helpers/signer.d.ts +52 -0
- package/lib/core/helpers/signer.js +145 -0
- package/lib/core/helpers/swap-router.d.ts +211 -0
- package/lib/core/helpers/swap-router.js +480 -0
- package/lib/core/helpers/vault-version.d.ts +23 -0
- package/lib/core/helpers/vault-version.js +75 -0
- package/lib/core/helpers/vaults.d.ts +89 -0
- package/lib/core/helpers/vaults.js +235 -0
- package/lib/core/helpers/web3.d.ts +353 -0
- package/lib/core/helpers/web3.js +992 -0
- package/lib/core/index.d.ts +23 -0
- package/lib/core/index.js +40 -0
- package/lib/core/logger/index.d.ts +98 -0
- package/lib/core/logger/index.js +144 -0
- package/lib/core/logger/slack.d.ts +16 -0
- package/lib/core/logger/slack.js +57 -0
- package/lib/core/vault-metadata.d.ts +12 -0
- package/lib/core/vault-metadata.js +42 -0
- package/lib/core/version-check.d.ts +58 -0
- package/lib/core/version-check.js +182 -0
- package/lib/evm/index.d.ts +2 -0
- package/lib/evm/index.js +19 -0
- package/lib/evm/methods/crossChainVault.d.ts +128 -0
- package/lib/evm/methods/crossChainVault.js +853 -0
- package/lib/evm/methods/crossChainVaultRegistry.d.ts +93 -0
- package/lib/evm/methods/crossChainVaultRegistry.js +240 -0
- package/lib/evm/methods/index.d.ts +2 -0
- package/lib/evm/methods/index.js +19 -0
- package/lib/evm/types/crossChain.d.ts +363 -0
- package/lib/evm/types/crossChain.js +20 -0
- package/lib/evm/types/index.d.ts +1 -0
- package/lib/evm/types/index.js +18 -0
- package/lib/index.d.ts +30 -0
- package/lib/index.js +52 -0
- package/lib/main.d.ts +527 -0
- package/lib/main.js +601 -0
- package/lib/modules/api/fetcher.d.ts +82 -0
- package/lib/modules/api/fetcher.js +150 -0
- package/lib/modules/api/index.d.ts +1 -0
- package/lib/modules/api/index.js +6 -0
- package/lib/modules/api/main.d.ts +313 -0
- package/lib/modules/api/main.js +479 -0
- package/lib/modules/sub-accounts/fetcher.d.ts +53 -0
- package/lib/modules/sub-accounts/fetcher.js +120 -0
- package/lib/modules/sub-accounts/index.d.ts +2 -0
- package/lib/modules/sub-accounts/index.js +19 -0
- package/lib/modules/sub-accounts/main.d.ts +243 -0
- package/lib/modules/sub-accounts/main.js +205 -0
- package/lib/modules/sub-accounts/utils.d.ts +106 -0
- package/lib/modules/sub-accounts/utils.js +112 -0
- package/lib/modules/vaults/adapter.helpers.d.ts +64 -0
- package/lib/modules/vaults/adapter.helpers.js +184 -0
- package/lib/modules/vaults/fetcher.d.ts +147 -0
- package/lib/modules/vaults/fetcher.js +368 -0
- package/lib/modules/vaults/getters.d.ts +570 -0
- package/lib/modules/vaults/getters.js +3051 -0
- package/lib/modules/vaults/index.d.ts +20 -0
- package/lib/modules/vaults/index.js +44 -0
- package/lib/modules/vaults/main.d.ts +601 -0
- package/lib/modules/vaults/main.js +1623 -0
- package/lib/modules/vaults/prefetch.d.ts +65 -0
- package/lib/modules/vaults/prefetch.js +120 -0
- package/lib/modules/vaults/read.actions.d.ts +225 -0
- package/lib/modules/vaults/read.actions.js +596 -0
- package/lib/modules/vaults/types.d.ts +71 -0
- package/lib/modules/vaults/types.js +3 -0
- package/lib/modules/vaults/utils/call-data-decoder.d.ts +61 -0
- package/lib/modules/vaults/utils/call-data-decoder.js +194 -0
- package/lib/modules/vaults/utils/date-utils.d.ts +50 -0
- package/lib/modules/vaults/utils/date-utils.js +84 -0
- package/lib/modules/vaults/utils.d.ts +140 -0
- package/lib/modules/vaults/utils.js +799 -0
- package/lib/modules/vaults/write.actions.d.ts +529 -0
- package/lib/modules/vaults/write.actions.js +1749 -0
- package/lib/polyfills.d.ts +1 -0
- package/lib/polyfills.js +12 -0
- package/lib/sdk.d.ts +26721 -0
- package/lib/services/coingecko/fetcher.d.ts +15 -0
- package/lib/services/coingecko/fetcher.js +67 -0
- package/lib/services/coingecko/index.d.ts +2 -0
- package/lib/services/coingecko/index.js +19 -0
- package/lib/services/coingecko/utils.d.ts +1 -0
- package/lib/services/coingecko/utils.js +24 -0
- package/lib/services/debank/fetcher.d.ts +126 -0
- package/lib/services/debank/fetcher.js +47 -0
- package/lib/services/debank/index.d.ts +2 -0
- package/lib/services/debank/index.js +19 -0
- package/lib/services/debank/utils.d.ts +38 -0
- package/lib/services/debank/utils.js +297 -0
- package/lib/services/layerzero/deposits.d.ts +49 -0
- package/lib/services/layerzero/deposits.js +166 -0
- package/lib/services/layerzero/redeems.d.ts +20 -0
- package/lib/services/layerzero/redeems.js +92 -0
- package/lib/services/layerzero/utils.d.ts +9 -0
- package/lib/services/layerzero/utils.js +22 -0
- package/lib/services/octavfi/fetcher.d.ts +9 -0
- package/lib/services/octavfi/fetcher.js +103 -0
- package/lib/services/octavfi/index.d.ts +3 -0
- package/lib/services/octavfi/index.js +20 -0
- package/lib/services/octavfi/types.d.ts +34 -0
- package/lib/services/octavfi/types.js +3 -0
- package/lib/services/octavfi/utils.d.ts +16 -0
- package/lib/services/octavfi/utils.js +212 -0
- package/lib/services/subgraph/fetcher.d.ts +2 -0
- package/lib/services/subgraph/fetcher.js +61 -0
- package/lib/services/subgraph/index.d.ts +2 -0
- package/lib/services/subgraph/index.js +19 -0
- package/lib/services/subgraph/schema.d.ts +45 -0
- package/lib/services/subgraph/schema.js +75 -0
- package/lib/services/subgraph/vaults.d.ts +25 -0
- package/lib/services/subgraph/vaults.js +1106 -0
- package/lib/services/swap-quotes/index.d.ts +105 -0
- package/lib/services/swap-quotes/index.js +77 -0
- package/lib/services/swap-quotes/paraswap.d.ts +51 -0
- package/lib/services/swap-quotes/paraswap.js +138 -0
- package/lib/types/api.d.ts +280 -0
- package/lib/types/api.js +3 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.js +28 -0
- package/lib/types/points.d.ts +28 -0
- package/lib/types/points.js +3 -0
- package/lib/types/pools.d.ts +144 -0
- package/lib/types/pools.js +3 -0
- package/lib/types/staking.d.ts +28 -0
- package/lib/types/staking.js +3 -0
- package/lib/types/sub-accounts.d.ts +140 -0
- package/lib/types/sub-accounts.js +3 -0
- package/lib/types/subgraph.d.ts +74 -0
- package/lib/types/subgraph.js +3 -0
- package/lib/types/typed-contract.d.ts +102 -0
- package/lib/types/typed-contract.js +3 -0
- package/lib/types/user.d.ts +1 -0
- package/lib/types/user.js +3 -0
- package/lib/types/vaults.d.ts +714 -0
- package/lib/types/vaults.js +24 -0
- package/lib/types/web3.d.ts +51 -0
- package/lib/types/web3.js +14 -0
- package/lib/types/webserver.d.ts +698 -0
- package/lib/types/webserver.js +3 -0
- package/package.json +78 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LayerZero Deposits Service
|
|
3
|
+
* Handles querying LayerZero USDC deposits from subgraphs
|
|
4
|
+
*/
|
|
5
|
+
import type { IAddress } from '../../types';
|
|
6
|
+
export declare const LAYERZERO_VAULTS: {
|
|
7
|
+
coreUSDC: {
|
|
8
|
+
address: IAddress;
|
|
9
|
+
receiptToken: "coreusdc";
|
|
10
|
+
decimals: number;
|
|
11
|
+
hubChainId: number;
|
|
12
|
+
spokeChains: Record<number, IAddress>;
|
|
13
|
+
subgraphEndpoints: string[];
|
|
14
|
+
};
|
|
15
|
+
upUSDC: {
|
|
16
|
+
address: IAddress;
|
|
17
|
+
receiptToken: "upusdc";
|
|
18
|
+
decimals: number;
|
|
19
|
+
hubChainId: number;
|
|
20
|
+
spokeChains: Record<number, IAddress>;
|
|
21
|
+
subgraphEndpoints: string[];
|
|
22
|
+
};
|
|
23
|
+
earnAUSD: {
|
|
24
|
+
address: IAddress;
|
|
25
|
+
receiptToken: "earnausd";
|
|
26
|
+
decimals: number;
|
|
27
|
+
hubChainId: number;
|
|
28
|
+
spokeChains: Record<number, IAddress>;
|
|
29
|
+
subgraphEndpoints: string[];
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export interface ILayerZeroDeposit {
|
|
33
|
+
assetAmt: string;
|
|
34
|
+
dstEid: string;
|
|
35
|
+
sender: string;
|
|
36
|
+
recipient: string;
|
|
37
|
+
shareAmt: string;
|
|
38
|
+
transactionHash_: string;
|
|
39
|
+
timestamp_: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if a vault address or symbol is a LayerZero vault
|
|
43
|
+
*/
|
|
44
|
+
export declare function isLayerZeroVault(vaultAddressOrSymbol: string): keyof typeof LAYERZERO_VAULTS | null;
|
|
45
|
+
/**
|
|
46
|
+
* Query LayerZero deposits from the appropriate subgraph
|
|
47
|
+
* @throws Error if the GraphQL request fails or returns invalid data
|
|
48
|
+
*/
|
|
49
|
+
export declare function queryLayerZeroDeposits(vaultKey: keyof typeof LAYERZERO_VAULTS, wallet?: IAddress): Promise<ILayerZeroDeposit[]>;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LayerZero Deposits Service
|
|
4
|
+
* Handles querying LayerZero USDC deposits from subgraphs
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.LAYERZERO_VAULTS = void 0;
|
|
8
|
+
exports.isLayerZeroVault = isLayerZeroVault;
|
|
9
|
+
exports.queryLayerZeroDeposits = queryLayerZeroDeposits;
|
|
10
|
+
const fetcher_1 = require("../subgraph/fetcher");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
// LayerZero vault addresses and their corresponding receipt tokens
|
|
13
|
+
// spokeChains maps chainId -> shareOFT address (receipt token on that chain)
|
|
14
|
+
exports.LAYERZERO_VAULTS = {
|
|
15
|
+
coreUSDC: {
|
|
16
|
+
address: '0xE9B725010A9E419412ed67d0fA5f3A5f40159D32',
|
|
17
|
+
receiptToken: 'coreusdc',
|
|
18
|
+
decimals: 6, // USDC decimals
|
|
19
|
+
hubChainId: 1,
|
|
20
|
+
spokeChains: {
|
|
21
|
+
42161: '0x50a31ff4d57841681011837c17aa201c6a34203c', // Arbitrum
|
|
22
|
+
43114: '0x1FA931Bf85248aD2eDf0004DD9A284698358e708', // Avalanche
|
|
23
|
+
8453: '0x1fa931bf85248ad2edf0004dd9a284698358e708', // Base
|
|
24
|
+
146: '0x4bdd224fe59a3ae0b249125ad4c5b3126074c71b', // Sonic
|
|
25
|
+
},
|
|
26
|
+
subgraphEndpoints: [
|
|
27
|
+
'https://api.goldsky.com/api/public/project_cm9g0xy3o4j6v01vd34r3hvv9/subgraphs/august-layerzero-coreusdc/1.0.0/gn',
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
upUSDC: {
|
|
31
|
+
address: '0x80E1048eDE66ec4c364b4F22C8768fc657FF6A42',
|
|
32
|
+
receiptToken: 'upusdc',
|
|
33
|
+
decimals: 6, // USDC decimals
|
|
34
|
+
hubChainId: 1,
|
|
35
|
+
spokeChains: {
|
|
36
|
+
42161: '0x81971a3c359cfe74259cff1b46fb5f2112ddde34', // Arbitrum
|
|
37
|
+
43114: '0x81971A3C359cFE74259CfF1b46FB5f2112ddDE34', // Avalanche
|
|
38
|
+
8453: '0x81971a3c359cfe74259cff1b46fb5f2112ddde34', // Base
|
|
39
|
+
146: '0x81971a3c359cfe74259cff1b46fb5f2112ddde34', // Sonic
|
|
40
|
+
},
|
|
41
|
+
subgraphEndpoints: [
|
|
42
|
+
'https://api.goldsky.com/api/public/project_cm9g0xy3o4j6v01vd34r3hvv9/subgraphs/august-layerzero-upusdc/1.0.0/gn',
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
earnAUSD: {
|
|
46
|
+
address: '0x36eDbF0C834591BFdfCaC0Ef9605528c75c406aA',
|
|
47
|
+
receiptToken: 'earnausd',
|
|
48
|
+
decimals: 6,
|
|
49
|
+
hubChainId: 143,
|
|
50
|
+
spokeChains: {
|
|
51
|
+
1: '0xa6916b65c5e3fEdf46c0a2F59bff776e872C8992', // Ethereum
|
|
52
|
+
},
|
|
53
|
+
subgraphEndpoints: [
|
|
54
|
+
'https://api.goldsky.com/api/public/project_cm9g0xy3o4j6v01vd34r3hvv9/subgraphs/august-layerzero-earnAUSD/1.0.0/gn',
|
|
55
|
+
'https://api.goldsky.com/api/public/project_cm9g0xy3o4j6v01vd34r3hvv9/subgraphs/august-layerzero-earnausd/1.0.0/gn',
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Check if a vault address or symbol is a LayerZero vault
|
|
61
|
+
*/
|
|
62
|
+
function isLayerZeroVault(vaultAddressOrSymbol) {
|
|
63
|
+
const normalized = vaultAddressOrSymbol.toLowerCase();
|
|
64
|
+
// Check by address
|
|
65
|
+
if (normalized === exports.LAYERZERO_VAULTS.coreUSDC.address.toLowerCase() ||
|
|
66
|
+
normalized === 'coreusdc') {
|
|
67
|
+
return 'coreUSDC';
|
|
68
|
+
}
|
|
69
|
+
if (normalized === exports.LAYERZERO_VAULTS.upUSDC.address.toLowerCase() ||
|
|
70
|
+
normalized === 'upusdc') {
|
|
71
|
+
return 'upUSDC';
|
|
72
|
+
}
|
|
73
|
+
if (normalized === exports.LAYERZERO_VAULTS.earnAUSD.address.toLowerCase() ||
|
|
74
|
+
normalized === 'earnausd') {
|
|
75
|
+
return 'earnAUSD';
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Validate GraphQL response structure
|
|
81
|
+
*/
|
|
82
|
+
function validateDepositResponse(result) {
|
|
83
|
+
if (!result || typeof result !== 'object') {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const r = result;
|
|
87
|
+
if (!r.data || typeof r.data !== 'object') {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
const data = r.data;
|
|
91
|
+
if (!Array.isArray(data.depositeds)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Query LayerZero deposits from the appropriate subgraph
|
|
98
|
+
* @throws Error if the GraphQL request fails or returns invalid data
|
|
99
|
+
*/
|
|
100
|
+
async function queryLayerZeroDeposits(vaultKey, wallet) {
|
|
101
|
+
const vaultConfig = exports.LAYERZERO_VAULTS[vaultKey];
|
|
102
|
+
// Build GraphQL query (fetchSubgraph prepends "query " automatically)
|
|
103
|
+
let query = `GetDeposits {
|
|
104
|
+
depositeds(first: 1000) {
|
|
105
|
+
assetAmt
|
|
106
|
+
dstEid
|
|
107
|
+
sender
|
|
108
|
+
recipient
|
|
109
|
+
shareAmt
|
|
110
|
+
transactionHash_
|
|
111
|
+
timestamp_
|
|
112
|
+
}
|
|
113
|
+
}`;
|
|
114
|
+
// If wallet is provided, filter by sender
|
|
115
|
+
if (wallet) {
|
|
116
|
+
const senderBytes32 = (0, utils_1.addressToBytes32)(wallet);
|
|
117
|
+
query = `GetDeposits {
|
|
118
|
+
depositeds(first: 1000, where: { sender: "${senderBytes32}" }) {
|
|
119
|
+
assetAmt
|
|
120
|
+
dstEid
|
|
121
|
+
sender
|
|
122
|
+
recipient
|
|
123
|
+
shareAmt
|
|
124
|
+
transactionHash_
|
|
125
|
+
timestamp_
|
|
126
|
+
}
|
|
127
|
+
}`;
|
|
128
|
+
}
|
|
129
|
+
const endpoints = vaultConfig.subgraphEndpoints;
|
|
130
|
+
let lastError;
|
|
131
|
+
for (let i = 0; i < endpoints.length; i++) {
|
|
132
|
+
try {
|
|
133
|
+
const response = await (0, fetcher_1.fetchSubgraph)(endpoints[i], query);
|
|
134
|
+
// Only fall through to next endpoint on 404 (wrong URL casing)
|
|
135
|
+
if (response.status === 404 && i < endpoints.length - 1) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
throw new Error(`GraphQL request failed with status ${response.status}: ${response.statusText}`);
|
|
140
|
+
}
|
|
141
|
+
const result = await response.json();
|
|
142
|
+
if (result.errors) {
|
|
143
|
+
throw new Error(`GraphQL errors: ${JSON.stringify(result.errors)}`);
|
|
144
|
+
}
|
|
145
|
+
// Validate response structure
|
|
146
|
+
if (!validateDepositResponse(result)) {
|
|
147
|
+
throw new Error(`Invalid response structure from LayerZero subgraph. Expected data.depositeds array, got: ${JSON.stringify(result)}`);
|
|
148
|
+
}
|
|
149
|
+
return result.data.depositeds;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
lastError = error;
|
|
153
|
+
// Only continue to next endpoint on network-level failures; re-throw application errors immediately
|
|
154
|
+
if (i >= endpoints.length - 1)
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// All endpoints failed — throw the last error with context
|
|
159
|
+
if (lastError instanceof Error) {
|
|
160
|
+
const enhancedError = new Error(`Failed to fetch LayerZero deposits for ${vaultKey}: ${lastError.message}`);
|
|
161
|
+
enhancedError.stack = lastError.stack;
|
|
162
|
+
throw enhancedError;
|
|
163
|
+
}
|
|
164
|
+
throw new Error(`Failed to fetch LayerZero deposits for ${vaultKey}: ${String(lastError)}`);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=deposits.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LayerZero Redeems Service
|
|
3
|
+
* Handles querying LayerZero earnAUSD redeems from subgraphs
|
|
4
|
+
*/
|
|
5
|
+
import type { IAddress } from '../../types';
|
|
6
|
+
export interface ILayerZeroRedeem {
|
|
7
|
+
id: string;
|
|
8
|
+
recipient: string;
|
|
9
|
+
sender: string;
|
|
10
|
+
shareAmt: string;
|
|
11
|
+
transactionHash_: string;
|
|
12
|
+
timestamp_: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Query LayerZero redeems for earnAUSD from the subgraph.
|
|
16
|
+
* Uses the same earnAUSD subgraph endpoints as deposits — the subgraph indexes
|
|
17
|
+
* both Deposited and Redeemed events from the same contract.
|
|
18
|
+
* @throws Error if the GraphQL request fails or returns invalid data
|
|
19
|
+
*/
|
|
20
|
+
export declare function queryLayerZeroRedeems(wallet?: IAddress): Promise<ILayerZeroRedeem[]>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LayerZero Redeems Service
|
|
4
|
+
* Handles querying LayerZero earnAUSD redeems from subgraphs
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.queryLayerZeroRedeems = queryLayerZeroRedeems;
|
|
8
|
+
const fetcher_1 = require("../subgraph/fetcher");
|
|
9
|
+
const deposits_1 = require("./deposits");
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
/**
|
|
12
|
+
* Validate GraphQL response structure for redeems
|
|
13
|
+
*/
|
|
14
|
+
function validateRedeemResponse(result) {
|
|
15
|
+
if (!result || typeof result !== 'object') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const r = result;
|
|
19
|
+
if (!r.data || typeof r.data !== 'object') {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const data = r.data;
|
|
23
|
+
if (!Array.isArray(data.redeemeds)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Query LayerZero redeems for earnAUSD from the subgraph.
|
|
30
|
+
* Uses the same earnAUSD subgraph endpoints as deposits — the subgraph indexes
|
|
31
|
+
* both Deposited and Redeemed events from the same contract.
|
|
32
|
+
* @throws Error if the GraphQL request fails or returns invalid data
|
|
33
|
+
*/
|
|
34
|
+
async function queryLayerZeroRedeems(wallet) {
|
|
35
|
+
const vaultConfig = deposits_1.LAYERZERO_VAULTS.earnAUSD;
|
|
36
|
+
let query = `GetRedeems {
|
|
37
|
+
redeemeds(first: 1000) {
|
|
38
|
+
id
|
|
39
|
+
recipient
|
|
40
|
+
sender
|
|
41
|
+
shareAmt
|
|
42
|
+
transactionHash_
|
|
43
|
+
timestamp_
|
|
44
|
+
}
|
|
45
|
+
}`;
|
|
46
|
+
if (wallet) {
|
|
47
|
+
const senderBytes32 = (0, utils_1.addressToBytes32)(wallet);
|
|
48
|
+
query = `GetRedeems {
|
|
49
|
+
redeemeds(first: 1000, where: { sender: "${senderBytes32}" }) {
|
|
50
|
+
id
|
|
51
|
+
recipient
|
|
52
|
+
sender
|
|
53
|
+
shareAmt
|
|
54
|
+
transactionHash_
|
|
55
|
+
timestamp_
|
|
56
|
+
}
|
|
57
|
+
}`;
|
|
58
|
+
}
|
|
59
|
+
const endpoints = vaultConfig.subgraphEndpoints;
|
|
60
|
+
let lastError;
|
|
61
|
+
for (let i = 0; i < endpoints.length; i++) {
|
|
62
|
+
try {
|
|
63
|
+
const response = await (0, fetcher_1.fetchSubgraph)(endpoints[i], query);
|
|
64
|
+
if (response.status === 404 && i < endpoints.length - 1) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new Error(`GraphQL request failed with status ${response.status}: ${response.statusText}`);
|
|
69
|
+
}
|
|
70
|
+
const result = await response.json();
|
|
71
|
+
if (result.errors) {
|
|
72
|
+
throw new Error(`GraphQL errors: ${JSON.stringify(result.errors)}`);
|
|
73
|
+
}
|
|
74
|
+
if (!validateRedeemResponse(result)) {
|
|
75
|
+
throw new Error(`Invalid response structure from LayerZero subgraph. Expected data.redeemeds array, got: ${JSON.stringify(result)}`);
|
|
76
|
+
}
|
|
77
|
+
return result.data.redeemeds;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
lastError = error;
|
|
81
|
+
if (i >= endpoints.length - 1)
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (lastError instanceof Error) {
|
|
86
|
+
const enhancedError = new Error(`Failed to fetch LayerZero redeems for earnAUSD: ${lastError.message}`);
|
|
87
|
+
enhancedError.stack = lastError.stack;
|
|
88
|
+
throw enhancedError;
|
|
89
|
+
}
|
|
90
|
+
throw new Error(`Failed to fetch LayerZero redeems for earnAUSD: ${String(lastError)}`);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=redeems.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared LayerZero utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Convert Ethereum address to bytes32 format (left-padded with zeros)
|
|
6
|
+
* Used by LayerZero subgraph queries where addresses are stored in bytes32 format.
|
|
7
|
+
* @throws {Error} If address format is invalid
|
|
8
|
+
*/
|
|
9
|
+
export declare function addressToBytes32(address: string): string;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared LayerZero utilities
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.addressToBytes32 = addressToBytes32;
|
|
7
|
+
/**
|
|
8
|
+
* Convert Ethereum address to bytes32 format (left-padded with zeros)
|
|
9
|
+
* Used by LayerZero subgraph queries where addresses are stored in bytes32 format.
|
|
10
|
+
* @throws {Error} If address format is invalid
|
|
11
|
+
*/
|
|
12
|
+
function addressToBytes32(address) {
|
|
13
|
+
// Validate address format
|
|
14
|
+
if (!address.match(/^0x[a-fA-F0-9]{40}$/)) {
|
|
15
|
+
throw new Error(`Invalid Ethereum address format: ${address}. Expected format: 0x followed by 40 hexadecimal characters.`);
|
|
16
|
+
}
|
|
17
|
+
// Remove 0x prefix and convert to lowercase
|
|
18
|
+
const cleanAddress = address.replace(/^0x/i, '').toLowerCase();
|
|
19
|
+
// Pad with 24 zeros (12 bytes) to make it 32 bytes total
|
|
20
|
+
return '0x' + '0'.repeat(24) + cleanAddress;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IOctavfiPortfolio } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Fetches portfolio data from Octavfi API.
|
|
4
|
+
* Note: The API currently doesn't support multiple addresses in a single request,
|
|
5
|
+
* so individual requests are made for each address.
|
|
6
|
+
* @param addresses - Array of addresses to fetch data for.
|
|
7
|
+
* @returns Array of portfolio data (may be empty if all requests fail).
|
|
8
|
+
*/
|
|
9
|
+
export declare function fetchOctavfiPortfolios(addresses: string[]): Promise<IOctavfiPortfolio[]>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchOctavfiPortfolios = fetchOctavfiPortfolios;
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
5
|
+
const utils_1 = require("../../adapters/solana/utils");
|
|
6
|
+
const core_1 = require("../../core");
|
|
7
|
+
const BASE_URL = 'https://api.octav.fi';
|
|
8
|
+
const OCTAVFI_API_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwczovL2hhc3VyYS5pby9qd3QvY2xhaW1zIjp7IngtaGFzdXJhLWRlZmF1bHQtcm9sZSI6InVzZXIiLCJ4LWhhc3VyYS1hbGxvd2VkLXJvbGVzIjpbInVzZXIiXSwieC1oYXN1cmEtdXNlci1pZCI6ImF1Z3VzdDEyMjM0In19.zaMUtrtdC82uaDh6XSZrsneEcKO3PFOE6FyX3G-MR6c';
|
|
9
|
+
/**
|
|
10
|
+
* Filters addresses to only include EVM and Solana wallet addresses.
|
|
11
|
+
* Excludes Sui addresses and other non-supported address formats.
|
|
12
|
+
*
|
|
13
|
+
* @param addresses - Array of addresses to filter
|
|
14
|
+
* @returns Array containing only EVM and Solana addresses
|
|
15
|
+
*/
|
|
16
|
+
function filterEvmAndSolanaAddresses(addresses) {
|
|
17
|
+
return addresses.filter((address) => {
|
|
18
|
+
if (!address || typeof address !== 'string')
|
|
19
|
+
return false;
|
|
20
|
+
if ((0, ethers_1.isAddress)(address)) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
if (utils_1.SolanaUtils.isSolanaAddress(address)) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
core_1.Logger.log.info('filterEvmAndSolanaAddresses.excluded', { address });
|
|
27
|
+
return false;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Fetches portfolio data for a single address from Octavfi API.
|
|
32
|
+
* @param address - Single address to fetch data for.
|
|
33
|
+
* @returns Portfolio data or null if request fails.
|
|
34
|
+
*/
|
|
35
|
+
async function fetchSinglePortfolio(address) {
|
|
36
|
+
try {
|
|
37
|
+
const response = await fetch(`${BASE_URL}/v1/portfolio?addresses=${address}`, {
|
|
38
|
+
method: 'GET',
|
|
39
|
+
headers: {
|
|
40
|
+
'Content-Type': 'application/json',
|
|
41
|
+
Authorization: `Bearer ${OCTAVFI_API_KEY}`,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
const errorText = await response.text();
|
|
46
|
+
core_1.Logger.log.error('fetchSinglePortfolio', new Error(`HTTP ${response.status} ${response.statusText}: ${errorText}`), {
|
|
47
|
+
address,
|
|
48
|
+
status: response.status,
|
|
49
|
+
statusText: response.statusText,
|
|
50
|
+
});
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const data = await response.json();
|
|
54
|
+
if (!data || typeof data !== 'object') {
|
|
55
|
+
core_1.Logger.log.error('fetchSinglePortfolio.unexpected-type', new Error(`unexpected response type: ${typeof data}`), { address });
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
if (data.error) {
|
|
59
|
+
core_1.Logger.log.error('fetchSinglePortfolio.api-error', new Error(String(data.error)), { address });
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
// Handle nested array response: [[portfolio]] or [portfolio] or portfolio
|
|
63
|
+
let portfolio = data;
|
|
64
|
+
if (Array.isArray(data)) {
|
|
65
|
+
if (data.length > 0 && Array.isArray(data[0])) {
|
|
66
|
+
// Nested array: [[portfolio]]
|
|
67
|
+
portfolio = data[0][0];
|
|
68
|
+
}
|
|
69
|
+
else if (data.length > 0) {
|
|
70
|
+
// Single array: [portfolio]
|
|
71
|
+
portfolio = data[0];
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Return raw Octavfi data (transformation should happen separately when needed)
|
|
78
|
+
return portfolio;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
core_1.Logger.log.error('fetchSinglePortfolio', error, { address });
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Fetches portfolio data from Octavfi API.
|
|
87
|
+
* Note: The API currently doesn't support multiple addresses in a single request,
|
|
88
|
+
* so individual requests are made for each address.
|
|
89
|
+
* @param addresses - Array of addresses to fetch data for.
|
|
90
|
+
* @returns Array of portfolio data (may be empty if all requests fail).
|
|
91
|
+
*/
|
|
92
|
+
async function fetchOctavfiPortfolios(addresses) {
|
|
93
|
+
const filteredAddresses = filterEvmAndSolanaAddresses(addresses);
|
|
94
|
+
if (filteredAddresses.length === 0) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
// Fetch portfolios for each address in parallel
|
|
98
|
+
const portfolioPromises = filteredAddresses.map((address) => fetchSinglePortfolio(address));
|
|
99
|
+
const portfolios = await Promise.all(portfolioPromises);
|
|
100
|
+
// Filter out null results (failed requests)
|
|
101
|
+
return portfolios.filter((portfolio) => portfolio !== null);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./fetcher"), exports);
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
__exportStar(require("./utils"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { IAddress } from '../../types';
|
|
2
|
+
export type IOctavfiEndpoint = 'portfolio';
|
|
3
|
+
export interface IOctavfiAsset {
|
|
4
|
+
balance: string;
|
|
5
|
+
symbol: string;
|
|
6
|
+
price: string;
|
|
7
|
+
value: string;
|
|
8
|
+
contractAddress?: IAddress;
|
|
9
|
+
chain: string;
|
|
10
|
+
}
|
|
11
|
+
export interface IOctavfiProtocolBreakdown {
|
|
12
|
+
key: string;
|
|
13
|
+
name: string;
|
|
14
|
+
value: string;
|
|
15
|
+
assets: IOctavfiAsset[];
|
|
16
|
+
}
|
|
17
|
+
export interface IOctavfiChainBreakdown {
|
|
18
|
+
key: string;
|
|
19
|
+
name: string;
|
|
20
|
+
value: string;
|
|
21
|
+
protocols: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface IOctavfiPortfolio {
|
|
24
|
+
address: IAddress;
|
|
25
|
+
cashBalance: string;
|
|
26
|
+
dailyIncome: string;
|
|
27
|
+
dailyExpense: string;
|
|
28
|
+
fees: string;
|
|
29
|
+
feesFiat: string;
|
|
30
|
+
lastUpdated: string;
|
|
31
|
+
networth: string;
|
|
32
|
+
assetByProtocols: Record<string, IOctavfiProtocolBreakdown>;
|
|
33
|
+
chains: Record<string, IOctavfiChainBreakdown>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IOctavfiPortfolio } from './types';
|
|
2
|
+
import type { IDebankNormalizedResponse } from '../debank/utils';
|
|
3
|
+
/**
|
|
4
|
+
* Transforms Octavfi portfolio response to DeBank-compatible format.
|
|
5
|
+
* This allows Solana addresses to use Octavfi data while maintaining
|
|
6
|
+
* compatibility with existing DeBank parsing functions.
|
|
7
|
+
*
|
|
8
|
+
* @param octavfiPortfolio - Octavfi portfolio response
|
|
9
|
+
* @returns DeBank-compatible response structure
|
|
10
|
+
*/
|
|
11
|
+
export declare function transformOctavfiToDebank(octavfiPortfolio: IOctavfiPortfolio | null | undefined): IDebankNormalizedResponse;
|
|
12
|
+
/**
|
|
13
|
+
* Transforms multiple Octavfi portfolios to DeBank format.
|
|
14
|
+
* Used when fetching multiple addresses.
|
|
15
|
+
*/
|
|
16
|
+
export declare function transformOctavfiPortfoliosToDebank(portfolios: IOctavfiPortfolio[]): any[];
|