@eth-optimism/actions-sdk 0.2.0 → 0.3.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 (271) hide show
  1. package/dist/__mocks__/MockAssets.d.ts.map +1 -1
  2. package/dist/__mocks__/MockAssets.js +2 -0
  3. package/dist/__mocks__/MockAssets.js.map +1 -1
  4. package/dist/__tests__/actions.test.js +0 -4
  5. package/dist/__tests__/actions.test.js.map +1 -1
  6. package/dist/actions.d.ts +20 -1
  7. package/dist/actions.d.ts.map +1 -1
  8. package/dist/actions.js +37 -13
  9. package/dist/actions.js.map +1 -1
  10. package/dist/constants/assets.d.ts +4 -0
  11. package/dist/constants/assets.d.ts.map +1 -1
  12. package/dist/constants/assets.js +15 -0
  13. package/dist/constants/assets.js.map +1 -1
  14. package/dist/constants/contracts.d.ts +4 -0
  15. package/dist/constants/contracts.d.ts.map +1 -0
  16. package/dist/constants/contracts.js +3 -0
  17. package/dist/constants/contracts.js.map +1 -0
  18. package/dist/index.d.ts +4 -3
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/lend/core/LendProvider.d.ts +0 -6
  23. package/dist/lend/core/LendProvider.d.ts.map +1 -1
  24. package/dist/lend/core/LendProvider.js +6 -15
  25. package/dist/lend/core/LendProvider.js.map +1 -1
  26. package/dist/lend/core/__tests__/LendProvider.test.js +2 -4
  27. package/dist/lend/core/__tests__/LendProvider.test.js.map +1 -1
  28. package/dist/lend/providers/morpho/__tests__/sdk.test.js +3 -2
  29. package/dist/lend/providers/morpho/__tests__/sdk.test.js.map +1 -1
  30. package/dist/lend/providers/morpho/api.d.ts +4 -0
  31. package/dist/lend/providers/morpho/api.d.ts.map +1 -1
  32. package/dist/lend/providers/morpho/api.js.map +1 -1
  33. package/dist/lend/providers/morpho/sdk.d.ts.map +1 -1
  34. package/dist/lend/providers/morpho/sdk.js +10 -1
  35. package/dist/lend/providers/morpho/sdk.js.map +1 -1
  36. package/dist/supported/tokens.d.ts.map +1 -1
  37. package/dist/supported/tokens.js +9 -2
  38. package/dist/supported/tokens.js.map +1 -1
  39. package/dist/swap/__mocks__/MockSwapProvider.d.ts +38 -0
  40. package/dist/swap/__mocks__/MockSwapProvider.d.ts.map +1 -0
  41. package/dist/swap/__mocks__/MockSwapProvider.js +138 -0
  42. package/dist/swap/__mocks__/MockSwapProvider.js.map +1 -0
  43. package/dist/swap/core/SwapProvider.d.ts +56 -0
  44. package/dist/swap/core/SwapProvider.d.ts.map +1 -0
  45. package/dist/swap/core/SwapProvider.js +177 -0
  46. package/dist/swap/core/SwapProvider.js.map +1 -0
  47. package/dist/swap/core/__tests__/SwapProvider.test.d.ts +2 -0
  48. package/dist/swap/core/__tests__/SwapProvider.test.d.ts.map +1 -0
  49. package/dist/swap/core/__tests__/SwapProvider.test.js +329 -0
  50. package/dist/swap/core/__tests__/SwapProvider.test.js.map +1 -0
  51. package/dist/swap/index.d.ts +7 -0
  52. package/dist/swap/index.d.ts.map +1 -0
  53. package/dist/swap/index.js +8 -0
  54. package/dist/swap/index.js.map +1 -0
  55. package/dist/swap/namespaces/ActionsSwapNamespace.d.ts +8 -0
  56. package/dist/swap/namespaces/ActionsSwapNamespace.d.ts.map +1 -0
  57. package/dist/swap/namespaces/ActionsSwapNamespace.js +8 -0
  58. package/dist/swap/namespaces/ActionsSwapNamespace.js.map +1 -0
  59. package/dist/swap/namespaces/BaseSwapNamespace.d.ts +33 -0
  60. package/dist/swap/namespaces/BaseSwapNamespace.d.ts.map +1 -0
  61. package/dist/swap/namespaces/BaseSwapNamespace.js +58 -0
  62. package/dist/swap/namespaces/BaseSwapNamespace.js.map +1 -0
  63. package/dist/swap/namespaces/WalletSwapNamespace.d.ts +22 -0
  64. package/dist/swap/namespaces/WalletSwapNamespace.d.ts.map +1 -0
  65. package/dist/swap/namespaces/WalletSwapNamespace.js +60 -0
  66. package/dist/swap/namespaces/WalletSwapNamespace.js.map +1 -0
  67. package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.d.ts +2 -0
  68. package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.d.ts.map +1 -0
  69. package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js +106 -0
  70. package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js.map +1 -0
  71. package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.d.ts +2 -0
  72. package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.d.ts.map +1 -0
  73. package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js +132 -0
  74. package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js.map +1 -0
  75. package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts +68 -0
  76. package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts.map +1 -0
  77. package/dist/swap/providers/uniswap/UniswapSwapProvider.js +206 -0
  78. package/dist/swap/providers/uniswap/UniswapSwapProvider.js.map +1 -0
  79. package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.d.ts +2 -0
  80. package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.d.ts.map +1 -0
  81. package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js +257 -0
  82. package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js.map +1 -0
  83. package/dist/swap/providers/uniswap/__tests__/sdk.test.d.ts +2 -0
  84. package/dist/swap/providers/uniswap/__tests__/sdk.test.d.ts.map +1 -0
  85. package/dist/swap/providers/uniswap/__tests__/sdk.test.js +312 -0
  86. package/dist/swap/providers/uniswap/__tests__/sdk.test.js.map +1 -0
  87. package/dist/swap/providers/uniswap/abis.d.ts +227 -0
  88. package/dist/swap/providers/uniswap/abis.d.ts.map +1 -0
  89. package/dist/swap/providers/uniswap/abis.js +138 -0
  90. package/dist/swap/providers/uniswap/abis.js.map +1 -0
  91. package/dist/swap/providers/uniswap/addresses.d.ts +21 -0
  92. package/dist/swap/providers/uniswap/addresses.d.ts.map +1 -0
  93. package/dist/swap/providers/uniswap/addresses.js +81 -0
  94. package/dist/swap/providers/uniswap/addresses.js.map +1 -0
  95. package/dist/swap/providers/uniswap/encoding.d.ts +77 -0
  96. package/dist/swap/providers/uniswap/encoding.d.ts.map +1 -0
  97. package/dist/swap/providers/uniswap/encoding.js +233 -0
  98. package/dist/swap/providers/uniswap/encoding.js.map +1 -0
  99. package/dist/swap/providers/uniswap/types.d.ts +20 -0
  100. package/dist/swap/providers/uniswap/types.d.ts.map +1 -0
  101. package/dist/swap/providers/uniswap/types.js +2 -0
  102. package/dist/swap/providers/uniswap/types.js.map +1 -0
  103. package/dist/types/actions.d.ts +19 -5
  104. package/dist/types/actions.d.ts.map +1 -1
  105. package/dist/types/index.d.ts +2 -0
  106. package/dist/types/index.d.ts.map +1 -1
  107. package/dist/types/index.js +2 -0
  108. package/dist/types/index.js.map +1 -1
  109. package/dist/types/lend/base.d.ts +3 -13
  110. package/dist/types/lend/base.d.ts.map +1 -1
  111. package/dist/types/lend/base.js.map +1 -1
  112. package/dist/types/swap/base.d.ts +238 -0
  113. package/dist/types/swap/base.d.ts.map +1 -0
  114. package/dist/types/swap/base.js +4 -0
  115. package/dist/types/swap/base.js.map +1 -0
  116. package/dist/types/swap/index.d.ts +2 -0
  117. package/dist/types/swap/index.d.ts.map +1 -0
  118. package/dist/types/swap/index.js +2 -0
  119. package/dist/types/swap/index.js.map +1 -0
  120. package/dist/types/transaction.d.ts +14 -0
  121. package/dist/types/transaction.d.ts.map +1 -0
  122. package/dist/types/transaction.js +2 -0
  123. package/dist/types/transaction.js.map +1 -0
  124. package/dist/utils/assets.d.ts +4 -5
  125. package/dist/utils/assets.d.ts.map +1 -1
  126. package/dist/utils/assets.js +4 -11
  127. package/dist/utils/assets.js.map +1 -1
  128. package/dist/utils/assets.test.js +13 -1
  129. package/dist/utils/assets.test.js.map +1 -1
  130. package/dist/utils/permit2.d.ts +46 -0
  131. package/dist/utils/permit2.d.ts.map +1 -0
  132. package/dist/utils/permit2.js +100 -0
  133. package/dist/utils/permit2.js.map +1 -0
  134. package/dist/utils/permit2.test.d.ts +2 -0
  135. package/dist/utils/permit2.test.d.ts.map +1 -0
  136. package/dist/utils/permit2.test.js +110 -0
  137. package/dist/utils/permit2.test.js.map +1 -0
  138. package/dist/utils/validation.d.ts +12 -0
  139. package/dist/utils/validation.d.ts.map +1 -0
  140. package/dist/utils/validation.js +44 -0
  141. package/dist/utils/validation.js.map +1 -0
  142. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts +7 -1
  143. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts.map +1 -1
  144. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js +2 -1
  145. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js.map +1 -1
  146. package/dist/wallet/core/providers/hosted/types/index.d.ts +5 -1
  147. package/dist/wallet/core/providers/hosted/types/index.d.ts.map +1 -1
  148. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts +7 -1
  149. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts.map +1 -1
  150. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js +5 -1
  151. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js.map +1 -1
  152. package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js +2 -2
  153. package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js.map +1 -1
  154. package/dist/wallet/core/wallets/abstract/Wallet.d.ts +13 -2
  155. package/dist/wallet/core/wallets/abstract/Wallet.d.ts.map +1 -1
  156. package/dist/wallet/core/wallets/abstract/Wallet.js +7 -1
  157. package/dist/wallet/core/wallets/abstract/Wallet.js.map +1 -1
  158. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts +7 -2
  159. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts.map +1 -1
  160. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js +6 -5
  161. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js.map +1 -1
  162. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +6 -1
  163. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
  164. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js +3 -1
  165. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
  166. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.d.ts.map +1 -1
  167. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js +4 -3
  168. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js.map +1 -1
  169. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +5 -1
  170. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
  171. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +4 -2
  172. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
  173. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts +6 -1
  174. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
  175. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js +4 -3
  176. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js.map +1 -1
  177. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts +5 -1
  178. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
  179. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
  180. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
  181. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts +7 -1
  182. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts.map +1 -1
  183. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js +6 -2
  184. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js.map +1 -1
  185. package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js +1 -0
  186. package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js.map +1 -1
  187. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +6 -1
  188. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
  189. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js +5 -2
  190. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
  191. package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +1 -0
  192. package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
  193. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +6 -3
  194. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
  195. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +5 -4
  196. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
  197. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.d.ts.map +1 -1
  198. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js +6 -6
  199. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js.map +1 -1
  200. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts +7 -1
  201. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts.map +1 -1
  202. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js +5 -3
  203. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js.map +1 -1
  204. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts +5 -1
  205. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
  206. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js +3 -3
  207. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js.map +1 -1
  208. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts +5 -1
  209. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
  210. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
  211. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
  212. package/package.json +2 -2
  213. package/src/__mocks__/MockAssets.ts +2 -0
  214. package/src/__tests__/actions.test.ts +0 -4
  215. package/src/actions.ts +57 -19
  216. package/src/constants/assets.ts +16 -0
  217. package/src/constants/contracts.ts +5 -0
  218. package/src/index.ts +30 -2
  219. package/src/lend/core/LendProvider.ts +6 -18
  220. package/src/lend/core/__tests__/LendProvider.test.ts +2 -5
  221. package/src/lend/providers/morpho/__tests__/sdk.test.ts +3 -2
  222. package/src/lend/providers/morpho/api.ts +4 -0
  223. package/src/lend/providers/morpho/sdk.ts +10 -1
  224. package/src/supported/tokens.ts +16 -2
  225. package/src/swap/__mocks__/MockSwapProvider.ts +216 -0
  226. package/src/swap/core/SwapProvider.ts +319 -0
  227. package/src/swap/core/__tests__/SwapProvider.test.ts +478 -0
  228. package/src/swap/index.ts +14 -0
  229. package/src/swap/namespaces/ActionsSwapNamespace.ts +7 -0
  230. package/src/swap/namespaces/BaseSwapNamespace.ts +77 -0
  231. package/src/swap/namespaces/WalletSwapNamespace.ts +82 -0
  232. package/src/swap/namespaces/__tests__/BaseSwapNamespace.spec.ts +138 -0
  233. package/src/swap/namespaces/__tests__/WalletSwapNamespace.spec.ts +162 -0
  234. package/src/swap/providers/uniswap/UniswapSwapProvider.ts +304 -0
  235. package/src/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.ts +299 -0
  236. package/src/swap/providers/uniswap/__tests__/sdk.test.ts +370 -0
  237. package/src/swap/providers/uniswap/abis.ts +144 -0
  238. package/src/swap/providers/uniswap/addresses.ts +108 -0
  239. package/src/swap/providers/uniswap/encoding.ts +406 -0
  240. package/src/swap/providers/uniswap/types.ts +24 -0
  241. package/src/types/actions.ts +22 -6
  242. package/src/types/index.ts +2 -0
  243. package/src/types/lend/base.ts +4 -14
  244. package/src/types/swap/base.ts +259 -0
  245. package/src/types/swap/index.ts +1 -0
  246. package/src/types/transaction.ts +14 -0
  247. package/src/utils/assets.test.ts +16 -1
  248. package/src/utils/assets.ts +13 -10
  249. package/src/utils/permit2.test.ts +142 -0
  250. package/src/utils/permit2.ts +144 -0
  251. package/src/utils/validation.ts +76 -0
  252. package/src/wallet/core/providers/hosted/abstract/HostedWalletProvider.ts +9 -1
  253. package/src/wallet/core/providers/hosted/types/index.ts +5 -1
  254. package/src/wallet/core/providers/smart/default/DefaultSmartWalletProvider.ts +13 -1
  255. package/src/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.ts +2 -0
  256. package/src/wallet/core/wallets/abstract/Wallet.ts +18 -2
  257. package/src/wallet/core/wallets/smart/default/DefaultSmartWallet.ts +14 -5
  258. package/src/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.ts +13 -2
  259. package/src/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.ts +10 -2
  260. package/src/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +8 -2
  261. package/src/wallet/node/wallets/hosted/privy/PrivyWallet.ts +11 -2
  262. package/src/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.ts +10 -2
  263. package/src/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.ts +10 -2
  264. package/src/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.ts +1 -0
  265. package/src/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.ts +9 -2
  266. package/src/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +1 -0
  267. package/src/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +9 -4
  268. package/src/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.ts +18 -6
  269. package/src/wallet/react/wallets/hosted/dynamic/DynamicWallet.ts +12 -2
  270. package/src/wallet/react/wallets/hosted/privy/PrivyWallet.ts +10 -2
  271. package/src/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.ts +10 -2
@@ -0,0 +1,144 @@
1
+ import type { Address, PublicClient } from 'viem'
2
+ import { encodeFunctionData, erc20Abi, maxUint256 } from 'viem'
3
+
4
+ import type { TransactionData } from '@/types/transaction.js'
5
+
6
+ /** Default Permit2 approval expiry: 30 days in seconds */
7
+ export const DEFAULT_PERMIT2_EXPIRY_SECONDS = 30 * 24 * 60 * 60
8
+
9
+ /**
10
+ * Permit2 ABI (subset for approvals)
11
+ */
12
+ const PERMIT2_ABI = [
13
+ {
14
+ name: 'allowance',
15
+ type: 'function',
16
+ stateMutability: 'view',
17
+ inputs: [
18
+ { name: 'owner', type: 'address' },
19
+ { name: 'token', type: 'address' },
20
+ { name: 'spender', type: 'address' },
21
+ ],
22
+ outputs: [
23
+ { name: 'amount', type: 'uint160' },
24
+ { name: 'expiration', type: 'uint48' },
25
+ { name: 'nonce', type: 'uint48' },
26
+ ],
27
+ },
28
+ {
29
+ name: 'approve',
30
+ type: 'function',
31
+ stateMutability: 'nonpayable',
32
+ inputs: [
33
+ { name: 'token', type: 'address' },
34
+ { name: 'spender', type: 'address' },
35
+ { name: 'amount', type: 'uint160' },
36
+ { name: 'expiration', type: 'uint48' },
37
+ ],
38
+ outputs: [],
39
+ },
40
+ ] as const
41
+
42
+ /**
43
+ * Permit2 allowance info
44
+ */
45
+ export interface Permit2Allowance {
46
+ amount: bigint
47
+ expiration: number
48
+ nonce: number
49
+ }
50
+
51
+ /**
52
+ * Check Permit2 allowance for a token/spender pair
53
+ */
54
+ export async function checkPermit2Allowance(params: {
55
+ publicClient: PublicClient
56
+ permit2Address: Address
57
+ owner: Address
58
+ token: Address
59
+ spender: Address
60
+ }): Promise<Permit2Allowance> {
61
+ const { publicClient, permit2Address, owner, token, spender } = params
62
+
63
+ const result = await publicClient.readContract({
64
+ address: permit2Address,
65
+ abi: PERMIT2_ABI,
66
+ functionName: 'allowance',
67
+ args: [owner, token, spender],
68
+ })
69
+
70
+ return {
71
+ amount: BigInt(result[0]),
72
+ expiration: Number(result[1]),
73
+ nonce: Number(result[2]),
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Build ERC20 token approval transaction to Permit2
79
+ */
80
+ export function buildTokenApprovalTx(
81
+ token: Address,
82
+ permit2Address: Address,
83
+ ): TransactionData {
84
+ const data = encodeFunctionData({
85
+ abi: erc20Abi,
86
+ functionName: 'approve',
87
+ // ERC20 -> Permit2: maxUint256 is the Uniswap-canonical pattern.
88
+ // Permit2 is immutable with no owner — spending is scoped by its own allowance system.
89
+ args: [permit2Address, maxUint256],
90
+ })
91
+
92
+ return {
93
+ to: token,
94
+ data,
95
+ value: 0n,
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Build Permit2 approval transaction for a spender
101
+ */
102
+ export function buildPermit2ApprovalTx(params: {
103
+ permit2Address: Address
104
+ token: Address
105
+ spender: Address
106
+ amount: bigint
107
+ expirySeconds?: number
108
+ }): TransactionData {
109
+ const { permit2Address, token, spender, amount } = params
110
+ const expiration =
111
+ Math.floor(Date.now() / 1000) +
112
+ (params.expirySeconds ?? DEFAULT_PERMIT2_EXPIRY_SECONDS)
113
+
114
+ const data = encodeFunctionData({
115
+ abi: PERMIT2_ABI,
116
+ functionName: 'approve',
117
+ args: [token, spender, amount, expiration],
118
+ })
119
+
120
+ return {
121
+ to: permit2Address,
122
+ data,
123
+ value: 0n,
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Check ERC20 token allowance
129
+ */
130
+ export async function checkTokenAllowance(params: {
131
+ publicClient: PublicClient
132
+ token: Address
133
+ owner: Address
134
+ spender: Address
135
+ }): Promise<bigint> {
136
+ const { publicClient, token, owner, spender } = params
137
+
138
+ return publicClient.readContract({
139
+ address: token,
140
+ abi: erc20Abi,
141
+ functionName: 'allowance',
142
+ args: [owner, spender],
143
+ })
144
+ }
@@ -0,0 +1,76 @@
1
+ import type { Address } from 'viem'
2
+
3
+ import type { SupportedChainId } from '@/constants/supportedChains.js'
4
+ import type { Asset } from '@/types/asset.js'
5
+ import { isAssetSupportedOnChain } from '@/utils/assets.js'
6
+
7
+ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'
8
+
9
+ export function validateAmountProvided(
10
+ amountIn?: number,
11
+ amountOut?: number,
12
+ ): void {
13
+ if (amountIn === undefined && amountOut === undefined) {
14
+ throw new Error('Either amountIn or amountOut must be provided')
15
+ }
16
+ }
17
+
18
+ export function validateAmountPositiveIfExists(amount?: number): void {
19
+ if (amount !== undefined && amount <= 0) {
20
+ throw new Error('Amount must be positive')
21
+ }
22
+ }
23
+
24
+ export function validateNotBothAmounts(
25
+ amountIn?: number,
26
+ amountOut?: number,
27
+ ): void {
28
+ if (amountIn !== undefined && amountOut !== undefined) {
29
+ throw new Error('Provide either amountIn or amountOut, not both')
30
+ }
31
+ }
32
+
33
+ export function validateNotSameAsset(assetIn: Asset, assetOut: Asset): void {
34
+ if (
35
+ assetIn.metadata.symbol.toLowerCase() ===
36
+ assetOut.metadata.symbol.toLowerCase()
37
+ ) {
38
+ throw new Error('Cannot swap an asset for itself')
39
+ }
40
+ }
41
+
42
+ export function validateNotZeroAddress(address: Address, label: string): void {
43
+ if (address === ZERO_ADDRESS) {
44
+ throw new Error(`${label} cannot be the zero address`)
45
+ }
46
+ }
47
+
48
+ export function validateSlippage(slippage: number, maxSlippage: number): void {
49
+ if (slippage < 0 || slippage > maxSlippage) {
50
+ throw new Error(
51
+ `Slippage ${slippage} exceeds allowed range [0, ${maxSlippage * 100}%]`,
52
+ )
53
+ }
54
+ }
55
+
56
+ export function validateChainSupported(
57
+ chainId: number,
58
+ supportedChainIds: readonly number[],
59
+ ): void {
60
+ if (!supportedChainIds.includes(chainId)) {
61
+ throw new Error(
62
+ `Chain ${chainId} is not supported. Supported chains: ${supportedChainIds.join(', ')}`,
63
+ )
64
+ }
65
+ }
66
+
67
+ export function validateAssetOnChain(
68
+ asset: Asset,
69
+ chainId: SupportedChainId,
70
+ ): void {
71
+ if (!isAssetSupportedOnChain(asset, chainId)) {
72
+ throw new Error(
73
+ `Asset ${asset.metadata.symbol} not supported on chain ${chainId}`,
74
+ )
75
+ }
76
+ }
@@ -2,7 +2,8 @@ import type { LocalAccount } from 'viem'
2
2
 
3
3
  import type { LendProvider } from '@/lend/core/LendProvider.js'
4
4
  import type { ChainManager } from '@/services/ChainManager.js'
5
- import type { LendProviderConfig } from '@/types/actions.js'
5
+ import type { SwapProvider } from '@/swap/core/SwapProvider.js'
6
+ import type { LendProviderConfig, SwapProviderConfig } from '@/types/actions.js'
6
7
  import type { Asset } from '@/types/asset.js'
7
8
  import type { Wallet } from '@/wallet/core/wallets/abstract/Wallet.js'
8
9
 
@@ -21,6 +22,9 @@ export abstract class HostedWalletProvider<
21
22
  morpho?: LendProvider<LendProviderConfig>
22
23
  aave?: LendProvider<LendProviderConfig>
23
24
  }
25
+ protected swapProviders: {
26
+ uniswap?: SwapProvider<SwapProviderConfig>
27
+ }
24
28
  protected supportedAssets?: Asset[]
25
29
 
26
30
  protected constructor(
@@ -29,10 +33,14 @@ export abstract class HostedWalletProvider<
29
33
  morpho?: LendProvider<LendProviderConfig>
30
34
  aave?: LendProvider<LendProviderConfig>
31
35
  },
36
+ swapProviders?: {
37
+ uniswap?: SwapProvider<SwapProviderConfig>
38
+ },
32
39
  supportedAssets?: Asset[],
33
40
  ) {
34
41
  this.chainManager = chainManager
35
42
  this.lendProviders = lendProviders || {}
43
+ this.swapProviders = swapProviders || {}
36
44
  this.supportedAssets = supportedAssets
37
45
  }
38
46
  /**
@@ -1,6 +1,7 @@
1
1
  import type { LendProvider } from '@/lend/core/LendProvider.js'
2
2
  import type { ChainManager } from '@/services/ChainManager.js'
3
- import type { LendProviderConfig } from '@/types/actions.js'
3
+ import type { SwapProvider } from '@/swap/core/SwapProvider.js'
4
+ import type { LendProviderConfig, SwapProviderConfig } from '@/types/actions.js'
4
5
  import type { Asset } from '@/types/asset.js'
5
6
  import type { HostedWalletProvider } from '@/wallet/core/providers/hosted/abstract/HostedWalletProvider.js'
6
7
 
@@ -16,6 +17,9 @@ export interface HostedProviderDeps {
16
17
  morpho?: LendProvider<LendProviderConfig>
17
18
  aave?: LendProvider<LendProviderConfig>
18
19
  }
20
+ swapProviders?: {
21
+ uniswap?: SwapProvider<SwapProviderConfig>
22
+ }
19
23
  supportedAssets?: Asset[]
20
24
  }
21
25
 
@@ -4,7 +4,8 @@ import { keccak256, slice, toHex } from 'viem'
4
4
  import type { SupportedChainId } from '@/constants/supportedChains.js'
5
5
  import type { LendProvider } from '@/lend/core/LendProvider.js'
6
6
  import type { ChainManager } from '@/services/ChainManager.js'
7
- import type { LendProviderConfig } from '@/types/actions.js'
7
+ import type { SwapProvider } from '@/swap/core/SwapProvider.js'
8
+ import type { LendProviderConfig, SwapProviderConfig } from '@/types/actions.js'
8
9
  import type { Asset } from '@/types/asset.js'
9
10
  import { SmartWalletProvider } from '@/wallet/core/providers/smart/abstract/SmartWalletProvider.js'
10
11
  import type { SmartWalletCreationResult } from '@/wallet/core/providers/smart/abstract/types/index.js'
@@ -31,6 +32,10 @@ export class DefaultSmartWalletProvider extends SmartWalletProvider {
31
32
  morpho?: LendProvider<LendProviderConfig>
32
33
  aave?: LendProvider<LendProviderConfig>
33
34
  }
35
+ /** Providers for swap operations */
36
+ private swapProviders: {
37
+ uniswap?: SwapProvider<SwapProviderConfig>
38
+ }
34
39
  /** Supported assets for this wallet provider */
35
40
  private supportedAssets?: Asset[]
36
41
  /** Optional 16-byte attribution suffix appended to callData */
@@ -40,6 +45,7 @@ export class DefaultSmartWalletProvider extends SmartWalletProvider {
40
45
  * Initialize the Smart Wallet Provider
41
46
  * @param chainManager - Manages supported blockchain networks
42
47
  * @param lendProviders - Providers for lending market operations
48
+ * @param swapProviders - Providers for swap operations
43
49
  * @param supportedAssets - Optional list of supported assets
44
50
  * @param attributionSuffix - Optional attribution suffix
45
51
  */
@@ -49,12 +55,16 @@ export class DefaultSmartWalletProvider extends SmartWalletProvider {
49
55
  morpho?: LendProvider<LendProviderConfig>
50
56
  aave?: LendProvider<LendProviderConfig>
51
57
  },
58
+ swapProviders?: {
59
+ uniswap?: SwapProvider<SwapProviderConfig>
60
+ },
52
61
  supportedAssets?: Asset[],
53
62
  attributionSuffix?: string,
54
63
  ) {
55
64
  super()
56
65
  this.chainManager = chainManager
57
66
  this.lendProviders = lendProviders || {}
67
+ this.swapProviders = swapProviders || {}
58
68
  this.supportedAssets = supportedAssets
59
69
  if (attributionSuffix) {
60
70
  this.attributionSuffix =
@@ -93,6 +103,7 @@ export class DefaultSmartWalletProvider extends SmartWalletProvider {
93
103
  signer,
94
104
  chainManager: this.chainManager,
95
105
  lendProviders: this.lendProviders,
106
+ swapProviders: this.swapProviders,
96
107
  supportedAssets: this.supportedAssets,
97
108
  nonce,
98
109
  attributionSuffix: this.attributionSuffix,
@@ -182,6 +193,7 @@ export class DefaultSmartWalletProvider extends SmartWalletProvider {
182
193
  signer,
183
194
  chainManager: this.chainManager,
184
195
  lendProviders: this.lendProviders,
196
+ swapProviders: this.swapProviders,
185
197
  supportedAssets: this.supportedAssets,
186
198
  deploymentAddress: walletAddress,
187
199
  attributionSuffix: this.attributionSuffix,
@@ -413,6 +413,7 @@ describe('DefaultSmartWalletProvider', () => {
413
413
  const provider = new DefaultSmartWalletProvider(
414
414
  mockChainManager,
415
415
  { morpho: mockLendProvider },
416
+ undefined,
416
417
  supportedAssets,
417
418
  attributionSeed,
418
419
  )
@@ -440,6 +441,7 @@ describe('DefaultSmartWalletProvider', () => {
440
441
  const provider = new DefaultSmartWalletProvider(
441
442
  mockChainManager,
442
443
  { morpho: mockLendProvider },
444
+ undefined,
443
445
  supportedAssets,
444
446
  attributionSeed,
445
447
  )
@@ -6,9 +6,11 @@ import { WalletLendNamespace } from '@/lend/namespaces/WalletLendNamespace.js'
6
6
  import type { ChainManager } from '@/services/ChainManager.js'
7
7
  import { fetchERC20Balance, fetchETHBalance } from '@/services/tokenBalance.js'
8
8
  import { SUPPORTED_TOKENS } from '@/supported/tokens.js'
9
- import type { LendProviderConfig } from '@/types/actions.js'
9
+ import type { SwapProvider } from '@/swap/core/SwapProvider.js'
10
+ import { WalletSwapNamespace } from '@/swap/namespaces/WalletSwapNamespace.js'
11
+ import type { LendProviderConfig, SwapProviderConfig } from '@/types/actions.js'
10
12
  import type { Asset, TokenBalance } from '@/types/asset.js'
11
- import type { TransactionData } from '@/types/lend/index.js'
13
+ import type { TransactionData } from '@/types/transaction.js'
12
14
  import type {
13
15
  BatchTransactionReturnType,
14
16
  TransactionReturnType,
@@ -27,6 +29,12 @@ export abstract class Wallet {
27
29
  morpho?: LendProvider<LendProviderConfig>
28
30
  aave?: LendProvider<LendProviderConfig>
29
31
  }
32
+ /** Swap namespace with all swap operations */
33
+ swap?: WalletSwapNamespace
34
+ /** Providers for swap operations */
35
+ protected swapProviders: {
36
+ uniswap?: SwapProvider<SwapProviderConfig>
37
+ }
30
38
  /** Manages supported blockchain networks and RPC clients */
31
39
  protected chainManager: ChainManager
32
40
  /** List of supported assets for this wallet */
@@ -53,6 +61,7 @@ export abstract class Wallet {
53
61
  * Create a new wallet
54
62
  * @param chainManager - Chain manager for the wallet
55
63
  * @param lendProviders - Lend providers for the wallet
64
+ * @param swapProviders - Swap providers for the wallet
56
65
  * @param supportedAssets - List of supported assets (defaults to all SUPPORTED_TOKENS)
57
66
  */
58
67
  protected constructor(
@@ -61,14 +70,21 @@ export abstract class Wallet {
61
70
  morpho?: LendProvider<LendProviderConfig>
62
71
  aave?: LendProvider<LendProviderConfig>
63
72
  },
73
+ swapProviders?: {
74
+ uniswap?: SwapProvider<SwapProviderConfig>
75
+ },
64
76
  supportedAssets?: Asset[],
65
77
  ) {
66
78
  this.chainManager = chainManager
67
79
  this.lendProviders = lendProviders || {}
80
+ this.swapProviders = swapProviders || {}
68
81
  this.supportedAssets = supportedAssets || SUPPORTED_TOKENS
69
82
  if (this.lendProviders.morpho || this.lendProviders.aave) {
70
83
  this.lend = new WalletLendNamespace(this.lendProviders, this)
71
84
  }
85
+ if (this.swapProviders.uniswap) {
86
+ this.swap = new WalletSwapNamespace(this.swapProviders, this)
87
+ }
72
88
  }
73
89
 
74
90
  /**
@@ -15,9 +15,10 @@ import { TransactionConfirmedButRevertedError } from '@/core/error/errors.js'
15
15
  import { retryOnStaleRead } from '@/core/utils/retryOnStaleRead.js'
16
16
  import type { LendProvider } from '@/lend/core/LendProvider.js'
17
17
  import type { ChainManager } from '@/services/ChainManager.js'
18
- import type { LendProviderConfig } from '@/types/actions.js'
18
+ import type { SwapProvider } from '@/swap/core/SwapProvider.js'
19
+ import type { LendProviderConfig, SwapProviderConfig } from '@/types/actions.js'
19
20
  import type { Asset } from '@/types/asset.js'
20
- import type { TransactionData } from '@/types/lend/index.js'
21
+ import type { TransactionData } from '@/types/transaction.js'
21
22
  import { parseAssetAmount } from '@/utils/assets.js'
22
23
  import { SmartWallet } from '@/wallet/core/wallets/smart/abstract/SmartWallet.js'
23
24
  import type { Signer } from '@/wallet/core/wallets/smart/abstract/types/index.js'
@@ -59,6 +60,7 @@ export class DefaultSmartWallet extends SmartWallet {
59
60
  * @param signer - Local account for signing transactions
60
61
  * @param chainManager - Network management service
61
62
  * @param lendProviders - Lending operations providers
63
+ * @param swapProviders - Swap operations providers
62
64
  * @param deploymentAddress - Known wallet address (if already deployed)
63
65
  * @param ownerIndex - Index of signer in owners array
64
66
  * @param nonce - Nonce for address generation
@@ -71,12 +73,15 @@ export class DefaultSmartWallet extends SmartWallet {
71
73
  morpho?: LendProvider<LendProviderConfig>
72
74
  aave?: LendProvider<LendProviderConfig>
73
75
  },
76
+ swapProviders?: {
77
+ uniswap?: SwapProvider<SwapProviderConfig>
78
+ },
74
79
  supportedAssets?: Asset[],
75
80
  deploymentAddress?: Address,
76
81
  nonce?: bigint,
77
82
  attributionSuffix?: Hex,
78
83
  ) {
79
- super(chainManager, lendProviders, supportedAssets)
84
+ super(chainManager, lendProviders, swapProviders, supportedAssets)
80
85
 
81
86
  const { signersWithLocalAccount, signerIndex } =
82
87
  DefaultSmartWallet.ensureLocalAccountSigner(signers, signer)
@@ -121,6 +126,9 @@ export class DefaultSmartWallet extends SmartWallet {
121
126
  morpho?: LendProvider<LendProviderConfig>
122
127
  aave?: LendProvider<LendProviderConfig>
123
128
  }
129
+ swapProviders?: {
130
+ uniswap?: SwapProvider<SwapProviderConfig>
131
+ }
124
132
  supportedAssets?: Asset[]
125
133
  deploymentAddress?: Address
126
134
  nonce?: bigint
@@ -132,6 +140,7 @@ export class DefaultSmartWallet extends SmartWallet {
132
140
  params.signer,
133
141
  params.chainManager,
134
142
  params.lendProviders,
143
+ params.swapProviders,
135
144
  params.supportedAssets,
136
145
  params.deploymentAddress,
137
146
  params.nonce,
@@ -540,7 +549,7 @@ export class DefaultSmartWallet extends SmartWallet {
540
549
 
541
550
  // Handle ETH transfers
542
551
  if (asset.type === 'native') {
543
- const parsedAmount = parseAssetAmount(amount, asset.metadata.decimals)
552
+ const parsedAmount = parseAssetAmount(asset, amount)
544
553
 
545
554
  return {
546
555
  to: recipientAddress,
@@ -550,7 +559,7 @@ export class DefaultSmartWallet extends SmartWallet {
550
559
  }
551
560
 
552
561
  // Handle ERC20 token transfers
553
- const parsedAmount = parseAssetAmount(amount, asset.metadata.decimals)
562
+ const parsedAmount = parseAssetAmount(asset, amount)
554
563
 
555
564
  // Encode ERC20 transfer function call
556
565
  const transferData = encodeFunctionData({
@@ -4,7 +4,8 @@ import { getAddress } from 'viem'
4
4
 
5
5
  import type { LendProvider } from '@/lend/core/LendProvider.js'
6
6
  import type { ChainManager } from '@/services/ChainManager.js'
7
- import type { LendProviderConfig } from '@/types/actions.js'
7
+ import type { SwapProvider } from '@/swap/core/SwapProvider.js'
8
+ import type { LendProviderConfig, SwapProviderConfig } from '@/types/actions.js'
8
9
  import type { Asset } from '@/types/asset.js'
9
10
  import { HostedWalletProvider } from '@/wallet/core/providers/hosted/abstract/HostedWalletProvider.js'
10
11
  import type { Wallet } from '@/wallet/core/wallets/abstract/Wallet.js'
@@ -32,6 +33,7 @@ export class PrivyHostedWalletProvider extends HostedWalletProvider<
32
33
  * @param params.privyClient - Privy client instance
33
34
  * @param params.chainManager - Chain manager for multi-chain operations
34
35
  * @param params.lendProviders - Optional lend providers for DeFi operations
36
+ * @param params.swapProviders - Optional swap providers for trading operations
35
37
  * @param params.supportedAssets - Optional list of supported assets
36
38
  * @param params.authorizationContext - Optional authorization context for the Privy client.
37
39
  * Used when Privy needs to sign requests.
@@ -45,10 +47,18 @@ export class PrivyHostedWalletProvider extends HostedWalletProvider<
45
47
  morpho?: LendProvider<LendProviderConfig>
46
48
  aave?: LendProvider<LendProviderConfig>
47
49
  }
50
+ swapProviders?: {
51
+ uniswap?: SwapProvider<SwapProviderConfig>
52
+ }
48
53
  supportedAssets?: Asset[]
49
54
  authorizationContext?: AuthorizationContext
50
55
  }) {
51
- super(params.chainManager, params.lendProviders, params.supportedAssets)
56
+ super(
57
+ params.chainManager,
58
+ params.lendProviders,
59
+ params.swapProviders,
60
+ params.supportedAssets,
61
+ )
52
62
  this.privyClient = params.privyClient
53
63
  this.authorizationContext = params.authorizationContext
54
64
  }
@@ -63,6 +73,7 @@ export class PrivyHostedWalletProvider extends HostedWalletProvider<
63
73
  address: getAddress(params.address),
64
74
  chainManager: this.chainManager,
65
75
  lendProviders: this.lendProviders,
76
+ swapProviders: this.swapProviders,
66
77
  supportedAssets: this.supportedAssets,
67
78
  })
68
79
  }
@@ -28,11 +28,15 @@ export class NodeHostedWalletProviderRegistry extends HostedWalletProviderRegist
28
28
  validateOptions(options): options is NodeOptionsMap['privy'] {
29
29
  return Boolean((options as NodeOptionsMap['privy'])?.privyClient)
30
30
  },
31
- create({ chainManager, lendProviders, supportedAssets }, options) {
31
+ create(
32
+ { chainManager, lendProviders, swapProviders, supportedAssets },
33
+ options,
34
+ ) {
32
35
  return new PrivyHostedWalletProvider({
33
36
  privyClient: options.privyClient,
34
37
  chainManager,
35
38
  lendProviders,
39
+ swapProviders,
36
40
  supportedAssets,
37
41
  authorizationContext: options.authorizationContext,
38
42
  })
@@ -45,11 +49,15 @@ export class NodeHostedWalletProviderRegistry extends HostedWalletProviderRegist
45
49
  const o = options as NodeOptionsMap['turnkey']
46
50
  return Boolean(o?.client)
47
51
  },
48
- create({ chainManager, lendProviders, supportedAssets }, options) {
52
+ create(
53
+ { chainManager, lendProviders, swapProviders, supportedAssets },
54
+ options,
55
+ ) {
49
56
  return new TurnkeyHostedWalletProvider(
50
57
  options.client,
51
58
  chainManager,
52
59
  lendProviders,
60
+ swapProviders,
53
61
  supportedAssets,
54
62
  )
55
63
  },
@@ -5,7 +5,8 @@ import type { LocalAccount } from 'viem'
5
5
 
6
6
  import type { LendProvider } from '@/lend/core/LendProvider.js'
7
7
  import type { ChainManager } from '@/services/ChainManager.js'
8
- import type { LendProviderConfig } from '@/types/actions.js'
8
+ import type { SwapProvider } from '@/swap/core/SwapProvider.js'
9
+ import type { LendProviderConfig, SwapProviderConfig } from '@/types/actions.js'
9
10
  import type { Asset } from '@/types/asset.js'
10
11
  import { HostedWalletProvider } from '@/wallet/core/providers/hosted/abstract/HostedWalletProvider.js'
11
12
  import type { Wallet } from '@/wallet/core/wallets/abstract/Wallet.js'
@@ -29,6 +30,7 @@ export class TurnkeyHostedWalletProvider extends HostedWalletProvider<
29
30
  * @param client - Turnkey client instance (HTTP, server, or core SDK base)
30
31
  * @param chainManager - Chain manager used to resolve chains and RPC transports
31
32
  * @param lendProviders - Optional lend providers for DeFi operations
33
+ * @param swapProviders - Optional swap providers for trading operations
32
34
  * @param supportedAssets - Optional list of supported assets
33
35
  */
34
36
  constructor(
@@ -41,9 +43,12 @@ export class TurnkeyHostedWalletProvider extends HostedWalletProvider<
41
43
  morpho?: LendProvider<LendProviderConfig>
42
44
  aave?: LendProvider<LendProviderConfig>
43
45
  },
46
+ swapProviders?: {
47
+ uniswap?: SwapProvider<SwapProviderConfig>
48
+ },
44
49
  supportedAssets?: Asset[],
45
50
  ) {
46
- super(chainManager, lendProviders, supportedAssets)
51
+ super(chainManager, lendProviders, swapProviders, supportedAssets)
47
52
  }
48
53
 
49
54
  /**
@@ -65,6 +70,7 @@ export class TurnkeyHostedWalletProvider extends HostedWalletProvider<
65
70
  ethereumAddress: params.ethereumAddress,
66
71
  chainManager: this.chainManager,
67
72
  lendProviders: this.lendProviders,
73
+ swapProviders: this.swapProviders,
68
74
  supportedAssets: this.supportedAssets,
69
75
  })
70
76
  }
@@ -3,7 +3,8 @@ import { type Address, type LocalAccount } from 'viem'
3
3
 
4
4
  import type { LendProvider } from '@/lend/core/LendProvider.js'
5
5
  import type { ChainManager } from '@/services/ChainManager.js'
6
- import type { LendProviderConfig } from '@/types/actions.js'
6
+ import type { SwapProvider } from '@/swap/core/SwapProvider.js'
7
+ import type { LendProviderConfig, SwapProviderConfig } from '@/types/actions.js'
7
8
  import type { Asset } from '@/types/asset.js'
8
9
  import { EOAWallet } from '@/wallet/core/wallets/eoa/EOAWallet.js'
9
10
  import { createSigner } from '@/wallet/node/wallets/hosted/privy/utils/createSigner.js'
@@ -26,6 +27,7 @@ export class PrivyWallet extends EOAWallet {
26
27
  * @param address - Ethereum address of the wallet
27
28
  * @param chainManager - Chain manager for multi-chain operations
28
29
  * @param lendProviders - Optional lend providers for DeFi operations
30
+ * @param swapProviders - Optional swap providers for trading operations
29
31
  * @param supportedAssets - Optional list of supported assets
30
32
  */
31
33
  private constructor(
@@ -37,10 +39,13 @@ export class PrivyWallet extends EOAWallet {
37
39
  morpho?: LendProvider<LendProviderConfig>
38
40
  aave?: LendProvider<LendProviderConfig>
39
41
  },
42
+ swapProviders?: {
43
+ uniswap?: SwapProvider<SwapProviderConfig>
44
+ },
40
45
  supportedAssets?: Asset[],
41
46
  authorizationContext?: AuthorizationContext,
42
47
  ) {
43
- super(chainManager, lendProviders, supportedAssets)
48
+ super(chainManager, lendProviders, swapProviders, supportedAssets)
44
49
  this.privyClient = privyClient
45
50
  this.authorizationContext = authorizationContext
46
51
  this.walletId = walletId
@@ -57,6 +62,9 @@ export class PrivyWallet extends EOAWallet {
57
62
  morpho?: LendProvider<LendProviderConfig>
58
63
  aave?: LendProvider<LendProviderConfig>
59
64
  }
65
+ swapProviders?: {
66
+ uniswap?: SwapProvider<SwapProviderConfig>
67
+ }
60
68
  supportedAssets?: Asset[]
61
69
  }): Promise<PrivyWallet> {
62
70
  const wallet = new PrivyWallet(
@@ -65,6 +73,7 @@ export class PrivyWallet extends EOAWallet {
65
73
  params.address,
66
74
  params.chainManager,
67
75
  params.lendProviders,
76
+ params.swapProviders,
68
77
  params.supportedAssets,
69
78
  params.authorizationContext,
70
79
  )