@elizaos/plugin-wallet 2.0.0-beta.1

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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/auto-enable.ts +76 -0
  4. package/dist/LpManagementService-BWrQ5-cO.mjs +353 -0
  5. package/dist/MockLpService-D_Apn4Fd.mjs +99 -0
  6. package/dist/aerodrome-CfnESC32.mjs +890 -0
  7. package/dist/chunk-hT5z_Zn9.mjs +35 -0
  8. package/dist/index.d.mts +34727 -0
  9. package/dist/index.mjs +21590 -0
  10. package/dist/lib/server-wallet-trade.d.mts +34 -0
  11. package/dist/lib/server-wallet-trade.mjs +306 -0
  12. package/dist/meteora-BPX39hZo.mjs +22640 -0
  13. package/dist/orca-Bybp1HXO.mjs +249 -0
  14. package/dist/pancakeswp-CkEXlXti.mjs +604 -0
  15. package/dist/plugin-ZO_MTyd0.mjs +529 -0
  16. package/dist/raydium-rfaM9yEf.mjs +539 -0
  17. package/dist/sdk/index.d.mts +32492 -0
  18. package/dist/sdk/index.mjs +6415 -0
  19. package/dist/types-D5252NZk.mjs +487 -0
  20. package/dist/uniswap-CReXgXVN.mjs +573 -0
  21. package/dist/wallet-action.d.mts +6 -0
  22. package/dist/wallet-action.mjs +820 -0
  23. package/package.json +152 -0
  24. package/src/actions/failure-codes.ts +79 -0
  25. package/src/actions/index.ts +1 -0
  26. package/src/analytics/birdeye/actions/wallet-search-address.ts +9 -0
  27. package/src/analytics/birdeye/birdeye-task.ts +175 -0
  28. package/src/analytics/birdeye/birdeye.ts +813 -0
  29. package/src/analytics/birdeye/constants.ts +74 -0
  30. package/src/analytics/birdeye/providers/agent-portfolio-provider.ts +18 -0
  31. package/src/analytics/birdeye/providers/market.ts +227 -0
  32. package/src/analytics/birdeye/providers/portfolio-factory.test.ts +138 -0
  33. package/src/analytics/birdeye/providers/portfolio-factory.ts +252 -0
  34. package/src/analytics/birdeye/providers/trending.ts +365 -0
  35. package/src/analytics/birdeye/providers/wallet.ts +14 -0
  36. package/src/analytics/birdeye/search-category.test.ts +207 -0
  37. package/src/analytics/birdeye/search-category.ts +506 -0
  38. package/src/analytics/birdeye/service.ts +992 -0
  39. package/src/analytics/birdeye/tasks/birdeye.ts +232 -0
  40. package/src/analytics/birdeye/types/api/common.ts +305 -0
  41. package/src/analytics/birdeye/types/api/defi.ts +220 -0
  42. package/src/analytics/birdeye/types/api/pair.ts +200 -0
  43. package/src/analytics/birdeye/types/api/search.ts +86 -0
  44. package/src/analytics/birdeye/types/api/token.ts +635 -0
  45. package/src/analytics/birdeye/types/api/trader.ts +76 -0
  46. package/src/analytics/birdeye/types/api/wallet.ts +181 -0
  47. package/src/analytics/birdeye/types/shared.ts +106 -0
  48. package/src/analytics/birdeye/utils.ts +700 -0
  49. package/src/analytics/dexscreener/errors.ts +28 -0
  50. package/src/analytics/dexscreener/index.ts +3 -0
  51. package/src/analytics/dexscreener/search-category.test.ts +49 -0
  52. package/src/analytics/dexscreener/search-category.ts +42 -0
  53. package/src/analytics/dexscreener/service.ts +595 -0
  54. package/src/analytics/dexscreener/types.ts +128 -0
  55. package/src/analytics/lpinfo/index.d.ts +7 -0
  56. package/src/analytics/lpinfo/index.ts +52 -0
  57. package/src/analytics/lpinfo/kamino/README.md +102 -0
  58. package/src/analytics/lpinfo/kamino/index.ts +24 -0
  59. package/src/analytics/lpinfo/kamino/providers/kaminoLiquidityProvider.ts +422 -0
  60. package/src/analytics/lpinfo/kamino/providers/kaminoPoolProvider.ts +365 -0
  61. package/src/analytics/lpinfo/kamino/providers/kaminoProvider.ts +496 -0
  62. package/src/analytics/lpinfo/kamino/services/kaminoLiquidityService.ts +1123 -0
  63. package/src/analytics/lpinfo/kamino/services/kaminoService.ts +758 -0
  64. package/src/analytics/lpinfo/steer/README.md +169 -0
  65. package/src/analytics/lpinfo/steer/index.ts +23 -0
  66. package/src/analytics/lpinfo/steer/providers/steerLiquidityProvider.ts +544 -0
  67. package/src/analytics/lpinfo/steer/services/steerLiquidityService.ts +1690 -0
  68. package/src/analytics/lpinfo/steer/steer-display-types.ts +99 -0
  69. package/src/analytics/news/index.ts +52 -0
  70. package/src/analytics/news/interfaces/types.ts +222 -0
  71. package/src/analytics/news/providers/defiNewsProvider.ts +734 -0
  72. package/src/analytics/news/services/newsDataService.ts +332 -0
  73. package/src/analytics/news/utils/formatters.ts +151 -0
  74. package/src/analytics/token-info/action.ts +240 -0
  75. package/src/analytics/token-info/index.ts +3 -0
  76. package/src/analytics/token-info/params.ts +215 -0
  77. package/src/analytics/token-info/providers.ts +681 -0
  78. package/src/analytics/token-info/service.ts +168 -0
  79. package/src/analytics/token-info/types.ts +74 -0
  80. package/src/audit/audit-log.ts +45 -0
  81. package/src/browser-shim/build-shim.ts +123 -0
  82. package/src/browser-shim/index.ts +5 -0
  83. package/src/browser-shim/shim.template.js +563 -0
  84. package/src/chains/evm/.github/workflows/npm-deploy.yml +112 -0
  85. package/src/chains/evm/LICENSE +21 -0
  86. package/src/chains/evm/README.md +106 -0
  87. package/src/chains/evm/actions/helpers.ts +147 -0
  88. package/src/chains/evm/actions/swap.ts +839 -0
  89. package/src/chains/evm/actions/transfer.ts +254 -0
  90. package/src/chains/evm/biome.json +61 -0
  91. package/src/chains/evm/bridge-router.ts +660 -0
  92. package/src/chains/evm/build.ts +89 -0
  93. package/src/chains/evm/chain-handler.ts +416 -0
  94. package/src/chains/evm/constants.ts +23 -0
  95. package/src/chains/evm/contracts/artifacts/OZGovernor.json +1707 -0
  96. package/src/chains/evm/contracts/artifacts/TimelockController.json +1007 -0
  97. package/src/chains/evm/contracts/artifacts/VoteToken.json +895 -0
  98. package/src/chains/evm/dex/aerodrome/index.ts +34 -0
  99. package/src/chains/evm/dex/aerodrome/services/AerodromeLpService.ts +558 -0
  100. package/src/chains/evm/dex/aerodrome/types.ts +318 -0
  101. package/src/chains/evm/dex/pancakeswp/index.ts +35 -0
  102. package/src/chains/evm/dex/pancakeswp/services/PancakeSwapV3LpService.ts +743 -0
  103. package/src/chains/evm/dex/pancakeswp/types.ts +65 -0
  104. package/src/chains/evm/dex/uniswap/index.ts +35 -0
  105. package/src/chains/evm/dex/uniswap/services/UniswapV3LpService.ts +759 -0
  106. package/src/chains/evm/dex/uniswap/types.ts +390 -0
  107. package/src/chains/evm/generated/specs/spec-helpers.ts +73 -0
  108. package/src/chains/evm/generated/specs/specs.ts +151 -0
  109. package/src/chains/evm/gov-router.ts +250 -0
  110. package/src/chains/evm/index.browser.ts +16 -0
  111. package/src/chains/evm/index.ts +31 -0
  112. package/src/chains/evm/prompts.ts +193 -0
  113. package/src/chains/evm/providers/get-balance.ts +123 -0
  114. package/src/chains/evm/providers/wallet.ts +715 -0
  115. package/src/chains/evm/routes/sign.ts +333 -0
  116. package/src/chains/evm/rpc-providers.ts +410 -0
  117. package/src/chains/evm/service.ts +140 -0
  118. package/src/chains/evm/templates/index.ts +10 -0
  119. package/src/chains/evm/types/index.ts +432 -0
  120. package/src/chains/evm/vitest.config.ts +18 -0
  121. package/src/chains/registry.ts +668 -0
  122. package/src/chains/solana/README.md +367 -0
  123. package/src/chains/wallet-action.ts +533 -0
  124. package/src/chains/wallet-router.test.ts +296 -0
  125. package/src/contracts.ts +65 -0
  126. package/src/core-augmentation.ts +10 -0
  127. package/src/index.ts +71 -0
  128. package/src/lib/server-wallet-trade.ts +192 -0
  129. package/src/lib/wallet-export-guard.ts +330 -0
  130. package/src/lp/actions/liquidity.ts +827 -0
  131. package/src/lp/e2e/real-token-tests.ts +428 -0
  132. package/src/lp/e2e/scenarios.ts +470 -0
  133. package/src/lp/e2e/test-utils.ts +145 -0
  134. package/src/lp/lp-manager-entry.ts +303 -0
  135. package/src/lp/services/ConcentratedLiquidityService.ts +120 -0
  136. package/src/lp/services/DexInteractionService.ts +226 -0
  137. package/src/lp/services/LpManagementService.test.ts +148 -0
  138. package/src/lp/services/LpManagementService.ts +632 -0
  139. package/src/lp/services/UserLpProfileService.ts +163 -0
  140. package/src/lp/services/VaultService.ts +153 -0
  141. package/src/lp/services/YieldOptimizationService.ts +344 -0
  142. package/src/lp/services/__tests__/MockLpService.ts +146 -0
  143. package/src/lp/tasks/LpAutoRebalanceTask.ts +117 -0
  144. package/src/lp/tasks/__tests__/LpAutoRebalanceTask.test.ts +370 -0
  145. package/src/lp/types.ts +582 -0
  146. package/src/lp/utils/solanaClient.ts +143 -0
  147. package/src/plugin.ts +125 -0
  148. package/src/policy/policy.ts +19 -0
  149. package/src/providers/canonical-provider.ts +27 -0
  150. package/src/providers/unified-wallet-provider.ts +79 -0
  151. package/src/register-routes.ts +11 -0
  152. package/src/routes/plugin.ts +47 -0
  153. package/src/routes/wallet-market-overview-route.ts +869 -0
  154. package/src/sdk/abi.ts +258 -0
  155. package/src/sdk/bridge/abis.ts +126 -0
  156. package/src/sdk/bridge/client.ts +518 -0
  157. package/src/sdk/bridge/index.ts +56 -0
  158. package/src/sdk/bridge/solana.ts +604 -0
  159. package/src/sdk/bridge/types.ts +202 -0
  160. package/src/sdk/convenience.ts +347 -0
  161. package/src/sdk/escrow/MutualStakeEscrow.ts +480 -0
  162. package/src/sdk/escrow/types.ts +64 -0
  163. package/src/sdk/escrow/verifiers.ts +73 -0
  164. package/src/sdk/identity/erc8004.ts +692 -0
  165. package/src/sdk/identity/reputation.ts +449 -0
  166. package/src/sdk/identity/uaid.ts +497 -0
  167. package/src/sdk/identity/validation.ts +372 -0
  168. package/src/sdk/index.ts +763 -0
  169. package/src/sdk/policy/SpendingPolicy.ts +260 -0
  170. package/src/sdk/policy/UptoBillingPolicy.ts +320 -0
  171. package/src/sdk/router/PaymentRouter.ts +215 -0
  172. package/src/sdk/router/index.ts +8 -0
  173. package/src/sdk/swap/SwapModule.ts +310 -0
  174. package/src/sdk/swap/abi.ts +117 -0
  175. package/src/sdk/swap/index.ts +34 -0
  176. package/src/sdk/swap/types.ts +135 -0
  177. package/src/sdk/tokens/decimals.ts +140 -0
  178. package/src/sdk/tokens/registry.ts +911 -0
  179. package/src/sdk/tokens/solana.ts +419 -0
  180. package/src/sdk/tokens/transfers.ts +327 -0
  181. package/src/sdk/types.ts +158 -0
  182. package/src/sdk/wallet-core.ts +115 -0
  183. package/src/sdk/x402/budget.ts +168 -0
  184. package/src/sdk/x402/chains/abstract/index.ts +280 -0
  185. package/src/sdk/x402/client.ts +320 -0
  186. package/src/sdk/x402/index.ts +46 -0
  187. package/src/sdk/x402/middleware.ts +92 -0
  188. package/src/sdk/x402/multi-asset.ts +144 -0
  189. package/src/sdk/x402/types.ts +156 -0
  190. package/src/services/wallet-backend-service.ts +328 -0
  191. package/src/types/wallet-router.ts +227 -0
  192. package/src/utils/intent-trajectory.ts +106 -0
  193. package/src/wallet/backend.ts +62 -0
  194. package/src/wallet/errors.ts +49 -0
  195. package/src/wallet/index.ts +27 -0
  196. package/src/wallet/local-eoa-backend.ts +201 -0
  197. package/src/wallet/pending.ts +60 -0
  198. package/src/wallet/select-backend.ts +47 -0
  199. package/src/wallet/steward-backend.ts +161 -0
  200. package/src/wallet-action.ts +1 -0
@@ -0,0 +1,428 @@
1
+ // @ts-nocheck — legacy code from absorbed plugins (lp-manager, lpinfo, dexscreener, defi-news, birdeye); strict types pending cleanup
2
+ import { strict as assert } from "node:assert";
3
+ import type { IAgentRuntime, TestSuite } from "@elizaos/core";
4
+ import type { DexInteractionService } from "../services/DexInteractionService.ts";
5
+ import type { YieldOptimizationService } from "../services/YieldOptimizationService.ts";
6
+ import type { PoolInfo } from "../types.ts";
7
+ import { sendMessageAndWaitForResponse, setupScenario } from "./test-utils.ts";
8
+
9
+ // Real token addresses on Solana mainnet
10
+ const TOKEN_ADDRESSES = {
11
+ SOL: "So11111111111111111111111111111111111111112",
12
+ AI16Z: "HeLp6NuQkmYB4pYWo2zYs22mESHXPQYzXbB8n4V98jwC", // ai16z Token2022 token
13
+ DEGENAI: "Gu3LDkn7VuCUNWpwxHpCpbNq7zWcHrZsQ8o8TDk1GDwT", // degenai standard SPL token
14
+ };
15
+
16
+ /**
17
+ * Defines a suite of E2E tests for real token interactions.
18
+ * These tests interact with actual DEX protocols on Solana mainnet.
19
+ */
20
+ export const realTokenTestsSuite: TestSuite = {
21
+ name: "LP Manager Real Token Integration Tests",
22
+ tests: [
23
+ {
24
+ name: "Test 1: Discover ai16z/SOL pools across DEXs",
25
+ fn: async (runtime: IAgentRuntime) => {
26
+ // Get the DEX interaction service
27
+ const dexService =
28
+ runtime.getService<DexInteractionService>("dex-interaction");
29
+ assert(dexService, "DexInteractionService should be available");
30
+
31
+ // Search for ai16z/SOL pools
32
+ console.log("Searching for ai16z/SOL pools...");
33
+ const pools = await dexService.getPools(
34
+ undefined,
35
+ TOKEN_ADDRESSES.AI16Z,
36
+ TOKEN_ADDRESSES.SOL,
37
+ );
38
+
39
+ console.log(`Found ${pools.length} ai16z/SOL pools:`);
40
+ pools.forEach((pool) => {
41
+ console.log(
42
+ `- ${pool.dex}: ${pool.id} (APR: ${pool.apr}%, TVL: $${pool.tvl})`,
43
+ );
44
+ });
45
+
46
+ // Assert that we found at least one pool
47
+ assert(pools.length > 0, "Should find at least one ai16z/SOL pool");
48
+
49
+ // Test pool data integrity
50
+ pools.forEach((pool) => {
51
+ assert(pool.id, "Pool should have an ID");
52
+ assert(pool.dex, "Pool should have a DEX name");
53
+ assert(
54
+ (pool.tokenA.mint === TOKEN_ADDRESSES.AI16Z &&
55
+ pool.tokenB.mint === TOKEN_ADDRESSES.SOL) ||
56
+ (pool.tokenA.mint === TOKEN_ADDRESSES.SOL &&
57
+ pool.tokenB.mint === TOKEN_ADDRESSES.AI16Z),
58
+ "Pool should contain ai16z and SOL tokens",
59
+ );
60
+ });
61
+ },
62
+ },
63
+
64
+ {
65
+ name: "Test 2: Discover degenai/SOL pools across DEXs",
66
+ fn: async (runtime: IAgentRuntime) => {
67
+ const dexService =
68
+ runtime.getService<DexInteractionService>("dex-interaction");
69
+ assert(dexService, "DexInteractionService should be available");
70
+
71
+ // Search for degenai/SOL pools
72
+ console.log("Searching for degenai/SOL pools...");
73
+ const pools = await dexService.getPools(
74
+ undefined,
75
+ TOKEN_ADDRESSES.DEGENAI,
76
+ TOKEN_ADDRESSES.SOL,
77
+ );
78
+
79
+ console.log(`Found ${pools.length} degenai/SOL pools:`);
80
+ pools.forEach((pool) => {
81
+ console.log(
82
+ `- ${pool.dex}: ${pool.id} (APR: ${pool.apr}%, TVL: $${pool.tvl})`,
83
+ );
84
+ });
85
+
86
+ // Assert that we found at least one pool
87
+ assert(pools.length > 0, "Should find at least one degenai/SOL pool");
88
+
89
+ // Test pool data integrity
90
+ pools.forEach((pool) => {
91
+ assert(pool.id, "Pool should have an ID");
92
+ assert(pool.dex, "Pool should have a DEX name");
93
+ assert(
94
+ (pool.tokenA.mint === TOKEN_ADDRESSES.DEGENAI &&
95
+ pool.tokenB.mint === TOKEN_ADDRESSES.SOL) ||
96
+ (pool.tokenA.mint === TOKEN_ADDRESSES.SOL &&
97
+ pool.tokenB.mint === TOKEN_ADDRESSES.DEGENAI),
98
+ "Pool should contain degenai and SOL tokens",
99
+ );
100
+ });
101
+ },
102
+ },
103
+
104
+ {
105
+ name: "Test 3: Compare APR across different DEXs for ai16z/SOL",
106
+ fn: async (runtime: IAgentRuntime) => {
107
+ const dexService =
108
+ runtime.getService<DexInteractionService>("dex-interaction");
109
+ assert(dexService, "DexInteractionService should be available");
110
+
111
+ const pools = await dexService.getPools(
112
+ undefined,
113
+ TOKEN_ADDRESSES.AI16Z,
114
+ TOKEN_ADDRESSES.SOL,
115
+ );
116
+
117
+ if (pools.length === 0) {
118
+ console.log("No ai16z/SOL pools found, skipping APR comparison");
119
+ return;
120
+ }
121
+
122
+ // Sort pools by APR
123
+ const sortedPools = pools.sort((a, b) => (b.apr || 0) - (a.apr || 0));
124
+
125
+ console.log("APR Comparison for ai16z/SOL pools:");
126
+ sortedPools.forEach((pool) => {
127
+ console.log(
128
+ `- ${pool.dex}: ${pool.apr || 0}% APR (TVL: $${pool.tvl || 0})`,
129
+ );
130
+ });
131
+
132
+ // Find best APR
133
+ const bestPool = sortedPools[0];
134
+ console.log(`\nBest APR: ${bestPool.apr || 0}% on ${bestPool.dex}`);
135
+
136
+ assert(
137
+ bestPool.apr !== undefined && bestPool.apr >= 0,
138
+ "Best pool should have a valid APR",
139
+ );
140
+ },
141
+ },
142
+
143
+ {
144
+ name: "Test 4: Simulate liquidity addition workflow for degenai/SOL",
145
+ fn: async (runtime: IAgentRuntime) => {
146
+ const { user, room } = await setupScenario(runtime);
147
+
148
+ // First, check available pools
149
+ const response1 = await sendMessageAndWaitForResponse(
150
+ runtime,
151
+ room,
152
+ user,
153
+ "Show me all degenai/SOL pools with their APR",
154
+ );
155
+
156
+ console.log(
157
+ "Pool discovery response:",
158
+ response1.text || "No text response",
159
+ );
160
+
161
+ assert.match(
162
+ response1.text || "",
163
+ /pool|degenai|SOL|APR|liquidity/i,
164
+ "Response should mention pools and APR",
165
+ );
166
+
167
+ // Then simulate adding liquidity
168
+ const response2 = await sendMessageAndWaitForResponse(
169
+ runtime,
170
+ room,
171
+ user,
172
+ "I want to add 0.1 SOL and equivalent degenai to the best APR pool",
173
+ );
174
+
175
+ console.log(
176
+ "Add liquidity response:",
177
+ response2.text || "No text response",
178
+ );
179
+
180
+ assert.match(
181
+ response2.text || "",
182
+ /add|liquidity|SOL|degenai|pool/i,
183
+ "Response should acknowledge liquidity addition request",
184
+ );
185
+ },
186
+ },
187
+
188
+ {
189
+ name: "Test 5: Test position tracking after liquidity addition",
190
+ fn: async (runtime: IAgentRuntime) => {
191
+ const { user, room } = await setupScenario(runtime);
192
+
193
+ // Check LP positions
194
+ const response = await sendMessageAndWaitForResponse(
195
+ runtime,
196
+ room,
197
+ user,
198
+ "Show me all my LP positions including underlying token amounts",
199
+ );
200
+
201
+ console.log(
202
+ "LP positions response:",
203
+ response.text || "No text response",
204
+ );
205
+
206
+ assert.match(
207
+ response.text || "",
208
+ /position|LP|liquidity|token|amount/i,
209
+ "Response should show LP positions",
210
+ );
211
+ },
212
+ },
213
+
214
+ {
215
+ name: "Test 6: Test yield optimization opportunities",
216
+ fn: async (runtime: IAgentRuntime) => {
217
+ const yieldService = runtime.getService<YieldOptimizationService>(
218
+ "YieldOptimizationService",
219
+ );
220
+ assert(yieldService, "YieldOptimizationService should be available");
221
+
222
+ // Fetch all pool data
223
+ console.log("Fetching all pool data for yield analysis...");
224
+ const allPools = await yieldService.fetchAllPoolData();
225
+
226
+ console.log(`Total pools available: ${allPools.length}`);
227
+
228
+ // Filter for our target tokens
229
+ const targetPools = allPools.filter(
230
+ (pool) =>
231
+ pool.tokenA.mint === TOKEN_ADDRESSES.AI16Z ||
232
+ pool.tokenB.mint === TOKEN_ADDRESSES.AI16Z ||
233
+ pool.tokenA.mint === TOKEN_ADDRESSES.DEGENAI ||
234
+ pool.tokenB.mint === TOKEN_ADDRESSES.DEGENAI,
235
+ );
236
+
237
+ console.log(`Pools with ai16z or degenai: ${targetPools.length}`);
238
+
239
+ // Group by token pair and find best APR
240
+ const bestByPair = new Map<string, PoolInfo>();
241
+
242
+ targetPools.forEach((pool) => {
243
+ const pair = [pool.tokenA.symbol, pool.tokenB.symbol]
244
+ .sort()
245
+ .join("/");
246
+ const current = bestByPair.get(pair);
247
+
248
+ if (!current || (pool.apr || 0) > (current.apr || 0)) {
249
+ bestByPair.set(pair, pool);
250
+ }
251
+ });
252
+
253
+ console.log("\nBest APR pools by pair:");
254
+ bestByPair.forEach((pool, pair) => {
255
+ console.log(`- ${pair}: ${pool.apr || 0}% on ${pool.dex}`);
256
+ });
257
+
258
+ assert(
259
+ targetPools.length > 0,
260
+ "Should find at least one pool with target tokens",
261
+ );
262
+ },
263
+ },
264
+
265
+ {
266
+ name: "Test 7: Test auto-rebalance configuration",
267
+ fn: async (runtime: IAgentRuntime) => {
268
+ const { user, room } = await setupScenario(runtime);
269
+
270
+ // Configure auto-rebalance preferences
271
+ const response = await sendMessageAndWaitForResponse(
272
+ runtime,
273
+ room,
274
+ user,
275
+ "Enable auto-rebalance with 3% minimum gain, prefer Orca and Raydium DEXs, max slippage 0.5%",
276
+ );
277
+
278
+ console.log(
279
+ "Auto-rebalance config response:",
280
+ response.text || "No text response",
281
+ );
282
+
283
+ assert.match(
284
+ response.text || "",
285
+ /auto.*rebalance|enable|3%|Orca|Raydium|slippage/i,
286
+ "Response should acknowledge auto-rebalance configuration",
287
+ );
288
+ },
289
+ },
290
+
291
+ {
292
+ name: "Test 8: Test liquidity removal workflow",
293
+ fn: async (runtime: IAgentRuntime) => {
294
+ const { user, room } = await setupScenario(runtime);
295
+
296
+ // Request to remove liquidity
297
+ const response = await sendMessageAndWaitForResponse(
298
+ runtime,
299
+ room,
300
+ user,
301
+ "I want to remove 50% of my degenai/SOL LP position",
302
+ );
303
+
304
+ console.log(
305
+ "Remove liquidity response:",
306
+ response.text || "No text response",
307
+ );
308
+
309
+ assert.match(
310
+ response.text || "",
311
+ /remove|withdraw|50%|liquidity|degenai|SOL/i,
312
+ "Response should acknowledge liquidity removal request",
313
+ );
314
+ },
315
+ },
316
+
317
+ {
318
+ name: "Test 9: Test handling of Token2022 (ai16z) specifics",
319
+ fn: async (runtime: IAgentRuntime) => {
320
+ const dexService =
321
+ runtime.getService<DexInteractionService>("dex-interaction");
322
+ assert(dexService, "DexInteractionService should be available");
323
+
324
+ // Get pools for ai16z (Token2022)
325
+ const pools = await dexService.getPools(
326
+ undefined,
327
+ TOKEN_ADDRESSES.AI16Z,
328
+ TOKEN_ADDRESSES.SOL,
329
+ );
330
+
331
+ console.log("Checking Token2022 compatibility:");
332
+
333
+ // Check which DEXs support Token2022
334
+ const dexSupport = new Map<string, number>();
335
+ pools.forEach((pool) => {
336
+ dexSupport.set(pool.dex, (dexSupport.get(pool.dex) || 0) + 1);
337
+ });
338
+
339
+ console.log("DEXs supporting ai16z (Token2022):");
340
+ dexSupport.forEach((count, dex) => {
341
+ console.log(`- ${dex}: ${count} pools`);
342
+ });
343
+
344
+ // Note: Some DEXs may not support Token2022
345
+ console.log(
346
+ "\nNote: Some DEXs may not support Token2022 tokens like ai16z",
347
+ );
348
+ },
349
+ },
350
+
351
+ {
352
+ name: "Test 10: End-to-end LP lifecycle test",
353
+ fn: async (runtime: IAgentRuntime) => {
354
+ const { user, room } = await setupScenario(runtime);
355
+
356
+ // 1. Onboard user
357
+ console.log("Step 1: Onboarding...");
358
+ const onboardResponse = await sendMessageAndWaitForResponse(
359
+ runtime,
360
+ room,
361
+ user,
362
+ "I want to start LP management with auto-rebalancing enabled",
363
+ );
364
+ console.log(
365
+ "Onboard response:",
366
+ onboardResponse.text || "No text response",
367
+ );
368
+
369
+ // 2. Check available pools
370
+ console.log("\nStep 2: Checking pools...");
371
+ const poolsResponse = await sendMessageAndWaitForResponse(
372
+ runtime,
373
+ room,
374
+ user,
375
+ "Show me the best APR pools for SOL pairs",
376
+ );
377
+ console.log(
378
+ "Pools response:",
379
+ poolsResponse.text || "No text response",
380
+ );
381
+
382
+ // 3. Add liquidity
383
+ console.log("\nStep 3: Adding liquidity...");
384
+ const addResponse = await sendMessageAndWaitForResponse(
385
+ runtime,
386
+ room,
387
+ user,
388
+ "Add 0.2 SOL to the best SOL pool you can find",
389
+ );
390
+ console.log(
391
+ "Add liquidity response:",
392
+ addResponse.text || "No text response",
393
+ );
394
+
395
+ // 4. Check positions
396
+ console.log("\nStep 4: Checking positions...");
397
+ const positionsResponse = await sendMessageAndWaitForResponse(
398
+ runtime,
399
+ room,
400
+ user,
401
+ "Show me my current LP positions and their performance",
402
+ );
403
+ console.log(
404
+ "Positions response:",
405
+ positionsResponse.text || "No text response",
406
+ );
407
+
408
+ // Assert responses are meaningful
409
+ assert(
410
+ (onboardResponse.text?.length || 0) > 0,
411
+ "Onboard response should not be empty",
412
+ );
413
+ assert(
414
+ (poolsResponse.text?.length || 0) > 0,
415
+ "Pools response should not be empty",
416
+ );
417
+ assert(
418
+ (addResponse.text?.length || 0) > 0,
419
+ "Add liquidity response should not be empty",
420
+ );
421
+ assert(
422
+ (positionsResponse.text?.length || 0) > 0,
423
+ "Positions response should not be empty",
424
+ );
425
+ },
426
+ },
427
+ ],
428
+ };