@axonfi/sdk 0.3.7 → 0.4.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 (97) hide show
  1. package/README.md +22 -0
  2. package/dist/abis/AxonRegistry.d.ts +294 -0
  3. package/dist/abis/AxonRegistry.d.ts.map +1 -0
  4. package/dist/abis/AxonRegistry.js +381 -0
  5. package/dist/abis/AxonRegistry.js.map +1 -0
  6. package/dist/abis/AxonVault.d.ts +1577 -0
  7. package/dist/abis/AxonVault.d.ts.map +1 -0
  8. package/dist/abis/AxonVault.js +2026 -0
  9. package/dist/abis/AxonVault.js.map +1 -0
  10. package/dist/abis/AxonVaultFactory.d.ts +207 -0
  11. package/dist/abis/AxonVaultFactory.d.ts.map +1 -0
  12. package/dist/abis/AxonVaultFactory.js +269 -0
  13. package/dist/abis/AxonVaultFactory.js.map +1 -0
  14. package/dist/amounts.d.ts +37 -0
  15. package/dist/amounts.d.ts.map +1 -0
  16. package/dist/amounts.js +72 -0
  17. package/dist/amounts.js.map +1 -0
  18. package/dist/amounts.spec.d.ts +2 -0
  19. package/dist/amounts.spec.d.ts.map +1 -0
  20. package/dist/amounts.spec.js +92 -0
  21. package/dist/amounts.spec.js.map +1 -0
  22. package/dist/client.d.ts +196 -0
  23. package/dist/client.d.ts.map +1 -0
  24. package/dist/client.js +621 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/client.spec.d.ts +2 -0
  27. package/dist/client.spec.d.ts.map +1 -0
  28. package/dist/client.spec.js +437 -0
  29. package/dist/client.spec.js.map +1 -0
  30. package/dist/constants.d.ts +110 -0
  31. package/dist/constants.d.ts.map +1 -0
  32. package/dist/constants.js +172 -0
  33. package/dist/constants.js.map +1 -0
  34. package/dist/constants.spec.d.ts +2 -0
  35. package/dist/constants.spec.d.ts.map +1 -0
  36. package/dist/constants.spec.js +95 -0
  37. package/dist/constants.spec.js.map +1 -0
  38. package/dist/eip3009.d.ts +45 -0
  39. package/dist/eip3009.d.ts.map +1 -0
  40. package/dist/eip3009.js +85 -0
  41. package/dist/eip3009.js.map +1 -0
  42. package/dist/index.d.ts +21 -3020
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +27 -3903
  45. package/dist/index.js.map +1 -1
  46. package/dist/keystore.d.ts +60 -0
  47. package/dist/keystore.d.ts.map +1 -0
  48. package/dist/keystore.js +182 -0
  49. package/dist/keystore.js.map +1 -0
  50. package/dist/keystore.spec.d.ts +2 -0
  51. package/dist/keystore.spec.d.ts.map +1 -0
  52. package/dist/keystore.spec.js +71 -0
  53. package/dist/keystore.spec.js.map +1 -0
  54. package/dist/permit2.d.ts +45 -0
  55. package/dist/permit2.d.ts.map +1 -0
  56. package/dist/permit2.js +81 -0
  57. package/dist/permit2.js.map +1 -0
  58. package/dist/signer.d.ts +35 -0
  59. package/dist/signer.d.ts.map +1 -0
  60. package/dist/signer.js +132 -0
  61. package/dist/signer.js.map +1 -0
  62. package/dist/signer.spec.d.ts +2 -0
  63. package/dist/signer.spec.d.ts.map +1 -0
  64. package/dist/signer.spec.js +94 -0
  65. package/dist/signer.spec.js.map +1 -0
  66. package/dist/tokens.d.ts +215 -0
  67. package/dist/tokens.d.ts.map +1 -0
  68. package/dist/tokens.js +247 -0
  69. package/dist/tokens.js.map +1 -0
  70. package/dist/types.d.ts +302 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +2 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/utils.d.ts +8 -0
  75. package/dist/utils.d.ts.map +1 -0
  76. package/dist/utils.js +29 -0
  77. package/dist/utils.js.map +1 -0
  78. package/dist/vault.d.ts +60 -0
  79. package/dist/vault.d.ts.map +1 -0
  80. package/dist/vault.js +267 -0
  81. package/dist/vault.js.map +1 -0
  82. package/dist/vault.spec.d.ts +2 -0
  83. package/dist/vault.spec.d.ts.map +1 -0
  84. package/dist/vault.spec.js +162 -0
  85. package/dist/vault.spec.js.map +1 -0
  86. package/dist/x402.d.ts +88 -0
  87. package/dist/x402.d.ts.map +1 -0
  88. package/dist/x402.js +124 -0
  89. package/dist/x402.js.map +1 -0
  90. package/dist/x402.spec.d.ts +2 -0
  91. package/dist/x402.spec.d.ts.map +1 -0
  92. package/dist/x402.spec.js +411 -0
  93. package/dist/x402.spec.js.map +1 -0
  94. package/package.json +1 -1
  95. package/dist/index.cjs +0 -3954
  96. package/dist/index.cjs.map +0 -1
  97. package/dist/index.d.cts +0 -3020
package/dist/client.js ADDED
@@ -0,0 +1,621 @@
1
+ import { signPayment, signExecuteIntent, signSwapIntent, encodeRef } from './signer.js';
2
+ import { createAxonWalletClient } from './vault.js';
3
+ import { DEFAULT_DEADLINE_SECONDS, RELAYER_API, USDC } from './constants.js';
4
+ import { resolveToken } from './tokens.js';
5
+ import { parseAmount } from './amounts.js';
6
+ import { generateUuid } from './utils.js';
7
+ import { keccak256 } from 'viem';
8
+ import { parsePaymentRequired, findMatchingOption, extractX402Metadata, formatPaymentSignature } from './x402.js';
9
+ import { signTransferWithAuthorization, randomNonce, USDC_EIP712_DOMAIN } from './eip3009.js';
10
+ import { signPermit2WitnessTransfer, randomPermit2Nonce, X402_PROXY_ADDRESS } from './permit2.js';
11
+ // ============================================================================
12
+ // AxonClient
13
+ // ============================================================================
14
+ /**
15
+ * Main entry point for bots interacting with Axon.
16
+ *
17
+ * Handles EIP-712 signing, relayer communication, and status polling.
18
+ * Bots never submit transactions directly — they sign intents and the relayer
19
+ * handles all on-chain execution.
20
+ *
21
+ * All chain reads (balances, bot status, vault info) go through the relayer
22
+ * API — bots never need an RPC endpoint.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * import { AxonClient, USDC } from '@axonfi/sdk'
27
+ *
28
+ * const client = new AxonClient({
29
+ * vaultAddress: '0x...',
30
+ * chainId: 84532, // Base Sepolia
31
+ * botPrivateKey: '0x...',
32
+ * })
33
+ *
34
+ * const result = await client.pay({
35
+ * to: '0x...recipient...',
36
+ * token: 'USDC',
37
+ * amount: 5, // 5 USDC — SDK handles decimals
38
+ * memo: 'API call #1234 — weather data',
39
+ * })
40
+ *
41
+ * console.log(result.status, result.txHash)
42
+ * ```
43
+ */
44
+ export class AxonClient {
45
+ constructor(config) {
46
+ // ============================================================================
47
+ // x402 — HTTP 402 Payment Required
48
+ // ============================================================================
49
+ /**
50
+ * x402 utilities for handling HTTP 402 Payment Required responses.
51
+ *
52
+ * The x402 flow:
53
+ * 1. Bot hits an API that returns HTTP 402 + PAYMENT-REQUIRED header
54
+ * 2. SDK parses the header, finds a matching payment option
55
+ * 3. SDK funds the bot's EOA from the vault (full Axon pipeline applies)
56
+ * 4. Bot signs an EIP-3009 or Permit2 authorization
57
+ * 5. SDK returns a PAYMENT-SIGNATURE header for the bot to retry with
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * const response = await fetch('https://api.example.com/data');
62
+ * if (response.status === 402) {
63
+ * const result = await client.x402.handlePaymentRequired(response.headers);
64
+ * const data = await fetch('https://api.example.com/data', {
65
+ * headers: { 'PAYMENT-SIGNATURE': result.paymentSignature },
66
+ * });
67
+ * }
68
+ * ```
69
+ */
70
+ this.x402 = {
71
+ /**
72
+ * Fund the bot's EOA from the vault for x402 settlement.
73
+ *
74
+ * This is a regular Axon payment (to = bot's own address) that goes through
75
+ * the full pipeline: policy engine, AI scan, human review if needed.
76
+ *
77
+ * @param amount - Amount in token base units
78
+ * @param token - Token address (defaults to USDC on this chain)
79
+ * @param metadata - Optional metadata for the payment record
80
+ */
81
+ fund: async (amount, token, metadata) => {
82
+ const tokenAddress = token ?? USDC[this.chainId];
83
+ if (!tokenAddress) {
84
+ throw new Error(`No default USDC address for chain ${this.chainId}`);
85
+ }
86
+ return this.pay({
87
+ to: this.botAddress,
88
+ token: tokenAddress,
89
+ amount,
90
+ x402Funding: true,
91
+ ...metadata,
92
+ });
93
+ },
94
+ /**
95
+ * Handle a full x402 flow: parse header, fund bot, sign authorization, return header.
96
+ *
97
+ * Supports both EIP-3009 (USDC) and Permit2 (any ERC-20) settlement.
98
+ * The bot's EOA is funded from the vault first (full Axon pipeline applies).
99
+ *
100
+ * @param headers - Response headers from the 402 response (must contain PAYMENT-REQUIRED)
101
+ * @param maxTimeoutMs - Maximum time to wait for pending_review resolution (default: 120s)
102
+ * @param pollIntervalMs - Polling interval for pending_review (default: 5s)
103
+ * @returns Payment signature header value + funding details
104
+ */
105
+ handlePaymentRequired: async (headers, maxTimeoutMs = 120000, pollIntervalMs = 5000) => {
106
+ // 1. Parse the PAYMENT-REQUIRED header
107
+ const headerValue = headers instanceof Headers
108
+ ? (headers.get('payment-required') ?? headers.get('PAYMENT-REQUIRED'))
109
+ : (headers['payment-required'] ?? headers['PAYMENT-REQUIRED']);
110
+ if (!headerValue) {
111
+ throw new Error('x402: no PAYMENT-REQUIRED header found');
112
+ }
113
+ const parsed = parsePaymentRequired(headerValue);
114
+ // 2. Find a matching payment option for this chain
115
+ const option = findMatchingOption(parsed.accepts, this.chainId);
116
+ if (!option) {
117
+ throw new Error(`x402: no payment option matches chain ${this.chainId}. ` +
118
+ `Available: ${parsed.accepts.map((a) => a.network).join(', ')}`);
119
+ }
120
+ // 3. Extract metadata for the payment record
121
+ const x402Meta = extractX402Metadata(parsed, option);
122
+ // 4. Fund the bot's EOA from the vault
123
+ const amount = BigInt(option.amount);
124
+ const tokenAddress = option.asset;
125
+ const payInput = {
126
+ to: this.botAddress,
127
+ token: tokenAddress,
128
+ amount,
129
+ x402Funding: true,
130
+ resourceUrl: x402Meta.resourceUrl,
131
+ metadata: x402Meta.metadata,
132
+ };
133
+ if (x402Meta.memo)
134
+ payInput.memo = x402Meta.memo;
135
+ if (x402Meta.recipientLabel)
136
+ payInput.recipientLabel = x402Meta.recipientLabel;
137
+ let fundingResult = await this.pay(payInput);
138
+ // 5. If pending_review, poll until resolved or timeout
139
+ if (fundingResult.status === 'pending_review') {
140
+ const deadline = Date.now() + maxTimeoutMs;
141
+ while (fundingResult.status === 'pending_review' && Date.now() < deadline) {
142
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
143
+ fundingResult = await this.poll(fundingResult.requestId);
144
+ }
145
+ if (fundingResult.status === 'pending_review') {
146
+ throw new Error(`x402: funding timed out after ${maxTimeoutMs}ms (still pending_review)`);
147
+ }
148
+ }
149
+ if (fundingResult.status === 'rejected') {
150
+ throw new Error(`x402: funding rejected — ${fundingResult.reason ?? 'unknown reason'}`);
151
+ }
152
+ // 6. Sign the appropriate authorization
153
+ const botPrivateKey = this.botPrivateKey;
154
+ const payTo = option.payTo;
155
+ const usdcAddress = USDC[this.chainId]?.toLowerCase();
156
+ const isUsdc = tokenAddress.toLowerCase() === usdcAddress;
157
+ let signaturePayload;
158
+ if (isUsdc && USDC_EIP712_DOMAIN[this.chainId]) {
159
+ // EIP-3009 path (USDC — gasless)
160
+ const nonce = randomNonce();
161
+ const validAfter = 0n;
162
+ const validBefore = BigInt(Math.floor(Date.now() / 1000) + 300); // 5 min
163
+ const sig = await signTransferWithAuthorization(botPrivateKey, this.chainId, {
164
+ from: this.botAddress,
165
+ to: payTo,
166
+ value: amount,
167
+ validAfter,
168
+ validBefore,
169
+ nonce,
170
+ });
171
+ signaturePayload = {
172
+ scheme: 'exact',
173
+ signature: sig,
174
+ authorization: {
175
+ from: this.botAddress,
176
+ to: payTo,
177
+ value: amount.toString(),
178
+ validAfter: validAfter.toString(),
179
+ validBefore: validBefore.toString(),
180
+ nonce,
181
+ },
182
+ };
183
+ }
184
+ else {
185
+ // Permit2 path (any ERC-20)
186
+ const nonce = randomPermit2Nonce();
187
+ const deadline = BigInt(Math.floor(Date.now() / 1000) + 300);
188
+ const sig = await signPermit2WitnessTransfer(botPrivateKey, this.chainId, {
189
+ token: tokenAddress,
190
+ amount,
191
+ spender: X402_PROXY_ADDRESS,
192
+ nonce,
193
+ deadline,
194
+ witnessTo: payTo,
195
+ witnessRequestedAmount: amount,
196
+ });
197
+ signaturePayload = {
198
+ scheme: 'permit2',
199
+ signature: sig,
200
+ permit: {
201
+ permitted: { token: tokenAddress, amount: amount.toString() },
202
+ spender: X402_PROXY_ADDRESS,
203
+ nonce: nonce.toString(),
204
+ deadline: deadline.toString(),
205
+ },
206
+ witness: {
207
+ to: payTo,
208
+ requestedAmount: amount.toString(),
209
+ },
210
+ };
211
+ }
212
+ // 7. Format the PAYMENT-SIGNATURE header
213
+ const paymentSignature = formatPaymentSignature(signaturePayload);
214
+ const handleResult = {
215
+ paymentSignature,
216
+ selectedOption: option,
217
+ fundingResult: {
218
+ requestId: fundingResult.requestId,
219
+ status: fundingResult.status,
220
+ },
221
+ };
222
+ if (fundingResult.txHash) {
223
+ handleResult.fundingResult.txHash = fundingResult.txHash;
224
+ }
225
+ return handleResult;
226
+ },
227
+ };
228
+ this.vaultAddress = config.vaultAddress;
229
+ this.chainId = config.chainId;
230
+ this.relayerUrl = config.relayerUrl ?? 'https://relay.axonfi.xyz';
231
+ if (!config.botPrivateKey) {
232
+ throw new Error('botPrivateKey is required in AxonClientConfig');
233
+ }
234
+ this.botPrivateKey = config.botPrivateKey;
235
+ this.walletClient = createAxonWalletClient(config.botPrivateKey, config.chainId);
236
+ }
237
+ // ============================================================================
238
+ // Bot address
239
+ // ============================================================================
240
+ /** Returns the bot's address derived from the configured private key. */
241
+ get botAddress() {
242
+ const account = this.walletClient.account;
243
+ if (!account)
244
+ throw new Error('No account on walletClient');
245
+ return account.address;
246
+ }
247
+ // ============================================================================
248
+ // pay()
249
+ // ============================================================================
250
+ /**
251
+ * Create, sign, and submit a payment intent to the Axon relayer.
252
+ *
253
+ * Three possible outcomes (all included in PaymentResult.status):
254
+ * - `"approved"`: fast path — txHash available immediately
255
+ * - `"pending_review"`: AI scan or human review in progress — poll for status
256
+ * - `"rejected"`: payment was rejected — reason field explains why
257
+ */
258
+ async pay(input) {
259
+ const intent = this._buildPaymentIntent(input);
260
+ const signature = await signPayment(this.walletClient, this.vaultAddress, this.chainId, intent);
261
+ return this._submitPayment(intent, signature, input);
262
+ }
263
+ // ============================================================================
264
+ // execute()
265
+ // ============================================================================
266
+ /**
267
+ * Sign and submit a DeFi protocol execution to the Axon relayer.
268
+ *
269
+ * The vault approves `token` to `protocol`, calls it with `callData`,
270
+ * then revokes the approval. Tokens stay in the vault or go to the protocol
271
+ * as specified by the calldata.
272
+ */
273
+ async execute(input) {
274
+ const intent = this._buildExecuteIntent(input);
275
+ const signature = await signExecuteIntent(this.walletClient, this.vaultAddress, this.chainId, intent);
276
+ return this._submitExecute(intent, signature, input);
277
+ }
278
+ // ============================================================================
279
+ // swap()
280
+ // ============================================================================
281
+ /**
282
+ * Sign and submit an in-vault token swap to the Axon relayer.
283
+ *
284
+ * Swaps tokens within the vault (no external recipient). Useful for
285
+ * rebalancing vault holdings.
286
+ */
287
+ async swap(input) {
288
+ const intent = this._buildSwapIntent(input);
289
+ const signature = await signSwapIntent(this.walletClient, this.vaultAddress, this.chainId, intent);
290
+ return this._submitSwap(intent, signature, input);
291
+ }
292
+ // ============================================================================
293
+ // getBalance() — via relayer
294
+ // ============================================================================
295
+ /** Read the vault's ERC-20 balance for a given token (via relayer). */
296
+ async getBalance(token) {
297
+ const path = RELAYER_API.vaultBalance(this.vaultAddress, token, this.chainId);
298
+ const data = await this._get(path);
299
+ return BigInt(data.balance);
300
+ }
301
+ // ============================================================================
302
+ // getBalances() — via relayer
303
+ // ============================================================================
304
+ /**
305
+ * Read the vault's ERC-20 balances for multiple tokens in a single call (via relayer).
306
+ * Returns a record mapping token address → balance.
307
+ */
308
+ async getBalances(tokens) {
309
+ const path = RELAYER_API.vaultBalances(this.vaultAddress, this.chainId);
310
+ const url = `${this.relayerUrl}${path}?chainId=${this.chainId}&tokens=${tokens.join(',')}`;
311
+ const response = await fetch(url, {
312
+ method: 'GET',
313
+ headers: { 'Content-Type': 'application/json' },
314
+ });
315
+ if (!response.ok) {
316
+ const body = await response.text();
317
+ throw new Error(`Relayer request failed [${response.status}]: ${body}`);
318
+ }
319
+ const data = (await response.json());
320
+ const result = {};
321
+ for (const [addr, val] of Object.entries(data.balances)) {
322
+ result[addr] = BigInt(val);
323
+ }
324
+ return result;
325
+ }
326
+ // ============================================================================
327
+ // isActive() — via relayer
328
+ // ============================================================================
329
+ /** Returns whether this bot is registered and active in the vault (via relayer). */
330
+ async isActive() {
331
+ const path = RELAYER_API.botStatus(this.vaultAddress, this.botAddress, this.chainId);
332
+ const data = await this._get(path);
333
+ return data.isActive;
334
+ }
335
+ // ============================================================================
336
+ // isPaused() — via relayer
337
+ // ============================================================================
338
+ /** Returns whether the vault is currently paused (via relayer). */
339
+ async isPaused() {
340
+ const path = RELAYER_API.vaultInfo(this.vaultAddress, this.chainId);
341
+ const data = await this._get(path);
342
+ return data.paused;
343
+ }
344
+ // ============================================================================
345
+ // getVaultInfo() — via relayer
346
+ // ============================================================================
347
+ /** Returns high-level vault info (owner, operator, paused, version) via relayer. */
348
+ async getVaultInfo() {
349
+ const path = RELAYER_API.vaultInfo(this.vaultAddress, this.chainId);
350
+ return this._get(path);
351
+ }
352
+ // ============================================================================
353
+ // canPayTo() — via relayer
354
+ // ============================================================================
355
+ /**
356
+ * Check whether this bot can pay to a given destination address (via relayer).
357
+ * Checks blacklist → global whitelist → bot whitelist, matching on-chain logic.
358
+ */
359
+ async canPayTo(destination) {
360
+ const path = RELAYER_API.destinationCheck(this.vaultAddress, this.botAddress, destination, this.chainId);
361
+ return this._get(path);
362
+ }
363
+ // ============================================================================
364
+ // isProtocolApproved() — via relayer
365
+ // ============================================================================
366
+ /** Returns whether a protocol address is approved for executeProtocol() calls (via relayer). */
367
+ async isProtocolApproved(protocol) {
368
+ const path = RELAYER_API.protocolCheck(this.vaultAddress, protocol, this.chainId);
369
+ const data = await this._get(path);
370
+ return data.approved;
371
+ }
372
+ // ============================================================================
373
+ // getRebalanceTokens() — via relayer
374
+ // ============================================================================
375
+ /**
376
+ * Returns the effective rebalance token whitelist for this vault.
377
+ *
378
+ * If the owner set tokens on-chain, those override entirely.
379
+ * If no on-chain whitelist, returns relayer defaults (USDC, WETH, USDT).
380
+ * Use this before calling swap() to check which output tokens are allowed.
381
+ */
382
+ async getRebalanceTokens() {
383
+ const path = RELAYER_API.rebalanceTokens(this.vaultAddress, this.chainId);
384
+ return this._get(path);
385
+ }
386
+ // ============================================================================
387
+ // isRebalanceTokenAllowed() — via relayer
388
+ // ============================================================================
389
+ /** Check if a specific token is allowed for rebalancing (executeSwap output) on this vault. */
390
+ async isRebalanceTokenAllowed(token) {
391
+ const path = RELAYER_API.rebalanceTokenCheck(this.vaultAddress, token, this.chainId);
392
+ return this._get(path);
393
+ }
394
+ // ============================================================================
395
+ // TOS (Terms of Service)
396
+ // ============================================================================
397
+ /** Check if a wallet has accepted the current TOS version. */
398
+ async getTosStatus(wallet) {
399
+ return this._get(RELAYER_API.tosStatus(wallet));
400
+ }
401
+ /**
402
+ * Sign and submit TOS acceptance. Uses the owner's wallet (not the bot key).
403
+ *
404
+ * @param signer - Object with a `signMessage` method (e.g. a viem WalletClient
405
+ * or ethers Signer). This should be the vault owner's wallet, not the bot key.
406
+ * @param wallet - The owner's wallet address (must match the signer).
407
+ */
408
+ async acceptTos(signer, wallet) {
409
+ // 1. Get current TOS version from relayer
410
+ const { tosVersion } = await this.getTosStatus(wallet);
411
+ // 2. Construct and sign the acceptance message
412
+ const timestamp = Math.floor(Date.now() / 1000);
413
+ const message = `I accept the Axon Terms of Service (${tosVersion}).\nWallet: ${wallet}\nTimestamp: ${timestamp}`;
414
+ const signature = await signer.signMessage({ message });
415
+ // 3. Submit to relayer
416
+ const url = `${this.relayerUrl}${RELAYER_API.TOS_ACCEPT}`;
417
+ const response = await fetch(url, {
418
+ method: 'POST',
419
+ headers: { 'Content-Type': 'application/json' },
420
+ body: JSON.stringify({ wallet, signature, tosVersion, timestamp }),
421
+ });
422
+ if (!response.ok) {
423
+ const body = await response.text();
424
+ throw new Error(`TOS acceptance failed [${response.status}]: ${body}`);
425
+ }
426
+ return response.json();
427
+ }
428
+ // ============================================================================
429
+ // poll() / pollExecute() / pollSwap()
430
+ // ============================================================================
431
+ /**
432
+ * Poll the relayer for the status of an async payment.
433
+ *
434
+ * Use this when pay() returns `status: "pending_review"`. Poll until
435
+ * status is `"approved"` or `"rejected"`.
436
+ *
437
+ * Recommended polling interval: 5–10 seconds.
438
+ */
439
+ async poll(requestId) {
440
+ return this._get(RELAYER_API.payment(requestId));
441
+ }
442
+ /** Poll the relayer for the status of an async protocol execution. */
443
+ async pollExecute(requestId) {
444
+ return this._get(RELAYER_API.execute(requestId));
445
+ }
446
+ /** Poll the relayer for the status of an async swap. */
447
+ async pollSwap(requestId) {
448
+ return this._get(RELAYER_API.swap(requestId));
449
+ }
450
+ // ============================================================================
451
+ // signPayment() — low-level access
452
+ // ============================================================================
453
+ /**
454
+ * Sign a PaymentIntent directly without submitting to the relayer.
455
+ *
456
+ * Use this if you want to build the intent yourself and pass the signature
457
+ * to another system (e.g. a custom relayer integration).
458
+ */
459
+ async signPayment(intent) {
460
+ return signPayment(this.walletClient, this.vaultAddress, this.chainId, intent);
461
+ }
462
+ // ============================================================================
463
+ // Internal helpers
464
+ // ============================================================================
465
+ async _get(path) {
466
+ const url = `${this.relayerUrl}${path}`;
467
+ const response = await fetch(url, {
468
+ method: 'GET',
469
+ headers: { 'Content-Type': 'application/json' },
470
+ });
471
+ if (!response.ok) {
472
+ const body = await response.text();
473
+ throw new Error(`Relayer request failed [${response.status}]: ${body}`);
474
+ }
475
+ return response.json();
476
+ }
477
+ _defaultDeadline() {
478
+ return BigInt(Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE_SECONDS);
479
+ }
480
+ _resolveRef(memo, ref) {
481
+ if (ref)
482
+ return ref;
483
+ if (memo)
484
+ return encodeRef(memo);
485
+ return '0x0000000000000000000000000000000000000000000000000000000000000000';
486
+ }
487
+ _buildPaymentIntent(input) {
488
+ if (input.to === '0x0000000000000000000000000000000000000000') {
489
+ throw new Error('Payment recipient cannot be the zero address');
490
+ }
491
+ return {
492
+ bot: this.botAddress,
493
+ to: input.to,
494
+ token: resolveToken(input.token, this.chainId),
495
+ amount: parseAmount(input.amount, input.token, this.chainId),
496
+ deadline: input.deadline ?? this._defaultDeadline(),
497
+ ref: this._resolveRef(input.memo, input.ref),
498
+ };
499
+ }
500
+ _buildExecuteIntent(input) {
501
+ return {
502
+ bot: this.botAddress,
503
+ protocol: input.protocol,
504
+ calldataHash: keccak256(input.callData),
505
+ token: resolveToken(input.token, this.chainId),
506
+ amount: parseAmount(input.amount, input.token, this.chainId),
507
+ deadline: input.deadline ?? this._defaultDeadline(),
508
+ ref: this._resolveRef(input.memo, input.ref),
509
+ };
510
+ }
511
+ _buildSwapIntent(input) {
512
+ return {
513
+ bot: this.botAddress,
514
+ toToken: resolveToken(input.toToken, this.chainId),
515
+ minToAmount: parseAmount(input.minToAmount, input.toToken, this.chainId),
516
+ deadline: input.deadline ?? this._defaultDeadline(),
517
+ ref: this._resolveRef(input.memo, input.ref),
518
+ };
519
+ }
520
+ async _submitPayment(intent, signature, input) {
521
+ const idempotencyKey = input.idempotencyKey ?? generateUuid();
522
+ const body = {
523
+ // Routing
524
+ chainId: this.chainId,
525
+ vaultAddress: this.vaultAddress,
526
+ // Flat intent fields (matches relayer DTO)
527
+ bot: intent.bot,
528
+ to: intent.to,
529
+ token: intent.token,
530
+ amount: intent.amount.toString(),
531
+ deadline: intent.deadline.toString(),
532
+ ref: intent.ref,
533
+ signature,
534
+ // Off-chain metadata
535
+ idempotencyKey,
536
+ ...(input.memo !== undefined && { memo: input.memo }),
537
+ ...(input.resourceUrl !== undefined && { resourceUrl: input.resourceUrl }),
538
+ ...(input.invoiceId !== undefined && { invoiceId: input.invoiceId }),
539
+ ...(input.orderId !== undefined && { orderId: input.orderId }),
540
+ ...(input.recipientLabel !== undefined && { recipientLabel: input.recipientLabel }),
541
+ ...(input.metadata !== undefined && { metadata: input.metadata }),
542
+ ...(input.x402Funding !== undefined && { x402Funding: input.x402Funding }),
543
+ };
544
+ return this._post(RELAYER_API.PAYMENTS, idempotencyKey, body);
545
+ }
546
+ async _submitExecute(intent, signature, input) {
547
+ const idempotencyKey = input.idempotencyKey ?? generateUuid();
548
+ // Resolve optional pre-swap fields
549
+ const fromToken = input.fromToken !== undefined ? resolveToken(input.fromToken, this.chainId) : undefined;
550
+ const maxFromAmount = input.maxFromAmount !== undefined
551
+ ? parseAmount(input.maxFromAmount, input.fromToken ?? input.token, this.chainId)
552
+ : undefined;
553
+ const body = {
554
+ chainId: this.chainId,
555
+ vaultAddress: this.vaultAddress,
556
+ // Flat intent fields
557
+ bot: intent.bot,
558
+ protocol: intent.protocol,
559
+ calldataHash: intent.calldataHash,
560
+ token: intent.token,
561
+ amount: intent.amount.toString(),
562
+ deadline: intent.deadline.toString(),
563
+ ref: intent.ref,
564
+ signature,
565
+ // Protocol calldata
566
+ callData: input.callData,
567
+ // Optional pre-swap
568
+ ...(fromToken !== undefined && { fromToken }),
569
+ ...(maxFromAmount !== undefined && { maxFromAmount: maxFromAmount.toString() }),
570
+ // Off-chain metadata
571
+ idempotencyKey,
572
+ ...(input.memo !== undefined && { memo: input.memo }),
573
+ ...(input.protocolName !== undefined && { protocolName: input.protocolName }),
574
+ ...(input.metadata !== undefined && { metadata: input.metadata }),
575
+ };
576
+ return this._post(RELAYER_API.EXECUTE, idempotencyKey, body);
577
+ }
578
+ async _submitSwap(intent, signature, input) {
579
+ const idempotencyKey = input.idempotencyKey ?? generateUuid();
580
+ // Resolve optional source token fields
581
+ const fromToken = input.fromToken !== undefined ? resolveToken(input.fromToken, this.chainId) : undefined;
582
+ const maxFromAmount = input.maxFromAmount !== undefined
583
+ ? parseAmount(input.maxFromAmount, input.fromToken ?? input.toToken, this.chainId)
584
+ : undefined;
585
+ const body = {
586
+ chainId: this.chainId,
587
+ vaultAddress: this.vaultAddress,
588
+ // Flat intent fields
589
+ bot: intent.bot,
590
+ toToken: intent.toToken,
591
+ minToAmount: intent.minToAmount.toString(),
592
+ deadline: intent.deadline.toString(),
593
+ ref: intent.ref,
594
+ signature,
595
+ // Optional source token
596
+ ...(fromToken !== undefined && { fromToken }),
597
+ ...(maxFromAmount !== undefined && { maxFromAmount: maxFromAmount.toString() }),
598
+ // Off-chain metadata
599
+ idempotencyKey,
600
+ ...(input.memo !== undefined && { memo: input.memo }),
601
+ };
602
+ return this._post(RELAYER_API.SWAP, idempotencyKey, body);
603
+ }
604
+ async _post(path, idempotencyKey, body) {
605
+ const url = `${this.relayerUrl}${path}`;
606
+ const response = await fetch(url, {
607
+ method: 'POST',
608
+ headers: {
609
+ 'Content-Type': 'application/json',
610
+ 'Idempotency-Key': idempotencyKey,
611
+ },
612
+ body: JSON.stringify(body),
613
+ });
614
+ if (!response.ok) {
615
+ const responseBody = await response.text();
616
+ throw new Error(`Relayer request failed [${response.status}]: ${responseBody}`);
617
+ }
618
+ return response.json();
619
+ }
620
+ }
621
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.spec.d.ts","sourceRoot":"","sources":["../src/client.spec.ts"],"names":[],"mappings":""}