@lifi/sdk 3.5.1 → 3.6.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.
- package/package.json +2 -2
- package/src/_cjs/constants.js +4 -2
- package/src/_cjs/constants.js.map +1 -1
- package/src/_cjs/core/EVM/EVM.js +0 -4
- package/src/_cjs/core/EVM/EVM.js.map +1 -1
- package/src/_cjs/core/EVM/EVMStepExecutor.js +156 -81
- package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
- package/src/_cjs/core/EVM/abi.js +36 -43
- package/src/_cjs/core/EVM/abi.js.map +1 -1
- package/src/_cjs/core/EVM/checkAllowance.js +36 -30
- package/src/_cjs/core/EVM/checkAllowance.js.map +1 -1
- package/src/_cjs/core/EVM/getAllowance.js.map +1 -1
- package/src/_cjs/core/EVM/getEVMBalance.js.map +1 -1
- package/src/_cjs/core/EVM/getNativePermit.js +90 -0
- package/src/_cjs/core/EVM/getNativePermit.js.map +1 -0
- package/src/_cjs/core/EVM/parseEVMErrors.js +5 -2
- package/src/_cjs/core/EVM/parseEVMErrors.js.map +1 -1
- package/src/_cjs/core/EVM/permit2/allowanceTransfer.js +100 -0
- package/src/_cjs/core/EVM/permit2/allowanceTransfer.js.map +1 -0
- package/src/_cjs/core/EVM/permit2/constants.js +12 -0
- package/src/_cjs/core/EVM/permit2/constants.js.map +1 -0
- package/src/_cjs/core/EVM/permit2/domain.js +12 -0
- package/src/_cjs/core/EVM/permit2/domain.js.map +1 -0
- package/src/_cjs/core/EVM/permit2/signatureTransfer.js +121 -0
- package/src/_cjs/core/EVM/permit2/signatureTransfer.js.map +1 -0
- package/src/_cjs/core/EVM/setAllowance.js +3 -4
- package/src/_cjs/core/EVM/setAllowance.js.map +1 -1
- package/src/_cjs/core/EVM/signPermitMessage.js +169 -0
- package/src/_cjs/core/EVM/signPermitMessage.js.map +1 -0
- package/src/_cjs/core/EVM/typeguards.js +8 -0
- package/src/_cjs/core/EVM/typeguards.js.map +1 -0
- package/src/_cjs/core/EVM/types.js.map +1 -1
- package/src/_cjs/core/EVM/utils.js +2 -1
- package/src/_cjs/core/EVM/utils.js.map +1 -1
- package/src/_cjs/core/EVM/waitForBatchTransactionReceipt.js +32 -0
- package/src/_cjs/core/EVM/waitForBatchTransactionReceipt.js.map +1 -0
- package/src/_cjs/core/EVM/waitForRelayedTransactionReceipt.js +38 -0
- package/src/_cjs/core/EVM/waitForRelayedTransactionReceipt.js.map +1 -0
- package/src/_cjs/core/checkBalance.js +3 -3
- package/src/_cjs/core/checkBalance.js.map +1 -1
- package/src/_cjs/core/waitForTransactionStatus.js +4 -2
- package/src/_cjs/core/waitForTransactionStatus.js.map +1 -1
- package/src/_cjs/createConfig.js +2 -2
- package/src/_cjs/createConfig.js.map +1 -1
- package/src/_cjs/errors/constants.js +1 -0
- package/src/_cjs/errors/constants.js.map +1 -1
- package/src/_cjs/index.js +9 -6
- package/src/_cjs/index.js.map +1 -1
- package/src/_cjs/services/api.js +127 -53
- package/src/_cjs/services/api.js.map +1 -1
- package/src/_cjs/utils/checkPackageUpdates.js +20 -0
- package/src/_cjs/utils/checkPackageUpdates.js.map +1 -0
- package/src/_cjs/utils/convertQuoteToRoute.js +33 -0
- package/src/_cjs/utils/convertQuoteToRoute.js.map +1 -0
- package/src/_cjs/utils/fetchTxErrorDetails.js +13 -0
- package/src/_cjs/utils/fetchTxErrorDetails.js.map +1 -0
- package/src/_cjs/utils/invariant.js +17 -0
- package/src/_cjs/utils/invariant.js.map +1 -0
- package/src/_cjs/utils/waitForResult.js +16 -3
- package/src/_cjs/utils/waitForResult.js.map +1 -1
- package/src/_cjs/version.js +1 -1
- package/src/_cjs/version.js.map +1 -1
- package/src/_esm/constants.js +3 -1
- package/src/_esm/constants.js.map +1 -1
- package/src/_esm/core/EVM/EVM.js +0 -4
- package/src/_esm/core/EVM/EVM.js.map +1 -1
- package/src/_esm/core/EVM/EVMStepExecutor.js +186 -92
- package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
- package/src/_esm/core/EVM/abi.js +37 -42
- package/src/_esm/core/EVM/abi.js.map +1 -1
- package/src/_esm/core/EVM/checkAllowance.js +41 -32
- package/src/_esm/core/EVM/checkAllowance.js.map +1 -1
- package/src/_esm/core/EVM/getAllowance.js.map +1 -1
- package/src/_esm/core/EVM/getEVMBalance.js.map +1 -1
- package/src/_esm/core/EVM/getNativePermit.js +95 -0
- package/src/_esm/core/EVM/getNativePermit.js.map +1 -0
- package/src/_esm/core/EVM/parseEVMErrors.js +9 -1
- package/src/_esm/core/EVM/parseEVMErrors.js.map +1 -1
- package/src/_esm/core/EVM/permit2/allowanceTransfer.js +93 -0
- package/src/_esm/core/EVM/permit2/allowanceTransfer.js.map +1 -0
- package/src/_esm/core/EVM/permit2/constants.js +9 -0
- package/src/_esm/core/EVM/permit2/constants.js.map +1 -0
- package/src/_esm/core/EVM/permit2/domain.js +9 -0
- package/src/_esm/core/EVM/permit2/domain.js.map +1 -0
- package/src/_esm/core/EVM/permit2/signatureTransfer.js +117 -0
- package/src/_esm/core/EVM/permit2/signatureTransfer.js.map +1 -0
- package/src/_esm/core/EVM/setAllowance.js +3 -4
- package/src/_esm/core/EVM/setAllowance.js.map +1 -1
- package/src/_esm/core/EVM/signPermitMessage.js +163 -0
- package/src/_esm/core/EVM/signPermitMessage.js.map +1 -0
- package/src/_esm/core/EVM/typeguards.js +5 -0
- package/src/_esm/core/EVM/typeguards.js.map +1 -0
- package/src/_esm/core/EVM/types.js.map +1 -1
- package/src/_esm/core/EVM/utils.js +2 -1
- package/src/_esm/core/EVM/utils.js.map +1 -1
- package/src/_esm/core/EVM/waitForBatchTransactionReceipt.js +28 -0
- package/src/_esm/core/EVM/waitForBatchTransactionReceipt.js.map +1 -0
- package/src/_esm/core/EVM/waitForRelayedTransactionReceipt.js +34 -0
- package/src/_esm/core/EVM/waitForRelayedTransactionReceipt.js.map +1 -0
- package/src/_esm/core/checkBalance.js +3 -3
- package/src/_esm/core/checkBalance.js.map +1 -1
- package/src/_esm/core/waitForTransactionStatus.js +4 -2
- package/src/_esm/core/waitForTransactionStatus.js.map +1 -1
- package/src/_esm/createConfig.js +1 -1
- package/src/_esm/createConfig.js.map +1 -1
- package/src/_esm/errors/constants.js +1 -0
- package/src/_esm/errors/constants.js.map +1 -1
- package/src/_esm/index.js +4 -2
- package/src/_esm/index.js.map +1 -1
- package/src/_esm/services/api.js +165 -72
- package/src/_esm/services/api.js.map +1 -1
- package/src/_esm/utils/checkPackageUpdates.js +17 -0
- package/src/_esm/utils/checkPackageUpdates.js.map +1 -0
- package/src/_esm/utils/convertQuoteToRoute.js +37 -0
- package/src/_esm/utils/convertQuoteToRoute.js.map +1 -0
- package/src/_esm/utils/fetchTxErrorDetails.js +9 -0
- package/src/_esm/utils/fetchTxErrorDetails.js.map +1 -0
- package/src/_esm/utils/invariant.js +43 -0
- package/src/_esm/utils/invariant.js.map +1 -0
- package/src/_esm/utils/waitForResult.js +19 -3
- package/src/_esm/utils/waitForResult.js.map +1 -1
- package/src/_esm/version.js +1 -1
- package/src/_esm/version.js.map +1 -1
- package/src/_types/constants.d.ts +3 -1
- package/src/_types/constants.d.ts.map +1 -1
- package/src/_types/core/EVM/EVM.d.ts.map +1 -1
- package/src/_types/core/EVM/EVMStepExecutor.d.ts +7 -4
- package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
- package/src/_types/core/EVM/abi.d.ts +202 -5
- package/src/_types/core/EVM/abi.d.ts.map +1 -1
- package/src/_types/core/EVM/checkAllowance.d.ts +12 -2
- package/src/_types/core/EVM/checkAllowance.d.ts.map +1 -1
- package/src/_types/core/EVM/getAllowance.d.ts +5 -4
- package/src/_types/core/EVM/getAllowance.d.ts.map +1 -1
- package/src/_types/core/EVM/getEVMBalance.d.ts +2 -1
- package/src/_types/core/EVM/getEVMBalance.d.ts.map +1 -1
- package/src/_types/core/EVM/getNativePermit.d.ts +18 -0
- package/src/_types/core/EVM/getNativePermit.d.ts.map +1 -0
- package/src/_types/core/EVM/permit2/allowanceTransfer.d.ts +41 -0
- package/src/_types/core/EVM/permit2/allowanceTransfer.d.ts.map +1 -0
- package/src/_types/core/EVM/permit2/constants.d.ts +8 -0
- package/src/_types/core/EVM/permit2/constants.d.ts.map +1 -0
- package/src/_types/core/EVM/permit2/domain.d.ts +8 -0
- package/src/_types/core/EVM/permit2/domain.d.ts.map +1 -0
- package/src/_types/core/EVM/permit2/signatureTransfer.d.ts +42 -0
- package/src/_types/core/EVM/permit2/signatureTransfer.d.ts.map +1 -0
- package/src/_types/core/EVM/setAllowance.d.ts +2 -2
- package/src/_types/core/EVM/setAllowance.d.ts.map +1 -1
- package/src/_types/core/EVM/signPermitMessage.d.ts +25 -0
- package/src/_types/core/EVM/signPermitMessage.d.ts.map +1 -0
- package/src/_types/core/EVM/typeguards.d.ts +4 -0
- package/src/_types/core/EVM/typeguards.d.ts.map +1 -0
- package/src/_types/core/EVM/types.d.ts +8 -18
- package/src/_types/core/EVM/types.d.ts.map +1 -1
- package/src/_types/core/EVM/utils.d.ts +2 -2
- package/src/_types/core/EVM/utils.d.ts.map +1 -1
- package/src/_types/core/EVM/waitForBatchTransactionReceipt.d.ts +4 -0
- package/src/_types/core/EVM/waitForBatchTransactionReceipt.d.ts.map +1 -0
- package/src/_types/core/EVM/waitForRelayedTransactionReceipt.d.ts +4 -0
- package/src/_types/core/EVM/waitForRelayedTransactionReceipt.d.ts.map +1 -0
- package/src/_types/core/checkBalance.d.ts.map +1 -1
- package/src/_types/core/waitForTransactionStatus.d.ts.map +1 -1
- package/src/_types/createConfig.d.ts.map +1 -1
- package/src/_types/errors/constants.d.ts +2 -1
- package/src/_types/errors/constants.d.ts.map +1 -1
- package/src/_types/index.d.ts +5 -3
- package/src/_types/index.d.ts.map +1 -1
- package/src/_types/services/api.d.ts +93 -26
- package/src/_types/services/api.d.ts.map +1 -1
- package/src/_types/utils/checkPackageUpdates.d.ts +2 -0
- package/src/_types/utils/checkPackageUpdates.d.ts.map +1 -0
- package/src/_types/utils/convertQuoteToRoute.d.ts +11 -0
- package/src/_types/utils/convertQuoteToRoute.d.ts.map +1 -0
- package/src/_types/utils/fetchTxErrorDetails.d.ts +2 -0
- package/src/_types/utils/fetchTxErrorDetails.d.ts.map +1 -0
- package/src/_types/utils/invariant.d.ts +22 -0
- package/src/_types/utils/invariant.d.ts.map +1 -0
- package/src/_types/utils/waitForResult.d.ts +4 -1
- package/src/_types/utils/waitForResult.d.ts.map +1 -1
- package/src/_types/version.d.ts +1 -1
- package/src/_types/version.d.ts.map +1 -1
- package/src/constants.ts +6 -1
- package/src/core/EVM/EVM.ts +0 -4
- package/src/core/EVM/EVMStepExecutor.ts +242 -146
- package/src/core/EVM/abi.ts +40 -43
- package/src/core/EVM/checkAllowance.ts +96 -92
- package/src/core/EVM/getAllowance.ts +8 -8
- package/src/core/EVM/getEVMBalance.ts +2 -2
- package/src/core/EVM/getNativePermit.ts +114 -0
- package/src/core/EVM/parseEVMErrors.ts +9 -1
- package/src/core/EVM/permit2/allowanceTransfer.ts +168 -0
- package/src/core/EVM/permit2/constants.ts +11 -0
- package/src/core/EVM/permit2/domain.ts +20 -0
- package/src/core/EVM/permit2/signatureTransfer.ts +214 -0
- package/src/core/EVM/setAllowance.ts +14 -15
- package/src/core/EVM/signPermitMessage.ts +280 -0
- package/src/core/EVM/typeguards.ts +7 -0
- package/src/core/EVM/types.ts +11 -26
- package/src/core/EVM/utils.ts +4 -3
- package/src/core/EVM/waitForBatchTransactionReceipt.ts +61 -0
- package/src/core/EVM/waitForRelayedTransactionReceipt.ts +50 -0
- package/src/core/checkBalance.ts +6 -3
- package/src/core/waitForTransactionStatus.ts +6 -2
- package/src/createConfig.ts +1 -1
- package/src/errors/constants.ts +1 -0
- package/src/index.ts +4 -8
- package/src/services/api.ts +279 -105
- package/src/utils/checkPackageUpdates.ts +22 -0
- package/src/utils/convertQuoteToRoute.ts +45 -0
- package/src/utils/fetchTxErrorDetails.ts +10 -0
- package/src/utils/invariant.ts +51 -0
- package/src/utils/waitForResult.ts +22 -3
- package/src/version.ts +1 -1
- package/src/_cjs/core/EVM/multisig.js +0 -29
- package/src/_cjs/core/EVM/multisig.js.map +0 -1
- package/src/_cjs/helpers.js +0 -55
- package/src/_cjs/helpers.js.map +0 -1
- package/src/_esm/core/EVM/multisig.js +0 -25
- package/src/_esm/core/EVM/multisig.js.map +0 -1
- package/src/_esm/helpers.js +0 -58
- package/src/_esm/helpers.js.map +0 -1
- package/src/_types/core/EVM/multisig.d.ts +0 -6
- package/src/_types/core/EVM/multisig.d.ts.map +0 -1
- package/src/_types/helpers.d.ts +0 -13
- package/src/_types/helpers.d.ts.map +0 -1
- package/src/core/EVM/multisig.ts +0 -54
- package/src/helpers.ts +0 -75
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { hashTypedData } from 'viem'
|
|
2
|
+
import type { Address, TypedData, TypedDataDomain } from 'viem'
|
|
3
|
+
import { invariant } from '../../../utils/invariant.js'
|
|
4
|
+
import {
|
|
5
|
+
MaxSigDeadline,
|
|
6
|
+
MaxSignatureTransferAmount,
|
|
7
|
+
MaxUnorderedNonce,
|
|
8
|
+
} from './constants.js'
|
|
9
|
+
import { permit2Domain } from './domain.js'
|
|
10
|
+
|
|
11
|
+
export interface Witness {
|
|
12
|
+
witness: any
|
|
13
|
+
witnessTypeName: string
|
|
14
|
+
witnessType: { [key: string]: { name: string; type: string }[] }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface TokenPermissions {
|
|
18
|
+
token: Address
|
|
19
|
+
amount: bigint
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface PermitTransferFrom {
|
|
23
|
+
permitted: TokenPermissions
|
|
24
|
+
spender: Address
|
|
25
|
+
nonce: bigint
|
|
26
|
+
deadline: bigint
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface PermitBatchTransferFrom {
|
|
30
|
+
permitted: TokenPermissions[]
|
|
31
|
+
spender: Address
|
|
32
|
+
nonce: bigint
|
|
33
|
+
deadline: bigint
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type PermitTransferFromData = {
|
|
37
|
+
domain: TypedDataDomain
|
|
38
|
+
types: TypedData
|
|
39
|
+
values: PermitTransferFrom
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export type PermitBatchTransferFromData = {
|
|
43
|
+
domain: TypedDataDomain
|
|
44
|
+
types: TypedData
|
|
45
|
+
values: PermitBatchTransferFrom
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const TOKEN_PERMISSIONS = [
|
|
49
|
+
{ name: 'token', type: 'address' },
|
|
50
|
+
{ name: 'amount', type: 'uint256' },
|
|
51
|
+
] as const
|
|
52
|
+
|
|
53
|
+
const PERMIT_TRANSFER_FROM_TYPES = {
|
|
54
|
+
TokenPermissions: TOKEN_PERMISSIONS,
|
|
55
|
+
PermitTransferFrom: [
|
|
56
|
+
{ name: 'permitted', type: 'TokenPermissions' },
|
|
57
|
+
{ name: 'spender', type: 'address' },
|
|
58
|
+
{ name: 'nonce', type: 'uint256' },
|
|
59
|
+
{ name: 'deadline', type: 'uint256' },
|
|
60
|
+
],
|
|
61
|
+
} as const
|
|
62
|
+
|
|
63
|
+
const PERMIT_BATCH_TRANSFER_FROM_TYPES = {
|
|
64
|
+
TokenPermissions: TOKEN_PERMISSIONS,
|
|
65
|
+
PermitBatchTransferFrom: [
|
|
66
|
+
{ name: 'permitted', type: 'TokenPermissions[]' },
|
|
67
|
+
{ name: 'spender', type: 'address' },
|
|
68
|
+
{ name: 'nonce', type: 'uint256' },
|
|
69
|
+
{ name: 'deadline', type: 'uint256' },
|
|
70
|
+
],
|
|
71
|
+
} as const
|
|
72
|
+
|
|
73
|
+
function isPermitTransferFrom(
|
|
74
|
+
permit: PermitTransferFrom | PermitBatchTransferFrom
|
|
75
|
+
): permit is PermitTransferFrom {
|
|
76
|
+
return !Array.isArray(permit.permitted)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function getPermitTransferData(
|
|
80
|
+
permit: PermitTransferFrom,
|
|
81
|
+
permit2Address: Address,
|
|
82
|
+
chainId: number,
|
|
83
|
+
witness?: Witness
|
|
84
|
+
): PermitTransferFromData {
|
|
85
|
+
invariant(MaxSigDeadline >= permit.deadline, 'SIG_DEADLINE_OUT_OF_RANGE')
|
|
86
|
+
invariant(MaxUnorderedNonce >= permit.nonce, 'NONCE_OUT_OF_RANGE')
|
|
87
|
+
|
|
88
|
+
const domain = permit2Domain(permit2Address, chainId)
|
|
89
|
+
|
|
90
|
+
validateTokenPermissions(permit.permitted)
|
|
91
|
+
|
|
92
|
+
const types = witness
|
|
93
|
+
? ({
|
|
94
|
+
TokenPermissions: TOKEN_PERMISSIONS,
|
|
95
|
+
...witness.witnessType,
|
|
96
|
+
PermitWitnessTransferFrom: [
|
|
97
|
+
{ name: 'permitted', type: 'TokenPermissions' },
|
|
98
|
+
{ name: 'spender', type: 'address' },
|
|
99
|
+
{ name: 'nonce', type: 'uint256' },
|
|
100
|
+
{ name: 'deadline', type: 'uint256' },
|
|
101
|
+
{ name: 'witness', type: witness.witnessTypeName },
|
|
102
|
+
],
|
|
103
|
+
} as const)
|
|
104
|
+
: PERMIT_TRANSFER_FROM_TYPES
|
|
105
|
+
|
|
106
|
+
const values = witness
|
|
107
|
+
? Object.assign(permit, { witness: witness.witness })
|
|
108
|
+
: permit
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
domain,
|
|
112
|
+
types,
|
|
113
|
+
values,
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function getPermitBatchTransferData(
|
|
118
|
+
permit: PermitBatchTransferFrom,
|
|
119
|
+
permit2Address: Address,
|
|
120
|
+
chainId: number,
|
|
121
|
+
witness?: Witness
|
|
122
|
+
): PermitBatchTransferFromData {
|
|
123
|
+
invariant(MaxSigDeadline >= permit.deadline, 'SIG_DEADLINE_OUT_OF_RANGE')
|
|
124
|
+
invariant(MaxUnorderedNonce >= permit.nonce, 'NONCE_OUT_OF_RANGE')
|
|
125
|
+
|
|
126
|
+
const domain = permit2Domain(permit2Address, chainId)
|
|
127
|
+
|
|
128
|
+
permit.permitted.forEach(validateTokenPermissions)
|
|
129
|
+
|
|
130
|
+
const types = witness
|
|
131
|
+
? {
|
|
132
|
+
...witness.witnessType,
|
|
133
|
+
TokenPermissions: TOKEN_PERMISSIONS,
|
|
134
|
+
PermitBatchWitnessTransferFrom: [
|
|
135
|
+
{ name: 'permitted', type: 'TokenPermissions[]' },
|
|
136
|
+
{ name: 'spender', type: 'address' },
|
|
137
|
+
{ name: 'nonce', type: 'uint256' },
|
|
138
|
+
{ name: 'deadline', type: 'uint256' },
|
|
139
|
+
{ name: 'witness', type: witness.witnessTypeName },
|
|
140
|
+
],
|
|
141
|
+
}
|
|
142
|
+
: PERMIT_BATCH_TRANSFER_FROM_TYPES
|
|
143
|
+
|
|
144
|
+
const values = witness
|
|
145
|
+
? Object.assign(permit, { witness: witness.witness })
|
|
146
|
+
: permit
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
domain,
|
|
150
|
+
types,
|
|
151
|
+
values,
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// return the data to be sent in a eth_signTypedData RPC call
|
|
156
|
+
// for signing the given permit data
|
|
157
|
+
export function getPermitData(
|
|
158
|
+
permit: PermitTransferFrom | PermitBatchTransferFrom,
|
|
159
|
+
permit2Address: Address,
|
|
160
|
+
chainId: number,
|
|
161
|
+
witness?: Witness
|
|
162
|
+
): PermitTransferFromData | PermitBatchTransferFromData {
|
|
163
|
+
if (isPermitTransferFrom(permit)) {
|
|
164
|
+
return getPermitTransferData(permit, permit2Address, chainId, witness)
|
|
165
|
+
}
|
|
166
|
+
return getPermitBatchTransferData(permit, permit2Address, chainId, witness)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function hash(
|
|
170
|
+
permit: PermitTransferFrom | PermitBatchTransferFrom,
|
|
171
|
+
permit2Address: Address,
|
|
172
|
+
chainId: number,
|
|
173
|
+
witness?: Witness
|
|
174
|
+
) {
|
|
175
|
+
if (isPermitTransferFrom(permit)) {
|
|
176
|
+
const { domain, types, values } = getPermitTransferData(
|
|
177
|
+
permit,
|
|
178
|
+
permit2Address,
|
|
179
|
+
chainId,
|
|
180
|
+
witness
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
return hashTypedData({
|
|
184
|
+
domain,
|
|
185
|
+
types,
|
|
186
|
+
primaryType: witness ? 'PermitWitnessTransferFrom' : 'PermitTransferFrom',
|
|
187
|
+
message: {
|
|
188
|
+
...values,
|
|
189
|
+
},
|
|
190
|
+
})
|
|
191
|
+
}
|
|
192
|
+
const { domain, types, values } = getPermitBatchTransferData(
|
|
193
|
+
permit,
|
|
194
|
+
permit2Address,
|
|
195
|
+
chainId,
|
|
196
|
+
witness
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
return hashTypedData({
|
|
200
|
+
domain,
|
|
201
|
+
types,
|
|
202
|
+
primaryType: witness
|
|
203
|
+
? 'PermitBatchWitnessTransferFrom'
|
|
204
|
+
: 'PermitBatchTransferFrom',
|
|
205
|
+
message: { ...values },
|
|
206
|
+
})
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function validateTokenPermissions(permissions: TokenPermissions) {
|
|
210
|
+
invariant(
|
|
211
|
+
MaxSignatureTransferAmount >= permissions.amount,
|
|
212
|
+
'AMOUNT_OUT_OF_RANGE'
|
|
213
|
+
)
|
|
214
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Client, Hash, SendTransactionParameters } from 'viem'
|
|
1
|
+
import type { Address, Client, Hash, SendTransactionParameters } from 'viem'
|
|
2
2
|
import { encodeFunctionData } from 'viem'
|
|
3
3
|
import { sendTransaction } from 'viem/actions'
|
|
4
4
|
import { getAction } from 'viem/utils'
|
|
@@ -11,10 +11,10 @@ import { getMaxPriorityFeePerGas } from './utils.js'
|
|
|
11
11
|
|
|
12
12
|
export const setAllowance = async (
|
|
13
13
|
client: Client,
|
|
14
|
-
tokenAddress:
|
|
15
|
-
contractAddress:
|
|
14
|
+
tokenAddress: Address,
|
|
15
|
+
contractAddress: Address,
|
|
16
16
|
amount: bigint,
|
|
17
|
-
|
|
17
|
+
executionOptions?: ExecutionOptions,
|
|
18
18
|
returnPopulatedTransaction?: boolean
|
|
19
19
|
): Promise<Hash> => {
|
|
20
20
|
const data = encodeFunctionData({
|
|
@@ -36,9 +36,9 @@ export const setAllowance = async (
|
|
|
36
36
|
: undefined,
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
if (
|
|
39
|
+
if (executionOptions?.updateTransactionRequestHook) {
|
|
40
40
|
const customizedTransactionRequest: TransactionParameters =
|
|
41
|
-
await
|
|
41
|
+
await executionOptions.updateTransactionRequestHook({
|
|
42
42
|
requestType: 'approve',
|
|
43
43
|
...transactionRequest,
|
|
44
44
|
})
|
|
@@ -61,7 +61,6 @@ export const setAllowance = async (
|
|
|
61
61
|
gasPrice: transactionRequest.gasPrice,
|
|
62
62
|
maxFeePerGas: transactionRequest.maxFeePerGas,
|
|
63
63
|
maxPriorityFeePerGas: transactionRequest.maxPriorityFeePerGas,
|
|
64
|
-
chain: null,
|
|
65
64
|
} as SendTransactionParameters)
|
|
66
65
|
}
|
|
67
66
|
|
|
@@ -86,16 +85,16 @@ export const setTokenAllowance = async ({
|
|
|
86
85
|
}
|
|
87
86
|
const approvedAmount = await getAllowance(
|
|
88
87
|
token.chainId,
|
|
89
|
-
token.address,
|
|
88
|
+
token.address as Address,
|
|
90
89
|
walletClient.account!.address,
|
|
91
|
-
spenderAddress
|
|
90
|
+
spenderAddress as Address
|
|
92
91
|
)
|
|
93
92
|
|
|
94
93
|
if (amount > approvedAmount) {
|
|
95
94
|
const approveTx = await setAllowance(
|
|
96
95
|
walletClient,
|
|
97
|
-
token.address,
|
|
98
|
-
spenderAddress,
|
|
96
|
+
token.address as Address,
|
|
97
|
+
spenderAddress as Address,
|
|
99
98
|
amount
|
|
100
99
|
)
|
|
101
100
|
|
|
@@ -122,15 +121,15 @@ export const revokeTokenApproval = async ({
|
|
|
122
121
|
}
|
|
123
122
|
const approvedAmount = await getAllowance(
|
|
124
123
|
token.chainId,
|
|
125
|
-
token.address,
|
|
124
|
+
token.address as Address,
|
|
126
125
|
walletClient.account!.address,
|
|
127
|
-
spenderAddress
|
|
126
|
+
spenderAddress as Address
|
|
128
127
|
)
|
|
129
128
|
if (approvedAmount > 0) {
|
|
130
129
|
const approveTx = await setAllowance(
|
|
131
130
|
walletClient,
|
|
132
|
-
token.address,
|
|
133
|
-
spenderAddress,
|
|
131
|
+
token.address as Address,
|
|
132
|
+
spenderAddress as Address,
|
|
134
133
|
0n
|
|
135
134
|
)
|
|
136
135
|
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import type { ExtendedChain } from '@lifi/types'
|
|
2
|
+
import type { Address, Client, Hex } from 'viem'
|
|
3
|
+
import { encodeFunctionData, keccak256, parseSignature } from 'viem'
|
|
4
|
+
import { readContract, signTypedData } from 'viem/actions'
|
|
5
|
+
import { getAction } from 'viem/utils'
|
|
6
|
+
import type { TransactionParameters } from '../types.js'
|
|
7
|
+
import { eip2612Types, permit2ProxyAbi } from './abi.js'
|
|
8
|
+
import { type NativePermitData, getNativePermit } from './getNativePermit.js'
|
|
9
|
+
import {
|
|
10
|
+
type PermitBatchTransferFromData,
|
|
11
|
+
type PermitTransferFrom,
|
|
12
|
+
type PermitTransferFromData,
|
|
13
|
+
getPermitData,
|
|
14
|
+
} from './permit2/signatureTransfer.js'
|
|
15
|
+
|
|
16
|
+
export interface PermitSignature {
|
|
17
|
+
signature: Hex
|
|
18
|
+
data: Hex
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const signNativePermitMessage = async (
|
|
22
|
+
client: Client,
|
|
23
|
+
transactionRequest: TransactionParameters,
|
|
24
|
+
chain: ExtendedChain,
|
|
25
|
+
tokenAddress: Address,
|
|
26
|
+
amount: bigint,
|
|
27
|
+
nativePermit: NativePermitData
|
|
28
|
+
): Promise<PermitSignature> => {
|
|
29
|
+
const deadline = BigInt(Math.floor(Date.now() / 1000) + 30 * 60) // 30 minutes
|
|
30
|
+
|
|
31
|
+
const domain = {
|
|
32
|
+
name: nativePermit.name,
|
|
33
|
+
version: nativePermit.version,
|
|
34
|
+
chainId: chain.id,
|
|
35
|
+
verifyingContract: tokenAddress,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const message = {
|
|
39
|
+
owner: client.account!.address,
|
|
40
|
+
spender: chain.permit2Proxy as Address,
|
|
41
|
+
value: amount,
|
|
42
|
+
nonce: nativePermit.nonce,
|
|
43
|
+
deadline,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const signature = await getAction(
|
|
47
|
+
client,
|
|
48
|
+
signTypedData,
|
|
49
|
+
'signTypedData'
|
|
50
|
+
)({
|
|
51
|
+
account: client.account!,
|
|
52
|
+
domain,
|
|
53
|
+
types: eip2612Types,
|
|
54
|
+
primaryType: 'Permit',
|
|
55
|
+
message,
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
const { v, r, s } = parseSignature(signature)
|
|
59
|
+
|
|
60
|
+
const data = encodeFunctionData({
|
|
61
|
+
abi: permit2ProxyAbi,
|
|
62
|
+
functionName: 'callDiamondWithEIP2612Signature',
|
|
63
|
+
args: [
|
|
64
|
+
tokenAddress,
|
|
65
|
+
amount,
|
|
66
|
+
deadline,
|
|
67
|
+
Number(v),
|
|
68
|
+
r,
|
|
69
|
+
s,
|
|
70
|
+
transactionRequest.data as Hex,
|
|
71
|
+
],
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
signature,
|
|
76
|
+
data,
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export const signPermit2Message = async (
|
|
81
|
+
client: Client,
|
|
82
|
+
transactionRequest: TransactionParameters,
|
|
83
|
+
chain: ExtendedChain,
|
|
84
|
+
tokenAddress: Address,
|
|
85
|
+
amount: bigint
|
|
86
|
+
) => {
|
|
87
|
+
const nonce = await readContract(client, {
|
|
88
|
+
address: chain.permit2Proxy as Address,
|
|
89
|
+
abi: permit2ProxyAbi,
|
|
90
|
+
functionName: 'nextNonce',
|
|
91
|
+
args: [client.account!.address],
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
const permitTransferFrom: PermitTransferFrom = {
|
|
95
|
+
permitted: {
|
|
96
|
+
token: tokenAddress,
|
|
97
|
+
amount: amount,
|
|
98
|
+
},
|
|
99
|
+
spender: chain.permit2Proxy as Address,
|
|
100
|
+
nonce: nonce,
|
|
101
|
+
deadline: BigInt(Math.floor(Date.now() / 1000) + 30 * 60), // 30 minutes
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const { domain, types, values } = getPermitData(
|
|
105
|
+
permitTransferFrom,
|
|
106
|
+
chain.permit2 as Address,
|
|
107
|
+
chain.id
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
const signature = await getAction(
|
|
111
|
+
client,
|
|
112
|
+
signTypedData,
|
|
113
|
+
'signTypedData'
|
|
114
|
+
)({
|
|
115
|
+
account: client.account!,
|
|
116
|
+
primaryType: 'PermitTransferFrom',
|
|
117
|
+
domain,
|
|
118
|
+
types,
|
|
119
|
+
message: { ...values },
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
const data = encodeFunctionData({
|
|
123
|
+
abi: permit2ProxyAbi,
|
|
124
|
+
functionName: 'callDiamondWithPermit2',
|
|
125
|
+
args: [
|
|
126
|
+
transactionRequest.data as Hex,
|
|
127
|
+
[
|
|
128
|
+
[tokenAddress, amount],
|
|
129
|
+
permitTransferFrom.nonce,
|
|
130
|
+
permitTransferFrom.deadline,
|
|
131
|
+
],
|
|
132
|
+
signature as Hex,
|
|
133
|
+
],
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
signature,
|
|
138
|
+
data,
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export const signPermit2WitnessMessage = async (
|
|
143
|
+
client: Client,
|
|
144
|
+
transactionRequest: TransactionParameters,
|
|
145
|
+
chain: ExtendedChain,
|
|
146
|
+
tokenAddress: Address,
|
|
147
|
+
amount: bigint,
|
|
148
|
+
permitData?: PermitTransferFromData | PermitBatchTransferFromData
|
|
149
|
+
): Promise<PermitSignature> => {
|
|
150
|
+
let _permitData = permitData
|
|
151
|
+
if (!_permitData) {
|
|
152
|
+
const nonce = await readContract(client, {
|
|
153
|
+
address: chain.permit2Proxy as Address,
|
|
154
|
+
abi: permit2ProxyAbi,
|
|
155
|
+
functionName: 'nextNonce',
|
|
156
|
+
args: [client.account!.address],
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
const permitTransferFrom: PermitTransferFrom = {
|
|
160
|
+
permitted: {
|
|
161
|
+
token: tokenAddress,
|
|
162
|
+
amount: amount,
|
|
163
|
+
},
|
|
164
|
+
spender: chain.permit2Proxy as Address,
|
|
165
|
+
nonce: nonce,
|
|
166
|
+
deadline: BigInt(Math.floor(Date.now() / 1000) + 30 * 60), // 30 minutes
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Create witness data for the LI.FI call
|
|
170
|
+
const witness = {
|
|
171
|
+
witness: {
|
|
172
|
+
diamondAddress: chain.diamondAddress as Address,
|
|
173
|
+
diamondCalldataHash: keccak256(transactionRequest.data as Hex),
|
|
174
|
+
},
|
|
175
|
+
witnessTypeName: 'LiFiCall',
|
|
176
|
+
witnessType: {
|
|
177
|
+
LiFiCall: [
|
|
178
|
+
{ name: 'diamondAddress', type: 'address' },
|
|
179
|
+
{ name: 'diamondCalldataHash', type: 'bytes32' },
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
_permitData = getPermitData(
|
|
185
|
+
permitTransferFrom,
|
|
186
|
+
chain.permit2 as Address,
|
|
187
|
+
chain.id,
|
|
188
|
+
witness
|
|
189
|
+
)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const signature = await getAction(
|
|
193
|
+
client,
|
|
194
|
+
signTypedData,
|
|
195
|
+
'signTypedData'
|
|
196
|
+
)({
|
|
197
|
+
account: client.account!,
|
|
198
|
+
primaryType: 'PermitWitnessTransferFrom',
|
|
199
|
+
domain: _permitData.domain,
|
|
200
|
+
types: _permitData.types,
|
|
201
|
+
message: { ..._permitData.values },
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
const data = encodeFunctionData({
|
|
205
|
+
abi: permit2ProxyAbi,
|
|
206
|
+
functionName: 'callDiamondWithPermit2Witness',
|
|
207
|
+
args: [
|
|
208
|
+
transactionRequest.data as Hex,
|
|
209
|
+
client.account!.address,
|
|
210
|
+
[
|
|
211
|
+
[tokenAddress, amount],
|
|
212
|
+
_permitData.values.nonce,
|
|
213
|
+
_permitData.values.deadline,
|
|
214
|
+
],
|
|
215
|
+
signature as Hex,
|
|
216
|
+
],
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
return {
|
|
220
|
+
signature,
|
|
221
|
+
data,
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export const signPermitMessage = async (
|
|
226
|
+
client: Client,
|
|
227
|
+
{
|
|
228
|
+
transactionRequest,
|
|
229
|
+
chain,
|
|
230
|
+
tokenAddress,
|
|
231
|
+
amount,
|
|
232
|
+
nativePermit,
|
|
233
|
+
permitData,
|
|
234
|
+
useWitness = false,
|
|
235
|
+
}: {
|
|
236
|
+
transactionRequest: TransactionParameters
|
|
237
|
+
chain: ExtendedChain
|
|
238
|
+
tokenAddress: Address
|
|
239
|
+
amount: bigint
|
|
240
|
+
nativePermit?: NativePermitData
|
|
241
|
+
permitData?: PermitTransferFromData | PermitBatchTransferFromData
|
|
242
|
+
useWitness?: boolean
|
|
243
|
+
}
|
|
244
|
+
): Promise<PermitSignature> => {
|
|
245
|
+
let _nativePermit = nativePermit
|
|
246
|
+
|
|
247
|
+
if (!_nativePermit) {
|
|
248
|
+
_nativePermit = await getNativePermit(client, chain, tokenAddress)
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (_nativePermit.supported) {
|
|
252
|
+
return signNativePermitMessage(
|
|
253
|
+
client,
|
|
254
|
+
transactionRequest,
|
|
255
|
+
chain,
|
|
256
|
+
tokenAddress,
|
|
257
|
+
amount,
|
|
258
|
+
_nativePermit
|
|
259
|
+
)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (useWitness) {
|
|
263
|
+
return signPermit2WitnessMessage(
|
|
264
|
+
client,
|
|
265
|
+
transactionRequest,
|
|
266
|
+
chain,
|
|
267
|
+
tokenAddress,
|
|
268
|
+
amount,
|
|
269
|
+
permitData
|
|
270
|
+
)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return signPermit2Message(
|
|
274
|
+
client,
|
|
275
|
+
transactionRequest,
|
|
276
|
+
chain,
|
|
277
|
+
tokenAddress,
|
|
278
|
+
amount
|
|
279
|
+
)
|
|
280
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { LiFiStepExtended } from '../types.js'
|
|
2
|
+
import type { EVMPermitStep } from './types.js'
|
|
3
|
+
|
|
4
|
+
export function isEVMPermitStep(step: LiFiStepExtended): step is EVMPermitStep {
|
|
5
|
+
const evmStep = step as EVMPermitStep
|
|
6
|
+
return 'permit' in evmStep || 'permitData' in evmStep || 'witness' in evmStep
|
|
7
|
+
}
|
package/src/core/EVM/types.ts
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import { type BaseToken, ChainType } from '@lifi/types'
|
|
2
|
-
import type { Client
|
|
3
|
-
import type { SwitchChainHook } from '../types.js'
|
|
2
|
+
import type { Client } from 'viem'
|
|
3
|
+
import type { LiFiStepExtended, SwitchChainHook } from '../types.js'
|
|
4
4
|
import type { SDKProvider } from '../types.js'
|
|
5
|
+
import type { PermitData } from './permit2/domain.js'
|
|
6
|
+
import type {
|
|
7
|
+
PermitTransferFrom,
|
|
8
|
+
Witness,
|
|
9
|
+
} from './permit2/signatureTransfer.js'
|
|
5
10
|
|
|
6
11
|
export interface EVMProviderOptions {
|
|
7
12
|
getWalletClient?: () => Promise<Client>
|
|
8
13
|
switchChain?: SwitchChainHook
|
|
9
|
-
multisig?: MultisigConfig
|
|
10
14
|
}
|
|
11
15
|
|
|
12
16
|
export interface EVMProvider extends SDKProvider {
|
|
13
17
|
setOptions(options: EVMProviderOptions): void
|
|
14
|
-
multisig?: MultisigConfig
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
export function isEVM(provider: SDKProvider): provider is EVMProvider {
|
|
@@ -51,26 +54,8 @@ export interface RevokeApprovalRequest {
|
|
|
51
54
|
spenderAddress: string
|
|
52
55
|
}
|
|
53
56
|
|
|
54
|
-
export interface
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
export interface MultisigTransaction {
|
|
60
|
-
to: string
|
|
61
|
-
value?: bigint
|
|
62
|
-
data: string
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export interface MultisigConfig {
|
|
66
|
-
isMultisigWalletClient: boolean
|
|
67
|
-
getMultisigTransactionDetails: (
|
|
68
|
-
txHash: Hash,
|
|
69
|
-
fromChainId: number,
|
|
70
|
-
updateIntermediateStatus?: () => void
|
|
71
|
-
) => Promise<MultisigTxDetails>
|
|
72
|
-
sendBatchTransaction?: (
|
|
73
|
-
batchTransactions: MultisigTransaction[]
|
|
74
|
-
) => Promise<Hash>
|
|
75
|
-
shouldBatchTransactions?: boolean
|
|
57
|
+
export interface EVMPermitStep extends LiFiStepExtended {
|
|
58
|
+
permit: PermitTransferFrom
|
|
59
|
+
permitData: PermitData
|
|
60
|
+
witness: Witness
|
|
76
61
|
}
|
package/src/core/EVM/utils.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ChainId } from '@lifi/types'
|
|
2
|
-
import type { Client, Transaction } from 'viem'
|
|
2
|
+
import type { Address, Client, Transaction } from 'viem'
|
|
3
3
|
import { getBlock } from 'viem/actions'
|
|
4
4
|
import { config } from '../../config.js'
|
|
5
5
|
import { median } from '../../utils/median.js'
|
|
@@ -37,9 +37,10 @@ export const getMaxPriorityFeePerGas = async (
|
|
|
37
37
|
// Multicall
|
|
38
38
|
export const getMulticallAddress = async (
|
|
39
39
|
chainId: ChainId
|
|
40
|
-
): Promise<
|
|
40
|
+
): Promise<Address | undefined> => {
|
|
41
41
|
const chains = await config.getChains()
|
|
42
|
-
return chains.find((chain) => chain.id === chainId)
|
|
42
|
+
return chains.find((chain) => chain.id === chainId)
|
|
43
|
+
?.multicallAddress as Address
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
// Modified viem retryDelay exponential backoff function.
|