@elizaos/plugin-steward-app 2.0.3-beta.6 → 2.0.3-beta.7

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.
Files changed (219) hide show
  1. package/dist/ApprovalQueue.d.ts +18 -0
  2. package/dist/ApprovalQueue.d.ts.map +1 -0
  3. package/dist/ApprovalQueue.js +420 -0
  4. package/dist/ApprovalQueue.js.map +1 -0
  5. package/dist/StewardLogo.d.ts +11 -0
  6. package/dist/StewardLogo.d.ts.map +1 -0
  7. package/dist/StewardLogo.js +36 -0
  8. package/dist/StewardLogo.js.map +1 -0
  9. package/dist/StewardView.d.ts +13 -0
  10. package/dist/StewardView.d.ts.map +1 -0
  11. package/dist/StewardView.helpers.d.ts +15 -0
  12. package/dist/StewardView.helpers.d.ts.map +1 -0
  13. package/dist/StewardView.helpers.js +45 -0
  14. package/dist/StewardView.helpers.js.map +1 -0
  15. package/dist/StewardView.interact.d.ts +2 -0
  16. package/dist/StewardView.interact.d.ts.map +1 -0
  17. package/dist/StewardView.interact.js +54 -0
  18. package/dist/StewardView.interact.js.map +1 -0
  19. package/dist/StewardView.js +249 -0
  20. package/dist/StewardView.js.map +1 -0
  21. package/dist/TransactionHistory.d.ts +22 -0
  22. package/dist/TransactionHistory.d.ts.map +1 -0
  23. package/dist/TransactionHistory.js +361 -0
  24. package/dist/TransactionHistory.js.map +1 -0
  25. package/dist/__fixtures__/steward-sdk-fixtures.d.ts +10 -0
  26. package/dist/__fixtures__/steward-sdk-fixtures.d.ts.map +1 -0
  27. package/dist/__fixtures__/steward-sdk-fixtures.js +60 -0
  28. package/dist/__fixtures__/steward-sdk-fixtures.js.map +1 -0
  29. package/dist/actions/wallet-action-shared.d.ts +15 -0
  30. package/dist/actions/wallet-action-shared.d.ts.map +1 -0
  31. package/dist/actions/wallet-action-shared.js +16 -0
  32. package/dist/actions/wallet-action-shared.js.map +1 -0
  33. package/dist/api/binance-skill-helpers.d.ts +21 -0
  34. package/dist/api/binance-skill-helpers.d.ts.map +1 -0
  35. package/dist/api/binance-skill-helpers.js +790 -0
  36. package/dist/api/binance-skill-helpers.js.map +1 -0
  37. package/dist/api/bsc-trade.d.ts +36 -0
  38. package/dist/api/bsc-trade.d.ts.map +1 -0
  39. package/dist/api/bsc-trade.js +796 -0
  40. package/dist/api/bsc-trade.js.map +1 -0
  41. package/dist/api/trade-safety.d.ts +35 -0
  42. package/dist/api/trade-safety.d.ts.map +1 -0
  43. package/dist/api/trade-safety.js +56 -0
  44. package/dist/api/trade-safety.js.map +1 -0
  45. package/dist/api/tx-service.d.ts +53 -0
  46. package/dist/api/tx-service.d.ts.map +1 -0
  47. package/dist/api/tx-service.js +206 -0
  48. package/dist/api/tx-service.js.map +1 -0
  49. package/dist/api/wallet-bsc-routes.d.ts +63 -0
  50. package/dist/api/wallet-bsc-routes.d.ts.map +1 -0
  51. package/dist/api/wallet-bsc-routes.js +337 -0
  52. package/dist/api/wallet-bsc-routes.js.map +1 -0
  53. package/dist/api/wallet-capability.d.ts +2 -0
  54. package/dist/api/wallet-capability.d.ts.map +1 -0
  55. package/dist/api/wallet-capability.js +15 -0
  56. package/dist/api/wallet-capability.js.map +1 -0
  57. package/dist/api/wallet-dex-prices.d.ts +43 -0
  58. package/dist/api/wallet-dex-prices.d.ts.map +1 -0
  59. package/dist/api/wallet-dex-prices.js +132 -0
  60. package/dist/api/wallet-dex-prices.js.map +1 -0
  61. package/dist/api/wallet-evm-balance.d.ts +72 -0
  62. package/dist/api/wallet-evm-balance.d.ts.map +1 -0
  63. package/dist/api/wallet-evm-balance.js +697 -0
  64. package/dist/api/wallet-evm-balance.js.map +1 -0
  65. package/dist/api/wallet-routes.d.ts +27 -0
  66. package/dist/api/wallet-routes.d.ts.map +1 -0
  67. package/dist/api/wallet-routes.js +556 -0
  68. package/dist/api/wallet-routes.js.map +1 -0
  69. package/dist/api/wallet-rpc.d.ts +73 -0
  70. package/dist/api/wallet-rpc.d.ts.map +1 -0
  71. package/dist/api/wallet-rpc.js +460 -0
  72. package/dist/api/wallet-rpc.js.map +1 -0
  73. package/dist/api/wallet-trade-routes.d.ts +104 -0
  74. package/dist/api/wallet-trade-routes.d.ts.map +1 -0
  75. package/dist/api/wallet-trade-routes.js +353 -0
  76. package/dist/api/wallet-trade-routes.js.map +1 -0
  77. package/dist/api/wallet-trading-profile.d.ts +31 -0
  78. package/dist/api/wallet-trading-profile.d.ts.map +1 -0
  79. package/dist/api/wallet-trading-profile.js +500 -0
  80. package/dist/api/wallet-trading-profile.js.map +1 -0
  81. package/dist/api/wallet.d.ts +60 -0
  82. package/dist/api/wallet.d.ts.map +1 -0
  83. package/dist/api/wallet.js +617 -0
  84. package/dist/api/wallet.js.map +1 -0
  85. package/dist/chain-utils.d.ts +10 -0
  86. package/dist/chain-utils.d.ts.map +1 -0
  87. package/dist/chain-utils.js +81 -0
  88. package/dist/chain-utils.js.map +1 -0
  89. package/dist/components/StewardSpatialView.d.ts +74 -0
  90. package/dist/components/StewardSpatialView.d.ts.map +1 -0
  91. package/dist/components/StewardSpatialView.js +309 -0
  92. package/dist/components/StewardSpatialView.js.map +1 -0
  93. package/dist/index.d.ts +20 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +77 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/plugin.d.ts +21 -0
  98. package/dist/plugin.d.ts.map +1 -0
  99. package/dist/plugin.js +319 -0
  100. package/dist/plugin.js.map +1 -0
  101. package/dist/providers/steward-balance.d.ts +12 -0
  102. package/dist/providers/steward-balance.d.ts.map +1 -0
  103. package/dist/providers/steward-balance.js +85 -0
  104. package/dist/providers/steward-balance.js.map +1 -0
  105. package/dist/providers/steward-receive-address.d.ts +12 -0
  106. package/dist/providers/steward-receive-address.d.ts.map +1 -0
  107. package/dist/providers/steward-receive-address.js +47 -0
  108. package/dist/providers/steward-receive-address.js.map +1 -0
  109. package/dist/register-routes.d.ts +2 -0
  110. package/dist/register-routes.d.ts.map +1 -0
  111. package/dist/register-routes.js +6 -0
  112. package/dist/register-routes.js.map +1 -0
  113. package/dist/register-terminal-view.d.ts +15 -0
  114. package/dist/register-terminal-view.d.ts.map +1 -0
  115. package/dist/register-terminal-view.js +34 -0
  116. package/dist/register-terminal-view.js.map +1 -0
  117. package/dist/routes/steward-bridge.d.ts +202 -0
  118. package/dist/routes/steward-bridge.d.ts.map +1 -0
  119. package/dist/routes/steward-bridge.js +776 -0
  120. package/dist/routes/steward-bridge.js.map +1 -0
  121. package/dist/routes/steward-compat-routes.d.ts +21 -0
  122. package/dist/routes/steward-compat-routes.d.ts.map +1 -0
  123. package/dist/routes/steward-compat-routes.js +350 -0
  124. package/dist/routes/steward-compat-routes.js.map +1 -0
  125. package/dist/routes/wallet-browser-compat-routes.d.ts +6 -0
  126. package/dist/routes/wallet-browser-compat-routes.d.ts.map +1 -0
  127. package/dist/routes/wallet-browser-compat-routes.js +402 -0
  128. package/dist/routes/wallet-browser-compat-routes.js.map +1 -0
  129. package/dist/routes/wallet-bsc-core-routes.d.ts +15 -0
  130. package/dist/routes/wallet-bsc-core-routes.d.ts.map +1 -0
  131. package/dist/routes/wallet-bsc-core-routes.js +59 -0
  132. package/dist/routes/wallet-bsc-core-routes.js.map +1 -0
  133. package/dist/routes/wallet-compat-routes.d.ts +13 -0
  134. package/dist/routes/wallet-compat-routes.d.ts.map +1 -0
  135. package/dist/routes/wallet-compat-routes.js +206 -0
  136. package/dist/routes/wallet-compat-routes.js.map +1 -0
  137. package/dist/routes/wallet-core-routes.d.ts +16 -0
  138. package/dist/routes/wallet-core-routes.d.ts.map +1 -0
  139. package/dist/routes/wallet-core-routes.js +48 -0
  140. package/dist/routes/wallet-core-routes.js.map +1 -0
  141. package/dist/routes/wallet-trade-compat-routes.d.ts +11 -0
  142. package/dist/routes/wallet-trade-compat-routes.d.ts.map +1 -0
  143. package/dist/routes/wallet-trade-compat-routes.js +570 -0
  144. package/dist/routes/wallet-trade-compat-routes.js.map +1 -0
  145. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts +7 -0
  146. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -0
  147. package/dist/security/hydrate-wallet-keys-from-platform-store.js +43 -0
  148. package/dist/security/hydrate-wallet-keys-from-platform-store.js.map +1 -0
  149. package/dist/security/wallet-os-store-actions.d.ts +14 -0
  150. package/dist/security/wallet-os-store-actions.d.ts.map +1 -0
  151. package/dist/security/wallet-os-store-actions.js +63 -0
  152. package/dist/security/wallet-os-store-actions.js.map +1 -0
  153. package/dist/services/steward-credentials.d.ts +2 -0
  154. package/dist/services/steward-credentials.d.ts.map +1 -0
  155. package/dist/services/steward-credentials.js +2 -0
  156. package/dist/services/steward-credentials.js.map +1 -0
  157. package/dist/services/steward-evm-account.d.ts +75 -0
  158. package/dist/services/steward-evm-account.d.ts.map +1 -0
  159. package/dist/services/steward-evm-account.js +279 -0
  160. package/dist/services/steward-evm-account.js.map +1 -0
  161. package/dist/services/steward-evm-bridge.d.ts +36 -0
  162. package/dist/services/steward-evm-bridge.d.ts.map +1 -0
  163. package/dist/services/steward-evm-bridge.js +78 -0
  164. package/dist/services/steward-evm-bridge.js.map +1 -0
  165. package/dist/services/steward-sidecar/health-check.d.ts +2 -0
  166. package/dist/services/steward-sidecar/health-check.d.ts.map +1 -0
  167. package/dist/services/steward-sidecar/health-check.js +2 -0
  168. package/dist/services/steward-sidecar/health-check.js.map +1 -0
  169. package/dist/services/steward-sidecar/helpers.d.ts +2 -0
  170. package/dist/services/steward-sidecar/helpers.d.ts.map +1 -0
  171. package/dist/services/steward-sidecar/helpers.js +2 -0
  172. package/dist/services/steward-sidecar/helpers.js.map +1 -0
  173. package/dist/services/steward-sidecar/process-management.d.ts +2 -0
  174. package/dist/services/steward-sidecar/process-management.d.ts.map +1 -0
  175. package/dist/services/steward-sidecar/process-management.js +2 -0
  176. package/dist/services/steward-sidecar/process-management.js.map +1 -0
  177. package/dist/services/steward-sidecar/types.d.ts +2 -0
  178. package/dist/services/steward-sidecar/types.d.ts.map +1 -0
  179. package/dist/services/steward-sidecar/types.js +2 -0
  180. package/dist/services/steward-sidecar/types.js.map +1 -0
  181. package/dist/services/steward-sidecar/wallet-setup.d.ts +2 -0
  182. package/dist/services/steward-sidecar/wallet-setup.d.ts.map +1 -0
  183. package/dist/services/steward-sidecar/wallet-setup.js +2 -0
  184. package/dist/services/steward-sidecar/wallet-setup.js.map +1 -0
  185. package/dist/services/steward-sidecar.d.ts +2 -0
  186. package/dist/services/steward-sidecar.d.ts.map +1 -0
  187. package/dist/services/steward-sidecar.js +2 -0
  188. package/dist/services/steward-sidecar.js.map +1 -0
  189. package/dist/services/steward-wallet.d.ts +25 -0
  190. package/dist/services/steward-wallet.d.ts.map +1 -0
  191. package/dist/services/steward-wallet.js +333 -0
  192. package/dist/services/steward-wallet.js.map +1 -0
  193. package/dist/steward-ui-state.d.ts +14 -0
  194. package/dist/steward-ui-state.d.ts.map +1 -0
  195. package/dist/steward-ui-state.js +46 -0
  196. package/dist/steward-ui-state.js.map +1 -0
  197. package/dist/steward-view-bundle.d.ts +3 -0
  198. package/dist/steward-view-bundle.d.ts.map +1 -0
  199. package/dist/steward-view-bundle.js +7 -0
  200. package/dist/steward-view-bundle.js.map +1 -0
  201. package/dist/types/bsc-trade.d.ts +180 -0
  202. package/dist/types/bsc-trade.d.ts.map +1 -0
  203. package/dist/types/bsc-trade.js +1 -0
  204. package/dist/types/bsc-trade.js.map +1 -0
  205. package/dist/types/index.d.ts +3 -0
  206. package/dist/types/index.d.ts.map +1 -0
  207. package/dist/types/index.js +3 -0
  208. package/dist/types/index.js.map +1 -0
  209. package/dist/types/steward.d.ts +83 -0
  210. package/dist/types/steward.d.ts.map +1 -0
  211. package/dist/types/steward.js +1 -0
  212. package/dist/types/steward.js.map +1 -0
  213. package/dist/ui.d.ts +7 -0
  214. package/dist/ui.d.ts.map +1 -0
  215. package/dist/ui.js +7 -0
  216. package/dist/ui.js.map +1 -0
  217. package/dist/views/bundle.js +601 -0
  218. package/dist/views/bundle.js.map +1 -0
  219. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/api/wallet-evm-balance.ts"],"sourcesContent":["/**\n * EVM balance fetching — Alchemy, Ankr, and direct-RPC fallback paths.\n *\n * Handles multi-chain EVM balance + NFT retrieval with provider-key resolution\n * and automatic fallback to public RPC endpoints when premium APIs are unavailable.\n */\n\nimport type { EvmChainBalance, EvmNft, EvmTokenBalance } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport {\n computeValueUsd,\n type DexTokenMeta,\n fetchDexPrices,\n WRAPPED_NATIVE,\n} from \"./wallet-dex-prices.js\";\nimport {\n resolveAvalancheRpcUrls,\n resolveBaseRpcUrls,\n resolveBscRpcUrls,\n resolveEthereumRpcUrls,\n} from \"./wallet-rpc.js\";\n\n// ── Constants ─────────────────────────────────────────────────────────\n\nconst FETCH_TIMEOUT_MS = 15_000;\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\n// ── Types ─────────────────────────────────────────────────────────────\n\ntype EvmChainProvider = \"alchemy\" | \"ankr\";\n\nexport interface EvmChainConfig {\n name: string;\n subdomain: string;\n chainId: number;\n nativeSymbol: string;\n provider: EvmChainProvider;\n ankrChain?: string;\n}\n\nexport interface EvmProviderKeys {\n alchemyKey?: string | null;\n ankrKey?: string | null;\n cloudManagedAccess?: boolean | null;\n bscRpcUrls?: string[] | null;\n ethereumRpcUrls?: string[] | null;\n baseRpcUrls?: string[] | null;\n avaxRpcUrls?: string[] | null;\n nodeRealBscRpcUrl?: string | null;\n quickNodeBscRpcUrl?: string | null;\n /** Standard elizaOS EVM plugin env key for BSC. */\n bscRpcUrl?: string | null;\n /** Standard elizaOS EVM plugin env key for Ethereum mainnet. */\n ethereumRpcUrl?: string | null;\n /** Standard elizaOS EVM plugin env key for Base. */\n baseRpcUrl?: string | null;\n /** Standard elizaOS EVM plugin env key for Avalanche C-Chain. */\n avaxRpcUrl?: string | null;\n}\n\ninterface EvmProviderKeyset {\n alchemyKey: string | null;\n ankrKey: string | null;\n cloudManagedAccess: boolean;\n bscRpcUrls: string[];\n ethereumRpcUrls: string[];\n baseRpcUrls: string[];\n avaxRpcUrls: string[];\n nodeRealBscRpcUrl: string | null;\n quickNodeBscRpcUrl: string | null;\n bscRpcUrl: string | null;\n ethereumRpcUrl: string | null;\n baseRpcUrl: string | null;\n avaxRpcUrl: string | null;\n}\n\ninterface AlchemyTokenBalance {\n contractAddress: string;\n tokenBalance: string;\n}\n\ninterface AlchemyTokenMeta {\n name: string;\n symbol: string;\n decimals: number;\n logo: string | null;\n}\n\nexport interface AnkrTokenAsset {\n contractAddress?: string;\n tokenName?: string;\n tokenSymbol?: string;\n tokenDecimals?: number | string;\n tokenType?: string;\n tokenBalance?: string | number;\n balance?: string | number;\n balanceRawInteger?: string | number;\n balanceUsd?: string | number;\n thumbnail?: string;\n}\n\ninterface AnkrNftAsset {\n contractAddress?: string;\n tokenId?: string | number;\n name?: string;\n description?: string;\n imageUrl?: string;\n imagePreviewUrl?: string;\n imageOriginalUrl?: string;\n collectionName?: string;\n contractName?: string;\n tokenType?: string;\n}\n\n// ── Default chain configuration ───────────────────────────────────────\n\nexport const DEFAULT_EVM_CHAINS: readonly EvmChainConfig[] = [\n {\n name: \"Ethereum\",\n subdomain: \"eth-mainnet\",\n chainId: 1,\n nativeSymbol: \"ETH\",\n provider: \"alchemy\",\n },\n {\n name: \"Base\",\n subdomain: \"base-mainnet\",\n chainId: 8453,\n nativeSymbol: \"ETH\",\n provider: \"alchemy\",\n },\n {\n name: \"Arbitrum\",\n subdomain: \"arb-mainnet\",\n chainId: 42161,\n nativeSymbol: \"ETH\",\n provider: \"alchemy\",\n },\n {\n name: \"Optimism\",\n subdomain: \"opt-mainnet\",\n chainId: 10,\n nativeSymbol: \"ETH\",\n provider: \"alchemy\",\n },\n {\n name: \"Polygon\",\n subdomain: \"polygon-mainnet\",\n chainId: 137,\n nativeSymbol: \"POL\",\n provider: \"alchemy\",\n },\n {\n name: \"BSC\",\n subdomain: \"bnb-mainnet\",\n chainId: 56,\n nativeSymbol: \"BNB\",\n provider: \"alchemy\",\n },\n {\n name: \"Avalanche\",\n subdomain: \"avax-mainnet\",\n chainId: 43114,\n nativeSymbol: \"AVAX\",\n provider: \"alchemy\",\n },\n] as const;\n\n// ── Internal helpers ──────────────────────────────────────────────────\n\n/** Parse JSON from a fetch response. If the body isn't JSON, throw with the raw text. */\nasync function jsonOrThrow<T>(res: Response): Promise<T> {\n const text = await res.text();\n if (!res.ok) throw new Error(text.slice(0, 200) || `HTTP ${res.status}`);\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error(text.slice(0, 200) || \"Invalid JSON\");\n }\n}\n\nfunction normalizeApiKey(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction normalizeStringArray(\n values: ReadonlyArray<string | null | undefined> | null | undefined,\n): string[] {\n return [\n ...new Set(\n (values ?? [])\n .map((value) => normalizeApiKey(value))\n .filter((value): value is string => Boolean(value)),\n ),\n ];\n}\n\nexport function resolveEvmProviderKeys(\n alchemyOrKeys: string | EvmProviderKeys | null | undefined,\n maybeAnkrKey?: string | null,\n): EvmProviderKeyset {\n if (typeof alchemyOrKeys === \"string\" || alchemyOrKeys == null) {\n const alchemyKey = typeof alchemyOrKeys === \"string\" ? alchemyOrKeys : null;\n return {\n alchemyKey: normalizeApiKey(alchemyKey),\n ankrKey: normalizeApiKey(maybeAnkrKey),\n cloudManagedAccess: false,\n bscRpcUrls: resolveBscRpcUrls({ cloudManagedAccess: false }),\n ethereumRpcUrls: resolveEthereumRpcUrls({ cloudManagedAccess: false }),\n baseRpcUrls: resolveBaseRpcUrls({ cloudManagedAccess: false }),\n avaxRpcUrls: resolveAvalancheRpcUrls({ cloudManagedAccess: false }),\n nodeRealBscRpcUrl: normalizeApiKey(\n process.env.NODEREAL_BSC_RPC_URL ?? null,\n ),\n quickNodeBscRpcUrl: normalizeApiKey(\n process.env.QUICKNODE_BSC_RPC_URL ?? null,\n ),\n bscRpcUrl: normalizeApiKey(process.env.BSC_RPC_URL ?? null),\n ethereumRpcUrl: normalizeApiKey(process.env.ETHEREUM_RPC_URL ?? null),\n baseRpcUrl: normalizeApiKey(process.env.BASE_RPC_URL ?? null),\n avaxRpcUrl: normalizeApiKey(process.env.AVALANCHE_RPC_URL ?? null),\n };\n }\n const cloudManagedAccess = Boolean(alchemyOrKeys.cloudManagedAccess);\n return {\n alchemyKey: normalizeApiKey(alchemyOrKeys.alchemyKey),\n ankrKey: normalizeApiKey(alchemyOrKeys.ankrKey ?? maybeAnkrKey),\n cloudManagedAccess,\n bscRpcUrls: normalizeStringArray([\n ...(alchemyOrKeys.bscRpcUrls ?? []),\n alchemyOrKeys.nodeRealBscRpcUrl ?? process.env.NODEREAL_BSC_RPC_URL,\n alchemyOrKeys.quickNodeBscRpcUrl ?? process.env.QUICKNODE_BSC_RPC_URL,\n alchemyOrKeys.bscRpcUrl ?? process.env.BSC_RPC_URL,\n ...resolveBscRpcUrls({ cloudManagedAccess }),\n ]),\n ethereumRpcUrls: normalizeStringArray([\n ...(alchemyOrKeys.ethereumRpcUrls ?? []),\n alchemyOrKeys.ethereumRpcUrl ?? process.env.ETHEREUM_RPC_URL,\n ...resolveEthereumRpcUrls({ cloudManagedAccess }),\n ]),\n baseRpcUrls: normalizeStringArray([\n ...(alchemyOrKeys.baseRpcUrls ?? []),\n alchemyOrKeys.baseRpcUrl ?? process.env.BASE_RPC_URL,\n ...resolveBaseRpcUrls({ cloudManagedAccess }),\n ]),\n avaxRpcUrls: normalizeStringArray([\n ...(alchemyOrKeys.avaxRpcUrls ?? []),\n alchemyOrKeys.avaxRpcUrl ?? process.env.AVALANCHE_RPC_URL,\n ...resolveAvalancheRpcUrls({ cloudManagedAccess }),\n ]),\n nodeRealBscRpcUrl: normalizeApiKey(\n alchemyOrKeys.nodeRealBscRpcUrl ?? process.env.NODEREAL_BSC_RPC_URL,\n ),\n quickNodeBscRpcUrl: normalizeApiKey(\n alchemyOrKeys.quickNodeBscRpcUrl ?? process.env.QUICKNODE_BSC_RPC_URL,\n ),\n bscRpcUrl: normalizeApiKey(\n alchemyOrKeys.bscRpcUrl ?? process.env.BSC_RPC_URL,\n ),\n ethereumRpcUrl: normalizeApiKey(\n alchemyOrKeys.ethereumRpcUrl ?? process.env.ETHEREUM_RPC_URL,\n ),\n baseRpcUrl: normalizeApiKey(\n alchemyOrKeys.baseRpcUrl ?? process.env.BASE_RPC_URL,\n ),\n avaxRpcUrl: normalizeApiKey(\n alchemyOrKeys.avaxRpcUrl ?? process.env.AVALANCHE_RPC_URL,\n ),\n };\n}\n\nfunction isBscChain(chain: EvmChainConfig): boolean {\n return (\n chain.chainId === 56 || (chain.ankrChain ?? \"\").toLowerCase() === \"bsc\"\n );\n}\n\nfunction describeRpcEndpoint(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return \"rpc\";\n }\n}\n\nfunction makeEvmChainFailure(\n chain: EvmChainConfig,\n message: string,\n): EvmChainBalance {\n return {\n chain: chain.name,\n chainId: chain.chainId,\n nativeBalance: \"0\",\n nativeSymbol: chain.nativeSymbol,\n nativeValueUsd: \"0\",\n tokens: [],\n error: message,\n };\n}\n\nfunction rpcJsonRequest(body: string): RequestInit {\n return {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n body,\n };\n}\n\nfunction asString(value: unknown): string {\n if (typeof value === \"string\") return value.trim();\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return \"\";\n}\n\nfunction parseTokenDecimals(value: unknown, fallback = 18): number {\n const num =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\"\n ? Number.parseInt(value, 10)\n : Number.NaN;\n if (!Number.isFinite(num) || num < 0) return fallback;\n return Math.trunc(num);\n}\n\nfunction parseAnkrBalance(asset: AnkrTokenAsset, decimals: number): string {\n const tokenBalance = asString(asset.tokenBalance);\n if (tokenBalance) {\n if (/^\\d+$/.test(tokenBalance))\n return formatWei(BigInt(tokenBalance), decimals);\n return tokenBalance;\n }\n\n const displayBalance = asString(asset.balance);\n if (displayBalance) {\n if (/^\\d+$/.test(displayBalance))\n return formatWei(BigInt(displayBalance), decimals);\n return displayBalance;\n }\n\n const rawBalance = asString(asset.balanceRawInteger);\n if (rawBalance && /^\\d+$/.test(rawBalance))\n return formatWei(BigInt(rawBalance), decimals);\n\n return \"0\";\n}\n\nfunction isZeroBalance(balance: string): boolean {\n if (!balance) return true;\n if (/^0+(\\.0+)?$/.test(balance)) return true;\n const parsed = Number.parseFloat(balance);\n return Number.isFinite(parsed) ? parsed <= 0 : false;\n}\n\nfunction isAnkrNativeAsset(asset: AnkrTokenAsset): boolean {\n const tokenType = (asset.tokenType ?? \"\").toUpperCase();\n const symbol = (asset.tokenSymbol ?? \"\").toUpperCase();\n const contract = (asset.contractAddress ?? \"\").toLowerCase();\n if (tokenType === \"NATIVE\") return true;\n return symbol === \"BNB\" && (!contract || contract === ZERO_ADDRESS);\n}\n\nfunction formatWei(wei: bigint, decimals: number): string {\n if (wei <= 0n || decimals <= 0) return wei <= 0n ? \"0\" : wei.toString();\n const divisor = 10n ** BigInt(decimals);\n const whole = wei / divisor;\n const rem = wei % divisor;\n if (rem === 0n) return whole.toString();\n return `${whole}.${rem.toString().padStart(decimals, \"0\").replace(/0+$/, \"\")}`;\n}\n\n// ── Alchemy balance fetching ──────────────────────────────────────────\n\nasync function fetchAlchemyChainBalances(\n chain: EvmChainConfig,\n address: string,\n alchemyKey: string,\n): Promise<EvmChainBalance> {\n const url = `https://${chain.subdomain}.g.alchemy.com/v2/${alchemyKey}`;\n\n const nativeData = await jsonOrThrow<{ result?: string }>(\n await fetch(\n url,\n rpcJsonRequest(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_getBalance\",\n params: [address, \"latest\"],\n }),\n ),\n ),\n );\n const nativeBalance = formatWei(\n nativeData.result ? BigInt(nativeData.result) : 0n,\n 18,\n );\n\n const tokenData = await jsonOrThrow<{\n result?: { tokenBalances?: AlchemyTokenBalance[] };\n }>(\n await fetch(\n url,\n rpcJsonRequest(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: 2,\n method: \"alchemy_getTokenBalances\",\n params: [address, \"DEFAULT_TOKENS\"],\n }),\n ),\n ),\n );\n const nonZero = (tokenData.result?.tokenBalances ?? []).filter(\n (t) =>\n t.tokenBalance && t.tokenBalance !== \"0x0\" && t.tokenBalance !== \"0x\",\n );\n\n const metaResults = await Promise.allSettled(\n nonZero.slice(0, 50).map(async (tok): Promise<EvmTokenBalance> => {\n const meta = (\n await jsonOrThrow<{ result?: AlchemyTokenMeta }>(\n await fetch(\n url,\n rpcJsonRequest(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: 3,\n method: \"alchemy_getTokenMetadata\",\n params: [tok.contractAddress],\n }),\n ),\n ),\n )\n ).result;\n const decimals = meta?.decimals ?? 18;\n return {\n symbol: meta?.symbol ?? \"???\",\n name: meta?.name ?? \"Unknown Token\",\n contractAddress: tok.contractAddress,\n balance: formatWei(BigInt(tok.tokenBalance), decimals),\n decimals,\n valueUsd: \"0\",\n logoUrl: meta?.logo ?? \"\",\n };\n }),\n );\n const tokens = metaResults\n .filter(\n (r): r is PromiseFulfilledResult<EvmTokenBalance> =>\n r.status === \"fulfilled\",\n )\n .map((r) => r.value);\n\n // Fetch DEX prices for all tokens + native token.\n const allAddresses = tokens.map((t) => t.contractAddress);\n const wrappedNative = WRAPPED_NATIVE[chain.chainId];\n if (wrappedNative) allAddresses.push(wrappedNative);\n const dexPrices = await fetchDexPrices(chain.chainId, allAddresses);\n\n for (const tok of tokens) {\n const meta = dexPrices.get(tok.contractAddress.toLowerCase());\n if (meta) {\n tok.valueUsd = computeValueUsd(tok.balance, meta.price);\n if (meta.logoUrl && !tok.logoUrl) tok.logoUrl = meta.logoUrl;\n }\n }\n const nativeMeta = wrappedNative\n ? dexPrices.get(wrappedNative.toLowerCase())\n : undefined;\n const nativeValueUsd = nativeMeta\n ? computeValueUsd(nativeBalance, nativeMeta.price)\n : \"0\";\n\n return {\n chain: chain.name,\n chainId: chain.chainId,\n nativeBalance,\n nativeSymbol: chain.nativeSymbol,\n nativeValueUsd,\n tokens,\n error: null,\n };\n}\n\n// ── Ankr balance fetching ─────────────────────────────────────────────\n\nasync function fetchAnkrChainBalances(\n chain: EvmChainConfig,\n address: string,\n ankrKey: string,\n): Promise<EvmChainBalance> {\n const res = await fetch(\n `https://rpc.ankr.com/multichain/${ankrKey}`,\n rpcJsonRequest(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"ankr_getAccountBalance\",\n params: {\n walletAddress: address,\n blockchain: [chain.ankrChain ?? \"bsc\"],\n onlyWhitelisted: false,\n },\n }),\n ),\n );\n const data = await jsonOrThrow<{ result?: { assets?: AnkrTokenAsset[] } }>(\n res,\n );\n const assets = data.result?.assets ?? [];\n const nativeAsset = assets.find(isAnkrNativeAsset);\n const nativeBalance = nativeAsset\n ? parseAnkrBalance(\n nativeAsset,\n parseTokenDecimals(nativeAsset.tokenDecimals),\n )\n : \"0\";\n const tokens: EvmTokenBalance[] = [];\n for (const asset of assets) {\n if (isAnkrNativeAsset(asset)) continue;\n const decimals = parseTokenDecimals(asset.tokenDecimals);\n const balance = parseAnkrBalance(asset, decimals);\n if (isZeroBalance(balance)) continue;\n tokens.push({\n symbol: asset.tokenSymbol ?? \"???\",\n name: asset.tokenName ?? \"Unknown Token\",\n contractAddress: asset.contractAddress ?? \"\",\n balance,\n decimals,\n valueUsd: \"0\",\n logoUrl: asset.thumbnail ?? \"\",\n });\n }\n\n // All pricing via DexScreener/DexPaprika (Ankr only provides balances).\n const allAddresses = tokens\n .filter((t) => t.contractAddress)\n .map((t) => t.contractAddress);\n const wrappedNative = WRAPPED_NATIVE[chain.chainId];\n if (wrappedNative) allAddresses.push(wrappedNative);\n logger.info(\n `[wallet] Fetching DEX prices for ${chain.name}: ${allAddresses.length} addresses (native=${nativeBalance})`,\n );\n const dexPrices = await fetchDexPrices(chain.chainId, allAddresses);\n logger.info(\n `[wallet] DEX prices result for ${chain.name}: ${dexPrices.size} prices found`,\n );\n\n for (const tok of tokens) {\n const meta = dexPrices.get(tok.contractAddress.toLowerCase());\n if (meta) {\n tok.valueUsd = computeValueUsd(tok.balance, meta.price);\n if (meta.logoUrl && !tok.logoUrl) tok.logoUrl = meta.logoUrl;\n }\n }\n const nativeMeta = wrappedNative\n ? dexPrices.get(wrappedNative.toLowerCase())\n : undefined;\n const nativeValueUsd = nativeMeta\n ? computeValueUsd(nativeBalance, nativeMeta.price)\n : \"0\";\n\n return {\n chain: chain.name,\n chainId: chain.chainId,\n nativeBalance,\n nativeSymbol: chain.nativeSymbol,\n nativeValueUsd,\n tokens,\n error: null,\n };\n}\n\n// ── Direct RPC balance fetching ───────────────────────────────────────\n\nasync function fetchNativeBalanceViaRpc(\n rpcUrl: string,\n address: string,\n): Promise<string> {\n const data = await jsonOrThrow<{\n result?: string;\n error?: { message?: string };\n }>(\n await fetch(\n rpcUrl,\n rpcJsonRequest(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_getBalance\",\n params: [address, \"latest\"],\n }),\n ),\n ),\n );\n\n if (data.error?.message) {\n throw new Error(data.error.message);\n }\n\n const raw = typeof data.result === \"string\" ? data.result : \"0x0\";\n const wei = raw.startsWith(\"0x\") ? BigInt(raw) : BigInt(raw || \"0\");\n return formatWei(wei, 18);\n}\n\nexport async function fetchEvmNativeBalanceViaRpc(\n rpcUrl: string,\n address: string,\n): Promise<string> {\n return fetchNativeBalanceViaRpc(rpcUrl, address);\n}\n\n/**\n * Query ERC-20 balanceOf, symbol, and decimals for a single token via RPC.\n * Returns null if the token has zero balance or the call fails.\n */\nasync function fetchErc20BalanceViaRpc(\n rpcUrl: string,\n walletAddress: string,\n contractAddress: string,\n): Promise<EvmTokenBalance | null> {\n const paddedWallet = walletAddress\n .toLowerCase()\n .replace(\"0x\", \"\")\n .padStart(64, \"0\");\n // balanceOf(address) — paddedWallet is already 64 hex chars (24 zero prefix + 40 addr)\n const balanceOfData = `0x70a08231${paddedWallet}`;\n // symbol()\n const symbolData = \"0x95d89b41\";\n // decimals()\n const decimalsData = \"0x313ce567\";\n\n const makeCall = (to: string, data: string) =>\n fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_call\",\n params: [{ to, data }, \"latest\"],\n }),\n signal: AbortSignal.timeout(8_000),\n }).then((r) => r.json() as Promise<{ result?: string }>);\n\n try {\n const [balRes, symRes, decRes] = await Promise.all([\n makeCall(contractAddress, balanceOfData),\n makeCall(contractAddress, symbolData),\n makeCall(contractAddress, decimalsData),\n ]);\n\n const rawBal = balRes.result;\n if (!rawBal || rawBal === \"0x\" || rawBal === \"0x0\" || BigInt(rawBal) === 0n)\n return null;\n\n let decimals = 18;\n if (decRes.result && decRes.result !== \"0x\") {\n const d = Number(BigInt(decRes.result));\n if (Number.isFinite(d) && d >= 0 && d <= 36) decimals = d;\n }\n\n let symbol = \"TOKEN\";\n if (symRes.result && symRes.result.length > 2) {\n try {\n // ABI-encoded string: offset (32 bytes) + length (32 bytes) + data\n const hex = symRes.result.slice(2);\n if (hex.length >= 128) {\n const len = Number(BigInt(`0x${hex.slice(64, 128)}`));\n const bytes = Buffer.from(hex.slice(128, 128 + len * 2), \"hex\");\n const decoded = bytes.toString(\"utf-8\").replace(/\\0/g, \"\").trim();\n if (decoded) symbol = decoded;\n }\n } catch {\n // Fall through with default symbol.\n }\n }\n\n const balance = formatWei(BigInt(rawBal), decimals);\n return {\n symbol,\n name: symbol,\n contractAddress,\n balance,\n decimals,\n valueUsd: \"0\",\n logoUrl: \"\",\n };\n } catch {\n return null;\n }\n}\n\nasync function fetchEvmChainBalancesViaRpc(\n chain: EvmChainConfig,\n address: string,\n rpcUrls: string[],\n knownTokenAddresses?: string[],\n): Promise<EvmChainBalance> {\n const errors: string[] = [];\n for (const rpcUrl of rpcUrls) {\n try {\n const nativeBalance = await fetchNativeBalanceViaRpc(rpcUrl, address);\n\n // Query known ERC-20 tokens (e.g. from trade ledger).\n const tokens: EvmTokenBalance[] = [];\n if (knownTokenAddresses && knownTokenAddresses.length > 0) {\n const results = await Promise.allSettled(\n knownTokenAddresses\n .slice(0, 30)\n .map((addr) => fetchErc20BalanceViaRpc(rpcUrl, address, addr)),\n );\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value) tokens.push(r.value);\n }\n }\n\n // Price native + tokens via DEX.\n const wrappedNative = WRAPPED_NATIVE[chain.chainId];\n const priceAddresses = tokens.map((t) => t.contractAddress);\n if (wrappedNative) priceAddresses.push(wrappedNative);\n\n const dexPrices =\n priceAddresses.length > 0\n ? await fetchDexPrices(chain.chainId, priceAddresses)\n : new Map<string, DexTokenMeta>();\n\n let nativeValueUsd = \"0\";\n if (wrappedNative) {\n const nativeMeta = dexPrices.get(wrappedNative.toLowerCase());\n if (nativeMeta)\n nativeValueUsd = computeValueUsd(nativeBalance, nativeMeta.price);\n logger.info(\n `[wallet] RPC path: ${chain.name} native=${nativeBalance} price=${nativeMeta?.price ?? \"none\"} value=$${nativeValueUsd}`,\n );\n }\n\n for (const tok of tokens) {\n const meta = dexPrices.get(tok.contractAddress.toLowerCase());\n if (meta) {\n tok.valueUsd = computeValueUsd(tok.balance, meta.price);\n if (meta.logoUrl) tok.logoUrl = meta.logoUrl;\n }\n }\n\n if (tokens.length > 0) {\n logger.info(\n `[wallet] RPC path: ${chain.name} found ${tokens.length} tokens with balance`,\n );\n }\n\n return {\n chain: chain.name,\n chainId: chain.chainId,\n nativeBalance,\n nativeSymbol: chain.nativeSymbol,\n nativeValueUsd,\n tokens,\n error: null,\n };\n } catch (err) {\n const msg = String(err);\n errors.push(`${describeRpcEndpoint(rpcUrl)}: ${msg}`);\n }\n }\n\n throw new Error(\n errors.join(\" | \").slice(0, 400) || `${chain.name} RPC unavailable`,\n );\n}\n\n// ── Alchemy NFT fetching ──────────────────────────────────────────────\n\nasync function fetchAlchemyChainNfts(\n chain: EvmChainConfig,\n address: string,\n alchemyKey: string,\n): Promise<{ chain: string; nfts: EvmNft[] }> {\n const res = await fetch(\n `https://${chain.subdomain}.g.alchemy.com/nft/v3/${alchemyKey}/getNFTsForOwner?owner=${address}&withMetadata=true&pageSize=50`,\n { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) },\n );\n const data = await jsonOrThrow<{\n ownedNfts?: Array<{\n contract?: {\n address?: string;\n name?: string;\n openSeaMetadata?: { collectionName?: string };\n };\n tokenId?: string;\n name?: string;\n description?: string;\n image?: {\n cachedUrl?: string;\n thumbnailUrl?: string;\n originalUrl?: string;\n };\n tokenType?: string;\n }>;\n }>(res);\n return {\n chain: chain.name,\n nfts: (data.ownedNfts ?? []).map((nft) => ({\n contractAddress: nft.contract?.address ?? \"\",\n tokenId: nft.tokenId ?? \"\",\n name: nft.name ?? \"Untitled\",\n description: (nft.description ?? \"\").slice(0, 200),\n imageUrl:\n nft.image?.cachedUrl ??\n nft.image?.thumbnailUrl ??\n nft.image?.originalUrl ??\n \"\",\n collectionName:\n nft.contract?.openSeaMetadata?.collectionName ??\n nft.contract?.name ??\n \"\",\n tokenType: nft.tokenType ?? \"ERC721\",\n })),\n };\n}\n\n// ── Ankr NFT fetching ─────────────────────────────────────────────────\n\nasync function fetchAnkrChainNfts(\n chain: EvmChainConfig,\n address: string,\n ankrKey: string,\n): Promise<{ chain: string; nfts: EvmNft[] }> {\n const res = await fetch(\n `https://rpc.ankr.com/multichain/${ankrKey}`,\n rpcJsonRequest(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"ankr_getNFTsByOwner\",\n params: {\n walletAddress: address,\n blockchain: [chain.ankrChain ?? \"bsc\"],\n pageSize: 50,\n },\n }),\n ),\n );\n const data = await jsonOrThrow<{ result?: { assets?: AnkrNftAsset[] } }>(res);\n return {\n chain: chain.name,\n nfts: (data.result?.assets ?? []).map((nft) => ({\n contractAddress: nft.contractAddress ?? \"\",\n tokenId: String(nft.tokenId ?? \"\"),\n name: nft.name ?? \"Untitled\",\n description: (nft.description ?? \"\").slice(0, 200),\n imageUrl:\n nft.imageUrl ?? nft.imagePreviewUrl ?? nft.imageOriginalUrl ?? \"\",\n collectionName: nft.collectionName ?? nft.contractName ?? \"\",\n tokenType: nft.tokenType ?? \"ERC721\",\n })),\n };\n}\n\n// ── Public API ────────────────────────────────────────────────────────\n\nexport async function fetchEvmBalances(\n address: string,\n alchemyOrKeys: string | EvmProviderKeys | null | undefined,\n maybeAnkrKey?: string | null,\n knownTokenAddresses?: string[],\n): Promise<EvmChainBalance[]> {\n const keys = resolveEvmProviderKeys(alchemyOrKeys, maybeAnkrKey);\n const bscRpcUrls = keys.bscRpcUrls;\n const ethRpcUrls = keys.ethereumRpcUrls;\n const baseRpcUrls = keys.baseRpcUrls;\n const avaxRpcUrls = keys.avaxRpcUrls;\n\n const hasManagedBscRpc = bscRpcUrls.length > 0;\n const activeChains = DEFAULT_EVM_CHAINS.filter((chain) => {\n if (chain.provider === \"ankr\") {\n return Boolean(keys.ankrKey) || (isBscChain(chain) && hasManagedBscRpc);\n }\n\n // Prefer Alchemy when available (tokens + USD value). Otherwise, fall back to\n // public RPC for native balances on the chains we support out-of-box.\n if (keys.alchemyKey) return true;\n if (chain.chainId === 1) return ethRpcUrls.length > 0;\n if (chain.chainId === 8453) return baseRpcUrls.length > 0;\n if (chain.chainId === 56) return hasManagedBscRpc;\n if (chain.chainId === 43114) return avaxRpcUrls.length > 0;\n return false;\n });\n\n return Promise.all(\n activeChains.map(async (chain): Promise<EvmChainBalance> => {\n try {\n if (chain.provider === \"ankr\") {\n if (keys.ankrKey) {\n return await fetchAnkrChainBalances(chain, address, keys.ankrKey);\n }\n if (isBscChain(chain) && hasManagedBscRpc) {\n return await fetchEvmChainBalancesViaRpc(\n chain,\n address,\n bscRpcUrls,\n knownTokenAddresses,\n );\n }\n return makeEvmChainFailure(chain, \"Missing ANKR_API_KEY\");\n }\n if (!keys.alchemyKey) {\n if (chain.chainId === 1 && ethRpcUrls.length > 0) {\n return await fetchEvmChainBalancesViaRpc(\n chain,\n address,\n ethRpcUrls,\n knownTokenAddresses,\n );\n }\n if (chain.chainId === 8453 && baseRpcUrls.length > 0) {\n return await fetchEvmChainBalancesViaRpc(\n chain,\n address,\n baseRpcUrls,\n knownTokenAddresses,\n );\n }\n if (chain.chainId === 56 && hasManagedBscRpc) {\n return await fetchEvmChainBalancesViaRpc(\n chain,\n address,\n bscRpcUrls,\n knownTokenAddresses,\n );\n }\n if (chain.chainId === 43114 && avaxRpcUrls.length > 0) {\n return await fetchEvmChainBalancesViaRpc(\n chain,\n address,\n avaxRpcUrls,\n knownTokenAddresses,\n );\n }\n return makeEvmChainFailure(chain, \"Missing ALCHEMY_API_KEY\");\n }\n return await fetchAlchemyChainBalances(chain, address, keys.alchemyKey);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.warn(`EVM balance fetch failed for ${chain.name}: ${msg}`);\n return makeEvmChainFailure(chain, msg);\n }\n }),\n );\n}\n\nexport async function fetchEvmNfts(\n address: string,\n alchemyOrKeys: string | EvmProviderKeys | null | undefined,\n maybeAnkrKey?: string | null,\n): Promise<Array<{ chain: string; nfts: EvmNft[] }>> {\n const keys = resolveEvmProviderKeys(alchemyOrKeys, maybeAnkrKey);\n const hasManagedBscRpc = keys.bscRpcUrls.length > 0;\n const activeChains = DEFAULT_EVM_CHAINS.filter((chain) => {\n if (chain.provider === \"ankr\") {\n return (isBscChain(chain) && hasManagedBscRpc) || Boolean(keys.ankrKey);\n }\n if (keys.alchemyKey) return true;\n // BSC without Alchemy: include if managed RPC exists (NFTs will be empty)\n if (chain.chainId === 56) return hasManagedBscRpc;\n return false;\n });\n\n return Promise.all(\n activeChains.map(\n async (chain): Promise<{ chain: string; nfts: EvmNft[] }> => {\n try {\n if (chain.provider === \"ankr\") {\n if (!keys.ankrKey) {\n // Managed NodeReal/QuickNode mode currently provides native-balance\n // readiness only; token/NFT indexing is added in later phases.\n return { chain: chain.name, nfts: [] };\n }\n return await fetchAnkrChainNfts(chain, address, keys.ankrKey);\n }\n if (!keys.alchemyKey) return { chain: chain.name, nfts: [] };\n return await fetchAlchemyChainNfts(chain, address, keys.alchemyKey);\n } catch (err) {\n logger.warn(`EVM NFT fetch failed for ${chain.name}: ${err}`);\n return { chain: chain.name, nfts: [] };\n }\n },\n ),\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,27 @@
1
+ import type http from "node:http";
2
+ import type { ElizaConfig } from "@elizaos/agent";
3
+ import type { AgentRuntime, RouteHelpers, WalletExportRejection as WalletExportRejectionLike, WalletExportRequestBody } from "@elizaos/core";
4
+ import { type RouteRequestMeta } from "@elizaos/core";
5
+ import { fetchEvmBalances, fetchSolanaBalances, fetchSolanaNativeBalanceViaRpc, generateWalletForChain, getWalletAddresses, importWallet, validatePrivateKey } from "./wallet.js";
6
+ export interface WalletRouteDependencies {
7
+ getWalletAddresses: typeof getWalletAddresses;
8
+ fetchEvmBalances: typeof fetchEvmBalances;
9
+ fetchSolanaBalances: typeof fetchSolanaBalances;
10
+ fetchSolanaNativeBalanceViaRpc: typeof fetchSolanaNativeBalanceViaRpc;
11
+ validatePrivateKey: typeof validatePrivateKey;
12
+ importWallet: typeof importWallet;
13
+ generateWalletForChain: typeof generateWalletForChain;
14
+ }
15
+ export declare const DEFAULT_WALLET_ROUTE_DEPENDENCIES: WalletRouteDependencies;
16
+ export interface WalletRouteContext extends RouteRequestMeta, Pick<RouteHelpers, "readJsonBody" | "json" | "error"> {
17
+ config: ElizaConfig;
18
+ saveConfig: (config: ElizaConfig) => void;
19
+ ensureWalletKeysInEnvAndConfig: (config: ElizaConfig) => boolean;
20
+ resolveWalletExportRejection: (req: http.IncomingMessage, body: WalletExportRequestBody) => WalletExportRejectionLike | null;
21
+ restartRuntime?: (reason: string) => Promise<boolean>;
22
+ scheduleRuntimeRestart?: (reason: string) => void;
23
+ deps?: WalletRouteDependencies;
24
+ runtime?: AgentRuntime | null;
25
+ }
26
+ export declare function handleWalletRoutes(ctx: WalletRouteContext): Promise<boolean>;
27
+ //# sourceMappingURL=wallet-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-routes.d.ts","sourceRoot":"","sources":["../../src/api/wallet-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,qBAAqB,IAAI,yBAAyB,EAClD,uBAAuB,EACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,KAAK,gBAAgB,EAGtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,8BAA8B,EAC9B,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EAEZ,kBAAkB,EAInB,MAAM,UAAU,CAAC;AAqJlB,MAAM,WAAW,uBAAuB;IACtC,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,8BAA8B,EAAE,OAAO,8BAA8B,CAAC;IACtE,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;CACvD;AAED,eAAO,MAAM,iCAAiC,EAAE,uBAQ/C,CAAC;AAiBF,MAAM,WAAW,kBACf,SAAQ,gBAAgB,EACtB,IAAI,CAAC,YAAY,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;IACvD,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC1C,8BAA8B,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC;IACjE,4BAA4B,EAAE,CAC5B,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,IAAI,EAAE,uBAAuB,KAC1B,yBAAyB,GAAG,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,IAAI,CAAC,EAAE,uBAAuB,CAAC;IAC/B,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B;AAoBD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,OAAO,CAAC,CAmflB"}