@eth-optimism/actions-sdk 0.3.0 → 0.4.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 (436) hide show
  1. package/dist/__mocks__/MockAssets.d.ts +17 -2
  2. package/dist/__mocks__/MockAssets.d.ts.map +1 -1
  3. package/dist/__mocks__/MockAssets.js +49 -6
  4. package/dist/__mocks__/MockAssets.js.map +1 -1
  5. package/dist/__tests__/actions.test.js +1 -1
  6. package/dist/__tests__/actions.test.js.map +1 -1
  7. package/dist/actions.d.ts +8 -13
  8. package/dist/actions.d.ts.map +1 -1
  9. package/dist/actions.js +35 -27
  10. package/dist/actions.js.map +1 -1
  11. package/dist/constants/assets.d.ts +215 -4
  12. package/dist/constants/assets.d.ts.map +1 -1
  13. package/dist/constants/assets.js +734 -11
  14. package/dist/constants/assets.js.map +1 -1
  15. package/dist/constants/providers.d.ts +6 -0
  16. package/dist/constants/providers.d.ts.map +1 -0
  17. package/dist/constants/providers.js +6 -0
  18. package/dist/constants/providers.js.map +1 -0
  19. package/dist/constants/supportedChains.d.ts +2 -2
  20. package/dist/constants/supportedChains.d.ts.map +1 -1
  21. package/dist/constants/supportedChains.js +12 -2
  22. package/dist/constants/supportedChains.js.map +1 -1
  23. package/dist/index.d.ts +4 -5
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -4
  26. package/dist/index.js.map +1 -1
  27. package/dist/lend/__mocks__/MockLendProvider.d.ts +1 -1
  28. package/dist/lend/__mocks__/MockLendProvider.d.ts.map +1 -1
  29. package/dist/lend/__mocks__/MockLendProvider.js +7 -2
  30. package/dist/lend/__mocks__/MockLendProvider.js.map +1 -1
  31. package/dist/lend/core/LendProvider.d.ts +12 -8
  32. package/dist/lend/core/LendProvider.d.ts.map +1 -1
  33. package/dist/lend/core/LendProvider.js +15 -21
  34. package/dist/lend/core/LendProvider.js.map +1 -1
  35. package/dist/lend/namespaces/BaseLendNamespace.d.ts +2 -6
  36. package/dist/lend/namespaces/BaseLendNamespace.d.ts.map +1 -1
  37. package/dist/lend/namespaces/BaseLendNamespace.js.map +1 -1
  38. package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js +7 -4
  39. package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js.map +1 -1
  40. package/dist/lend/providers/aave/AaveLendProvider.d.ts +1 -6
  41. package/dist/lend/providers/aave/AaveLendProvider.d.ts.map +1 -1
  42. package/dist/lend/providers/aave/AaveLendProvider.js +3 -6
  43. package/dist/lend/providers/aave/AaveLendProvider.js.map +1 -1
  44. package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js +14 -6
  45. package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js.map +1 -1
  46. package/dist/lend/providers/aave/addresses.d.ts +13 -39
  47. package/dist/lend/providers/aave/addresses.d.ts.map +1 -1
  48. package/dist/lend/providers/aave/addresses.js +65 -60
  49. package/dist/lend/providers/aave/addresses.js.map +1 -1
  50. package/dist/lend/providers/aave/sdk.d.ts +2 -2
  51. package/dist/lend/providers/aave/sdk.d.ts.map +1 -1
  52. package/dist/lend/providers/aave/sdk.js +6 -28
  53. package/dist/lend/providers/aave/sdk.js.map +1 -1
  54. package/dist/lend/providers/morpho/MorphoLendProvider.d.ts +1 -6
  55. package/dist/lend/providers/morpho/MorphoLendProvider.d.ts.map +1 -1
  56. package/dist/lend/providers/morpho/MorphoLendProvider.js +4 -13
  57. package/dist/lend/providers/morpho/MorphoLendProvider.js.map +1 -1
  58. package/dist/lend/providers/morpho/__tests__/api.test.js +52 -43
  59. package/dist/lend/providers/morpho/__tests__/api.test.js.map +1 -1
  60. package/dist/lend/providers/morpho/__tests__/sdk.test.js +41 -42
  61. package/dist/lend/providers/morpho/__tests__/sdk.test.js.map +1 -1
  62. package/dist/lend/providers/morpho/api.d.ts +3 -7
  63. package/dist/lend/providers/morpho/api.d.ts.map +1 -1
  64. package/dist/lend/providers/morpho/api.js +2 -2
  65. package/dist/lend/providers/morpho/api.js.map +1 -1
  66. package/dist/lend/providers/morpho/contracts.d.ts +11 -10
  67. package/dist/lend/providers/morpho/contracts.d.ts.map +1 -1
  68. package/dist/lend/providers/morpho/contracts.js +43 -10
  69. package/dist/lend/providers/morpho/contracts.js.map +1 -1
  70. package/dist/lend/providers/morpho/sdk.d.ts +7 -2
  71. package/dist/lend/providers/morpho/sdk.d.ts.map +1 -1
  72. package/dist/lend/providers/morpho/sdk.js +67 -63
  73. package/dist/lend/providers/morpho/sdk.js.map +1 -1
  74. package/dist/nodeActionsFactory.d.ts +1 -1
  75. package/dist/reactActionsFactory.d.ts +1 -1
  76. package/dist/services/ChainManager.d.ts +8 -8
  77. package/dist/services/ChainManager.d.ts.map +1 -1
  78. package/dist/services/ChainManager.js.map +1 -1
  79. package/dist/services/__mocks__/MockChainManager.d.ts +4 -4
  80. package/dist/services/__mocks__/MockChainManager.d.ts.map +1 -1
  81. package/dist/services/__mocks__/MockChainManager.js.map +1 -1
  82. package/dist/services/tokenBalance.d.ts +1 -1
  83. package/dist/services/tokenBalance.d.ts.map +1 -1
  84. package/dist/services/tokenBalance.js +31 -30
  85. package/dist/services/tokenBalance.js.map +1 -1
  86. package/dist/services/tokenBalance.spec.js +20 -24
  87. package/dist/services/tokenBalance.spec.js.map +1 -1
  88. package/dist/swap/__mocks__/MockSwapProvider.d.ts +20 -8
  89. package/dist/swap/__mocks__/MockSwapProvider.d.ts.map +1 -1
  90. package/dist/swap/__mocks__/MockSwapProvider.js +52 -29
  91. package/dist/swap/__mocks__/MockSwapProvider.js.map +1 -1
  92. package/dist/swap/core/SwapProvider.d.ts +105 -16
  93. package/dist/swap/core/SwapProvider.d.ts.map +1 -1
  94. package/dist/swap/core/SwapProvider.js +218 -36
  95. package/dist/swap/core/SwapProvider.js.map +1 -1
  96. package/dist/swap/core/__tests__/SwapProvider.test.js +115 -9
  97. package/dist/swap/core/__tests__/SwapProvider.test.js.map +1 -1
  98. package/dist/swap/core/markets.d.ts +47 -0
  99. package/dist/swap/core/markets.d.ts.map +1 -0
  100. package/dist/swap/core/markets.js +65 -0
  101. package/dist/swap/core/markets.js.map +1 -0
  102. package/dist/swap/index.d.ts +2 -0
  103. package/dist/swap/index.d.ts.map +1 -1
  104. package/dist/swap/index.js +1 -0
  105. package/dist/swap/index.js.map +1 -1
  106. package/dist/swap/namespaces/ActionsSwapNamespace.d.ts +2 -2
  107. package/dist/swap/namespaces/ActionsSwapNamespace.js +2 -2
  108. package/dist/swap/namespaces/BaseSwapNamespace.d.ts +48 -8
  109. package/dist/swap/namespaces/BaseSwapNamespace.d.ts.map +1 -1
  110. package/dist/swap/namespaces/BaseSwapNamespace.js +139 -16
  111. package/dist/swap/namespaces/BaseSwapNamespace.js.map +1 -1
  112. package/dist/swap/namespaces/WalletSwapNamespace.d.ts +19 -7
  113. package/dist/swap/namespaces/WalletSwapNamespace.d.ts.map +1 -1
  114. package/dist/swap/namespaces/WalletSwapNamespace.js +39 -15
  115. package/dist/swap/namespaces/WalletSwapNamespace.js.map +1 -1
  116. package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js +150 -11
  117. package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js.map +1 -1
  118. package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js +85 -8
  119. package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js.map +1 -1
  120. package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts +9 -42
  121. package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts.map +1 -1
  122. package/dist/swap/providers/uniswap/UniswapSwapProvider.js +81 -139
  123. package/dist/swap/providers/uniswap/UniswapSwapProvider.js.map +1 -1
  124. package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js +10 -9
  125. package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js.map +1 -1
  126. package/dist/swap/providers/uniswap/__tests__/sdk.test.js +17 -17
  127. package/dist/swap/providers/uniswap/__tests__/sdk.test.js.map +1 -1
  128. package/dist/swap/providers/uniswap/addresses.d.ts +5 -0
  129. package/dist/swap/providers/uniswap/addresses.d.ts.map +1 -1
  130. package/dist/swap/providers/uniswap/addresses.js +1 -1
  131. package/dist/swap/providers/uniswap/addresses.js.map +1 -1
  132. package/dist/swap/providers/uniswap/encoding.d.ts +4 -4
  133. package/dist/swap/providers/uniswap/encoding.js +17 -17
  134. package/dist/swap/providers/uniswap/markets.d.ts +19 -0
  135. package/dist/swap/providers/uniswap/markets.d.ts.map +1 -0
  136. package/dist/swap/providers/uniswap/markets.js +48 -0
  137. package/dist/swap/providers/uniswap/markets.js.map +1 -0
  138. package/dist/swap/providers/uniswap/types.d.ts +4 -3
  139. package/dist/swap/providers/uniswap/types.d.ts.map +1 -1
  140. package/dist/swap/providers/velodrome/VelodromeSwapProvider.d.ts +49 -0
  141. package/dist/swap/providers/velodrome/VelodromeSwapProvider.d.ts.map +1 -0
  142. package/dist/swap/providers/velodrome/VelodromeSwapProvider.js +140 -0
  143. package/dist/swap/providers/velodrome/VelodromeSwapProvider.js.map +1 -0
  144. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.d.ts +2 -0
  145. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.d.ts.map +1 -0
  146. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.js +255 -0
  147. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.js.map +1 -0
  148. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.d.ts +2 -0
  149. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.d.ts.map +1 -0
  150. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.js +166 -0
  151. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.js.map +1 -0
  152. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.d.ts +2 -0
  153. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.d.ts.map +1 -0
  154. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.js +419 -0
  155. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.js.map +1 -0
  156. package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.d.ts +2 -0
  157. package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.d.ts.map +1 -0
  158. package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.js +51 -0
  159. package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.js.map +1 -0
  160. package/dist/swap/providers/velodrome/__tests__/encoding.helpers.d.ts +14 -0
  161. package/dist/swap/providers/velodrome/__tests__/encoding.helpers.d.ts.map +1 -0
  162. package/dist/swap/providers/velodrome/__tests__/encoding.helpers.js +13 -0
  163. package/dist/swap/providers/velodrome/__tests__/encoding.helpers.js.map +1 -0
  164. package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.d.ts +2 -0
  165. package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.d.ts.map +1 -0
  166. package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.js +173 -0
  167. package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.js.map +1 -0
  168. package/dist/swap/providers/velodrome/abis.d.ts +396 -0
  169. package/dist/swap/providers/velodrome/abis.d.ts.map +1 -0
  170. package/dist/swap/providers/velodrome/abis.js +257 -0
  171. package/dist/swap/providers/velodrome/abis.js.map +1 -0
  172. package/dist/swap/providers/velodrome/addresses.d.ts +39 -0
  173. package/dist/swap/providers/velodrome/addresses.d.ts.map +1 -0
  174. package/dist/swap/providers/velodrome/addresses.js +57 -0
  175. package/dist/swap/providers/velodrome/addresses.js.map +1 -0
  176. package/dist/swap/providers/velodrome/config.d.ts +22 -0
  177. package/dist/swap/providers/velodrome/config.d.ts.map +1 -0
  178. package/dist/swap/providers/velodrome/config.js +29 -0
  179. package/dist/swap/providers/velodrome/config.js.map +1 -0
  180. package/dist/swap/providers/velodrome/encoding/helpers.d.ts +37 -0
  181. package/dist/swap/providers/velodrome/encoding/helpers.d.ts.map +1 -0
  182. package/dist/swap/providers/velodrome/encoding/helpers.js +60 -0
  183. package/dist/swap/providers/velodrome/encoding/helpers.js.map +1 -0
  184. package/dist/swap/providers/velodrome/encoding/index.d.ts +8 -0
  185. package/dist/swap/providers/velodrome/encoding/index.d.ts.map +1 -0
  186. package/dist/swap/providers/velodrome/encoding/index.js +5 -0
  187. package/dist/swap/providers/velodrome/encoding/index.js.map +1 -0
  188. package/dist/swap/providers/velodrome/encoding/poolRouter.d.ts +39 -0
  189. package/dist/swap/providers/velodrome/encoding/poolRouter.d.ts.map +1 -0
  190. package/dist/swap/providers/velodrome/encoding/poolRouter.js +83 -0
  191. package/dist/swap/providers/velodrome/encoding/poolRouter.js.map +1 -0
  192. package/dist/swap/providers/velodrome/encoding/routers/approval.d.ts +15 -0
  193. package/dist/swap/providers/velodrome/encoding/routers/approval.d.ts.map +1 -0
  194. package/dist/swap/providers/velodrome/encoding/routers/approval.js +33 -0
  195. package/dist/swap/providers/velodrome/encoding/routers/approval.js.map +1 -0
  196. package/dist/swap/providers/velodrome/encoding/routers/cl.d.ts +40 -0
  197. package/dist/swap/providers/velodrome/encoding/routers/cl.d.ts.map +1 -0
  198. package/dist/swap/providers/velodrome/encoding/routers/cl.js +80 -0
  199. package/dist/swap/providers/velodrome/encoding/routers/cl.js.map +1 -0
  200. package/dist/swap/providers/velodrome/encoding/routers/v2.d.ts +42 -0
  201. package/dist/swap/providers/velodrome/encoding/routers/v2.d.ts.map +1 -0
  202. package/dist/swap/providers/velodrome/encoding/routers/v2.js +166 -0
  203. package/dist/swap/providers/velodrome/encoding/routers/v2.js.map +1 -0
  204. package/dist/swap/providers/velodrome/markets.d.ts +21 -0
  205. package/dist/swap/providers/velodrome/markets.d.ts.map +1 -0
  206. package/dist/swap/providers/velodrome/markets.js +69 -0
  207. package/dist/swap/providers/velodrome/markets.js.map +1 -0
  208. package/dist/swap/providers/velodrome/types.d.ts +31 -0
  209. package/dist/swap/providers/velodrome/types.d.ts.map +1 -0
  210. package/dist/swap/providers/velodrome/types.js +2 -0
  211. package/dist/swap/providers/velodrome/types.js.map +1 -0
  212. package/dist/types/actions.d.ts +44 -9
  213. package/dist/types/actions.d.ts.map +1 -1
  214. package/dist/types/asset.d.ts +7 -9
  215. package/dist/types/asset.d.ts.map +1 -1
  216. package/dist/types/chain.d.ts +2 -2
  217. package/dist/types/chain.d.ts.map +1 -1
  218. package/dist/types/lend/base.d.ts +6 -6
  219. package/dist/types/lend/base.d.ts.map +1 -1
  220. package/dist/types/lend/base.js.map +1 -1
  221. package/dist/types/lend/contracts.d.ts +2 -1
  222. package/dist/types/lend/contracts.d.ts.map +1 -1
  223. package/dist/types/providers.d.ts +21 -0
  224. package/dist/types/providers.d.ts.map +1 -0
  225. package/dist/types/providers.js +2 -0
  226. package/dist/types/providers.js.map +1 -0
  227. package/dist/types/swap/base.d.ts +133 -33
  228. package/dist/types/swap/base.d.ts.map +1 -1
  229. package/dist/utils/approve.d.ts +82 -0
  230. package/dist/utils/approve.d.ts.map +1 -0
  231. package/dist/utils/{permit2.js → approve.js} +48 -14
  232. package/dist/utils/approve.js.map +1 -0
  233. package/dist/utils/approve.test.d.ts +2 -0
  234. package/dist/utils/approve.test.d.ts.map +1 -0
  235. package/dist/utils/{permit2.test.js → approve.test.js} +95 -2
  236. package/dist/utils/approve.test.js.map +1 -0
  237. package/dist/utils/assets.d.ts +6 -0
  238. package/dist/utils/assets.d.ts.map +1 -1
  239. package/dist/utils/assets.js +10 -0
  240. package/dist/utils/assets.js.map +1 -1
  241. package/dist/utils/validateAddresses.d.ts +32 -0
  242. package/dist/utils/validateAddresses.d.ts.map +1 -0
  243. package/dist/utils/validateAddresses.js +103 -0
  244. package/dist/utils/validateAddresses.js.map +1 -0
  245. package/dist/utils/validateAddresses.test.d.ts +2 -0
  246. package/dist/utils/validateAddresses.test.d.ts.map +1 -0
  247. package/dist/utils/validateAddresses.test.js +314 -0
  248. package/dist/utils/validateAddresses.test.js.map +1 -0
  249. package/dist/wallet/core/namespace/WalletNamespace.d.ts +21 -9
  250. package/dist/wallet/core/namespace/WalletNamespace.d.ts.map +1 -1
  251. package/dist/wallet/core/namespace/WalletNamespace.js +44 -15
  252. package/dist/wallet/core/namespace/WalletNamespace.js.map +1 -1
  253. package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js +4 -4
  254. package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js.map +1 -1
  255. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts +4 -16
  256. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts.map +1 -1
  257. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js.map +1 -1
  258. package/dist/wallet/core/providers/hosted/types/index.d.ts +6 -11
  259. package/dist/wallet/core/providers/hosted/types/index.d.ts.map +1 -1
  260. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts +2 -9
  261. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts.map +1 -1
  262. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js.map +1 -1
  263. package/dist/wallet/core/wallets/abstract/Wallet.d.ts +6 -17
  264. package/dist/wallet/core/wallets/abstract/Wallet.d.ts.map +1 -1
  265. package/dist/wallet/core/wallets/abstract/Wallet.js +5 -6
  266. package/dist/wallet/core/wallets/abstract/Wallet.js.map +1 -1
  267. package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.d.ts +10 -1
  268. package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.d.ts.map +1 -1
  269. package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.js +2 -2
  270. package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.js.map +1 -1
  271. package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js +12 -4
  272. package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js.map +1 -1
  273. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts +3 -10
  274. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts.map +1 -1
  275. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js.map +1 -1
  276. package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js.map +1 -1
  277. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +3 -10
  278. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
  279. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
  280. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.d.ts +2 -4
  281. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.d.ts.map +1 -1
  282. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js +6 -8
  283. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js.map +1 -1
  284. package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js +4 -4
  285. package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js.map +1 -1
  286. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +2 -9
  287. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
  288. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
  289. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts +3 -10
  290. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
  291. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js.map +1 -1
  292. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts +3 -10
  293. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
  294. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
  295. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts +3 -9
  296. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts.map +1 -1
  297. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js +3 -2
  298. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js.map +1 -1
  299. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +3 -9
  300. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
  301. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js +3 -2
  302. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
  303. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +3 -9
  304. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
  305. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +3 -2
  306. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
  307. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.d.ts +2 -4
  308. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.d.ts.map +1 -1
  309. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js +11 -13
  310. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js.map +1 -1
  311. package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js +6 -6
  312. package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js.map +1 -1
  313. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts +5 -10
  314. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts.map +1 -1
  315. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js +3 -3
  316. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js.map +1 -1
  317. package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts +2 -6
  318. package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts.map +1 -1
  319. package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.js.map +1 -1
  320. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts +5 -10
  321. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
  322. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js +3 -3
  323. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js.map +1 -1
  324. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts +5 -10
  325. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
  326. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
  327. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
  328. package/package.json +3 -2
  329. package/src/__mocks__/MockAssets.ts +54 -6
  330. package/src/__tests__/actions.test.ts +1 -1
  331. package/src/actions.ts +58 -61
  332. package/src/constants/assets.ts +781 -10
  333. package/src/constants/providers.ts +5 -0
  334. package/src/constants/supportedChains.ts +22 -2
  335. package/src/index.ts +50 -8
  336. package/src/lend/__mocks__/MockLendProvider.ts +8 -3
  337. package/src/lend/core/LendProvider.ts +27 -28
  338. package/src/lend/namespaces/BaseLendNamespace.ts +2 -6
  339. package/src/lend/namespaces/__tests__/BaseLendNamespace.spec.ts +12 -5
  340. package/src/lend/providers/aave/AaveLendProvider.ts +3 -7
  341. package/src/lend/providers/aave/__tests__/AaveLendProvider.test.ts +16 -7
  342. package/src/lend/providers/aave/addresses.ts +82 -64
  343. package/src/lend/providers/aave/sdk.ts +11 -36
  344. package/src/lend/providers/morpho/MorphoLendProvider.ts +4 -16
  345. package/src/lend/providers/morpho/__tests__/api.test.ts +65 -44
  346. package/src/lend/providers/morpho/__tests__/sdk.test.ts +43 -43
  347. package/src/lend/providers/morpho/api.ts +7 -8
  348. package/src/lend/providers/morpho/contracts.ts +62 -13
  349. package/src/lend/providers/morpho/sdk.ts +85 -63
  350. package/src/services/ChainManager.ts +12 -21
  351. package/src/services/__mocks__/MockChainManager.ts +4 -7
  352. package/src/services/tokenBalance.spec.ts +20 -24
  353. package/src/services/tokenBalance.ts +39 -33
  354. package/src/swap/__mocks__/MockSwapProvider.ts +77 -42
  355. package/src/swap/core/SwapProvider.ts +307 -49
  356. package/src/swap/core/__tests__/SwapProvider.test.ts +151 -9
  357. package/src/swap/core/markets.ts +104 -0
  358. package/src/swap/index.ts +5 -0
  359. package/src/swap/namespaces/ActionsSwapNamespace.ts +2 -2
  360. package/src/swap/namespaces/BaseSwapNamespace.ts +199 -18
  361. package/src/swap/namespaces/WalletSwapNamespace.ts +53 -14
  362. package/src/swap/namespaces/__tests__/BaseSwapNamespace.spec.ts +241 -14
  363. package/src/swap/namespaces/__tests__/WalletSwapNamespace.spec.ts +103 -8
  364. package/src/swap/providers/uniswap/UniswapSwapProvider.ts +108 -195
  365. package/src/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.ts +12 -12
  366. package/src/swap/providers/uniswap/__tests__/sdk.test.ts +19 -20
  367. package/src/swap/providers/uniswap/addresses.ts +3 -1
  368. package/src/swap/providers/uniswap/encoding.ts +22 -22
  369. package/src/swap/providers/uniswap/markets.ts +84 -0
  370. package/src/swap/providers/uniswap/types.ts +4 -3
  371. package/src/swap/providers/velodrome/VelodromeSwapProvider.ts +224 -0
  372. package/src/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.ts +341 -0
  373. package/src/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.ts +202 -0
  374. package/src/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.ts +506 -0
  375. package/src/swap/providers/velodrome/__tests__/encoding.cl.test.ts +69 -0
  376. package/src/swap/providers/velodrome/__tests__/encoding.helpers.ts +20 -0
  377. package/src/swap/providers/velodrome/__tests__/encoding.v2.test.ts +235 -0
  378. package/src/swap/providers/velodrome/abis.ts +264 -0
  379. package/src/swap/providers/velodrome/addresses.ts +107 -0
  380. package/src/swap/providers/velodrome/config.ts +46 -0
  381. package/src/swap/providers/velodrome/encoding/helpers.ts +82 -0
  382. package/src/swap/providers/velodrome/encoding/index.ts +7 -0
  383. package/src/swap/providers/velodrome/encoding/poolRouter.ts +124 -0
  384. package/src/swap/providers/velodrome/encoding/routers/approval.ts +45 -0
  385. package/src/swap/providers/velodrome/encoding/routers/cl.ts +156 -0
  386. package/src/swap/providers/velodrome/encoding/routers/v2.ts +267 -0
  387. package/src/swap/providers/velodrome/markets.ts +100 -0
  388. package/src/swap/providers/velodrome/types.ts +30 -0
  389. package/src/types/actions.ts +49 -9
  390. package/src/types/asset.ts +12 -9
  391. package/src/types/chain.ts +2 -2
  392. package/src/types/lend/base.ts +6 -6
  393. package/src/types/lend/contracts.ts +5 -1
  394. package/src/types/providers.ts +22 -0
  395. package/src/types/swap/base.ts +147 -34
  396. package/src/utils/{permit2.test.ts → approve.test.ts} +117 -1
  397. package/src/utils/{permit2.ts → approve.ts} +67 -14
  398. package/src/utils/assets.ts +14 -0
  399. package/src/utils/validateAddresses.test.ts +439 -0
  400. package/src/utils/validateAddresses.ts +153 -0
  401. package/src/wallet/core/namespace/WalletNamespace.ts +70 -16
  402. package/src/wallet/core/namespace/__tests__/WalletNamespace.spec.ts +8 -4
  403. package/src/wallet/core/providers/hosted/abstract/HostedWalletProvider.ts +5 -17
  404. package/src/wallet/core/providers/hosted/types/index.ts +9 -11
  405. package/src/wallet/core/providers/smart/default/DefaultSmartWalletProvider.ts +5 -17
  406. package/src/wallet/core/wallets/abstract/Wallet.ts +15 -22
  407. package/src/wallet/core/wallets/abstract/__mocks__/TestWallet.ts +13 -1
  408. package/src/wallet/core/wallets/abstract/__tests__/Wallet.spec.ts +21 -5
  409. package/src/wallet/core/wallets/smart/default/DefaultSmartWallet.ts +5 -17
  410. package/src/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.ts +0 -1
  411. package/src/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.ts +3 -10
  412. package/src/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.ts +8 -8
  413. package/src/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.ts +4 -4
  414. package/src/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +3 -10
  415. package/src/wallet/node/wallets/hosted/privy/PrivyWallet.ts +5 -17
  416. package/src/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.ts +5 -17
  417. package/src/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.ts +7 -11
  418. package/src/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.ts +7 -11
  419. package/src/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +7 -11
  420. package/src/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.ts +23 -10
  421. package/src/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.ts +6 -6
  422. package/src/wallet/react/wallets/hosted/dynamic/DynamicWallet.ts +10 -18
  423. package/src/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.ts +2 -6
  424. package/src/wallet/react/wallets/hosted/privy/PrivyWallet.ts +10 -18
  425. package/src/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.ts +10 -18
  426. package/dist/supported/tokens.d.ts +0 -25
  427. package/dist/supported/tokens.d.ts.map +0 -1
  428. package/dist/supported/tokens.js +0 -44
  429. package/dist/supported/tokens.js.map +0 -1
  430. package/dist/utils/permit2.d.ts +0 -46
  431. package/dist/utils/permit2.d.ts.map +0 -1
  432. package/dist/utils/permit2.js.map +0 -1
  433. package/dist/utils/permit2.test.d.ts +0 -2
  434. package/dist/utils/permit2.test.d.ts.map +0 -1
  435. package/dist/utils/permit2.test.js.map +0 -1
  436. package/src/supported/tokens.ts +0 -66
@@ -0,0 +1,82 @@
1
+ import type { Address } from 'viem'
2
+ import { formatUnits } from 'viem'
3
+
4
+ import { WETH } from '@/constants/assets.js'
5
+ import type { SupportedChainId } from '@/constants/supportedChains.js'
6
+ import { UNIVERSAL_ROUTER_MSG_SENDER } from '@/swap/core/markets.js'
7
+ import type { Asset } from '@/types/asset.js'
8
+ import type { SwapPrice, SwapRoute } from '@/types/swap/index.js'
9
+ import { getAssetAddress, isNativeAsset } from '@/utils/assets.js'
10
+
11
+ export { UNIVERSAL_ROUTER_MSG_SENDER }
12
+
13
+ /**
14
+ * Resolve an asset pair to on-chain token addresses for a given chain.
15
+ * Native ETH is converted to the WETH predeploy address.
16
+ * @param assetIn - Input asset
17
+ * @param assetOut - Output asset
18
+ * @param chainId - Target chain
19
+ * @returns Resolved token addresses
20
+ */
21
+ export function resolveTokens(
22
+ assetIn: Asset,
23
+ assetOut: Asset,
24
+ chainId: SupportedChainId,
25
+ ): { tokenIn: Address; tokenOut: Address } {
26
+ const tokenIn = isNativeAsset(assetIn)
27
+ ? getWrappedNativeAddress(chainId)
28
+ : getAssetAddress(assetIn, chainId)
29
+ const tokenOut = isNativeAsset(assetOut)
30
+ ? getWrappedNativeAddress(chainId)
31
+ : getAssetAddress(assetOut, chainId)
32
+ return { tokenIn, tokenOut }
33
+ }
34
+
35
+ /**
36
+ * Get the wrapped native token address for a chain.
37
+ * Velodrome routers require WETH in Route structs, not address(0).
38
+ * @param chainId - Target chain
39
+ * @returns WETH address
40
+ * @throws If no WETH address configured for the chain
41
+ */
42
+ export function getWrappedNativeAddress(chainId: SupportedChainId): Address {
43
+ const addr = WETH.address[chainId]
44
+ if (!addr || addr === 'native') {
45
+ throw new Error(`No WETH address configured for chain ${chainId}`)
46
+ }
47
+ return addr
48
+ }
49
+
50
+ /**
51
+ * Build a SwapPrice from raw quote data.
52
+ * @param assetIn - Input asset (for decimal conversion)
53
+ * @param assetOut - Output asset (for decimal conversion)
54
+ * @param amountInRaw - Input amount as raw bigint
55
+ * @param amountOutRaw - Output amount as raw bigint
56
+ * @param route - Swap route information
57
+ * @returns SwapPrice with human-readable and raw amounts
58
+ */
59
+ export function buildSwapPrice(
60
+ assetIn: Asset,
61
+ assetOut: Asset,
62
+ amountInRaw: bigint,
63
+ amountOutRaw: bigint,
64
+ route: SwapRoute,
65
+ ): SwapPrice {
66
+ const amountIn = parseFloat(
67
+ formatUnits(amountInRaw, assetIn.metadata.decimals),
68
+ )
69
+ const amountOut = parseFloat(
70
+ formatUnits(amountOutRaw, assetOut.metadata.decimals),
71
+ )
72
+ return {
73
+ price: (amountOut / amountIn).toFixed(6),
74
+ priceInverse: (amountIn / amountOut).toFixed(6),
75
+ amountIn,
76
+ amountOut,
77
+ amountInRaw,
78
+ amountOutRaw,
79
+ priceImpact: 0,
80
+ route,
81
+ }
82
+ }
@@ -0,0 +1,7 @@
1
+ export type { PoolQuoteResult } from './poolRouter.js'
2
+ export { encodePoolSwap, fetchPoolQuote } from './poolRouter.js'
3
+ export { buildTokenApproval } from './routers/approval.js'
4
+ export type { EncodeCLSwapParams, GetCLQuoteParams } from './routers/cl.js'
5
+ export { encodeCLSwap, getCLQuote } from './routers/cl.js'
6
+ export type { EncodeSwapParams, GetQuoteParams } from './routers/v2.js'
7
+ export { encodeSwap, getQuote } from './routers/v2.js'
@@ -0,0 +1,124 @@
1
+ import type { Address, Hex, PublicClient } from 'viem'
2
+
3
+ import type { SupportedChainId } from '@/constants/supportedChains.js'
4
+ import type { VelodromeChainConfig } from '@/swap/providers/velodrome/config.js'
5
+ import type { ResolvedPoolConfig } from '@/swap/providers/velodrome/types.js'
6
+ import type { Asset } from '@/types/asset.js'
7
+ import type { SwapPrice } from '@/types/swap/index.js'
8
+
9
+ import { encodeCLSwap, getCLQuote } from './routers/cl.js'
10
+ import { encodeSwap, getQuote } from './routers/v2.js'
11
+
12
+ /** Internal result from pool-type-specific quoting */
13
+ export interface PoolQuoteResult {
14
+ internalQuote: SwapPrice
15
+ providerContext: Record<string, unknown>
16
+ }
17
+
18
+ /**
19
+ * Fetch a price quote by routing to the correct pool type (v2 AMM or CL/Slipstream).
20
+ * @returns Internal quote and provider context for the SwapQuote
21
+ * @throws If CL pool requested on a chain without CL factory/quoter
22
+ */
23
+ export async function fetchPoolQuote(
24
+ poolConfig: ResolvedPoolConfig,
25
+ params: {
26
+ assetIn: Asset
27
+ assetOut: Asset
28
+ amountInRaw: bigint
29
+ chainId: SupportedChainId
30
+ publicClient: PublicClient
31
+ chain: VelodromeChainConfig
32
+ },
33
+ ): Promise<PoolQuoteResult> {
34
+ const { assetIn, assetOut, amountInRaw, chainId, publicClient, chain } =
35
+ params
36
+
37
+ if (poolConfig.type === 'cl') {
38
+ if (!chain.contracts.clPoolFactory || !chain.contracts.clQuoterV2) {
39
+ throw new Error(`CL pools not supported on chain ${chainId}`)
40
+ }
41
+ const internalQuote = await getCLQuote({
42
+ assetIn,
43
+ assetOut,
44
+ amountInRaw,
45
+ chainId,
46
+ publicClient,
47
+ clFactoryAddress: chain.contracts.clPoolFactory,
48
+ clQuoterAddress: chain.contracts.clQuoterV2,
49
+ tickSpacing: poolConfig.tickSpacing,
50
+ })
51
+ return {
52
+ internalQuote,
53
+ providerContext: {
54
+ tickSpacing: poolConfig.tickSpacing,
55
+ clFactoryAddress: chain.contracts.clPoolFactory,
56
+ poolAddress: internalQuote.route.pools[0]?.address,
57
+ },
58
+ }
59
+ }
60
+
61
+ const internalQuote = await getQuote({
62
+ assetIn,
63
+ assetOut,
64
+ amountInRaw,
65
+ chainId,
66
+ publicClient,
67
+ routerAddress: chain.contracts.router,
68
+ routerType: chain.metadata.routerType,
69
+ stable: poolConfig.stable,
70
+ factoryAddress: chain.contracts.poolFactory,
71
+ })
72
+ return {
73
+ internalQuote,
74
+ providerContext: {
75
+ stable: poolConfig.stable,
76
+ factoryAddress: chain.contracts.poolFactory,
77
+ routerType: chain.metadata.routerType,
78
+ },
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Encode swap calldata by routing to the correct pool type (v2 AMM or CL/Slipstream).
84
+ * @returns Encoded calldata as hex string
85
+ */
86
+ export function encodePoolSwap(
87
+ poolConfig: ResolvedPoolConfig,
88
+ params: {
89
+ assetIn: Asset
90
+ assetOut: Asset
91
+ amountInRaw: bigint
92
+ amountOutMinRaw: bigint
93
+ recipient: Address
94
+ deadline: number
95
+ chainId: SupportedChainId
96
+ chain: VelodromeChainConfig
97
+ },
98
+ ): Hex {
99
+ if (poolConfig.type === 'cl') {
100
+ return encodeCLSwap({
101
+ assetIn: params.assetIn,
102
+ assetOut: params.assetOut,
103
+ amountInRaw: params.amountInRaw,
104
+ amountOutMin: params.amountOutMinRaw,
105
+ tickSpacing: poolConfig.tickSpacing,
106
+ recipient: params.recipient,
107
+ deadline: params.deadline,
108
+ chainId: params.chainId,
109
+ })
110
+ }
111
+
112
+ return encodeSwap({
113
+ assetIn: params.assetIn,
114
+ assetOut: params.assetOut,
115
+ amountInRaw: params.amountInRaw,
116
+ amountOutMin: params.amountOutMinRaw,
117
+ routerType: params.chain.metadata.routerType,
118
+ stable: poolConfig.stable,
119
+ factoryAddress: params.chain.contracts.poolFactory,
120
+ recipient: params.recipient,
121
+ deadline: params.deadline,
122
+ chainId: params.chainId,
123
+ })
124
+ }
@@ -0,0 +1,45 @@
1
+ import type { Address, PublicClient } from 'viem'
2
+ import { encodeFunctionData, erc20Abi } from 'viem'
3
+
4
+ import type { VelodromeRouterType } from '@/swap/providers/velodrome/config.js'
5
+ import type { TransactionData } from '@/types/transaction.js'
6
+ import { buildApprovalTxIfNeeded } from '@/utils/approve.js'
7
+
8
+ /**
9
+ * Build a token approval or transfer transaction for swap input.
10
+ *
11
+ * Universal Router uses a direct ERC20 transfer instead of approve+transferFrom.
12
+ * This works because smart wallet batching (4337) bundles the transfer and swap
13
+ * into a single atomic UserOperation — the router receives tokens before executing
14
+ * the swap in the same transaction. The caller must already hold the tokens.
15
+ *
16
+ * Legacy routers (v2, leaf) use standard approve, approving only the deficit.
17
+ */
18
+ export async function buildTokenApproval(
19
+ token: Address,
20
+ router: Address,
21
+ routerType: VelodromeRouterType,
22
+ amount: bigint,
23
+ owner: Address,
24
+ publicClient: PublicClient,
25
+ ): Promise<TransactionData | undefined> {
26
+ if (routerType === 'universal') {
27
+ return {
28
+ to: token,
29
+ data: encodeFunctionData({
30
+ abi: erc20Abi,
31
+ functionName: 'transfer',
32
+ args: [router, amount],
33
+ }),
34
+ value: 0n,
35
+ }
36
+ }
37
+
38
+ return buildApprovalTxIfNeeded({
39
+ publicClient,
40
+ token,
41
+ owner,
42
+ spender: router,
43
+ amount,
44
+ })
45
+ }
@@ -0,0 +1,156 @@
1
+ import type { Address, Hex, PublicClient } from 'viem'
2
+ import { encodeAbiParameters, encodeFunctionData, encodePacked } from 'viem'
3
+
4
+ import type { SupportedChainId } from '@/constants/supportedChains.js'
5
+ import {
6
+ CL_POOL_FACTORY_ABI,
7
+ CL_QUOTER_ABI,
8
+ UNIVERSAL_ROUTER_ABI,
9
+ } from '@/swap/providers/velodrome/abis.js'
10
+ import {
11
+ buildSwapPrice,
12
+ resolveTokens,
13
+ UNIVERSAL_ROUTER_MSG_SENDER,
14
+ } from '@/swap/providers/velodrome/encoding/helpers.js'
15
+ import type { Asset } from '@/types/asset.js'
16
+ import type { SwapPrice, SwapRoute } from '@/types/swap/index.js'
17
+
18
+ // ─────────────────────────────────────────────────────────────────────────────
19
+ // Quoting
20
+ // ─────────────────────────────────────────────────────────────────────────────
21
+
22
+ export interface GetCLQuoteParams {
23
+ assetIn: Asset
24
+ assetOut: Asset
25
+ amountInRaw: bigint
26
+ chainId: SupportedChainId
27
+ publicClient: PublicClient
28
+ clFactoryAddress: Address
29
+ clQuoterAddress: Address
30
+ tickSpacing: number
31
+ }
32
+
33
+ /**
34
+ * Get a swap quote from a CL/Slipstream pool via QuoterV2.
35
+ * Verifies the pool exists via the CL factory, then quotes via QuoterV2.
36
+ * @param params - CL quote parameters
37
+ * @returns Price quote with amounts and route
38
+ * @throws If no CL pool exists for the given pair and tickSpacing
39
+ */
40
+ export async function getCLQuote(params: GetCLQuoteParams): Promise<SwapPrice> {
41
+ const {
42
+ assetIn,
43
+ assetOut,
44
+ amountInRaw,
45
+ publicClient,
46
+ clFactoryAddress,
47
+ clQuoterAddress,
48
+ tickSpacing,
49
+ chainId,
50
+ } = params
51
+ const { tokenIn, tokenOut } = resolveTokens(assetIn, assetOut, chainId)
52
+
53
+ // Verify the CL pool exists
54
+ const poolAddress = await publicClient.readContract({
55
+ address: clFactoryAddress,
56
+ abi: CL_POOL_FACTORY_ABI,
57
+ functionName: 'getPool',
58
+ args: [tokenIn, tokenOut, tickSpacing],
59
+ })
60
+
61
+ if (
62
+ !poolAddress ||
63
+ poolAddress === '0x0000000000000000000000000000000000000000'
64
+ ) {
65
+ throw new Error(
66
+ `No CL pool found for ${assetIn.metadata.symbol}/${assetOut.metadata.symbol} (tickSpacing=${tickSpacing})`,
67
+ )
68
+ }
69
+
70
+ // Quote via QuoterV2.quoteExactInputSingle
71
+ // sqrtPriceLimitX96 = 0 means no price limit
72
+ const quoteResult = (await publicClient.readContract({
73
+ address: clQuoterAddress,
74
+ abi: CL_QUOTER_ABI,
75
+ functionName: 'quoteExactInputSingle',
76
+ args: [
77
+ {
78
+ tokenIn,
79
+ tokenOut,
80
+ amountIn: amountInRaw,
81
+ tickSpacing,
82
+ sqrtPriceLimitX96: 0n,
83
+ },
84
+ ],
85
+ })) as readonly [bigint, bigint, number, bigint]
86
+
87
+ const route: SwapRoute = {
88
+ path: [assetIn, assetOut],
89
+ pools: [{ address: poolAddress as Address, fee: 0, version: 'v3' }],
90
+ }
91
+ return buildSwapPrice(assetIn, assetOut, amountInRaw, quoteResult[0], route)
92
+ }
93
+
94
+ // ─────────────────────────────────────────────────────────────────────────────
95
+ // Encoding
96
+ // ─────────────────────────────────────────────────────────────────────────────
97
+
98
+ export interface EncodeCLSwapParams {
99
+ assetIn: Asset
100
+ assetOut: Asset
101
+ amountInRaw: bigint
102
+ amountOutMin: bigint
103
+ tickSpacing: number
104
+ recipient: Address
105
+ deadline: number
106
+ chainId: SupportedChainId
107
+ }
108
+
109
+ /** Universal Router V3_SWAP_EXACT_IN command byte */
110
+ const V3_SWAP_EXACT_IN = 0x00
111
+
112
+ /**
113
+ * Encode a V3_SWAP_EXACT_IN command for a CL/Slipstream pool on the Universal Router.
114
+ * Path: encodePacked([tokenIn (20), tickSpacing as int24 (3), tokenOut (20)]) — 43 bytes.
115
+ * @param params - CL swap encoding parameters
116
+ * @returns Encoded calldata as hex string
117
+ */
118
+ export function encodeCLSwap(params: EncodeCLSwapParams): Hex {
119
+ const { amountInRaw, amountOutMin, tickSpacing, deadline, chainId } = params
120
+ const { tokenIn, tokenOut } = resolveTokens(
121
+ params.assetIn,
122
+ params.assetOut,
123
+ chainId,
124
+ )
125
+
126
+ const commands = `0x${V3_SWAP_EXACT_IN.toString(16).padStart(2, '0')}` as Hex
127
+
128
+ // CL path: [tokenIn (20)] [tickSpacing as int24 (3)] [tokenOut (20)] — 43 bytes
129
+ const path = encodePacked(
130
+ ['address', 'int24', 'address'],
131
+ [tokenIn, tickSpacing, tokenOut],
132
+ )
133
+
134
+ const input = encodeAbiParameters(
135
+ [
136
+ { type: 'address' },
137
+ { type: 'uint256' },
138
+ { type: 'uint256' },
139
+ { type: 'bytes' },
140
+ { type: 'bool' },
141
+ ],
142
+ [
143
+ UNIVERSAL_ROUTER_MSG_SENDER, // recipient = msg.sender (Universal Router sentinel)
144
+ amountInRaw,
145
+ amountOutMin,
146
+ path,
147
+ false, // payerIsUser — tokens pre-transferred to router
148
+ ],
149
+ )
150
+
151
+ return encodeFunctionData({
152
+ abi: UNIVERSAL_ROUTER_ABI,
153
+ functionName: 'execute',
154
+ args: [commands, [input], BigInt(deadline)],
155
+ })
156
+ }
@@ -0,0 +1,267 @@
1
+ import type { Address, Hex, PublicClient } from 'viem'
2
+ import { encodeAbiParameters, encodeFunctionData, encodePacked } from 'viem'
3
+
4
+ import type { SupportedChainId } from '@/constants/supportedChains.js'
5
+ import {
6
+ LEAF_ROUTER_ABI,
7
+ POOL_ABI,
8
+ POOL_FACTORY_ABI,
9
+ UNIVERSAL_ROUTER_ABI,
10
+ V2_ROUTER_ABI,
11
+ } from '@/swap/providers/velodrome/abis.js'
12
+ import type { VelodromeRouterType } from '@/swap/providers/velodrome/config.js'
13
+ import {
14
+ buildSwapPrice,
15
+ resolveTokens,
16
+ UNIVERSAL_ROUTER_MSG_SENDER,
17
+ } from '@/swap/providers/velodrome/encoding/helpers.js'
18
+ import type { Asset } from '@/types/asset.js'
19
+ import type { SwapPrice, SwapRoute } from '@/types/swap/index.js'
20
+ import { isNativeAsset } from '@/utils/assets.js'
21
+
22
+ /** Universal Router V2_SWAP_EXACT_IN command byte */
23
+ const V2_SWAP_EXACT_IN = 0x08
24
+
25
+ // ─────────────────────────────────────────────────────────────────────────────
26
+ // Quoting
27
+ // ─────────────────────────────────────────────────────────────────────────────
28
+
29
+ export interface GetQuoteParams {
30
+ assetIn: Asset
31
+ assetOut: Asset
32
+ amountInRaw: bigint
33
+ chainId: SupportedChainId
34
+ publicClient: PublicClient
35
+ routerAddress: Address
36
+ routerType: VelodromeRouterType
37
+ stable: boolean
38
+ factoryAddress: Address
39
+ }
40
+
41
+ /**
42
+ * Get a v2 AMM swap quote.
43
+ * @param params - Quote parameters including router type
44
+ * @returns Price quote with amounts and route
45
+ */
46
+ export async function getQuote(params: GetQuoteParams): Promise<SwapPrice> {
47
+ const { assetIn, assetOut, amountInRaw, chainId } = params
48
+ const { tokenIn, tokenOut } = resolveTokens(assetIn, assetOut, chainId)
49
+ const amountOutRaw = await fetchAmountOut(params, tokenIn, tokenOut)
50
+ const route: SwapRoute = {
51
+ path: [assetIn, assetOut],
52
+ pools: [{ address: tokenIn, fee: 0, version: 'v2' }],
53
+ }
54
+ return buildSwapPrice(assetIn, assetOut, amountInRaw, amountOutRaw, route)
55
+ }
56
+
57
+ /**
58
+ * Fetch the output amount using the appropriate quoting mechanism for the router type.
59
+ * @param params - Quote parameters
60
+ * @param tokenIn - Resolved input token address
61
+ * @param tokenOut - Resolved output token address
62
+ * @returns Output amount as raw bigint
63
+ * @throws If router type is unknown
64
+ */
65
+ async function fetchAmountOut(
66
+ params: GetQuoteParams,
67
+ tokenIn: Address,
68
+ tokenOut: Address,
69
+ ): Promise<bigint> {
70
+ const { routerType } = params
71
+
72
+ if (routerType === 'universal') {
73
+ return fetchAmountOutViaPool(params, tokenIn, tokenOut)
74
+ }
75
+ if (routerType === 'v2') {
76
+ return fetchAmountOutViaRouter(params, V2_ROUTER_ABI, {
77
+ from: tokenIn,
78
+ to: tokenOut,
79
+ stable: params.stable,
80
+ factory: params.factoryAddress,
81
+ })
82
+ }
83
+ if (routerType === 'leaf') {
84
+ return fetchAmountOutViaRouter(params, LEAF_ROUTER_ABI, {
85
+ from: tokenIn,
86
+ to: tokenOut,
87
+ stable: params.stable,
88
+ })
89
+ }
90
+ throw new Error(`Unknown router type: ${routerType as string}`)
91
+ }
92
+
93
+ /** Quote via Pool.getAmountOut (Universal Router path — no router-level quoting available). */
94
+ async function fetchAmountOutViaPool(
95
+ params: GetQuoteParams,
96
+ tokenIn: Address,
97
+ tokenOut: Address,
98
+ ): Promise<bigint> {
99
+ const { publicClient, factoryAddress, stable, assetIn, assetOut } = params
100
+
101
+ const poolAddress = await publicClient.readContract({
102
+ address: factoryAddress,
103
+ abi: POOL_FACTORY_ABI,
104
+ functionName: 'getPool',
105
+ args: [tokenIn, tokenOut, stable],
106
+ })
107
+
108
+ if (
109
+ !poolAddress ||
110
+ poolAddress === '0x0000000000000000000000000000000000000000'
111
+ ) {
112
+ throw new Error(
113
+ `No Velodrome pool found for ${assetIn.metadata.symbol}/${assetOut.metadata.symbol} (stable=${stable})`,
114
+ )
115
+ }
116
+
117
+ return (await publicClient.readContract({
118
+ address: poolAddress as Address,
119
+ abi: POOL_ABI,
120
+ functionName: 'getAmountOut',
121
+ args: [params.amountInRaw, tokenIn],
122
+ })) as bigint
123
+ }
124
+
125
+ /** Quote via Router.getAmountsOut (v2 and leaf router path). */
126
+ async function fetchAmountOutViaRouter(
127
+ params: GetQuoteParams,
128
+ abi: typeof V2_ROUTER_ABI | typeof LEAF_ROUTER_ABI,
129
+ route: { from: Address; to: Address; stable: boolean; factory?: Address },
130
+ ): Promise<bigint> {
131
+ const amounts = await params.publicClient.readContract({
132
+ address: params.routerAddress,
133
+ abi,
134
+ functionName: 'getAmountsOut',
135
+ args: [params.amountInRaw, [route]],
136
+ })
137
+ return (amounts as bigint[])[1]
138
+ }
139
+
140
+ // ─────────────────────────────────────────────────────────────────────────────
141
+ // Encoding
142
+ // ─────────────────────────────────────────────────────────────────────────────
143
+
144
+ export interface EncodeSwapParams {
145
+ assetIn: Asset
146
+ assetOut: Asset
147
+ amountInRaw: bigint
148
+ amountOutMin: bigint
149
+ routerType: VelodromeRouterType
150
+ stable: boolean
151
+ factoryAddress: Address
152
+ recipient: Address
153
+ deadline: number
154
+ chainId: SupportedChainId
155
+ }
156
+
157
+ /**
158
+ * Encode swap calldata for the appropriate router type.
159
+ * @param params - Swap encoding parameters
160
+ * @returns Encoded calldata as hex string
161
+ * @throws If router type is unknown
162
+ */
163
+ export function encodeSwap(params: EncodeSwapParams): Hex {
164
+ const { routerType } = params
165
+ const { tokenIn, tokenOut } = resolveTokens(
166
+ params.assetIn,
167
+ params.assetOut,
168
+ params.chainId,
169
+ )
170
+
171
+ if (routerType === 'universal') {
172
+ return encodeUniversalV2Swap(tokenIn, tokenOut, params)
173
+ }
174
+ if (routerType === 'v2') {
175
+ return encodeRouterSwap(tokenIn, tokenOut, params, V2_ROUTER_ABI, {
176
+ from: tokenIn,
177
+ to: tokenOut,
178
+ stable: params.stable,
179
+ factory: params.factoryAddress,
180
+ })
181
+ }
182
+ if (routerType === 'leaf') {
183
+ return encodeRouterSwap(tokenIn, tokenOut, params, LEAF_ROUTER_ABI, {
184
+ from: tokenIn,
185
+ to: tokenOut,
186
+ stable: params.stable,
187
+ })
188
+ }
189
+ throw new Error(`Unknown router type: ${routerType as string}`)
190
+ }
191
+
192
+ /**
193
+ * Encode a V2_SWAP_EXACT_IN command for the Universal Router.
194
+ * Route: encodePacked(tokenIn, stable, tokenOut) — 41 bytes per hop.
195
+ * payerIsUser = false: tokens are pre-transferred to the Router by the smart wallet.
196
+ */
197
+ function encodeUniversalV2Swap(
198
+ tokenIn: Address,
199
+ tokenOut: Address,
200
+ params: EncodeSwapParams,
201
+ ): Hex {
202
+ const commands = `0x${V2_SWAP_EXACT_IN.toString(16).padStart(2, '0')}` as Hex
203
+ const routes = encodePacked(
204
+ ['address', 'bool', 'address'],
205
+ [tokenIn, params.stable, tokenOut],
206
+ )
207
+ const input = encodeAbiParameters(
208
+ [
209
+ { type: 'address' },
210
+ { type: 'uint256' },
211
+ { type: 'uint256' },
212
+ { type: 'bytes' },
213
+ { type: 'bool' },
214
+ { type: 'bool' },
215
+ ],
216
+ [
217
+ UNIVERSAL_ROUTER_MSG_SENDER, // recipient = msg.sender (Universal Router sentinel)
218
+ params.amountInRaw,
219
+ params.amountOutMin,
220
+ routes,
221
+ false, // payerIsUser
222
+ false, // isUni — false for Velodrome/Aerodrome
223
+ ],
224
+ )
225
+ return encodeFunctionData({
226
+ abi: UNIVERSAL_ROUTER_ABI,
227
+ functionName: 'execute',
228
+ args: [commands, [input], BigInt(params.deadline)],
229
+ })
230
+ }
231
+
232
+ /**
233
+ * Encode swap calldata for v2 or leaf routers.
234
+ * Selects the correct swap function based on whether native ETH is involved.
235
+ */
236
+ function encodeRouterSwap(
237
+ tokenIn: Address,
238
+ tokenOut: Address,
239
+ params: EncodeSwapParams,
240
+ abi: typeof V2_ROUTER_ABI | typeof LEAF_ROUTER_ABI,
241
+ route: { from: Address; to: Address; stable: boolean; factory?: Address },
242
+ ): Hex {
243
+ const { assetIn, assetOut, amountInRaw, amountOutMin, recipient, deadline } =
244
+ params
245
+
246
+ if (isNativeAsset(assetIn)) {
247
+ return encodeFunctionData({
248
+ abi,
249
+ functionName: 'swapExactETHForTokens',
250
+ args: [amountOutMin, [route], recipient, BigInt(deadline)],
251
+ })
252
+ }
253
+
254
+ if (isNativeAsset(assetOut)) {
255
+ return encodeFunctionData({
256
+ abi,
257
+ functionName: 'swapExactTokensForETH',
258
+ args: [amountInRaw, amountOutMin, [route], recipient, BigInt(deadline)],
259
+ })
260
+ }
261
+
262
+ return encodeFunctionData({
263
+ abi,
264
+ functionName: 'swapExactTokensForTokens',
265
+ args: [amountInRaw, amountOutMin, [route], recipient, BigInt(deadline)],
266
+ })
267
+ }