@elizaos/plugin-wallet 2.0.0-beta.1 → 2.0.3-beta.5

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 (356) hide show
  1. package/README.md +70 -45
  2. package/auto-enable.ts +1 -1
  3. package/dist/actions/failure-codes.d.ts +12 -0
  4. package/dist/actions/index.d.ts +1 -0
  5. package/dist/analytics/birdeye/actions/wallet-search-address.d.ts +7 -0
  6. package/dist/analytics/birdeye/birdeye-task.d.ts +27 -0
  7. package/dist/analytics/birdeye/birdeye.d.ts +140 -0
  8. package/dist/analytics/birdeye/constants.d.ts +68 -0
  9. package/dist/analytics/birdeye/providers/agent-portfolio-provider.d.ts +8 -0
  10. package/dist/analytics/birdeye/providers/market.d.ts +18 -0
  11. package/dist/analytics/birdeye/providers/portfolio-factory.d.ts +10 -0
  12. package/dist/analytics/birdeye/providers/trending.d.ts +19 -0
  13. package/dist/analytics/birdeye/providers/wallet.d.ts +5 -0
  14. package/dist/analytics/birdeye/search-category.d.ts +52 -0
  15. package/dist/analytics/birdeye/service.d.ts +94 -0
  16. package/dist/analytics/birdeye/types/api/common.d.ts +199 -0
  17. package/dist/analytics/birdeye/types/api/defi.d.ts +187 -0
  18. package/dist/analytics/birdeye/types/api/pair.d.ts +182 -0
  19. package/dist/analytics/birdeye/types/api/search.d.ts +64 -0
  20. package/dist/analytics/birdeye/types/api/token.d.ts +580 -0
  21. package/dist/analytics/birdeye/types/api/trader.d.ts +70 -0
  22. package/dist/analytics/birdeye/types/api/wallet.d.ts +161 -0
  23. package/dist/analytics/birdeye/types/shared.d.ts +83 -0
  24. package/dist/analytics/birdeye/utils.d.ts +74 -0
  25. package/dist/analytics/dexscreener/errors.d.ts +2 -0
  26. package/dist/analytics/dexscreener/index.d.ts +3 -0
  27. package/dist/analytics/dexscreener/search-category.d.ts +3 -0
  28. package/dist/analytics/dexscreener/service.d.ts +34 -0
  29. package/dist/analytics/dexscreener/types.d.ts +131 -0
  30. package/dist/analytics/lpinfo/index.d.ts +31 -0
  31. package/dist/analytics/lpinfo/kamino/index.d.ts +7 -0
  32. package/dist/analytics/lpinfo/kamino/providers/kaminoLiquidityProvider.d.ts +6 -0
  33. package/dist/analytics/lpinfo/kamino/providers/kaminoPoolProvider.d.ts +6 -0
  34. package/dist/analytics/lpinfo/kamino/providers/kaminoProvider.d.ts +6 -0
  35. package/dist/analytics/lpinfo/kamino/services/kaminoLiquidityService.d.ts +203 -0
  36. package/dist/analytics/lpinfo/kamino/services/kaminoService.d.ts +171 -0
  37. package/dist/analytics/lpinfo/steer/index.d.ts +7 -0
  38. package/dist/analytics/lpinfo/steer/providers/steerLiquidityProvider.d.ts +6 -0
  39. package/dist/analytics/lpinfo/steer/services/steerLiquidityService.d.ts +208 -0
  40. package/dist/analytics/lpinfo/steer/steer-display-types.d.ts +97 -0
  41. package/dist/analytics/news/index.d.ts +32 -0
  42. package/dist/analytics/news/interfaces/types.d.ts +177 -0
  43. package/dist/analytics/news/providers/defiNewsProvider.d.ts +106 -0
  44. package/dist/analytics/news/services/newsDataService.d.ts +72 -0
  45. package/dist/analytics/news/utils/formatters.d.ts +54 -0
  46. package/dist/analytics/token-info/action.d.ts +6 -0
  47. package/dist/analytics/token-info/index.d.ts +3 -0
  48. package/dist/analytics/token-info/params.d.ts +10 -0
  49. package/dist/analytics/token-info/providers.d.ts +4 -0
  50. package/dist/analytics/token-info/service.d.ts +19 -0
  51. package/dist/analytics/token-info/types.d.ts +45 -0
  52. package/dist/api/wallet-routes.d.ts +100 -0
  53. package/dist/audit/audit-log.d.ts +29 -0
  54. package/dist/browser-shim/build-shim.d.ts +31 -0
  55. package/dist/browser-shim/index.d.ts +1 -0
  56. package/dist/chains/evm/actions/helpers.d.ts +31 -0
  57. package/dist/chains/evm/actions/swap.d.ts +53 -0
  58. package/dist/chains/evm/actions/transfer.d.ts +10 -0
  59. package/dist/chains/evm/bridge-router.d.ts +44 -0
  60. package/dist/chains/evm/build.d.ts +2 -0
  61. package/dist/chains/evm/chain-handler.d.ts +37 -0
  62. package/dist/chains/evm/constants.d.ts +16 -0
  63. package/dist/chains/evm/dex/aerodrome/index.d.ts +6 -0
  64. package/dist/chains/evm/dex/aerodrome/services/AerodromeLpService.d.ts +27 -0
  65. package/dist/chains/evm/dex/aerodrome/types.d.ts +435 -0
  66. package/dist/chains/evm/dex/pancakeswp/index.d.ts +6 -0
  67. package/dist/chains/evm/dex/pancakeswp/services/PancakeSwapV3LpService.d.ts +28 -0
  68. package/dist/chains/evm/dex/pancakeswp/types.d.ts +19 -0
  69. package/dist/chains/evm/dex/uniswap/index.d.ts +6 -0
  70. package/dist/chains/evm/dex/uniswap/services/UniswapV3LpService.d.ts +28 -0
  71. package/dist/chains/evm/dex/uniswap/types.d.ts +458 -0
  72. package/dist/chains/evm/generated/specs/spec-helpers.d.ts +35 -0
  73. package/dist/chains/evm/generated/specs/specs.d.ts +99 -0
  74. package/dist/chains/evm/gov-router.d.ts +6 -0
  75. package/dist/chains/evm/index.browser.d.ts +3 -0
  76. package/dist/chains/evm/index.d.ts +6 -0
  77. package/dist/chains/evm/prompts.d.ts +24 -0
  78. package/dist/chains/evm/providers/get-balance.d.ts +2 -0
  79. package/dist/chains/evm/providers/wallet.d.ts +35 -0
  80. package/dist/chains/evm/routes/sign.d.ts +13 -0
  81. package/dist/chains/evm/rpc-providers.d.ts +26 -0
  82. package/dist/chains/evm/service.d.ts +26 -0
  83. package/dist/chains/evm/templates/index.d.ts +1 -0
  84. package/dist/chains/evm/types/index.d.ts +296 -0
  85. package/dist/chains/evm/vitest.config.d.ts +2 -0
  86. package/dist/chains/registry.d.ts +3 -0
  87. package/dist/chains/solana/actions/confirmation.d.ts +9 -0
  88. package/dist/chains/solana/bn.d.ts +6 -0
  89. package/dist/chains/solana/build.d.ts +2 -0
  90. package/dist/chains/solana/constants.d.ts +2 -0
  91. package/dist/chains/solana/dex/meteora/e2e/scenarios.d.ts +10 -0
  92. package/dist/chains/solana/dex/meteora/e2e/test-utils.d.ts +28 -0
  93. package/dist/chains/solana/dex/meteora/index.d.ts +3 -0
  94. package/dist/chains/solana/dex/meteora/providers/positionProvider.d.ts +9 -0
  95. package/dist/chains/solana/dex/meteora/services/MeteoraLpService.d.ts +37 -0
  96. package/dist/chains/solana/dex/meteora/utils/dlmm.d.ts +6 -0
  97. package/dist/chains/solana/dex/meteora/utils/loadWallet.d.ts +14 -0
  98. package/dist/chains/solana/dex/meteora/utils/sendTransaction.d.ts +2 -0
  99. package/dist/chains/solana/dex/orca/index.d.ts +6 -0
  100. package/dist/chains/solana/dex/orca/providers/positionProvider.d.ts +10 -0
  101. package/dist/chains/solana/dex/orca/services/srv_orca.d.ts +10 -0
  102. package/dist/chains/solana/dex/orca/types.d.ts +61 -0
  103. package/dist/chains/solana/dex/orca/utils/loadWallet.d.ts +1 -0
  104. package/dist/chains/solana/dex/orca/utils/sendTransaction.d.ts +2 -0
  105. package/dist/chains/solana/dex/raydium/index.d.ts +6 -0
  106. package/dist/chains/solana/dex/raydium/providers/positionProvider.d.ts +10 -0
  107. package/dist/chains/solana/dex/raydium/services/srv_raydium.d.ts +104 -0
  108. package/dist/chains/solana/dex/raydium/types.d.ts +42 -0
  109. package/dist/chains/solana/environment.d.ts +15 -0
  110. package/dist/chains/solana/generated/specs/spec-helpers.d.ts +35 -0
  111. package/dist/chains/solana/generated/specs/specs.d.ts +73 -0
  112. package/dist/chains/solana/index.browser.d.ts +3 -0
  113. package/dist/chains/solana/index.d.ts +7 -0
  114. package/dist/chains/solana/keypairUtils.d.ts +7 -0
  115. package/dist/chains/solana/prompts.d.ts +12 -0
  116. package/dist/chains/solana/providers/wallet.d.ts +2 -0
  117. package/dist/chains/solana/routes/index.d.ts +2 -0
  118. package/dist/chains/solana/routes/sign.d.ts +16 -0
  119. package/dist/chains/solana/service.d.ts +237 -0
  120. package/dist/chains/solana/types.d.ts +377 -0
  121. package/dist/chains/solana/vitest.config.d.ts +2 -0
  122. package/dist/chains/wallet-action.d.ts +3 -0
  123. package/dist/contracts.d.ts +58 -0
  124. package/dist/core-augmentation.d.ts +9 -0
  125. package/dist/index.d.mts +27 -34727
  126. package/dist/index.d.ts +27 -0
  127. package/dist/index.mjs +28246 -21186
  128. package/dist/index.mjs.map +153 -0
  129. package/dist/lib/server-wallet-trade.d.ts +22 -0
  130. package/dist/lib/server-wallet-trade.js +333 -0
  131. package/dist/lib/server-wallet-trade.js.map +11 -0
  132. package/dist/lib/wallet-export-guard.d.ts +45 -0
  133. package/dist/lp/actions/liquidity.d.ts +2 -0
  134. package/dist/lp/e2e/real-token-tests.d.ts +6 -0
  135. package/dist/lp/e2e/scenarios.d.ts +9 -0
  136. package/dist/lp/e2e/test-utils.d.ts +28 -0
  137. package/dist/lp/lp-manager-entry.d.ts +18 -0
  138. package/dist/lp/services/ConcentratedLiquidityService.d.ts +32 -0
  139. package/dist/lp/services/DexInteractionService.d.ts +34 -0
  140. package/dist/lp/services/LpManagementService.d.ts +116 -0
  141. package/dist/lp/services/UserLpProfileService.d.ts +18 -0
  142. package/dist/lp/services/VaultService.d.ts +21 -0
  143. package/dist/lp/services/YieldOptimizationService.d.ts +59 -0
  144. package/dist/lp/services/__tests__/MockLpService.d.ts +17 -0
  145. package/dist/lp/types.d.ts +439 -0
  146. package/dist/lp/utils/solanaClient.d.ts +26 -0
  147. package/dist/plugin.d.ts +7 -0
  148. package/dist/policy/policy.d.ts +14 -0
  149. package/dist/providers/canonical-provider.d.ts +19 -0
  150. package/dist/providers/wallet-provider.d.ts +5 -0
  151. package/dist/register-routes.d.ts +1 -0
  152. package/dist/routes/plugin.d.ts +14 -0
  153. package/dist/routes/wallet-market-overview-route.d.ts +7 -0
  154. package/dist/sdk/abi.d.ts +396 -0
  155. package/dist/sdk/bridge/abis.d.ts +63 -0
  156. package/dist/sdk/bridge/client.d.ts +48 -0
  157. package/dist/sdk/bridge/index.d.ts +14 -0
  158. package/dist/sdk/bridge/solana.d.ts +131 -0
  159. package/dist/sdk/bridge/types.d.ts +92 -0
  160. package/dist/sdk/convenience.d.ts +104 -0
  161. package/dist/sdk/escrow/MutualStakeEscrow.d.ts +75 -0
  162. package/dist/sdk/escrow/types.d.ts +58 -0
  163. package/dist/sdk/escrow/verifiers.d.ts +25 -0
  164. package/dist/sdk/identity/erc8004.d.ts +304 -0
  165. package/dist/sdk/identity/reputation.d.ts +317 -0
  166. package/dist/sdk/identity/uaid.d.ts +192 -0
  167. package/dist/sdk/identity/validation.d.ts +282 -0
  168. package/dist/sdk/index.d.ts +133 -0
  169. package/dist/sdk/index.js +5284 -0
  170. package/dist/sdk/index.js.map +40 -0
  171. package/dist/sdk/policy/SpendingPolicy.d.ts +105 -0
  172. package/dist/sdk/policy/UptoBillingPolicy.d.ts +87 -0
  173. package/dist/sdk/router/PaymentRouter.d.ts +77 -0
  174. package/dist/sdk/router/index.d.ts +2 -0
  175. package/dist/sdk/swap/SwapModule.d.ts +47 -0
  176. package/dist/sdk/swap/abi.d.ts +50 -0
  177. package/dist/sdk/swap/index.d.ts +11 -0
  178. package/dist/sdk/swap/types.d.ts +101 -0
  179. package/dist/sdk/tokens/decimals.d.ts +64 -0
  180. package/dist/sdk/tokens/registry.d.ts +81 -0
  181. package/dist/sdk/tokens/solana.d.ts +107 -0
  182. package/dist/sdk/tokens/transfers.d.ts +94 -0
  183. package/dist/sdk/types.d.ts +129 -0
  184. package/dist/sdk/wallet-core.d.ts +29450 -0
  185. package/dist/sdk/x402/budget.d.ts +51 -0
  186. package/dist/sdk/x402/chains/abstract/index.d.ts +134 -0
  187. package/dist/sdk/x402/client.d.ts +66 -0
  188. package/dist/sdk/x402/index.d.ts +8 -0
  189. package/dist/sdk/x402/middleware.d.ts +37 -0
  190. package/dist/sdk/x402/multi-asset.d.ts +53 -0
  191. package/dist/sdk/x402/types.d.ts +109 -0
  192. package/dist/security/wallet-context-safety.d.ts +7 -0
  193. package/dist/security/wallet-financial-confirmation.d.ts +23 -0
  194. package/dist/services/wallet-backend-service.d.ts +39 -0
  195. package/dist/types/wallet-router.d.ts +130 -0
  196. package/dist/utils/intent-trajectory.d.ts +34 -0
  197. package/dist/wallet/backend.d.ts +41 -0
  198. package/dist/wallet/errors.d.ts +17 -0
  199. package/dist/wallet/index.d.ts +6 -0
  200. package/dist/wallet/local-eoa-backend.d.ts +37 -0
  201. package/dist/wallet/pending.d.ts +47 -0
  202. package/dist/wallet/select-backend.d.ts +11 -0
  203. package/dist/wallet/steward-backend.d.ts +22 -0
  204. package/dist/wallet-action.d.ts +1 -0
  205. package/dist/wallet-action.js +6292 -0
  206. package/dist/wallet-action.js.map +44 -0
  207. package/package.json +35 -21
  208. package/registry-entry.json +134 -0
  209. package/src/analytics/birdeye/actions/wallet-search-address.ts +85 -5
  210. package/src/analytics/birdeye/birdeye-task.ts +25 -9
  211. package/src/analytics/birdeye/birdeye.ts +6 -7
  212. package/src/analytics/birdeye/constants.ts +0 -1
  213. package/src/analytics/birdeye/providers/agent-portfolio-provider.ts +0 -1
  214. package/src/analytics/birdeye/providers/market.ts +51 -45
  215. package/src/analytics/birdeye/providers/portfolio-factory.ts +79 -38
  216. package/src/analytics/birdeye/providers/trending.ts +43 -46
  217. package/src/analytics/birdeye/providers/wallet.ts +0 -1
  218. package/src/analytics/birdeye/search-category.test.ts +1 -1
  219. package/src/analytics/birdeye/search-category.ts +77 -12
  220. package/src/analytics/birdeye/service.test.ts +146 -0
  221. package/src/analytics/birdeye/service.ts +220 -105
  222. package/src/analytics/birdeye/types/api/common.ts +0 -1
  223. package/src/analytics/birdeye/types/api/defi.ts +0 -1
  224. package/src/analytics/birdeye/types/api/pair.ts +0 -1
  225. package/src/analytics/birdeye/types/api/search.ts +0 -1
  226. package/src/analytics/birdeye/types/api/token.ts +0 -1
  227. package/src/analytics/birdeye/types/api/trader.ts +0 -1
  228. package/src/analytics/birdeye/types/api/wallet.ts +0 -1
  229. package/src/analytics/birdeye/types/shared.ts +0 -11
  230. package/src/analytics/birdeye/utils.test.ts +69 -0
  231. package/src/analytics/birdeye/utils.ts +11 -8
  232. package/src/analytics/dexscreener/search-category.ts +0 -1
  233. package/src/analytics/dexscreener/service.ts +7 -12
  234. package/src/analytics/dexscreener/types.ts +0 -1
  235. package/src/analytics/lpinfo/index.ts +5 -2
  236. package/src/analytics/lpinfo/kamino/README.md +2 -2
  237. package/src/analytics/lpinfo/kamino/index.ts +9 -2
  238. package/src/analytics/lpinfo/kamino/providers/kaminoLiquidityProvider.ts +6 -26
  239. package/src/analytics/lpinfo/kamino/providers/kaminoPoolProvider.ts +11 -12
  240. package/src/analytics/lpinfo/kamino/providers/kaminoProvider.ts +76 -32
  241. package/src/analytics/lpinfo/kamino/services/kaminoLiquidityService.ts +78 -38
  242. package/src/analytics/lpinfo/kamino/services/kaminoService.ts +71 -31
  243. package/src/analytics/lpinfo/steer/index.ts +7 -2
  244. package/src/analytics/lpinfo/steer/providers/steerLiquidityProvider.ts +25 -26
  245. package/src/analytics/lpinfo/steer/services/steerLiquidityService.ts +367 -149
  246. package/src/analytics/news/index.ts +7 -2
  247. package/src/analytics/news/interfaces/types.ts +0 -1
  248. package/src/analytics/news/providers/defiNewsProvider.ts +17 -44
  249. package/src/analytics/news/services/newsDataService.ts +1 -22
  250. package/src/analytics/news/utils/formatters.test.ts +60 -0
  251. package/src/analytics/news/utils/formatters.ts +0 -1
  252. package/src/analytics/token-info/action.ts +52 -212
  253. package/src/analytics/token-info/index.ts +1 -1
  254. package/src/analytics/token-info/params.test.ts +69 -0
  255. package/src/analytics/token-info/params.ts +13 -11
  256. package/src/analytics/token-info/providers.ts +46 -17
  257. package/src/analytics/token-info/service.ts +3 -3
  258. package/src/analytics/token-info/types.ts +2 -2
  259. package/src/api/wallet-routes.test.ts +56 -0
  260. package/src/api/wallet-routes.ts +1728 -0
  261. package/src/audit/audit-log.ts +57 -2
  262. package/src/browser-shim/build-shim.ts +1 -1
  263. package/src/browser-shim/shim.template.js +107 -117
  264. package/src/chains/{wallet-router.test.ts → __tests__/wallet-router.test.ts} +57 -10
  265. package/src/chains/evm/actions/helpers.ts +9 -7
  266. package/src/chains/evm/actions/swap.ts +176 -22
  267. package/src/chains/evm/actions/transfer.ts +29 -22
  268. package/src/chains/evm/biome.json +1 -1
  269. package/src/chains/evm/build.ts +6 -1
  270. package/src/chains/evm/constants.ts +19 -0
  271. package/src/chains/evm/contracts/artifacts/OZGovernor.json +25 -1682
  272. package/src/chains/evm/dex/aerodrome/index.ts +6 -1
  273. package/src/chains/evm/dex/aerodrome/services/AerodromeLpService.ts +41 -15
  274. package/src/chains/evm/dex/aerodrome/types.ts +1 -2
  275. package/src/chains/evm/dex/pancakeswp/index.ts +6 -1
  276. package/src/chains/evm/dex/pancakeswp/services/PancakeSwapV3LpService.ts +54 -17
  277. package/src/chains/evm/dex/pancakeswp/types.ts +1 -2
  278. package/src/chains/evm/dex/uniswap/index.ts +6 -1
  279. package/src/chains/evm/dex/uniswap/services/UniswapV3LpService.ts +20 -9
  280. package/src/chains/evm/dex/uniswap/types.ts +1 -2
  281. package/src/chains/evm/gov-router.ts +3 -1
  282. package/src/chains/evm/index.browser.ts +1 -1
  283. package/src/chains/evm/index.ts +5 -1
  284. package/src/chains/evm/prompts.ts +5 -0
  285. package/src/chains/evm/providers/get-balance.ts +1 -1
  286. package/src/chains/evm/providers/wallet.ts +80 -9
  287. package/src/chains/evm/routes/sign.ts +35 -26
  288. package/src/chains/evm/rpc-providers.ts +1 -1
  289. package/src/chains/evm/types/index.ts +22 -2
  290. package/src/chains/registry.ts +1 -1
  291. package/src/chains/wallet-action.ts +301 -91
  292. package/src/index.ts +9 -5
  293. package/src/lib/wallet-export-guard.test.ts +233 -0
  294. package/src/lib/wallet-export-guard.ts +1 -1
  295. package/src/lp/actions/liquidity.ts +53 -26
  296. package/src/lp/e2e/real-token-tests.ts +0 -1
  297. package/src/lp/e2e/scenarios.ts +1 -2
  298. package/src/lp/e2e/test-utils.ts +20 -7
  299. package/src/lp/lp-manager-entry.ts +2 -5
  300. package/src/lp/services/ConcentratedLiquidityService.ts +3 -10
  301. package/src/lp/services/DexInteractionService.ts +1 -2
  302. package/src/lp/services/LpManagementService.test.ts +0 -1
  303. package/src/lp/services/LpManagementService.ts +75 -35
  304. package/src/lp/services/UserLpProfileService.ts +2 -3
  305. package/src/lp/services/VaultService.ts +10 -4
  306. package/src/lp/services/YieldOptimizationService.ts +29 -13
  307. package/src/lp/services/__tests__/MockLpService.ts +1 -2
  308. package/src/lp/types.ts +9 -13
  309. package/src/lp/utils/solanaClient.ts +4 -2
  310. package/src/plugin.routes.test.ts +24 -0
  311. package/src/plugin.ts +30 -13
  312. package/src/providers/canonical-provider.ts +1 -1
  313. package/src/providers/{unified-wallet-provider.ts → wallet-provider.ts} +3 -3
  314. package/src/routes/__fixtures__/coingecko-markets.recorded.json +97 -0
  315. package/src/routes/wallet-market-overview-route.ts +1 -1
  316. package/src/routes/wallet-market-overview.contract.test.ts +139 -0
  317. package/src/routes/wallet-market-overview.real.test.ts +83 -0
  318. package/src/sdk/escrow/MutualStakeEscrow.ts +1 -2
  319. package/src/sdk/identity/erc8004.ts +1 -1
  320. package/src/sdk/identity/validation.ts +3 -4
  321. package/src/sdk/index.ts +2 -2
  322. package/src/sdk/policy/SpendingPolicy.ts +1 -1
  323. package/src/sdk/router/PaymentRouter.ts +8 -11
  324. package/src/sdk/swap/SwapModule.ts +1 -1
  325. package/src/sdk/tokens/registry.ts +1 -1
  326. package/src/sdk/x402/middleware.ts +2 -8
  327. package/src/security/__tests__/wallet-context-safety.test.ts +79 -0
  328. package/src/security/__tests__/wallet-financial-confirmation.test.ts +88 -0
  329. package/src/security/wallet-context-safety.ts +128 -0
  330. package/src/security/wallet-financial-confirmation.ts +150 -0
  331. package/src/services/wallet-backend-service.ts +15 -1
  332. package/src/utils/intent-trajectory.ts +2 -2
  333. package/src/wallet/steward-backend.ts +4 -4
  334. package/dist/LpManagementService-BWrQ5-cO.mjs +0 -353
  335. package/dist/MockLpService-D_Apn4Fd.mjs +0 -99
  336. package/dist/aerodrome-CfnESC32.mjs +0 -890
  337. package/dist/chunk-hT5z_Zn9.mjs +0 -35
  338. package/dist/lib/server-wallet-trade.d.mts +0 -34
  339. package/dist/lib/server-wallet-trade.mjs +0 -306
  340. package/dist/meteora-BPX39hZo.mjs +0 -22640
  341. package/dist/orca-Bybp1HXO.mjs +0 -249
  342. package/dist/pancakeswp-CkEXlXti.mjs +0 -604
  343. package/dist/plugin-ZO_MTyd0.mjs +0 -529
  344. package/dist/raydium-rfaM9yEf.mjs +0 -539
  345. package/dist/sdk/index.d.mts +0 -32492
  346. package/dist/sdk/index.mjs +0 -6415
  347. package/dist/types-D5252NZk.mjs +0 -487
  348. package/dist/uniswap-CReXgXVN.mjs +0 -573
  349. package/dist/wallet-action.d.mts +0 -6
  350. package/dist/wallet-action.mjs +0 -820
  351. package/src/analytics/birdeye/tasks/birdeye.ts +0 -232
  352. package/src/analytics/lpinfo/index.d.ts +0 -7
  353. package/src/chains/evm/contracts/artifacts/TimelockController.json +0 -1007
  354. package/src/chains/evm/contracts/artifacts/VoteToken.json +0 -895
  355. package/src/lp/tasks/LpAutoRebalanceTask.ts +0 -117
  356. package/src/lp/tasks/__tests__/LpAutoRebalanceTask.test.ts +0 -370
@@ -1,9 +1,13 @@
1
+ import { createHash } from "node:crypto";
1
2
  import type {
2
3
  ActionFailureCode,
3
4
  ValidateFailureCode,
4
5
  } from "../actions/failure-codes.js";
5
6
  import type { SignScope } from "../wallet/pending.js";
6
7
 
8
+ const AUDIT_HASH_ALGORITHM = "sha256";
9
+ const AUDIT_GENESIS_HASH = "0".repeat(64);
10
+
7
11
  export type AuditKind =
8
12
  | "action_validate_start"
9
13
  | "action_validate_end"
@@ -25,8 +29,7 @@ export type AuditOutcome =
25
29
  | "rejected";
26
30
 
27
31
  /**
28
- * Row shape for the append-only audit log (hash-chained at rest).
29
- * Implementation + SQL migration land with Phase 1 runtime wiring.
32
+ * Row shape for the append-only audit log.
30
33
  */
31
34
  export interface AuditLogRow {
32
35
  readonly id: bigint;
@@ -43,3 +46,55 @@ export interface AuditLogRow {
43
46
  readonly prevHash: string;
44
47
  readonly rowHash: string;
45
48
  }
49
+
50
+ export type AuditLogRowInput = Omit<
51
+ AuditLogRow,
52
+ "id" | "ts" | "prevHash" | "rowHash"
53
+ > & {
54
+ readonly id?: bigint;
55
+ readonly ts?: number;
56
+ readonly prevHash?: string | null;
57
+ };
58
+
59
+ export function createAuditLogRow(input: AuditLogRowInput): AuditLogRow {
60
+ const rowWithoutHash = {
61
+ id: input.id ?? 0n,
62
+ ts: input.ts ?? Date.now(),
63
+ actor: input.actor,
64
+ kind: input.kind,
65
+ scope: input.scope,
66
+ actionName: input.actionName,
67
+ paramsHash: input.paramsHash,
68
+ approvalId: input.approvalId,
69
+ outcome: input.outcome,
70
+ failureCode: input.failureCode,
71
+ detail: input.detail,
72
+ prevHash: input.prevHash ?? AUDIT_GENESIS_HASH,
73
+ };
74
+ return {
75
+ ...rowWithoutHash,
76
+ rowHash: computeAuditLogRowHash(rowWithoutHash),
77
+ };
78
+ }
79
+
80
+ export function verifyAuditLogRow(row: AuditLogRow): boolean {
81
+ return row.rowHash === computeAuditLogRowHash(row);
82
+ }
83
+
84
+ function computeAuditLogRowHash(row: Omit<AuditLogRow, "rowHash">): string {
85
+ const canonical = JSON.stringify({
86
+ id: row.id.toString(),
87
+ ts: row.ts,
88
+ actor: row.actor,
89
+ kind: row.kind,
90
+ scope: row.scope,
91
+ actionName: row.actionName,
92
+ paramsHash: row.paramsHash,
93
+ approvalId: row.approvalId,
94
+ outcome: row.outcome,
95
+ failureCode: row.failureCode,
96
+ detail: row.detail,
97
+ prevHash: row.prevHash,
98
+ });
99
+ return createHash(AUDIT_HASH_ALGORITHM).update(canonical).digest("hex");
100
+ }
@@ -74,7 +74,7 @@ function readTemplate(): string {
74
74
  }
75
75
  }
76
76
  throw new Error(
77
- "wallet shim template not found in any of: " + candidates.join(", "),
77
+ `wallet shim template not found in any of: ${candidates.join(", ")}`,
78
78
  );
79
79
  }
80
80
 
@@ -1,4 +1,5 @@
1
1
  /* eslint-disable */
2
+ // biome-ignore-all lint/correctness/noInnerDeclarations: this injected browser template intentionally uses function-scoped var declarations for compatibility.
2
3
  /**
3
4
  * Wallet shim — runs inside an arbitrary dApp page (in MAIN world) and exposes
4
5
  * the agent's resident keypairs as both a Solana Wallet-Standard wallet and an
@@ -6,7 +7,7 @@
6
7
  * HTTP API (`@elizaos/plugin-wallet` sign endpoints) over fetch.
7
8
  *
8
9
  * The shim is consumed via `buildWalletShim({ apiBase, signToken, walletName,
9
- * walletIcon, solanaPublicKey, evmAddress })` which substitutes the placeholder
10
+ * walletIcon, solanaPublicKey, evmAddress })` which substitutes the config
10
11
  * `__SHIM_CONFIG__` token and returns a self-contained string suitable for
11
12
  * `Page.addInitScript` / `BROWSER eval` / a MAIN-world content script.
12
13
  *
@@ -32,7 +33,9 @@
32
33
  for (var i = 0; i < bytes.length; i += chunk) {
33
34
  bin += String.fromCharCode.apply(
34
35
  null,
35
- bytes.subarray ? bytes.subarray(i, i + chunk) : bytes.slice(i, i + chunk),
36
+ bytes.subarray
37
+ ? bytes.subarray(i, i + chunk)
38
+ : bytes.slice(i, i + chunk),
36
39
  );
37
40
  }
38
41
  return btoa(bin);
@@ -43,11 +46,11 @@
43
46
  for (var i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
44
47
  return out;
45
48
  }
46
- function bytesToHex(bytes) {
49
+ function _bytesToHex(bytes) {
47
50
  var out = "0x";
48
51
  for (var i = 0; i < bytes.length; i++) {
49
52
  var h = bytes[i].toString(16);
50
- out += h.length === 1 ? "0" + h : h;
53
+ out += h.length === 1 ? `0${h}` : h;
51
54
  }
52
55
  return out;
53
56
  }
@@ -56,7 +59,7 @@
56
59
  }
57
60
  // base58 (Bitcoin alphabet) — small impl, only needed to log the active key
58
61
  var B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
59
- function base58Encode(bytes) {
62
+ function _base58Encode(bytes) {
60
63
  var digits = [0];
61
64
  for (var i = 0; i < bytes.length; i++) {
62
65
  var carry = bytes[i];
@@ -100,13 +103,13 @@
100
103
  method: "POST",
101
104
  headers: {
102
105
  "Content-Type": "application/json",
103
- Authorization: "Bearer " + CONFIG.signToken,
106
+ Authorization: `Bearer ${CONFIG.signToken}`,
104
107
  },
105
108
  body: JSON.stringify(body || {}),
106
- }).then(function (r) {
109
+ }).then((r) => {
107
110
  if (!r.ok) {
108
- return r.text().then(function (t) {
109
- throw new Error("wallet-shim " + path + " " + r.status + ": " + t);
111
+ return r.text().then((t) => {
112
+ throw new Error(`wallet-shim ${path} ${r.status}: ${t}`);
110
113
  });
111
114
  }
112
115
  return r.json();
@@ -117,17 +120,15 @@
117
120
  function makeEmitter() {
118
121
  var listeners = {};
119
122
  return {
120
- on: function (e, l) {
121
- (listeners[e] = listeners[e] || []).push(l);
122
- return function () {
123
- listeners[e] = (listeners[e] || []).filter(function (x) {
124
- return x !== l;
125
- });
123
+ on: (e, l) => {
124
+ listeners[e] = listeners[e] || [];
125
+ listeners[e].push(l);
126
+ return () => {
127
+ listeners[e] = (listeners[e] || []).filter((x) => x !== l);
126
128
  };
127
129
  },
128
- emit: function (e) {
129
- var args = [].slice.call(arguments, 1);
130
- (listeners[e] || []).forEach(function (l) {
130
+ emit: (e, ...args) => {
131
+ (listeners[e] || []).forEach((l) => {
131
132
  try {
132
133
  l.apply(null, args);
133
134
  } catch (_) {}
@@ -167,46 +168,40 @@
167
168
 
168
169
  function signTransaction(input) {
169
170
  var inputs = Array.isArray(input) ? input : [input];
170
- var b64s = inputs.map(function (i) {
171
- return bytesToBase64(i.transaction);
172
- });
171
+ var b64s = inputs.map((i) => bytesToBase64(i.transaction));
173
172
  return api("/wallet/solana/sign-all-transactions", {
174
173
  transactionsBase64: b64s,
175
- }).then(function (resp) {
176
- return resp.signedBase64s.map(function (b64) {
177
- return { signedTransaction: base64ToBytes(b64) };
178
- });
179
- });
174
+ }).then((resp) =>
175
+ resp.signedBase64s.map((b64) => ({
176
+ signedTransaction: base64ToBytes(b64),
177
+ })),
178
+ );
180
179
  }
181
180
 
182
181
  function signAndSendTransaction(input) {
183
182
  var inputs = Array.isArray(input) ? input : [input];
184
183
  return Promise.all(
185
- inputs.map(function (i) {
186
- return api("/wallet/solana/sign-and-send-transaction", {
184
+ inputs.map((i) =>
185
+ api("/wallet/solana/sign-and-send-transaction", {
187
186
  transactionBase64: bytesToBase64(i.transaction),
188
187
  sendOptions: i.options || {},
189
- }).then(function (resp) {
190
- return { signature: base58Decode(resp.signature) };
191
- });
192
- }),
188
+ }).then((resp) => ({ signature: base58Decode(resp.signature) })),
189
+ ),
193
190
  );
194
191
  }
195
192
 
196
193
  function signMessage(input) {
197
194
  var inputs = Array.isArray(input) ? input : [input];
198
195
  return Promise.all(
199
- inputs.map(function (i) {
200
- return api("/wallet/solana/sign-message", {
196
+ inputs.map((i) =>
197
+ api("/wallet/solana/sign-message", {
201
198
  messageBase64: bytesToBase64(i.message),
202
- }).then(function (resp) {
203
- return {
204
- signedMessage: i.message,
205
- signature: base64ToBytes(resp.signatureBase64),
206
- signatureType: "ed25519",
207
- };
208
- });
209
- }),
199
+ }).then((resp) => ({
200
+ signedMessage: i.message,
201
+ signature: base64ToBytes(resp.signatureBase64),
202
+ signatureType: "ed25519",
203
+ })),
204
+ ),
210
205
  );
211
206
  }
212
207
 
@@ -221,9 +216,7 @@
221
216
  "standard:disconnect": { version: "1.0.0", disconnect: disconnect },
222
217
  "standard:events": {
223
218
  version: "1.0.0",
224
- on: function (e, l) {
225
- return emitter.on(e, l);
226
- },
219
+ on: (e, l) => emitter.on(e, l),
227
220
  },
228
221
  "solana:signTransaction": {
229
222
  version: "1.0.0",
@@ -246,7 +239,7 @@
246
239
  function registerCallback(api) {
247
240
  try {
248
241
  api.register(wallet);
249
- } catch (e) {
242
+ } catch (_e) {
250
243
  // already registered or registry refused — non-fatal
251
244
  }
252
245
  }
@@ -264,8 +257,8 @@
264
257
  try {
265
258
  window.addEventListener(
266
259
  "wallet-standard:app-ready",
267
- function (e) {
268
- if (e && e.detail) registerCallback(e.detail);
260
+ (e) => {
261
+ if (e?.detail) registerCallback(e.detail);
269
262
  },
270
263
  false,
271
264
  );
@@ -284,88 +277,95 @@
284
277
  var phantomLike = {
285
278
  isPhantom: true,
286
279
  isConnected: true,
287
- publicKey: { toBase58: function () { return publicKey; }, toBuffer: function () { return publicKeyBytes; }, toBytes: function () { return publicKeyBytes; }, toString: function () { return publicKey; } },
280
+ publicKey: {
281
+ toBase58: () => publicKey,
282
+ toBuffer: () => publicKeyBytes,
283
+ toBytes: () => publicKeyBytes,
284
+ toString: () => publicKey,
285
+ },
288
286
  connect: function () {
289
287
  return Promise.resolve({ publicKey: this.publicKey });
290
288
  },
291
- disconnect: function () {
289
+ disconnect: () => {
292
290
  emitter.emit("disconnect");
293
291
  return Promise.resolve();
294
292
  },
295
293
  on: emitter.on,
296
- off: function () {},
297
- signTransaction: function (tx) {
294
+ off: () => {},
295
+ signTransaction: (tx) => {
298
296
  // legacy phantom returns a single signed tx (Transaction object); we
299
297
  // only have raw bytes so dApps using the new adapter pattern get the
300
298
  // proper Wallet-Standard call instead.
301
299
  var serialized =
302
300
  typeof tx.serialize === "function"
303
- ? tx.serialize({ requireAllSignatures: false, verifySignatures: false })
301
+ ? tx.serialize({
302
+ requireAllSignatures: false,
303
+ verifySignatures: false,
304
+ })
304
305
  : tx;
305
306
  return api("/wallet/solana/sign-transaction", {
306
307
  transactionBase64: bytesToBase64(new Uint8Array(serialized)),
307
- }).then(function (resp) {
308
+ }).then((resp) => {
308
309
  var bytes = base64ToBytes(resp.signedBase64);
309
310
  // Try to populate signatures back into the original tx object so
310
311
  // dApp code that does `tx.signatures` keeps working.
311
312
  if (tx && Array.isArray(tx.signatures)) {
312
- // No-op; we return raw bytes the dApp can re-deserialize.
313
+ // Return raw bytes so the dApp can re-deserialize.
313
314
  }
314
315
  // Most dApps either re-deserialize or call signAndSend; expose bytes
315
316
  // via `serialize()` on the returned object.
316
317
  return {
317
- serialize: function () {
318
- return bytes;
319
- },
318
+ serialize: () => bytes,
320
319
  __signedBytes: bytes,
321
320
  };
322
321
  });
323
322
  },
324
- signAllTransactions: function (txs) {
325
- var b64s = txs.map(function (tx) {
323
+ signAllTransactions: (txs) => {
324
+ var b64s = txs.map((tx) => {
326
325
  var serialized =
327
326
  typeof tx.serialize === "function"
328
- ? tx.serialize({ requireAllSignatures: false, verifySignatures: false })
327
+ ? tx.serialize({
328
+ requireAllSignatures: false,
329
+ verifySignatures: false,
330
+ })
329
331
  : tx;
330
332
  return bytesToBase64(new Uint8Array(serialized));
331
333
  });
332
334
  return api("/wallet/solana/sign-all-transactions", {
333
335
  transactionsBase64: b64s,
334
- }).then(function (resp) {
335
- return resp.signedBase64s.map(function (b64) {
336
+ }).then((resp) =>
337
+ resp.signedBase64s.map((b64) => {
336
338
  var bytes = base64ToBytes(b64);
337
339
  return {
338
- serialize: function () {
339
- return bytes;
340
- },
340
+ serialize: () => bytes,
341
341
  __signedBytes: bytes,
342
342
  };
343
- });
344
- });
343
+ }),
344
+ );
345
345
  },
346
- signMessage: function (message, _encoding) {
347
- return api("/wallet/solana/sign-message", {
346
+ signMessage: (message, _encoding) =>
347
+ api("/wallet/solana/sign-message", {
348
348
  messageBase64: bytesToBase64(
349
- message instanceof Uint8Array ? message : utf8ToBytes(String(message)),
349
+ message instanceof Uint8Array
350
+ ? message
351
+ : utf8ToBytes(String(message)),
350
352
  ),
351
- }).then(function (resp) {
352
- return {
353
- signature: base64ToBytes(resp.signatureBase64),
354
- publicKey: { toBase58: function () { return publicKey; } },
355
- };
356
- });
357
- },
358
- signAndSendTransaction: function (tx, options) {
353
+ }).then((resp) => ({
354
+ signature: base64ToBytes(resp.signatureBase64),
355
+ publicKey: { toBase58: () => publicKey },
356
+ })),
357
+ signAndSendTransaction: (tx, options) => {
359
358
  var serialized =
360
359
  typeof tx.serialize === "function"
361
- ? tx.serialize({ requireAllSignatures: false, verifySignatures: false })
360
+ ? tx.serialize({
361
+ requireAllSignatures: false,
362
+ verifySignatures: false,
363
+ })
362
364
  : tx;
363
365
  return api("/wallet/solana/sign-and-send-transaction", {
364
366
  transactionBase64: bytesToBase64(new Uint8Array(serialized)),
365
367
  sendOptions: options || {},
366
- }).then(function (resp) {
367
- return { signature: resp.signature };
368
- });
368
+ }).then((resp) => ({ signature: resp.signature }));
369
369
  },
370
370
  };
371
371
 
@@ -392,7 +392,7 @@
392
392
  if (!CONFIG.evmAddress) return;
393
393
  var address = CONFIG.evmAddress.toLowerCase();
394
394
  var emitter = makeEmitter();
395
- var chainId = "0x" + CONFIG.evmChainId.toString(16);
395
+ var chainId = `0x${CONFIG.evmChainId.toString(16)}`;
396
396
 
397
397
  function rpc(method, params) {
398
398
  // Forward read-only RPC methods to a public RPC for this chain. The agent
@@ -408,10 +408,8 @@
408
408
  params: params || [],
409
409
  }),
410
410
  })
411
- .then(function (r) {
412
- return r.json();
413
- })
414
- .then(function (j) {
411
+ .then((r) => r.json())
412
+ .then((j) => {
415
413
  if (j.error) throw new Error(j.error.message || "rpc error");
416
414
  return j.result;
417
415
  });
@@ -421,9 +419,9 @@
421
419
  isMetaMask: true, // many dApps gate connect-button discovery on this
422
420
  isElizaWallet: true,
423
421
  _state: { isConnected: true, accounts: [address], chainId: chainId },
424
- request: function (args) {
425
- var method = args && args.method;
426
- var params = (args && args.params) || [];
422
+ request: (args) => {
423
+ var method = args?.method;
424
+ var params = args?.params || [];
427
425
  switch (method) {
428
426
  case "eth_requestAccounts":
429
427
  case "eth_accounts":
@@ -431,11 +429,13 @@
431
429
  case "eth_chainId":
432
430
  case "net_version":
433
431
  return Promise.resolve(
434
- method === "net_version" ? String(parseInt(chainId, 16)) : chainId,
432
+ method === "net_version"
433
+ ? String(parseInt(chainId, 16))
434
+ : chainId,
435
435
  );
436
436
  case "wallet_switchEthereumChain":
437
437
  try {
438
- var nextHex = params[0] && params[0].chainId;
438
+ var nextHex = params[0]?.chainId;
439
439
  if (typeof nextHex === "string") {
440
440
  chainId = nextHex;
441
441
  emitter.emit("chainChanged", chainId);
@@ -459,17 +459,13 @@
459
459
  maybeAddr = swap;
460
460
  }
461
461
  return api("/wallet/evm/personal-sign", { message: msg }).then(
462
- function (r) {
463
- return r.signature;
464
- },
462
+ (r) => r.signature,
465
463
  );
466
464
  }
467
465
  case "eth_sign": {
468
- return api("/wallet/evm/personal-sign", { message: params[1] }).then(
469
- function (r) {
470
- return r.signature;
471
- },
472
- );
466
+ return api("/wallet/evm/personal-sign", {
467
+ message: params[1],
468
+ }).then((r) => r.signature);
473
469
  }
474
470
  case "eth_signTypedData_v4":
475
471
  case "eth_signTypedData": {
@@ -480,9 +476,7 @@
480
476
  } catch (_) {}
481
477
  }
482
478
  return api("/wallet/evm/sign-typed-data", { typedData: data }).then(
483
- function (r) {
484
- return r.signature;
485
- },
479
+ (r) => r.signature,
486
480
  );
487
481
  }
488
482
  case "eth_sendTransaction": {
@@ -490,31 +484,25 @@
490
484
  return api("/wallet/evm/send-transaction", {
491
485
  chainId: parseInt(chainId, 16),
492
486
  tx: tx,
493
- }).then(function (r) {
494
- return r.hash;
495
- });
487
+ }).then((r) => r.hash);
496
488
  }
497
489
  case "eth_signTransaction": {
498
490
  var tx2 = params[0] || {};
499
491
  return api("/wallet/evm/sign-transaction", {
500
492
  chainId: parseInt(chainId, 16),
501
493
  tx: tx2,
502
- }).then(function (r) {
503
- return r.signedTransaction;
504
- });
494
+ }).then((r) => r.signedTransaction);
505
495
  }
506
496
  default:
507
497
  // forward read-only methods to public RPC
508
498
  return rpc(method, params);
509
499
  }
510
500
  },
511
- on: function (e, l) {
501
+ on: (e, l) => {
512
502
  emitter.on(e, l);
513
503
  },
514
- removeListener: function () {},
515
- enable: function () {
516
- return Promise.resolve([address]);
517
- },
504
+ removeListener: () => {},
505
+ enable: () => Promise.resolve([address]),
518
506
  };
519
507
 
520
508
  try {
@@ -533,7 +521,9 @@
533
521
  var info = {
534
522
  uuid:
535
523
  "00000000-0000-4000-8000-" +
536
- ("000000000000" + Math.floor(Math.random() * 1e12).toString(16)).slice(-12),
524
+ `000000000000${Math.floor(Math.random() * 1e12).toString(16)}`.slice(
525
+ -12,
526
+ ),
537
527
  name: CONFIG.walletName,
538
528
  icon: CONFIG.walletIcon,
539
529
  rdns: "ai.elizaos.wallet",
@@ -552,7 +542,7 @@
552
542
  announce();
553
543
 
554
544
  // Notify dApps that a connected wallet exists.
555
- setTimeout(function () {
545
+ setTimeout(() => {
556
546
  emitter.emit("connect", { chainId: chainId });
557
547
  emitter.emit("accountsChanged", [address]);
558
548
  }, 0);
@@ -1,12 +1,12 @@
1
1
  import type { HandlerOptions, IAgentRuntime, Memory } from "@elizaos/core";
2
2
  import { describe, expect, it, vi } from "vitest";
3
- import { WalletBackendService } from "../services/wallet-backend-service";
3
+ import { WalletBackendService } from "../../services/wallet-backend-service";
4
4
  import type {
5
5
  WalletChainHandler,
6
6
  WalletRouterExecution,
7
7
  WalletRouterParams,
8
- } from "../types/wallet-router";
9
- import { walletRouterAction } from "./wallet-action";
8
+ } from "../../types/wallet-router";
9
+ import { walletRouterAction } from "../wallet-action";
10
10
 
11
11
  function createRuntime(): IAgentRuntime {
12
12
  const logger = {
@@ -16,12 +16,22 @@ function createRuntime(): IAgentRuntime {
16
16
  log: vi.fn(),
17
17
  warn: vi.fn(),
18
18
  };
19
+ const cache = new Map<string, unknown>();
19
20
  const runtime = {
20
21
  agentId: "test-agent",
21
22
  character: { name: "Test Agent", settings: {} },
22
23
  getService: vi.fn(() => null),
23
24
  getServicesByType: vi.fn(() => []),
24
25
  getSetting: vi.fn(() => null),
26
+ getCache: vi.fn(async <T>(key: string) => cache.get(key) as T | undefined),
27
+ setCache: vi.fn(async (key: string, value: unknown) => {
28
+ cache.set(key, value);
29
+ return true;
30
+ }),
31
+ deleteCache: vi.fn(async (key: string) => {
32
+ cache.delete(key);
33
+ return true;
34
+ }),
25
35
  logger,
26
36
  };
27
37
 
@@ -99,17 +109,36 @@ function handler(
99
109
  };
100
110
  }
101
111
 
102
- function message(): Memory {
112
+ function message(text = "wallet action"): Memory {
103
113
  return {
104
114
  id: "00000000-0000-0000-0000-000000000001",
105
115
  entityId: "00000000-0000-0000-0000-000000000002",
106
116
  agentId: "00000000-0000-0000-0000-000000000003",
107
117
  roomId: "00000000-0000-0000-0000-000000000004",
108
- content: { text: "wallet action" },
118
+ content: { text },
109
119
  createdAt: Date.now(),
110
120
  } as Memory;
111
121
  }
112
122
 
123
+ async function runConfirmed(
124
+ runtime: IAgentRuntime,
125
+ parameters: Record<string, unknown>,
126
+ ) {
127
+ const first = await walletRouterAction.handler(
128
+ runtime,
129
+ message("please transfer"),
130
+ undefined,
131
+ { parameters } as HandlerOptions,
132
+ );
133
+ expect(first?.data?.requiresConfirmation).toBe(true);
134
+ return walletRouterAction.handler(
135
+ runtime,
136
+ message("yes, confirm"),
137
+ undefined,
138
+ { parameters } as HandlerOptions,
139
+ );
140
+ }
141
+
113
142
  async function run(
114
143
  runtime: IAgentRuntime,
115
144
  parameters: Record<string, unknown>,
@@ -125,7 +154,7 @@ describe("wallet router action", () => {
125
154
  const base = handler("base", "Base", "8453", "evm");
126
155
  service.registerChainHandler(base);
127
156
 
128
- const result = await run(runtime, {
157
+ const result = await runConfirmed(runtime, {
129
158
  subaction: "transfer",
130
159
  chain: "base",
131
160
  fromToken: "ETH",
@@ -152,7 +181,7 @@ describe("wallet router action", () => {
152
181
  const base = handler("base", "Base", "8453", "evm");
153
182
  service.registerChainHandler(base);
154
183
 
155
- const result = await run(runtime, {
184
+ const result = await runConfirmed(runtime, {
156
185
  subaction: "swap",
157
186
  chain: "8453",
158
187
  fromToken: "0x0000000000000000000000000000000000000000",
@@ -179,7 +208,7 @@ describe("wallet router action", () => {
179
208
  const solana = handler("solana", "Solana", "solana-mainnet", "solana");
180
209
  service.registerChainHandler(solana);
181
210
 
182
- const transfer = await run(runtime, {
211
+ const transfer = await runConfirmed(runtime, {
183
212
  subaction: "transfer",
184
213
  chain: "sol",
185
214
  fromToken: "SOL",
@@ -187,7 +216,7 @@ describe("wallet router action", () => {
187
216
  recipient: "9xQeWvG816bUx9EPfWJXn4xHLh1BaK7Z7QXDXuGpS9SW",
188
217
  mode: "execute",
189
218
  });
190
- const swap = await run(runtime, {
219
+ const swap = await runConfirmed(runtime, {
191
220
  subaction: "swap",
192
221
  chain: "solana",
193
222
  fromToken: "SOL",
@@ -255,7 +284,7 @@ describe("wallet router action", () => {
255
284
  const base = handler("base", "Base", "8453", "evm");
256
285
  service.registerChainHandler(base);
257
286
 
258
- const result = await run(runtime, {
287
+ const result = await runConfirmed(runtime, {
259
288
  subaction: "swap",
260
289
  fromToken: "ETH",
261
290
  toToken: "USDC",
@@ -271,6 +300,24 @@ describe("wallet router action", () => {
271
300
  expect(result?.data?.chain).toBe("base");
272
301
  });
273
302
 
303
+ it("does not execute when LLM sets confirmed:true without a user yes reply", async () => {
304
+ const { runtime, service } = createService();
305
+ const base = handler("base", "Base", "8453", "evm");
306
+ service.registerChainHandler(base);
307
+
308
+ const result = await run(runtime, {
309
+ subaction: "transfer",
310
+ chain: "base",
311
+ amount: "0.5",
312
+ recipient: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
313
+ mode: "execute",
314
+ confirmed: true,
315
+ });
316
+
317
+ expect(result?.data?.requiresConfirmation).toBe(true);
318
+ expect(base.execute).not.toHaveBeenCalled();
319
+ });
320
+
274
321
  it("prepares dry-run metadata without executing", async () => {
275
322
  const { runtime, service } = createService();
276
323
  const base = handler("base", "Base", "8453", "evm");