@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,539 @@
1
+ import { n as __exportAll } from "./chunk-hT5z_Zn9.mjs";
2
+ import { i as createSolanaLpProtocolProvider, o as registerLpProtocolProvider } from "./LpManagementService-BWrQ5-cO.mjs";
3
+ import { Service, logger, validateActionKeywords, validateActionRegex } from "@elizaos/core";
4
+ import { Connection } from "@solana/web3.js";
5
+ //#region src/chains/solana/dex/raydium/providers/positionProvider.ts
6
+ const POSITION_LIMIT = 20;
7
+ async function loadRaydiumPositionApi() {
8
+ const sdk = await import("@raydium-io/raydium-sdk");
9
+ const clmm = sdk.Clmm;
10
+ const position = sdk.Position;
11
+ if (typeof clmm?.getPool !== "function" || typeof position?.getPositionsByOwner !== "function") {
12
+ logger.warn("Raydium LP position helper is unavailable in the installed Raydium SDK; returning no Raydium LP positions.");
13
+ return null;
14
+ }
15
+ return {
16
+ clmm: { getPool: clmm.getPool.bind(clmm) },
17
+ position: { getPositionsByOwner: position.getPositionsByOwner.bind(position) }
18
+ };
19
+ }
20
+ const raydiumPositionProvider = {
21
+ name: "raydium-lp-position-provider",
22
+ description: "Provides Raydium LP position status.",
23
+ descriptionCompressed: "Raydium LP positions status.",
24
+ dynamic: true,
25
+ contexts: [
26
+ "finance",
27
+ "crypto",
28
+ "wallet"
29
+ ],
30
+ contextGate: { anyOf: [
31
+ "finance",
32
+ "crypto",
33
+ "wallet"
34
+ ] },
35
+ cacheStable: false,
36
+ cacheScope: "turn",
37
+ roleGate: { minRole: "OWNER" },
38
+ relevanceKeywords: [
39
+ "raydium",
40
+ "position",
41
+ "raydiumpositionprovider",
42
+ "plugin",
43
+ "manager",
44
+ "status",
45
+ "state",
46
+ "context",
47
+ "info",
48
+ "details",
49
+ "chat",
50
+ "conversation",
51
+ "agent",
52
+ "room"
53
+ ],
54
+ get: async (runtime, message, state) => {
55
+ const __providerKeywords = [
56
+ "raydium",
57
+ "position",
58
+ "raydiumpositionprovider",
59
+ "plugin",
60
+ "manager",
61
+ "status",
62
+ "state",
63
+ "context",
64
+ "info",
65
+ "details",
66
+ "chat",
67
+ "conversation",
68
+ "agent",
69
+ "room"
70
+ ];
71
+ const __providerRegex = new RegExp(`\\b(${__providerKeywords.join("|")})\\b`, "i");
72
+ const __recentMessages = state?.recentMessagesData || [];
73
+ if (!(validateActionKeywords(message, __recentMessages, __providerKeywords) || validateActionRegex(message, __recentMessages, __providerRegex))) return { text: "" };
74
+ if (!state) state = await runtime.composeState(message);
75
+ else state = await runtime.updateRecentMessageState(state);
76
+ try {
77
+ const privateKey = runtime.getSetting("SOLANA_PRIVATE_KEY");
78
+ if (!privateKey || typeof privateKey !== "string") {
79
+ logger.warn("SOLANA_PRIVATE_KEY not configured");
80
+ return {
81
+ text: "Raydium LP positions unavailable.",
82
+ data: {
83
+ positions: [],
84
+ error: "SOLANA_PRIVATE_KEY not configured"
85
+ },
86
+ values: {
87
+ positionCount: 0,
88
+ hasPositions: false
89
+ }
90
+ };
91
+ }
92
+ const bs58 = await import("bs58");
93
+ const { Keypair } = await import("@solana/web3.js");
94
+ const secretKey = bs58.default.decode(privateKey);
95
+ const ownerAddress = Keypair.fromSecretKey(secretKey).publicKey;
96
+ const positions = await fetchPositions(new Connection(runtime.getSetting("SOLANA_RPC_URL") || "https://api.mainnet-beta.solana.com"), ownerAddress);
97
+ return {
98
+ text: formatPositionsForPrompt(positions.slice(0, POSITION_LIMIT)),
99
+ data: { positions: positions.slice(0, POSITION_LIMIT) }
100
+ };
101
+ } catch (error) {
102
+ logger.error("Error in Raydium position provider:", error);
103
+ return {
104
+ text: "Raydium LP positions unavailable.",
105
+ data: {
106
+ positions: [],
107
+ error: error instanceof Error ? error.message : String(error)
108
+ },
109
+ values: {
110
+ positionCount: 0,
111
+ hasPositions: false
112
+ }
113
+ };
114
+ }
115
+ }
116
+ };
117
+ function formatPositionsForPrompt(positions) {
118
+ if (positions.length === 0) return "Raydium LP positions:\npositions:";
119
+ const lines = ["Raydium LP positions:"];
120
+ positions.forEach((position, index) => {
121
+ lines.push(`positions[${index}]{poolAddress,positionNftMint,inRange,distanceCenterPositionFromPoolPriceBps,positionWidthBps}: ${position.poolAddress.toString()},${position.positionNftMint.toString()},${position.inRange},${position.distanceCenterPositionFromPoolPriceBps},${position.positionWidthBps}`);
122
+ });
123
+ return lines.join("\n");
124
+ }
125
+ const fetchPositions = async (connection, ownerAddress) => {
126
+ try {
127
+ const api = await loadRaydiumPositionApi();
128
+ if (!api) return [];
129
+ const { clmm, position: positionApi } = api;
130
+ const positions = await positionApi.getPositionsByOwner(connection, ownerAddress);
131
+ const poolsMap = /* @__PURE__ */ new Map();
132
+ for (const position of positions) if (!poolsMap.has(position.poolId.toString())) {
133
+ const poolInfo = await clmm.getPool(connection, position.poolId);
134
+ poolsMap.set(position.poolId.toString(), poolInfo);
135
+ }
136
+ return await Promise.all(positions.map(async (position) => {
137
+ const pool = poolsMap.get(position.poolId.toString());
138
+ if (!pool) throw new Error(`Missing pool metadata for pool ID ${position.poolId.toString()}`);
139
+ const currentPrice = pool.currentPrice;
140
+ const positionLowerPrice = pool.tickArrayLower;
141
+ const positionUpperPrice = pool.tickArrayUpper;
142
+ const inRange = position.tickLower <= pool.currentTickIndex && pool.currentTickIndex <= position.tickUpper;
143
+ const positionCenterPrice = (positionLowerPrice + positionUpperPrice) / 2;
144
+ const distanceCenterPositionFromPoolPriceBps = Math.abs(currentPrice - positionCenterPrice) / currentPrice * 1e4;
145
+ const positionWidthBps = (positionUpperPrice - positionLowerPrice) / positionCenterPrice * 1e4 / 2;
146
+ return {
147
+ poolAddress: position.poolId,
148
+ positionNftMint: position.nftMint,
149
+ inRange,
150
+ distanceCenterPositionFromPoolPriceBps,
151
+ positionWidthBps
152
+ };
153
+ }));
154
+ } catch (error) {
155
+ logger.error("Error during fetching Raydium positions:", error);
156
+ throw new Error("Error during fetching positions");
157
+ }
158
+ };
159
+ //#endregion
160
+ //#region src/chains/solana/dex/raydium/services/srv_raydium.ts
161
+ const Position = {
162
+ getPositionsByOwner: unsupportedRaydiumPositionMethod,
163
+ create: unsupportedRaydiumPositionMethod,
164
+ close: unsupportedRaydiumPositionMethod,
165
+ update: unsupportedRaydiumPositionMethod
166
+ };
167
+ function unsupportedRaydiumPositionMethod() {
168
+ throw new Error("Raydium position helpers are unavailable in the installed Raydium SDK");
169
+ }
170
+ var RaydiumService = class RaydiumService extends Service {
171
+ isRunning = false;
172
+ registry = {};
173
+ static serviceType = "RAYDIUM_SERVICE";
174
+ capabilityDescription = "Provides Raydium DEX integration for token swaps";
175
+ CONFIRMATION_CONFIG = {
176
+ MAX_ATTEMPTS: 12,
177
+ INITIAL_TIMEOUT: 2e3,
178
+ MAX_TIMEOUT: 2e4,
179
+ getDelayForAttempt: (attempt) => Math.min(2e3 * 1.5 ** attempt, 2e4)
180
+ };
181
+ constructor(runtime) {
182
+ super(runtime);
183
+ this.registry = {};
184
+ console.log("RAYDIUM_SERVICE cstr");
185
+ }
186
+ async registerProvider(provider) {
187
+ const id = Object.values(this.registry).length + 1;
188
+ console.log("registered", provider.name, `as Raydium provider #${id}`);
189
+ this.registry[id] = provider;
190
+ return id;
191
+ }
192
+ async getQuote({ inputMint, outputMint, amount, slippageBps }) {
193
+ try {
194
+ const quoteResponse = await fetch(`https://api.raydium.io/v2/main/quote?inputMint=${inputMint}&outputMint=${outputMint}&amount=${amount}&slippageBps=${slippageBps}`);
195
+ if (!quoteResponse.ok) {
196
+ const error = await quoteResponse.text();
197
+ logger.warn("Quote request failed:", {
198
+ status: quoteResponse.status,
199
+ error
200
+ });
201
+ throw new Error(`Failed to get quote: ${error}`);
202
+ }
203
+ return await quoteResponse.json();
204
+ } catch (error) {
205
+ logger.error("Error getting Raydium quote:", error);
206
+ throw error;
207
+ }
208
+ }
209
+ async executeSwap({ quoteResponse, userPublicKey, slippageBps }) {
210
+ try {
211
+ const swapResponse = await fetch("https://api.raydium.io/v2/main/swap", {
212
+ method: "POST",
213
+ headers: { "Content-Type": "application/json" },
214
+ body: JSON.stringify({
215
+ quoteResponse: {
216
+ ...quoteResponse,
217
+ slippageBps
218
+ },
219
+ userPublicKey,
220
+ wrapAndUnwrapSol: true,
221
+ computeUnitPriceMicroLamports: 5e6,
222
+ dynamicComputeUnitLimit: true
223
+ })
224
+ });
225
+ if (!swapResponse.ok) {
226
+ const error = await swapResponse.text();
227
+ throw new Error(`Failed to get swap transaction: ${error}`);
228
+ }
229
+ return await swapResponse.json();
230
+ } catch (error) {
231
+ logger.error("Error executing Raydium swap:", error);
232
+ throw error;
233
+ }
234
+ }
235
+ async confirmTransaction(connection, signature) {
236
+ for (let i = 0; i < this.CONFIRMATION_CONFIG.MAX_ATTEMPTS; i++) try {
237
+ const status = await connection.getSignatureStatus(signature);
238
+ if (status.value?.confirmationStatus === "confirmed" || status.value?.confirmationStatus === "finalized") return true;
239
+ const delay = this.CONFIRMATION_CONFIG.getDelayForAttempt(i);
240
+ await new Promise((resolve) => setTimeout(resolve, delay));
241
+ } catch (error) {
242
+ logger.warn(`Confirmation check ${i + 1} failed:`, error);
243
+ if (i === this.CONFIRMATION_CONFIG.MAX_ATTEMPTS - 1) throw new Error("Could not confirm transaction status");
244
+ const delay = this.CONFIRMATION_CONFIG.getDelayForAttempt(i);
245
+ await new Promise((resolve) => setTimeout(resolve, delay));
246
+ }
247
+ return false;
248
+ }
249
+ async getTokenPrice(tokenMint, quoteMint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", inputDecimals = 6) {
250
+ try {
251
+ const baseAmount = 10 ** inputDecimals;
252
+ const quote = await this.getQuote({
253
+ inputMint: tokenMint,
254
+ outputMint: quoteMint,
255
+ amount: baseAmount,
256
+ slippageBps: 50
257
+ });
258
+ return Number(quote.outAmount) / 10 ** inputDecimals;
259
+ } catch (error) {
260
+ logger.error("Failed to get token price:", error);
261
+ return 0;
262
+ }
263
+ }
264
+ async getBestRoute({ inputMint, outputMint, amount }) {
265
+ try {
266
+ return (await this.getQuote({
267
+ inputMint,
268
+ outputMint,
269
+ amount,
270
+ slippageBps: 50
271
+ })).routePlan;
272
+ } catch (error) {
273
+ logger.error("Failed to get best route:", error);
274
+ throw error;
275
+ }
276
+ }
277
+ async getPriceImpact({ inputMint, outputMint, amount }) {
278
+ try {
279
+ const quote = await this.getQuote({
280
+ inputMint,
281
+ outputMint,
282
+ amount,
283
+ slippageBps: 50
284
+ });
285
+ return Number(quote.priceImpactPct);
286
+ } catch (error) {
287
+ logger.error("Failed to get price impact:", error);
288
+ throw error;
289
+ }
290
+ }
291
+ async getMinimumReceived({ inputMint, outputMint, amount, slippageBps }) {
292
+ try {
293
+ const quote = await this.getQuote({
294
+ inputMint,
295
+ outputMint,
296
+ amount,
297
+ slippageBps
298
+ });
299
+ return Number(quote.outAmount) * (1 - slippageBps / 1e4);
300
+ } catch (error) {
301
+ logger.error("Failed to calculate minimum received:", error);
302
+ throw error;
303
+ }
304
+ }
305
+ async estimateGasFees({ inputMint, outputMint, amount }) {
306
+ try {
307
+ const estimatedFee = (await this.getQuote({
308
+ inputMint,
309
+ outputMint,
310
+ amount,
311
+ slippageBps: 50
312
+ })).otherAmountThreshold || 5e3;
313
+ return {
314
+ lamports: estimatedFee,
315
+ sol: estimatedFee / 1e9
316
+ };
317
+ } catch (error) {
318
+ logger.error("Failed to estimate gas fees:", error);
319
+ throw error;
320
+ }
321
+ }
322
+ async findBestSlippage({ inputMint, outputMint, amount }) {
323
+ try {
324
+ const quote = await this.getQuote({
325
+ inputMint,
326
+ outputMint,
327
+ amount,
328
+ slippageBps: 50
329
+ });
330
+ const priceImpact = Number(quote.priceImpactPct);
331
+ let recommendedSlippage;
332
+ if (priceImpact < .5) recommendedSlippage = 50;
333
+ else if (priceImpact < 1) recommendedSlippage = 100;
334
+ else recommendedSlippage = 200;
335
+ return recommendedSlippage;
336
+ } catch (error) {
337
+ logger.error("Failed to find best slippage:", error);
338
+ throw error;
339
+ }
340
+ }
341
+ async getTokenPair({ inputMint, outputMint }) {
342
+ try {
343
+ const response = await fetch(`https://api.raydium.io/v2/main/pairs/${inputMint}/${outputMint}`);
344
+ if (!response.ok) throw new Error("Failed to fetch token pair data");
345
+ return await response.json();
346
+ } catch (error) {
347
+ logger.error("Failed to get token pair information:", error);
348
+ throw error;
349
+ }
350
+ }
351
+ async getHistoricalPrices({ inputMint, outputMint, timeframe = "24h" }) {
352
+ try {
353
+ const response = await fetch(`https://api.raydium.io/v2/main/prices/${inputMint}/${outputMint}?timeframe=${timeframe}`);
354
+ if (!response.ok) throw new Error("Failed to fetch historical prices");
355
+ return await response.json();
356
+ } catch (error) {
357
+ logger.error("Failed to get historical prices:", error);
358
+ throw error;
359
+ }
360
+ }
361
+ async findArbitragePaths({ startingMint, amount, maxHops: _maxHops = 3 }) {
362
+ try {
363
+ const commonTokens = [
364
+ "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
365
+ "So11111111111111111111111111111111111111112",
366
+ "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"
367
+ ];
368
+ const paths = [];
369
+ for (const token1 of commonTokens) {
370
+ if (token1 === startingMint) continue;
371
+ const quote1 = await this.getQuote({
372
+ inputMint: startingMint,
373
+ outputMint: token1,
374
+ amount,
375
+ slippageBps: 50
376
+ });
377
+ for (const token2 of commonTokens) {
378
+ if (token2 === token1 || token2 === startingMint) continue;
379
+ const quote2 = await this.getQuote({
380
+ inputMint: token1,
381
+ outputMint: token2,
382
+ amount: Number(quote1.outAmount),
383
+ slippageBps: 50
384
+ });
385
+ const finalQuote = await this.getQuote({
386
+ inputMint: token2,
387
+ outputMint: startingMint,
388
+ amount: Number(quote2.outAmount),
389
+ slippageBps: 50
390
+ });
391
+ const expectedReturn = Number(finalQuote.outAmount) - amount;
392
+ const totalPriceImpact = Number(quote1.priceImpactPct) + Number(quote2.priceImpactPct) + Number(finalQuote.priceImpactPct);
393
+ if (expectedReturn > 0) paths.push({
394
+ path: [
395
+ startingMint,
396
+ token1,
397
+ token2,
398
+ startingMint
399
+ ],
400
+ expectedReturn,
401
+ priceImpact: totalPriceImpact
402
+ });
403
+ }
404
+ }
405
+ return paths.sort((a, b) => b.expectedReturn - a.expectedReturn);
406
+ } catch (error) {
407
+ logger.error("Failed to find arbitrage paths:", error);
408
+ throw error;
409
+ }
410
+ }
411
+ async getPositions(connection, ownerAddress) {
412
+ try {
413
+ return await Position.getPositionsByOwner(connection, ownerAddress);
414
+ } catch (error) {
415
+ logger.error("Error fetching positions:", error);
416
+ throw error;
417
+ }
418
+ }
419
+ async createPosition(connection, pool, owner, lowerTick, upperTick, tokenAmountA, tokenAmountB) {
420
+ try {
421
+ return await Position.create({
422
+ connection,
423
+ poolId: pool.id,
424
+ ownerInfo: {
425
+ wallet: owner,
426
+ tokenAccountA: pool.tokenAccountA,
427
+ tokenAccountB: pool.tokenAccountB
428
+ },
429
+ tickLower: lowerTick,
430
+ tickUpper: upperTick,
431
+ tokenAmountA,
432
+ tokenAmountB
433
+ });
434
+ } catch (error) {
435
+ logger.error("Error creating position:", error);
436
+ throw error;
437
+ }
438
+ }
439
+ async closePosition(connection, positionInfo, owner) {
440
+ try {
441
+ return await Position.close({
442
+ connection,
443
+ positionId: positionInfo.id,
444
+ owner
445
+ });
446
+ } catch (error) {
447
+ logger.error("Error closing position:", error);
448
+ throw error;
449
+ }
450
+ }
451
+ async updatePosition(connection, positionInfo, owner, liquidityDelta) {
452
+ try {
453
+ return await Position.update({
454
+ connection,
455
+ positionId: positionInfo.id,
456
+ owner,
457
+ liquidityDelta
458
+ });
459
+ } catch (error) {
460
+ logger.error("Error updating position:", error);
461
+ throw error;
462
+ }
463
+ }
464
+ static async start(runtime) {
465
+ console.log("RAYDIUM_SERVICE trying to start");
466
+ const service = new RaydiumService(runtime);
467
+ await service.start();
468
+ return service;
469
+ }
470
+ static async stop(runtime) {
471
+ const service = runtime.getService(RaydiumService.serviceType);
472
+ if (!service) throw new Error(`${RaydiumService.serviceType} service not found`);
473
+ await service.stop();
474
+ }
475
+ async start() {
476
+ if (this.isRunning) {
477
+ logger.warn("Raydium service is already running");
478
+ return;
479
+ }
480
+ console.log("RAYDIUM_SERVICE starting");
481
+ try {
482
+ logger.info("Starting Raydium service...");
483
+ this.isRunning = true;
484
+ logger.info("Raydium service started successfully");
485
+ } catch (error) {
486
+ logger.error("Error starting Raydium service:", error);
487
+ throw error;
488
+ }
489
+ }
490
+ async stop() {
491
+ if (!this.isRunning) {
492
+ logger.warn("Raydium service is not running");
493
+ return;
494
+ }
495
+ try {
496
+ logger.info("Stopping Raydium service...");
497
+ this.isRunning = false;
498
+ logger.info("Raydium service stopped successfully");
499
+ } catch (error) {
500
+ logger.error("Error stopping Raydium service:", error);
501
+ throw error;
502
+ }
503
+ }
504
+ isServiceRunning() {
505
+ return this.isRunning;
506
+ }
507
+ };
508
+ //#endregion
509
+ //#region src/chains/solana/dex/raydium/index.ts
510
+ var raydium_exports = /* @__PURE__ */ __exportAll({
511
+ RaydiumService: () => RaydiumService,
512
+ default: () => raydiumPlugin,
513
+ raydiumPlugin: () => raydiumPlugin
514
+ });
515
+ function hasExchangeRegistry(service) {
516
+ return service !== null && typeof service === "object" && typeof service.registerExchange === "function";
517
+ }
518
+ const raydiumPlugin = {
519
+ name: "@elizaos/plugin-lp-manager/raydium",
520
+ description: "Raydium CLMM LP management plugin for Solana",
521
+ actions: [],
522
+ providers: [raydiumPositionProvider],
523
+ services: [RaydiumService],
524
+ init: async (_config, runtime) => {
525
+ console.info("Raydium Plugin initialized");
526
+ await registerLpProtocolProvider(runtime, createSolanaLpProtocolProvider({
527
+ dex: "raydium",
528
+ label: "Raydium",
529
+ service: runtime.getService(RaydiumService.serviceType) ?? await RaydiumService.start(runtime)
530
+ }));
531
+ const solanaService = runtime.getService("solana");
532
+ if (hasExchangeRegistry(solanaService)) {
533
+ solanaService.registerExchange({ name: "Raydium DEX services" });
534
+ console.info("Raydium registered with Solana service");
535
+ }
536
+ }
537
+ };
538
+ //#endregion
539
+ export { raydium_exports as n, raydiumPlugin as t };