@dynamic-labs-sdk/evm 0.26.10 → 0.27.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 (103) hide show
  1. package/dist/{addEIP6963Extension-BGiaYPZ8.esm.js → addEIP6963Extension-CsLDKxnC.esm.js} +3 -3
  2. package/dist/{addEIP6963Extension-BGiaYPZ8.esm.js.map → addEIP6963Extension-CsLDKxnC.esm.js.map} +1 -1
  3. package/dist/{addEIP6963Extension-XLk4ZCzv.cjs → addEIP6963Extension-SnDMOqHg.cjs} +3 -3
  4. package/dist/{addEIP6963Extension-XLk4ZCzv.cjs.map → addEIP6963Extension-SnDMOqHg.cjs.map} +1 -1
  5. package/dist/{addWaasEvmExtension-ByAFCvSO.cjs → addWaasEvmExtension-BdR7f-_3.cjs} +3 -3
  6. package/dist/{addWaasEvmExtension-ByAFCvSO.cjs.map → addWaasEvmExtension-BdR7f-_3.cjs.map} +1 -1
  7. package/dist/{addWaasEvmExtension-Dcqn8tuk.esm.js → addWaasEvmExtension-DkgyJUn7.esm.js} +3 -3
  8. package/dist/{addWaasEvmExtension-Dcqn8tuk.esm.js.map → addWaasEvmExtension-DkgyJUn7.esm.js.map} +1 -1
  9. package/dist/baseAccount.cjs +3 -3
  10. package/dist/baseAccount.esm.js +3 -3
  11. package/dist/baseAccount.native.esm.js +1 -1
  12. package/dist/{createWalletClientForWalletAccount-CdPqgZ9Z.cjs → createWalletClientForWalletAccount-CIg9pNK1.cjs} +2 -2
  13. package/dist/{createWalletClientForWalletAccount-CdPqgZ9Z.cjs.map → createWalletClientForWalletAccount-CIg9pNK1.cjs.map} +1 -1
  14. package/dist/{createWalletClientForWalletAccount-v2L0zaTG.esm.js → createWalletClientForWalletAccount-CrmwB-k7.esm.js} +2 -2
  15. package/dist/{createWalletClientForWalletAccount-v2L0zaTG.esm.js.map → createWalletClientForWalletAccount-CrmwB-k7.esm.js.map} +1 -1
  16. package/dist/{createWalletProviderFromEIP1193Provider-C4fMHK3w.esm.js → createWalletProviderFromEIP1193Provider-DIyEkaMG.esm.js} +2 -2
  17. package/dist/{createWalletProviderFromEIP1193Provider-C4fMHK3w.esm.js.map → createWalletProviderFromEIP1193Provider-DIyEkaMG.esm.js.map} +1 -1
  18. package/dist/{createWalletProviderFromEIP1193Provider-bineK7Q2.cjs → createWalletProviderFromEIP1193Provider-V7mbAWY6.cjs} +2 -2
  19. package/dist/{createWalletProviderFromEIP1193Provider-bineK7Q2.cjs.map → createWalletProviderFromEIP1193Provider-V7mbAWY6.cjs.map} +1 -1
  20. package/dist/eip6963.cjs +4 -4
  21. package/dist/eip6963.esm.js +4 -4
  22. package/dist/eip6963.native.esm.js +1 -1
  23. package/dist/errors/EvmGasSponsorshipNotEnabledError/EvmGasSponsorshipNotEnabledError.d.ts +5 -0
  24. package/dist/errors/EvmGasSponsorshipNotEnabledError/EvmGasSponsorshipNotEnabledError.d.ts.map +1 -0
  25. package/dist/errors/EvmGasSponsorshipNotEnabledError/index.d.ts +2 -0
  26. package/dist/errors/EvmGasSponsorshipNotEnabledError/index.d.ts.map +1 -0
  27. package/dist/errors/SponsorTransactionError/SponsorTransactionError.d.ts +5 -0
  28. package/dist/errors/SponsorTransactionError/SponsorTransactionError.d.ts.map +1 -0
  29. package/dist/errors/SponsorTransactionError/index.d.ts +2 -0
  30. package/dist/errors/SponsorTransactionError/index.d.ts.map +1 -0
  31. package/dist/{evmTransferAmount-tTUJbYcr.esm.js → evmTransferAmount-DkQzNUHB.esm.js} +2 -2
  32. package/dist/{evmTransferAmount-tTUJbYcr.esm.js.map → evmTransferAmount-DkQzNUHB.esm.js.map} +1 -1
  33. package/dist/{evmTransferAmount-C7eeBuhc.cjs → evmTransferAmount-Dqw2C8RA.cjs} +2 -2
  34. package/dist/{evmTransferAmount-C7eeBuhc.cjs.map → evmTransferAmount-Dqw2C8RA.cjs.map} +1 -1
  35. package/dist/exports/index.d.ts +9 -0
  36. package/dist/exports/index.d.ts.map +1 -1
  37. package/dist/gasless/constants.d.ts +55 -0
  38. package/dist/gasless/constants.d.ts.map +1 -0
  39. package/dist/gasless/gasless.types.d.ts +61 -0
  40. package/dist/gasless/gasless.types.d.ts.map +1 -0
  41. package/dist/gasless/generateIntentNonce/generateIntentNonce.d.ts +20 -0
  42. package/dist/gasless/generateIntentNonce/generateIntentNonce.d.ts.map +1 -0
  43. package/dist/gasless/generateIntentNonce/index.d.ts +2 -0
  44. package/dist/gasless/generateIntentNonce/index.d.ts.map +1 -0
  45. package/dist/gasless/generateRandomNonce/generateRandomNonce.d.ts +8 -0
  46. package/dist/gasless/generateRandomNonce/generateRandomNonce.d.ts.map +1 -0
  47. package/dist/gasless/generateRandomNonce/index.d.ts +2 -0
  48. package/dist/gasless/generateRandomNonce/index.d.ts.map +1 -0
  49. package/dist/gasless/getEVMSponsoredTransactionStatus/getEVMSponsoredTransactionStatus.d.ts +22 -0
  50. package/dist/gasless/getEVMSponsoredTransactionStatus/getEVMSponsoredTransactionStatus.d.ts.map +1 -0
  51. package/dist/gasless/getEVMSponsoredTransactionStatus/index.d.ts +2 -0
  52. package/dist/gasless/getEVMSponsoredTransactionStatus/index.d.ts.map +1 -0
  53. package/dist/gasless/isEvmGasSponsorshipEnabled/index.d.ts +2 -0
  54. package/dist/gasless/isEvmGasSponsorshipEnabled/index.d.ts.map +1 -0
  55. package/dist/gasless/isEvmGasSponsorshipEnabled/isEvmGasSponsorshipEnabled.d.ts +9 -0
  56. package/dist/gasless/isEvmGasSponsorshipEnabled/isEvmGasSponsorshipEnabled.d.ts.map +1 -0
  57. package/dist/gasless/relaySponsoredTransaction/index.d.ts +2 -0
  58. package/dist/gasless/relaySponsoredTransaction/index.d.ts.map +1 -0
  59. package/dist/gasless/relaySponsoredTransaction/relaySponsoredTransaction.d.ts +40 -0
  60. package/dist/gasless/relaySponsoredTransaction/relaySponsoredTransaction.d.ts.map +1 -0
  61. package/dist/gasless/resolveChainId/index.d.ts +2 -0
  62. package/dist/gasless/resolveChainId/index.d.ts.map +1 -0
  63. package/dist/gasless/resolveChainId/resolveChainId.d.ts +18 -0
  64. package/dist/gasless/resolveChainId/resolveChainId.d.ts.map +1 -0
  65. package/dist/gasless/sendSponsoredTransaction/index.d.ts +2 -0
  66. package/dist/gasless/sendSponsoredTransaction/index.d.ts.map +1 -0
  67. package/dist/gasless/sendSponsoredTransaction/sendSponsoredTransaction.d.ts +38 -0
  68. package/dist/gasless/sendSponsoredTransaction/sendSponsoredTransaction.d.ts.map +1 -0
  69. package/dist/gasless/signSponsoredTransaction/index.d.ts +2 -0
  70. package/dist/gasless/signSponsoredTransaction/index.d.ts.map +1 -0
  71. package/dist/gasless/signSponsoredTransaction/signSponsoredTransaction.d.ts +31 -0
  72. package/dist/gasless/signSponsoredTransaction/signSponsoredTransaction.d.ts.map +1 -0
  73. package/dist/gasless/toSerializedAuthorization/index.d.ts +2 -0
  74. package/dist/gasless/toSerializedAuthorization/index.d.ts.map +1 -0
  75. package/dist/gasless/toSerializedAuthorization/toSerializedAuthorization.d.ts +10 -0
  76. package/dist/gasless/toSerializedAuthorization/toSerializedAuthorization.d.ts.map +1 -0
  77. package/dist/gasless/waitForSponsoredTransaction/index.d.ts +2 -0
  78. package/dist/gasless/waitForSponsoredTransaction/index.d.ts.map +1 -0
  79. package/dist/gasless/waitForSponsoredTransaction/waitForSponsoredTransaction.d.ts +24 -0
  80. package/dist/gasless/waitForSponsoredTransaction/waitForSponsoredTransaction.d.ts.map +1 -0
  81. package/dist/index.cjs +387 -5
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.esm.js +382 -8
  84. package/dist/index.esm.js.map +1 -1
  85. package/dist/index.native.esm.js +379 -5
  86. package/dist/index.native.esm.js.map +1 -1
  87. package/dist/{package-CFCOfOsa.native.esm.js → package-DylwzO_9.native.esm.js} +2 -2
  88. package/dist/package-DylwzO_9.native.esm.js.map +1 -0
  89. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  90. package/dist/viem.cjs +1 -1
  91. package/dist/viem.esm.js +1 -1
  92. package/dist/viem.native.esm.js +1 -1
  93. package/dist/waas.cjs +3 -3
  94. package/dist/waas.esm.js +3 -3
  95. package/dist/waas.native.esm.js +1 -1
  96. package/dist/walletConnect.cjs +2 -2
  97. package/dist/walletConnect.esm.js +2 -2
  98. package/dist/walletConnect.native.esm.js +1 -1
  99. package/dist/windowInjected.cjs +3 -3
  100. package/dist/windowInjected.esm.js +3 -3
  101. package/dist/windowInjected.native.esm.js +1 -1
  102. package/package.json +5 -5
  103. package/dist/package-CFCOfOsa.native.esm.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
- const require_createWalletClientForWalletAccount = require('./createWalletClientForWalletAccount-CdPqgZ9Z.cjs');
2
- const require_evmTransferAmount = require('./evmTransferAmount-C7eeBuhc.cjs');
3
- require('./createWalletProviderFromEIP1193Provider-bineK7Q2.cjs');
4
- const require_addEIP6963Extension = require('./addEIP6963Extension-XLk4ZCzv.cjs');
5
- const require_addWaasEvmExtension = require('./addWaasEvmExtension-ByAFCvSO.cjs');
1
+ const require_createWalletClientForWalletAccount = require('./createWalletClientForWalletAccount-CIg9pNK1.cjs');
2
+ const require_evmTransferAmount = require('./evmTransferAmount-Dqw2C8RA.cjs');
3
+ require('./createWalletProviderFromEIP1193Provider-V7mbAWY6.cjs');
4
+ const require_addEIP6963Extension = require('./addEIP6963Extension-SnDMOqHg.cjs');
5
+ const require_addWaasEvmExtension = require('./addWaasEvmExtension-BdR7f-_3.cjs');
6
6
  let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
7
7
  let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
8
8
  let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
@@ -24,6 +24,84 @@ const addEvmExtension = (client = (0, _dynamic_labs_sdk_client_core.getDefaultCl
24
24
  require_addWaasEvmExtension.addWaasEvmExtension(client);
25
25
  };
26
26
 
27
+ //#endregion
28
+ //#region src/errors/EvmGasSponsorshipNotEnabledError/EvmGasSponsorshipNotEnabledError.ts
29
+ var EvmGasSponsorshipNotEnabledError = class extends _dynamic_labs_sdk_client.BaseError {
30
+ constructor() {
31
+ super({
32
+ cause: null,
33
+ code: "evm_gas_sponsorship_not_enabled_error",
34
+ docsUrl: null,
35
+ name: "EvmGasSponsorshipNotEnabledError",
36
+ shortMessage: "EVM gas sponsorship is not enabled for this project"
37
+ });
38
+ }
39
+ };
40
+
41
+ //#endregion
42
+ //#region src/errors/SponsorTransactionError/SponsorTransactionError.ts
43
+ var SponsorTransactionError = class extends _dynamic_labs_sdk_client.BaseError {
44
+ constructor(cause, details) {
45
+ super({
46
+ cause: cause ?? null,
47
+ code: "sponsor_transaction_error",
48
+ details,
49
+ docsUrl: null,
50
+ name: "SponsorTransactionError",
51
+ shortMessage: "Failed to sponsor EVM transaction"
52
+ });
53
+ }
54
+ };
55
+
56
+ //#endregion
57
+ //#region src/gasless/getEVMSponsoredTransactionStatus/getEVMSponsoredTransactionStatus.ts
58
+ /**
59
+ * Fetches the current relay state for a sponsored EVM transaction.
60
+ *
61
+ * Returns the lifecycle status, the on-chain transaction hash (when the relay
62
+ * has broadcast it), and any terminal-failure error message. Use this as the
63
+ * building block for custom polling flows; for the common "wait until done"
64
+ * case prefer `waitForSponsoredTransaction`.
65
+ *
66
+ * @param params.requestId - The request ID returned when the transaction was relayed.
67
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
68
+ * @returns The current status, optional transaction hash, and optional error message.
69
+ * @throws {SponsorTransactionError} If the API call fails.
70
+ * @not-instrumented
71
+ */
72
+ const getEVMSponsoredTransactionStatus = async ({ requestId }, client = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
73
+ const core = (0, _dynamic_labs_sdk_client_core.getCore)(client);
74
+ const apiClient = (0, _dynamic_labs_sdk_client_core.createApiClient)({}, client);
75
+ let data;
76
+ try {
77
+ data = await apiClient.getEVMSponsoredTransactionStatus({
78
+ environmentId: core.environmentId,
79
+ requestId
80
+ });
81
+ } catch (error) {
82
+ throw new SponsorTransactionError(error instanceof Error ? error : null);
83
+ }
84
+ return {
85
+ errorMessage: data.errorMessage,
86
+ status: data.status,
87
+ transactionHash: data.transactionHash
88
+ };
89
+ };
90
+
91
+ //#endregion
92
+ //#region src/gasless/isEvmGasSponsorshipEnabled/isEvmGasSponsorshipEnabled.ts
93
+ /**
94
+ * Checks if EVM gas sponsorship is enabled for the current project.
95
+ *
96
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
97
+ * @returns True if EVM gas sponsorship is enabled, false otherwise.
98
+ * @not-instrumented
99
+ */
100
+ const isEvmGasSponsorshipEnabled = (client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
101
+ (0, _dynamic_labs_sdk_client_core.assertDefined)(client.projectSettings, "Project settings are not defined");
102
+ return client.projectSettings.sdk.embeddedWallets?.evmGasSponsorshipEnabled ?? false;
103
+ };
104
+
27
105
  //#endregion
28
106
  //#region src/isEvmNetworkProvider/isEvmNetworkProvider.ts
29
107
  /**
@@ -158,15 +236,319 @@ const simulateEvmTransaction = async ({ walletAccount, transaction, includeFees
158
236
  }
159
237
  };
160
238
 
239
+ //#endregion
240
+ //#region src/gasless/constants.ts
241
+ /** The Fireblocks Universal Gasless Delegate (UGD) contract address used for EIP-7702 delegation. */
242
+ const DELEGATION_CONTRACT_ADDRESS = "0x0000Fb7702036ff9f76044a501ac1aA74cbab16b";
243
+ /** The ERC-7821 Forwarder contract address that relays calls to the delegated wallet. */
244
+ const RELAYER_CONTRACT_ADDRESS = "0x0fb50CBAd1B82005628bc8aF0f7A6D81Bf74cDCe";
245
+ /** Default sponsored transaction validity duration in seconds (10 minutes). */
246
+ const DEFAULT_VALID_FOR_SECONDS = 600;
247
+ /** ERC-7579 batch call with opData and auth mode identifier. */
248
+ const BATCH_CALL_OPDATA_AUTH_MODE = "0x0100000000007821000100000000000000000000000000000000000000000000";
249
+ /** EIP-712 typed data types for UGD AuthorizedExecutions signing. */
250
+ const AUTHORIZED_EXECUTIONS_TYPES = {
251
+ AuthorizedExecutions: [
252
+ {
253
+ name: "calls",
254
+ type: "Execution[]"
255
+ },
256
+ {
257
+ name: "deadline",
258
+ type: "uint256"
259
+ },
260
+ {
261
+ name: "mode",
262
+ type: "bytes32"
263
+ },
264
+ {
265
+ name: "nonce",
266
+ type: "uint256"
267
+ },
268
+ {
269
+ name: "relayer",
270
+ type: "address"
271
+ }
272
+ ],
273
+ Execution: [
274
+ {
275
+ name: "target",
276
+ type: "address"
277
+ },
278
+ {
279
+ name: "value",
280
+ type: "uint256"
281
+ },
282
+ {
283
+ name: "data",
284
+ type: "bytes"
285
+ }
286
+ ]
287
+ };
288
+ /** Minimal ABI for the UGD contract's nonce validation function. */
289
+ const UGD_ABI = [{
290
+ inputs: [{
291
+ name: "nonce",
292
+ type: "uint256"
293
+ }],
294
+ name: "isNonceUsed",
295
+ outputs: [{
296
+ name: "",
297
+ type: "bool"
298
+ }],
299
+ stateMutability: "view",
300
+ type: "function"
301
+ }];
302
+
303
+ //#endregion
304
+ //#region src/gasless/generateRandomNonce/generateRandomNonce.ts
305
+ /**
306
+ * Generates a cryptographically random 256-bit nonce.
307
+ *
308
+ * @returns A random bigint nonce.
309
+ * @not-instrumented
310
+ */
311
+ const generateRandomNonce = () => {
312
+ const bytes = new Uint8Array(32);
313
+ crypto.getRandomValues(bytes);
314
+ return bytes.reduce((acc, byte) => acc << 8n | BigInt(byte), 0n);
315
+ };
316
+
317
+ //#endregion
318
+ //#region src/gasless/generateIntentNonce/generateIntentNonce.ts
319
+ /**
320
+ * Generates a random bitmap nonce for UGD AuthorizedExecutions signing.
321
+ *
322
+ * Uses crypto.getRandomValues() for 256-bit randomness. Validates against
323
+ * the on-chain isNonceUsed check as a safety measure, although collision
324
+ * is essentially impossible with 256-bit random values.
325
+ *
326
+ * @param params.walletAccount - The wallet account whose delegation contract is checked.
327
+ * @param [client] - The Dynamic client instance.
328
+ * @returns A unique bigint nonce for the EIP-712 intent.
329
+ * @not-instrumented
330
+ */
331
+ const generateIntentNonce = async ({ walletAccount }, client) => {
332
+ const nonce = generateRandomNonce();
333
+ const { networkData } = await (0, _dynamic_labs_sdk_client.getActiveNetworkData)({ walletAccount }, client);
334
+ (0, _dynamic_labs_sdk_client_core.assertDefined)(networkData, `No network data found for wallet account ${walletAccount.address}`);
335
+ const publicClient = require_createWalletClientForWalletAccount.createPublicClientFromNetworkData({ networkData });
336
+ try {
337
+ if (await publicClient.readContract({
338
+ abi: UGD_ABI,
339
+ address: walletAccount.address,
340
+ args: [nonce],
341
+ functionName: "isNonceUsed"
342
+ })) return generateRandomNonce();
343
+ } catch {}
344
+ return nonce;
345
+ };
346
+
347
+ //#endregion
348
+ //#region src/gasless/toSerializedAuthorization/toSerializedAuthorization.ts
349
+ /**
350
+ * Converts a viem SignAuthorizationReturnType into a plain serializable object
351
+ * suitable for JSON transport to the sponsorship API.
352
+ *
353
+ * @not-instrumented
354
+ */
355
+ const toSerializedAuthorization = (auth) => {
356
+ (0, _dynamic_labs_sdk_client_core.assertDefined)(auth.yParity, "Signed authorization is missing yParity");
357
+ return {
358
+ address: auth.address,
359
+ chainId: auth.chainId,
360
+ nonce: auth.nonce,
361
+ r: auth.r,
362
+ s: auth.s,
363
+ yParity: auth.yParity
364
+ };
365
+ };
366
+
367
+ //#endregion
368
+ //#region src/gasless/signSponsoredTransaction/signSponsoredTransaction.ts
369
+ /**
370
+ * Signs a sponsored transaction by creating an EIP-712 intent signature.
371
+ *
372
+ * If an authorization is provided, it is serialized and included in the
373
+ * payload. Otherwise the intent is signed without any authorization
374
+ * (caller manages delegation separately).
375
+ *
376
+ * @param params.walletAccount - The EVM wallet account to sign with.
377
+ * @param params.calls - The batch of calls to execute.
378
+ * @param [params.authorization] - Pre-signed EIP-7702 authorization to include.
379
+ * @param [params.validForSeconds] - How long the signed intent remains valid, in seconds. Defaults to 600 (10 minutes).
380
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
381
+ * @returns The signed sponsored transaction payload ready to be sent to the API.
382
+ * @not-instrumented
383
+ */
384
+ const signSponsoredTransaction = async ({ walletAccount, calls, authorization, validForSeconds = DEFAULT_VALID_FOR_SECONDS }, client = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
385
+ const { networkData } = await (0, _dynamic_labs_sdk_client.getActiveNetworkData)({ walletAccount }, client);
386
+ (0, _dynamic_labs_sdk_client_core.assertDefined)(networkData, `No network data found for wallet account ${walletAccount.address}`);
387
+ const nonce = await generateIntentNonce({ walletAccount }, client);
388
+ const deadline = BigInt(Math.floor(Date.now() / 1e3) + validForSeconds);
389
+ const chainId = require_createWalletClientForWalletAccount.mapNetworkDataToViemChain(networkData).id;
390
+ const signature = await (await require_createWalletClientForWalletAccount.createWalletClientForWalletAccount({ walletAccount }, client)).signTypedData({
391
+ domain: {
392
+ chainId,
393
+ verifyingContract: DELEGATION_CONTRACT_ADDRESS
394
+ },
395
+ message: {
396
+ calls: calls.map((c) => ({
397
+ data: c.data,
398
+ target: c.target,
399
+ value: c.value
400
+ })),
401
+ deadline,
402
+ mode: BATCH_CALL_OPDATA_AUTH_MODE,
403
+ nonce,
404
+ relayer: RELAYER_CONTRACT_ADDRESS
405
+ },
406
+ primaryType: "AuthorizedExecutions",
407
+ types: AUTHORIZED_EXECUTIONS_TYPES
408
+ });
409
+ return {
410
+ authorization: authorization ? toSerializedAuthorization(authorization) : void 0,
411
+ calls,
412
+ chainId,
413
+ deadline: deadline.toString(),
414
+ nonce: nonce.toString(),
415
+ relayer: RELAYER_CONTRACT_ADDRESS,
416
+ signature,
417
+ walletAddress: walletAccount.address
418
+ };
419
+ };
420
+
421
+ //#endregion
422
+ //#region src/gasless/relaySponsoredTransaction/relaySponsoredTransaction.ts
423
+ const isSignedTransactionParams = (params) => "signedTransaction" in params;
424
+ /**
425
+ * Relays a sponsored EVM transaction to the Dynamic backend.
426
+ *
427
+ * Accepts either a pre-signed transaction or unsigned calls. When given
428
+ * unsigned calls, signs the transaction first via signSponsoredTransaction.
429
+ *
430
+ * The backend encodes the transaction, submits it to the relay provider,
431
+ * and returns a request ID for tracking. The relay may retry the on-chain
432
+ * submission, so the request ID (not a transaction hash) is the stable
433
+ * identifier for the sponsored transaction.
434
+ *
435
+ * @param params - Either { signedTransaction } or { walletAccount, calls, ... }.
436
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
437
+ * @returns An object containing the request ID for tracking the relayed transaction.
438
+ * @throws {SponsorTransactionError} If the API call fails or returns an unexpected response.
439
+ * @not-instrumented
440
+ */
441
+ const relaySponsoredTransaction = async (params, client = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
442
+ const signedTransaction = isSignedTransactionParams(params) ? params.signedTransaction : await signSponsoredTransaction({
443
+ authorization: params.authorization,
444
+ calls: params.calls,
445
+ validForSeconds: params.validForSeconds ?? DEFAULT_VALID_FOR_SECONDS,
446
+ walletAccount: params.walletAccount
447
+ }, client);
448
+ const core = (0, _dynamic_labs_sdk_client_core.getCore)(client);
449
+ const apiClient = (0, _dynamic_labs_sdk_client_core.createApiClient)({}, client);
450
+ let data;
451
+ try {
452
+ data = await apiClient.sponsorEVMTransaction({
453
+ environmentId: core.environmentId,
454
+ sponsorEVMTransactionRequest: {
455
+ authorization: signedTransaction.authorization,
456
+ calls: signedTransaction.calls.map((c) => ({
457
+ data: c.data,
458
+ target: c.target,
459
+ value: c.value.toString()
460
+ })),
461
+ chainId: signedTransaction.chainId,
462
+ deadline: signedTransaction.deadline,
463
+ nonce: signedTransaction.nonce,
464
+ relayer: signedTransaction.relayer,
465
+ signature: signedTransaction.signature,
466
+ walletAddress: signedTransaction.walletAddress
467
+ }
468
+ });
469
+ } catch (error) {
470
+ throw new SponsorTransactionError(error instanceof Error ? error : null);
471
+ }
472
+ if (!data.requestId) throw new SponsorTransactionError();
473
+ return { requestId: data.requestId };
474
+ };
475
+
476
+ //#endregion
477
+ //#region src/gasless/waitForSponsoredTransaction/waitForSponsoredTransaction.ts
478
+ const POLL_INTERVAL_MS = 2e3;
479
+ const MAX_POLLING_ATTEMPTS = 6e4 / POLL_INTERVAL_MS;
480
+ /**
481
+ * Polls `getEVMSponsoredTransactionStatus` until the relay reaches a terminal
482
+ * state and returns the on-chain transaction hash.
483
+ *
484
+ * Resolves on `CONFIRMED`. Throws `SponsorTransactionError` on terminal
485
+ * failure statuses (`FAILED`, `CANCELED`, `EXPIRED`, `REJECTED`) or after a
486
+ * 60s timeout.
487
+ *
488
+ * @param params.requestId - The request ID returned when the transaction was relayed.
489
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
490
+ * @returns An object containing the on-chain transaction hash.
491
+ * @throws {SponsorTransactionError} If the relay returns a terminal failure or polling times out.
492
+ * @not-instrumented
493
+ */
494
+ const waitForSponsoredTransaction = async ({ requestId }, client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
495
+ for (let attempt = 0; attempt < MAX_POLLING_ATTEMPTS; attempt++) {
496
+ const result = await getEVMSponsoredTransactionStatus({ requestId }, client);
497
+ switch (result.status) {
498
+ case "CONFIRMED":
499
+ if (!result.transactionHash) throw new SponsorTransactionError();
500
+ return { transactionHash: result.transactionHash };
501
+ case "CANCELED":
502
+ case "EXPIRED":
503
+ case "FAILED":
504
+ case "REJECTED": throw new SponsorTransactionError(null, result.errorMessage);
505
+ case "PENDING":
506
+ case "SENT":
507
+ case "SUBMITTED": break;
508
+ }
509
+ if (attempt < MAX_POLLING_ATTEMPTS - 1) await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
510
+ }
511
+ throw new SponsorTransactionError(null, `Timed out waiting for sponsored transaction ${requestId}`);
512
+ };
513
+
514
+ //#endregion
515
+ //#region src/gasless/sendSponsoredTransaction/sendSponsoredTransaction.ts
516
+ /**
517
+ * Sends a sponsored EVM transaction and waits for the on-chain transaction hash.
518
+ *
519
+ * Accepts either a pre-signed transaction or unsigned calls. When given
520
+ * unsigned calls, signs the transaction first via signSponsoredTransaction.
521
+ * Relays the transaction and polls until the relay reports a CONFIRMED
522
+ * status, then returns the resulting transaction hash.
523
+ *
524
+ * @param params - Either { signedTransaction } or { walletAccount, calls, ... }.
525
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
526
+ * @returns An object containing the on-chain transaction hash.
527
+ * @throws {SponsorTransactionError} If the relay returns a terminal failure or polling times out.
528
+ * @not-instrumented
529
+ */
530
+ const sendSponsoredTransaction = async (params, client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
531
+ const { requestId } = await relaySponsoredTransaction(params, client);
532
+ return waitForSponsoredTransaction({ requestId }, client);
533
+ };
534
+
161
535
  //#endregion
162
536
  //#region src/exports/index.ts
163
537
  (0, _dynamic_labs_sdk_assert_package_version.assertPackageVersion)(require_createWalletClientForWalletAccount.name, require_createWalletClientForWalletAccount.version);
164
538
 
165
539
  //#endregion
540
+ exports.EvmGasSponsorshipNotEnabledError = EvmGasSponsorshipNotEnabledError;
166
541
  exports.RpcError = require_evmTransferAmount.RpcError;
542
+ exports.SponsorTransactionError = SponsorTransactionError;
167
543
  exports.addEvmExtension = addEvmExtension;
168
544
  exports.calculateEvmTransactionFee = calculateEvmTransactionFee;
545
+ exports.getEVMSponsoredTransactionStatus = getEVMSponsoredTransactionStatus;
546
+ exports.isEvmGasSponsorshipEnabled = isEvmGasSponsorshipEnabled;
169
547
  exports.isEvmNetworkProvider = isEvmNetworkProvider;
170
548
  exports.isEvmWalletAccount = require_evmTransferAmount.isEvmWalletAccount;
549
+ exports.relaySponsoredTransaction = relaySponsoredTransaction;
550
+ exports.sendSponsoredTransaction = sendSponsoredTransaction;
551
+ exports.signSponsoredTransaction = signSponsoredTransaction;
171
552
  exports.simulateEvmTransaction = simulateEvmTransaction;
553
+ exports.waitForSponsoredTransaction = waitForSponsoredTransaction;
172
554
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["createPublicClientFromNetworkData","maxFeePerGas: bigint | undefined","maxPriorityFeePerGas: bigint | undefined","gasPrice: bigint | undefined","nativeAmount: bigint","FeeEstimationFailedError","isEvmWalletAccount","InvalidParamError","feeData: EvmSimulationResult['feeData']","FeeEstimationFailedError","SimulationFailedError","packageName","packageVersion"],"sources":["../src/addEvmExtension/addEvmExtension.ts","../src/isEvmNetworkProvider/isEvmNetworkProvider.ts","../src/utils/calculateEvmTransactionFee/calculateEvmTransactionFee.ts","../src/simulateEvmTransaction/simulateEvmTransaction.ts","../src/exports/index.ts"],"sourcesContent":["import { getDefaultClient } from '@dynamic-labs-sdk/client/core';\n\nimport { addEIP6963Extension } from '../eip6963/addEIP6963Extension';\nimport { addWaasEvmExtension } from '../waas/addWaasEvmExtension';\n\n/**\n * Adds the EVM extension to the Dynamic client.\n *\n * This is a convenience function that adds both the EIP-6963 extension\n * and the Dynamic WaaS EVM extension, enabling support for all EVM wallet types\n * including standard wallets and embedded wallets managed by Dynamic's infrastructure.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @not-instrumented\n */\nexport const addEvmExtension = (client = getDefaultClient()): void => {\n addEIP6963Extension(client);\n addWaasEvmExtension(client);\n};\n","import type { NetworkProvider } from '@dynamic-labs-sdk/client';\n\nimport type { EvmNetworkProvider } from '../EvmNetworkProvider';\n\n/**\n * Type guard function to check if a network provider is an EVM network provider.\n *\n * @param networkProvider - The network provider to check.\n * @returns True if the network provider is an EVM network provider, false otherwise.\n * @not-instrumented\n */\nexport const isEvmNetworkProvider = (\n networkProvider: NetworkProvider\n): networkProvider is EvmNetworkProvider => networkProvider.chain === 'EVM';\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { FeeEstimationFailedError } from '@dynamic-labs-sdk/client';\nimport { formatEther } from 'viem';\n\nimport type {\n EvmTransactionFeeData,\n EvmTransactionToSimulate,\n} from '../../transactionSimulation.types';\nimport { createPublicClientFromNetworkData } from '../../viem/createPublicClientFromNetworkData';\n\ntype CalculateEvmTransactionFeeParams = {\n nativeTokenPriceUsd?: number;\n networkData: NetworkData;\n transaction: EvmTransactionToSimulate;\n};\n\n/**\n * Calculates the estimated fee for an EVM transaction.\n *\n * This function estimates gas usage and calculates the total transaction fee\n * using either legacy gas pricing or EIP-1559 pricing. The fee is returned\n * in both native units (wei) and human-readable format (ETH).\n *\n * @param params.transaction - The transaction to estimate fees for.\n * @param params.networkData - Network configuration for RPC connection.\n * @param params.nativeTokenPriceUsd - Optional USD price of the native token for fee conversion.\n * @returns Fee data including gas estimates and human-readable amounts.\n * @throws {FeeEstimationFailedError} If gas estimation or fee retrieval fails.\n * @not-instrumented\n */\nexport const calculateEvmTransactionFee = async ({\n transaction,\n networkData,\n nativeTokenPriceUsd,\n}: CalculateEvmTransactionFeeParams): Promise<EvmTransactionFeeData> => {\n try {\n const publicClient = createPublicClientFromNetworkData({ networkData });\n\n // Estimate gas for the transaction\n const gasEstimate = await publicClient.estimateGas({\n account: transaction.from,\n data: transaction.data,\n to: transaction.to,\n value: transaction.value,\n });\n\n // Try to get EIP-1559 fees first, fallback to legacy gas price\n let maxFeePerGas: bigint | undefined;\n let maxPriorityFeePerGas: bigint | undefined;\n let gasPrice: bigint | undefined;\n let nativeAmount: bigint;\n\n try {\n const feeData = await publicClient.estimateFeesPerGas();\n maxFeePerGas = feeData.maxFeePerGas;\n maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n\n // Calculate fee using EIP-1559 pricing\n nativeAmount = gasEstimate * maxFeePerGas;\n } catch {\n // Fallback to legacy gas pricing\n gasPrice = await publicClient.getGasPrice();\n nativeAmount = gasEstimate * gasPrice;\n }\n\n // Format to human-readable ETH\n const humanReadableAmount = formatEther(nativeAmount);\n\n // Calculate USD amount if price data available\n const usdAmount = nativeTokenPriceUsd\n ? (Number(humanReadableAmount) * nativeTokenPriceUsd).toFixed(2)\n : undefined;\n\n return {\n gasEstimate,\n gasPrice,\n humanReadableAmount,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nativeAmount,\n usdAmount,\n };\n } catch (error) {\n throw new FeeEstimationFailedError({\n cause: error instanceof Error ? error : undefined,\n message: 'Failed to estimate EVM transaction fee',\n });\n }\n};\n","import {\n FeeEstimationFailedError,\n InvalidParamError,\n SimulationFailedError,\n getDefaultClient,\n getNetworksData,\n} from '@dynamic-labs-sdk/client';\nimport { createApiClient, getCore } from '@dynamic-labs-sdk/client/core';\nimport type { SimulateEVMTransactionRequest } from '@dynamic-labs/sdk-api-core';\n\nimport type { EvmWalletAccount } from '../EvmWalletAccount.types';\nimport type {\n EvmSimulationResult,\n EvmTransactionToSimulate,\n} from '../transactionSimulation.types';\nimport { calculateEvmTransactionFee } from '../utils/calculateEvmTransactionFee';\nimport { isEvmWalletAccount } from '../utils/isEvmWalletAccount';\n\ntype SimulateEvmTransactionParams = {\n includeFees?: boolean;\n transaction: EvmTransactionToSimulate;\n walletAccount: EvmWalletAccount;\n};\n\n/**\n * Simulates an EVM transaction to preview its effects before execution.\n *\n * This function uses the Blockaid API to analyze the transaction and returns\n * information about asset transfers, security validation, and optionally fee estimates.\n * The simulation shows what will happen when the transaction is executed without\n * actually sending it to the blockchain.\n *\n * @param params.walletAccount - The EVM wallet account that will sign the transaction.\n * @param params.transaction - The transaction to simulate, including network ID.\n * @param params.includeFees - Whether to calculate transaction fees (default: false).\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns Simulation result with asset diffs, security validation, and optional fee data.\n * @throws {InvalidParamError} If wallet account is not an EVM account or network ID is not configured.\n * @throws {SimulationFailedError} If the simulation API call fails.\n * @throws {FeeEstimationFailedError} If includeFees is true and fee calculation fails.\n * @not-instrumented\n */\nexport const simulateEvmTransaction = async (\n {\n walletAccount,\n transaction,\n includeFees = false,\n }: SimulateEvmTransactionParams,\n client = getDefaultClient()\n): Promise<EvmSimulationResult> => {\n // Validate wallet account type\n if (!isEvmWalletAccount(walletAccount)) {\n throw new InvalidParamError('Wallet account must be an EVM wallet account');\n }\n\n // Get network data for the specified network\n const networksData = getNetworksData(client);\n const networkData = networksData.find(\n (data) => data.networkId === transaction.networkId && data.chain === 'EVM'\n );\n\n if (!networkData) {\n throw new InvalidParamError(\n `Network with ID ${transaction.networkId} is not configured in project settings`\n );\n }\n\n try {\n // Create API client and call simulation endpoint\n const core = getCore(client);\n const apiClient = createApiClient({}, client);\n\n const simulateEVMTransactionRequest = {\n chainId: transaction.networkId,\n data: transaction.data || '0x',\n from: transaction.from,\n to: transaction.to,\n } as SimulateEVMTransactionRequest;\n\n if (transaction.value !== undefined) {\n simulateEVMTransactionRequest.value = transaction.value.toString();\n }\n\n const response = await apiClient.simulateEVMTransaction({\n environmentId: core.environmentId,\n simulateEVMTransactionRequest,\n });\n\n // Calculate fees if requested\n let feeData: EvmSimulationResult['feeData'];\n\n if (includeFees) {\n feeData = await calculateEvmTransactionFee({\n nativeTokenPriceUsd: response.priceData?.nativeTokenUsdPrice,\n networkData,\n transaction,\n });\n }\n\n // Map API response to simulation result\n return {\n counterparties: response.counterparties,\n feeData,\n inAssets: response.inAssets || [],\n outAssets: response.outAssets || [],\n priceData: response.priceData,\n showTotalFiat: response.showTotalFiat,\n validation: response.validation\n ? {\n description: response.validation.description,\n reason: response.validation.reason,\n result: response.validation.result as\n | 'benign'\n | 'warning'\n | 'malicious',\n }\n : undefined,\n };\n } catch (error) {\n // Re-throw FeeEstimationFailedError as-is\n if (error instanceof FeeEstimationFailedError) {\n throw error;\n }\n\n throw new SimulationFailedError({\n cause: error instanceof Error ? error : undefined,\n message: 'Failed to simulate EVM transaction',\n });\n }\n};\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport {\n name as packageName,\n version as packageVersion,\n} from '../../package.json';\nassertPackageVersion(packageName, packageVersion);\n\nexport { addEvmExtension } from '../addEvmExtension';\nexport { RpcError } from '../errors/RpcError';\nexport type { EvmNetworkProvider } from '../EvmNetworkProvider';\nexport type { EvmWalletAccount } from '../EvmWalletAccount.types';\nexport type { EvmWalletProvider } from '../EvmWalletProvider.types';\nexport { isEvmNetworkProvider } from '../isEvmNetworkProvider';\nexport { simulateEvmTransaction } from '../simulateEvmTransaction';\nexport type {\n EvmSimulationResult,\n EvmTransactionFeeData,\n EvmTransactionToSimulate,\n} from '../transactionSimulation.types';\nexport { calculateEvmTransactionFee } from '../utils/calculateEvmTransactionFee';\nexport { isEvmWalletAccount } from '../utils/isEvmWalletAccount';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAeA,MAAa,mBAAmB,8DAA2B,KAAW;AACpE,iDAAoB,OAAO;AAC3B,iDAAoB,OAAO;;;;;;;;;;;;ACN7B,MAAa,wBACX,oBAC0C,gBAAgB,UAAU;;;;;;;;;;;;;;;;;;ACiBtE,MAAa,6BAA6B,OAAO,EAC/C,aACA,aACA,0BACsE;AACtE,KAAI;EACF,MAAM,eAAeA,6EAAkC,EAAE,aAAa,CAAC;EAGvE,MAAM,cAAc,MAAM,aAAa,YAAY;GACjD,SAAS,YAAY;GACrB,MAAM,YAAY;GAClB,IAAI,YAAY;GAChB,OAAO,YAAY;GACpB,CAAC;EAGF,IAAIC;EACJ,IAAIC;EACJ,IAAIC;EACJ,IAAIC;AAEJ,MAAI;GACF,MAAM,UAAU,MAAM,aAAa,oBAAoB;AACvD,kBAAe,QAAQ;AACvB,0BAAuB,QAAQ;AAG/B,kBAAe,cAAc;UACvB;AAEN,cAAW,MAAM,aAAa,aAAa;AAC3C,kBAAe,cAAc;;EAI/B,MAAM,4CAAkC,aAAa;EAGrD,MAAM,YAAY,uBACb,OAAO,oBAAoB,GAAG,qBAAqB,QAAQ,EAAE,GAC9D;AAEJ,SAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACD;UACM,OAAO;AACd,QAAM,IAAIC,kDAAyB;GACjC,OAAO,iBAAiB,QAAQ,QAAQ;GACxC,SAAS;GACV,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AC5CN,MAAa,yBAAyB,OACpC,EACE,eACA,aACA,cAAc,SAEhB,yDAA2B,KACM;AAEjC,KAAI,CAACC,6CAAmB,cAAc,CACpC,OAAM,IAAIC,2CAAkB,+CAA+C;CAK7E,MAAM,4DAD+B,OAAO,CACX,MAC9B,SAAS,KAAK,cAAc,YAAY,aAAa,KAAK,UAAU,MACtE;AAED,KAAI,CAAC,YACH,OAAM,IAAIA,2CACR,mBAAmB,YAAY,UAAU,wCAC1C;AAGH,KAAI;EAEF,MAAM,kDAAe,OAAO;EAC5B,MAAM,+DAA4B,EAAE,EAAE,OAAO;EAE7C,MAAM,gCAAgC;GACpC,SAAS,YAAY;GACrB,MAAM,YAAY,QAAQ;GAC1B,MAAM,YAAY;GAClB,IAAI,YAAY;GACjB;AAED,MAAI,YAAY,UAAU,OACxB,+BAA8B,QAAQ,YAAY,MAAM,UAAU;EAGpE,MAAM,WAAW,MAAM,UAAU,uBAAuB;GACtD,eAAe,KAAK;GACpB;GACD,CAAC;EAGF,IAAIC;AAEJ,MAAI,YACF,WAAU,MAAM,2BAA2B;GACzC,qBAAqB,SAAS,WAAW;GACzC;GACA;GACD,CAAC;AAIJ,SAAO;GACL,gBAAgB,SAAS;GACzB;GACA,UAAU,SAAS,YAAY,EAAE;GACjC,WAAW,SAAS,aAAa,EAAE;GACnC,WAAW,SAAS;GACpB,eAAe,SAAS;GACxB,YAAY,SAAS,aACjB;IACE,aAAa,SAAS,WAAW;IACjC,QAAQ,SAAS,WAAW;IAC5B,QAAQ,SAAS,WAAW;IAI7B,GACD;GACL;UACM,OAAO;AAEd,MAAI,iBAAiBC,kDACnB,OAAM;AAGR,QAAM,IAAIC,+CAAsB;GAC9B,OAAO,iBAAiB,QAAQ,QAAQ;GACxC,SAAS;GACV,CAAC;;;;;;mECzHeC,iDAAaC,mDAAe"}
1
+ {"version":3,"file":"index.cjs","names":["BaseError","BaseError","data: {\n errorMessage?: string;\n status: SponsoredTransactionStatus;\n transactionHash?: string;\n }","createPublicClientFromNetworkData","maxFeePerGas: bigint | undefined","maxPriorityFeePerGas: bigint | undefined","gasPrice: bigint | undefined","nativeAmount: bigint","FeeEstimationFailedError","isEvmWalletAccount","InvalidParamError","feeData: EvmSimulationResult['feeData']","FeeEstimationFailedError","SimulationFailedError","DELEGATION_CONTRACT_ADDRESS: Hex","RELAYER_CONTRACT_ADDRESS: Hex","BATCH_CALL_OPDATA_AUTH_MODE: Hex","createPublicClientFromNetworkData","mapNetworkDataToViemChain","createWalletClientForWalletAccount","data: { requestId?: string }","packageName","packageVersion"],"sources":["../src/addEvmExtension/addEvmExtension.ts","../src/errors/EvmGasSponsorshipNotEnabledError/EvmGasSponsorshipNotEnabledError.ts","../src/errors/SponsorTransactionError/SponsorTransactionError.ts","../src/gasless/getEVMSponsoredTransactionStatus/getEVMSponsoredTransactionStatus.ts","../src/gasless/isEvmGasSponsorshipEnabled/isEvmGasSponsorshipEnabled.ts","../src/isEvmNetworkProvider/isEvmNetworkProvider.ts","../src/utils/calculateEvmTransactionFee/calculateEvmTransactionFee.ts","../src/simulateEvmTransaction/simulateEvmTransaction.ts","../src/gasless/constants.ts","../src/gasless/generateRandomNonce/generateRandomNonce.ts","../src/gasless/generateIntentNonce/generateIntentNonce.ts","../src/gasless/toSerializedAuthorization/toSerializedAuthorization.ts","../src/gasless/signSponsoredTransaction/signSponsoredTransaction.ts","../src/gasless/relaySponsoredTransaction/relaySponsoredTransaction.ts","../src/gasless/waitForSponsoredTransaction/waitForSponsoredTransaction.ts","../src/gasless/sendSponsoredTransaction/sendSponsoredTransaction.ts","../src/exports/index.ts"],"sourcesContent":["import { getDefaultClient } from '@dynamic-labs-sdk/client/core';\n\nimport { addEIP6963Extension } from '../eip6963/addEIP6963Extension';\nimport { addWaasEvmExtension } from '../waas/addWaasEvmExtension';\n\n/**\n * Adds the EVM extension to the Dynamic client.\n *\n * This is a convenience function that adds both the EIP-6963 extension\n * and the Dynamic WaaS EVM extension, enabling support for all EVM wallet types\n * including standard wallets and embedded wallets managed by Dynamic's infrastructure.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @not-instrumented\n */\nexport const addEvmExtension = (client = getDefaultClient()): void => {\n addEIP6963Extension(client);\n addWaasEvmExtension(client);\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class EvmGasSponsorshipNotEnabledError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'evm_gas_sponsorship_not_enabled_error',\n docsUrl: null,\n name: 'EvmGasSponsorshipNotEnabledError',\n shortMessage: 'EVM gas sponsorship is not enabled for this project',\n });\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class SponsorTransactionError extends BaseError {\n // eslint-disable-next-line custom-rules/require-single-object-param -- mirrors viem-style error constructors: (cause, details)\n constructor(cause?: Error | null, details?: string) {\n super({\n cause: cause ?? null,\n code: 'sponsor_transaction_error',\n details,\n docsUrl: null,\n name: 'SponsorTransactionError',\n shortMessage: 'Failed to sponsor EVM transaction',\n });\n }\n}\n","import {\n createApiClient,\n getCore,\n getDefaultClient,\n} from '@dynamic-labs-sdk/client/core';\nimport type { Hex } from 'viem';\n\nimport { SponsorTransactionError } from '../../errors/SponsorTransactionError';\nimport type {\n SponsoredTransactionStatus,\n SponsoredTransactionStatusResult,\n} from '../gasless.types';\n\ntype GetEVMSponsoredTransactionStatusParams = {\n /** The request ID returned by `relaySponsoredTransaction` / `sendSponsoredTransaction`. */\n requestId: string;\n};\n\n/**\n * Fetches the current relay state for a sponsored EVM transaction.\n *\n * Returns the lifecycle status, the on-chain transaction hash (when the relay\n * has broadcast it), and any terminal-failure error message. Use this as the\n * building block for custom polling flows; for the common \"wait until done\"\n * case prefer `waitForSponsoredTransaction`.\n *\n * @param params.requestId - The request ID returned when the transaction was relayed.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns The current status, optional transaction hash, and optional error message.\n * @throws {SponsorTransactionError} If the API call fails.\n * @not-instrumented\n */\nexport const getEVMSponsoredTransactionStatus = async (\n { requestId }: GetEVMSponsoredTransactionStatusParams,\n client = getDefaultClient(),\n): Promise<SponsoredTransactionStatusResult> => {\n const core = getCore(client);\n const apiClient = createApiClient({}, client);\n\n let data: {\n errorMessage?: string;\n status: SponsoredTransactionStatus;\n transactionHash?: string;\n };\n\n try {\n // Remove this once @dynamic-labs/sdk-api-core ships getEVMSponsoredTransactionStatus\n // @ts-expect-error - method exists in redcoast source but not yet in published SDK\n data = await apiClient.getEVMSponsoredTransactionStatus({\n environmentId: core.environmentId,\n requestId,\n });\n } catch (error) {\n const cause = error instanceof Error ? error : null;\n throw new SponsorTransactionError(cause);\n }\n\n return {\n errorMessage: data.errorMessage,\n status: data.status,\n transactionHash: data.transactionHash as Hex | undefined,\n };\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\n\n/**\n * Checks if EVM gas sponsorship is enabled for the current project.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns True if EVM gas sponsorship is enabled, false otherwise.\n * @not-instrumented\n */\nexport const isEvmGasSponsorshipEnabled = (\n client = getDefaultClient()\n): boolean => {\n assertDefined(client.projectSettings, 'Project settings are not defined');\n\n return (\n client.projectSettings.sdk.embeddedWallets?.evmGasSponsorshipEnabled ??\n false\n );\n};\n","import type { NetworkProvider } from '@dynamic-labs-sdk/client';\n\nimport type { EvmNetworkProvider } from '../EvmNetworkProvider';\n\n/**\n * Type guard function to check if a network provider is an EVM network provider.\n *\n * @param networkProvider - The network provider to check.\n * @returns True if the network provider is an EVM network provider, false otherwise.\n * @not-instrumented\n */\nexport const isEvmNetworkProvider = (\n networkProvider: NetworkProvider\n): networkProvider is EvmNetworkProvider => networkProvider.chain === 'EVM';\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { FeeEstimationFailedError } from '@dynamic-labs-sdk/client';\nimport { formatEther } from 'viem';\n\nimport type {\n EvmTransactionFeeData,\n EvmTransactionToSimulate,\n} from '../../transactionSimulation.types';\nimport { createPublicClientFromNetworkData } from '../../viem/createPublicClientFromNetworkData';\n\ntype CalculateEvmTransactionFeeParams = {\n nativeTokenPriceUsd?: number;\n networkData: NetworkData;\n transaction: EvmTransactionToSimulate;\n};\n\n/**\n * Calculates the estimated fee for an EVM transaction.\n *\n * This function estimates gas usage and calculates the total transaction fee\n * using either legacy gas pricing or EIP-1559 pricing. The fee is returned\n * in both native units (wei) and human-readable format (ETH).\n *\n * @param params.transaction - The transaction to estimate fees for.\n * @param params.networkData - Network configuration for RPC connection.\n * @param params.nativeTokenPriceUsd - Optional USD price of the native token for fee conversion.\n * @returns Fee data including gas estimates and human-readable amounts.\n * @throws {FeeEstimationFailedError} If gas estimation or fee retrieval fails.\n * @not-instrumented\n */\nexport const calculateEvmTransactionFee = async ({\n transaction,\n networkData,\n nativeTokenPriceUsd,\n}: CalculateEvmTransactionFeeParams): Promise<EvmTransactionFeeData> => {\n try {\n const publicClient = createPublicClientFromNetworkData({ networkData });\n\n // Estimate gas for the transaction\n const gasEstimate = await publicClient.estimateGas({\n account: transaction.from,\n data: transaction.data,\n to: transaction.to,\n value: transaction.value,\n });\n\n // Try to get EIP-1559 fees first, fallback to legacy gas price\n let maxFeePerGas: bigint | undefined;\n let maxPriorityFeePerGas: bigint | undefined;\n let gasPrice: bigint | undefined;\n let nativeAmount: bigint;\n\n try {\n const feeData = await publicClient.estimateFeesPerGas();\n maxFeePerGas = feeData.maxFeePerGas;\n maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n\n // Calculate fee using EIP-1559 pricing\n nativeAmount = gasEstimate * maxFeePerGas;\n } catch {\n // Fallback to legacy gas pricing\n gasPrice = await publicClient.getGasPrice();\n nativeAmount = gasEstimate * gasPrice;\n }\n\n // Format to human-readable ETH\n const humanReadableAmount = formatEther(nativeAmount);\n\n // Calculate USD amount if price data available\n const usdAmount = nativeTokenPriceUsd\n ? (Number(humanReadableAmount) * nativeTokenPriceUsd).toFixed(2)\n : undefined;\n\n return {\n gasEstimate,\n gasPrice,\n humanReadableAmount,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nativeAmount,\n usdAmount,\n };\n } catch (error) {\n throw new FeeEstimationFailedError({\n cause: error instanceof Error ? error : undefined,\n message: 'Failed to estimate EVM transaction fee',\n });\n }\n};\n","import {\n FeeEstimationFailedError,\n InvalidParamError,\n SimulationFailedError,\n getDefaultClient,\n getNetworksData,\n} from '@dynamic-labs-sdk/client';\nimport { createApiClient, getCore } from '@dynamic-labs-sdk/client/core';\nimport type { SimulateEVMTransactionRequest } from '@dynamic-labs/sdk-api-core';\n\nimport type { EvmWalletAccount } from '../EvmWalletAccount.types';\nimport type {\n EvmSimulationResult,\n EvmTransactionToSimulate,\n} from '../transactionSimulation.types';\nimport { calculateEvmTransactionFee } from '../utils/calculateEvmTransactionFee';\nimport { isEvmWalletAccount } from '../utils/isEvmWalletAccount';\n\ntype SimulateEvmTransactionParams = {\n includeFees?: boolean;\n transaction: EvmTransactionToSimulate;\n walletAccount: EvmWalletAccount;\n};\n\n/**\n * Simulates an EVM transaction to preview its effects before execution.\n *\n * This function uses the Blockaid API to analyze the transaction and returns\n * information about asset transfers, security validation, and optionally fee estimates.\n * The simulation shows what will happen when the transaction is executed without\n * actually sending it to the blockchain.\n *\n * @param params.walletAccount - The EVM wallet account that will sign the transaction.\n * @param params.transaction - The transaction to simulate, including network ID.\n * @param params.includeFees - Whether to calculate transaction fees (default: false).\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns Simulation result with asset diffs, security validation, and optional fee data.\n * @throws {InvalidParamError} If wallet account is not an EVM account or network ID is not configured.\n * @throws {SimulationFailedError} If the simulation API call fails.\n * @throws {FeeEstimationFailedError} If includeFees is true and fee calculation fails.\n * @not-instrumented\n */\nexport const simulateEvmTransaction = async (\n {\n walletAccount,\n transaction,\n includeFees = false,\n }: SimulateEvmTransactionParams,\n client = getDefaultClient()\n): Promise<EvmSimulationResult> => {\n // Validate wallet account type\n if (!isEvmWalletAccount(walletAccount)) {\n throw new InvalidParamError('Wallet account must be an EVM wallet account');\n }\n\n // Get network data for the specified network\n const networksData = getNetworksData(client);\n const networkData = networksData.find(\n (data) => data.networkId === transaction.networkId && data.chain === 'EVM'\n );\n\n if (!networkData) {\n throw new InvalidParamError(\n `Network with ID ${transaction.networkId} is not configured in project settings`\n );\n }\n\n try {\n // Create API client and call simulation endpoint\n const core = getCore(client);\n const apiClient = createApiClient({}, client);\n\n const simulateEVMTransactionRequest = {\n chainId: transaction.networkId,\n data: transaction.data || '0x',\n from: transaction.from,\n to: transaction.to,\n } as SimulateEVMTransactionRequest;\n\n if (transaction.value !== undefined) {\n simulateEVMTransactionRequest.value = transaction.value.toString();\n }\n\n const response = await apiClient.simulateEVMTransaction({\n environmentId: core.environmentId,\n simulateEVMTransactionRequest,\n });\n\n // Calculate fees if requested\n let feeData: EvmSimulationResult['feeData'];\n\n if (includeFees) {\n feeData = await calculateEvmTransactionFee({\n nativeTokenPriceUsd: response.priceData?.nativeTokenUsdPrice,\n networkData,\n transaction,\n });\n }\n\n // Map API response to simulation result\n return {\n counterparties: response.counterparties,\n feeData,\n inAssets: response.inAssets || [],\n outAssets: response.outAssets || [],\n priceData: response.priceData,\n showTotalFiat: response.showTotalFiat,\n validation: response.validation\n ? {\n description: response.validation.description,\n reason: response.validation.reason,\n result: response.validation.result as\n | 'benign'\n | 'warning'\n | 'malicious',\n }\n : undefined,\n };\n } catch (error) {\n // Re-throw FeeEstimationFailedError as-is\n if (error instanceof FeeEstimationFailedError) {\n throw error;\n }\n\n throw new SimulationFailedError({\n cause: error instanceof Error ? error : undefined,\n message: 'Failed to simulate EVM transaction',\n });\n }\n};\n","import type { Hex } from 'viem';\n\n/** The Fireblocks Universal Gasless Delegate (UGD) contract address used for EIP-7702 delegation. */\nexport const DELEGATION_CONTRACT_ADDRESS: Hex =\n '0x0000Fb7702036ff9f76044a501ac1aA74cbab16b';\n\n/** The ERC-7821 Forwarder contract address that relays calls to the delegated wallet. */\nexport const RELAYER_CONTRACT_ADDRESS: Hex =\n '0x0fb50CBAd1B82005628bc8aF0f7A6D81Bf74cDCe';\n\n/** Default sponsored transaction validity duration in seconds (10 minutes). */\nexport const DEFAULT_VALID_FOR_SECONDS = 600;\n\n/** EIP-7702 delegation code prefix used to identify delegated accounts. */\nexport const DELEGATION_CODE_PREFIX = '0xef0100';\n\n/** ERC-7579 batch call with opData and auth mode identifier. */\nexport const BATCH_CALL_OPDATA_AUTH_MODE: Hex =\n '0x0100000000007821000100000000000000000000000000000000000000000000';\n\n/** EIP-712 typed data types for UGD AuthorizedExecutions signing. */\nexport const AUTHORIZED_EXECUTIONS_TYPES = {\n AuthorizedExecutions: [\n { name: 'calls', type: 'Execution[]' },\n { name: 'deadline', type: 'uint256' },\n { name: 'mode', type: 'bytes32' },\n { name: 'nonce', type: 'uint256' },\n { name: 'relayer', type: 'address' },\n ],\n Execution: [\n { name: 'target', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n} as const;\n\n/** Minimal ABI for the UGD contract's nonce validation function. */\nexport const UGD_ABI = [\n {\n inputs: [{ name: 'nonce', type: 'uint256' }],\n name: 'isNonceUsed',\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n","/**\n * Generates a cryptographically random 256-bit nonce.\n *\n * @returns A random bigint nonce.\n * @not-instrumented\n */\nexport const generateRandomNonce = (): bigint => {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n\n return bytes.reduce((acc, byte) => (acc << 8n) | BigInt(byte), 0n);\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getActiveNetworkData } from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\nimport type { Hex } from 'viem';\n\nimport type { EvmWalletAccount } from '../../EvmWalletAccount.types';\nimport { createPublicClientFromNetworkData } from '../../viem/createPublicClientFromNetworkData';\nimport { UGD_ABI } from '../constants';\nimport { generateRandomNonce } from '../generateRandomNonce';\n\ntype GenerateIntentNonceParams = {\n walletAccount: EvmWalletAccount;\n};\n\n/**\n * Generates a random bitmap nonce for UGD AuthorizedExecutions signing.\n *\n * Uses crypto.getRandomValues() for 256-bit randomness. Validates against\n * the on-chain isNonceUsed check as a safety measure, although collision\n * is essentially impossible with 256-bit random values.\n *\n * @param params.walletAccount - The wallet account whose delegation contract is checked.\n * @param [client] - The Dynamic client instance.\n * @returns A unique bigint nonce for the EIP-712 intent.\n * @not-instrumented\n */\nexport const generateIntentNonce = async (\n { walletAccount }: GenerateIntentNonceParams,\n client: DynamicClient\n): Promise<bigint> => {\n const nonce = generateRandomNonce();\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n client\n );\n\n assertDefined(\n networkData,\n `No network data found for wallet account ${walletAccount.address}`\n );\n\n const publicClient = createPublicClientFromNetworkData({ networkData });\n\n try {\n // Call isNonceUsed on the wallet address because UGD code is\n // delegated to the EOA via EIP-7702\n const isUsed = await publicClient.readContract({\n abi: UGD_ABI,\n address: walletAccount.address as Hex,\n args: [nonce],\n functionName: 'isNonceUsed',\n });\n\n if (isUsed) {\n return generateRandomNonce();\n }\n } catch {\n // Contract call may fail if delegation is not yet active —\n // the nonce is still safe to use since it was randomly generated\n }\n\n return nonce;\n};\n","import { assertDefined } from '@dynamic-labs-sdk/client/core';\nimport type { Hex } from 'viem';\nimport type { SignAuthorizationReturnType } from 'viem/accounts';\n\nimport type { SerializedAuthorization } from '../gasless.types';\n\n/**\n * Converts a viem SignAuthorizationReturnType into a plain serializable object\n * suitable for JSON transport to the sponsorship API.\n *\n * @not-instrumented\n */\nexport const toSerializedAuthorization = (\n auth: SignAuthorizationReturnType\n): SerializedAuthorization => {\n // viem's Signature type allows legacy v-only signatures without yParity.\n // Our signing flow should always produce yParity, but a wrong value would silently produce invalid authorizations.\n assertDefined(auth.yParity, 'Signed authorization is missing yParity');\n\n return {\n address: auth.address,\n chainId: auth.chainId,\n nonce: auth.nonce,\n r: auth.r as Hex,\n s: auth.s as Hex,\n yParity: auth.yParity,\n };\n};\n","import { getActiveNetworkData } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n getDefaultClient,\n} from '@dynamic-labs-sdk/client/core';\nimport type { Hex } from 'viem';\nimport type { SignAuthorizationReturnType } from 'viem/accounts';\n\nimport type { EvmWalletAccount } from '../../EvmWalletAccount.types';\nimport {\n AUTHORIZED_EXECUTIONS_TYPES,\n BATCH_CALL_OPDATA_AUTH_MODE,\n DEFAULT_VALID_FOR_SECONDS,\n DELEGATION_CONTRACT_ADDRESS,\n RELAYER_CONTRACT_ADDRESS,\n} from '../constants';\nimport { generateIntentNonce } from '../generateIntentNonce';\nimport { toSerializedAuthorization } from '../toSerializedAuthorization';\nimport type {\n SignedSponsoredTransaction,\n SponsoredTransactionCall,\n} from '../gasless.types';\nimport { createWalletClientForWalletAccount } from '../../viem/createWalletClientForWalletAccount';\nimport { mapNetworkDataToViemChain } from '../../viem/utils/mapNetworkDataToViemChain';\n\ntype SignSponsoredTransactionParams = {\n /** Pre-signed EIP-7702 authorization to include in the payload. */\n authorization?: SignAuthorizationReturnType;\n /** The batch of calls to execute. */\n calls: SponsoredTransactionCall[];\n /** How long the signed intent remains valid, in seconds. Defaults to 600 (10 minutes). */\n validForSeconds?: number;\n /** The EVM wallet account to sign the transaction for. */\n walletAccount: EvmWalletAccount;\n};\n\n/**\n * Signs a sponsored transaction by creating an EIP-712 intent signature.\n *\n * If an authorization is provided, it is serialized and included in the\n * payload. Otherwise the intent is signed without any authorization\n * (caller manages delegation separately).\n *\n * @param params.walletAccount - The EVM wallet account to sign with.\n * @param params.calls - The batch of calls to execute.\n * @param [params.authorization] - Pre-signed EIP-7702 authorization to include.\n * @param [params.validForSeconds] - How long the signed intent remains valid, in seconds. Defaults to 600 (10 minutes).\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns The signed sponsored transaction payload ready to be sent to the API.\n * @not-instrumented\n */\nexport const signSponsoredTransaction = async (\n {\n walletAccount,\n calls,\n authorization,\n validForSeconds = DEFAULT_VALID_FOR_SECONDS,\n }: SignSponsoredTransactionParams,\n client = getDefaultClient()\n): Promise<SignedSponsoredTransaction> => {\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n client\n );\n\n assertDefined(\n networkData,\n `No network data found for wallet account ${walletAccount.address}`\n );\n\n const nonce = await generateIntentNonce({ walletAccount }, client);\n\n const deadline = BigInt(\n Math.floor(Date.now() / 1000) + validForSeconds\n );\n\n const chainId = mapNetworkDataToViemChain(networkData).id;\n\n const walletClient = await createWalletClientForWalletAccount(\n { walletAccount },\n client\n );\n\n const signature = await walletClient.signTypedData({\n domain: {\n chainId,\n verifyingContract: DELEGATION_CONTRACT_ADDRESS,\n },\n message: {\n calls: calls.map((c) => ({\n data: c.data,\n target: c.target,\n value: c.value,\n })),\n deadline,\n mode: BATCH_CALL_OPDATA_AUTH_MODE,\n nonce,\n relayer: RELAYER_CONTRACT_ADDRESS,\n },\n primaryType: 'AuthorizedExecutions',\n types: AUTHORIZED_EXECUTIONS_TYPES,\n });\n\n return {\n authorization: authorization\n ? toSerializedAuthorization(authorization)\n : undefined,\n calls,\n chainId,\n deadline: deadline.toString(),\n nonce: nonce.toString(),\n relayer: RELAYER_CONTRACT_ADDRESS,\n signature: signature as Hex,\n walletAddress: walletAccount.address as Hex,\n };\n};\n","import {\n createApiClient,\n getCore,\n getDefaultClient,\n} from '@dynamic-labs-sdk/client/core';\nimport type { SignAuthorizationReturnType } from 'viem/accounts';\n\nimport type { EvmWalletAccount } from '../../EvmWalletAccount.types';\nimport { SponsorTransactionError } from '../../errors/SponsorTransactionError';\nimport { DEFAULT_VALID_FOR_SECONDS } from '../constants';\nimport type {\n SignedSponsoredTransaction,\n SponsoredTransactionCall,\n} from '../gasless.types';\nimport { signSponsoredTransaction } from '../signSponsoredTransaction';\n\ntype RelaySponsoredTransactionWithCallsParams = {\n /** Pre-signed EIP-7702 authorization to include in the payload. */\n authorization?: SignAuthorizationReturnType;\n /** The batch of calls to execute. */\n calls: SponsoredTransactionCall[];\n /** How long the signed intent remains valid, in seconds. Defaults to 600 (10 minutes). */\n validForSeconds?: number;\n /** The EVM wallet account to sign and relay the transaction for. */\n walletAccount: EvmWalletAccount;\n};\n\ntype RelaySponsoredTransactionWithSignedTxParams = {\n /** A pre-signed sponsored transaction payload from signSponsoredTransaction. */\n signedTransaction: SignedSponsoredTransaction;\n};\n\ntype RelaySponsoredTransactionParams =\n | RelaySponsoredTransactionWithCallsParams\n | RelaySponsoredTransactionWithSignedTxParams;\n\nconst isSignedTransactionParams = (\n params: RelaySponsoredTransactionParams,\n): params is RelaySponsoredTransactionWithSignedTxParams =>\n 'signedTransaction' in params;\n\n/**\n * Relays a sponsored EVM transaction to the Dynamic backend.\n *\n * Accepts either a pre-signed transaction or unsigned calls. When given\n * unsigned calls, signs the transaction first via signSponsoredTransaction.\n *\n * The backend encodes the transaction, submits it to the relay provider,\n * and returns a request ID for tracking. The relay may retry the on-chain\n * submission, so the request ID (not a transaction hash) is the stable\n * identifier for the sponsored transaction.\n *\n * @param params - Either { signedTransaction } or { walletAccount, calls, ... }.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object containing the request ID for tracking the relayed transaction.\n * @throws {SponsorTransactionError} If the API call fails or returns an unexpected response.\n * @not-instrumented\n */\nexport const relaySponsoredTransaction = async (\n params: RelaySponsoredTransactionParams,\n client = getDefaultClient(),\n): Promise<{ requestId: string }> => {\n const signedTransaction = isSignedTransactionParams(params)\n ? params.signedTransaction\n : await signSponsoredTransaction(\n {\n authorization: params.authorization,\n calls: params.calls,\n validForSeconds: params.validForSeconds ?? DEFAULT_VALID_FOR_SECONDS,\n walletAccount: params.walletAccount,\n },\n client,\n );\n\n const core = getCore(client);\n const apiClient = createApiClient({}, client);\n\n let data: { requestId?: string };\n\n try {\n data = await apiClient.sponsorEVMTransaction({\n environmentId: core.environmentId,\n sponsorEVMTransactionRequest: {\n authorization: signedTransaction.authorization,\n calls: signedTransaction.calls.map((c) => ({\n data: c.data,\n target: c.target,\n value: c.value.toString(),\n })),\n chainId: signedTransaction.chainId,\n deadline: signedTransaction.deadline,\n nonce: signedTransaction.nonce,\n relayer: signedTransaction.relayer,\n signature: signedTransaction.signature,\n walletAddress: signedTransaction.walletAddress,\n },\n });\n } catch (error) {\n const cause = error instanceof Error ? error : null;\n throw new SponsorTransactionError(cause);\n }\n\n if (!data.requestId) {\n throw new SponsorTransactionError();\n }\n\n return { requestId: data.requestId };\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport type { Hex } from 'viem';\n\nimport { SponsorTransactionError } from '../../errors/SponsorTransactionError';\nimport { getEVMSponsoredTransactionStatus } from '../getEVMSponsoredTransactionStatus';\n\nconst POLL_INTERVAL_MS = 2_000;\nconst TIMEOUT_MS = 60_000;\nconst MAX_POLLING_ATTEMPTS = TIMEOUT_MS / POLL_INTERVAL_MS;\n\ntype WaitForSponsoredTransactionParams = {\n /** The request ID returned by `relaySponsoredTransaction` / `sendSponsoredTransaction`. */\n requestId: string;\n};\n\n/**\n * Polls `getEVMSponsoredTransactionStatus` until the relay reaches a terminal\n * state and returns the on-chain transaction hash.\n *\n * Resolves on `CONFIRMED`. Throws `SponsorTransactionError` on terminal\n * failure statuses (`FAILED`, `CANCELED`, `EXPIRED`, `REJECTED`) or after a\n * 60s timeout.\n *\n * @param params.requestId - The request ID returned when the transaction was relayed.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object containing the on-chain transaction hash.\n * @throws {SponsorTransactionError} If the relay returns a terminal failure or polling times out.\n * @not-instrumented\n */\nexport const waitForSponsoredTransaction = async (\n { requestId }: WaitForSponsoredTransactionParams,\n client = getDefaultClient(),\n): Promise<{ transactionHash: Hex }> => {\n for (let attempt = 0; attempt < MAX_POLLING_ATTEMPTS; attempt++) {\n const result = await getEVMSponsoredTransactionStatus(\n { requestId },\n client,\n );\n\n switch (result.status) {\n case 'CONFIRMED':\n if (!result.transactionHash) {\n throw new SponsorTransactionError();\n }\n return { transactionHash: result.transactionHash };\n\n case 'CANCELED':\n case 'EXPIRED':\n case 'FAILED':\n case 'REJECTED':\n throw new SponsorTransactionError(null, result.errorMessage);\n\n case 'PENDING':\n case 'SENT':\n case 'SUBMITTED':\n break;\n }\n\n if (attempt < MAX_POLLING_ATTEMPTS - 1) {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, POLL_INTERVAL_MS),\n );\n }\n }\n\n throw new SponsorTransactionError(\n null,\n `Timed out waiting for sponsored transaction ${requestId}`,\n );\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport type { Hex } from 'viem';\nimport type { SignAuthorizationReturnType } from 'viem/accounts';\n\nimport type { EvmWalletAccount } from '../../EvmWalletAccount.types';\nimport type {\n SignedSponsoredTransaction,\n SponsoredTransactionCall,\n} from '../gasless.types';\nimport { relaySponsoredTransaction } from '../relaySponsoredTransaction';\nimport { waitForSponsoredTransaction } from '../waitForSponsoredTransaction';\n\ntype SendSponsoredTransactionWithCallsParams = {\n /** Pre-signed EIP-7702 authorization to include in the payload. */\n authorization?: SignAuthorizationReturnType;\n /** The batch of calls to execute. */\n calls: SponsoredTransactionCall[];\n /** How long the signed intent remains valid, in seconds. Defaults to 600 (10 minutes). */\n validForSeconds?: number;\n /** The EVM wallet account to sign and send the transaction for. */\n walletAccount: EvmWalletAccount;\n};\n\ntype SendSponsoredTransactionWithSignedTxParams = {\n /** A pre-signed sponsored transaction payload from signSponsoredTransaction. */\n signedTransaction: SignedSponsoredTransaction;\n};\n\ntype SendSponsoredTransactionParams =\n | SendSponsoredTransactionWithCallsParams\n | SendSponsoredTransactionWithSignedTxParams;\n\n/**\n * Sends a sponsored EVM transaction and waits for the on-chain transaction hash.\n *\n * Accepts either a pre-signed transaction or unsigned calls. When given\n * unsigned calls, signs the transaction first via signSponsoredTransaction.\n * Relays the transaction and polls until the relay reports a CONFIRMED\n * status, then returns the resulting transaction hash.\n *\n * @param params - Either { signedTransaction } or { walletAccount, calls, ... }.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object containing the on-chain transaction hash.\n * @throws {SponsorTransactionError} If the relay returns a terminal failure or polling times out.\n * @not-instrumented\n */\nexport const sendSponsoredTransaction = async (\n params: SendSponsoredTransactionParams,\n client = getDefaultClient(),\n): Promise<{ transactionHash: Hex }> => {\n const { requestId } = await relaySponsoredTransaction(params, client);\n return waitForSponsoredTransaction({ requestId }, client);\n};\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport {\n name as packageName,\n version as packageVersion,\n} from '../../package.json';\nassertPackageVersion(packageName, packageVersion);\n\nexport { addEvmExtension } from '../addEvmExtension';\nexport { EvmGasSponsorshipNotEnabledError } from '../errors/EvmGasSponsorshipNotEnabledError';\nexport { RpcError } from '../errors/RpcError';\nexport { SponsorTransactionError } from '../errors/SponsorTransactionError';\nexport type { EvmNetworkProvider } from '../EvmNetworkProvider';\nexport type { EvmWalletAccount } from '../EvmWalletAccount.types';\nexport type { EvmWalletProvider } from '../EvmWalletProvider.types';\nexport type {\n SerializedAuthorization,\n SignedSponsoredTransaction,\n SponsoredTransactionCall,\n SponsoredTransactionStatus,\n SponsoredTransactionStatusResult,\n} from '../gasless/gasless.types';\nexport { getEVMSponsoredTransactionStatus } from '../gasless/getEVMSponsoredTransactionStatus';\nexport { isEvmGasSponsorshipEnabled } from '../gasless/isEvmGasSponsorshipEnabled';\nexport { isEvmNetworkProvider } from '../isEvmNetworkProvider';\nexport { simulateEvmTransaction } from '../simulateEvmTransaction';\nexport type {\n EvmSimulationResult,\n EvmTransactionFeeData,\n EvmTransactionToSimulate,\n} from '../transactionSimulation.types';\nexport { calculateEvmTransactionFee } from '../utils/calculateEvmTransactionFee';\nexport { isEvmWalletAccount } from '../utils/isEvmWalletAccount';\nexport { relaySponsoredTransaction } from '../gasless/relaySponsoredTransaction';\nexport { sendSponsoredTransaction } from '../gasless/sendSponsoredTransaction';\nexport { signSponsoredTransaction } from '../gasless/signSponsoredTransaction';\nexport { waitForSponsoredTransaction } from '../gasless/waitForSponsoredTransaction';\n"],"mappings":"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"}