@lifi/sdk 3.6.0-beta.5 → 3.6.0-beta.6

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 (233) hide show
  1. package/package.json +3 -3
  2. package/src/_cjs/config.js +3 -0
  3. package/src/_cjs/config.js.map +1 -1
  4. package/src/_cjs/core/EVM/EVM.js +4 -0
  5. package/src/_cjs/core/EVM/EVM.js.map +1 -1
  6. package/src/_cjs/core/EVM/EVMStepExecutor.js +136 -112
  7. package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
  8. package/src/_cjs/core/EVM/checkAllowance.js +34 -5
  9. package/src/_cjs/core/EVM/checkAllowance.js.map +1 -1
  10. package/src/_cjs/core/EVM/checkPermitSupport.js +33 -0
  11. package/src/_cjs/core/EVM/checkPermitSupport.js.map +1 -0
  12. package/src/_cjs/core/EVM/parseEVMErrors.js +3 -0
  13. package/src/_cjs/core/EVM/parseEVMErrors.js.map +1 -1
  14. package/src/_cjs/core/EVM/{permit2 → permits}/allowanceTransfer.js.map +1 -1
  15. package/src/_cjs/core/EVM/{permit2 → permits}/constants.js.map +1 -1
  16. package/src/_cjs/core/EVM/{permit2 → permits}/domain.js.map +1 -1
  17. package/src/_cjs/core/EVM/permits/encodeNativePermitData.js +16 -0
  18. package/src/_cjs/core/EVM/permits/encodeNativePermitData.js.map +1 -0
  19. package/src/_cjs/core/EVM/permits/encodePermit2Data.js +32 -0
  20. package/src/_cjs/core/EVM/permits/encodePermit2Data.js.map +1 -0
  21. package/src/_cjs/core/EVM/{getNativePermit.js → permits/getNativePermit.js} +30 -21
  22. package/src/_cjs/core/EVM/permits/getNativePermit.js.map +1 -0
  23. package/src/_cjs/core/EVM/permits/getPermitTransferFromValues.js +24 -0
  24. package/src/_cjs/core/EVM/permits/getPermitTransferFromValues.js.map +1 -0
  25. package/src/_cjs/core/EVM/permits/signNativePermitMessage.js +20 -0
  26. package/src/_cjs/core/EVM/permits/signNativePermitMessage.js.map +1 -0
  27. package/src/_cjs/core/EVM/permits/signPermit2Message.js +43 -0
  28. package/src/_cjs/core/EVM/permits/signPermit2Message.js.map +1 -0
  29. package/src/_cjs/core/EVM/permits/signatureTransfer.js.map +1 -0
  30. package/src/_cjs/core/EVM/permits/types.js +3 -0
  31. package/src/_cjs/core/EVM/permits/types.js.map +1 -0
  32. package/src/_cjs/core/EVM/permits/utils.js +31 -0
  33. package/src/_cjs/core/EVM/permits/utils.js.map +1 -0
  34. package/src/_cjs/core/EVM/publicClient.js +32 -33
  35. package/src/_cjs/core/EVM/publicClient.js.map +1 -1
  36. package/src/_cjs/core/EVM/typeguards.js +1 -1
  37. package/src/_cjs/core/EVM/typeguards.js.map +1 -1
  38. package/src/_cjs/core/EVM/types.js.map +1 -1
  39. package/src/_cjs/core/EVM/waitForBatchTransactionReceipt.js +3 -2
  40. package/src/_cjs/core/EVM/waitForBatchTransactionReceipt.js.map +1 -1
  41. package/src/_cjs/core/EVM/waitForRelayedTransactionReceipt.js +4 -4
  42. package/src/_cjs/core/EVM/waitForRelayedTransactionReceipt.js.map +1 -1
  43. package/src/_cjs/core/checkBalance.js +2 -1
  44. package/src/_cjs/core/checkBalance.js.map +1 -1
  45. package/src/_cjs/core/utils.js +1 -1
  46. package/src/_cjs/core/utils.js.map +1 -1
  47. package/src/_cjs/errors/constants.js +1 -0
  48. package/src/_cjs/errors/constants.js.map +1 -1
  49. package/src/_cjs/services/api.js +18 -6
  50. package/src/_cjs/services/api.js.map +1 -1
  51. package/src/_cjs/version.js +1 -1
  52. package/src/_esm/config.js +3 -0
  53. package/src/_esm/config.js.map +1 -1
  54. package/src/_esm/core/EVM/EVM.js +4 -0
  55. package/src/_esm/core/EVM/EVM.js.map +1 -1
  56. package/src/_esm/core/EVM/EVMStepExecutor.js +140 -124
  57. package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
  58. package/src/_esm/core/EVM/checkAllowance.js +35 -5
  59. package/src/_esm/core/EVM/checkAllowance.js.map +1 -1
  60. package/src/_esm/core/EVM/checkPermitSupport.js +43 -0
  61. package/src/_esm/core/EVM/checkPermitSupport.js.map +1 -0
  62. package/src/_esm/core/EVM/parseEVMErrors.js +9 -0
  63. package/src/_esm/core/EVM/parseEVMErrors.js.map +1 -1
  64. package/src/_esm/core/EVM/{permit2 → permits}/allowanceTransfer.js.map +1 -1
  65. package/src/_esm/core/EVM/{permit2 → permits}/constants.js.map +1 -1
  66. package/src/_esm/core/EVM/{permit2 → permits}/domain.js.map +1 -1
  67. package/src/_esm/core/EVM/permits/encodeNativePermitData.js +12 -0
  68. package/src/_esm/core/EVM/permits/encodeNativePermitData.js.map +1 -0
  69. package/src/_esm/core/EVM/permits/encodePermit2Data.js +28 -0
  70. package/src/_esm/core/EVM/permits/encodePermit2Data.js.map +1 -0
  71. package/src/_esm/core/EVM/{getNativePermit.js → permits/getNativePermit.js} +30 -21
  72. package/src/_esm/core/EVM/permits/getNativePermit.js.map +1 -0
  73. package/src/_esm/core/EVM/permits/getPermitTransferFromValues.js +20 -0
  74. package/src/_esm/core/EVM/permits/getPermitTransferFromValues.js.map +1 -0
  75. package/src/_esm/core/EVM/permits/signNativePermitMessage.js +16 -0
  76. package/src/_esm/core/EVM/permits/signNativePermitMessage.js.map +1 -0
  77. package/src/_esm/core/EVM/permits/signPermit2Message.js +41 -0
  78. package/src/_esm/core/EVM/permits/signPermit2Message.js.map +1 -0
  79. package/src/_esm/core/EVM/{permit2 → permits}/signatureTransfer.js +0 -2
  80. package/src/_esm/core/EVM/{permit2 → permits}/signatureTransfer.js.map +1 -1
  81. package/src/_esm/core/EVM/permits/types.js +2 -0
  82. package/src/_esm/core/EVM/permits/types.js.map +1 -0
  83. package/src/_esm/core/EVM/permits/utils.js +26 -0
  84. package/src/_esm/core/EVM/permits/utils.js.map +1 -0
  85. package/src/_esm/core/EVM/publicClient.js +34 -35
  86. package/src/_esm/core/EVM/publicClient.js.map +1 -1
  87. package/src/_esm/core/EVM/typeguards.js +1 -1
  88. package/src/_esm/core/EVM/typeguards.js.map +1 -1
  89. package/src/_esm/core/EVM/types.js.map +1 -1
  90. package/src/_esm/core/EVM/waitForBatchTransactionReceipt.js +5 -2
  91. package/src/_esm/core/EVM/waitForBatchTransactionReceipt.js.map +1 -1
  92. package/src/_esm/core/EVM/waitForRelayedTransactionReceipt.js +4 -4
  93. package/src/_esm/core/EVM/waitForRelayedTransactionReceipt.js.map +1 -1
  94. package/src/_esm/core/checkBalance.js +2 -1
  95. package/src/_esm/core/checkBalance.js.map +1 -1
  96. package/src/_esm/core/utils.js +1 -1
  97. package/src/_esm/core/utils.js.map +1 -1
  98. package/src/_esm/errors/constants.js +1 -0
  99. package/src/_esm/errors/constants.js.map +1 -1
  100. package/src/_esm/services/api.js +18 -6
  101. package/src/_esm/services/api.js.map +1 -1
  102. package/src/_esm/version.js +1 -1
  103. package/src/_types/config.d.ts +2 -1
  104. package/src/_types/config.d.ts.map +1 -1
  105. package/src/_types/core/BaseStepExecutor.d.ts.map +1 -1
  106. package/src/_types/core/EVM/EVM.d.ts.map +1 -1
  107. package/src/_types/core/EVM/EVMStepExecutor.d.ts +4 -10
  108. package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
  109. package/src/_types/core/EVM/checkAllowance.d.ts +13 -2
  110. package/src/_types/core/EVM/checkAllowance.d.ts.map +1 -1
  111. package/src/_types/core/EVM/checkPermitSupport.d.ts +27 -0
  112. package/src/_types/core/EVM/checkPermitSupport.d.ts.map +1 -0
  113. package/src/_types/core/EVM/getAllowance.d.ts.map +1 -1
  114. package/src/_types/core/EVM/getENSAddress.d.ts.map +1 -1
  115. package/src/_types/core/EVM/getEVMBalance.d.ts.map +1 -1
  116. package/src/_types/core/EVM/parseEVMErrors.d.ts.map +1 -1
  117. package/src/_types/core/EVM/{permit2 → permits}/allowanceTransfer.d.ts.map +1 -1
  118. package/src/_types/core/EVM/{permit2 → permits}/constants.d.ts.map +1 -1
  119. package/src/_types/core/EVM/permits/domain.d.ts +3 -0
  120. package/src/_types/core/EVM/permits/domain.d.ts.map +1 -0
  121. package/src/_types/core/EVM/permits/encodeNativePermitData.d.ts +3 -0
  122. package/src/_types/core/EVM/permits/encodeNativePermitData.d.ts.map +1 -0
  123. package/src/_types/core/EVM/permits/encodePermit2Data.d.ts +4 -0
  124. package/src/_types/core/EVM/permits/encodePermit2Data.d.ts.map +1 -0
  125. package/src/_types/core/EVM/{getNativePermit.d.ts → permits/getNativePermit.d.ts} +2 -9
  126. package/src/_types/core/EVM/permits/getNativePermit.d.ts.map +1 -0
  127. package/src/_types/core/EVM/permits/getPermitTransferFromValues.d.ts +5 -0
  128. package/src/_types/core/EVM/permits/getPermitTransferFromValues.d.ts.map +1 -0
  129. package/src/_types/core/EVM/permits/signNativePermitMessage.d.ts +4 -0
  130. package/src/_types/core/EVM/permits/signNativePermitMessage.d.ts.map +1 -0
  131. package/src/_types/core/EVM/permits/signPermit2Message.d.ts +21 -0
  132. package/src/_types/core/EVM/permits/signPermit2Message.d.ts.map +1 -0
  133. package/src/_types/core/EVM/{permit2 → permits}/signatureTransfer.d.ts +15 -16
  134. package/src/_types/core/EVM/permits/signatureTransfer.d.ts.map +1 -0
  135. package/src/_types/core/EVM/permits/types.d.ts +24 -0
  136. package/src/_types/core/EVM/permits/types.d.ts.map +1 -0
  137. package/src/_types/core/EVM/permits/utils.d.ts +6 -0
  138. package/src/_types/core/EVM/permits/utils.d.ts.map +1 -0
  139. package/src/_types/core/EVM/publicClient.d.ts.map +1 -1
  140. package/src/_types/core/EVM/setAllowance.d.ts.map +1 -1
  141. package/src/_types/core/EVM/switchChain.d.ts.map +1 -1
  142. package/src/_types/core/EVM/typeguards.d.ts +2 -1
  143. package/src/_types/core/EVM/typeguards.d.ts.map +1 -1
  144. package/src/_types/core/EVM/types.d.ts +13 -7
  145. package/src/_types/core/EVM/types.d.ts.map +1 -1
  146. package/src/_types/core/EVM/utils.d.ts.map +1 -1
  147. package/src/_types/core/EVM/waitForBatchTransactionReceipt.d.ts.map +1 -1
  148. package/src/_types/core/EVM/waitForRelayedTransactionReceipt.d.ts.map +1 -1
  149. package/src/_types/core/Solana/SolanaStepExecutor.d.ts.map +1 -1
  150. package/src/_types/core/Solana/getSNSAddress.d.ts.map +1 -1
  151. package/src/_types/core/Solana/getSolanaBalance.d.ts.map +1 -1
  152. package/src/_types/core/Solana/parseSolanaErrors.d.ts.map +1 -1
  153. package/src/_types/core/StatusManager.d.ts.map +1 -1
  154. package/src/_types/core/UTXO/UTXOStepExecutor.d.ts.map +1 -1
  155. package/src/_types/core/UTXO/getUTXOAPIPublicClient.d.ts.map +1 -1
  156. package/src/_types/core/UTXO/getUTXOBalance.d.ts.map +1 -1
  157. package/src/_types/core/UTXO/getUTXOPublicClient.d.ts.map +1 -1
  158. package/src/_types/core/UTXO/parseUTXOErrors.d.ts.map +1 -1
  159. package/src/_types/core/checkBalance.d.ts.map +1 -1
  160. package/src/_types/core/execution.d.ts.map +1 -1
  161. package/src/_types/core/prepareRestart.d.ts.map +1 -1
  162. package/src/_types/core/provider.d.ts.map +1 -1
  163. package/src/_types/core/rpc.d.ts.map +1 -1
  164. package/src/_types/core/stepComparison.d.ts.map +1 -1
  165. package/src/_types/errors/constants.d.ts +2 -1
  166. package/src/_types/errors/constants.d.ts.map +1 -1
  167. package/src/_types/errors/utils/baseErrorRootCause.d.ts.map +1 -1
  168. package/src/_types/errors/utils/rootCause.d.ts.map +1 -1
  169. package/src/_types/request.d.ts.map +1 -1
  170. package/src/_types/services/api.d.ts +4 -47
  171. package/src/_types/services/api.d.ts.map +1 -1
  172. package/src/_types/services/balance.d.ts.map +1 -1
  173. package/src/_types/services/getNameServiceAddress.d.ts.map +1 -1
  174. package/src/_types/typeguards.d.ts.map +1 -1
  175. package/src/_types/utils/checkPackageUpdates.d.ts.map +1 -1
  176. package/src/_types/utils/convertQuoteToRoute.d.ts.map +1 -1
  177. package/src/_types/utils/fetchTxErrorDetails.d.ts.map +1 -1
  178. package/src/_types/utils/getTransactionMessage.d.ts.map +1 -1
  179. package/src/_types/utils/isZeroAddress.d.ts.map +1 -1
  180. package/src/_types/utils/median.d.ts.map +1 -1
  181. package/src/_types/utils/waitForResult.d.ts.map +1 -1
  182. package/src/_types/version.d.ts +1 -1
  183. package/src/config.ts +4 -1
  184. package/src/core/EVM/EVM.ts +4 -0
  185. package/src/core/EVM/EVMStepExecutor.ts +186 -149
  186. package/src/core/EVM/checkAllowance.ts +69 -6
  187. package/src/core/EVM/checkPermitSupport.ts +74 -0
  188. package/src/core/EVM/parseEVMErrors.ts +9 -0
  189. package/src/core/EVM/{permit2 → permits}/domain.ts +1 -7
  190. package/src/core/EVM/permits/encodeNativePermitData.ts +19 -0
  191. package/src/core/EVM/permits/encodePermit2Data.ts +41 -0
  192. package/src/core/EVM/{getNativePermit.ts → permits/getNativePermit.ts} +37 -31
  193. package/src/core/EVM/permits/getPermitTransferFromValues.ts +29 -0
  194. package/src/core/EVM/permits/signNativePermitMessage.ts +27 -0
  195. package/src/core/EVM/permits/signPermit2Message.ts +95 -0
  196. package/src/core/EVM/{permit2 → permits}/signatureTransfer.ts +19 -7
  197. package/src/core/EVM/permits/types.ts +33 -0
  198. package/src/core/EVM/permits/utils.ts +40 -0
  199. package/src/core/EVM/publicClient.ts +41 -38
  200. package/src/core/EVM/typeguards.ts +5 -2
  201. package/src/core/EVM/types.ts +15 -10
  202. package/src/core/EVM/waitForBatchTransactionReceipt.ts +7 -2
  203. package/src/core/EVM/waitForRelayedTransactionReceipt.ts +4 -4
  204. package/src/core/checkBalance.ts +2 -1
  205. package/src/core/utils.ts +1 -1
  206. package/src/errors/constants.ts +1 -0
  207. package/src/services/api.ts +62 -66
  208. package/src/version.ts +1 -1
  209. package/src/_cjs/core/EVM/getNativePermit.js.map +0 -1
  210. package/src/_cjs/core/EVM/permit2/signatureTransfer.js.map +0 -1
  211. package/src/_cjs/core/EVM/signPermitMessage.js +0 -163
  212. package/src/_cjs/core/EVM/signPermitMessage.js.map +0 -1
  213. package/src/_esm/core/EVM/getNativePermit.js.map +0 -1
  214. package/src/_esm/core/EVM/signPermitMessage.js +0 -157
  215. package/src/_esm/core/EVM/signPermitMessage.js.map +0 -1
  216. package/src/_types/core/EVM/getNativePermit.d.ts.map +0 -1
  217. package/src/_types/core/EVM/permit2/domain.d.ts +0 -8
  218. package/src/_types/core/EVM/permit2/domain.d.ts.map +0 -1
  219. package/src/_types/core/EVM/permit2/signatureTransfer.d.ts.map +0 -1
  220. package/src/_types/core/EVM/signPermitMessage.d.ts +0 -25
  221. package/src/_types/core/EVM/signPermitMessage.d.ts.map +0 -1
  222. package/src/core/EVM/signPermitMessage.ts +0 -273
  223. /package/src/_cjs/core/EVM/{permit2 → permits}/allowanceTransfer.js +0 -0
  224. /package/src/_cjs/core/EVM/{permit2 → permits}/constants.js +0 -0
  225. /package/src/_cjs/core/EVM/{permit2 → permits}/domain.js +0 -0
  226. /package/src/_cjs/core/EVM/{permit2 → permits}/signatureTransfer.js +0 -0
  227. /package/src/_esm/core/EVM/{permit2 → permits}/allowanceTransfer.js +0 -0
  228. /package/src/_esm/core/EVM/{permit2 → permits}/constants.js +0 -0
  229. /package/src/_esm/core/EVM/{permit2 → permits}/domain.js +0 -0
  230. /package/src/_types/core/EVM/{permit2 → permits}/allowanceTransfer.d.ts +0 -0
  231. /package/src/_types/core/EVM/{permit2 → permits}/constants.d.ts +0 -0
  232. /package/src/core/EVM/{permit2 → permits}/allowanceTransfer.ts +0 -0
  233. /package/src/core/EVM/{permit2 → permits}/constants.ts +0 -0
@@ -41,6 +41,15 @@ const handleSpecificErrors = async (
41
41
  if (e.cause?.code === -32000) {
42
42
  return new TransactionError(LiFiErrorCode.SignatureRejected, e.message, e)
43
43
  }
44
+ // Some wallets reject transactions sometimes with this code because of internal and JSON-RPC errors, e.g.:
45
+ // {
46
+ // "code": -32603,
47
+ // "message": "Pop up window failed to open",
48
+ // "docUrl": "https://docs.cloud.coinbase.com/wallet-sdk/docs/errors"
49
+ // }
50
+ if (e.cause?.code === -32603) {
51
+ return new TransactionError(LiFiErrorCode.TransactionRejected, e.message, e)
52
+ }
44
53
 
45
54
  if (
46
55
  step &&
@@ -1,4 +1,4 @@
1
- import type { Address, TypedData, TypedDataDomain } from 'viem'
1
+ import type { Address, TypedDataDomain } from 'viem'
2
2
 
3
3
  const PERMIT2_DOMAIN_NAME = 'Permit2'
4
4
 
@@ -12,9 +12,3 @@ export function permit2Domain(
12
12
  verifyingContract: permit2Address,
13
13
  }
14
14
  }
15
-
16
- export type PermitData = {
17
- domain: TypedDataDomain
18
- types: TypedData
19
- values: any
20
- }
@@ -0,0 +1,19 @@
1
+ import type { Address, Hash, Hex } from 'viem'
2
+ import { encodeFunctionData, parseSignature } from 'viem'
3
+ import { permit2ProxyAbi } from '../abi.js'
4
+
5
+ export const encodeNativePermitData = (
6
+ tokenAddress: Address,
7
+ amount: bigint,
8
+ deadline: bigint,
9
+ signature: Hash,
10
+ transactionData: Hex
11
+ ): Hex => {
12
+ const { v, r, s } = parseSignature(signature)
13
+ const data = encodeFunctionData({
14
+ abi: permit2ProxyAbi,
15
+ functionName: 'callDiamondWithEIP2612Signature',
16
+ args: [tokenAddress, amount, deadline, Number(v), r, s, transactionData],
17
+ })
18
+ return data
19
+ }
@@ -0,0 +1,41 @@
1
+ import type { Address, Hex } from 'viem'
2
+ import { type Hash, encodeFunctionData } from 'viem'
3
+ import { permit2ProxyAbi } from '../abi.js'
4
+
5
+ export const encodePermit2Data = (
6
+ tokenAddress: Address,
7
+ amount: bigint,
8
+ nonce: bigint,
9
+ deadline: bigint,
10
+ transactionData: Hex,
11
+ signature: Hash,
12
+ accountAddress?: Address,
13
+ witness?: boolean
14
+ ): Hex => {
15
+ if (witness && accountAddress) {
16
+ const data = encodeFunctionData({
17
+ abi: permit2ProxyAbi,
18
+ functionName: 'callDiamondWithPermit2Witness',
19
+ args: [
20
+ transactionData,
21
+ accountAddress,
22
+ [[tokenAddress, amount], nonce, deadline],
23
+ signature as Hex,
24
+ ],
25
+ })
26
+
27
+ return data
28
+ }
29
+
30
+ const data = encodeFunctionData({
31
+ abi: permit2ProxyAbi,
32
+ functionName: 'callDiamondWithPermit2',
33
+ args: [
34
+ transactionData,
35
+ [[tokenAddress, amount], nonce, deadline],
36
+ signature as Hex,
37
+ ],
38
+ })
39
+
40
+ return data
41
+ }
@@ -10,16 +10,9 @@ import {
10
10
  import type { Address, Client, Hex } from 'viem'
11
11
  import type { TypedDataDomain } from 'viem'
12
12
  import { multicall, readContract } from 'viem/actions'
13
- import { eip2612Abi } from './abi.js'
14
- import { getMulticallAddress } from './utils.js'
15
-
16
- export type NativePermitData = {
17
- name: string
18
- version: string
19
- nonce: bigint
20
- supported: boolean
21
- domain: TypedDataDomain
22
- }
13
+ import { eip2612Abi, eip2612Types } from '../abi.js'
14
+ import { getMulticallAddress } from '../utils.js'
15
+ import type { NativePermitData } from './types.js'
23
16
 
24
17
  /**
25
18
  * EIP-712 domain typehash with chainId
@@ -142,14 +135,6 @@ function validateDomainSeparator({
142
135
  }
143
136
  }
144
137
 
145
- const defaultPermit: NativePermitData = {
146
- name: '',
147
- version: '1',
148
- nonce: 0n,
149
- supported: false,
150
- domain: {},
151
- }
152
-
153
138
  /**
154
139
  * Retrieves native permit data (EIP-2612) for a token on a specific chain
155
140
  * @link https://eips.ethereum.org/EIPS/eip-2612
@@ -161,8 +146,9 @@ const defaultPermit: NativePermitData = {
161
146
  export const getNativePermit = async (
162
147
  client: Client,
163
148
  chain: ExtendedChain,
164
- tokenAddress: Address
165
- ): Promise<NativePermitData> => {
149
+ tokenAddress: Address,
150
+ amount: bigint
151
+ ): Promise<NativePermitData | undefined> => {
166
152
  try {
167
153
  const multicallAddress = await getMulticallAddress(chain.id)
168
154
 
@@ -205,7 +191,7 @@ export const getNativePermit = async (
205
191
  !domainSeparatorResult.result ||
206
192
  noncesResult.result === undefined
207
193
  ) {
208
- return defaultPermit
194
+ return undefined
209
195
  }
210
196
 
211
197
  const { isValid, domain } = validateDomainSeparator({
@@ -216,12 +202,22 @@ export const getNativePermit = async (
216
202
  domainSeparator: domainSeparatorResult.result,
217
203
  })
218
204
 
219
- return {
220
- name: nameResult.result,
221
- version: versionResult.result ?? '1',
205
+ if (!isValid) {
206
+ return undefined
207
+ }
208
+
209
+ const values = {
210
+ owner: client.account!.address,
211
+ spender: chain.permit2Proxy as Address,
212
+ value: amount,
222
213
  nonce: noncesResult.result,
223
- supported: isValid,
214
+ deadline: BigInt(Math.floor(Date.now() / 1000) + 30 * 60), // 30 minutes
215
+ }
216
+
217
+ return {
224
218
  domain,
219
+ types: eip2612Types,
220
+ values,
225
221
  }
226
222
  }
227
223
 
@@ -240,7 +236,7 @@ export const getNativePermit = async (
240
236
  domainSeparatorResult.status !== 'fulfilled' ||
241
237
  noncesResult.status !== 'fulfilled'
242
238
  ) {
243
- return defaultPermit
239
+ return undefined
244
240
  }
245
241
 
246
242
  const name = nameResult.value
@@ -254,14 +250,24 @@ export const getNativePermit = async (
254
250
  domainSeparator: domainSeparatorResult.value,
255
251
  })
256
252
 
257
- return {
258
- name,
259
- version,
253
+ if (!isValid) {
254
+ return undefined
255
+ }
256
+
257
+ const values = {
258
+ owner: client.account!.address,
259
+ spender: chain.permit2Proxy as Address,
260
+ value: amount,
260
261
  nonce: noncesResult.value,
261
- supported: isValid,
262
+ deadline: BigInt(Math.floor(Date.now() / 1000) + 30 * 60), // 30 minutes
263
+ }
264
+
265
+ return {
262
266
  domain,
267
+ types: eip2612Types,
268
+ values,
263
269
  }
264
270
  } catch {
265
- return defaultPermit
271
+ return undefined
266
272
  }
267
273
  }
@@ -0,0 +1,29 @@
1
+ import type { ExtendedChain } from '@lifi/types'
2
+ import type { Address, Client } from 'viem'
3
+ import { readContract } from 'viem/actions'
4
+ import { permit2ProxyAbi } from '../abi.js'
5
+ import type { PermitTransferFrom } from './signatureTransfer.js'
6
+
7
+ export const getPermitTransferFromValues = async (
8
+ client: Client,
9
+ chain: ExtendedChain,
10
+ tokenAddress: Address,
11
+ amount: bigint
12
+ ): Promise<PermitTransferFrom> => {
13
+ const nonce = await readContract(client, {
14
+ address: chain.permit2Proxy as Address,
15
+ abi: permit2ProxyAbi,
16
+ functionName: 'nextNonce',
17
+ args: [client.account!.address],
18
+ })
19
+
20
+ return {
21
+ permitted: {
22
+ token: tokenAddress,
23
+ amount: amount,
24
+ },
25
+ spender: chain.permit2Proxy as Address,
26
+ nonce: nonce,
27
+ deadline: BigInt(Math.floor(Date.now() / 1000) + 30 * 60), // 30 minutes
28
+ }
29
+ }
@@ -0,0 +1,27 @@
1
+ import type {} from '@lifi/types'
2
+ import type { Client } from 'viem'
3
+ import { signTypedData } from 'viem/actions'
4
+ import { getAction } from 'viem/utils'
5
+ import type { NativePermitData, NativePermitSignature } from './types.js'
6
+
7
+ export const signNativePermitMessage = async (
8
+ client: Client,
9
+ permitData: NativePermitData
10
+ ): Promise<NativePermitSignature> => {
11
+ const signature = await getAction(
12
+ client,
13
+ signTypedData,
14
+ 'signTypedData'
15
+ )({
16
+ account: client.account!,
17
+ domain: permitData.domain,
18
+ types: permitData.types,
19
+ primaryType: 'Permit',
20
+ message: permitData.values,
21
+ })
22
+
23
+ return {
24
+ signature,
25
+ values: permitData.values,
26
+ }
27
+ }
@@ -0,0 +1,95 @@
1
+ import type { ExtendedChain } from '@lifi/types'
2
+ import type { Address, Client, Hex } from 'viem'
3
+ import { keccak256 } from 'viem'
4
+ import { signTypedData } from 'viem/actions'
5
+ import { getAction } from 'viem/utils'
6
+ import { getPermitTransferFromValues } from './getPermitTransferFromValues.js'
7
+ import {
8
+ type PermitBatchTransferFrom,
9
+ type PermitBatchTransferFromData,
10
+ type PermitTransferFrom,
11
+ type PermitTransferFromData,
12
+ getPermitData,
13
+ } from './signatureTransfer.js'
14
+ import type { Permit2Signature } from './types.js'
15
+
16
+ export interface SignPermit2MessageParams {
17
+ client: Client
18
+ chain: ExtendedChain
19
+ tokenAddress: Address
20
+ amount: bigint
21
+ data: Hex
22
+ witness?: boolean
23
+ }
24
+
25
+ export interface SignPermit2SingleParams extends SignPermit2MessageParams {
26
+ permitData?: PermitTransferFromData
27
+ }
28
+
29
+ export interface SignPermit2BatchParams extends SignPermit2MessageParams {
30
+ permitData?: PermitBatchTransferFromData
31
+ }
32
+
33
+ export function signPermit2Message(
34
+ params: SignPermit2SingleParams
35
+ ): Promise<Permit2Signature<PermitTransferFrom>>
36
+ export function signPermit2Message(
37
+ params: SignPermit2BatchParams
38
+ ): Promise<Permit2Signature<PermitBatchTransferFrom>>
39
+ export async function signPermit2Message(
40
+ params: SignPermit2SingleParams | SignPermit2BatchParams
41
+ ): Promise<Permit2Signature<PermitTransferFrom | PermitBatchTransferFrom>> {
42
+ const { client, chain, tokenAddress, amount, data, permitData, witness } =
43
+ params
44
+
45
+ let _permitData = permitData
46
+ if (!_permitData) {
47
+ const permitTransferFrom = await getPermitTransferFromValues(
48
+ client,
49
+ chain,
50
+ tokenAddress,
51
+ amount
52
+ )
53
+
54
+ // Create witness data for the LI.FI call
55
+ const _witness = witness
56
+ ? {
57
+ witness: {
58
+ diamondAddress: chain.diamondAddress as Address,
59
+ diamondCalldataHash: keccak256(data),
60
+ },
61
+ witnessTypeName: 'LiFiCall',
62
+ witnessType: {
63
+ LiFiCall: [
64
+ { name: 'diamondAddress', type: 'address' },
65
+ { name: 'diamondCalldataHash', type: 'bytes32' },
66
+ ],
67
+ },
68
+ }
69
+ : undefined
70
+
71
+ _permitData = getPermitData(
72
+ permitTransferFrom,
73
+ chain.permit2 as Address,
74
+ chain.id,
75
+ _witness
76
+ )
77
+ }
78
+
79
+ const signature = await getAction(
80
+ client,
81
+ signTypedData,
82
+ 'signTypedData'
83
+ )({
84
+ account: client.account!,
85
+ primaryType: witness ? 'PermitWitnessTransferFrom' : 'PermitTransferFrom',
86
+ domain: _permitData.domain,
87
+ types: _permitData.types,
88
+ message: _permitData.values,
89
+ })
90
+
91
+ return {
92
+ signature,
93
+ values: _permitData.values,
94
+ }
95
+ }
@@ -8,25 +8,25 @@ import {
8
8
  } from './constants.js'
9
9
  import { permit2Domain } from './domain.js'
10
10
 
11
- export interface Witness {
11
+ export type Witness = {
12
12
  witness: any
13
13
  witnessTypeName: string
14
- witnessType: { [key: string]: { name: string; type: string }[] }
14
+ witnessType: Record<string, { name: string; type: string }[]>
15
15
  }
16
16
 
17
- export interface TokenPermissions {
17
+ export type TokenPermissions = {
18
18
  token: Address
19
19
  amount: bigint
20
20
  }
21
21
 
22
- export interface PermitTransferFrom {
22
+ export type PermitTransferFrom = {
23
23
  permitted: TokenPermissions
24
24
  spender: Address
25
25
  nonce: bigint
26
26
  deadline: bigint
27
27
  }
28
28
 
29
- export interface PermitBatchTransferFrom {
29
+ export type PermitBatchTransferFrom = {
30
30
  permitted: TokenPermissions[]
31
31
  spender: Address
32
32
  nonce: bigint
@@ -154,6 +154,18 @@ export function getPermitBatchTransferData(
154
154
 
155
155
  // return the data to be sent in a eth_signTypedData RPC call
156
156
  // for signing the given permit data
157
+ export function getPermitData<T extends PermitTransferFrom>(
158
+ permit: T,
159
+ permit2Address: Address,
160
+ chainId: number,
161
+ witness?: Witness
162
+ ): PermitTransferFromData
163
+ export function getPermitData<T extends PermitBatchTransferFrom>(
164
+ permit: T,
165
+ permit2Address: Address,
166
+ chainId: number,
167
+ witness?: Witness
168
+ ): PermitBatchTransferFromData
157
169
  export function getPermitData(
158
170
  permit: PermitTransferFrom | PermitBatchTransferFrom,
159
171
  permit2Address: Address,
@@ -166,8 +178,8 @@ export function getPermitData(
166
178
  return getPermitBatchTransferData(permit, permit2Address, chainId, witness)
167
179
  }
168
180
 
169
- export function hash(
170
- permit: PermitTransferFrom | PermitBatchTransferFrom,
181
+ export function hash<T extends PermitTransferFrom | PermitBatchTransferFrom>(
182
+ permit: T,
171
183
  permit2Address: Address,
172
184
  chainId: number,
173
185
  witness?: Witness
@@ -0,0 +1,33 @@
1
+ import type { Address, Hash, TypedData, TypedDataDomain } from 'viem'
2
+ import type {
3
+ PermitBatchTransferFrom,
4
+ PermitTransferFrom,
5
+ } from './signatureTransfer.js'
6
+
7
+ export type PermitSignature = {
8
+ signature: Hash
9
+ }
10
+
11
+ export type NativePermitValues = {
12
+ owner: Address
13
+ spender: Address
14
+ nonce: bigint
15
+ value: bigint
16
+ deadline: bigint
17
+ }
18
+
19
+ export type NativePermitData = {
20
+ domain: TypedDataDomain
21
+ types: TypedData
22
+ values: NativePermitValues
23
+ }
24
+
25
+ export type NativePermitSignature = PermitSignature & {
26
+ values: NativePermitValues
27
+ }
28
+
29
+ export type Permit2Signature<
30
+ T extends PermitTransferFrom | PermitBatchTransferFrom,
31
+ > = PermitSignature & {
32
+ values: T
33
+ }
@@ -0,0 +1,40 @@
1
+ import type { PermitTransferFromData } from './signatureTransfer.js'
2
+
3
+ import type {
4
+ PermitData,
5
+ PermitValues,
6
+ PermitWitnessTransferFromValues,
7
+ } from '@lifi/types'
8
+ import type {} from './signatureTransfer.js'
9
+ import type { NativePermitData } from './types.js'
10
+
11
+ export const prettifyPermit2Data = (
12
+ permitData: PermitData<PermitWitnessTransferFromValues<string>>
13
+ ): PermitTransferFromData => {
14
+ return {
15
+ ...permitData,
16
+ values: {
17
+ ...permitData.values,
18
+ permitted: {
19
+ ...permitData.values.permitted,
20
+ amount: BigInt(permitData.values.permitted.amount),
21
+ },
22
+ nonce: BigInt(permitData.values.nonce),
23
+ deadline: BigInt(permitData.values.deadline),
24
+ },
25
+ }
26
+ }
27
+
28
+ export const prettifyNativePermitData = (
29
+ permitData: PermitData<PermitValues<string>>
30
+ ): NativePermitData => {
31
+ return {
32
+ ...permitData,
33
+ values: {
34
+ ...permitData.values,
35
+ value: BigInt(permitData.values.value),
36
+ nonce: BigInt(permitData.values.nonce),
37
+ deadline: BigInt(permitData.values.deadline),
38
+ },
39
+ }
40
+ }
@@ -1,9 +1,10 @@
1
- import { ChainId } from '@lifi/types'
1
+ import { ChainId, ChainType } from '@lifi/types'
2
2
  import type { Client } from 'viem'
3
3
  import { http, createClient, fallback, webSocket } from 'viem'
4
4
  import { type Chain, mainnet } from 'viem/chains'
5
5
  import { config } from '../../config.js'
6
6
  import { getRpcUrls } from '../rpc.js'
7
+ import type { EVMProvider } from './types.js'
7
8
 
8
9
  // cached providers
9
10
  const publicClients: Record<number, Client> = {}
@@ -14,46 +15,48 @@ const publicClients: Record<number, Client> = {}
14
15
  * @returns The public client for the given chain
15
16
  */
16
17
  export const getPublicClient = async (chainId: number): Promise<Client> => {
17
- if (!publicClients[chainId]) {
18
- const urls = await getRpcUrls(chainId)
19
- const fallbackTransports = urls.map((url) =>
20
- url.startsWith('wss')
21
- ? webSocket(url)
22
- : http(url, {
23
- batch: {
24
- batchSize: 64,
25
- },
26
- })
27
- )
28
- const _chain = await config.getChainById(chainId)
29
- const chain: Chain = {
30
- ..._chain,
31
- ..._chain.metamask,
32
- name: _chain.metamask.chainName,
33
- rpcUrls: {
34
- default: { http: _chain.metamask.rpcUrls },
35
- public: { http: _chain.metamask.rpcUrls },
36
- },
37
- }
38
- // Add ENS contracts
39
- if (chain.id === ChainId.ETH) {
40
- chain.contracts = {
41
- ...mainnet.contracts,
42
- ...chain.contracts,
43
- }
44
- }
45
- publicClients[chainId] = createClient({
46
- chain: chain,
47
- transport: fallback(fallbackTransports),
48
- batch: {
49
- multicall: true,
50
- },
51
- })
18
+ if (publicClients[chainId]) {
19
+ return publicClients[chainId]
52
20
  }
53
21
 
54
- if (!publicClients[chainId]) {
55
- throw new Error(`Unable to configure provider for chain ${chainId}`)
22
+ const urls = await getRpcUrls(chainId)
23
+ const fallbackTransports = urls.map((url) =>
24
+ url.startsWith('wss')
25
+ ? webSocket(url)
26
+ : http(url, {
27
+ batch: {
28
+ batchSize: 64,
29
+ },
30
+ })
31
+ )
32
+ const _chain = await config.getChainById(chainId)
33
+ const chain: Chain = {
34
+ ..._chain,
35
+ ..._chain.metamask,
36
+ name: _chain.metamask.chainName,
37
+ rpcUrls: {
38
+ default: { http: _chain.metamask.rpcUrls },
39
+ public: { http: _chain.metamask.rpcUrls },
40
+ },
41
+ }
42
+ // Add ENS contracts
43
+ if (chain.id === ChainId.ETH) {
44
+ chain.contracts = {
45
+ ...mainnet.contracts,
46
+ ...chain.contracts,
47
+ }
56
48
  }
49
+ const provider = config.getProvider(ChainType.EVM) as EVMProvider | undefined
50
+ publicClients[chainId] = createClient({
51
+ chain: chain,
52
+ transport: fallback(
53
+ fallbackTransports,
54
+ provider?.options?.fallbackTransportConfig
55
+ ),
56
+ batch: {
57
+ multicall: true,
58
+ },
59
+ })
57
60
 
58
61
  return publicClients[chainId]
59
62
  }
@@ -1,7 +1,10 @@
1
+ import type { LiFiStep } from '@lifi/types'
1
2
  import type { LiFiStepExtended } from '../types.js'
2
3
  import type { EVMPermitStep } from './types.js'
3
4
 
4
- export function isRelayerStep(step: LiFiStepExtended): step is EVMPermitStep {
5
+ export function isRelayerStep(
6
+ step: LiFiStepExtended | LiFiStep
7
+ ): step is EVMPermitStep {
5
8
  const evmStep = step as EVMPermitStep
6
- return 'permit' in evmStep && 'permitData' in evmStep && 'witness' in evmStep
9
+ return 'permits' in evmStep && evmStep.permits?.length > 0
7
10
  }
@@ -1,20 +1,18 @@
1
- import { type BaseToken, ChainType } from '@lifi/types'
2
- import type { Client } from 'viem'
1
+ import { type BaseToken, ChainType, type Permit } from '@lifi/types'
2
+ import type { Address, Client, FallbackTransportConfig, Hex } from 'viem'
3
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'
10
5
 
11
6
  export interface EVMProviderOptions {
12
7
  getWalletClient?: () => Promise<Client>
13
8
  switchChain?: SwitchChainHook
9
+ fallbackTransportConfig?: FallbackTransportConfig
14
10
  }
15
11
 
16
12
  export interface EVMProvider extends SDKProvider {
13
+ options: EVMProviderOptions
17
14
  setOptions(options: EVMProviderOptions): void
15
+ getWalletClient?(): Promise<Client>
18
16
  }
19
17
 
20
18
  export function isEVM(provider: SDKProvider): provider is EVMProvider {
@@ -55,7 +53,14 @@ export interface RevokeApprovalRequest {
55
53
  }
56
54
 
57
55
  export interface EVMPermitStep extends LiFiStepExtended {
58
- permit: PermitTransferFrom
59
- permitData: PermitData
60
- witness: Witness
56
+ permits: Permit[]
61
57
  }
58
+
59
+ export type Call = {
60
+ to: Address
61
+ data?: Hex
62
+ value?: bigint
63
+ chainId?: number
64
+ }
65
+
66
+ export type TransactionMethodType = 'standard' | 'relayed' | 'batched'
@@ -28,11 +28,16 @@ export const waitForBatchTransactionReceipt = async (
28
28
  id: batchHash,
29
29
  })
30
30
 
31
- if (callsDetails.status === 'PENDING') {
31
+ // EIP-5792 specs was updated to return 100 for pending transactions https://eips.ethereum.org/EIPS/eip-5792
32
+ if (
33
+ callsDetails.status === 'PENDING' ||
34
+ callsDetails.status === (100 as any)
35
+ ) {
32
36
  return undefined
33
37
  }
34
38
 
35
- if (callsDetails.status === 'CONFIRMED') {
39
+ // EIP-5792 specs was updated to return 200 for confirmed transactions https://eips.ethereum.org/EIPS/eip-5792
40
+ if (callsDetails.status === 'CONFIRMED' || callsDetails.status === 200) {
36
41
  if (
37
42
  !callsDetails.receipts?.length ||
38
43
  !callsDetails.receipts.every((receipt) => receipt.transactionHash) ||