@lifi/sdk 3.10.1 → 3.11.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/package.json +6 -6
- package/src/_cjs/core/EVM/EVMStepExecutor.js +122 -131
- package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
- package/src/_cjs/core/EVM/abi.js +1 -0
- package/src/_cjs/core/EVM/abi.js.map +1 -1
- package/src/_cjs/core/EVM/checkAllowance.js +126 -44
- package/src/_cjs/core/EVM/checkAllowance.js.map +1 -1
- package/src/_cjs/core/EVM/permits/getNativePermit.js +123 -16
- package/src/_cjs/core/EVM/permits/getNativePermit.js.map +1 -1
- package/src/_cjs/core/EVM/permits/isNativePermitValid.js +34 -0
- package/src/_cjs/core/EVM/permits/isNativePermitValid.js.map +1 -0
- package/src/_cjs/core/EVM/switchChain.js +8 -14
- package/src/_cjs/core/EVM/switchChain.js.map +1 -1
- package/src/_cjs/core/EVM/utils.js +10 -1
- package/src/_cjs/core/EVM/utils.js.map +1 -1
- package/src/_cjs/core/execution.js +1 -1
- package/src/_cjs/core/execution.js.map +1 -1
- package/src/_cjs/core/prepareRestart.js +5 -2
- package/src/_cjs/core/prepareRestart.js.map +1 -1
- package/src/_cjs/core/processMessages.js +4 -8
- package/src/_cjs/core/processMessages.js.map +1 -1
- package/src/_cjs/services/api.js +6 -5
- package/src/_cjs/services/api.js.map +1 -1
- package/src/_cjs/services/balance.js +9 -9
- package/src/_cjs/services/balance.js.map +1 -1
- package/src/_cjs/version.js +1 -1
- package/src/_esm/core/EVM/EVMStepExecutor.js +136 -148
- package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
- package/src/_esm/core/EVM/abi.js +2 -0
- package/src/_esm/core/EVM/abi.js.map +1 -1
- package/src/_esm/core/EVM/checkAllowance.js +141 -45
- package/src/_esm/core/EVM/checkAllowance.js.map +1 -1
- package/src/_esm/core/EVM/permits/getNativePermit.js +144 -21
- package/src/_esm/core/EVM/permits/getNativePermit.js.map +1 -1
- package/src/_esm/core/EVM/permits/isNativePermitValid.js +41 -0
- package/src/_esm/core/EVM/permits/isNativePermitValid.js.map +1 -0
- package/src/_esm/core/EVM/switchChain.js +8 -15
- package/src/_esm/core/EVM/switchChain.js.map +1 -1
- package/src/_esm/core/EVM/utils.js +12 -0
- package/src/_esm/core/EVM/utils.js.map +1 -1
- package/src/_esm/core/execution.js +1 -1
- package/src/_esm/core/execution.js.map +1 -1
- package/src/_esm/core/prepareRestart.js +6 -3
- package/src/_esm/core/prepareRestart.js.map +1 -1
- package/src/_esm/core/processMessages.js +4 -8
- package/src/_esm/core/processMessages.js.map +1 -1
- package/src/_esm/services/api.js +3 -8
- package/src/_esm/services/api.js.map +1 -1
- package/src/_esm/services/balance.js +4 -18
- package/src/_esm/services/balance.js.map +1 -1
- package/src/_esm/version.js +1 -1
- package/src/_types/core/EVM/EVMStepExecutor.d.ts +3 -2
- package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
- package/src/_types/core/EVM/abi.d.ts +20 -0
- package/src/_types/core/EVM/abi.d.ts.map +1 -1
- package/src/_types/core/EVM/checkAllowance.d.ts +10 -7
- package/src/_types/core/EVM/checkAllowance.d.ts.map +1 -1
- package/src/_types/core/EVM/permits/getNativePermit.d.ts +2 -2
- package/src/_types/core/EVM/permits/getNativePermit.d.ts.map +1 -1
- package/src/_types/core/EVM/permits/isNativePermitValid.d.ts +6 -0
- package/src/_types/core/EVM/permits/isNativePermitValid.d.ts.map +1 -0
- package/src/_types/core/EVM/switchChain.d.ts +2 -2
- package/src/_types/core/EVM/switchChain.d.ts.map +1 -1
- package/src/_types/core/EVM/utils.d.ts +6 -1
- package/src/_types/core/EVM/utils.d.ts.map +1 -1
- package/src/_types/core/prepareRestart.d.ts +1 -1
- package/src/_types/core/prepareRestart.d.ts.map +1 -1
- package/src/_types/core/processMessages.d.ts.map +1 -1
- package/src/_types/core/types.d.ts +2 -2
- package/src/_types/core/types.d.ts.map +1 -1
- package/src/_types/services/api.d.ts +7 -2
- package/src/_types/services/api.d.ts.map +1 -1
- package/src/_types/services/balance.d.ts +5 -5
- package/src/_types/services/balance.d.ts.map +1 -1
- package/src/_types/version.d.ts +1 -1
- package/src/core/EVM/EVMStepExecutor.ts +203 -197
- package/src/core/EVM/abi.ts +2 -0
- package/src/core/EVM/checkAllowance.ts +206 -63
- package/src/core/EVM/permits/getNativePermit.ts +189 -22
- package/src/core/EVM/permits/isNativePermitValid.ts +57 -0
- package/src/core/EVM/switchChain.ts +14 -22
- package/src/core/EVM/utils.ts +17 -1
- package/src/core/execution.ts +1 -1
- package/src/core/prepareRestart.ts +6 -3
- package/src/core/processMessages.ts +4 -8
- package/src/core/types.ts +1 -2
- package/src/services/api.ts +17 -8
- package/src/services/balance.ts +20 -8
- 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 ({
|
|
12
|
-
|
|
13
|
-
|
|
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 (
|
|
21
|
-
await waitForApprovalTransaction(
|
|
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,
|
|
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(
|
|
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,
|
|
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 (
|
|
41
|
-
nativePermitData =
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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(
|
|
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,
|
|
162
|
+
statusManager.updateProcess(step, sharedProcess.type, 'DONE');
|
|
77
163
|
return {
|
|
78
164
|
status: 'BATCH_APPROVAL',
|
|
79
165
|
data: {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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(
|
|
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
|
-
|
|
91
|
-
|
|
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":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"checkAllowance.js","sourceRoot":"","sources":["../../../core/EVM/checkAllowance.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAQ/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AA+B1E,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,EACnC,WAAW,EACX,KAAK,EACL,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,oBAAoB,GAAG,KAAK,EAC5B,iBAAiB,GAAG,KAAK,EACzB,gBAAgB,GAAG,KAAK,EACxB,qBAAqB,GAAG,KAAK,GACR,EAA4B,EAAE;IACnD,IAAI,aAAkC,CAAA;IACtC,IAAI,eAAe,GAAsB,EAAE,CAAA;IAC3C,IAAI,CAAC;QACH,mDAAmD;QACnD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAC5C,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,KAAK,QAAQ,CAClD,CAAA;QACD,IAAI,CAAC,qBAAqB,IAAI,eAAe,EAAE,MAAM,EAAE,CAAC;YACtD,aAAa,GAAG,aAAa,CAAC,mBAAmB,CAAC;gBAChD,IAAI;gBACJ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;aACjC,CAAC,CAAA;YACF,eAAe,GAAG,aAAa,CAAC,eAAe,IAAI,eAAe,CAAA;YAClE,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;gBACxC,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,OAAiB,CAAA;gBAExD,0EAA0E;gBAC1E,MAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAClD,CAAC,eAAe,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,KAAK,aAAa,CACtE,CAAA;gBACD,MAAM,mBAAmB,GACvB,uBAAuB;oBACvB,mBAAmB,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAA;gBAEzD,IAAI,mBAAmB,EAAE,CAAC;oBACxB,iDAAiD;oBACjD,SAAQ;gBACV,CAAC;gBAED,aAAa,GAAG,aAAa,CAAC,aAAa,CACzC,IAAI,EACJ,aAAa,CAAC,IAAI,EAClB,iBAAiB,CAClB,CAAA;gBACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;gBACtC,CAAC;gBAED,yCAAyC;gBACzC,MAAM,YAAY,GAAG,MAAM,WAAW,CACpC,IAAI,EACJ,aAAa,EACb,aAAa,CACd,CAAA;gBACD,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;gBACtC,CAAC;gBAED,MAAM,SAAS,GAAG,MAAM,SAAS,CAC/B,YAAY,EACZ,aAAa,EACb,eAAe,CAChB,CAAC;oBACA,OAAO,EAAE,YAAY,CAAC,OAAQ;oBAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,WAAW,EAAE,QAAQ;oBACrB,OAAO,EAAE,SAAS,CAAC,OAAO;iBAC3B,CAAC,CAAA;gBACF,MAAM,YAAY,GAAoB;oBACpC,GAAG,SAAS;oBACZ,SAAS;iBACV,CAAA;gBACD,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;gBAClC,aAAa,GAAG,aAAa,CAAC,aAAa,CACzC,IAAI,EACJ,aAAa,CAAC,IAAI,EAClB,iBAAiB,EACjB;oBACE,eAAe;iBAChB,CACF,CAAA;YACH,CAAC;YAED,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE;gBAC5D,eAAe;aAChB,CAAC,CAAA;YACF,oEAAoE;YACpE,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,CAAC,eAAe,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE,CACjE,CAAA;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO;oBACL,MAAM,EAAE,eAAe;oBACvB,IAAI,EAAE,eAAe;iBACtB,CAAA;YACH,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,aAAa,GAAG,aAAa,CAAC,mBAAmB,CAAC;YAChD,IAAI;YACJ,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;SACjC,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QAC5D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;QACtC,CAAC;QAED,sCAAsC;QACtC,IAAI,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5D,MAAM,0BAA0B,CAC9B,aAAa,EACb,aAAa,CAAC,MAAiB,EAC/B,aAAa,CAAC,IAAI,EAClB,IAAI,EACJ,KAAK,EACL,aAAa,CACd,CAAA;YACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAA;QAClD,CAAC;QAED,4BAA4B;QAC5B,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAEhE,MAAM,cAAc,GAAG,gBAAgB;YACrC,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAA;QAEjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAEjD,MAAM,QAAQ,GAAG,MAAM,YAAY,CACjC,aAAa,EACb,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAkB,EACxC,aAAa,CAAC,OAAQ,CAAC,OAAO,EAC9B,cAAyB,CAC1B,CAAA;QAED,mCAAmC;QACnC,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;YAC3B,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAA;QAClD,CAAC;QAED,gHAAgH;QAChH,MAAM,uBAAuB,GAC3B,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,iBAAiB,IAAI,CAAC,qBAAqB,CAAA;QAEtE,IAAI,gBAA8C,CAAA;QAClD,IAAI,uBAAuB,EAAE,CAAC;YAC5B,gBAAgB,GAAG,MAAM,qBAAqB,CAC5C,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB;gBACE,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAkB;gBACtD,cAAc,EAAE,KAAK,CAAC,YAAuB;gBAC7C,MAAM,EAAE,UAAU;aACnB,CACF,CAAA;QACH,CAAC;QAED,IAAI,uBAAuB,IAAI,gBAAgB,EAAE,CAAC;YAChD,eAAe,GAAG,eAAe,CAAC,MAAM;gBACtC,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,aAAa,CAAC,eAAe,IAAI,EAAE,CAAA;YACvC,0EAA0E;YAC1E,MAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAClD,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,MAAM,CAAC,OAAO,KAAK,gBAAgB,CAAC,MAAM,CAAC,OAAO,CACrE,CAAA;YACD,MAAM,mBAAmB,GACvB,uBAAuB;gBACvB,mBAAmB,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAA;YAEhE,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;gBAExE,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;gBACtC,CAAC;gBAED,kBAAkB;gBAClB,MAAM,SAAS,GAAG,MAAM,SAAS,CAC/B,aAAa,EACb,aAAa,EACb,eAAe,CAChB,CAAC;oBACA,OAAO,EAAE,aAAa,CAAC,OAAQ;oBAC/B,MAAM,EAAE,gBAAgB,CAAC,MAAM;oBAC/B,KAAK,EAAE,gBAAgB,CAAC,KAAK;oBAC7B,WAAW,EAAE,QAAQ;oBACrB,OAAO,EAAE,gBAAgB,CAAC,OAAO;iBAClC,CAAC,CAAA;gBAEF,iDAAiD;gBACjD,MAAM,YAAY,GAAoB;oBACpC,GAAG,gBAAgB;oBACnB,SAAS;iBACV,CAAA;gBACD,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YACpC,CAAC;YAED,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE;gBAC5D,eAAe;aAChB,CAAC,CAAA;YACF,OAAO;gBACL,MAAM,EAAE,eAAe;gBACvB,IAAI,EAAE,eAAe;aACtB,CAAA;QACH,CAAC;QAED,2EAA2E;QAC3E,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE;YACvE,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAA;QAEF,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;QACtC,CAAC;QAED,oBAAoB;QACpB,MAAM,aAAa,GAAG,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAA;QAChE,MAAM,aAAa,GAAG,MAAM,YAAY,CACtC,aAAa,EACb,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAkB,EACxC,cAAyB,EACzB,aAAa,EACb,gBAAgB;QAChB,uEAAuE;QACvE,4CAA4C;QAC5C,iBAAiB,CAClB,CAAA;QAED,sEAAsE;QACtE,+DAA+D;QAC/D,IAAI,iBAAiB,EAAE,CAAC;YACtB,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YAC7D,OAAO;gBACL,MAAM,EAAE,gBAAgB;gBACxB,IAAI,EAAE;oBACJ,IAAI,EAAE;wBACJ,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAkB;wBAC5C,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;qBACvC;oBACD,eAAe;iBAChB;aACF,CAAA;QACH,CAAC;QAED,MAAM,0BAA0B,CAC9B,aAAa,EACb,aAAa,EACb,aAAa,CAAC,IAAI,EAClB,IAAI,EACJ,KAAK,EACL,aAAa,CACd,CAAA;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAA;IAClD,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,aAAa,GAAG,aAAa,CAAC,mBAAmB,CAAC;gBAChD,IAAI;gBACJ,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;aACjC,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAA;QAC1D,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE;YAC9D,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;gBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB;SACF,CAAC,CAAA;QACF,aAAa,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC7C,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED,MAAM,0BAA0B,GAAG,KAAK,EACtC,MAAc,EACd,MAAY,EACZ,WAAwB,EACxB,IAAc,EACd,KAAoB,EACpB,aAA4B,EAC5B,EAAE;IACF,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC3D,MAAM,SAAS,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,GAAG,eAAe,MAAM,IAAI,EAAE,CAAA;IAEhE,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE;QACxD,MAAM;QACN,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;KAC1B,CAAC,CAAA;IAEF,MAAM,kBAAkB,GAAG,MAAM,yBAAyB,CAAC;QACzD,MAAM;QACN,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,MAAM;QACN,UAAU,CAAC,QAAQ;YACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAA;YACzC,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE;gBACxD,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC;aAC3B,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,kBAAkB,EAAE,eAAe,IAAI,MAAM,CAAA;IAC/D,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;QACrD,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC;KAC7B,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
166
|
-
|
|
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":"AACA,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,GAAG,EACH,kBAAkB,EAClB,OAAO,EACP,KAAK,
|
|
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,
|
|
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 ===
|
|
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
|
-
|
|
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 !==
|
|
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,
|
|
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,
|
|
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"}
|