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,327 @@
1
+ /**
2
+ * Bankr Backend - Transaction Execution Layer
3
+ *
4
+ * CRITICAL: This backend is for EXECUTION ONLY, not routing.
5
+ *
6
+ * Architecture:
7
+ * SODAX SDK (routing) → BankrBackend (execution) → Blockchain
8
+ *
9
+ * What Bankr DOES:
10
+ * ✓ Signs the pre-computed transaction from SODAX
11
+ * ✓ Submits to blockchain via Bankr API
12
+ * ✓ Returns transaction hash
13
+ *
14
+ * What Bankr does NOT do:
15
+ * ✗ NO routing decisions
16
+ * ✗ NO DeFi protocol selection
17
+ * ✗ NO swap optimization
18
+ * ✗ NO interpretation of intent
19
+ *
20
+ * The SODAX SDK always handles routing logic. Bankr receives the exact
21
+ * transaction data (to, data, value, chainId) and submits it verbatim.
22
+ *
23
+ * @see SKILL.md "Transaction Execution Architecture" section
24
+ */
25
+ import { resolveChainId } from './chainConfig';
26
+ /**
27
+ * Serialize error objects for readable error messages
28
+ */
29
+ function serializeError(error) {
30
+ if (error instanceof Error)
31
+ return error.message;
32
+ if (typeof error === 'string')
33
+ return error;
34
+ try {
35
+ return JSON.stringify(error, (k, v) => typeof v === 'bigint' ? v.toString() : v, 2);
36
+ }
37
+ catch {
38
+ return String(error);
39
+ }
40
+ }
41
+ /**
42
+ * Chain ID to chain name mapping for Bankr prompts
43
+ */
44
+ const CHAIN_NAMES = {
45
+ 1: 'ethereum',
46
+ 8453: 'base',
47
+ 137: 'polygon',
48
+ 42161: 'arbitrum',
49
+ 10: 'optimism',
50
+ 1890: 'lightlink',
51
+ 146: 'sonic',
52
+ };
53
+ /**
54
+ * Bankr execution backend
55
+ *
56
+ * Delegates transaction execution to Bankr's Agent API.
57
+ * The agent never has direct access to private keys.
58
+ */
59
+ export class BankrBackend {
60
+ type = 'bankr';
61
+ apiUrl;
62
+ apiKey;
63
+ userAddress;
64
+ chainId;
65
+ policy;
66
+ // Polling configuration
67
+ pollIntervalMs = 2000;
68
+ maxPollAttempts = 150; // 5 minutes max
69
+ constructor(config) {
70
+ this.apiUrl = config.bankrApiUrl || 'https://api.bankr.bot';
71
+ this.apiKey = config.bankrApiKey;
72
+ this.userAddress = config.userAddress;
73
+ this.chainId = resolveChainId(config.chainId);
74
+ this.policy = config.policy;
75
+ console.log(`[BankrBackend] Initialized for chain ${this.chainId}`);
76
+ console.log(`[BankrBackend] User address: ${this.userAddress}`);
77
+ console.log(`[BankrBackend] API URL: ${this.apiUrl}`);
78
+ }
79
+ /**
80
+ * Get the wallet address (Bankr-provisioned)
81
+ */
82
+ async getAddress() {
83
+ return this.userAddress;
84
+ }
85
+ /**
86
+ * Send a transaction via Bankr Agent API
87
+ *
88
+ * Formats the transaction as a natural language prompt and submits
89
+ * to Bankr's async job system.
90
+ */
91
+ async sendTransaction(tx) {
92
+ console.log(`[BankrBackend] Sending transaction via Bankr API`);
93
+ console.log(`[BankrBackend] To: ${tx.to}`);
94
+ console.log(`[BankrBackend] Value: ${tx.value || 0n}`);
95
+ console.log(`[BankrBackend] Data: ${tx.data ? tx.data.slice(0, 20) + '...' : '0x'}`);
96
+ // Validate against policy
97
+ if (this.policy) {
98
+ await this.validatePolicy(tx);
99
+ }
100
+ // Format transaction as JSON for Bankr prompt
101
+ const txJson = JSON.stringify({
102
+ to: tx.to,
103
+ data: tx.data || '0x',
104
+ value: (tx.value || 0n).toString(),
105
+ chainId: this.chainId,
106
+ });
107
+ // Create natural language prompt for Bankr
108
+ const prompt = `Submit this transaction: ${txJson}`;
109
+ console.log(`[BankrBackend] Submitting prompt to Bankr API`);
110
+ // Submit job to Bankr
111
+ const jobId = await this.submitJob(prompt);
112
+ console.log(`[BankrBackend] Job submitted: ${jobId}`);
113
+ // Poll for completion
114
+ const result = await this.pollJobUntilComplete(jobId);
115
+ // Extract transaction hash from response
116
+ const txHash = this.extractTransactionHash(result);
117
+ if (!txHash) {
118
+ throw new Error(`[BankrBackend] Transaction failed: ${serializeError(result.response || result.error) || 'Unknown error'}`);
119
+ }
120
+ console.log(`[BankrBackend] Transaction hash: ${txHash}`);
121
+ return txHash;
122
+ }
123
+ /**
124
+ * Wait for transaction confirmation
125
+ *
126
+ * Note: With Bankr, the transaction is already confirmed when we get
127
+ * the response. This method exists for interface compatibility but
128
+ * returns a minimal receipt.
129
+ */
130
+ async waitForTransaction(txHash) {
131
+ console.log(`[BankrBackend] waitForTransaction called for: ${txHash}`);
132
+ // Bankr transactions are confirmed when the job completes
133
+ // We return a minimal receipt since we don't have full details
134
+ return {
135
+ transactionHash: txHash,
136
+ blockNumber: 0n, // Unknown - would need to query chain
137
+ blockHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
138
+ from: this.userAddress,
139
+ to: null,
140
+ gasUsed: 0n,
141
+ status: 'success',
142
+ logs: [],
143
+ };
144
+ }
145
+ /**
146
+ * Check if backend is ready
147
+ *
148
+ * Verifies Bankr API connectivity with a simple balance query.
149
+ */
150
+ async isReady() {
151
+ if (!this.apiUrl || !this.apiKey || !this.userAddress) {
152
+ return false;
153
+ }
154
+ try {
155
+ // Test API connectivity with a simple query
156
+ const response = await fetch(`${this.apiUrl}/agent/prompt`, {
157
+ method: 'POST',
158
+ headers: {
159
+ 'X-API-Key': this.apiKey,
160
+ 'Content-Type': 'application/json',
161
+ },
162
+ body: JSON.stringify({ prompt: 'ping' }),
163
+ });
164
+ // Even a 4xx error means API is reachable
165
+ return response.status !== 503 && response.status !== 502;
166
+ }
167
+ catch (error) {
168
+ console.error('[BankrBackend] Connectivity check failed:', error);
169
+ return false;
170
+ }
171
+ }
172
+ /**
173
+ * Get the chain ID
174
+ */
175
+ getChainId() {
176
+ return this.chainId;
177
+ }
178
+ /**
179
+ * Submit a job to Bankr Agent API
180
+ */
181
+ async submitJob(prompt) {
182
+ const response = await fetch(`${this.apiUrl}/agent/prompt`, {
183
+ method: 'POST',
184
+ headers: {
185
+ 'X-API-Key': this.apiKey,
186
+ 'Content-Type': 'application/json',
187
+ },
188
+ body: JSON.stringify({ prompt }),
189
+ });
190
+ if (!response.ok) {
191
+ const error = await response.text();
192
+ throw new Error(`[BankrBackend] Failed to submit job: ${response.status} ${error}`);
193
+ }
194
+ const data = await response.json();
195
+ if (!data.success || !data.jobId) {
196
+ throw new Error(`[BankrBackend] Invalid job submission response: ${JSON.stringify(data)}`);
197
+ }
198
+ return data.jobId;
199
+ }
200
+ /**
201
+ * Poll for job completion
202
+ */
203
+ async pollJobUntilComplete(jobId) {
204
+ let lastStatus = '';
205
+ for (let attempt = 0; attempt < this.maxPollAttempts; attempt++) {
206
+ await this.sleep(this.pollIntervalMs);
207
+ const result = await this.getJobStatus(jobId);
208
+ // Log status changes
209
+ if (result.status !== lastStatus) {
210
+ console.log(`[BankrBackend] Job ${jobId} status: ${result.status}`);
211
+ lastStatus = result.status;
212
+ }
213
+ // Log status updates
214
+ if (result.statusUpdates && result.statusUpdates.length > 0) {
215
+ const lastUpdate = result.statusUpdates[result.statusUpdates.length - 1];
216
+ console.log(`[BankrBackend] Progress: ${lastUpdate.message}`);
217
+ }
218
+ // Check for terminal states
219
+ switch (result.status) {
220
+ case 'completed':
221
+ return result;
222
+ case 'failed':
223
+ throw new Error(`[BankrBackend] Job failed: ${serializeError(result.error) || 'Unknown error'}`);
224
+ case 'cancelled':
225
+ throw new Error(`[BankrBackend] Job was cancelled`);
226
+ case 'pending':
227
+ case 'processing':
228
+ // Continue polling
229
+ break;
230
+ default:
231
+ console.warn(`[BankrBackend] Unknown status: ${result.status}`);
232
+ }
233
+ }
234
+ throw new Error(`[BankrBackend] Job ${jobId} timed out after ${this.maxPollAttempts * this.pollIntervalMs / 1000} seconds`);
235
+ }
236
+ /**
237
+ * Get job status from Bankr API
238
+ */
239
+ async getJobStatus(jobId) {
240
+ const response = await fetch(`${this.apiUrl}/agent/job/${jobId}`, {
241
+ method: 'GET',
242
+ headers: {
243
+ 'X-API-Key': this.apiKey,
244
+ },
245
+ });
246
+ if (!response.ok) {
247
+ const error = await response.text();
248
+ throw new Error(`[BankrBackend] Failed to get job status: ${response.status} ${error}`);
249
+ }
250
+ return await response.json();
251
+ }
252
+ /**
253
+ * Extract transaction hash from Bankr response
254
+ *
255
+ * The response may contain the tx hash in various formats:
256
+ * - In richData array
257
+ * - In the response text (e.g., "Transaction hash: 0x...")
258
+ */
259
+ extractTransactionHash(result) {
260
+ // Check richData for transaction info
261
+ if (result.richData) {
262
+ for (const item of result.richData) {
263
+ if (item.transactionHash) {
264
+ return item.transactionHash;
265
+ }
266
+ if (item.txHash) {
267
+ return item.txHash;
268
+ }
269
+ if (item.hash) {
270
+ return item.hash;
271
+ }
272
+ }
273
+ }
274
+ // Try to extract from response text
275
+ if (result.response) {
276
+ // Look for hex transaction hash pattern (0x followed by 64 hex chars)
277
+ const hashMatch = result.response.match(/0x[a-fA-F0-9]{64}/);
278
+ if (hashMatch) {
279
+ return hashMatch[0];
280
+ }
281
+ // Check if response indicates failure
282
+ if (result.response.toLowerCase().includes('reverted') ||
283
+ result.response.toLowerCase().includes('failed') ||
284
+ result.response.toLowerCase().includes('insufficient')) {
285
+ console.error(`[BankrBackend] Transaction failed: ${result.response}`);
286
+ return null;
287
+ }
288
+ }
289
+ return null;
290
+ }
291
+ /**
292
+ * Validate transaction against policy
293
+ */
294
+ async validatePolicy(tx) {
295
+ if (!this.policy)
296
+ return;
297
+ // Check max value per transaction
298
+ if (this.policy.maxValuePerTx && tx.value && tx.value > this.policy.maxValuePerTx) {
299
+ throw new Error(`Transaction value ${tx.value} exceeds max allowed ${this.policy.maxValuePerTx}`);
300
+ }
301
+ // Check allowed contracts
302
+ if (this.policy.allowedContracts && this.policy.allowedContracts.length > 0) {
303
+ if (!this.policy.allowedContracts.includes(tx.to)) {
304
+ throw new Error(`Contract ${tx.to} is not in the allowed contracts list`);
305
+ }
306
+ }
307
+ }
308
+ /**
309
+ * Sleep helper
310
+ */
311
+ sleep(ms) {
312
+ return new Promise(resolve => setTimeout(resolve, ms));
313
+ }
314
+ }
315
+ /**
316
+ * Create a BankrBackend from configuration
317
+ */
318
+ export async function createBankrBackend(config) {
319
+ const backend = new BankrBackend(config);
320
+ // Verify connectivity
321
+ const ready = await backend.isReady();
322
+ if (!ready) {
323
+ console.warn('[BankrBackend] Backend created but connectivity check failed');
324
+ }
325
+ return backend;
326
+ }
327
+ //# sourceMappingURL=BankrBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BankrBackend.js","sourceRoot":"","sources":["../../../src/wallet/providers/BankrBackend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Local Key Backend
3
+ *
4
+ * Wallet backend implementation using local private keys.
5
+ * Compatible with evm-wallet-skill's key storage.
6
+ *
7
+ * Uses viem for transaction signing and submission.
8
+ */
9
+ import { createPublicClient, createWalletClient, type Hash, type Address } from 'viem';
10
+ import type { IWalletBackend, LocalKeyBackendConfig, TransactionRequest, TransactionReceipt } from './types';
11
+ /**
12
+ * Local private key wallet backend
13
+ *
14
+ * Signs transactions locally using the provided private key.
15
+ * This is the standard backend for self-custody wallets.
16
+ */
17
+ export declare class LocalKeyBackend implements IWalletBackend {
18
+ readonly type: "localKey";
19
+ private readonly account;
20
+ private readonly walletClient;
21
+ private readonly _publicClient;
22
+ private readonly chainId;
23
+ private readonly chain;
24
+ constructor(config: LocalKeyBackendConfig);
25
+ /**
26
+ * Get the wallet address
27
+ */
28
+ getAddress(): Promise<Address>;
29
+ /**
30
+ * Send a transaction
31
+ *
32
+ * Signs locally and submits via RPC.
33
+ */
34
+ sendTransaction(tx: TransactionRequest): Promise<Hash>;
35
+ /**
36
+ * Wait for transaction confirmation
37
+ */
38
+ waitForTransaction(txHash: Hash): Promise<TransactionReceipt>;
39
+ /**
40
+ * Check if backend is ready
41
+ *
42
+ * For local key backend, we verify RPC connectivity.
43
+ */
44
+ isReady(): Promise<boolean>;
45
+ /**
46
+ * Get the chain ID
47
+ */
48
+ getChainId(): number;
49
+ /**
50
+ * Get the public client (for external use)
51
+ */
52
+ getPublicClient(): ReturnType<typeof createPublicClient>;
53
+ /**
54
+ * Get the wallet client (for advanced use cases)
55
+ */
56
+ getWalletClient(): ReturnType<typeof createWalletClient>;
57
+ }
58
+ /**
59
+ * Create a LocalKeyBackend from configuration
60
+ */
61
+ export declare function createLocalKeyBackend(config: LocalKeyBackendConfig): Promise<LocalKeyBackend>;
62
+ //# sourceMappingURL=LocalKeyBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalKeyBackend.d.ts","sourceRoot":"","sources":["../../../src/wallet/providers/LocalKeyBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAElB,KAAK,IAAI,EACT,KAAK,OAAO,EAEb,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAGjB;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IACrE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAElB,MAAM,EAAE,qBAAqB;IA2BzC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAIpC;;;;OAIG;IACG,eAAe,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5D;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyBnE;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAUjC;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,eAAe,IAAI,UAAU,CAAC,OAAO,kBAAkB,CAAC;IAIxD;;OAEG;IACH,eAAe,IAAI,UAAU,CAAC,OAAO,kBAAkB,CAAC;CAGzD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAUnG"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Local Key Backend
3
+ *
4
+ * Wallet backend implementation using local private keys.
5
+ * Compatible with evm-wallet-skill's key storage.
6
+ *
7
+ * Uses viem for transaction signing and submission.
8
+ */
9
+ import { createPublicClient, createWalletClient, http, } from 'viem';
10
+ import { privateKeyToAccount } from 'viem/accounts';
11
+ import { getViemChain, getDefaultRpcUrl, resolveChainId } from './chainConfig';
12
+ /**
13
+ * Local private key wallet backend
14
+ *
15
+ * Signs transactions locally using the provided private key.
16
+ * This is the standard backend for self-custody wallets.
17
+ */
18
+ export class LocalKeyBackend {
19
+ type = 'localKey';
20
+ account;
21
+ walletClient;
22
+ _publicClient;
23
+ chainId;
24
+ chain;
25
+ constructor(config) {
26
+ // Resolve chain configuration
27
+ this.chainId = resolveChainId(config.chainId);
28
+ this.chain = getViemChain(this.chainId);
29
+ // Get RPC URL (custom or default)
30
+ const rpcUrl = config.rpcUrl || getDefaultRpcUrl(this.chainId);
31
+ // Create account from private key
32
+ this.account = privateKeyToAccount(config.privateKey);
33
+ // Create viem clients
34
+ this._publicClient = createPublicClient({
35
+ chain: this.chain,
36
+ transport: http(rpcUrl),
37
+ });
38
+ this.walletClient = createWalletClient({
39
+ account: this.account,
40
+ chain: this.chain,
41
+ transport: http(rpcUrl),
42
+ });
43
+ console.log(`[LocalKeyBackend] Initialized for chain ${this.chain.name} (${this.chainId})`);
44
+ console.log(`[LocalKeyBackend] Address: ${this.account.address}`);
45
+ }
46
+ /**
47
+ * Get the wallet address
48
+ */
49
+ async getAddress() {
50
+ return this.account.address;
51
+ }
52
+ /**
53
+ * Send a transaction
54
+ *
55
+ * Signs locally and submits via RPC.
56
+ */
57
+ async sendTransaction(tx) {
58
+ console.log(`[LocalKeyBackend] Sending transaction to ${tx.to}`);
59
+ // Build transaction params
60
+ const txParams = {
61
+ account: this.account,
62
+ chain: this.chain,
63
+ to: tx.to,
64
+ value: tx.value || 0n,
65
+ data: tx.data,
66
+ };
67
+ // Add optional gas parameters
68
+ if (tx.gasLimit)
69
+ txParams.gas = tx.gasLimit;
70
+ if (tx.gasPrice)
71
+ txParams.gasPrice = tx.gasPrice;
72
+ if (tx.maxFeePerGas)
73
+ txParams.maxFeePerGas = tx.maxFeePerGas;
74
+ if (tx.maxPriorityFeePerGas)
75
+ txParams.maxPriorityFeePerGas = tx.maxPriorityFeePerGas;
76
+ if (tx.nonce !== undefined)
77
+ txParams.nonce = tx.nonce;
78
+ const hash = await this.walletClient.sendTransaction(txParams);
79
+ console.log(`[LocalKeyBackend] Transaction sent: ${hash}`);
80
+ return hash;
81
+ }
82
+ /**
83
+ * Wait for transaction confirmation
84
+ */
85
+ async waitForTransaction(txHash) {
86
+ console.log(`[LocalKeyBackend] Waiting for transaction: ${txHash}`);
87
+ const receipt = await this._publicClient.waitForTransactionReceipt({
88
+ hash: txHash,
89
+ });
90
+ console.log(`[LocalKeyBackend] Transaction confirmed in block ${receipt.blockNumber}`);
91
+ return {
92
+ transactionHash: receipt.transactionHash,
93
+ blockNumber: receipt.blockNumber,
94
+ blockHash: receipt.blockHash,
95
+ from: receipt.from,
96
+ to: receipt.to,
97
+ gasUsed: receipt.gasUsed,
98
+ status: receipt.status === 'success' ? 'success' : 'reverted',
99
+ logs: receipt.logs.map((log) => ({
100
+ address: log.address,
101
+ topics: [...(log.topics || [])],
102
+ data: log.data,
103
+ })),
104
+ };
105
+ }
106
+ /**
107
+ * Check if backend is ready
108
+ *
109
+ * For local key backend, we verify RPC connectivity.
110
+ */
111
+ async isReady() {
112
+ try {
113
+ await this._publicClient.getChainId();
114
+ return true;
115
+ }
116
+ catch (error) {
117
+ console.error('[LocalKeyBackend] RPC connectivity check failed:', error);
118
+ return false;
119
+ }
120
+ }
121
+ /**
122
+ * Get the chain ID
123
+ */
124
+ getChainId() {
125
+ return this.chainId;
126
+ }
127
+ /**
128
+ * Get the public client (for external use)
129
+ */
130
+ getPublicClient() {
131
+ return this._publicClient;
132
+ }
133
+ /**
134
+ * Get the wallet client (for advanced use cases)
135
+ */
136
+ getWalletClient() {
137
+ return this.walletClient;
138
+ }
139
+ }
140
+ /**
141
+ * Create a LocalKeyBackend from configuration
142
+ */
143
+ export async function createLocalKeyBackend(config) {
144
+ const backend = new LocalKeyBackend(config);
145
+ // Verify connectivity
146
+ const ready = await backend.isReady();
147
+ if (!ready) {
148
+ console.warn('[LocalKeyBackend] Backend created but RPC connectivity check failed');
149
+ }
150
+ return backend;
151
+ }
152
+ //# sourceMappingURL=LocalKeyBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalKeyBackend.js","sourceRoot":"","sources":["../../../src/wallet/providers/LocalKeyBackend.ts"],"names":[],"mappings":"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"}