@dynamic-labs-sdk/evm 1.0.0 → 1.2.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.
- package/dist/{addEIP6963Extension-6WKcoc6j.cjs → addEIP6963Extension-BrxoI3fh.cjs} +3 -3
- package/dist/{addEIP6963Extension-6WKcoc6j.cjs.map → addEIP6963Extension-BrxoI3fh.cjs.map} +1 -1
- package/dist/{addEIP6963Extension-1jrwxkRl.esm.js → addEIP6963Extension-CTfW3lKP.esm.js} +3 -3
- package/dist/{addEIP6963Extension-1jrwxkRl.esm.js.map → addEIP6963Extension-CTfW3lKP.esm.js.map} +1 -1
- package/dist/{addEIP6963Extension-J6SledVr.native.esm.js → addEIP6963Extension-C_IKf5DD.native.esm.js} +1 -1
- package/dist/{addEIP6963Extension-J6SledVr.native.esm.js.map → addEIP6963Extension-C_IKf5DD.native.esm.js.map} +1 -1
- package/dist/{addWaasEvmExtension-BPKFUV3U.cjs → addWaasEvmExtension-CTYf_o8f.cjs} +5 -5
- package/dist/{addWaasEvmExtension-BPKFUV3U.cjs.map → addWaasEvmExtension-CTYf_o8f.cjs.map} +1 -1
- package/dist/{addWaasEvmExtension-CctMlyNt.esm.js → addWaasEvmExtension-DnfMMvBS.esm.js} +7 -7
- package/dist/addWaasEvmExtension-DnfMMvBS.esm.js.map +1 -0
- package/dist/{addWaasEvmExtension-U4DO_WKC.native.esm.js → addWaasEvmExtension-L8dUNmj8.native.esm.js} +8 -8
- package/dist/addWaasEvmExtension-L8dUNmj8.native.esm.js.map +1 -0
- package/dist/baseAccount.cjs +4 -4
- package/dist/baseAccount.esm.js +6 -6
- package/dist/baseAccount.esm.js.map +1 -1
- package/dist/baseAccount.native.esm.js +7 -7
- package/dist/baseAccount.native.esm.js.map +1 -1
- package/dist/{createWalletClientForWalletAccount-V4CfRjd4.native.esm.js → createWalletClientForWalletAccount-BotF25Kn.native.esm.js} +3 -3
- package/dist/createWalletClientForWalletAccount-BotF25Kn.native.esm.js.map +1 -0
- package/dist/{createWalletClientForWalletAccount-2HJ_yeO9.esm.js → createWalletClientForWalletAccount-CMD5kLVs.esm.js} +4 -4
- package/dist/createWalletClientForWalletAccount-CMD5kLVs.esm.js.map +1 -0
- package/dist/{createWalletClientForWalletAccount-BKMV0WzZ.cjs → createWalletClientForWalletAccount-DBAhi3L-.cjs} +3 -3
- package/dist/{createWalletClientForWalletAccount-BKMV0WzZ.cjs.map → createWalletClientForWalletAccount-DBAhi3L-.cjs.map} +1 -1
- package/dist/{createWalletProviderFromEIP1193Provider-CBbP9cb2.cjs → createWalletProviderFromEIP1193Provider-B_XDSRZ9.cjs} +4 -4
- package/dist/{createWalletProviderFromEIP1193Provider-CBbP9cb2.cjs.map → createWalletProviderFromEIP1193Provider-B_XDSRZ9.cjs.map} +1 -1
- package/dist/{createWalletProviderFromEIP1193Provider-DnPhiRmj.native.esm.js → createWalletProviderFromEIP1193Provider-CWWLWjod.native.esm.js} +4 -4
- package/dist/{createWalletProviderFromEIP1193Provider-DnPhiRmj.native.esm.js.map → createWalletProviderFromEIP1193Provider-CWWLWjod.native.esm.js.map} +1 -1
- package/dist/{createWalletProviderFromEIP1193Provider-BdZcBFWx.esm.js → createWalletProviderFromEIP1193Provider-ChSmbI-a.esm.js} +4 -4
- package/dist/{createWalletProviderFromEIP1193Provider-BdZcBFWx.esm.js.map → createWalletProviderFromEIP1193Provider-ChSmbI-a.esm.js.map} +1 -1
- package/dist/eip6963.cjs +4 -4
- package/dist/eip6963.esm.js +4 -4
- package/dist/eip6963.native.esm.js +2 -2
- package/dist/{evmTransferAmount-B__79nVn.native.esm.js → evmTransferAmount-BY0rW4dg.native.esm.js} +3 -3
- package/dist/{evmTransferAmount-B__79nVn.native.esm.js.map → evmTransferAmount-BY0rW4dg.native.esm.js.map} +1 -1
- package/dist/{evmTransferAmount-D1PZCZks.esm.js → evmTransferAmount-C4vCjuss.esm.js} +3 -3
- package/dist/{evmTransferAmount-D1PZCZks.esm.js.map → evmTransferAmount-C4vCjuss.esm.js.map} +1 -1
- package/dist/{evmTransferAmount-BA5VR2bh.cjs → evmTransferAmount-DJCA1p9e.cjs} +3 -3
- package/dist/{evmTransferAmount-BA5VR2bh.cjs.map → evmTransferAmount-DJCA1p9e.cjs.map} +1 -1
- package/dist/exports/index.d.ts +3 -0
- package/dist/exports/index.d.ts.map +1 -1
- package/dist/gasless/activate7702Delegation/activate7702Delegation.d.ts +29 -0
- package/dist/gasless/activate7702Delegation/activate7702Delegation.d.ts.map +1 -0
- package/dist/gasless/activate7702Delegation/index.d.ts +2 -0
- package/dist/gasless/activate7702Delegation/index.d.ts.map +1 -0
- package/dist/gasless/constants.d.ts +0 -2
- package/dist/gasless/constants.d.ts.map +1 -1
- package/dist/gasless/create7702DelegationRegistry/create7702DelegationRegistry.d.ts +22 -0
- package/dist/gasless/create7702DelegationRegistry/create7702DelegationRegistry.d.ts.map +1 -0
- package/dist/gasless/create7702DelegationRegistry/index.d.ts +3 -0
- package/dist/gasless/create7702DelegationRegistry/index.d.ts.map +1 -0
- package/dist/gasless/gasless.types.d.ts +6 -4
- package/dist/gasless/gasless.types.d.ts.map +1 -1
- package/dist/gasless/get7702DelegationRegistry/get7702DelegationRegistry.d.ts +7 -0
- package/dist/gasless/get7702DelegationRegistry/get7702DelegationRegistry.d.ts.map +1 -0
- package/dist/gasless/get7702DelegationRegistry/index.d.ts +2 -0
- package/dist/gasless/get7702DelegationRegistry/index.d.ts.map +1 -0
- package/dist/gasless/getAvailableEvmGaslessRelayer/getAvailableEvmGaslessRelayer.d.ts +28 -0
- package/dist/gasless/getAvailableEvmGaslessRelayer/getAvailableEvmGaslessRelayer.d.ts.map +1 -0
- package/dist/gasless/getAvailableEvmGaslessRelayer/index.d.ts +2 -0
- package/dist/gasless/getAvailableEvmGaslessRelayer/index.d.ts.map +1 -0
- package/dist/gasless/is7702DelegationActive/index.d.ts +2 -0
- package/dist/gasless/is7702DelegationActive/index.d.ts.map +1 -0
- package/dist/gasless/is7702DelegationActive/is7702DelegationActive.d.ts +18 -0
- package/dist/gasless/is7702DelegationActive/is7702DelegationActive.d.ts.map +1 -0
- package/dist/gasless/relaySponsoredTransaction/relaySponsoredTransaction.d.ts +3 -1
- package/dist/gasless/relaySponsoredTransaction/relaySponsoredTransaction.d.ts.map +1 -1
- package/dist/gasless/resolveAuthorization/index.d.ts +2 -0
- package/dist/gasless/resolveAuthorization/index.d.ts.map +1 -0
- package/dist/gasless/resolveAuthorization/resolveAuthorization.d.ts +20 -0
- package/dist/gasless/resolveAuthorization/resolveAuthorization.d.ts.map +1 -0
- package/dist/gasless/sendSponsoredTransaction/sendSponsoredTransaction.d.ts +6 -4
- package/dist/gasless/sendSponsoredTransaction/sendSponsoredTransaction.d.ts.map +1 -1
- package/dist/gasless/sign7702Authorization/index.d.ts +2 -0
- package/dist/gasless/sign7702Authorization/index.d.ts.map +1 -0
- package/dist/gasless/sign7702Authorization/sign7702Authorization.d.ts +23 -0
- package/dist/gasless/sign7702Authorization/sign7702Authorization.d.ts.map +1 -0
- package/dist/gasless/signSponsoredTransaction/signSponsoredTransaction.d.ts +12 -6
- package/dist/gasless/signSponsoredTransaction/signSponsoredTransaction.d.ts.map +1 -1
- package/dist/gasless/waitForSponsoredTransaction/waitForSponsoredTransaction.d.ts +2 -6
- package/dist/gasless/waitForSponsoredTransaction/waitForSponsoredTransaction.d.ts.map +1 -1
- package/dist/index.cjs +459 -277
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +435 -256
- package/dist/index.esm.js.map +1 -1
- package/dist/index.native.esm.js +435 -256
- package/dist/index.native.esm.js.map +1 -1
- package/dist/{package-BxZgKgaF.native.esm.js → package-AXj9tSuC.native.esm.js} +2 -2
- package/dist/package-AXj9tSuC.native.esm.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/viem.cjs +1 -1
- package/dist/viem.esm.js +1 -1
- package/dist/viem.native.esm.js +2 -2
- package/dist/waas.cjs +3 -3
- package/dist/waas.esm.js +3 -3
- package/dist/waas.native.esm.js +4 -4
- package/dist/walletConnect/createWalletProviderFromEIP155Session/createWalletProviderFromEIP155Session.d.ts.map +1 -1
- package/dist/walletConnect.cjs +10 -4
- package/dist/walletConnect.cjs.map +1 -1
- package/dist/walletConnect.esm.js +15 -9
- package/dist/walletConnect.esm.js.map +1 -1
- package/dist/walletConnect.native.esm.js +16 -10
- package/dist/walletConnect.native.esm.js.map +1 -1
- package/dist/windowInjected.cjs +3 -3
- package/dist/windowInjected.esm.js +3 -3
- package/dist/windowInjected.native.esm.js +4 -4
- package/package.json +5 -5
- package/dist/addWaasEvmExtension-CctMlyNt.esm.js.map +0 -1
- package/dist/addWaasEvmExtension-U4DO_WKC.native.esm.js.map +0 -1
- package/dist/createWalletClientForWalletAccount-2HJ_yeO9.esm.js.map +0 -1
- package/dist/createWalletClientForWalletAccount-V4CfRjd4.native.esm.js.map +0 -1
- package/dist/package-BxZgKgaF.native.esm.js.map +0 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,44 +1,14 @@
|
|
|
1
|
-
import { a as version, i as name, n as createPublicClientFromNetworkData, r as mapNetworkDataToViemChain, t as createWalletClientForWalletAccount } from "./createWalletClientForWalletAccount-
|
|
2
|
-
import { i as isEvmWalletAccount, o as RpcError } from "./evmTransferAmount-
|
|
3
|
-
import "./createWalletProviderFromEIP1193Provider-
|
|
4
|
-
import { t as addEIP6963Extension } from "./addEIP6963Extension-
|
|
5
|
-
import { t as addWaasEvmExtension } from "./addWaasEvmExtension-
|
|
1
|
+
import { a as version, i as name, n as createPublicClientFromNetworkData, r as mapNetworkDataToViemChain, t as createWalletClientForWalletAccount } from "./createWalletClientForWalletAccount-CMD5kLVs.esm.js";
|
|
2
|
+
import { i as isEvmWalletAccount, o as RpcError } from "./evmTransferAmount-C4vCjuss.esm.js";
|
|
3
|
+
import "./createWalletProviderFromEIP1193Provider-ChSmbI-a.esm.js";
|
|
4
|
+
import { t as addEIP6963Extension } from "./addEIP6963Extension-CTfW3lKP.esm.js";
|
|
5
|
+
import { t as addWaasEvmExtension } from "./addWaasEvmExtension-DnfMMvBS.esm.js";
|
|
6
6
|
import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { BaseError, FeeEstimationFailedError, InvalidParamError, SimulationFailedError, getActiveNetworkData, getDefaultClient, getNetworksData } from "@dynamic-labs-sdk/client";
|
|
8
|
+
import { assertDefined, createApiClient, createRuntimeServiceAccessKey, getCore, getDefaultClient as getDefaultClient$1 } from "@dynamic-labs-sdk/client/core";
|
|
9
9
|
import { formatEther } from "viem";
|
|
10
|
+
import { signAuthorization } from "viem/actions";
|
|
10
11
|
|
|
11
|
-
//#region src/addEvmExtension/addEvmExtension.ts
|
|
12
|
-
/**
|
|
13
|
-
* Adds the EVM extension to the Dynamic client.
|
|
14
|
-
*
|
|
15
|
-
* This is a convenience function that adds both the EIP-6963 extension
|
|
16
|
-
* and the Dynamic WaaS EVM extension, enabling support for all EVM wallet types
|
|
17
|
-
* including standard wallets and embedded wallets managed by Dynamic's infrastructure.
|
|
18
|
-
*
|
|
19
|
-
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
20
|
-
* @not-instrumented
|
|
21
|
-
*/
|
|
22
|
-
const addEvmExtension = (client = getDefaultClient()) => {
|
|
23
|
-
addEIP6963Extension(client);
|
|
24
|
-
addWaasEvmExtension(client);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
//#endregion
|
|
28
|
-
//#region src/errors/EvmGasSponsorshipNotEnabledError/EvmGasSponsorshipNotEnabledError.ts
|
|
29
|
-
var EvmGasSponsorshipNotEnabledError = class extends 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
12
|
//#region src/errors/SponsorTransactionError/SponsorTransactionError.ts
|
|
43
13
|
var SponsorTransactionError = class extends BaseError {
|
|
44
14
|
constructor(cause, details) {
|
|
@@ -53,197 +23,14 @@ var SponsorTransactionError = class extends BaseError {
|
|
|
53
23
|
}
|
|
54
24
|
};
|
|
55
25
|
|
|
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 = getDefaultClient()) => {
|
|
73
|
-
const core = getCore(client);
|
|
74
|
-
const apiClient = 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 = getDefaultClient$1()) => {
|
|
101
|
-
assertDefined(client.projectSettings, "Project settings are not defined");
|
|
102
|
-
return client.projectSettings.sdk.embeddedWallets?.evmGasSponsorshipEnabled ?? false;
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
//#endregion
|
|
106
|
-
//#region src/isEvmNetworkProvider/isEvmNetworkProvider.ts
|
|
107
|
-
/**
|
|
108
|
-
* Type guard function to check if a network provider is an EVM network provider.
|
|
109
|
-
*
|
|
110
|
-
* @param networkProvider - The network provider to check.
|
|
111
|
-
* @returns True if the network provider is an EVM network provider, false otherwise.
|
|
112
|
-
* @not-instrumented
|
|
113
|
-
*/
|
|
114
|
-
const isEvmNetworkProvider = (networkProvider) => networkProvider.chain === "EVM";
|
|
115
|
-
|
|
116
|
-
//#endregion
|
|
117
|
-
//#region src/utils/calculateEvmTransactionFee/calculateEvmTransactionFee.ts
|
|
118
|
-
/**
|
|
119
|
-
* Calculates the estimated fee for an EVM transaction.
|
|
120
|
-
*
|
|
121
|
-
* This function estimates gas usage and calculates the total transaction fee
|
|
122
|
-
* using either legacy gas pricing or EIP-1559 pricing. The fee is returned
|
|
123
|
-
* in both native units (wei) and human-readable format (ETH).
|
|
124
|
-
*
|
|
125
|
-
* @param params.transaction - The transaction to estimate fees for.
|
|
126
|
-
* @param params.networkData - Network configuration for RPC connection.
|
|
127
|
-
* @param params.nativeTokenPriceUsd - Optional USD price of the native token for fee conversion.
|
|
128
|
-
* @returns Fee data including gas estimates and human-readable amounts.
|
|
129
|
-
* @throws {FeeEstimationFailedError} If gas estimation or fee retrieval fails.
|
|
130
|
-
* @not-instrumented
|
|
131
|
-
*/
|
|
132
|
-
const calculateEvmTransactionFee = async ({ transaction, networkData, nativeTokenPriceUsd }) => {
|
|
133
|
-
try {
|
|
134
|
-
const publicClient = createPublicClientFromNetworkData({ networkData });
|
|
135
|
-
const gasEstimate = await publicClient.estimateGas({
|
|
136
|
-
account: transaction.from,
|
|
137
|
-
data: transaction.data,
|
|
138
|
-
to: transaction.to,
|
|
139
|
-
value: transaction.value
|
|
140
|
-
});
|
|
141
|
-
let maxFeePerGas;
|
|
142
|
-
let maxPriorityFeePerGas;
|
|
143
|
-
let gasPrice;
|
|
144
|
-
let nativeAmount;
|
|
145
|
-
try {
|
|
146
|
-
const feeData = await publicClient.estimateFeesPerGas();
|
|
147
|
-
maxFeePerGas = feeData.maxFeePerGas;
|
|
148
|
-
maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;
|
|
149
|
-
nativeAmount = gasEstimate * maxFeePerGas;
|
|
150
|
-
} catch {
|
|
151
|
-
gasPrice = await publicClient.getGasPrice();
|
|
152
|
-
nativeAmount = gasEstimate * gasPrice;
|
|
153
|
-
}
|
|
154
|
-
const humanReadableAmount = formatEther(nativeAmount);
|
|
155
|
-
const usdAmount = nativeTokenPriceUsd ? (Number(humanReadableAmount) * nativeTokenPriceUsd).toFixed(2) : void 0;
|
|
156
|
-
return {
|
|
157
|
-
gasEstimate,
|
|
158
|
-
gasPrice,
|
|
159
|
-
humanReadableAmount,
|
|
160
|
-
maxFeePerGas,
|
|
161
|
-
maxPriorityFeePerGas,
|
|
162
|
-
nativeAmount,
|
|
163
|
-
usdAmount
|
|
164
|
-
};
|
|
165
|
-
} catch (error) {
|
|
166
|
-
throw new FeeEstimationFailedError({
|
|
167
|
-
cause: error instanceof Error ? error : void 0,
|
|
168
|
-
message: "Failed to estimate EVM transaction fee"
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
//#endregion
|
|
174
|
-
//#region src/simulateEvmTransaction/simulateEvmTransaction.ts
|
|
175
|
-
/**
|
|
176
|
-
* Simulates an EVM transaction to preview its effects before execution.
|
|
177
|
-
*
|
|
178
|
-
* This function uses the Blockaid API to analyze the transaction and returns
|
|
179
|
-
* information about asset transfers, security validation, and optionally fee estimates.
|
|
180
|
-
* The simulation shows what will happen when the transaction is executed without
|
|
181
|
-
* actually sending it to the blockchain.
|
|
182
|
-
*
|
|
183
|
-
* @param params.walletAccount - The EVM wallet account that will sign the transaction.
|
|
184
|
-
* @param params.transaction - The transaction to simulate, including network ID.
|
|
185
|
-
* @param params.includeFees - Whether to calculate transaction fees (default: false).
|
|
186
|
-
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
187
|
-
* @returns Simulation result with asset diffs, security validation, and optional fee data.
|
|
188
|
-
* @throws {InvalidParamError} If wallet account is not an EVM account or network ID is not configured.
|
|
189
|
-
* @throws {SimulationFailedError} If the simulation API call fails.
|
|
190
|
-
* @throws {FeeEstimationFailedError} If includeFees is true and fee calculation fails.
|
|
191
|
-
* @not-instrumented
|
|
192
|
-
*/
|
|
193
|
-
const simulateEvmTransaction = async ({ walletAccount, transaction, includeFees = false }, client = getDefaultClient$1()) => {
|
|
194
|
-
if (!isEvmWalletAccount(walletAccount)) throw new InvalidParamError("Wallet account must be an EVM wallet account");
|
|
195
|
-
const networkData = getNetworksData(client).find((data) => data.networkId === transaction.networkId && data.chain === "EVM");
|
|
196
|
-
if (!networkData) throw new InvalidParamError(`Network with ID ${transaction.networkId} is not configured in project settings`);
|
|
197
|
-
try {
|
|
198
|
-
const core = getCore(client);
|
|
199
|
-
const apiClient = createApiClient({}, client);
|
|
200
|
-
const simulateEVMTransactionRequest = {
|
|
201
|
-
chainId: transaction.networkId,
|
|
202
|
-
data: transaction.data || "0x",
|
|
203
|
-
from: transaction.from,
|
|
204
|
-
to: transaction.to
|
|
205
|
-
};
|
|
206
|
-
if (transaction.value !== void 0) simulateEVMTransactionRequest.value = transaction.value.toString();
|
|
207
|
-
const response = await apiClient.simulateEVMTransaction({
|
|
208
|
-
environmentId: core.environmentId,
|
|
209
|
-
simulateEVMTransactionRequest
|
|
210
|
-
});
|
|
211
|
-
let feeData;
|
|
212
|
-
if (includeFees) feeData = await calculateEvmTransactionFee({
|
|
213
|
-
nativeTokenPriceUsd: response.priceData?.nativeTokenUsdPrice,
|
|
214
|
-
networkData,
|
|
215
|
-
transaction
|
|
216
|
-
});
|
|
217
|
-
return {
|
|
218
|
-
counterparties: response.counterparties,
|
|
219
|
-
feeData,
|
|
220
|
-
inAssets: response.inAssets || [],
|
|
221
|
-
outAssets: response.outAssets || [],
|
|
222
|
-
priceData: response.priceData,
|
|
223
|
-
showTotalFiat: response.showTotalFiat,
|
|
224
|
-
validation: response.validation ? {
|
|
225
|
-
description: response.validation.description,
|
|
226
|
-
reason: response.validation.reason,
|
|
227
|
-
result: response.validation.result
|
|
228
|
-
} : void 0
|
|
229
|
-
};
|
|
230
|
-
} catch (error) {
|
|
231
|
-
if (error instanceof FeeEstimationFailedError) throw error;
|
|
232
|
-
throw new SimulationFailedError({
|
|
233
|
-
cause: error instanceof Error ? error : void 0,
|
|
234
|
-
message: "Failed to simulate EVM transaction"
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
};
|
|
238
|
-
|
|
239
26
|
//#endregion
|
|
240
27
|
//#region src/gasless/constants.ts
|
|
241
28
|
/** The Fireblocks Universal Gasless Delegate (UGD) contract address used for EIP-7702 delegation. */
|
|
242
29
|
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
30
|
/** Default sponsored transaction validity duration in seconds (10 minutes). */
|
|
246
31
|
const DEFAULT_VALID_FOR_SECONDS = 600;
|
|
32
|
+
/** EIP-7702 delegation code prefix used to identify delegated accounts. */
|
|
33
|
+
const DELEGATION_CODE_PREFIX = "0xef0100";
|
|
247
34
|
/** ERC-7579 batch call with opData and auth mode identifier. */
|
|
248
35
|
const BATCH_CALL_OPDATA_AUTH_MODE = "0x0100000000007821000100000000000000000000000000000000000000000000";
|
|
249
36
|
/** EIP-712 typed data types for UGD AuthorizedExecutions signing. */
|
|
@@ -344,6 +131,163 @@ const generateIntentNonce = async ({ walletAccount }, client) => {
|
|
|
344
131
|
return nonce;
|
|
345
132
|
};
|
|
346
133
|
|
|
134
|
+
//#endregion
|
|
135
|
+
//#region src/gasless/getAvailableEvmGaslessRelayer/getAvailableEvmGaslessRelayer.ts
|
|
136
|
+
/**
|
|
137
|
+
* Fetches the relayer address to embed in the EIP-712 sponsored-transaction
|
|
138
|
+
* intent for the given chain.
|
|
139
|
+
*
|
|
140
|
+
* The returned address is owned by the project's relay backend and is the
|
|
141
|
+
* eventual `from` of the on-chain broadcast. It must be set as the `relayer`
|
|
142
|
+
* field of the EIP-712 intent before signing — the on-chain delegate validates
|
|
143
|
+
* the signature against this address.
|
|
144
|
+
*
|
|
145
|
+
* @param params.chainId - The EVM chain ID the sponsored transaction targets.
|
|
146
|
+
* @param client - The Dynamic client instance.
|
|
147
|
+
* @returns The relayer address to embed in the EIP-712 intent.
|
|
148
|
+
* @throws {SponsorTransactionError} If the API call fails or returns no relayer address.
|
|
149
|
+
* @not-instrumented
|
|
150
|
+
*/
|
|
151
|
+
const getAvailableEvmGaslessRelayer = async ({ chainId }, client) => {
|
|
152
|
+
const core = getCore(client);
|
|
153
|
+
const apiClient = createApiClient({}, client);
|
|
154
|
+
let data;
|
|
155
|
+
try {
|
|
156
|
+
data = await apiClient.getAvailableEVMGaslessRelayer({
|
|
157
|
+
chainId,
|
|
158
|
+
environmentId: core.environmentId
|
|
159
|
+
});
|
|
160
|
+
} catch (error) {
|
|
161
|
+
throw new SponsorTransactionError(error instanceof Error ? error : null);
|
|
162
|
+
}
|
|
163
|
+
if (!data.relayerAddress) throw new SponsorTransactionError();
|
|
164
|
+
return { relayerAddress: data.relayerAddress };
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
//#endregion
|
|
168
|
+
//#region src/gasless/create7702DelegationRegistry/create7702DelegationRegistry.ts
|
|
169
|
+
/**
|
|
170
|
+
* Creates an in-memory registry that tracks which wallet+chain combinations
|
|
171
|
+
* have active EIP-7702 delegation. Only active delegations are cached —
|
|
172
|
+
* a missing entry means the status is unknown and should be checked via RPC.
|
|
173
|
+
*
|
|
174
|
+
* @not-instrumented
|
|
175
|
+
*/
|
|
176
|
+
const create7702DelegationRegistry = () => {
|
|
177
|
+
const delegated = /* @__PURE__ */ new Map();
|
|
178
|
+
const buildKey = ({ chainId, walletAddress }) => `${walletAddress.toLowerCase()}:${chainId}`;
|
|
179
|
+
return {
|
|
180
|
+
isDelegated: (params) => delegated.has(buildKey(params)),
|
|
181
|
+
markDelegated: (params) => {
|
|
182
|
+
delegated.set(buildKey(params), true);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
//#endregion
|
|
188
|
+
//#region src/gasless/get7702DelegationRegistry/get7702DelegationRegistry.ts
|
|
189
|
+
/**
|
|
190
|
+
* Returns the per-client EIP-7702 delegation registry, creating it on first access.
|
|
191
|
+
*
|
|
192
|
+
* @not-instrumented
|
|
193
|
+
*/
|
|
194
|
+
const get7702DelegationRegistry = createRuntimeServiceAccessKey("evm-7702-delegation-registry", () => create7702DelegationRegistry());
|
|
195
|
+
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/gasless/is7702DelegationActive/is7702DelegationActive.ts
|
|
198
|
+
/**
|
|
199
|
+
* Checks whether EIP-7702 delegation to the Dynamic gasless contract is active
|
|
200
|
+
* for the given wallet account on its current network.
|
|
201
|
+
*
|
|
202
|
+
* Results are cached per wallet+chain in an in-memory registry
|
|
203
|
+
*
|
|
204
|
+
* @param params.walletAccount - The EVM wallet account to check delegation status for.
|
|
205
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
206
|
+
* @returns True if the wallet has an active delegation to the gasless contract.
|
|
207
|
+
* @not-instrumented
|
|
208
|
+
*/
|
|
209
|
+
const is7702DelegationActive = async ({ walletAccount }, client = getDefaultClient$1()) => {
|
|
210
|
+
const { networkData } = await getActiveNetworkData({ walletAccount }, client);
|
|
211
|
+
assertDefined(networkData, `No network data found for wallet account ${walletAccount.address}`);
|
|
212
|
+
const chainId = mapNetworkDataToViemChain(networkData).id;
|
|
213
|
+
const registry = get7702DelegationRegistry(client);
|
|
214
|
+
if (registry.isDelegated({
|
|
215
|
+
chainId,
|
|
216
|
+
walletAddress: walletAccount.address
|
|
217
|
+
})) return true;
|
|
218
|
+
const bytecode = await createPublicClientFromNetworkData({ networkData }).getCode({ address: walletAccount.address });
|
|
219
|
+
if (!bytecode) return false;
|
|
220
|
+
const expectedPrefix = DELEGATION_CODE_PREFIX + DELEGATION_CONTRACT_ADDRESS.slice(2).toLowerCase();
|
|
221
|
+
const isActive = bytecode.toLowerCase().startsWith(expectedPrefix);
|
|
222
|
+
if (isActive) registry.markDelegated({
|
|
223
|
+
chainId,
|
|
224
|
+
walletAddress: walletAccount.address
|
|
225
|
+
});
|
|
226
|
+
return isActive;
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
//#endregion
|
|
230
|
+
//#region src/gasless/resolveChainId/resolveChainId.ts
|
|
231
|
+
/**
|
|
232
|
+
* Resolves a chain ID from either an explicit override or the wallet's active network.
|
|
233
|
+
*
|
|
234
|
+
* @param params.chainId - Explicit chain ID override.
|
|
235
|
+
* @param params.walletAccount - The wallet account to resolve the chain from.
|
|
236
|
+
* @param client - The Dynamic client instance.
|
|
237
|
+
* @returns The resolved chain ID.
|
|
238
|
+
* @not-instrumented
|
|
239
|
+
*/
|
|
240
|
+
const resolveChainId = async ({ chainId, walletAccount }, client) => {
|
|
241
|
+
if (chainId !== void 0) return chainId;
|
|
242
|
+
const { networkData } = await getActiveNetworkData({ walletAccount }, client);
|
|
243
|
+
assertDefined(networkData, `No network data found for wallet account ${walletAccount.address}`);
|
|
244
|
+
return mapNetworkDataToViemChain(networkData).id;
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
//#endregion
|
|
248
|
+
//#region src/gasless/sign7702Authorization/sign7702Authorization.ts
|
|
249
|
+
/**
|
|
250
|
+
* Signs an EIP-7702 authorization to delegate the wallet to the Dynamic
|
|
251
|
+
* gasless delegation contract.
|
|
252
|
+
*
|
|
253
|
+
* The signed authorization can be included in a sponsored transaction to
|
|
254
|
+
* activate the delegation on-chain. If no chainId is provided, the wallet's
|
|
255
|
+
* active network chain ID is used.
|
|
256
|
+
*
|
|
257
|
+
* @param params.walletAccount - The EVM wallet account to sign the authorization for.
|
|
258
|
+
* @param [params.chainId] - Override chain ID. Defaults to the wallet's active network.
|
|
259
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
260
|
+
* @returns The signed EIP-7702 authorization.
|
|
261
|
+
* @not-instrumented
|
|
262
|
+
*/
|
|
263
|
+
const sign7702Authorization = async ({ walletAccount, chainId }, client = getDefaultClient$1()) => {
|
|
264
|
+
return signAuthorization(await createWalletClientForWalletAccount({ walletAccount }, client), {
|
|
265
|
+
chainId: await resolveChainId({
|
|
266
|
+
chainId,
|
|
267
|
+
walletAccount
|
|
268
|
+
}, client),
|
|
269
|
+
contractAddress: DELEGATION_CONTRACT_ADDRESS
|
|
270
|
+
});
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
//#endregion
|
|
274
|
+
//#region src/gasless/resolveAuthorization/resolveAuthorization.ts
|
|
275
|
+
/**
|
|
276
|
+
* Resolves the EIP-7702 authorization for a sponsored transaction.
|
|
277
|
+
*
|
|
278
|
+
* Returns the provided authorization if given, auto-signs one if needed
|
|
279
|
+
* and autoDelegate is true, or returns undefined if the wallet is already
|
|
280
|
+
* delegated or autoDelegate is false.
|
|
281
|
+
*
|
|
282
|
+
* @not-instrumented
|
|
283
|
+
*/
|
|
284
|
+
const resolveAuthorization = async ({ authorization, autoDelegate, walletAccount }, client) => {
|
|
285
|
+
if (authorization) return authorization;
|
|
286
|
+
if (!autoDelegate) return;
|
|
287
|
+
if (await is7702DelegationActive({ walletAccount }, client)) return;
|
|
288
|
+
return sign7702Authorization({ walletAccount }, client);
|
|
289
|
+
};
|
|
290
|
+
|
|
347
291
|
//#endregion
|
|
348
292
|
//#region src/gasless/toSerializedAuthorization/toSerializedAuthorization.ts
|
|
349
293
|
/**
|
|
@@ -369,24 +313,34 @@ const toSerializedAuthorization = (auth) => {
|
|
|
369
313
|
/**
|
|
370
314
|
* Signs a sponsored transaction by creating an EIP-712 intent signature.
|
|
371
315
|
*
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
* (
|
|
316
|
+
* This function handles the complete signing flow:
|
|
317
|
+
* - If an authorization is provided, it is included in the payload.
|
|
318
|
+
* - If autoDelegate is true (default) and no authorization is provided,
|
|
319
|
+
* checks whether delegation is active and signs a 7702 authorization if needed.
|
|
320
|
+
* - If autoDelegate is false and no authorization is provided, the intent
|
|
321
|
+
* is signed without any authorization (user manages delegation separately).
|
|
375
322
|
*
|
|
376
323
|
* @param params.walletAccount - The EVM wallet account to sign with.
|
|
377
324
|
* @param params.calls - The batch of calls to execute.
|
|
378
|
-
* @param [params.authorization] - Pre-signed EIP-7702 authorization
|
|
325
|
+
* @param [params.authorization] - Pre-signed EIP-7702 authorization. Takes priority over autoDelegate.
|
|
326
|
+
* @param [params.autoDelegate] - Whether to auto-sign 7702 if not delegated. Defaults to true.
|
|
379
327
|
* @param [params.validForSeconds] - How long the signed intent remains valid, in seconds. Defaults to 600 (10 minutes).
|
|
380
328
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
381
329
|
* @returns The signed sponsored transaction payload ready to be sent to the API.
|
|
382
330
|
* @not-instrumented
|
|
383
331
|
*/
|
|
384
|
-
const signSponsoredTransaction = async ({ walletAccount, calls, authorization, validForSeconds = DEFAULT_VALID_FOR_SECONDS }, client = getDefaultClient()) => {
|
|
332
|
+
const signSponsoredTransaction = async ({ walletAccount, calls, authorization, autoDelegate = true, validForSeconds = DEFAULT_VALID_FOR_SECONDS }, client = getDefaultClient$1()) => {
|
|
385
333
|
const { networkData } = await getActiveNetworkData({ walletAccount }, client);
|
|
386
334
|
assertDefined(networkData, `No network data found for wallet account ${walletAccount.address}`);
|
|
335
|
+
const resolvedAuthorization = await resolveAuthorization({
|
|
336
|
+
authorization,
|
|
337
|
+
autoDelegate,
|
|
338
|
+
walletAccount
|
|
339
|
+
}, client);
|
|
387
340
|
const nonce = await generateIntentNonce({ walletAccount }, client);
|
|
388
341
|
const deadline = BigInt(Math.floor(Date.now() / 1e3) + validForSeconds);
|
|
389
342
|
const chainId = mapNetworkDataToViemChain(networkData).id;
|
|
343
|
+
const { relayerAddress } = await getAvailableEvmGaslessRelayer({ chainId }, client);
|
|
390
344
|
const signature = await (await createWalletClientForWalletAccount({ walletAccount }, client)).signTypedData({
|
|
391
345
|
domain: {
|
|
392
346
|
chainId,
|
|
@@ -401,18 +355,18 @@ const signSponsoredTransaction = async ({ walletAccount, calls, authorization, v
|
|
|
401
355
|
deadline,
|
|
402
356
|
mode: BATCH_CALL_OPDATA_AUTH_MODE,
|
|
403
357
|
nonce,
|
|
404
|
-
relayer:
|
|
358
|
+
relayer: relayerAddress
|
|
405
359
|
},
|
|
406
360
|
primaryType: "AuthorizedExecutions",
|
|
407
361
|
types: AUTHORIZED_EXECUTIONS_TYPES
|
|
408
362
|
});
|
|
409
363
|
return {
|
|
410
|
-
authorization:
|
|
364
|
+
authorization: resolvedAuthorization ? toSerializedAuthorization(resolvedAuthorization) : void 0,
|
|
411
365
|
calls,
|
|
412
366
|
chainId,
|
|
413
367
|
deadline: deadline.toString(),
|
|
414
368
|
nonce: nonce.toString(),
|
|
415
|
-
relayer:
|
|
369
|
+
relayer: relayerAddress,
|
|
416
370
|
signature,
|
|
417
371
|
walletAddress: walletAccount.address
|
|
418
372
|
};
|
|
@@ -438,9 +392,10 @@ const isSignedTransactionParams = (params) => "signedTransaction" in params;
|
|
|
438
392
|
* @throws {SponsorTransactionError} If the API call fails or returns an unexpected response.
|
|
439
393
|
* @not-instrumented
|
|
440
394
|
*/
|
|
441
|
-
const relaySponsoredTransaction = async (params, client = getDefaultClient()) => {
|
|
395
|
+
const relaySponsoredTransaction = async (params, client = getDefaultClient$1()) => {
|
|
442
396
|
const signedTransaction = isSignedTransactionParams(params) ? params.signedTransaction : await signSponsoredTransaction({
|
|
443
397
|
authorization: params.authorization,
|
|
398
|
+
autoDelegate: params.autoDelegate,
|
|
444
399
|
calls: params.calls,
|
|
445
400
|
validForSeconds: params.validForSeconds ?? DEFAULT_VALID_FOR_SECONDS,
|
|
446
401
|
walletAccount: params.walletAccount
|
|
@@ -473,17 +428,49 @@ const relaySponsoredTransaction = async (params, client = getDefaultClient()) =>
|
|
|
473
428
|
return { requestId: data.requestId };
|
|
474
429
|
};
|
|
475
430
|
|
|
431
|
+
//#endregion
|
|
432
|
+
//#region src/gasless/getEVMSponsoredTransactionStatus/getEVMSponsoredTransactionStatus.ts
|
|
433
|
+
/**
|
|
434
|
+
* Fetches the current relay state for a sponsored EVM transaction.
|
|
435
|
+
*
|
|
436
|
+
* Returns the lifecycle status, the on-chain transaction hash (when the relay
|
|
437
|
+
* has broadcast it), and any terminal-failure error message. Use this as the
|
|
438
|
+
* building block for custom polling flows; for the common "wait until done"
|
|
439
|
+
* case prefer `waitForSponsoredTransaction`.
|
|
440
|
+
*
|
|
441
|
+
* @param params.requestId - The request ID returned when the transaction was relayed.
|
|
442
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
443
|
+
* @returns The current status, optional transaction hash, and optional error message.
|
|
444
|
+
* @throws {SponsorTransactionError} If the API call fails.
|
|
445
|
+
* @not-instrumented
|
|
446
|
+
*/
|
|
447
|
+
const getEVMSponsoredTransactionStatus = async ({ requestId }, client = getDefaultClient$1()) => {
|
|
448
|
+
const core = getCore(client);
|
|
449
|
+
const apiClient = createApiClient({}, client);
|
|
450
|
+
let data;
|
|
451
|
+
try {
|
|
452
|
+
data = await apiClient.getEVMSponsoredTransactionStatus({
|
|
453
|
+
environmentId: core.environmentId,
|
|
454
|
+
requestId
|
|
455
|
+
});
|
|
456
|
+
} catch (error) {
|
|
457
|
+
throw new SponsorTransactionError(error instanceof Error ? error : null);
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
errorMessage: data.errorMessage,
|
|
461
|
+
status: data.status,
|
|
462
|
+
transactionHash: data.transactionHash
|
|
463
|
+
};
|
|
464
|
+
};
|
|
465
|
+
|
|
476
466
|
//#endregion
|
|
477
467
|
//#region src/gasless/waitForSponsoredTransaction/waitForSponsoredTransaction.ts
|
|
478
468
|
const POLL_INTERVAL_MS = 2e3;
|
|
479
469
|
const MAX_POLLING_ATTEMPTS = 6e4 / POLL_INTERVAL_MS;
|
|
470
|
+
const TERMINAL_FAILURE_STATUSES = new Set(["failure"]);
|
|
480
471
|
/**
|
|
481
|
-
* Polls `getEVMSponsoredTransactionStatus` until the relay
|
|
482
|
-
*
|
|
483
|
-
*
|
|
484
|
-
* Resolves on `CONFIRMED`. Throws `SponsorTransactionError` on terminal
|
|
485
|
-
* failure statuses (`FAILED`, `CANCELED`, `EXPIRED`, `REJECTED`) or after a
|
|
486
|
-
* 60s timeout.
|
|
472
|
+
* Polls `getEVMSponsoredTransactionStatus` until the relay reports the
|
|
473
|
+
* transaction has been included on-chain, then returns the transaction hash.
|
|
487
474
|
*
|
|
488
475
|
* @param params.requestId - The request ID returned when the transaction was relayed.
|
|
489
476
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
@@ -491,21 +478,11 @@ const MAX_POLLING_ATTEMPTS = 6e4 / POLL_INTERVAL_MS;
|
|
|
491
478
|
* @throws {SponsorTransactionError} If the relay returns a terminal failure or polling times out.
|
|
492
479
|
* @not-instrumented
|
|
493
480
|
*/
|
|
494
|
-
const waitForSponsoredTransaction = async ({ requestId }, client = getDefaultClient
|
|
481
|
+
const waitForSponsoredTransaction = async ({ requestId }, client = getDefaultClient()) => {
|
|
495
482
|
for (let attempt = 0; attempt < MAX_POLLING_ATTEMPTS; attempt++) {
|
|
496
483
|
const result = await getEVMSponsoredTransactionStatus({ requestId }, client);
|
|
497
|
-
|
|
498
|
-
|
|
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
|
-
}
|
|
484
|
+
if (TERMINAL_FAILURE_STATUSES.has(result.status)) throw new SponsorTransactionError(null, result.errorMessage);
|
|
485
|
+
if (result.transactionHash) return { transactionHash: result.transactionHash };
|
|
509
486
|
if (attempt < MAX_POLLING_ATTEMPTS - 1) await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
510
487
|
}
|
|
511
488
|
throw new SponsorTransactionError(null, `Timed out waiting for sponsored transaction ${requestId}`);
|
|
@@ -514,12 +491,12 @@ const waitForSponsoredTransaction = async ({ requestId }, client = getDefaultCli
|
|
|
514
491
|
//#endregion
|
|
515
492
|
//#region src/gasless/sendSponsoredTransaction/sendSponsoredTransaction.ts
|
|
516
493
|
/**
|
|
517
|
-
* Sends a sponsored EVM transaction and waits for
|
|
494
|
+
* Sends a sponsored EVM transaction and waits for on-chain inclusion.
|
|
518
495
|
*
|
|
519
496
|
* Accepts either a pre-signed transaction or unsigned calls. When given
|
|
520
497
|
* unsigned calls, signs the transaction first via signSponsoredTransaction.
|
|
521
|
-
* Relays the transaction and
|
|
522
|
-
*
|
|
498
|
+
* Relays the transaction and resolves as soon as the relay reports the
|
|
499
|
+
* transaction has been included on-chain.
|
|
523
500
|
*
|
|
524
501
|
* @param params - Either { signedTransaction } or { walletAccount, calls, ... }.
|
|
525
502
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
@@ -527,15 +504,217 @@ const waitForSponsoredTransaction = async ({ requestId }, client = getDefaultCli
|
|
|
527
504
|
* @throws {SponsorTransactionError} If the relay returns a terminal failure or polling times out.
|
|
528
505
|
* @not-instrumented
|
|
529
506
|
*/
|
|
530
|
-
const sendSponsoredTransaction = async (params, client = getDefaultClient
|
|
507
|
+
const sendSponsoredTransaction = async (params, client = getDefaultClient()) => {
|
|
531
508
|
const { requestId } = await relaySponsoredTransaction(params, client);
|
|
532
509
|
return waitForSponsoredTransaction({ requestId }, client);
|
|
533
510
|
};
|
|
534
511
|
|
|
512
|
+
//#endregion
|
|
513
|
+
//#region src/gasless/activate7702Delegation/activate7702Delegation.ts
|
|
514
|
+
/**
|
|
515
|
+
* Activates EIP-7702 delegation for a wallet by sending a sponsored
|
|
516
|
+
* transaction that only contains the 7702 authorization.
|
|
517
|
+
*
|
|
518
|
+
* After activation, the wallet's delegation is persisted on-chain and
|
|
519
|
+
* subsequent sponsored transactions no longer need to include the
|
|
520
|
+
* authorization.
|
|
521
|
+
*
|
|
522
|
+
* @param params.walletAccount - The EVM wallet account to activate delegation for.
|
|
523
|
+
* @param [params.authorization] - Pre-signed authorization. If omitted, signs one automatically.
|
|
524
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
525
|
+
* @returns An object containing the on-chain transaction hash.
|
|
526
|
+
* @throws {SponsorTransactionError} If the relay returns a terminal failure or polling times out.
|
|
527
|
+
* @not-instrumented
|
|
528
|
+
*/
|
|
529
|
+
const activate7702Delegation = async ({ walletAccount, authorization }, client = getDefaultClient()) => sendSponsoredTransaction({
|
|
530
|
+
authorization,
|
|
531
|
+
calls: [],
|
|
532
|
+
walletAccount
|
|
533
|
+
}, client);
|
|
534
|
+
|
|
535
|
+
//#endregion
|
|
536
|
+
//#region src/addEvmExtension/addEvmExtension.ts
|
|
537
|
+
/**
|
|
538
|
+
* Adds the EVM extension to the Dynamic client.
|
|
539
|
+
*
|
|
540
|
+
* This is a convenience function that adds both the EIP-6963 extension
|
|
541
|
+
* and the Dynamic WaaS EVM extension, enabling support for all EVM wallet types
|
|
542
|
+
* including standard wallets and embedded wallets managed by Dynamic's infrastructure.
|
|
543
|
+
*
|
|
544
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
545
|
+
* @not-instrumented
|
|
546
|
+
*/
|
|
547
|
+
const addEvmExtension = (client = getDefaultClient$1()) => {
|
|
548
|
+
addEIP6963Extension(client);
|
|
549
|
+
addWaasEvmExtension(client);
|
|
550
|
+
};
|
|
551
|
+
|
|
552
|
+
//#endregion
|
|
553
|
+
//#region src/errors/EvmGasSponsorshipNotEnabledError/EvmGasSponsorshipNotEnabledError.ts
|
|
554
|
+
var EvmGasSponsorshipNotEnabledError = class extends BaseError {
|
|
555
|
+
constructor() {
|
|
556
|
+
super({
|
|
557
|
+
cause: null,
|
|
558
|
+
code: "evm_gas_sponsorship_not_enabled_error",
|
|
559
|
+
docsUrl: null,
|
|
560
|
+
name: "EvmGasSponsorshipNotEnabledError",
|
|
561
|
+
shortMessage: "EVM gas sponsorship is not enabled for this project"
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
|
|
566
|
+
//#endregion
|
|
567
|
+
//#region src/gasless/isEvmGasSponsorshipEnabled/isEvmGasSponsorshipEnabled.ts
|
|
568
|
+
/**
|
|
569
|
+
* Checks if EVM gas sponsorship is enabled for the current project.
|
|
570
|
+
*
|
|
571
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
572
|
+
* @returns True if EVM gas sponsorship is enabled, false otherwise.
|
|
573
|
+
* @not-instrumented
|
|
574
|
+
*/
|
|
575
|
+
const isEvmGasSponsorshipEnabled = (client = getDefaultClient()) => {
|
|
576
|
+
assertDefined(client.projectSettings, "Project settings are not defined");
|
|
577
|
+
return client.projectSettings.sdk.embeddedWallets?.evmGasSponsorshipEnabled ?? false;
|
|
578
|
+
};
|
|
579
|
+
|
|
580
|
+
//#endregion
|
|
581
|
+
//#region src/isEvmNetworkProvider/isEvmNetworkProvider.ts
|
|
582
|
+
/**
|
|
583
|
+
* Type guard function to check if a network provider is an EVM network provider.
|
|
584
|
+
*
|
|
585
|
+
* @param networkProvider - The network provider to check.
|
|
586
|
+
* @returns True if the network provider is an EVM network provider, false otherwise.
|
|
587
|
+
* @not-instrumented
|
|
588
|
+
*/
|
|
589
|
+
const isEvmNetworkProvider = (networkProvider) => networkProvider.chain === "EVM";
|
|
590
|
+
|
|
591
|
+
//#endregion
|
|
592
|
+
//#region src/utils/calculateEvmTransactionFee/calculateEvmTransactionFee.ts
|
|
593
|
+
/**
|
|
594
|
+
* Calculates the estimated fee for an EVM transaction.
|
|
595
|
+
*
|
|
596
|
+
* This function estimates gas usage and calculates the total transaction fee
|
|
597
|
+
* using either legacy gas pricing or EIP-1559 pricing. The fee is returned
|
|
598
|
+
* in both native units (wei) and human-readable format (ETH).
|
|
599
|
+
*
|
|
600
|
+
* @param params.transaction - The transaction to estimate fees for.
|
|
601
|
+
* @param params.networkData - Network configuration for RPC connection.
|
|
602
|
+
* @param params.nativeTokenPriceUsd - Optional USD price of the native token for fee conversion.
|
|
603
|
+
* @returns Fee data including gas estimates and human-readable amounts.
|
|
604
|
+
* @throws {FeeEstimationFailedError} If gas estimation or fee retrieval fails.
|
|
605
|
+
* @not-instrumented
|
|
606
|
+
*/
|
|
607
|
+
const calculateEvmTransactionFee = async ({ transaction, networkData, nativeTokenPriceUsd }) => {
|
|
608
|
+
try {
|
|
609
|
+
const publicClient = createPublicClientFromNetworkData({ networkData });
|
|
610
|
+
const gasEstimate = await publicClient.estimateGas({
|
|
611
|
+
account: transaction.from,
|
|
612
|
+
data: transaction.data,
|
|
613
|
+
to: transaction.to,
|
|
614
|
+
value: transaction.value
|
|
615
|
+
});
|
|
616
|
+
let maxFeePerGas;
|
|
617
|
+
let maxPriorityFeePerGas;
|
|
618
|
+
let gasPrice;
|
|
619
|
+
let nativeAmount;
|
|
620
|
+
try {
|
|
621
|
+
const feeData = await publicClient.estimateFeesPerGas();
|
|
622
|
+
maxFeePerGas = feeData.maxFeePerGas;
|
|
623
|
+
maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;
|
|
624
|
+
nativeAmount = gasEstimate * maxFeePerGas;
|
|
625
|
+
} catch {
|
|
626
|
+
gasPrice = await publicClient.getGasPrice();
|
|
627
|
+
nativeAmount = gasEstimate * gasPrice;
|
|
628
|
+
}
|
|
629
|
+
const humanReadableAmount = formatEther(nativeAmount);
|
|
630
|
+
const usdAmount = nativeTokenPriceUsd ? (Number(humanReadableAmount) * nativeTokenPriceUsd).toFixed(2) : void 0;
|
|
631
|
+
return {
|
|
632
|
+
gasEstimate,
|
|
633
|
+
gasPrice,
|
|
634
|
+
humanReadableAmount,
|
|
635
|
+
maxFeePerGas,
|
|
636
|
+
maxPriorityFeePerGas,
|
|
637
|
+
nativeAmount,
|
|
638
|
+
usdAmount
|
|
639
|
+
};
|
|
640
|
+
} catch (error) {
|
|
641
|
+
throw new FeeEstimationFailedError({
|
|
642
|
+
cause: error instanceof Error ? error : void 0,
|
|
643
|
+
message: "Failed to estimate EVM transaction fee"
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
};
|
|
647
|
+
|
|
648
|
+
//#endregion
|
|
649
|
+
//#region src/simulateEvmTransaction/simulateEvmTransaction.ts
|
|
650
|
+
/**
|
|
651
|
+
* Simulates an EVM transaction to preview its effects before execution.
|
|
652
|
+
*
|
|
653
|
+
* This function uses the Blockaid API to analyze the transaction and returns
|
|
654
|
+
* information about asset transfers, security validation, and optionally fee estimates.
|
|
655
|
+
* The simulation shows what will happen when the transaction is executed without
|
|
656
|
+
* actually sending it to the blockchain.
|
|
657
|
+
*
|
|
658
|
+
* @param params.walletAccount - The EVM wallet account that will sign the transaction.
|
|
659
|
+
* @param params.transaction - The transaction to simulate, including network ID.
|
|
660
|
+
* @param params.includeFees - Whether to calculate transaction fees (default: false).
|
|
661
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
662
|
+
* @returns Simulation result with asset diffs, security validation, and optional fee data.
|
|
663
|
+
* @throws {InvalidParamError} If wallet account is not an EVM account or network ID is not configured.
|
|
664
|
+
* @throws {SimulationFailedError} If the simulation API call fails.
|
|
665
|
+
* @throws {FeeEstimationFailedError} If includeFees is true and fee calculation fails.
|
|
666
|
+
* @not-instrumented
|
|
667
|
+
*/
|
|
668
|
+
const simulateEvmTransaction = async ({ walletAccount, transaction, includeFees = false }, client = getDefaultClient()) => {
|
|
669
|
+
if (!isEvmWalletAccount(walletAccount)) throw new InvalidParamError("Wallet account must be an EVM wallet account");
|
|
670
|
+
const networkData = getNetworksData(client).find((data) => data.networkId === transaction.networkId && data.chain === "EVM");
|
|
671
|
+
if (!networkData) throw new InvalidParamError(`Network with ID ${transaction.networkId} is not configured in project settings`);
|
|
672
|
+
try {
|
|
673
|
+
const core = getCore(client);
|
|
674
|
+
const apiClient = createApiClient({}, client);
|
|
675
|
+
const simulateEVMTransactionRequest = {
|
|
676
|
+
chainId: transaction.networkId,
|
|
677
|
+
data: transaction.data || "0x",
|
|
678
|
+
from: transaction.from,
|
|
679
|
+
to: transaction.to
|
|
680
|
+
};
|
|
681
|
+
if (transaction.value !== void 0) simulateEVMTransactionRequest.value = transaction.value.toString();
|
|
682
|
+
const response = await apiClient.simulateEVMTransaction({
|
|
683
|
+
environmentId: core.environmentId,
|
|
684
|
+
simulateEVMTransactionRequest
|
|
685
|
+
});
|
|
686
|
+
let feeData;
|
|
687
|
+
if (includeFees) feeData = await calculateEvmTransactionFee({
|
|
688
|
+
nativeTokenPriceUsd: response.priceData?.nativeTokenUsdPrice,
|
|
689
|
+
networkData,
|
|
690
|
+
transaction
|
|
691
|
+
});
|
|
692
|
+
return {
|
|
693
|
+
counterparties: response.counterparties,
|
|
694
|
+
feeData,
|
|
695
|
+
inAssets: response.inAssets || [],
|
|
696
|
+
outAssets: response.outAssets || [],
|
|
697
|
+
priceData: response.priceData,
|
|
698
|
+
showTotalFiat: response.showTotalFiat,
|
|
699
|
+
validation: response.validation ? {
|
|
700
|
+
description: response.validation.description,
|
|
701
|
+
reason: response.validation.reason,
|
|
702
|
+
result: response.validation.result
|
|
703
|
+
} : void 0
|
|
704
|
+
};
|
|
705
|
+
} catch (error) {
|
|
706
|
+
if (error instanceof FeeEstimationFailedError) throw error;
|
|
707
|
+
throw new SimulationFailedError({
|
|
708
|
+
cause: error instanceof Error ? error : void 0,
|
|
709
|
+
message: "Failed to simulate EVM transaction"
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
};
|
|
713
|
+
|
|
535
714
|
//#endregion
|
|
536
715
|
//#region src/exports/index.ts
|
|
537
716
|
assertPackageVersion(name, version);
|
|
538
717
|
|
|
539
718
|
//#endregion
|
|
540
|
-
export { EvmGasSponsorshipNotEnabledError, RpcError, SponsorTransactionError, addEvmExtension, calculateEvmTransactionFee, getEVMSponsoredTransactionStatus, isEvmGasSponsorshipEnabled, isEvmNetworkProvider, isEvmWalletAccount, relaySponsoredTransaction, sendSponsoredTransaction, signSponsoredTransaction, simulateEvmTransaction, waitForSponsoredTransaction };
|
|
719
|
+
export { EvmGasSponsorshipNotEnabledError, RpcError, SponsorTransactionError, activate7702Delegation, addEvmExtension, calculateEvmTransactionFee, getEVMSponsoredTransactionStatus, is7702DelegationActive, isEvmGasSponsorshipEnabled, isEvmNetworkProvider, isEvmWalletAccount, relaySponsoredTransaction, sendSponsoredTransaction, sign7702Authorization, signSponsoredTransaction, simulateEvmTransaction, waitForSponsoredTransaction };
|
|
541
720
|
//# sourceMappingURL=index.esm.js.map
|