@lifi/sdk 3.10.1 → 3.11.0-beta.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 (78) hide show
  1. package/package.json +1 -1
  2. package/src/_cjs/core/EVM/EVMStepExecutor.js +122 -131
  3. package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
  4. package/src/_cjs/core/EVM/abi.js +1 -0
  5. package/src/_cjs/core/EVM/abi.js.map +1 -1
  6. package/src/_cjs/core/EVM/checkAllowance.js +126 -44
  7. package/src/_cjs/core/EVM/checkAllowance.js.map +1 -1
  8. package/src/_cjs/core/EVM/permits/getNativePermit.js +123 -16
  9. package/src/_cjs/core/EVM/permits/getNativePermit.js.map +1 -1
  10. package/src/_cjs/core/EVM/permits/isNativePermitValid.js +34 -0
  11. package/src/_cjs/core/EVM/permits/isNativePermitValid.js.map +1 -0
  12. package/src/_cjs/core/EVM/switchChain.js +8 -14
  13. package/src/_cjs/core/EVM/switchChain.js.map +1 -1
  14. package/src/_cjs/core/EVM/utils.js +10 -1
  15. package/src/_cjs/core/EVM/utils.js.map +1 -1
  16. package/src/_cjs/core/execution.js +1 -1
  17. package/src/_cjs/core/execution.js.map +1 -1
  18. package/src/_cjs/core/prepareRestart.js +5 -2
  19. package/src/_cjs/core/prepareRestart.js.map +1 -1
  20. package/src/_cjs/core/processMessages.js +4 -8
  21. package/src/_cjs/core/processMessages.js.map +1 -1
  22. package/src/_cjs/version.js +1 -1
  23. package/src/_cjs/version.js.map +1 -1
  24. package/src/_esm/core/EVM/EVMStepExecutor.js +136 -148
  25. package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
  26. package/src/_esm/core/EVM/abi.js +2 -0
  27. package/src/_esm/core/EVM/abi.js.map +1 -1
  28. package/src/_esm/core/EVM/checkAllowance.js +141 -45
  29. package/src/_esm/core/EVM/checkAllowance.js.map +1 -1
  30. package/src/_esm/core/EVM/permits/getNativePermit.js +144 -21
  31. package/src/_esm/core/EVM/permits/getNativePermit.js.map +1 -1
  32. package/src/_esm/core/EVM/permits/isNativePermitValid.js +41 -0
  33. package/src/_esm/core/EVM/permits/isNativePermitValid.js.map +1 -0
  34. package/src/_esm/core/EVM/switchChain.js +8 -15
  35. package/src/_esm/core/EVM/switchChain.js.map +1 -1
  36. package/src/_esm/core/EVM/utils.js +12 -0
  37. package/src/_esm/core/EVM/utils.js.map +1 -1
  38. package/src/_esm/core/execution.js +1 -1
  39. package/src/_esm/core/execution.js.map +1 -1
  40. package/src/_esm/core/prepareRestart.js +6 -3
  41. package/src/_esm/core/prepareRestart.js.map +1 -1
  42. package/src/_esm/core/processMessages.js +4 -8
  43. package/src/_esm/core/processMessages.js.map +1 -1
  44. package/src/_esm/version.js +1 -1
  45. package/src/_esm/version.js.map +1 -1
  46. package/src/_types/core/EVM/EVMStepExecutor.d.ts +3 -2
  47. package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
  48. package/src/_types/core/EVM/abi.d.ts +20 -0
  49. package/src/_types/core/EVM/abi.d.ts.map +1 -1
  50. package/src/_types/core/EVM/checkAllowance.d.ts +10 -7
  51. package/src/_types/core/EVM/checkAllowance.d.ts.map +1 -1
  52. package/src/_types/core/EVM/permits/getNativePermit.d.ts +2 -2
  53. package/src/_types/core/EVM/permits/getNativePermit.d.ts.map +1 -1
  54. package/src/_types/core/EVM/permits/isNativePermitValid.d.ts +6 -0
  55. package/src/_types/core/EVM/permits/isNativePermitValid.d.ts.map +1 -0
  56. package/src/_types/core/EVM/switchChain.d.ts +2 -2
  57. package/src/_types/core/EVM/switchChain.d.ts.map +1 -1
  58. package/src/_types/core/EVM/utils.d.ts +6 -1
  59. package/src/_types/core/EVM/utils.d.ts.map +1 -1
  60. package/src/_types/core/prepareRestart.d.ts +1 -1
  61. package/src/_types/core/prepareRestart.d.ts.map +1 -1
  62. package/src/_types/core/processMessages.d.ts.map +1 -1
  63. package/src/_types/core/types.d.ts +2 -2
  64. package/src/_types/core/types.d.ts.map +1 -1
  65. package/src/_types/version.d.ts +1 -1
  66. package/src/_types/version.d.ts.map +1 -1
  67. package/src/core/EVM/EVMStepExecutor.ts +203 -197
  68. package/src/core/EVM/abi.ts +2 -0
  69. package/src/core/EVM/checkAllowance.ts +206 -63
  70. package/src/core/EVM/permits/getNativePermit.ts +189 -22
  71. package/src/core/EVM/permits/isNativePermitValid.ts +57 -0
  72. package/src/core/EVM/switchChain.ts +14 -22
  73. package/src/core/EVM/utils.ts +17 -1
  74. package/src/core/execution.ts +1 -1
  75. package/src/core/prepareRestart.ts +6 -3
  76. package/src/core/processMessages.ts +4 -8
  77. package/src/core/types.ts +1 -2
  78. package/src/version.ts +1 -1
@@ -5,90 +5,186 @@ import { getActionWithFallback } from './getActionWithFallback.js';
5
5
  import { getAllowance } from './getAllowance.js';
6
6
  import { parseEVMErrors } from './parseEVMErrors.js';
7
7
  import { getNativePermit } from './permits/getNativePermit.js';
8
+ import { isNativePermitValid } from './permits/isNativePermitValid.js';
8
9
  import { setAllowance } from './setAllowance.js';
9
- import { isRelayerStep } from './typeguards.js';
10
10
  import { waitForTransactionReceipt } from './waitForTransactionReceipt.js';
11
- export const checkAllowance = async ({ client, chain, step, statusManager, executionOptions, allowUserInteraction = false, batchingSupported = false, permit2Supported = false, disableMessageSigning = false, }) => {
12
- // Find existing or create new allowance process
13
- const allowanceProcess = statusManager.findOrCreateProcess({
14
- step,
15
- type: 'TOKEN_ALLOWANCE',
16
- chainId: step.action.fromChainId,
17
- });
11
+ export const checkAllowance = async ({ checkClient, chain, step, statusManager, executionOptions, allowUserInteraction = false, batchingSupported = false, permit2Supported = false, disableMessageSigning = false, }) => {
12
+ let sharedProcess;
13
+ let signedTypedData = [];
18
14
  try {
15
+ // First, try to sign all permits in step.typedData
16
+ const permitTypedData = step.typedData?.filter((typedData) => typedData.primaryType === 'Permit');
17
+ if (!disableMessageSigning && permitTypedData?.length) {
18
+ sharedProcess = statusManager.findOrCreateProcess({
19
+ step,
20
+ type: 'PERMIT',
21
+ chainId: step.action.fromChainId,
22
+ });
23
+ signedTypedData = sharedProcess.signedTypedData ?? signedTypedData;
24
+ for (const typedData of permitTypedData) {
25
+ const permitChainId = typedData.domain.chainId;
26
+ // Check if we already have a valid permit for this chain and requirements
27
+ const signedTypedDataForChain = signedTypedData.find((signedTypedData) => signedTypedData.domain.chainId === permitChainId);
28
+ const existingValidPermit = signedTypedDataForChain &&
29
+ isNativePermitValid(signedTypedDataForChain, typedData);
30
+ if (existingValidPermit) {
31
+ // Skip signing if we already have a valid permit
32
+ continue;
33
+ }
34
+ sharedProcess = statusManager.updateProcess(step, sharedProcess.type, 'ACTION_REQUIRED');
35
+ if (!allowUserInteraction) {
36
+ return { status: 'ACTION_REQUIRED' };
37
+ }
38
+ // Switch to the permit's chain if needed
39
+ const permitClient = await checkClient(step, sharedProcess, permitChainId);
40
+ if (!permitClient) {
41
+ return { status: 'ACTION_REQUIRED' };
42
+ }
43
+ const signature = await getAction(permitClient, signTypedData, 'signTypedData')({
44
+ account: permitClient.account,
45
+ domain: typedData.domain,
46
+ types: typedData.types,
47
+ primaryType: 'Permit',
48
+ message: typedData.message,
49
+ });
50
+ const signedPermit = {
51
+ ...typedData,
52
+ signature,
53
+ };
54
+ signedTypedData.push(signedPermit);
55
+ sharedProcess = statusManager.updateProcess(step, sharedProcess.type, 'ACTION_REQUIRED', {
56
+ signedTypedData,
57
+ });
58
+ }
59
+ statusManager.updateProcess(step, sharedProcess.type, 'DONE', {
60
+ signedTypedData,
61
+ });
62
+ // Check if there's a signed permit for the source transaction chain
63
+ const matchingPermit = signedTypedData.find((signedTypedData) => signedTypedData.domain.chainId === chain.id);
64
+ if (matchingPermit) {
65
+ return {
66
+ status: 'NATIVE_PERMIT',
67
+ data: signedTypedData,
68
+ };
69
+ }
70
+ }
71
+ // Find existing or create new allowance process
72
+ sharedProcess = statusManager.findOrCreateProcess({
73
+ step,
74
+ type: 'TOKEN_ALLOWANCE',
75
+ chainId: step.action.fromChainId,
76
+ });
77
+ const updatedClient = await checkClient(step, sharedProcess);
78
+ if (!updatedClient) {
79
+ return { status: 'ACTION_REQUIRED' };
80
+ }
19
81
  // Handle existing pending transaction
20
- if (allowanceProcess.txHash && allowanceProcess.status !== 'DONE') {
21
- await waitForApprovalTransaction(client, allowanceProcess.txHash, allowanceProcess.type, step, chain, statusManager);
22
- return { status: 'DONE' };
82
+ if (sharedProcess.txHash && sharedProcess.status !== 'DONE') {
83
+ await waitForApprovalTransaction(updatedClient, sharedProcess.txHash, sharedProcess.type, step, chain, statusManager);
84
+ return { status: 'DONE', data: signedTypedData };
23
85
  }
24
86
  // Start new allowance check
25
- statusManager.updateProcess(step, allowanceProcess.type, 'STARTED');
87
+ statusManager.updateProcess(step, sharedProcess.type, 'STARTED');
26
88
  const spenderAddress = permit2Supported
27
89
  ? chain.permit2
28
90
  : step.estimate.approvalAddress;
29
91
  const fromAmount = BigInt(step.action.fromAmount);
30
- const approved = await getAllowance(client, step.action.fromToken.address, client.account.address, spenderAddress);
92
+ const approved = await getAllowance(updatedClient, step.action.fromToken.address, updatedClient.account.address, spenderAddress);
31
93
  // Return early if already approved
32
94
  if (fromAmount <= approved) {
33
- statusManager.updateProcess(step, allowanceProcess.type, 'DONE');
34
- return { status: 'DONE' };
95
+ statusManager.updateProcess(step, sharedProcess.type, 'DONE');
96
+ return { status: 'DONE', data: signedTypedData };
35
97
  }
36
- const isRelayerTransaction = isRelayerStep(step);
37
98
  // Check if proxy contract is available and message signing is not disabled, also not available for atomic batch
38
99
  const isNativePermitAvailable = !!chain.permit2Proxy && !batchingSupported && !disableMessageSigning;
39
100
  let nativePermitData;
40
- if (isRelayerTransaction) {
41
- nativePermitData = step.typedData.find((p) => p.primaryType === 'Permit');
42
- }
43
- else if (isNativePermitAvailable) {
44
- nativePermitData = await getActionWithFallback(client, getNativePermit, 'getNativePermit', {
101
+ if (isNativePermitAvailable) {
102
+ nativePermitData = await getActionWithFallback(updatedClient, getNativePermit, 'getNativePermit', {
45
103
  chainId: chain.id,
46
104
  tokenAddress: step.action.fromToken.address,
47
105
  spenderAddress: chain.permit2Proxy,
48
106
  amount: fromAmount,
49
107
  });
50
108
  }
51
- statusManager.updateProcess(step, allowanceProcess.type, 'ACTION_REQUIRED');
52
- if (!allowUserInteraction) {
53
- return { status: 'ACTION_REQUIRED' };
54
- }
55
109
  if (isNativePermitAvailable && nativePermitData) {
56
- const signature = await getAction(client, signTypedData, 'signTypedData')({
57
- account: client.account,
58
- domain: nativePermitData.domain,
59
- types: nativePermitData.types,
60
- primaryType: 'Permit',
61
- message: nativePermitData.message,
110
+ signedTypedData = signedTypedData.length
111
+ ? signedTypedData
112
+ : sharedProcess.signedTypedData || [];
113
+ // Check if we already have a valid permit for this chain and requirements
114
+ const signedTypedDataForChain = signedTypedData.find((signedTypedData) => signedTypedData.domain.chainId === nativePermitData.domain.chainId);
115
+ const existingValidPermit = signedTypedDataForChain &&
116
+ isNativePermitValid(signedTypedDataForChain, nativePermitData);
117
+ if (!existingValidPermit) {
118
+ statusManager.updateProcess(step, sharedProcess.type, 'ACTION_REQUIRED');
119
+ if (!allowUserInteraction) {
120
+ return { status: 'ACTION_REQUIRED' };
121
+ }
122
+ // Sign the permit
123
+ const signature = await getAction(updatedClient, signTypedData, 'signTypedData')({
124
+ account: updatedClient.account,
125
+ domain: nativePermitData.domain,
126
+ types: nativePermitData.types,
127
+ primaryType: 'Permit',
128
+ message: nativePermitData.message,
129
+ });
130
+ // Add the new permit to the signed permits array
131
+ const signedPermit = {
132
+ ...nativePermitData,
133
+ signature,
134
+ };
135
+ signedTypedData.push(signedPermit);
136
+ }
137
+ statusManager.updateProcess(step, sharedProcess.type, 'DONE', {
138
+ signedTypedData,
62
139
  });
63
- statusManager.updateProcess(step, allowanceProcess.type, 'DONE');
64
140
  return {
65
141
  status: 'NATIVE_PERMIT',
66
- data: {
67
- ...nativePermitData,
68
- signature,
69
- },
142
+ data: signedTypedData,
70
143
  };
71
144
  }
145
+ // Clear the txHash and txLink from potential previous approval transaction
146
+ statusManager.updateProcess(step, sharedProcess.type, 'ACTION_REQUIRED', {
147
+ txHash: undefined,
148
+ txLink: undefined,
149
+ });
150
+ if (!allowUserInteraction) {
151
+ return { status: 'ACTION_REQUIRED' };
152
+ }
72
153
  // Set new allowance
73
154
  const approveAmount = permit2Supported ? MaxUint256 : fromAmount;
74
- const approveTxHash = await setAllowance(client, step.action.fromToken.address, spenderAddress, approveAmount, executionOptions, batchingSupported);
155
+ const approveTxHash = await setAllowance(updatedClient, step.action.fromToken.address, spenderAddress, approveAmount, executionOptions,
156
+ // We need to return the populated transaction is batching is supported
157
+ // instead of executing transaction on-chain
158
+ batchingSupported);
159
+ // If batching is supported, we need to return the batch approval data
160
+ // because allowance was't set by standard approval transaction
75
161
  if (batchingSupported) {
76
- statusManager.updateProcess(step, allowanceProcess.type, 'DONE');
162
+ statusManager.updateProcess(step, sharedProcess.type, 'DONE');
77
163
  return {
78
164
  status: 'BATCH_APPROVAL',
79
165
  data: {
80
- to: step.action.fromToken.address,
81
- data: approveTxHash,
82
- chainId: step.action.fromToken.chainId,
166
+ call: {
167
+ to: step.action.fromToken.address,
168
+ data: approveTxHash,
169
+ chainId: step.action.fromToken.chainId,
170
+ },
171
+ signedTypedData,
83
172
  },
84
173
  };
85
174
  }
86
- await waitForApprovalTransaction(client, approveTxHash, allowanceProcess.type, step, chain, statusManager);
87
- return { status: 'DONE' };
175
+ await waitForApprovalTransaction(updatedClient, approveTxHash, sharedProcess.type, step, chain, statusManager);
176
+ return { status: 'DONE', data: signedTypedData };
88
177
  }
89
178
  catch (e) {
90
- const error = await parseEVMErrors(e, step, allowanceProcess);
91
- statusManager.updateProcess(step, allowanceProcess.type, 'FAILED', {
179
+ if (!sharedProcess) {
180
+ sharedProcess = statusManager.findOrCreateProcess({
181
+ step,
182
+ type: 'TOKEN_ALLOWANCE',
183
+ chainId: step.action.fromChainId,
184
+ });
185
+ }
186
+ const error = await parseEVMErrors(e, step, sharedProcess);
187
+ statusManager.updateProcess(step, sharedProcess.type, 'FAILED', {
92
188
  error: {
93
189
  message: error.cause.message,
94
190
  code: error.code,
@@ -1 +1 @@
1
- {"version":3,"file":"checkAllowance.js","sourceRoot":"","sources":["../../../core/EVM/checkAllowance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkAllowance.js","sourceRoot":"","sources":["../../../core/EVM/checkAllowance.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { encodeAbiParameters, keccak256, pad, parseAbiParameters, toBytes, toHex, } from 'viem';
1
+ import { encodeAbiParameters, keccak256, pad, parseAbiParameters, toBytes, toHex, zeroHash, } from 'viem';
2
2
  import { multicall, readContract } from 'viem/actions';
3
3
  import { eip2612Abi } from '../abi.js';
4
4
  import { getActionWithFallback } from '../getActionWithFallback.js';
@@ -24,10 +24,6 @@ function makeDomainSeparator({ name, version, chainId, verifyingContract, withSa
24
24
  ]);
25
25
  return keccak256(encoded);
26
26
  }
27
- // TODO: Add support for EIP-5267 when adoption increases
28
- // This EIP provides a standard way to query domain separator and permit type hash
29
- // via eip712Domain() function, which would simplify permit validation
30
- // https://eips.ethereum.org/EIPS/eip-5267
31
27
  function validateDomainSeparator({ name, version, chainId, verifyingContract, domainSeparator, }) {
32
28
  if (!name || !domainSeparator) {
33
29
  return {
@@ -67,8 +63,123 @@ function validateDomainSeparator({ name, version, chainId, verifyingContract, do
67
63
  domain: {},
68
64
  };
69
65
  }
66
+ /**
67
+ * Attempts to retrieve contract data using EIP-5267 eip712Domain() function
68
+ * @link https://eips.ethereum.org/EIPS/eip-5267
69
+ * @param client - The Viem client instance
70
+ * @param chainId - The chain ID
71
+ * @param tokenAddress - The token contract address
72
+ * @returns Contract data if EIP-5267 is supported, undefined otherwise
73
+ */
74
+ const getEIP712DomainData = async (client, chainId, tokenAddress) => {
75
+ try {
76
+ const multicallAddress = await getMulticallAddress(chainId);
77
+ const contractCalls = [
78
+ {
79
+ address: tokenAddress,
80
+ abi: eip2612Abi,
81
+ functionName: 'eip712Domain',
82
+ },
83
+ {
84
+ address: tokenAddress,
85
+ abi: eip2612Abi,
86
+ functionName: 'nonces',
87
+ args: [client.account.address],
88
+ },
89
+ ];
90
+ if (multicallAddress) {
91
+ try {
92
+ const [eip712DomainResult, noncesResult] = await getActionWithFallback(client, multicall, 'multicall', {
93
+ contracts: contractCalls,
94
+ multicallAddress,
95
+ });
96
+ if (eip712DomainResult.status !== 'success' ||
97
+ noncesResult.status !== 'success' ||
98
+ !eip712DomainResult.result ||
99
+ noncesResult.result === undefined) {
100
+ // Fall back to individual calls if multicall fails
101
+ throw new Error('EIP-5267 multicall failed');
102
+ }
103
+ const [, name, version, tokenChainId, verifyingContract, salt] = eip712DomainResult.result;
104
+ if (Number(tokenChainId) !== chainId ||
105
+ verifyingContract.toLowerCase() !== tokenAddress.toLowerCase()) {
106
+ return undefined;
107
+ }
108
+ // Build domain object directly from EIP-5267 data
109
+ // Use the actual salt value returned by EIP-5267 - this is the canonical salt that the contract uses
110
+ const hasSalt = salt !== zeroHash;
111
+ const domain = hasSalt
112
+ ? {
113
+ name,
114
+ version,
115
+ verifyingContract: tokenAddress,
116
+ salt,
117
+ }
118
+ : {
119
+ name,
120
+ version,
121
+ chainId,
122
+ verifyingContract: tokenAddress,
123
+ };
124
+ return {
125
+ name,
126
+ version,
127
+ domain,
128
+ permitTypehash: undefined, // EIP-5267 doesn't provide permit typehash directly
129
+ nonce: noncesResult.result,
130
+ };
131
+ }
132
+ catch {
133
+ // Fall through to individual calls
134
+ }
135
+ }
136
+ // Fallback to individual contract calls
137
+ const [eip712DomainResult, noncesResult] = (await Promise.allSettled(contractCalls.map((call) => getActionWithFallback(client, readContract, 'readContract', call))));
138
+ if (eip712DomainResult.status !== 'fulfilled' ||
139
+ noncesResult.status !== 'fulfilled') {
140
+ return undefined;
141
+ }
142
+ const [, name, version, tokenChainId, verifyingContract, salt] = eip712DomainResult.value;
143
+ if (Number(tokenChainId) !== chainId ||
144
+ verifyingContract.toLowerCase() !== tokenAddress.toLowerCase()) {
145
+ return undefined;
146
+ }
147
+ // Build domain object directly from EIP-5267 data
148
+ // Use the actual salt value returned by EIP-5267 - this is the canonical salt that the contract uses
149
+ const hasSalt = salt !== zeroHash;
150
+ const domain = hasSalt
151
+ ? {
152
+ name,
153
+ version,
154
+ verifyingContract: tokenAddress,
155
+ salt,
156
+ }
157
+ : {
158
+ name,
159
+ version,
160
+ chainId,
161
+ verifyingContract: tokenAddress,
162
+ };
163
+ return {
164
+ name,
165
+ version,
166
+ domain,
167
+ permitTypehash: undefined, // EIP-5267 doesn't provide permit typehash directly
168
+ nonce: noncesResult.value,
169
+ };
170
+ }
171
+ catch {
172
+ return undefined;
173
+ }
174
+ };
70
175
  export const getContractData = async (client, chainId, tokenAddress) => {
71
176
  try {
177
+ // First try EIP-5267 approach - returns domain object directly
178
+ const eip5267Data = await getEIP712DomainData(client, chainId, tokenAddress);
179
+ if (eip5267Data) {
180
+ return eip5267Data;
181
+ }
182
+ // Fallback to legacy approach - validates and returns domain object
72
183
  const multicallAddress = await getMulticallAddress(chainId);
73
184
  const contractCalls = [
74
185
  {
@@ -113,9 +224,20 @@ export const getContractData = async (client, chainId, tokenAddress) => {
113
224
  // Fall back to individual calls if multicall fails
114
225
  throw new Error('Multicall failed');
115
226
  }
116
- return {
227
+ // Validate domain separator and create domain object
228
+ const { isValid, domain } = validateDomainSeparator({
117
229
  name: nameResult.result,
230
+ version: versionResult.result ?? '1',
231
+ chainId,
232
+ verifyingContract: tokenAddress,
118
233
  domainSeparator: domainSeparatorResult.result,
234
+ });
235
+ if (!isValid) {
236
+ return undefined;
237
+ }
238
+ return {
239
+ name: nameResult.result,
240
+ domain,
119
241
  permitTypehash: permitTypehashResult.result,
120
242
  nonce: noncesResult.result,
121
243
  version: versionResult.result ?? '1',
@@ -133,9 +255,20 @@ export const getContractData = async (client, chainId, tokenAddress) => {
133
255
  }
134
256
  const name = nameResult.value;
135
257
  const version = versionResult.status === 'fulfilled' ? versionResult.value : '1';
136
- return {
258
+ // Validate domain separator and create domain object
259
+ const { isValid, domain } = validateDomainSeparator({
137
260
  name,
261
+ version,
262
+ chainId,
263
+ verifyingContract: tokenAddress,
138
264
  domainSeparator: domainSeparatorResult.value,
265
+ });
266
+ if (!isValid) {
267
+ return undefined;
268
+ }
269
+ return {
270
+ name,
271
+ domain,
139
272
  permitTypehash: permitTypehashResult.status === 'fulfilled'
140
273
  ? permitTypehashResult.value
141
274
  : undefined,
@@ -160,19 +293,9 @@ export const getNativePermit = async (client, { chainId, tokenAddress, spenderAd
160
293
  if (!contractData) {
161
294
  return undefined;
162
295
  }
163
- const { name, domainSeparator, permitTypehash, nonce, version } = contractData;
164
296
  // We don't support DAI-like permits yet (e.g. DAI on Ethereum)
165
- if (permitTypehash === DAI_LIKE_PERMIT_TYPEHASH) {
166
- return undefined;
167
- }
168
- const { isValid, domain } = validateDomainSeparator({
169
- name,
170
- version,
171
- chainId,
172
- verifyingContract: tokenAddress,
173
- domainSeparator,
174
- });
175
- if (!isValid) {
297
+ // https://eips.ethereum.org/EIPS/eip-2612#backwards-compatibility
298
+ if (contractData.permitTypehash === DAI_LIKE_PERMIT_TYPEHASH) {
176
299
  return undefined;
177
300
  }
178
301
  const deadline = BigInt(Math.floor(Date.now() / 1000) + 30 * 60).toString(); // 30 minutes
@@ -180,12 +303,12 @@ export const getNativePermit = async (client, { chainId, tokenAddress, spenderAd
180
303
  owner: client.account.address,
181
304
  spender: spenderAddress,
182
305
  value: amount.toString(),
183
- nonce: nonce.toString(),
306
+ nonce: contractData.nonce.toString(),
184
307
  deadline,
185
308
  };
186
309
  return {
187
310
  primaryType: 'Permit',
188
- domain,
311
+ domain: contractData.domain,
189
312
  types: eip2612Types,
190
313
  message,
191
314
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getNativePermit.js","sourceRoot":"","sources":["../../../../core/EVM/permits/getNativePermit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getNativePermit.js","sourceRoot":"","sources":["../../../../core/EVM/permits/getNativePermit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Checks if an existing native permit is valid for the given requirements
3
+ */
4
+ export const isNativePermitValid = (permit, typedData) => {
5
+ // Only check native permits (EIP-2612)
6
+ if (permit.primaryType !== 'Permit') {
7
+ return false;
8
+ }
9
+ // Check if the permit is for the correct chain
10
+ if (permit.domain.chainId !== typedData.domain.chainId ||
11
+ (permit.domain.salt && permit.domain.salt !== typedData.domain.salt)) {
12
+ return false;
13
+ }
14
+ // Check if the permit message has the required fields
15
+ const message = permit.message;
16
+ if (!message) {
17
+ return false;
18
+ }
19
+ // Check spender
20
+ if (message.spender?.toLowerCase() !== typedData.message.spender?.toLowerCase()) {
21
+ return false;
22
+ }
23
+ // Check owner
24
+ if (message.owner?.toLowerCase() !== typedData.message.owner?.toLowerCase()) {
25
+ return false;
26
+ }
27
+ // Check amount (value field in native permits)
28
+ const permitAmount = BigInt(message.value || 0);
29
+ if (permitAmount < BigInt(typedData.message.value || 0)) {
30
+ return false;
31
+ }
32
+ // Check deadline (must have at least 5 minutes remaining)
33
+ const deadlineTimestamp = parseInt(message.deadline || 0, 10);
34
+ // Add 5 minutes bufferto the current timestamp
35
+ const allowedTimestamp = Math.floor(Date.now() / 1000) + 5 * 60;
36
+ if (deadlineTimestamp <= allowedTimestamp) {
37
+ return false;
38
+ }
39
+ return true;
40
+ };
41
+ //# sourceMappingURL=isNativePermitValid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isNativePermitValid.js","sourceRoot":"","sources":["../../../../core/EVM/permits/isNativePermitValid.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,MAAuB,EACvB,SAAoB,EACX,EAAE;IACX,uCAAuC;IACvC,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,+CAA+C;IAC/C,IACE,MAAM,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,MAAM,CAAC,OAAO;QAClD,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EACpE,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,sDAAsD;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAc,CAAA;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAA;IACd,CAAC;IAED,gBAAgB;IAChB,IACE,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,EAC3E,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,cAAc;IACd,IAAI,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAA;IACd,CAAC;IAED,+CAA+C;IAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;IAC/C,IAAI,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,0DAA0D;IAC1D,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC7D,+CAA+C;IAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;IAE/D,IAAI,iBAAiB,IAAI,gBAAgB,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -19,38 +19,31 @@ import { ProviderError } from '../../errors/errors.js';
19
19
  * @param allowUserInteraction
20
20
  * @returns New connector client
21
21
  */
22
- export const switchChain = async (client, statusManager, step, allowUserInteraction, switchChainHook) => {
22
+ export const switchChain = async (client, statusManager, step, process, targetChainId, allowUserInteraction, executionOptions) => {
23
23
  // if we are already on the correct chain we can proceed directly
24
24
  const currentChainId = (await getAction(client, getChainId, 'getChainId')(undefined));
25
- if (currentChainId === step.action.fromChainId) {
25
+ if (currentChainId === targetChainId) {
26
26
  return client;
27
27
  }
28
- // -> set status message
29
- step.execution = statusManager.initExecutionObject(step);
30
- statusManager.updateExecution(step, 'ACTION_REQUIRED');
31
- let switchProcess = statusManager.findOrCreateProcess({
32
- step,
33
- type: 'SWITCH_CHAIN',
34
- status: 'ACTION_REQUIRED',
35
- });
36
28
  if (!allowUserInteraction) {
37
29
  return;
38
30
  }
39
31
  try {
40
- const updatedClient = await switchChainHook?.(step.action.fromChainId);
32
+ if (!executionOptions?.switchChainHook) {
33
+ throw new ProviderError(LiFiErrorCode.ChainSwitchError, 'Chain switch hook is not provided.');
34
+ }
35
+ const updatedClient = await executionOptions.switchChainHook(targetChainId);
41
36
  let updatedChainId;
42
37
  if (updatedClient) {
43
38
  updatedChainId = (await getAction(updatedClient, getChainId, 'getChainId')(undefined));
44
39
  }
45
- if (updatedChainId !== step.action.fromChainId) {
40
+ if (updatedChainId !== targetChainId) {
46
41
  throw new ProviderError(LiFiErrorCode.ChainSwitchError, 'Chain switch required.');
47
42
  }
48
- switchProcess = statusManager.updateProcess(step, switchProcess.type, 'DONE');
49
- statusManager.updateExecution(step, 'PENDING');
50
43
  return updatedClient;
51
44
  }
52
45
  catch (error) {
53
- statusManager.updateProcess(step, switchProcess.type, 'FAILED', {
46
+ statusManager.updateProcess(step, process.type, 'FAILED', {
54
47
  error: {
55
48
  message: error.message,
56
49
  code: LiFiErrorCode.ChainSwitchError,
@@ -1 +1 @@
1
- {"version":3,"file":"switchChain.js","sourceRoot":"","sources":["../../../core/EVM/switchChain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAItD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,MAAc,EACd,aAA4B,EAC5B,IAAsB,EACtB,oBAA6B,EAC7B,eAAiC,EACJ,EAAE;IAC/B,iEAAiE;IACjE,MAAM,cAAc,GAAG,CAAC,MAAM,SAAS,CACrC,MAAM,EACN,UAAU,EACV,YAAY,CACb,CAAC,SAAS,CAAC,CAAyB,CAAA;IACrC,IAAI,cAAc,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAA;IACf,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;IACxD,aAAa,CAAC,eAAe,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;IAEtD,IAAI,aAAa,GAAG,aAAa,CAAC,mBAAmB,CAAC;QACpD,IAAI;QACJ,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,iBAAiB;KAC1B,CAAC,CAAA;IAEF,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,eAAe,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACtE,IAAI,cAAkC,CAAA;QACtC,IAAI,aAAa,EAAE,CAAC;YAClB,cAAc,GAAG,CAAC,MAAM,SAAS,CAC/B,aAAa,EACb,UAAU,EACV,YAAY,CACb,CAAC,SAAS,CAAC,CAAyB,CAAA;QACvC,CAAC;QACD,IAAI,cAAc,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,IAAI,aAAa,CACrB,aAAa,CAAC,gBAAgB,EAC9B,wBAAwB,CACzB,CAAA;QACH,CAAC;QAED,aAAa,GAAG,aAAa,CAAC,aAAa,CACzC,IAAI,EACJ,aAAa,CAAC,IAAI,EAClB,MAAM,CACP,CAAA;QACD,aAAa,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAC9C,OAAO,aAAa,CAAA;IACtB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE;YAC9D,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,aAAa,CAAC,gBAAgB;aACrC;SACF,CAAC,CAAA;QACF,aAAa,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC7C,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"switchChain.js","sourceRoot":"","sources":["../../../core/EVM/switchChain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAItD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,MAAc,EACd,aAA4B,EAC5B,IAAsB,EACtB,OAAgB,EAChB,aAAqB,EACrB,oBAA6B,EAC7B,gBAAmC,EACN,EAAE;IAC/B,iEAAiE;IACjE,MAAM,cAAc,GAAG,CAAC,MAAM,SAAS,CACrC,MAAM,EACN,UAAU,EACV,YAAY,CACb,CAAC,SAAS,CAAC,CAAyB,CAAA;IACrC,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACrC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,gBAAgB,EAAE,eAAe,EAAE,CAAC;YACvC,MAAM,IAAI,aAAa,CACrB,aAAa,CAAC,gBAAgB,EAC9B,oCAAoC,CACrC,CAAA;QACH,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;QAC3E,IAAI,cAAkC,CAAA;QACtC,IAAI,aAAa,EAAE,CAAC;YAClB,cAAc,GAAG,CAAC,MAAM,SAAS,CAC/B,aAAa,EACb,UAAU,EACV,YAAY,CACb,CAAC,SAAS,CAAC,CAAyB,CAAA;QACvC,CAAC;QACD,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;YACrC,MAAM,IAAI,aAAa,CACrB,aAAa,CAAC,gBAAgB,EAC9B,wBAAwB,CACzB,CAAA;QACH,CAAC;QAED,OAAO,aAAa,CAAA;IACtB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE;YACxD,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,aAAa,CAAC,gBAAgB;aACrC;SACF,CAAC,CAAA;QACF,aAAa,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC7C,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}