@elizaos/plugin-wallet 2.0.0-beta.1 → 2.0.3-beta.6
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/README.md +70 -45
- package/auto-enable.ts +1 -1
- package/dist/actions/failure-codes.d.ts +12 -0
- package/dist/actions/index.d.ts +1 -0
- package/dist/analytics/birdeye/actions/wallet-search-address.d.ts +7 -0
- package/dist/analytics/birdeye/birdeye-task.d.ts +27 -0
- package/dist/analytics/birdeye/birdeye.d.ts +140 -0
- package/dist/analytics/birdeye/constants.d.ts +68 -0
- package/dist/analytics/birdeye/providers/agent-portfolio-provider.d.ts +8 -0
- package/dist/analytics/birdeye/providers/market.d.ts +18 -0
- package/dist/analytics/birdeye/providers/portfolio-factory.d.ts +10 -0
- package/dist/analytics/birdeye/providers/trending.d.ts +19 -0
- package/dist/analytics/birdeye/providers/wallet.d.ts +5 -0
- package/dist/analytics/birdeye/search-category.d.ts +52 -0
- package/dist/analytics/birdeye/service.d.ts +94 -0
- package/dist/analytics/birdeye/types/api/common.d.ts +199 -0
- package/dist/analytics/birdeye/types/api/defi.d.ts +187 -0
- package/dist/analytics/birdeye/types/api/pair.d.ts +182 -0
- package/dist/analytics/birdeye/types/api/search.d.ts +64 -0
- package/dist/analytics/birdeye/types/api/token.d.ts +580 -0
- package/dist/analytics/birdeye/types/api/trader.d.ts +70 -0
- package/dist/analytics/birdeye/types/api/wallet.d.ts +161 -0
- package/dist/analytics/birdeye/types/shared.d.ts +83 -0
- package/dist/analytics/birdeye/utils.d.ts +74 -0
- package/dist/analytics/dexscreener/errors.d.ts +2 -0
- package/dist/analytics/dexscreener/index.d.ts +3 -0
- package/dist/analytics/dexscreener/search-category.d.ts +3 -0
- package/dist/analytics/dexscreener/service.d.ts +34 -0
- package/dist/analytics/dexscreener/types.d.ts +131 -0
- package/dist/analytics/lpinfo/index.d.ts +31 -0
- package/dist/analytics/lpinfo/kamino/index.d.ts +7 -0
- package/dist/analytics/lpinfo/kamino/providers/kaminoLiquidityProvider.d.ts +6 -0
- package/dist/analytics/lpinfo/kamino/providers/kaminoPoolProvider.d.ts +6 -0
- package/dist/analytics/lpinfo/kamino/providers/kaminoProvider.d.ts +6 -0
- package/dist/analytics/lpinfo/kamino/services/kaminoLiquidityService.d.ts +203 -0
- package/dist/analytics/lpinfo/kamino/services/kaminoService.d.ts +171 -0
- package/dist/analytics/lpinfo/steer/index.d.ts +7 -0
- package/dist/analytics/lpinfo/steer/providers/steerLiquidityProvider.d.ts +6 -0
- package/dist/analytics/lpinfo/steer/services/steerLiquidityService.d.ts +208 -0
- package/dist/analytics/lpinfo/steer/steer-display-types.d.ts +97 -0
- package/dist/analytics/news/index.d.ts +32 -0
- package/dist/analytics/news/interfaces/types.d.ts +177 -0
- package/dist/analytics/news/providers/defiNewsProvider.d.ts +106 -0
- package/dist/analytics/news/services/newsDataService.d.ts +72 -0
- package/dist/analytics/news/utils/formatters.d.ts +54 -0
- package/dist/analytics/token-info/action.d.ts +6 -0
- package/dist/analytics/token-info/index.d.ts +3 -0
- package/dist/analytics/token-info/params.d.ts +10 -0
- package/dist/analytics/token-info/providers.d.ts +4 -0
- package/dist/analytics/token-info/service.d.ts +19 -0
- package/dist/analytics/token-info/types.d.ts +45 -0
- package/dist/api/wallet-routes.d.ts +100 -0
- package/dist/audit/audit-log.d.ts +29 -0
- package/dist/browser-shim/build-shim.d.ts +31 -0
- package/dist/browser-shim/index.d.ts +1 -0
- package/dist/chains/evm/actions/helpers.d.ts +31 -0
- package/dist/chains/evm/actions/swap.d.ts +53 -0
- package/dist/chains/evm/actions/transfer.d.ts +10 -0
- package/dist/chains/evm/bridge-router.d.ts +44 -0
- package/dist/chains/evm/build.d.ts +2 -0
- package/dist/chains/evm/chain-handler.d.ts +37 -0
- package/dist/chains/evm/constants.d.ts +16 -0
- package/dist/chains/evm/dex/aerodrome/index.d.ts +6 -0
- package/dist/chains/evm/dex/aerodrome/services/AerodromeLpService.d.ts +27 -0
- package/dist/chains/evm/dex/aerodrome/types.d.ts +435 -0
- package/dist/chains/evm/dex/pancakeswp/index.d.ts +6 -0
- package/dist/chains/evm/dex/pancakeswp/services/PancakeSwapV3LpService.d.ts +28 -0
- package/dist/chains/evm/dex/pancakeswp/types.d.ts +19 -0
- package/dist/chains/evm/dex/uniswap/index.d.ts +6 -0
- package/dist/chains/evm/dex/uniswap/services/UniswapV3LpService.d.ts +28 -0
- package/dist/chains/evm/dex/uniswap/types.d.ts +458 -0
- package/dist/chains/evm/generated/specs/spec-helpers.d.ts +35 -0
- package/dist/chains/evm/generated/specs/specs.d.ts +99 -0
- package/dist/chains/evm/gov-router.d.ts +6 -0
- package/dist/chains/evm/index.browser.d.ts +3 -0
- package/dist/chains/evm/index.d.ts +6 -0
- package/dist/chains/evm/prompts.d.ts +24 -0
- package/dist/chains/evm/providers/get-balance.d.ts +2 -0
- package/dist/chains/evm/providers/wallet.d.ts +35 -0
- package/dist/chains/evm/routes/sign.d.ts +13 -0
- package/dist/chains/evm/rpc-providers.d.ts +26 -0
- package/dist/chains/evm/service.d.ts +26 -0
- package/dist/chains/evm/templates/index.d.ts +1 -0
- package/dist/chains/evm/types/index.d.ts +296 -0
- package/dist/chains/evm/vitest.config.d.ts +2 -0
- package/dist/chains/registry.d.ts +3 -0
- package/dist/chains/solana/actions/confirmation.d.ts +9 -0
- package/dist/chains/solana/bn.d.ts +6 -0
- package/dist/chains/solana/build.d.ts +2 -0
- package/dist/chains/solana/constants.d.ts +2 -0
- package/dist/chains/solana/dex/meteora/e2e/scenarios.d.ts +10 -0
- package/dist/chains/solana/dex/meteora/e2e/test-utils.d.ts +28 -0
- package/dist/chains/solana/dex/meteora/index.d.ts +3 -0
- package/dist/chains/solana/dex/meteora/providers/positionProvider.d.ts +9 -0
- package/dist/chains/solana/dex/meteora/services/MeteoraLpService.d.ts +37 -0
- package/dist/chains/solana/dex/meteora/utils/dlmm.d.ts +6 -0
- package/dist/chains/solana/dex/meteora/utils/loadWallet.d.ts +14 -0
- package/dist/chains/solana/dex/meteora/utils/sendTransaction.d.ts +2 -0
- package/dist/chains/solana/dex/orca/index.d.ts +6 -0
- package/dist/chains/solana/dex/orca/providers/positionProvider.d.ts +10 -0
- package/dist/chains/solana/dex/orca/services/srv_orca.d.ts +10 -0
- package/dist/chains/solana/dex/orca/types.d.ts +61 -0
- package/dist/chains/solana/dex/orca/utils/loadWallet.d.ts +1 -0
- package/dist/chains/solana/dex/orca/utils/sendTransaction.d.ts +2 -0
- package/dist/chains/solana/dex/raydium/index.d.ts +6 -0
- package/dist/chains/solana/dex/raydium/providers/positionProvider.d.ts +10 -0
- package/dist/chains/solana/dex/raydium/services/srv_raydium.d.ts +104 -0
- package/dist/chains/solana/dex/raydium/types.d.ts +42 -0
- package/dist/chains/solana/environment.d.ts +15 -0
- package/dist/chains/solana/generated/specs/spec-helpers.d.ts +35 -0
- package/dist/chains/solana/generated/specs/specs.d.ts +73 -0
- package/dist/chains/solana/index.browser.d.ts +3 -0
- package/dist/chains/solana/index.d.ts +7 -0
- package/dist/chains/solana/keypairUtils.d.ts +7 -0
- package/dist/chains/solana/prompts.d.ts +12 -0
- package/dist/chains/solana/providers/wallet.d.ts +2 -0
- package/dist/chains/solana/routes/index.d.ts +2 -0
- package/dist/chains/solana/routes/sign.d.ts +16 -0
- package/dist/chains/solana/service.d.ts +237 -0
- package/dist/chains/solana/types.d.ts +377 -0
- package/dist/chains/solana/vitest.config.d.ts +2 -0
- package/dist/chains/wallet-action.d.ts +3 -0
- package/dist/contracts.d.ts +58 -0
- package/dist/core-augmentation.d.ts +9 -0
- package/dist/index.d.mts +27 -34727
- package/dist/index.d.ts +27 -0
- package/dist/index.mjs +28246 -21186
- package/dist/index.mjs.map +153 -0
- package/dist/lib/server-wallet-trade.d.ts +22 -0
- package/dist/lib/server-wallet-trade.js +333 -0
- package/dist/lib/server-wallet-trade.js.map +11 -0
- package/dist/lib/wallet-export-guard.d.ts +45 -0
- package/dist/lp/actions/liquidity.d.ts +2 -0
- package/dist/lp/e2e/real-token-tests.d.ts +6 -0
- package/dist/lp/e2e/scenarios.d.ts +9 -0
- package/dist/lp/e2e/test-utils.d.ts +28 -0
- package/dist/lp/lp-manager-entry.d.ts +18 -0
- package/dist/lp/services/ConcentratedLiquidityService.d.ts +32 -0
- package/dist/lp/services/DexInteractionService.d.ts +34 -0
- package/dist/lp/services/LpManagementService.d.ts +116 -0
- package/dist/lp/services/UserLpProfileService.d.ts +18 -0
- package/dist/lp/services/VaultService.d.ts +21 -0
- package/dist/lp/services/YieldOptimizationService.d.ts +59 -0
- package/dist/lp/services/__tests__/MockLpService.d.ts +17 -0
- package/dist/lp/types.d.ts +439 -0
- package/dist/lp/utils/solanaClient.d.ts +26 -0
- package/dist/plugin.d.ts +7 -0
- package/dist/policy/policy.d.ts +14 -0
- package/dist/providers/canonical-provider.d.ts +19 -0
- package/dist/providers/wallet-provider.d.ts +5 -0
- package/dist/register-routes.d.ts +1 -0
- package/dist/routes/plugin.d.ts +14 -0
- package/dist/routes/wallet-market-overview-route.d.ts +7 -0
- package/dist/sdk/abi.d.ts +396 -0
- package/dist/sdk/bridge/abis.d.ts +63 -0
- package/dist/sdk/bridge/client.d.ts +48 -0
- package/dist/sdk/bridge/index.d.ts +14 -0
- package/dist/sdk/bridge/solana.d.ts +131 -0
- package/dist/sdk/bridge/types.d.ts +92 -0
- package/dist/sdk/convenience.d.ts +104 -0
- package/dist/sdk/escrow/MutualStakeEscrow.d.ts +75 -0
- package/dist/sdk/escrow/types.d.ts +58 -0
- package/dist/sdk/escrow/verifiers.d.ts +25 -0
- package/dist/sdk/identity/erc8004.d.ts +304 -0
- package/dist/sdk/identity/reputation.d.ts +317 -0
- package/dist/sdk/identity/uaid.d.ts +192 -0
- package/dist/sdk/identity/validation.d.ts +282 -0
- package/dist/sdk/index.d.ts +133 -0
- package/dist/sdk/index.js +5284 -0
- package/dist/sdk/index.js.map +40 -0
- package/dist/sdk/policy/SpendingPolicy.d.ts +105 -0
- package/dist/sdk/policy/UptoBillingPolicy.d.ts +87 -0
- package/dist/sdk/router/PaymentRouter.d.ts +77 -0
- package/dist/sdk/router/index.d.ts +2 -0
- package/dist/sdk/swap/SwapModule.d.ts +47 -0
- package/dist/sdk/swap/abi.d.ts +50 -0
- package/dist/sdk/swap/index.d.ts +11 -0
- package/dist/sdk/swap/types.d.ts +101 -0
- package/dist/sdk/tokens/decimals.d.ts +64 -0
- package/dist/sdk/tokens/registry.d.ts +81 -0
- package/dist/sdk/tokens/solana.d.ts +107 -0
- package/dist/sdk/tokens/transfers.d.ts +94 -0
- package/dist/sdk/types.d.ts +129 -0
- package/dist/sdk/wallet-core.d.ts +29450 -0
- package/dist/sdk/x402/budget.d.ts +51 -0
- package/dist/sdk/x402/chains/abstract/index.d.ts +134 -0
- package/dist/sdk/x402/client.d.ts +66 -0
- package/dist/sdk/x402/index.d.ts +8 -0
- package/dist/sdk/x402/middleware.d.ts +37 -0
- package/dist/sdk/x402/multi-asset.d.ts +53 -0
- package/dist/sdk/x402/types.d.ts +109 -0
- package/dist/security/wallet-context-safety.d.ts +7 -0
- package/dist/security/wallet-financial-confirmation.d.ts +23 -0
- package/dist/services/wallet-backend-service.d.ts +39 -0
- package/dist/types/wallet-router.d.ts +130 -0
- package/dist/utils/intent-trajectory.d.ts +34 -0
- package/dist/wallet/backend.d.ts +41 -0
- package/dist/wallet/errors.d.ts +17 -0
- package/dist/wallet/index.d.ts +6 -0
- package/dist/wallet/local-eoa-backend.d.ts +37 -0
- package/dist/wallet/pending.d.ts +47 -0
- package/dist/wallet/select-backend.d.ts +11 -0
- package/dist/wallet/steward-backend.d.ts +22 -0
- package/dist/wallet-action.d.ts +1 -0
- package/dist/wallet-action.js +6292 -0
- package/dist/wallet-action.js.map +44 -0
- package/package.json +35 -21
- package/registry-entry.json +134 -0
- package/src/analytics/birdeye/actions/wallet-search-address.ts +85 -5
- package/src/analytics/birdeye/birdeye-task.ts +25 -9
- package/src/analytics/birdeye/birdeye.ts +6 -7
- package/src/analytics/birdeye/constants.ts +0 -1
- package/src/analytics/birdeye/providers/agent-portfolio-provider.ts +0 -1
- package/src/analytics/birdeye/providers/market.ts +51 -45
- package/src/analytics/birdeye/providers/portfolio-factory.ts +79 -38
- package/src/analytics/birdeye/providers/trending.ts +43 -46
- package/src/analytics/birdeye/providers/wallet.ts +0 -1
- package/src/analytics/birdeye/search-category.test.ts +1 -1
- package/src/analytics/birdeye/search-category.ts +77 -12
- package/src/analytics/birdeye/service.test.ts +146 -0
- package/src/analytics/birdeye/service.ts +220 -105
- package/src/analytics/birdeye/types/api/common.ts +0 -1
- package/src/analytics/birdeye/types/api/defi.ts +0 -1
- package/src/analytics/birdeye/types/api/pair.ts +0 -1
- package/src/analytics/birdeye/types/api/search.ts +0 -1
- package/src/analytics/birdeye/types/api/token.ts +0 -1
- package/src/analytics/birdeye/types/api/trader.ts +0 -1
- package/src/analytics/birdeye/types/api/wallet.ts +0 -1
- package/src/analytics/birdeye/types/shared.ts +0 -11
- package/src/analytics/birdeye/utils.test.ts +69 -0
- package/src/analytics/birdeye/utils.ts +11 -8
- package/src/analytics/dexscreener/search-category.ts +0 -1
- package/src/analytics/dexscreener/service.ts +7 -12
- package/src/analytics/dexscreener/types.ts +0 -1
- package/src/analytics/lpinfo/index.ts +5 -2
- package/src/analytics/lpinfo/kamino/README.md +2 -2
- package/src/analytics/lpinfo/kamino/index.ts +9 -2
- package/src/analytics/lpinfo/kamino/providers/kaminoLiquidityProvider.ts +6 -26
- package/src/analytics/lpinfo/kamino/providers/kaminoPoolProvider.ts +11 -12
- package/src/analytics/lpinfo/kamino/providers/kaminoProvider.ts +76 -32
- package/src/analytics/lpinfo/kamino/services/kaminoLiquidityService.ts +78 -38
- package/src/analytics/lpinfo/kamino/services/kaminoService.ts +71 -31
- package/src/analytics/lpinfo/steer/index.ts +7 -2
- package/src/analytics/lpinfo/steer/providers/steerLiquidityProvider.ts +25 -26
- package/src/analytics/lpinfo/steer/services/steerLiquidityService.ts +367 -149
- package/src/analytics/news/index.ts +7 -2
- package/src/analytics/news/interfaces/types.ts +0 -1
- package/src/analytics/news/providers/defiNewsProvider.ts +17 -44
- package/src/analytics/news/services/newsDataService.ts +1 -22
- package/src/analytics/news/utils/formatters.test.ts +60 -0
- package/src/analytics/news/utils/formatters.ts +0 -1
- package/src/analytics/token-info/action.ts +52 -212
- package/src/analytics/token-info/index.ts +1 -1
- package/src/analytics/token-info/params.test.ts +69 -0
- package/src/analytics/token-info/params.ts +13 -11
- package/src/analytics/token-info/providers.ts +46 -17
- package/src/analytics/token-info/service.ts +3 -3
- package/src/analytics/token-info/types.ts +2 -2
- package/src/api/wallet-routes.test.ts +56 -0
- package/src/api/wallet-routes.ts +1728 -0
- package/src/audit/audit-log.ts +57 -2
- package/src/browser-shim/build-shim.ts +1 -1
- package/src/browser-shim/shim.template.js +107 -117
- package/src/chains/{wallet-router.test.ts → __tests__/wallet-router.test.ts} +57 -10
- package/src/chains/evm/actions/helpers.ts +9 -7
- package/src/chains/evm/actions/swap.ts +176 -22
- package/src/chains/evm/actions/transfer.ts +29 -22
- package/src/chains/evm/biome.json +1 -1
- package/src/chains/evm/build.ts +6 -1
- package/src/chains/evm/constants.ts +19 -0
- package/src/chains/evm/contracts/artifacts/OZGovernor.json +25 -1682
- package/src/chains/evm/dex/aerodrome/index.ts +6 -1
- package/src/chains/evm/dex/aerodrome/services/AerodromeLpService.ts +41 -15
- package/src/chains/evm/dex/aerodrome/types.ts +1 -2
- package/src/chains/evm/dex/pancakeswp/index.ts +6 -1
- package/src/chains/evm/dex/pancakeswp/services/PancakeSwapV3LpService.ts +54 -17
- package/src/chains/evm/dex/pancakeswp/types.ts +1 -2
- package/src/chains/evm/dex/uniswap/index.ts +6 -1
- package/src/chains/evm/dex/uniswap/services/UniswapV3LpService.ts +20 -9
- package/src/chains/evm/dex/uniswap/types.ts +1 -2
- package/src/chains/evm/gov-router.ts +3 -1
- package/src/chains/evm/index.browser.ts +1 -1
- package/src/chains/evm/index.ts +5 -1
- package/src/chains/evm/prompts.ts +5 -0
- package/src/chains/evm/providers/get-balance.ts +1 -1
- package/src/chains/evm/providers/wallet.ts +80 -9
- package/src/chains/evm/routes/sign.ts +35 -26
- package/src/chains/evm/rpc-providers.ts +1 -1
- package/src/chains/evm/types/index.ts +22 -2
- package/src/chains/registry.ts +1 -1
- package/src/chains/wallet-action.ts +301 -91
- package/src/index.ts +9 -5
- package/src/lib/wallet-export-guard.test.ts +233 -0
- package/src/lib/wallet-export-guard.ts +1 -1
- package/src/lp/actions/liquidity.ts +53 -26
- package/src/lp/e2e/real-token-tests.ts +0 -1
- package/src/lp/e2e/scenarios.ts +1 -2
- package/src/lp/e2e/test-utils.ts +20 -7
- package/src/lp/lp-manager-entry.ts +2 -5
- package/src/lp/services/ConcentratedLiquidityService.ts +3 -10
- package/src/lp/services/DexInteractionService.ts +1 -2
- package/src/lp/services/LpManagementService.test.ts +0 -1
- package/src/lp/services/LpManagementService.ts +75 -35
- package/src/lp/services/UserLpProfileService.ts +2 -3
- package/src/lp/services/VaultService.ts +10 -4
- package/src/lp/services/YieldOptimizationService.ts +29 -13
- package/src/lp/services/__tests__/MockLpService.ts +1 -2
- package/src/lp/types.ts +9 -13
- package/src/lp/utils/solanaClient.ts +4 -2
- package/src/plugin.routes.test.ts +24 -0
- package/src/plugin.ts +30 -13
- package/src/providers/canonical-provider.ts +1 -1
- package/src/providers/{unified-wallet-provider.ts → wallet-provider.ts} +3 -3
- package/src/routes/__fixtures__/coingecko-markets.recorded.json +97 -0
- package/src/routes/wallet-market-overview-route.ts +1 -1
- package/src/routes/wallet-market-overview.contract.test.ts +139 -0
- package/src/routes/wallet-market-overview.real.test.ts +83 -0
- package/src/sdk/escrow/MutualStakeEscrow.ts +1 -2
- package/src/sdk/identity/erc8004.ts +1 -1
- package/src/sdk/identity/validation.ts +3 -4
- package/src/sdk/index.ts +2 -2
- package/src/sdk/policy/SpendingPolicy.ts +1 -1
- package/src/sdk/router/PaymentRouter.ts +8 -11
- package/src/sdk/swap/SwapModule.ts +1 -1
- package/src/sdk/tokens/registry.ts +1 -1
- package/src/sdk/x402/middleware.ts +2 -8
- package/src/security/__tests__/wallet-context-safety.test.ts +79 -0
- package/src/security/__tests__/wallet-financial-confirmation.test.ts +88 -0
- package/src/security/wallet-context-safety.ts +128 -0
- package/src/security/wallet-financial-confirmation.ts +150 -0
- package/src/services/wallet-backend-service.ts +15 -1
- package/src/utils/intent-trajectory.ts +2 -2
- package/src/wallet/steward-backend.ts +4 -4
- package/dist/LpManagementService-BWrQ5-cO.mjs +0 -353
- package/dist/MockLpService-D_Apn4Fd.mjs +0 -99
- package/dist/aerodrome-CfnESC32.mjs +0 -890
- package/dist/chunk-hT5z_Zn9.mjs +0 -35
- package/dist/lib/server-wallet-trade.d.mts +0 -34
- package/dist/lib/server-wallet-trade.mjs +0 -306
- package/dist/meteora-BPX39hZo.mjs +0 -22640
- package/dist/orca-Bybp1HXO.mjs +0 -249
- package/dist/pancakeswp-CkEXlXti.mjs +0 -604
- package/dist/plugin-ZO_MTyd0.mjs +0 -529
- package/dist/raydium-rfaM9yEf.mjs +0 -539
- package/dist/sdk/index.d.mts +0 -32492
- package/dist/sdk/index.mjs +0 -6415
- package/dist/types-D5252NZk.mjs +0 -487
- package/dist/uniswap-CReXgXVN.mjs +0 -573
- package/dist/wallet-action.d.mts +0 -6
- package/dist/wallet-action.mjs +0 -820
- package/src/analytics/birdeye/tasks/birdeye.ts +0 -232
- package/src/analytics/lpinfo/index.d.ts +0 -7
- package/src/chains/evm/contracts/artifacts/TimelockController.json +0 -1007
- package/src/chains/evm/contracts/artifacts/VoteToken.json +0 -895
- package/src/lp/tasks/LpAutoRebalanceTask.ts +0 -117
- package/src/lp/tasks/__tests__/LpAutoRebalanceTask.test.ts +0 -370
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// @ts-nocheck — legacy code from absorbed plugins (lp-manager, lpinfo, dexscreener, defi-news, birdeye); strict types pending cleanup
|
|
2
|
-
|
|
3
1
|
import {
|
|
4
2
|
type RouteSpec,
|
|
5
3
|
resolveCloudRoute,
|
|
@@ -13,6 +11,25 @@ import {
|
|
|
13
11
|
import Birdeye from "./birdeye-task";
|
|
14
12
|
import { BIRDEYE_ENDPOINTS, BIRDEYE_SERVICE_NAME } from "./constants";
|
|
15
13
|
import { searchBirdeyeTokens } from "./search-category";
|
|
14
|
+
import type { DefiMultiPriceResponse } from "./types/api/defi";
|
|
15
|
+
import type {
|
|
16
|
+
TokenMarketSearchParams,
|
|
17
|
+
TokenMarketSearchResponse,
|
|
18
|
+
} from "./types/api/search";
|
|
19
|
+
import type {
|
|
20
|
+
TokenMarketDataParams,
|
|
21
|
+
TokenMarketDataResponse,
|
|
22
|
+
TokenOverviewParams,
|
|
23
|
+
TokenOverviewResponse,
|
|
24
|
+
TokenSecurityParams,
|
|
25
|
+
TokenSecurityResponse,
|
|
26
|
+
TokenTradeDataSingleParams,
|
|
27
|
+
TokenTradeDataSingleResponse,
|
|
28
|
+
} from "./types/api/token";
|
|
29
|
+
import type {
|
|
30
|
+
WalletPortfolioResponse,
|
|
31
|
+
WalletTransactionHistoryResponse,
|
|
32
|
+
} from "./types/api/wallet";
|
|
16
33
|
import type {
|
|
17
34
|
BirdeyeSupportedChain,
|
|
18
35
|
GetCacheTimedOptions,
|
|
@@ -34,6 +51,8 @@ const CACHE_DEFAULTS = {
|
|
|
34
51
|
TOKEN_TRADE_DATA_TTL: 30 * 60 * 1000,
|
|
35
52
|
// Token security data cache (30 minutes)
|
|
36
53
|
TOKEN_SECURITY_DATA_TTL: 30 * 60 * 1000,
|
|
54
|
+
// Token price/liquidity cache (30 seconds)
|
|
55
|
+
TOKEN_MARKET_DATA_TTL: 30 * 1000,
|
|
37
56
|
};
|
|
38
57
|
|
|
39
58
|
// 'solana' | 'base' | 'ethereum'
|
|
@@ -43,6 +62,44 @@ type CacheWrapper<T> = {
|
|
|
43
62
|
data: T;
|
|
44
63
|
setAt: number;
|
|
45
64
|
};
|
|
65
|
+
|
|
66
|
+
type BirdeyeHeaders = { headers?: Record<string, string> };
|
|
67
|
+
|
|
68
|
+
type BirdeyeMultiPriceItem = NonNullable<
|
|
69
|
+
DefiMultiPriceResponse["data"][string]
|
|
70
|
+
> & {
|
|
71
|
+
priceInNative?: number;
|
|
72
|
+
liquidity?: number;
|
|
73
|
+
market_cap?: number;
|
|
74
|
+
marketcap?: number;
|
|
75
|
+
mc?: number;
|
|
76
|
+
realMc?: number;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
type BirdeyeMultiPriceResponse = Omit<DefiMultiPriceResponse, "data"> & {
|
|
80
|
+
data: Record<string, BirdeyeMultiPriceItem | undefined>;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export interface BirdeyeTokenMarketSnapshot {
|
|
84
|
+
symbol?: string;
|
|
85
|
+
priceUsd: number;
|
|
86
|
+
priceSol?: number;
|
|
87
|
+
liquidity: number;
|
|
88
|
+
priceChange24h: number;
|
|
89
|
+
marketCapUsd?: number;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
type WalletTransaction =
|
|
93
|
+
WalletTransactionHistoryResponse["data"][string][number];
|
|
94
|
+
|
|
95
|
+
function firstFiniteNumber(...values: unknown[]): number | undefined {
|
|
96
|
+
for (const value of values) {
|
|
97
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
46
103
|
export class BirdeyeService extends Service {
|
|
47
104
|
static serviceType: string = BIRDEYE_SERVICE_NAME;
|
|
48
105
|
capabilityDescription = "BirdEye data access";
|
|
@@ -84,11 +141,11 @@ export class BirdeyeService extends Service {
|
|
|
84
141
|
};
|
|
85
142
|
}
|
|
86
143
|
|
|
87
|
-
private async fetchBirdeyeJson(
|
|
144
|
+
private async fetchBirdeyeJson<T>(
|
|
88
145
|
path: string,
|
|
89
|
-
params:
|
|
146
|
+
params: object = {},
|
|
90
147
|
options: { headers?: Record<string, string> } = {},
|
|
91
|
-
) {
|
|
148
|
+
): Promise<T> {
|
|
92
149
|
const chain = options.headers?.["x-chain"] ?? "solana";
|
|
93
150
|
const cleanParams = Object.fromEntries(
|
|
94
151
|
Object.entries(params).filter(([, value]) => value !== undefined),
|
|
@@ -111,12 +168,14 @@ export class BirdeyeService extends Service {
|
|
|
111
168
|
`Birdeye API error ${response.status}: ${errorText || response.statusText}`,
|
|
112
169
|
);
|
|
113
170
|
}
|
|
114
|
-
return response.json()
|
|
171
|
+
return response.json() as Promise<T>;
|
|
115
172
|
}
|
|
116
173
|
|
|
117
|
-
async fetchSearchTokenMarketData(
|
|
174
|
+
async fetchSearchTokenMarketData(
|
|
175
|
+
params: TokenMarketSearchParams,
|
|
176
|
+
): Promise<TokenMarketSearchResponse> {
|
|
118
177
|
const chain = typeof params.chain === "string" ? params.chain : "solana";
|
|
119
|
-
return this.fetchBirdeyeJson(
|
|
178
|
+
return this.fetchBirdeyeJson<TokenMarketSearchResponse>(
|
|
120
179
|
BIRDEYE_ENDPOINTS.search.token_market,
|
|
121
180
|
params,
|
|
122
181
|
{
|
|
@@ -126,10 +185,10 @@ export class BirdeyeService extends Service {
|
|
|
126
185
|
}
|
|
127
186
|
|
|
128
187
|
async fetchTokenOverview(
|
|
129
|
-
params:
|
|
130
|
-
options:
|
|
131
|
-
) {
|
|
132
|
-
return this.fetchBirdeyeJson(
|
|
188
|
+
params: TokenOverviewParams,
|
|
189
|
+
options: BirdeyeHeaders = {},
|
|
190
|
+
): Promise<TokenOverviewResponse> {
|
|
191
|
+
return this.fetchBirdeyeJson<TokenOverviewResponse>(
|
|
133
192
|
BIRDEYE_ENDPOINTS.token.overview,
|
|
134
193
|
params,
|
|
135
194
|
options,
|
|
@@ -137,10 +196,10 @@ export class BirdeyeService extends Service {
|
|
|
137
196
|
}
|
|
138
197
|
|
|
139
198
|
async fetchTokenMarketData(
|
|
140
|
-
params:
|
|
141
|
-
options:
|
|
142
|
-
) {
|
|
143
|
-
return this.fetchBirdeyeJson(
|
|
199
|
+
params: TokenMarketDataParams,
|
|
200
|
+
options: BirdeyeHeaders = {},
|
|
201
|
+
): Promise<TokenMarketDataResponse> {
|
|
202
|
+
return this.fetchBirdeyeJson<TokenMarketDataResponse>(
|
|
144
203
|
BIRDEYE_ENDPOINTS.token.market_data,
|
|
145
204
|
params,
|
|
146
205
|
options,
|
|
@@ -148,10 +207,10 @@ export class BirdeyeService extends Service {
|
|
|
148
207
|
}
|
|
149
208
|
|
|
150
209
|
async fetchTokenSecurityByAddress(
|
|
151
|
-
params:
|
|
152
|
-
options:
|
|
153
|
-
) {
|
|
154
|
-
return this.fetchBirdeyeJson(
|
|
210
|
+
params: TokenSecurityParams,
|
|
211
|
+
options: BirdeyeHeaders = {},
|
|
212
|
+
): Promise<TokenSecurityResponse> {
|
|
213
|
+
return this.fetchBirdeyeJson<TokenSecurityResponse>(
|
|
155
214
|
BIRDEYE_ENDPOINTS.token.security,
|
|
156
215
|
params,
|
|
157
216
|
options,
|
|
@@ -159,10 +218,10 @@ export class BirdeyeService extends Service {
|
|
|
159
218
|
}
|
|
160
219
|
|
|
161
220
|
async fetchTokenTradeDataSingle(
|
|
162
|
-
params:
|
|
163
|
-
options:
|
|
164
|
-
) {
|
|
165
|
-
return this.fetchBirdeyeJson(
|
|
221
|
+
params: TokenTradeDataSingleParams,
|
|
222
|
+
options: BirdeyeHeaders = {},
|
|
223
|
+
): Promise<TokenTradeDataSingleResponse> {
|
|
224
|
+
return this.fetchBirdeyeJson<TokenTradeDataSingleResponse>(
|
|
166
225
|
BIRDEYE_ENDPOINTS.token.trade_data_single,
|
|
167
226
|
params,
|
|
168
227
|
options,
|
|
@@ -197,15 +256,15 @@ export class BirdeyeService extends Service {
|
|
|
197
256
|
try {
|
|
198
257
|
validatedChain = extractChain(undefined, chain);
|
|
199
258
|
} catch (error) {
|
|
200
|
-
this.runtime.logger
|
|
259
|
+
this.runtime.logger.warn(
|
|
201
260
|
`getTrendingTokensForChain: ${error instanceof Error ? error.message : String(error)}`,
|
|
202
261
|
);
|
|
203
262
|
return { data: [], setAt: Date.now() };
|
|
204
263
|
}
|
|
205
264
|
|
|
206
|
-
// Don't allow 'evm' as a trending chain
|
|
265
|
+
// Don't allow 'evm' as a trending chain; callers must choose a concrete chain.
|
|
207
266
|
if (validatedChain === "evm") {
|
|
208
|
-
this.runtime.logger
|
|
267
|
+
this.runtime.logger.warn(
|
|
209
268
|
`getTrendingTokensForChain: 'evm' is not a specific chain. Use ethereum, arbitrum, polygon, etc.`,
|
|
210
269
|
);
|
|
211
270
|
return { data: [], setAt: Date.now() };
|
|
@@ -291,7 +350,7 @@ export class BirdeyeService extends Service {
|
|
|
291
350
|
|
|
292
351
|
const byKey = new Map<string, IToken>();
|
|
293
352
|
for (const t of fetched) {
|
|
294
|
-
const key = t.address
|
|
353
|
+
const key = t.address.toLowerCase() || `${t.chain}:${t.rank}`;
|
|
295
354
|
if (!byKey.has(key)) {
|
|
296
355
|
byKey.set(key, t);
|
|
297
356
|
}
|
|
@@ -303,7 +362,7 @@ export class BirdeyeService extends Service {
|
|
|
303
362
|
try {
|
|
304
363
|
await this.runtime.setCache<CacheWrapper<IToken[]>>(cacheKey, output);
|
|
305
364
|
} catch (e) {
|
|
306
|
-
this.runtime.logger
|
|
365
|
+
this.runtime.logger.warn(
|
|
307
366
|
`setCache failed for ${chain}: ${e instanceof Error ? e.message : String(e)}`,
|
|
308
367
|
);
|
|
309
368
|
}
|
|
@@ -330,15 +389,17 @@ export class BirdeyeService extends Service {
|
|
|
330
389
|
|
|
331
390
|
return out;
|
|
332
391
|
} catch (error) {
|
|
333
|
-
this.runtime.logger
|
|
392
|
+
this.runtime.logger.error(
|
|
334
393
|
`Failed to sync trending tokens: ${error instanceof Error ? error.message : String(error)}`,
|
|
335
394
|
);
|
|
336
395
|
throw error;
|
|
337
396
|
}
|
|
338
397
|
}
|
|
339
398
|
|
|
340
|
-
|
|
341
|
-
|
|
399
|
+
async getTokenMarketData(
|
|
400
|
+
tokenAddress: string,
|
|
401
|
+
chain = "solana",
|
|
402
|
+
): Promise<
|
|
342
403
|
| {
|
|
343
404
|
price: number;
|
|
344
405
|
marketCap: number;
|
|
@@ -356,15 +417,15 @@ export class BirdeyeService extends Service {
|
|
|
356
417
|
const [response, volResponse, priceHistoryResponse] = await Promise.all([
|
|
357
418
|
fetch(
|
|
358
419
|
`${this.birdeyeUrl("defi/v3/token/market-data")}?address=${tokenAddress}`,
|
|
359
|
-
this.getBirdeyeFetchOptions(),
|
|
420
|
+
this.getBirdeyeFetchOptions(chain),
|
|
360
421
|
),
|
|
361
422
|
fetch(
|
|
362
423
|
`${this.birdeyeUrl("defi/price_volume/single")}?address=${tokenAddress}&type=24h`,
|
|
363
|
-
this.getBirdeyeFetchOptions(),
|
|
424
|
+
this.getBirdeyeFetchOptions(chain),
|
|
364
425
|
),
|
|
365
426
|
fetch(
|
|
366
427
|
`${this.birdeyeUrl("defi/history_price")}?address=${tokenAddress}&address_type=token&type=15m`,
|
|
367
|
-
this.getBirdeyeFetchOptions(),
|
|
428
|
+
this.getBirdeyeFetchOptions(chain),
|
|
368
429
|
),
|
|
369
430
|
]);
|
|
370
431
|
|
|
@@ -415,8 +476,8 @@ export class BirdeyeService extends Service {
|
|
|
415
476
|
// has a lot of data
|
|
416
477
|
|
|
417
478
|
/*
|
|
418
|
-
async getTokensTradeData(chain: string, tokenAddresses: string[]): Promise<
|
|
419
|
-
const tokenDb: Record<string,
|
|
479
|
+
async getTokensTradeData(chain: string, tokenAddresses: string[]): Promise<unknown> {
|
|
480
|
+
const tokenDb: Record<string, unknown> = {};
|
|
420
481
|
const chunkArray = (arr: string[], size: number) =>
|
|
421
482
|
arr.map((_, i) => (i % size === 0 ? arr.slice(i, i + size) : null)).filter(Boolean);
|
|
422
483
|
const twenties = chunkArray(tokenAddresses, 20);
|
|
@@ -437,14 +498,16 @@ export class BirdeyeService extends Service {
|
|
|
437
498
|
tokenAddress: string,
|
|
438
499
|
frames = "2h,8h,24h",
|
|
439
500
|
options: GetCacheTimedOptions = {},
|
|
440
|
-
): Promise<
|
|
501
|
+
): Promise<TokenTradeDataSingleResponse | false> {
|
|
441
502
|
const key = `birdeye_tokenTradeData_${chain}_${tokenAddress}_${frames}`;
|
|
442
503
|
const tsInMs = options.tsInMs ?? CACHE_DEFAULTS.TOKEN_TRADE_DATA_TTL;
|
|
443
504
|
const notOlderThan =
|
|
444
505
|
options.notOlderThan ?? CACHE_DEFAULTS.TOKEN_TRADE_DATA_TTL;
|
|
445
506
|
|
|
446
507
|
// Check cache
|
|
447
|
-
const cached = await this.getCacheTimed<
|
|
508
|
+
const cached = await this.getCacheTimed<TokenTradeDataSingleResponse>(key, {
|
|
509
|
+
notOlderThan,
|
|
510
|
+
});
|
|
448
511
|
if (cached) {
|
|
449
512
|
return cached;
|
|
450
513
|
}
|
|
@@ -455,13 +518,13 @@ export class BirdeyeService extends Service {
|
|
|
455
518
|
`${this.birdeyeUrl("defi/v3/token/trade-data/single")}?address=${tokenAddress}&frames=${frames}`,
|
|
456
519
|
this.getBirdeyeFetchOptions(chain),
|
|
457
520
|
);
|
|
458
|
-
const data = await resp.json();
|
|
521
|
+
const data = (await resp.json()) as TokenTradeDataSingleResponse;
|
|
459
522
|
if (data) {
|
|
460
523
|
this.setCacheTimed(key, data, tsInMs);
|
|
461
524
|
}
|
|
462
525
|
return data;
|
|
463
526
|
} catch (e) {
|
|
464
|
-
this.runtime.logger
|
|
527
|
+
this.runtime.logger.error(
|
|
465
528
|
`birdeye:getTokenTradeData - ${e instanceof Error ? e.message : String(e)}`,
|
|
466
529
|
);
|
|
467
530
|
return false;
|
|
@@ -472,8 +535,8 @@ export class BirdeyeService extends Service {
|
|
|
472
535
|
// https://public-api.birdeye.so/defi/price_volume/multi
|
|
473
536
|
// getting 500s
|
|
474
537
|
/*
|
|
475
|
-
async getTokensPriceVolume(tokenAddresses: string[], type = '24h'): Promise<
|
|
476
|
-
const tokenDb: Record<string,
|
|
538
|
+
async getTokensPriceVolume(tokenAddresses: string[], type = '24h'): Promise<unknown> {
|
|
539
|
+
const tokenDb: Record<string, unknown> = {};
|
|
477
540
|
const chunkArray = (arr: string[], size: number) =>
|
|
478
541
|
arr.map((_, i) => (i % size === 0 ? arr.slice(i, i + size) : null)).filter(Boolean);
|
|
479
542
|
const fities = chunkArray(tokenAddresses, 50);
|
|
@@ -509,31 +572,60 @@ export class BirdeyeService extends Service {
|
|
|
509
572
|
// [Defi] Price - Multiple max 100 (all)
|
|
510
573
|
// https://public-api.birdeye.so/defi/multi_price
|
|
511
574
|
// Batch CU Cost = N^0.8 × 5 (base cost of a single call) (n_max: 100)
|
|
512
|
-
// FIXME: caching
|
|
513
575
|
async getTokensMarketData(
|
|
514
576
|
chain: string,
|
|
515
577
|
tokenAddresses: string[],
|
|
516
|
-
|
|
517
|
-
|
|
578
|
+
options: GetCacheTimedOptions = {},
|
|
579
|
+
): Promise<Record<string, BirdeyeTokenMarketSnapshot | undefined>> {
|
|
580
|
+
const tokenDb: Record<string, BirdeyeTokenMarketSnapshot | undefined> = {};
|
|
581
|
+
const notOlderThan =
|
|
582
|
+
options.notOlderThan ?? CACHE_DEFAULTS.TOKEN_MARKET_DATA_TTL;
|
|
583
|
+
const tsInMs = options.tsInMs ?? Date.now();
|
|
584
|
+
const cacheKeyFor = (address: string) =>
|
|
585
|
+
`birdeye_tokens_${chain}_${address}`;
|
|
518
586
|
|
|
519
587
|
// Initialize all token addresses as undefined so we know they were checked
|
|
520
588
|
for (const ca of tokenAddresses) {
|
|
521
589
|
tokenDb[ca] = undefined;
|
|
522
590
|
}
|
|
523
591
|
|
|
524
|
-
|
|
592
|
+
try {
|
|
593
|
+
const cacheEntries = await Promise.all(
|
|
594
|
+
tokenAddresses.map(async (address) => {
|
|
595
|
+
const wrapper = await this.runtime.getCache<
|
|
596
|
+
CacheWrapper<BirdeyeTokenMarketSnapshot | undefined>
|
|
597
|
+
>(cacheKeyFor(address));
|
|
598
|
+
if (!wrapper) {
|
|
599
|
+
return { address, cached: false, data: undefined };
|
|
600
|
+
}
|
|
601
|
+
const isFresh = Date.now() - wrapper.setAt <= notOlderThan;
|
|
602
|
+
return {
|
|
603
|
+
address,
|
|
604
|
+
cached: isFresh,
|
|
605
|
+
data: isFresh ? wrapper.data : undefined,
|
|
606
|
+
};
|
|
607
|
+
}),
|
|
608
|
+
);
|
|
609
|
+
|
|
610
|
+
const uncachedAddresses: string[] = [];
|
|
611
|
+
for (const entry of cacheEntries) {
|
|
612
|
+
if (entry.cached) {
|
|
613
|
+
tokenDb[entry.address] = entry.data;
|
|
614
|
+
} else {
|
|
615
|
+
uncachedAddresses.push(entry.address);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
525
618
|
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
619
|
+
if (!uncachedAddresses.length) {
|
|
620
|
+
return tokenDb;
|
|
621
|
+
}
|
|
529
622
|
|
|
530
|
-
|
|
531
|
-
const chunkArray = (arr: string[], size: number) =>
|
|
623
|
+
const chunkArray = (arr: string[], size: number): string[][] =>
|
|
532
624
|
arr
|
|
533
625
|
.map((_, i) => (i % size === 0 ? arr.slice(i, i + size) : null))
|
|
534
|
-
.filter(
|
|
626
|
+
.filter((chunk): chunk is string[] => chunk !== null);
|
|
535
627
|
|
|
536
|
-
const hundos = chunkArray(
|
|
628
|
+
const hundos = chunkArray(uncachedAddresses, 100);
|
|
537
629
|
//console.log('getTokensMarketData hundos', hundos)
|
|
538
630
|
|
|
539
631
|
// Track batches with their addresses for cache management
|
|
@@ -560,7 +652,9 @@ export class BirdeyeService extends Service {
|
|
|
560
652
|
batchesWithAddresses.map((b) => b.promise),
|
|
561
653
|
);
|
|
562
654
|
const multipriceData = await Promise.all(
|
|
563
|
-
multipriceResps.map(
|
|
655
|
+
multipriceResps.map(
|
|
656
|
+
(resp) => resp.json() as Promise<BirdeyeMultiPriceResponse>,
|
|
657
|
+
),
|
|
564
658
|
);
|
|
565
659
|
|
|
566
660
|
//const now = Date.now()
|
|
@@ -571,16 +665,16 @@ export class BirdeyeService extends Service {
|
|
|
571
665
|
|
|
572
666
|
// Guard against undefined/null mpd or missing data
|
|
573
667
|
if (!mpd?.data || !mpd.success) {
|
|
574
|
-
this.runtime.logger
|
|
668
|
+
this.runtime.logger.warn(
|
|
575
669
|
`birdeye:getTokensMarketData - batch failed (${batchAddresses.length} addresses), caching all as failed`,
|
|
576
670
|
);
|
|
577
671
|
|
|
578
|
-
// Cache all addresses in this failed batch
|
|
579
672
|
for (const ca of batchAddresses) {
|
|
580
|
-
await this.runtime.setCache
|
|
673
|
+
await this.runtime.setCache<
|
|
674
|
+
CacheWrapper<BirdeyeTokenMarketSnapshot | undefined>
|
|
675
|
+
>(cacheKeyFor(ca), {
|
|
581
676
|
data: undefined,
|
|
582
|
-
setAt:
|
|
583
|
-
ttl: 5 * 60 * 1000, // 5 minutes for failed batch lookups
|
|
677
|
+
setAt: tsInMs,
|
|
584
678
|
});
|
|
585
679
|
}
|
|
586
680
|
continue;
|
|
@@ -590,7 +684,7 @@ export class BirdeyeService extends Service {
|
|
|
590
684
|
for (const ca of batchAddresses) {
|
|
591
685
|
const t = mpd.data[ca];
|
|
592
686
|
|
|
593
|
-
if (t) {
|
|
687
|
+
if (t && typeof t.value === "number") {
|
|
594
688
|
/*
|
|
595
689
|
t {
|
|
596
690
|
isScaledUiToken: false,
|
|
@@ -602,36 +696,43 @@ export class BirdeyeService extends Service {
|
|
|
602
696
|
liquidity: 1323844.6216610295,
|
|
603
697
|
}
|
|
604
698
|
*/
|
|
605
|
-
|
|
699
|
+
const marketSnapshot: BirdeyeTokenMarketSnapshot = {
|
|
606
700
|
//provider: 'birdeye',
|
|
607
701
|
//chain: 'solana',
|
|
608
702
|
//address: ca,
|
|
609
703
|
priceUsd: t.value,
|
|
610
704
|
priceSol: t.priceInNative,
|
|
611
|
-
liquidity: t.liquidity,
|
|
612
|
-
priceChange24h: t.priceChange24h,
|
|
613
|
-
|
|
705
|
+
liquidity: t.liquidity ?? 0,
|
|
706
|
+
priceChange24h: t.priceChange24h ?? 0,
|
|
707
|
+
marketCapUsd: firstFiniteNumber(
|
|
708
|
+
t.market_cap,
|
|
709
|
+
t.marketcap,
|
|
710
|
+
t.mc,
|
|
711
|
+
t.realMc,
|
|
712
|
+
),
|
|
614
713
|
//volume24hUSD
|
|
615
714
|
};
|
|
616
|
-
|
|
617
|
-
this.runtime.logger
|
|
715
|
+
tokenDb[ca] = marketSnapshot;
|
|
716
|
+
this.runtime.logger.debug(
|
|
618
717
|
`birdeye:getTokensMarketData - caching token ${ca}`,
|
|
619
718
|
);
|
|
620
719
|
// Cache successful lookups with full TTL
|
|
621
|
-
await this.runtime.setCache<
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
720
|
+
await this.runtime.setCache<
|
|
721
|
+
CacheWrapper<BirdeyeTokenMarketSnapshot>
|
|
722
|
+
>(cacheKeyFor(ca), {
|
|
723
|
+
data: marketSnapshot,
|
|
724
|
+
setAt: tsInMs,
|
|
725
|
+
});
|
|
625
726
|
} else {
|
|
626
727
|
// Token was in batch but has no valid data (or not in response)
|
|
627
|
-
this.runtime.logger
|
|
728
|
+
this.runtime.logger.warn(
|
|
628
729
|
`${ca} no valid data in response: ${JSON.stringify(t)}`,
|
|
629
730
|
);
|
|
630
|
-
|
|
631
|
-
|
|
731
|
+
await this.runtime.setCache<
|
|
732
|
+
CacheWrapper<BirdeyeTokenMarketSnapshot | undefined>
|
|
733
|
+
>(cacheKeyFor(ca), {
|
|
632
734
|
data: undefined,
|
|
633
|
-
setAt:
|
|
634
|
-
ttl: 5 * 60 * 1000, // 5 minutes for failed lookups
|
|
735
|
+
setAt: tsInMs,
|
|
635
736
|
});
|
|
636
737
|
}
|
|
637
738
|
}
|
|
@@ -653,14 +754,16 @@ export class BirdeyeService extends Service {
|
|
|
653
754
|
chain: string,
|
|
654
755
|
tokenAddress: string,
|
|
655
756
|
options: GetCacheTimedOptions = {},
|
|
656
|
-
): Promise<
|
|
757
|
+
): Promise<TokenSecurityResponse | false> {
|
|
657
758
|
const key = `birdeye_tokenSecurityData_${chain}_${tokenAddress}`;
|
|
658
759
|
const tsInMs = options.tsInMs ?? CACHE_DEFAULTS.TOKEN_SECURITY_DATA_TTL;
|
|
659
760
|
const notOlderThan =
|
|
660
761
|
options.notOlderThan ?? CACHE_DEFAULTS.TOKEN_SECURITY_DATA_TTL;
|
|
661
762
|
|
|
662
763
|
// Check cache
|
|
663
|
-
const cached = await this.getCacheTimed<
|
|
764
|
+
const cached = await this.getCacheTimed<TokenSecurityResponse>(key, {
|
|
765
|
+
notOlderThan,
|
|
766
|
+
});
|
|
664
767
|
if (cached) {
|
|
665
768
|
return cached;
|
|
666
769
|
}
|
|
@@ -671,13 +774,13 @@ export class BirdeyeService extends Service {
|
|
|
671
774
|
`${this.birdeyeUrl("defi/token_security")}?address=${tokenAddress}`,
|
|
672
775
|
this.getBirdeyeFetchOptions(chain),
|
|
673
776
|
);
|
|
674
|
-
const data = await resp.json();
|
|
777
|
+
const data = (await resp.json()) as TokenSecurityResponse;
|
|
675
778
|
if (data) {
|
|
676
779
|
this.setCacheTimed(key, data, tsInMs);
|
|
677
780
|
}
|
|
678
781
|
return data;
|
|
679
782
|
} catch (e) {
|
|
680
|
-
this.runtime.logger
|
|
783
|
+
this.runtime.logger.error(
|
|
681
784
|
`birdeye:getTokenSecurityData - ${e instanceof Error ? e.message : String(e)}`,
|
|
682
785
|
);
|
|
683
786
|
return false;
|
|
@@ -696,14 +799,16 @@ export class BirdeyeService extends Service {
|
|
|
696
799
|
chain: string,
|
|
697
800
|
ca: string,
|
|
698
801
|
options: GetCacheTimedOptions = {},
|
|
699
|
-
) {
|
|
802
|
+
): Promise<BirdeyeTokenMarketSnapshot | undefined> {
|
|
700
803
|
try {
|
|
701
804
|
const key = `birdeye_token_${chain}_${ca}`;
|
|
702
805
|
const tsInMs = options.tsInMs ?? Date.now(); // only syscall if absolutely needed
|
|
703
806
|
const notOlderThan = options.notOlderThan ?? 30 * 1000; // a reasonable length (in ms)
|
|
704
807
|
|
|
705
808
|
// check cache
|
|
706
|
-
const cache = await this.getCacheTimed<
|
|
809
|
+
const cache = await this.getCacheTimed<BirdeyeTokenMarketSnapshot>(key, {
|
|
810
|
+
notOlderThan,
|
|
811
|
+
});
|
|
707
812
|
if (cache) {
|
|
708
813
|
this.runtime.logger.debug("birdeye:lookupToken - HIT");
|
|
709
814
|
return cache;
|
|
@@ -718,7 +823,7 @@ export class BirdeyeService extends Service {
|
|
|
718
823
|
|
|
719
824
|
return data;
|
|
720
825
|
} catch (e) {
|
|
721
|
-
this.runtime.logger
|
|
826
|
+
this.runtime.logger.error(
|
|
722
827
|
`birdeyeSvr:lookupToken - err: ${e instanceof Error ? e.message : String(e)}`,
|
|
723
828
|
);
|
|
724
829
|
throw e;
|
|
@@ -728,7 +833,7 @@ export class BirdeyeService extends Service {
|
|
|
728
833
|
async lookupTokens(
|
|
729
834
|
chainAndAddresses: Array<{ chain: string; address: string }>,
|
|
730
835
|
options: GetCacheTimedOptions = {},
|
|
731
|
-
) {
|
|
836
|
+
): Promise<Record<string, BirdeyeTokenMarketSnapshot | undefined>> {
|
|
732
837
|
try {
|
|
733
838
|
// Lookup all tokens in parallel
|
|
734
839
|
const results = await Promise.all(
|
|
@@ -738,7 +843,10 @@ export class BirdeyeService extends Service {
|
|
|
738
843
|
);
|
|
739
844
|
|
|
740
845
|
// Transform results into keyed object: key = `${chain}_${address}`
|
|
741
|
-
const keyedResults: Record<
|
|
846
|
+
const keyedResults: Record<
|
|
847
|
+
string,
|
|
848
|
+
BirdeyeTokenMarketSnapshot | undefined
|
|
849
|
+
> = {};
|
|
742
850
|
chainAndAddresses.forEach((cAA, index) => {
|
|
743
851
|
const key = `${cAA.chain}_${cAA.address}`;
|
|
744
852
|
keyedResults[key] = results[index];
|
|
@@ -746,7 +854,7 @@ export class BirdeyeService extends Service {
|
|
|
746
854
|
|
|
747
855
|
return keyedResults;
|
|
748
856
|
} catch (e) {
|
|
749
|
-
this.runtime.logger
|
|
857
|
+
this.runtime.logger.error(
|
|
750
858
|
`birdeyeSvr:lookupTokens - err: ${e instanceof Error ? e.message : String(e)}`,
|
|
751
859
|
);
|
|
752
860
|
throw e;
|
|
@@ -757,28 +865,30 @@ export class BirdeyeService extends Service {
|
|
|
757
865
|
chain: string,
|
|
758
866
|
_params: unknown,
|
|
759
867
|
_options: GetCacheTimedOptions = {},
|
|
760
|
-
) {
|
|
868
|
+
): Promise<TokenMarketSearchResponse> {
|
|
761
869
|
const birdeyeFetchOptions: RequestInit = this.getBirdeyeFetchOptions(chain);
|
|
762
870
|
const res = await fetch(
|
|
763
871
|
`${this.birdeyeUrl("defi/v3/search")}`,
|
|
764
872
|
birdeyeFetchOptions,
|
|
765
873
|
);
|
|
766
|
-
const resp = await res.json();
|
|
767
|
-
this.runtime.logger.log("resp", resp);
|
|
874
|
+
const resp = (await res.json()) as TokenMarketSearchResponse;
|
|
875
|
+
this.runtime.logger.log("resp", JSON.stringify(resp));
|
|
768
876
|
return resp;
|
|
769
877
|
}
|
|
770
878
|
|
|
771
879
|
async lookupSymbolAllChains(
|
|
772
880
|
symbol: string,
|
|
773
881
|
options: GetCacheTimedOptions = {},
|
|
774
|
-
) {
|
|
882
|
+
): Promise<TokenMarketSearchResponse["data"]["items"] | false> {
|
|
775
883
|
// set up cache
|
|
776
884
|
const key = `birdeye_symbol_${symbol}`;
|
|
777
885
|
const tsInMs = options.tsInMs ?? Date.now();
|
|
778
886
|
const notOlderThan = options.notOlderThan ?? 30 * 1000;
|
|
779
887
|
|
|
780
888
|
// check cache
|
|
781
|
-
const cache = await this.getCacheTimed<
|
|
889
|
+
const cache = await this.getCacheTimed<
|
|
890
|
+
TokenMarketSearchResponse["data"]["items"]
|
|
891
|
+
>(key, { notOlderThan });
|
|
782
892
|
if (cache) {
|
|
783
893
|
return cache;
|
|
784
894
|
}
|
|
@@ -789,7 +899,7 @@ export class BirdeyeService extends Service {
|
|
|
789
899
|
`${this.birdeyeUrl("defi/v3/search")}?chain=all&target=token&keyword=${encodeURIComponent(symbol)}`,
|
|
790
900
|
birdeyeFetchOptions,
|
|
791
901
|
);
|
|
792
|
-
const resp = await res.json();
|
|
902
|
+
const resp = (await res.json()) as TokenMarketSearchResponse;
|
|
793
903
|
const data = resp.data.items;
|
|
794
904
|
if (data) {
|
|
795
905
|
this.setCacheTimed(key, data, tsInMs);
|
|
@@ -801,7 +911,7 @@ export class BirdeyeService extends Service {
|
|
|
801
911
|
chain: BirdeyeSupportedChain,
|
|
802
912
|
publicKey: string,
|
|
803
913
|
options: GetCacheTimedOptions = {},
|
|
804
|
-
) {
|
|
914
|
+
): Promise<WalletPortfolioResponse["data"] | false> {
|
|
805
915
|
// Get entire portfolio
|
|
806
916
|
// set up cache
|
|
807
917
|
const key = `birdeye_walletTokenList_${chain}_${publicKey}`;
|
|
@@ -809,7 +919,10 @@ export class BirdeyeService extends Service {
|
|
|
809
919
|
const notOlderThan = options.notOlderThan ?? 30 * 1000;
|
|
810
920
|
|
|
811
921
|
// check cache
|
|
812
|
-
const cache = await this.getCacheTimed<
|
|
922
|
+
const cache = await this.getCacheTimed<WalletPortfolioResponse["data"]>(
|
|
923
|
+
key,
|
|
924
|
+
{ notOlderThan },
|
|
925
|
+
);
|
|
813
926
|
if (cache) {
|
|
814
927
|
return cache;
|
|
815
928
|
}
|
|
@@ -820,8 +933,8 @@ export class BirdeyeService extends Service {
|
|
|
820
933
|
birdeyeFetchOptions,
|
|
821
934
|
);
|
|
822
935
|
|
|
823
|
-
const resp = await res.json();
|
|
824
|
-
const data = resp
|
|
936
|
+
const resp = (await res.json()) as WalletPortfolioResponse;
|
|
937
|
+
const data = resp.data;
|
|
825
938
|
if (data) {
|
|
826
939
|
this.setCacheTimed(key, data, tsInMs);
|
|
827
940
|
}
|
|
@@ -832,14 +945,16 @@ export class BirdeyeService extends Service {
|
|
|
832
945
|
chain: BirdeyeSupportedChain,
|
|
833
946
|
publicKey: string,
|
|
834
947
|
options: GetCacheTimedOptions = {},
|
|
835
|
-
) {
|
|
948
|
+
): Promise<WalletTransaction[] | false> {
|
|
836
949
|
// set up cache
|
|
837
950
|
const key = `birdeye_walletTxList_${chain}_${publicKey}`;
|
|
838
951
|
const tsInMs = options.tsInMs ?? Date.now();
|
|
839
952
|
const notOlderThan = options.notOlderThan ?? 30 * 1000;
|
|
840
953
|
|
|
841
954
|
// check cache
|
|
842
|
-
const cache = await this.getCacheTimed<
|
|
955
|
+
const cache = await this.getCacheTimed<WalletTransaction[]>(key, {
|
|
956
|
+
notOlderThan,
|
|
957
|
+
});
|
|
843
958
|
if (cache) {
|
|
844
959
|
return cache;
|
|
845
960
|
}
|
|
@@ -849,8 +964,8 @@ export class BirdeyeService extends Service {
|
|
|
849
964
|
`${this.birdeyeUrl("v1/wallet/tx_list")}?wallet=${publicKey}&limit=100`,
|
|
850
965
|
birdeyeFetchOptions,
|
|
851
966
|
);
|
|
852
|
-
const resp = await res.json();
|
|
853
|
-
const data = resp
|
|
967
|
+
const resp = (await res.json()) as WalletTransactionHistoryResponse;
|
|
968
|
+
const data = resp.data[chain] || [];
|
|
854
969
|
if (data) {
|
|
855
970
|
this.setCacheTimed(key, data, tsInMs);
|
|
856
971
|
}
|
|
@@ -881,7 +996,7 @@ export class BirdeyeService extends Service {
|
|
|
881
996
|
const birdeye = new Birdeye(runtime);
|
|
882
997
|
runtime.registerTaskWorker({
|
|
883
998
|
name: "BIRDEYE_SYNC_WALLET",
|
|
884
|
-
|
|
999
|
+
shouldRun: async () => true,
|
|
885
1000
|
execute: async (rt) => {
|
|
886
1001
|
try {
|
|
887
1002
|
await birdeye.syncWallet();
|
|
@@ -928,7 +1043,7 @@ export class BirdeyeService extends Service {
|
|
|
928
1043
|
!infoService ||
|
|
929
1044
|
typeof infoService.registerDataProvder !== "function"
|
|
930
1045
|
) {
|
|
931
|
-
runtime.logger
|
|
1046
|
+
runtime.logger.debug(
|
|
932
1047
|
"INTEL_DATAPROVIDER service not available, skipping Birdeye data provider registration",
|
|
933
1048
|
);
|
|
934
1049
|
return;
|
|
@@ -939,12 +1054,12 @@ export class BirdeyeService extends Service {
|
|
|
939
1054
|
trendingService: BIRDEYE_SERVICE_NAME,
|
|
940
1055
|
lookupService: BIRDEYE_SERVICE_NAME,
|
|
941
1056
|
});
|
|
942
|
-
runtime.logger
|
|
1057
|
+
runtime.logger.log(
|
|
943
1058
|
"Birdeye data provider registered with INTEL_DATAPROVIDER",
|
|
944
1059
|
);
|
|
945
1060
|
})
|
|
946
1061
|
.catch((e) => {
|
|
947
|
-
runtime.logger
|
|
1062
|
+
runtime.logger.debug(
|
|
948
1063
|
`Birdeye service load failed; skipping data provider registration: ${e instanceof Error ? e.message : String(e)}`,
|
|
949
1064
|
);
|
|
950
1065
|
});
|
|
@@ -963,7 +1078,7 @@ export class BirdeyeService extends Service {
|
|
|
963
1078
|
}
|
|
964
1079
|
|
|
965
1080
|
async stop(): Promise<void> {
|
|
966
|
-
this.runtime.logger
|
|
1081
|
+
this.runtime.logger.log("BirdEye service shutdown");
|
|
967
1082
|
}
|
|
968
1083
|
|
|
969
1084
|
async getCacheTimed<T>(key: string, options: GetCacheTimedOptions = {}) {
|