@lifi/sdk 3.5.1-beta.0 → 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.
Files changed (224) hide show
  1. package/package.json +6 -3
  2. package/src/_cjs/constants.js +4 -2
  3. package/src/_cjs/constants.js.map +1 -1
  4. package/src/_cjs/core/EVM/EVM.js +0 -4
  5. package/src/_cjs/core/EVM/EVM.js.map +1 -1
  6. package/src/_cjs/core/EVM/EVMStepExecutor.js +156 -81
  7. package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
  8. package/src/_cjs/core/EVM/abi.js +36 -43
  9. package/src/_cjs/core/EVM/abi.js.map +1 -1
  10. package/src/_cjs/core/EVM/checkAllowance.js +36 -30
  11. package/src/_cjs/core/EVM/checkAllowance.js.map +1 -1
  12. package/src/_cjs/core/EVM/getAllowance.js.map +1 -1
  13. package/src/_cjs/core/EVM/getEVMBalance.js.map +1 -1
  14. package/src/_cjs/core/EVM/getNativePermit.js +90 -0
  15. package/src/_cjs/core/EVM/getNativePermit.js.map +1 -0
  16. package/src/_cjs/core/EVM/parseEVMErrors.js +5 -2
  17. package/src/_cjs/core/EVM/parseEVMErrors.js.map +1 -1
  18. package/src/_cjs/core/EVM/permit2/allowanceTransfer.js +100 -0
  19. package/src/_cjs/core/EVM/permit2/allowanceTransfer.js.map +1 -0
  20. package/src/_cjs/core/EVM/permit2/constants.js +12 -0
  21. package/src/_cjs/core/EVM/permit2/constants.js.map +1 -0
  22. package/src/_cjs/core/EVM/permit2/domain.js +12 -0
  23. package/src/_cjs/core/EVM/permit2/domain.js.map +1 -0
  24. package/src/_cjs/core/EVM/permit2/signatureTransfer.js +121 -0
  25. package/src/_cjs/core/EVM/permit2/signatureTransfer.js.map +1 -0
  26. package/src/_cjs/core/EVM/setAllowance.js +3 -4
  27. package/src/_cjs/core/EVM/setAllowance.js.map +1 -1
  28. package/src/_cjs/core/EVM/signPermitMessage.js +169 -0
  29. package/src/_cjs/core/EVM/signPermitMessage.js.map +1 -0
  30. package/src/_cjs/core/EVM/typeguards.js +8 -0
  31. package/src/_cjs/core/EVM/typeguards.js.map +1 -0
  32. package/src/_cjs/core/EVM/types.js.map +1 -1
  33. package/src/_cjs/core/EVM/utils.js +2 -1
  34. package/src/_cjs/core/EVM/utils.js.map +1 -1
  35. package/src/_cjs/core/EVM/waitForBatchTransactionReceipt.js +32 -0
  36. package/src/_cjs/core/EVM/waitForBatchTransactionReceipt.js.map +1 -0
  37. package/src/_cjs/core/EVM/waitForRelayedTransactionReceipt.js +38 -0
  38. package/src/_cjs/core/EVM/waitForRelayedTransactionReceipt.js.map +1 -0
  39. package/src/_cjs/core/checkBalance.js +3 -3
  40. package/src/_cjs/core/checkBalance.js.map +1 -1
  41. package/src/_cjs/core/waitForTransactionStatus.js +4 -2
  42. package/src/_cjs/core/waitForTransactionStatus.js.map +1 -1
  43. package/src/_cjs/createConfig.js +2 -2
  44. package/src/_cjs/createConfig.js.map +1 -1
  45. package/src/_cjs/errors/constants.js +1 -0
  46. package/src/_cjs/errors/constants.js.map +1 -1
  47. package/src/_cjs/index.js +9 -6
  48. package/src/_cjs/index.js.map +1 -1
  49. package/src/_cjs/services/api.js +127 -53
  50. package/src/_cjs/services/api.js.map +1 -1
  51. package/src/_cjs/utils/checkPackageUpdates.js +20 -0
  52. package/src/_cjs/utils/checkPackageUpdates.js.map +1 -0
  53. package/src/_cjs/utils/convertQuoteToRoute.js +33 -0
  54. package/src/_cjs/utils/convertQuoteToRoute.js.map +1 -0
  55. package/src/_cjs/utils/fetchTxErrorDetails.js +13 -0
  56. package/src/_cjs/utils/fetchTxErrorDetails.js.map +1 -0
  57. package/src/_cjs/utils/invariant.js +17 -0
  58. package/src/_cjs/utils/invariant.js.map +1 -0
  59. package/src/_cjs/utils/waitForResult.js +16 -3
  60. package/src/_cjs/utils/waitForResult.js.map +1 -1
  61. package/src/_cjs/version.js +1 -1
  62. package/src/_esm/constants.js +3 -1
  63. package/src/_esm/constants.js.map +1 -1
  64. package/src/_esm/core/EVM/EVM.js +0 -4
  65. package/src/_esm/core/EVM/EVM.js.map +1 -1
  66. package/src/_esm/core/EVM/EVMStepExecutor.js +186 -92
  67. package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
  68. package/src/_esm/core/EVM/abi.js +37 -42
  69. package/src/_esm/core/EVM/abi.js.map +1 -1
  70. package/src/_esm/core/EVM/checkAllowance.js +41 -32
  71. package/src/_esm/core/EVM/checkAllowance.js.map +1 -1
  72. package/src/_esm/core/EVM/getAllowance.js.map +1 -1
  73. package/src/_esm/core/EVM/getEVMBalance.js.map +1 -1
  74. package/src/_esm/core/EVM/getNativePermit.js +95 -0
  75. package/src/_esm/core/EVM/getNativePermit.js.map +1 -0
  76. package/src/_esm/core/EVM/parseEVMErrors.js +9 -1
  77. package/src/_esm/core/EVM/parseEVMErrors.js.map +1 -1
  78. package/src/_esm/core/EVM/permit2/allowanceTransfer.js +93 -0
  79. package/src/_esm/core/EVM/permit2/allowanceTransfer.js.map +1 -0
  80. package/src/_esm/core/EVM/permit2/constants.js +9 -0
  81. package/src/_esm/core/EVM/permit2/constants.js.map +1 -0
  82. package/src/_esm/core/EVM/permit2/domain.js +9 -0
  83. package/src/_esm/core/EVM/permit2/domain.js.map +1 -0
  84. package/src/_esm/core/EVM/permit2/signatureTransfer.js +117 -0
  85. package/src/_esm/core/EVM/permit2/signatureTransfer.js.map +1 -0
  86. package/src/_esm/core/EVM/setAllowance.js +3 -4
  87. package/src/_esm/core/EVM/setAllowance.js.map +1 -1
  88. package/src/_esm/core/EVM/signPermitMessage.js +163 -0
  89. package/src/_esm/core/EVM/signPermitMessage.js.map +1 -0
  90. package/src/_esm/core/EVM/typeguards.js +5 -0
  91. package/src/_esm/core/EVM/typeguards.js.map +1 -0
  92. package/src/_esm/core/EVM/types.js.map +1 -1
  93. package/src/_esm/core/EVM/utils.js +2 -1
  94. package/src/_esm/core/EVM/utils.js.map +1 -1
  95. package/src/_esm/core/EVM/waitForBatchTransactionReceipt.js +28 -0
  96. package/src/_esm/core/EVM/waitForBatchTransactionReceipt.js.map +1 -0
  97. package/src/_esm/core/EVM/waitForRelayedTransactionReceipt.js +34 -0
  98. package/src/_esm/core/EVM/waitForRelayedTransactionReceipt.js.map +1 -0
  99. package/src/_esm/core/checkBalance.js +3 -3
  100. package/src/_esm/core/checkBalance.js.map +1 -1
  101. package/src/_esm/core/waitForTransactionStatus.js +4 -2
  102. package/src/_esm/core/waitForTransactionStatus.js.map +1 -1
  103. package/src/_esm/createConfig.js +1 -1
  104. package/src/_esm/createConfig.js.map +1 -1
  105. package/src/_esm/errors/constants.js +1 -0
  106. package/src/_esm/errors/constants.js.map +1 -1
  107. package/src/_esm/index.js +4 -2
  108. package/src/_esm/index.js.map +1 -1
  109. package/src/_esm/services/api.js +165 -72
  110. package/src/_esm/services/api.js.map +1 -1
  111. package/src/_esm/utils/checkPackageUpdates.js +17 -0
  112. package/src/_esm/utils/checkPackageUpdates.js.map +1 -0
  113. package/src/_esm/utils/convertQuoteToRoute.js +37 -0
  114. package/src/_esm/utils/convertQuoteToRoute.js.map +1 -0
  115. package/src/_esm/utils/fetchTxErrorDetails.js +9 -0
  116. package/src/_esm/utils/fetchTxErrorDetails.js.map +1 -0
  117. package/src/_esm/utils/invariant.js +43 -0
  118. package/src/_esm/utils/invariant.js.map +1 -0
  119. package/src/_esm/utils/waitForResult.js +19 -3
  120. package/src/_esm/utils/waitForResult.js.map +1 -1
  121. package/src/_esm/version.js +1 -1
  122. package/src/_types/constants.d.ts +3 -1
  123. package/src/_types/constants.d.ts.map +1 -1
  124. package/src/_types/core/EVM/EVM.d.ts.map +1 -1
  125. package/src/_types/core/EVM/EVMStepExecutor.d.ts +7 -4
  126. package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
  127. package/src/_types/core/EVM/abi.d.ts +202 -5
  128. package/src/_types/core/EVM/abi.d.ts.map +1 -1
  129. package/src/_types/core/EVM/checkAllowance.d.ts +12 -2
  130. package/src/_types/core/EVM/checkAllowance.d.ts.map +1 -1
  131. package/src/_types/core/EVM/getAllowance.d.ts +5 -4
  132. package/src/_types/core/EVM/getAllowance.d.ts.map +1 -1
  133. package/src/_types/core/EVM/getEVMBalance.d.ts +2 -1
  134. package/src/_types/core/EVM/getEVMBalance.d.ts.map +1 -1
  135. package/src/_types/core/EVM/getNativePermit.d.ts +18 -0
  136. package/src/_types/core/EVM/getNativePermit.d.ts.map +1 -0
  137. package/src/_types/core/EVM/permit2/allowanceTransfer.d.ts +41 -0
  138. package/src/_types/core/EVM/permit2/allowanceTransfer.d.ts.map +1 -0
  139. package/src/_types/core/EVM/permit2/constants.d.ts +8 -0
  140. package/src/_types/core/EVM/permit2/constants.d.ts.map +1 -0
  141. package/src/_types/core/EVM/permit2/domain.d.ts +8 -0
  142. package/src/_types/core/EVM/permit2/domain.d.ts.map +1 -0
  143. package/src/_types/core/EVM/permit2/signatureTransfer.d.ts +42 -0
  144. package/src/_types/core/EVM/permit2/signatureTransfer.d.ts.map +1 -0
  145. package/src/_types/core/EVM/setAllowance.d.ts +2 -2
  146. package/src/_types/core/EVM/setAllowance.d.ts.map +1 -1
  147. package/src/_types/core/EVM/signPermitMessage.d.ts +25 -0
  148. package/src/_types/core/EVM/signPermitMessage.d.ts.map +1 -0
  149. package/src/_types/core/EVM/typeguards.d.ts +4 -0
  150. package/src/_types/core/EVM/typeguards.d.ts.map +1 -0
  151. package/src/_types/core/EVM/types.d.ts +8 -18
  152. package/src/_types/core/EVM/types.d.ts.map +1 -1
  153. package/src/_types/core/EVM/utils.d.ts +2 -2
  154. package/src/_types/core/EVM/utils.d.ts.map +1 -1
  155. package/src/_types/core/EVM/waitForBatchTransactionReceipt.d.ts +4 -0
  156. package/src/_types/core/EVM/waitForBatchTransactionReceipt.d.ts.map +1 -0
  157. package/src/_types/core/EVM/waitForRelayedTransactionReceipt.d.ts +4 -0
  158. package/src/_types/core/EVM/waitForRelayedTransactionReceipt.d.ts.map +1 -0
  159. package/src/_types/core/checkBalance.d.ts.map +1 -1
  160. package/src/_types/core/waitForTransactionStatus.d.ts.map +1 -1
  161. package/src/_types/createConfig.d.ts.map +1 -1
  162. package/src/_types/errors/constants.d.ts +2 -1
  163. package/src/_types/errors/constants.d.ts.map +1 -1
  164. package/src/_types/index.d.ts +5 -3
  165. package/src/_types/index.d.ts.map +1 -1
  166. package/src/_types/services/api.d.ts +93 -26
  167. package/src/_types/services/api.d.ts.map +1 -1
  168. package/src/_types/utils/checkPackageUpdates.d.ts +2 -0
  169. package/src/_types/utils/checkPackageUpdates.d.ts.map +1 -0
  170. package/src/_types/utils/convertQuoteToRoute.d.ts +11 -0
  171. package/src/_types/utils/convertQuoteToRoute.d.ts.map +1 -0
  172. package/src/_types/utils/fetchTxErrorDetails.d.ts +2 -0
  173. package/src/_types/utils/fetchTxErrorDetails.d.ts.map +1 -0
  174. package/src/_types/utils/invariant.d.ts +22 -0
  175. package/src/_types/utils/invariant.d.ts.map +1 -0
  176. package/src/_types/utils/waitForResult.d.ts +4 -1
  177. package/src/_types/utils/waitForResult.d.ts.map +1 -1
  178. package/src/_types/version.d.ts +1 -1
  179. package/src/constants.ts +6 -1
  180. package/src/core/EVM/EVM.ts +0 -4
  181. package/src/core/EVM/EVMStepExecutor.ts +242 -146
  182. package/src/core/EVM/abi.ts +40 -43
  183. package/src/core/EVM/checkAllowance.ts +96 -92
  184. package/src/core/EVM/getAllowance.ts +8 -8
  185. package/src/core/EVM/getEVMBalance.ts +2 -2
  186. package/src/core/EVM/getNativePermit.ts +114 -0
  187. package/src/core/EVM/parseEVMErrors.ts +9 -1
  188. package/src/core/EVM/permit2/allowanceTransfer.ts +168 -0
  189. package/src/core/EVM/permit2/constants.ts +11 -0
  190. package/src/core/EVM/permit2/domain.ts +20 -0
  191. package/src/core/EVM/permit2/signatureTransfer.ts +214 -0
  192. package/src/core/EVM/setAllowance.ts +14 -15
  193. package/src/core/EVM/signPermitMessage.ts +280 -0
  194. package/src/core/EVM/typeguards.ts +7 -0
  195. package/src/core/EVM/types.ts +11 -26
  196. package/src/core/EVM/utils.ts +4 -3
  197. package/src/core/EVM/waitForBatchTransactionReceipt.ts +61 -0
  198. package/src/core/EVM/waitForRelayedTransactionReceipt.ts +50 -0
  199. package/src/core/checkBalance.ts +6 -3
  200. package/src/core/waitForTransactionStatus.ts +6 -2
  201. package/src/createConfig.ts +1 -1
  202. package/src/errors/constants.ts +1 -0
  203. package/src/index.ts +4 -8
  204. package/src/services/api.ts +279 -105
  205. package/src/utils/checkPackageUpdates.ts +22 -0
  206. package/src/utils/convertQuoteToRoute.ts +45 -0
  207. package/src/utils/fetchTxErrorDetails.ts +10 -0
  208. package/src/utils/invariant.ts +51 -0
  209. package/src/utils/waitForResult.ts +22 -3
  210. package/src/version.ts +1 -1
  211. package/src/_cjs/core/EVM/multisig.js +0 -29
  212. package/src/_cjs/core/EVM/multisig.js.map +0 -1
  213. package/src/_cjs/helpers.js +0 -55
  214. package/src/_cjs/helpers.js.map +0 -1
  215. package/src/_esm/core/EVM/multisig.js +0 -25
  216. package/src/_esm/core/EVM/multisig.js.map +0 -1
  217. package/src/_esm/helpers.js +0 -58
  218. package/src/_esm/helpers.js.map +0 -1
  219. package/src/_types/core/EVM/multisig.d.ts +0 -6
  220. package/src/_types/core/EVM/multisig.d.ts.map +0 -1
  221. package/src/_types/helpers.d.ts +0 -13
  222. package/src/_types/helpers.d.ts.map +0 -1
  223. package/src/core/EVM/multisig.ts +0 -54
  224. 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: string,
15
- contractAddress: string,
14
+ tokenAddress: Address,
15
+ contractAddress: Address,
16
16
  amount: bigint,
17
- settings?: ExecutionOptions,
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 (settings?.updateTransactionRequestHook) {
39
+ if (executionOptions?.updateTransactionRequestHook) {
40
40
  const customizedTransactionRequest: TransactionParameters =
41
- await settings.updateTransactionRequestHook({
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
+ }
@@ -1,17 +1,20 @@
1
1
  import { type BaseToken, ChainType } from '@lifi/types'
2
- import type { Client, Hash } from 'viem'
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 MultisigTxDetails {
55
- status: 'DONE' | 'FAILED' | 'PENDING' | 'CANCELLED'
56
- txHash?: Hash
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
  }
@@ -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<string | undefined> => {
40
+ ): Promise<Address | undefined> => {
41
41
  const chains = await config.getChains()
42
- return chains.find((chain) => chain.id === chainId)?.multicallAddress
42
+ return chains.find((chain) => chain.id === chainId)
43
+ ?.multicallAddress as Address
43
44
  }
44
45
 
45
46
  // Modified viem retryDelay exponential backoff function.