amped-defi 1.0.0

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 (189) hide show
  1. package/README.md +757 -0
  2. package/dist/__mocks__/@sodax/sdk.d.ts +24 -0
  3. package/dist/__mocks__/@sodax/sdk.d.ts.map +1 -0
  4. package/dist/__mocks__/@sodax/sdk.js +24 -0
  5. package/dist/__mocks__/@sodax/sdk.js.map +1 -0
  6. package/dist/__tests__/setup.d.ts +4 -0
  7. package/dist/__tests__/setup.d.ts.map +1 -0
  8. package/dist/__tests__/setup.js +32 -0
  9. package/dist/__tests__/setup.js.map +1 -0
  10. package/dist/index.d.ts +66 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +281 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/policy/policyEngine.d.ts +119 -0
  15. package/dist/policy/policyEngine.d.ts.map +1 -0
  16. package/dist/policy/policyEngine.js +322 -0
  17. package/dist/policy/policyEngine.js.map +1 -0
  18. package/dist/providers/spokeProviderFactory.d.ts +38 -0
  19. package/dist/providers/spokeProviderFactory.d.ts.map +1 -0
  20. package/dist/providers/spokeProviderFactory.js +212 -0
  21. package/dist/providers/spokeProviderFactory.js.map +1 -0
  22. package/dist/sodax/client.d.ts +34 -0
  23. package/dist/sodax/client.d.ts.map +1 -0
  24. package/dist/sodax/client.js +99 -0
  25. package/dist/sodax/client.js.map +1 -0
  26. package/dist/tools/bridge.d.ts +105 -0
  27. package/dist/tools/bridge.d.ts.map +1 -0
  28. package/dist/tools/bridge.js +334 -0
  29. package/dist/tools/bridge.js.map +1 -0
  30. package/dist/tools/discovery.d.ts +141 -0
  31. package/dist/tools/discovery.d.ts.map +1 -0
  32. package/dist/tools/discovery.js +777 -0
  33. package/dist/tools/discovery.js.map +1 -0
  34. package/dist/tools/moneyMarket.d.ts +227 -0
  35. package/dist/tools/moneyMarket.d.ts.map +1 -0
  36. package/dist/tools/moneyMarket.js +867 -0
  37. package/dist/tools/moneyMarket.js.map +1 -0
  38. package/dist/tools/portfolio.d.ts +43 -0
  39. package/dist/tools/portfolio.d.ts.map +1 -0
  40. package/dist/tools/portfolio.js +538 -0
  41. package/dist/tools/portfolio.js.map +1 -0
  42. package/dist/tools/swap.d.ts +71 -0
  43. package/dist/tools/swap.d.ts.map +1 -0
  44. package/dist/tools/swap.js +762 -0
  45. package/dist/tools/swap.js.map +1 -0
  46. package/dist/tools/walletManagement.d.ts +80 -0
  47. package/dist/tools/walletManagement.d.ts.map +1 -0
  48. package/dist/tools/walletManagement.js +289 -0
  49. package/dist/tools/walletManagement.js.map +1 -0
  50. package/dist/types.d.ts +205 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +5 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/utils/errorUtils.d.ts +2 -0
  55. package/dist/utils/errorUtils.d.ts.map +1 -0
  56. package/dist/utils/errorUtils.js +19 -0
  57. package/dist/utils/errorUtils.js.map +1 -0
  58. package/dist/utils/errors.d.ts +144 -0
  59. package/dist/utils/errors.d.ts.map +1 -0
  60. package/dist/utils/errors.js +310 -0
  61. package/dist/utils/errors.js.map +1 -0
  62. package/dist/utils/positionAggregator.d.ts +122 -0
  63. package/dist/utils/positionAggregator.d.ts.map +1 -0
  64. package/dist/utils/positionAggregator.js +377 -0
  65. package/dist/utils/positionAggregator.js.map +1 -0
  66. package/dist/utils/priceService.d.ts +45 -0
  67. package/dist/utils/priceService.d.ts.map +1 -0
  68. package/dist/utils/priceService.js +108 -0
  69. package/dist/utils/priceService.js.map +1 -0
  70. package/dist/utils/sodaxApi.d.ts +92 -0
  71. package/dist/utils/sodaxApi.d.ts.map +1 -0
  72. package/dist/utils/sodaxApi.js +143 -0
  73. package/dist/utils/sodaxApi.js.map +1 -0
  74. package/dist/utils/tokenResolver.d.ts +54 -0
  75. package/dist/utils/tokenResolver.d.ts.map +1 -0
  76. package/dist/utils/tokenResolver.js +252 -0
  77. package/dist/utils/tokenResolver.js.map +1 -0
  78. package/dist/wallet/backendConfig.d.ts +37 -0
  79. package/dist/wallet/backendConfig.d.ts.map +1 -0
  80. package/dist/wallet/backendConfig.js +125 -0
  81. package/dist/wallet/backendConfig.js.map +1 -0
  82. package/dist/wallet/backends/BankrBackend.d.ts +73 -0
  83. package/dist/wallet/backends/BankrBackend.d.ts.map +1 -0
  84. package/dist/wallet/backends/BankrBackend.js +315 -0
  85. package/dist/wallet/backends/BankrBackend.js.map +1 -0
  86. package/dist/wallet/backends/BankrWalletProvider.d.ts +75 -0
  87. package/dist/wallet/backends/BankrWalletProvider.d.ts.map +1 -0
  88. package/dist/wallet/backends/BankrWalletProvider.js +243 -0
  89. package/dist/wallet/backends/BankrWalletProvider.js.map +1 -0
  90. package/dist/wallet/backends/EnvBackend.d.ts +50 -0
  91. package/dist/wallet/backends/EnvBackend.d.ts.map +1 -0
  92. package/dist/wallet/backends/EnvBackend.js +114 -0
  93. package/dist/wallet/backends/EnvBackend.js.map +1 -0
  94. package/dist/wallet/backends/EvmWalletSkillBackend.d.ts +40 -0
  95. package/dist/wallet/backends/EvmWalletSkillBackend.d.ts.map +1 -0
  96. package/dist/wallet/backends/EvmWalletSkillBackend.js +81 -0
  97. package/dist/wallet/backends/EvmWalletSkillBackend.js.map +1 -0
  98. package/dist/wallet/backends/index.d.ts +10 -0
  99. package/dist/wallet/backends/index.d.ts.map +1 -0
  100. package/dist/wallet/backends/index.js +10 -0
  101. package/dist/wallet/backends/index.js.map +1 -0
  102. package/dist/wallet/index.d.ts +9 -0
  103. package/dist/wallet/index.d.ts.map +1 -0
  104. package/dist/wallet/index.js +12 -0
  105. package/dist/wallet/index.js.map +1 -0
  106. package/dist/wallet/providers/AmpedWalletProvider.d.ts +107 -0
  107. package/dist/wallet/providers/AmpedWalletProvider.d.ts.map +1 -0
  108. package/dist/wallet/providers/AmpedWalletProvider.js +208 -0
  109. package/dist/wallet/providers/AmpedWalletProvider.js.map +1 -0
  110. package/dist/wallet/providers/BankrBackend.d.ts +105 -0
  111. package/dist/wallet/providers/BankrBackend.d.ts.map +1 -0
  112. package/dist/wallet/providers/BankrBackend.js +327 -0
  113. package/dist/wallet/providers/BankrBackend.js.map +1 -0
  114. package/dist/wallet/providers/LocalKeyBackend.d.ts +62 -0
  115. package/dist/wallet/providers/LocalKeyBackend.d.ts.map +1 -0
  116. package/dist/wallet/providers/LocalKeyBackend.js +152 -0
  117. package/dist/wallet/providers/LocalKeyBackend.js.map +1 -0
  118. package/dist/wallet/providers/chainConfig.d.ts +209 -0
  119. package/dist/wallet/providers/chainConfig.d.ts.map +1 -0
  120. package/dist/wallet/providers/chainConfig.js +175 -0
  121. package/dist/wallet/providers/chainConfig.js.map +1 -0
  122. package/dist/wallet/providers/index.d.ts +30 -0
  123. package/dist/wallet/providers/index.d.ts.map +1 -0
  124. package/dist/wallet/providers/index.js +32 -0
  125. package/dist/wallet/providers/index.js.map +1 -0
  126. package/dist/wallet/providers/types.d.ts +156 -0
  127. package/dist/wallet/providers/types.d.ts.map +1 -0
  128. package/dist/wallet/providers/types.js +11 -0
  129. package/dist/wallet/providers/types.js.map +1 -0
  130. package/dist/wallet/skillWalletAdapter.d.ts +96 -0
  131. package/dist/wallet/skillWalletAdapter.d.ts.map +1 -0
  132. package/dist/wallet/skillWalletAdapter.js +280 -0
  133. package/dist/wallet/skillWalletAdapter.js.map +1 -0
  134. package/dist/wallet/types.d.ts +134 -0
  135. package/dist/wallet/types.d.ts.map +1 -0
  136. package/dist/wallet/types.js +138 -0
  137. package/dist/wallet/types.js.map +1 -0
  138. package/dist/wallet/walletManager.d.ts +111 -0
  139. package/dist/wallet/walletManager.d.ts.map +1 -0
  140. package/dist/wallet/walletManager.js +476 -0
  141. package/dist/wallet/walletManager.js.map +1 -0
  142. package/dist/wallet/walletRegistry.d.ts +95 -0
  143. package/dist/wallet/walletRegistry.d.ts.map +1 -0
  144. package/dist/wallet/walletRegistry.js +184 -0
  145. package/dist/wallet/walletRegistry.js.map +1 -0
  146. package/index.js +2 -0
  147. package/openclaw.plugin.json +37 -0
  148. package/package.json +69 -0
  149. package/src/__mocks__/@sodax/sdk.ts +28 -0
  150. package/src/__tests__/errors.test.ts +238 -0
  151. package/src/__tests__/policyEngine.test.ts +354 -0
  152. package/src/__tests__/positionAggregator.test.ts +271 -0
  153. package/src/__tests__/setup.ts +35 -0
  154. package/src/__tests__/sodaxApi.test.ts +203 -0
  155. package/src/__tests__/walletRegistry.test.ts +155 -0
  156. package/src/index.ts +376 -0
  157. package/src/policy/policyEngine.ts +389 -0
  158. package/src/providers/spokeProviderFactory.ts +283 -0
  159. package/src/sodax/client.ts +113 -0
  160. package/src/tools/bridge.ts +425 -0
  161. package/src/tools/discovery.ts +989 -0
  162. package/src/tools/moneyMarket.ts +1265 -0
  163. package/src/tools/portfolio.ts +697 -0
  164. package/src/tools/swap.ts +926 -0
  165. package/src/tools/walletManagement.ts +359 -0
  166. package/src/types.ts +228 -0
  167. package/src/utils/errorUtils.ts +16 -0
  168. package/src/utils/errors.ts +396 -0
  169. package/src/utils/positionAggregator.ts +559 -0
  170. package/src/utils/priceService.ts +153 -0
  171. package/src/utils/sodaxApi.ts +261 -0
  172. package/src/utils/tokenResolver.ts +286 -0
  173. package/src/wallet/backendConfig.ts +151 -0
  174. package/src/wallet/backends/BankrBackend.ts +399 -0
  175. package/src/wallet/backends/BankrWalletProvider.ts +329 -0
  176. package/src/wallet/backends/EnvBackend.ts +149 -0
  177. package/src/wallet/backends/EvmWalletSkillBackend.ts +110 -0
  178. package/src/wallet/backends/index.ts +10 -0
  179. package/src/wallet/index.ts +14 -0
  180. package/src/wallet/providers/AmpedWalletProvider.ts +267 -0
  181. package/src/wallet/providers/BankrBackend.ts +407 -0
  182. package/src/wallet/providers/LocalKeyBackend.ts +184 -0
  183. package/src/wallet/providers/chainConfig.ts +194 -0
  184. package/src/wallet/providers/index.ts +62 -0
  185. package/src/wallet/providers/types.ts +186 -0
  186. package/src/wallet/skillWalletAdapter.ts +335 -0
  187. package/src/wallet/types.ts +248 -0
  188. package/src/wallet/walletManager.ts +561 -0
  189. package/src/wallet/walletRegistry.ts +216 -0
@@ -0,0 +1,143 @@
1
+ /**
2
+ * SODAX API Client
3
+ *
4
+ * Provides access to SODAX backend API endpoints for querying intents,
5
+ * user history, and other off-chain data.
6
+ */
7
+ import { ErrorCode, AmpedDefiError } from './errors';
8
+ const DEFAULT_BASE_URL = 'https://canary-api.sodax.com';
9
+ const API_VERSION = 'v1';
10
+ export class SodaxApiClient {
11
+ baseUrl;
12
+ apiKey;
13
+ timeoutMs;
14
+ constructor(config = {}) {
15
+ this.baseUrl = config.baseUrl || process.env.SODAX_API_URL || DEFAULT_BASE_URL;
16
+ this.apiKey = config.apiKey || process.env.SODAX_API_KEY;
17
+ this.timeoutMs = config.timeoutMs || 30000;
18
+ }
19
+ /**
20
+ * Get intent by intentHash
21
+ * Most reliable lookup method - works for all intents
22
+ */
23
+ async getIntentByHash(intentHash) {
24
+ const normalizedHash = intentHash.startsWith('0x') ? intentHash : `0x${intentHash}`;
25
+ const url = `${this.baseUrl}/${API_VERSION}/be/intent/${normalizedHash}`;
26
+ console.log('[sodaxApi] Fetching intent by hash:', { intentHash: normalizedHash });
27
+ try {
28
+ const response = await this.fetchWithTimeout(url);
29
+ if (!response.ok) {
30
+ if (response.status === 404) {
31
+ return null;
32
+ }
33
+ const errorText = await response.text();
34
+ throw new AmpedDefiError(ErrorCode.UNKNOWN_ERROR, `SODAX API error: ${response.status} ${errorText}`);
35
+ }
36
+ return await response.json();
37
+ }
38
+ catch (error) {
39
+ if (error instanceof AmpedDefiError)
40
+ throw error;
41
+ throw new AmpedDefiError(ErrorCode.UNKNOWN_ERROR, `Failed to fetch intent by hash: ${error instanceof Error ? error.message : String(error)}`);
42
+ }
43
+ }
44
+ /**
45
+ * Get intent by transaction hash
46
+ * NOTE: This expects the HUB chain (Sonic) transaction hash, NOT spoke chain tx
47
+ */
48
+ async getIntentByTxHash(txHash) {
49
+ const normalizedHash = txHash.startsWith('0x') ? txHash : `0x${txHash}`;
50
+ const url = `${this.baseUrl}/${API_VERSION}/be/intent/tx/${normalizedHash}`;
51
+ console.log('[sodaxApi] Fetching intent by txHash:', { txHash: normalizedHash });
52
+ try {
53
+ const response = await this.fetchWithTimeout(url);
54
+ if (!response.ok) {
55
+ if (response.status === 404) {
56
+ return null;
57
+ }
58
+ const errorText = await response.text();
59
+ throw new AmpedDefiError(ErrorCode.UNKNOWN_ERROR, `SODAX API error: ${response.status} ${errorText}`);
60
+ }
61
+ return await response.json();
62
+ }
63
+ catch (error) {
64
+ if (error instanceof AmpedDefiError)
65
+ throw error;
66
+ throw new AmpedDefiError(ErrorCode.UNKNOWN_ERROR, `Failed to fetch intent by txHash: ${error instanceof Error ? error.message : String(error)}`);
67
+ }
68
+ }
69
+ async getUserIntents(userAddress, pagination = {}, filters) {
70
+ if (!this.isValidAddress(userAddress)) {
71
+ throw new AmpedDefiError(ErrorCode.WALLET_INVALID_ADDRESS, `Invalid user address: ${userAddress}`);
72
+ }
73
+ const normalizedAddress = userAddress.toLowerCase();
74
+ const queryParams = new URLSearchParams();
75
+ if (pagination.offset !== undefined) {
76
+ queryParams.set('offset', pagination.offset.toString());
77
+ }
78
+ if (pagination.limit !== undefined) {
79
+ queryParams.set('limit', pagination.limit.toString());
80
+ }
81
+ if (filters) {
82
+ if (filters.open !== undefined)
83
+ queryParams.set('open', filters.open.toString());
84
+ if (filters.srcChain !== undefined)
85
+ queryParams.set('srcChain', filters.srcChain.toString());
86
+ if (filters.dstChain !== undefined)
87
+ queryParams.set('dstChain', filters.dstChain.toString());
88
+ if (filters.inputToken)
89
+ queryParams.set('inputToken', filters.inputToken.toLowerCase());
90
+ if (filters.outputToken)
91
+ queryParams.set('outputToken', filters.outputToken.toLowerCase());
92
+ }
93
+ const queryString = queryParams.toString();
94
+ const url = `${this.baseUrl}/${API_VERSION}/be/intent/user/${normalizedAddress}${queryString ? `?${queryString}` : ''}`;
95
+ console.log('[sodaxApi] Fetching user intents:', { userAddress: normalizedAddress });
96
+ try {
97
+ const response = await this.fetchWithTimeout(url);
98
+ if (!response.ok) {
99
+ const errorText = await response.text();
100
+ throw new AmpedDefiError(ErrorCode.UNKNOWN_ERROR, `SODAX API error: ${response.status} ${errorText}`);
101
+ }
102
+ return await response.json();
103
+ }
104
+ catch (error) {
105
+ if (error instanceof AmpedDefiError)
106
+ throw error;
107
+ throw new AmpedDefiError(ErrorCode.UNKNOWN_ERROR, `Failed to fetch user intents: ${error instanceof Error ? error.message : String(error)}`);
108
+ }
109
+ }
110
+ async getOpenIntents(userAddress, pagination = {}) {
111
+ return this.getUserIntents(userAddress, pagination, { open: true });
112
+ }
113
+ async getIntentHistory(userAddress, pagination = {}) {
114
+ return this.getUserIntents(userAddress, pagination, { open: false });
115
+ }
116
+ async fetchWithTimeout(url) {
117
+ const controller = new AbortController();
118
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
119
+ try {
120
+ const headers = { 'Accept': 'application/json' };
121
+ if (this.apiKey)
122
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
123
+ return await fetch(url, { signal: controller.signal, headers });
124
+ }
125
+ finally {
126
+ clearTimeout(timeoutId);
127
+ }
128
+ }
129
+ isValidAddress(address) {
130
+ return /^0x[a-fA-F0-9]{40}$/.test(address);
131
+ }
132
+ }
133
+ let apiClient = null;
134
+ export function getSodaxApiClient(config) {
135
+ if (!apiClient) {
136
+ apiClient = new SodaxApiClient(config);
137
+ }
138
+ return apiClient;
139
+ }
140
+ export function resetSodaxApiClient() {
141
+ apiClient = null;
142
+ }
143
+ //# sourceMappingURL=sodaxApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sodaxApi.js","sourceRoot":"","sources":["../../src/utils/sodaxApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Token Resolution Utility
3
+ *
4
+ * Resolves token symbols to addresses using the SODAX SDK config service.
5
+ * Supports case-insensitive symbol lookup with caching.
6
+ * Handles both EVM (0x) and Solana (base58) address formats.
7
+ */
8
+ import type { Token } from '@sodax/types';
9
+ declare function isSolanaChain(chainId: string): boolean;
10
+ /**
11
+ * Check if a string is a valid EVM address (0x format)
12
+ */
13
+ declare function isEvmAddress(value: string): boolean;
14
+ /**
15
+ * Check if a string is a valid Solana address (base58 format)
16
+ * Solana addresses are 32-44 characters, base58 encoded
17
+ */
18
+ declare function isSolanaAddress(value: string): boolean;
19
+ /**
20
+ * Check if a string is a valid token address (EVM or Solana)
21
+ */
22
+ declare function isValidTokenAddress(value: string, chainId?: string): boolean;
23
+ /**
24
+ * Resolve a token symbol or address to a normalized address
25
+ *
26
+ * @param chainId - The chain ID to resolve the token on
27
+ * @param tokenInput - Token symbol (e.g., "USDC") or address
28
+ * @returns The token address (lowercase for EVM, original case for Solana)
29
+ * @throws Error if token symbol is not found on the chain
30
+ */
31
+ export declare function resolveToken(chainId: string, tokenInput: string): Promise<string>;
32
+ /**
33
+ * Resolve multiple tokens at once (for efficiency)
34
+ *
35
+ * @param chainId - The chain ID
36
+ * @param tokenInputs - Array of token symbols or addresses
37
+ * @returns Array of resolved addresses
38
+ */
39
+ export declare function resolveTokens(chainId: string, tokenInputs: string[]): Promise<string[]>;
40
+ /**
41
+ * Get token info by symbol or address
42
+ * Returns null if not found
43
+ */
44
+ export declare function getTokenInfo(chainId: string, tokenInput: string): Promise<Token | null>;
45
+ /**
46
+ * Clear the token cache (useful for testing or after config refresh)
47
+ */
48
+ export declare function clearTokenCache(): void;
49
+ /**
50
+ * Get all cached tokens for a chain
51
+ */
52
+ export declare function getCachedTokens(chainId: string): Token[] | undefined;
53
+ export { isEvmAddress, isSolanaAddress, isValidTokenAddress, isSolanaChain };
54
+ //# sourceMappingURL=tokenResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenResolver.d.ts","sourceRoot":"","sources":["../../src/utils/tokenResolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AA4D1C,iBAAS,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE/C;AAsBD;;GAEG;AACH,iBAAS,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;;GAGG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAI/C;AAED;;GAEG;AACH,iBAAS,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAMrE;AAgDD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAyCvB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,SAAS,CAEpE;AAGD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Token Resolution Utility
3
+ *
4
+ * Resolves token symbols to addresses using the SODAX SDK config service.
5
+ * Supports case-insensitive symbol lookup with caching.
6
+ * Handles both EVM (0x) and Solana (base58) address formats.
7
+ */
8
+ import { getSodaxClient } from '../sodax/client';
9
+ import { toSodaxChainId } from '../wallet/types';
10
+ // Cache tokens per chain to avoid repeated lookups
11
+ const tokenCache = new Map();
12
+ // Native token addresses
13
+ const EVM_NATIVE_ADDRESS = '0x0000000000000000000000000000000000000000';
14
+ const SOLANA_NATIVE_ADDRESS = '11111111111111111111111111111111';
15
+ // Native token configs per chain (18 decimals for all EVM chains, 9 for Solana)
16
+ const NATIVE_TOKENS = {
17
+ sonic: { symbol: 'S', name: 'Sonic', decimals: 18, address: EVM_NATIVE_ADDRESS },
18
+ ethereum: { symbol: 'ETH', name: 'Ether', decimals: 18, address: EVM_NATIVE_ADDRESS },
19
+ '0xa4b1.arbitrum': { symbol: 'ETH', name: 'Ether', decimals: 18, address: EVM_NATIVE_ADDRESS },
20
+ '0x2105.base': { symbol: 'ETH', name: 'Ether', decimals: 18, address: EVM_NATIVE_ADDRESS },
21
+ '0xa.optimism': { symbol: 'ETH', name: 'Ether', decimals: 18, address: EVM_NATIVE_ADDRESS },
22
+ '0x38.bsc': { symbol: 'BNB', name: 'BNB', decimals: 18, address: EVM_NATIVE_ADDRESS },
23
+ '0x89.polygon': { symbol: 'POL', name: 'POL', decimals: 18, address: EVM_NATIVE_ADDRESS },
24
+ '0xa86a.avax': { symbol: 'AVAX', name: 'Avalanche', decimals: 18, address: EVM_NATIVE_ADDRESS },
25
+ hyper: { symbol: 'HYPE', name: 'Hyperliquid', decimals: 18, address: EVM_NATIVE_ADDRESS },
26
+ lightlink: { symbol: 'ETH', name: 'Ether', decimals: 18, address: EVM_NATIVE_ADDRESS },
27
+ solana: { symbol: 'SOL', name: 'Solana', decimals: 9, address: SOLANA_NATIVE_ADDRESS },
28
+ };
29
+ // Fallback token list for common chains when SDK config is unavailable
30
+ const FALLBACK_TOKENS = {
31
+ '0x2105.base': [
32
+ { address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', symbol: 'USDC', name: 'USD Coin', decimals: 6 },
33
+ { address: '0x4200000000000000000000000000000000000006', symbol: 'WETH', name: 'Wrapped Ether', decimals: 18 },
34
+ { address: EVM_NATIVE_ADDRESS, symbol: 'ETH', name: 'Ether', decimals: 18 },
35
+ ],
36
+ 'ethereum': [
37
+ { address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', symbol: 'USDC', name: 'USD Coin', decimals: 6 },
38
+ { address: '0xdac17f958d2ee523a2206206994597c13d831ec7', symbol: 'USDT', name: 'Tether USD', decimals: 6 },
39
+ { address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', symbol: 'DAI', name: 'Dai Stablecoin', decimals: 18 },
40
+ { address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', symbol: 'WETH', name: 'Wrapped Ether', decimals: 18 },
41
+ { address: EVM_NATIVE_ADDRESS, symbol: 'ETH', name: 'Ether', decimals: 18 },
42
+ ],
43
+ '0xa4b1.arbitrum': [
44
+ { address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', symbol: 'USDC', name: 'USD Coin', decimals: 6 },
45
+ { address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9', symbol: 'USDT', name: 'Tether USD', decimals: 6 },
46
+ { address: EVM_NATIVE_ADDRESS, symbol: 'ETH', name: 'Ether', decimals: 18 },
47
+ ],
48
+ 'sonic': [
49
+ { address: '0x29219dd400f2Bf60E5a23d13Be72B486D4038894', symbol: 'USDC', name: 'USD Coin', decimals: 6 },
50
+ { address: '0x6047828dc181963ba44974801FF68e538dA5eaF9', symbol: 'USDT', name: 'Tether USD', decimals: 6 },
51
+ { address: EVM_NATIVE_ADDRESS, symbol: 'S', name: 'Sonic', decimals: 18 },
52
+ ],
53
+ 'solana': [
54
+ { address: SOLANA_NATIVE_ADDRESS, symbol: 'SOL', name: 'Solana', decimals: 9 },
55
+ { address: '3rSPCLNEF7Quw4wX8S1NyKivELoyij8eYA2gJwBgt4V5', symbol: 'bnUSD', name: 'bnUSD', decimals: 9 },
56
+ { address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', symbol: 'USDC', name: 'USD Coin', decimals: 6 },
57
+ ],
58
+ };
59
+ // Chain type detection
60
+ const SOLANA_CHAINS = new Set(['solana']);
61
+ function isSolanaChain(chainId) {
62
+ return SOLANA_CHAINS.has(chainId.toLowerCase());
63
+ }
64
+ /**
65
+ * Check if an address is a native token for the given chain
66
+ */
67
+ function isNativeToken(address, chainId) {
68
+ const addrLower = address.toLowerCase();
69
+ if (chainId && isSolanaChain(chainId)) {
70
+ return addrLower === SOLANA_NATIVE_ADDRESS.toLowerCase();
71
+ }
72
+ return addrLower === EVM_NATIVE_ADDRESS;
73
+ }
74
+ /**
75
+ * Get native token info for a chain
76
+ */
77
+ function getNativeTokenInfo(chainId) {
78
+ const native = NATIVE_TOKENS[chainId];
79
+ if (!native)
80
+ return null;
81
+ return { ...native };
82
+ }
83
+ /**
84
+ * Check if a string is a valid EVM address (0x format)
85
+ */
86
+ function isEvmAddress(value) {
87
+ return /^0x[a-fA-F0-9]{40}$/i.test(value);
88
+ }
89
+ /**
90
+ * Check if a string is a valid Solana address (base58 format)
91
+ * Solana addresses are 32-44 characters, base58 encoded
92
+ */
93
+ function isSolanaAddress(value) {
94
+ // Base58 charset: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
95
+ // Excludes: 0, O, I, l
96
+ return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(value);
97
+ }
98
+ /**
99
+ * Check if a string is a valid token address (EVM or Solana)
100
+ */
101
+ function isValidTokenAddress(value, chainId) {
102
+ if (chainId && isSolanaChain(chainId)) {
103
+ return isSolanaAddress(value);
104
+ }
105
+ // For EVM chains or unknown chains, check both formats
106
+ return isEvmAddress(value) || isSolanaAddress(value);
107
+ }
108
+ /**
109
+ * Populate the token cache for a chain from SDK config service
110
+ * This is the canonical way to get tokens - used by both resolveToken and getTokenInfo
111
+ */
112
+ function populateTokenCache(chainId) {
113
+ // Convert to SDK chain ID format (e.g., "base" -> "0x2105.base")
114
+ const sdkChainId = toSodaxChainId(chainId);
115
+ let tokens = tokenCache.get(chainId);
116
+ if (tokens)
117
+ return tokens;
118
+ try {
119
+ const client = getSodaxClient();
120
+ const configService = client.config;
121
+ if (configService?.getSupportedSwapTokensByChainId) {
122
+ // Preferred method - returns readonly Token[]
123
+ tokens = [...configService.getSupportedSwapTokensByChainId(sdkChainId)];
124
+ }
125
+ else if (configService?.getSwapTokensByChainId) {
126
+ tokens = configService.getSwapTokensByChainId(sdkChainId);
127
+ }
128
+ else if (configService?.getSwapTokens) {
129
+ const allTokens = configService.getSwapTokens();
130
+ tokens = allTokens[sdkChainId] || [];
131
+ }
132
+ else {
133
+ console.warn(`[tokenResolver] configService not available for chain ${chainId}`);
134
+ tokens = [];
135
+ }
136
+ // Log what we got from SDK
137
+ if (tokens && tokens.length > 0) {
138
+ console.log(`[tokenResolver] Loaded ${tokens.length} tokens from SDK for ${chainId}`);
139
+ }
140
+ }
141
+ catch (err) {
142
+ console.error(`[tokenResolver] Failed to fetch tokens for chain ${chainId}:`, err);
143
+ tokens = [];
144
+ }
145
+ // Use fallback tokens if SDK returned empty list
146
+ if ((!tokens || tokens.length === 0) && FALLBACK_TOKENS[chainId] || FALLBACK_TOKENS[sdkChainId]) {
147
+ console.log(`[tokenResolver] Using fallback token list for ${chainId}`);
148
+ tokens = FALLBACK_TOKENS[chainId] || FALLBACK_TOKENS[sdkChainId];
149
+ }
150
+ tokenCache.set(chainId, tokens || []);
151
+ return tokens || [];
152
+ }
153
+ /**
154
+ * Resolve a token symbol or address to a normalized address
155
+ *
156
+ * @param chainId - The chain ID to resolve the token on
157
+ * @param tokenInput - Token symbol (e.g., "USDC") or address
158
+ * @returns The token address (lowercase for EVM, original case for Solana)
159
+ * @throws Error if token symbol is not found on the chain
160
+ */
161
+ export async function resolveToken(chainId, tokenInput) {
162
+ // If already a valid address, normalize and return
163
+ if (isValidTokenAddress(tokenInput, chainId)) {
164
+ // EVM addresses are lowercased, Solana addresses preserve case
165
+ return isEvmAddress(tokenInput) ? tokenInput.toLowerCase() : tokenInput;
166
+ }
167
+ // Get tokens from cache or SDK
168
+ const tokens = populateTokenCache(chainId);
169
+ // Find by symbol (case-insensitive)
170
+ const symbolUpper = tokenInput.toUpperCase();
171
+ const token = tokens.find(t => t.symbol.toUpperCase() === symbolUpper);
172
+ if (!token) {
173
+ // Build helpful error message with available tokens
174
+ const available = tokens.length > 0
175
+ ? tokens.map(t => t.symbol).join(', ')
176
+ : 'No tokens loaded';
177
+ throw new Error(`Unknown token "${tokenInput}" on chain ${chainId}. ` +
178
+ `Available: ${available}. ` +
179
+ `Alternatively, provide the token address directly.`);
180
+ }
181
+ return isEvmAddress(token.address) ? token.address.toLowerCase() : token.address;
182
+ }
183
+ /**
184
+ * Resolve multiple tokens at once (for efficiency)
185
+ *
186
+ * @param chainId - The chain ID
187
+ * @param tokenInputs - Array of token symbols or addresses
188
+ * @returns Array of resolved addresses
189
+ */
190
+ export async function resolveTokens(chainId, tokenInputs) {
191
+ return Promise.all(tokenInputs.map(t => resolveToken(chainId, t)));
192
+ }
193
+ /**
194
+ * Get token info by symbol or address
195
+ * Returns null if not found
196
+ */
197
+ export async function getTokenInfo(chainId, tokenInput) {
198
+ const sdkChainId = toSodaxChainId(chainId);
199
+ // Handle native tokens first
200
+ if (isValidTokenAddress(tokenInput, chainId) && isNativeToken(tokenInput, chainId)) {
201
+ const nativeInfo = getNativeTokenInfo(chainId);
202
+ if (nativeInfo) {
203
+ return nativeInfo;
204
+ }
205
+ }
206
+ // Get tokens from cache or SDK (same path as resolveToken)
207
+ const tokens = populateTokenCache(chainId);
208
+ // Find by address or symbol
209
+ if (isValidTokenAddress(tokenInput, chainId)) {
210
+ // Normalize address for comparison
211
+ const addrNorm = isEvmAddress(tokenInput) ? tokenInput.toLowerCase() : tokenInput;
212
+ const found = tokens.find(t => {
213
+ const tokenAddr = isEvmAddress(t.address) ? t.address.toLowerCase() : t.address;
214
+ return tokenAddr === addrNorm;
215
+ });
216
+ if (found) {
217
+ return found;
218
+ }
219
+ // Check fallback tokens even if SDK tokens were loaded
220
+ const fallback = FALLBACK_TOKENS[chainId] || FALLBACK_TOKENS[sdkChainId];
221
+ if (fallback) {
222
+ const fallbackToken = fallback.find(t => {
223
+ const tokenAddr = isEvmAddress(t.address) ? t.address.toLowerCase() : t.address;
224
+ return tokenAddr === addrNorm;
225
+ });
226
+ if (fallbackToken) {
227
+ console.log(`[tokenResolver] Found ${fallbackToken.symbol} in fallback for ${chainId}`);
228
+ return fallbackToken;
229
+ }
230
+ }
231
+ return null;
232
+ }
233
+ else {
234
+ const symbolUpper = tokenInput.toUpperCase();
235
+ return tokens.find(t => t.symbol.toUpperCase() === symbolUpper) || null;
236
+ }
237
+ }
238
+ /**
239
+ * Clear the token cache (useful for testing or after config refresh)
240
+ */
241
+ export function clearTokenCache() {
242
+ tokenCache.clear();
243
+ }
244
+ /**
245
+ * Get all cached tokens for a chain
246
+ */
247
+ export function getCachedTokens(chainId) {
248
+ return tokenCache.get(chainId);
249
+ }
250
+ // Export address validation utilities for use by other modules
251
+ export { isEvmAddress, isSolanaAddress, isValidTokenAddress, isSolanaChain };
252
+ //# sourceMappingURL=tokenResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenResolver.js","sourceRoot":"","sources":["../../src/utils/tokenResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Wallet Backend Configuration
3
+ *
4
+ * Detects and configures the appropriate wallet backend based on
5
+ * environment variables or config file.
6
+ *
7
+ * Supported backends:
8
+ * - localKey (default): Uses evm-wallet-skill local private keys
9
+ * - bankr: Uses Bankr Agent API for transaction execution
10
+ */
11
+ import type { WalletBackendType } from './providers';
12
+ export interface BackendConfig {
13
+ backend: WalletBackendType;
14
+ bankrApiKey?: string;
15
+ bankrApiUrl?: string;
16
+ }
17
+ /**
18
+ * Get the resolved backend configuration
19
+ *
20
+ * Priority:
21
+ * 1. Environment variables
22
+ * 2. Config file
23
+ * 3. Defaults
24
+ */
25
+ export declare function getBackendConfig(): BackendConfig;
26
+ /**
27
+ * Check if Bankr backend is configured and available
28
+ */
29
+ export declare function isBankrConfigured(): boolean;
30
+ /**
31
+ * Get Bankr configuration if available
32
+ */
33
+ export declare function getBankrConfig(): {
34
+ apiKey: string;
35
+ apiUrl: string;
36
+ } | null;
37
+ //# sourceMappingURL=backendConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendConfig.d.ts","sourceRoot":"","sources":["../../src/wallet/backendConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAuED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CA2BhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAG3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW1E"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Wallet Backend Configuration
3
+ *
4
+ * Detects and configures the appropriate wallet backend based on
5
+ * environment variables or config file.
6
+ *
7
+ * Supported backends:
8
+ * - localKey (default): Uses evm-wallet-skill local private keys
9
+ * - bankr: Uses Bankr Agent API for transaction execution
10
+ */
11
+ import { existsSync, readFileSync } from 'fs';
12
+ import { join } from 'path';
13
+ import { homedir } from 'os';
14
+ /**
15
+ * Default configuration
16
+ */
17
+ const DEFAULT_CONFIG = {
18
+ backend: 'localKey',
19
+ };
20
+ /**
21
+ * Path to plugin config file
22
+ */
23
+ function getConfigPath() {
24
+ return join(homedir(), '.openclaw', 'extensions', 'amped-defi', 'config.json');
25
+ }
26
+ /**
27
+ * Load configuration from file
28
+ */
29
+ function loadConfigFile() {
30
+ const configPath = getConfigPath();
31
+ if (!existsSync(configPath)) {
32
+ return null;
33
+ }
34
+ try {
35
+ const content = readFileSync(configPath, 'utf-8');
36
+ const config = JSON.parse(content);
37
+ return {
38
+ backend: config.walletBackend,
39
+ bankrApiKey: config.bankrApiKey,
40
+ bankrApiUrl: config.bankrApiUrl,
41
+ };
42
+ }
43
+ catch (error) {
44
+ console.warn('[backendConfig] Failed to load config file:', error);
45
+ return null;
46
+ }
47
+ }
48
+ /**
49
+ * Load configuration from environment variables
50
+ */
51
+ function loadEnvConfig() {
52
+ const config = {};
53
+ // Check for explicit backend selection
54
+ const backendEnv = process.env.AMPED_OC_WALLET_BACKEND;
55
+ if (backendEnv === 'bankr' || backendEnv === 'localKey') {
56
+ config.backend = backendEnv;
57
+ }
58
+ // Check for Bankr API key (implies bankr backend)
59
+ const bankrApiKey = process.env.BANKR_API_KEY;
60
+ if (bankrApiKey) {
61
+ config.bankrApiKey = bankrApiKey;
62
+ // Auto-select bankr backend if API key is present
63
+ if (!config.backend) {
64
+ config.backend = 'bankr';
65
+ }
66
+ }
67
+ // Optional Bankr API URL override
68
+ const bankrApiUrl = process.env.BANKR_API_URL;
69
+ if (bankrApiUrl) {
70
+ config.bankrApiUrl = bankrApiUrl;
71
+ }
72
+ return config;
73
+ }
74
+ /**
75
+ * Get the resolved backend configuration
76
+ *
77
+ * Priority:
78
+ * 1. Environment variables
79
+ * 2. Config file
80
+ * 3. Defaults
81
+ */
82
+ export function getBackendConfig() {
83
+ const fileConfig = loadConfigFile() || {};
84
+ const envConfig = loadEnvConfig();
85
+ // Merge with priority: env > file > default
86
+ const config = {
87
+ ...DEFAULT_CONFIG,
88
+ ...fileConfig,
89
+ ...envConfig,
90
+ };
91
+ // Validate bankr configuration
92
+ if (config.backend === 'bankr' && !config.bankrApiKey) {
93
+ console.warn('[backendConfig] Bankr backend selected but no API key provided');
94
+ console.warn('[backendConfig] Set BANKR_API_KEY environment variable or add bankrApiKey to config.json');
95
+ console.warn('[backendConfig] Falling back to localKey backend');
96
+ config.backend = 'localKey';
97
+ }
98
+ // Set default Bankr API URL if not specified
99
+ if (config.backend === 'bankr' && !config.bankrApiUrl) {
100
+ config.bankrApiUrl = 'https://api.bankr.bot';
101
+ }
102
+ console.log(`[backendConfig] Using wallet backend: ${config.backend}`);
103
+ return config;
104
+ }
105
+ /**
106
+ * Check if Bankr backend is configured and available
107
+ */
108
+ export function isBankrConfigured() {
109
+ const config = getBackendConfig();
110
+ return config.backend === 'bankr' && !!config.bankrApiKey;
111
+ }
112
+ /**
113
+ * Get Bankr configuration if available
114
+ */
115
+ export function getBankrConfig() {
116
+ const config = getBackendConfig();
117
+ if (config.backend !== 'bankr' || !config.bankrApiKey) {
118
+ return null;
119
+ }
120
+ return {
121
+ apiKey: config.bankrApiKey,
122
+ apiUrl: config.bankrApiUrl || 'https://api.bankr.bot',
123
+ };
124
+ }
125
+ //# sourceMappingURL=backendConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendConfig.js","sourceRoot":"","sources":["../../src/wallet/backendConfig.ts"],"names":[],"mappings":"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"}