@eth-optimism/actions-sdk 0.3.0 → 0.5.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 (479) 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 +17 -13
  8. package/dist/actions.d.ts.map +1 -1
  9. package/dist/actions.js +46 -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/ens/EnsNamespace.d.ts +57 -0
  24. package/dist/ens/EnsNamespace.d.ts.map +1 -0
  25. package/dist/ens/EnsNamespace.js +158 -0
  26. package/dist/ens/EnsNamespace.js.map +1 -0
  27. package/dist/ens/EnsNamespace.spec.d.ts +2 -0
  28. package/dist/ens/EnsNamespace.spec.d.ts.map +1 -0
  29. package/dist/ens/EnsNamespace.spec.js +144 -0
  30. package/dist/ens/EnsNamespace.spec.js.map +1 -0
  31. package/dist/ens/errors.d.ts +24 -0
  32. package/dist/ens/errors.d.ts.map +1 -0
  33. package/dist/ens/errors.js +35 -0
  34. package/dist/ens/errors.js.map +1 -0
  35. package/dist/ens/index.d.ts +4 -0
  36. package/dist/ens/index.d.ts.map +1 -0
  37. package/dist/ens/index.js +4 -0
  38. package/dist/ens/index.js.map +1 -0
  39. package/dist/ens/types.d.ts +63 -0
  40. package/dist/ens/types.d.ts.map +1 -0
  41. package/dist/ens/types.js +14 -0
  42. package/dist/ens/types.js.map +1 -0
  43. package/dist/index.d.ts +6 -5
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +5 -4
  46. package/dist/index.js.map +1 -1
  47. package/dist/lend/__mocks__/MockLendProvider.d.ts +1 -1
  48. package/dist/lend/__mocks__/MockLendProvider.d.ts.map +1 -1
  49. package/dist/lend/__mocks__/MockLendProvider.js +7 -2
  50. package/dist/lend/__mocks__/MockLendProvider.js.map +1 -1
  51. package/dist/lend/core/LendProvider.d.ts +12 -8
  52. package/dist/lend/core/LendProvider.d.ts.map +1 -1
  53. package/dist/lend/core/LendProvider.js +15 -21
  54. package/dist/lend/core/LendProvider.js.map +1 -1
  55. package/dist/lend/namespaces/BaseLendNamespace.d.ts +2 -6
  56. package/dist/lend/namespaces/BaseLendNamespace.d.ts.map +1 -1
  57. package/dist/lend/namespaces/BaseLendNamespace.js.map +1 -1
  58. package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js +7 -4
  59. package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js.map +1 -1
  60. package/dist/lend/providers/aave/AaveLendProvider.d.ts +1 -6
  61. package/dist/lend/providers/aave/AaveLendProvider.d.ts.map +1 -1
  62. package/dist/lend/providers/aave/AaveLendProvider.js +3 -6
  63. package/dist/lend/providers/aave/AaveLendProvider.js.map +1 -1
  64. package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js +14 -6
  65. package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js.map +1 -1
  66. package/dist/lend/providers/aave/addresses.d.ts +13 -39
  67. package/dist/lend/providers/aave/addresses.d.ts.map +1 -1
  68. package/dist/lend/providers/aave/addresses.js +65 -60
  69. package/dist/lend/providers/aave/addresses.js.map +1 -1
  70. package/dist/lend/providers/aave/sdk.d.ts +2 -2
  71. package/dist/lend/providers/aave/sdk.d.ts.map +1 -1
  72. package/dist/lend/providers/aave/sdk.js +6 -28
  73. package/dist/lend/providers/aave/sdk.js.map +1 -1
  74. package/dist/lend/providers/morpho/MorphoLendProvider.d.ts +1 -6
  75. package/dist/lend/providers/morpho/MorphoLendProvider.d.ts.map +1 -1
  76. package/dist/lend/providers/morpho/MorphoLendProvider.js +4 -13
  77. package/dist/lend/providers/morpho/MorphoLendProvider.js.map +1 -1
  78. package/dist/lend/providers/morpho/__tests__/api.test.js +52 -43
  79. package/dist/lend/providers/morpho/__tests__/api.test.js.map +1 -1
  80. package/dist/lend/providers/morpho/__tests__/sdk.test.js +41 -42
  81. package/dist/lend/providers/morpho/__tests__/sdk.test.js.map +1 -1
  82. package/dist/lend/providers/morpho/api.d.ts +3 -7
  83. package/dist/lend/providers/morpho/api.d.ts.map +1 -1
  84. package/dist/lend/providers/morpho/api.js +2 -2
  85. package/dist/lend/providers/morpho/api.js.map +1 -1
  86. package/dist/lend/providers/morpho/contracts.d.ts +11 -10
  87. package/dist/lend/providers/morpho/contracts.d.ts.map +1 -1
  88. package/dist/lend/providers/morpho/contracts.js +43 -10
  89. package/dist/lend/providers/morpho/contracts.js.map +1 -1
  90. package/dist/lend/providers/morpho/sdk.d.ts +7 -2
  91. package/dist/lend/providers/morpho/sdk.d.ts.map +1 -1
  92. package/dist/lend/providers/morpho/sdk.js +67 -63
  93. package/dist/lend/providers/morpho/sdk.js.map +1 -1
  94. package/dist/nodeActionsFactory.d.ts +1 -1
  95. package/dist/reactActionsFactory.d.ts +1 -1
  96. package/dist/services/ChainManager.d.ts +15 -8
  97. package/dist/services/ChainManager.d.ts.map +1 -1
  98. package/dist/services/ChainManager.js +9 -0
  99. package/dist/services/ChainManager.js.map +1 -1
  100. package/dist/services/__mocks__/MockChainManager.d.ts +5 -4
  101. package/dist/services/__mocks__/MockChainManager.d.ts.map +1 -1
  102. package/dist/services/__mocks__/MockChainManager.js +5 -0
  103. package/dist/services/__mocks__/MockChainManager.js.map +1 -1
  104. package/dist/services/tokenBalance.d.ts +1 -1
  105. package/dist/services/tokenBalance.d.ts.map +1 -1
  106. package/dist/services/tokenBalance.js +31 -30
  107. package/dist/services/tokenBalance.js.map +1 -1
  108. package/dist/services/tokenBalance.spec.js +20 -24
  109. package/dist/services/tokenBalance.spec.js.map +1 -1
  110. package/dist/swap/__mocks__/MockSwapProvider.d.ts +20 -8
  111. package/dist/swap/__mocks__/MockSwapProvider.d.ts.map +1 -1
  112. package/dist/swap/__mocks__/MockSwapProvider.js +52 -29
  113. package/dist/swap/__mocks__/MockSwapProvider.js.map +1 -1
  114. package/dist/swap/core/SwapProvider.d.ts +105 -16
  115. package/dist/swap/core/SwapProvider.d.ts.map +1 -1
  116. package/dist/swap/core/SwapProvider.js +215 -37
  117. package/dist/swap/core/SwapProvider.js.map +1 -1
  118. package/dist/swap/core/__tests__/SwapProvider.test.js +115 -9
  119. package/dist/swap/core/__tests__/SwapProvider.test.js.map +1 -1
  120. package/dist/swap/core/markets.d.ts +47 -0
  121. package/dist/swap/core/markets.d.ts.map +1 -0
  122. package/dist/swap/core/markets.js +65 -0
  123. package/dist/swap/core/markets.js.map +1 -0
  124. package/dist/swap/index.d.ts +2 -0
  125. package/dist/swap/index.d.ts.map +1 -1
  126. package/dist/swap/index.js +1 -0
  127. package/dist/swap/index.js.map +1 -1
  128. package/dist/swap/namespaces/ActionsSwapNamespace.d.ts +2 -2
  129. package/dist/swap/namespaces/ActionsSwapNamespace.js +2 -2
  130. package/dist/swap/namespaces/BaseSwapNamespace.d.ts +50 -8
  131. package/dist/swap/namespaces/BaseSwapNamespace.d.ts.map +1 -1
  132. package/dist/swap/namespaces/BaseSwapNamespace.js +144 -16
  133. package/dist/swap/namespaces/BaseSwapNamespace.js.map +1 -1
  134. package/dist/swap/namespaces/WalletSwapNamespace.d.ts +20 -7
  135. package/dist/swap/namespaces/WalletSwapNamespace.d.ts.map +1 -1
  136. package/dist/swap/namespaces/WalletSwapNamespace.js +44 -15
  137. package/dist/swap/namespaces/WalletSwapNamespace.js.map +1 -1
  138. package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js +150 -11
  139. package/dist/swap/namespaces/__tests__/BaseSwapNamespace.spec.js.map +1 -1
  140. package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js +85 -8
  141. package/dist/swap/namespaces/__tests__/WalletSwapNamespace.spec.js.map +1 -1
  142. package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts +10 -42
  143. package/dist/swap/providers/uniswap/UniswapSwapProvider.d.ts.map +1 -1
  144. package/dist/swap/providers/uniswap/UniswapSwapProvider.js +81 -139
  145. package/dist/swap/providers/uniswap/UniswapSwapProvider.js.map +1 -1
  146. package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js +10 -9
  147. package/dist/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.js.map +1 -1
  148. package/dist/swap/providers/uniswap/__tests__/sdk.test.js +17 -17
  149. package/dist/swap/providers/uniswap/__tests__/sdk.test.js.map +1 -1
  150. package/dist/swap/providers/uniswap/addresses.d.ts +5 -0
  151. package/dist/swap/providers/uniswap/addresses.d.ts.map +1 -1
  152. package/dist/swap/providers/uniswap/addresses.js +1 -1
  153. package/dist/swap/providers/uniswap/addresses.js.map +1 -1
  154. package/dist/swap/providers/uniswap/encoding.d.ts +4 -4
  155. package/dist/swap/providers/uniswap/encoding.js +17 -17
  156. package/dist/swap/providers/uniswap/markets.d.ts +19 -0
  157. package/dist/swap/providers/uniswap/markets.d.ts.map +1 -0
  158. package/dist/swap/providers/uniswap/markets.js +48 -0
  159. package/dist/swap/providers/uniswap/markets.js.map +1 -0
  160. package/dist/swap/providers/uniswap/types.d.ts +4 -3
  161. package/dist/swap/providers/uniswap/types.d.ts.map +1 -1
  162. package/dist/swap/providers/velodrome/VelodromeSwapProvider.d.ts +50 -0
  163. package/dist/swap/providers/velodrome/VelodromeSwapProvider.d.ts.map +1 -0
  164. package/dist/swap/providers/velodrome/VelodromeSwapProvider.js +140 -0
  165. package/dist/swap/providers/velodrome/VelodromeSwapProvider.js.map +1 -0
  166. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.d.ts +2 -0
  167. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.d.ts.map +1 -0
  168. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.js +255 -0
  169. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.js.map +1 -0
  170. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.d.ts +2 -0
  171. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.d.ts.map +1 -0
  172. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.js +166 -0
  173. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.js.map +1 -0
  174. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.d.ts +2 -0
  175. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.d.ts.map +1 -0
  176. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.js +420 -0
  177. package/dist/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.js.map +1 -0
  178. package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.d.ts +2 -0
  179. package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.d.ts.map +1 -0
  180. package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.js +51 -0
  181. package/dist/swap/providers/velodrome/__tests__/encoding.cl.test.js.map +1 -0
  182. package/dist/swap/providers/velodrome/__tests__/encoding.helpers.d.ts +14 -0
  183. package/dist/swap/providers/velodrome/__tests__/encoding.helpers.d.ts.map +1 -0
  184. package/dist/swap/providers/velodrome/__tests__/encoding.helpers.js +13 -0
  185. package/dist/swap/providers/velodrome/__tests__/encoding.helpers.js.map +1 -0
  186. package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.d.ts +2 -0
  187. package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.d.ts.map +1 -0
  188. package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.js +173 -0
  189. package/dist/swap/providers/velodrome/__tests__/encoding.v2.test.js.map +1 -0
  190. package/dist/swap/providers/velodrome/abis.d.ts +396 -0
  191. package/dist/swap/providers/velodrome/abis.d.ts.map +1 -0
  192. package/dist/swap/providers/velodrome/abis.js +257 -0
  193. package/dist/swap/providers/velodrome/abis.js.map +1 -0
  194. package/dist/swap/providers/velodrome/addresses.d.ts +39 -0
  195. package/dist/swap/providers/velodrome/addresses.d.ts.map +1 -0
  196. package/dist/swap/providers/velodrome/addresses.js +57 -0
  197. package/dist/swap/providers/velodrome/addresses.js.map +1 -0
  198. package/dist/swap/providers/velodrome/config.d.ts +22 -0
  199. package/dist/swap/providers/velodrome/config.d.ts.map +1 -0
  200. package/dist/swap/providers/velodrome/config.js +29 -0
  201. package/dist/swap/providers/velodrome/config.js.map +1 -0
  202. package/dist/swap/providers/velodrome/encoding/helpers.d.ts +37 -0
  203. package/dist/swap/providers/velodrome/encoding/helpers.d.ts.map +1 -0
  204. package/dist/swap/providers/velodrome/encoding/helpers.js +60 -0
  205. package/dist/swap/providers/velodrome/encoding/helpers.js.map +1 -0
  206. package/dist/swap/providers/velodrome/encoding/index.d.ts +8 -0
  207. package/dist/swap/providers/velodrome/encoding/index.d.ts.map +1 -0
  208. package/dist/swap/providers/velodrome/encoding/index.js +5 -0
  209. package/dist/swap/providers/velodrome/encoding/index.js.map +1 -0
  210. package/dist/swap/providers/velodrome/encoding/poolRouter.d.ts +39 -0
  211. package/dist/swap/providers/velodrome/encoding/poolRouter.d.ts.map +1 -0
  212. package/dist/swap/providers/velodrome/encoding/poolRouter.js +83 -0
  213. package/dist/swap/providers/velodrome/encoding/poolRouter.js.map +1 -0
  214. package/dist/swap/providers/velodrome/encoding/routers/approval.d.ts +15 -0
  215. package/dist/swap/providers/velodrome/encoding/routers/approval.d.ts.map +1 -0
  216. package/dist/swap/providers/velodrome/encoding/routers/approval.js +33 -0
  217. package/dist/swap/providers/velodrome/encoding/routers/approval.js.map +1 -0
  218. package/dist/swap/providers/velodrome/encoding/routers/cl.d.ts +40 -0
  219. package/dist/swap/providers/velodrome/encoding/routers/cl.d.ts.map +1 -0
  220. package/dist/swap/providers/velodrome/encoding/routers/cl.js +80 -0
  221. package/dist/swap/providers/velodrome/encoding/routers/cl.js.map +1 -0
  222. package/dist/swap/providers/velodrome/encoding/routers/v2.d.ts +42 -0
  223. package/dist/swap/providers/velodrome/encoding/routers/v2.d.ts.map +1 -0
  224. package/dist/swap/providers/velodrome/encoding/routers/v2.js +166 -0
  225. package/dist/swap/providers/velodrome/encoding/routers/v2.js.map +1 -0
  226. package/dist/swap/providers/velodrome/markets.d.ts +21 -0
  227. package/dist/swap/providers/velodrome/markets.d.ts.map +1 -0
  228. package/dist/swap/providers/velodrome/markets.js +69 -0
  229. package/dist/swap/providers/velodrome/markets.js.map +1 -0
  230. package/dist/swap/providers/velodrome/types.d.ts +31 -0
  231. package/dist/swap/providers/velodrome/types.d.ts.map +1 -0
  232. package/dist/swap/providers/velodrome/types.js +2 -0
  233. package/dist/swap/providers/velodrome/types.js.map +1 -0
  234. package/dist/types/actions.d.ts +44 -9
  235. package/dist/types/actions.d.ts.map +1 -1
  236. package/dist/types/asset.d.ts +7 -9
  237. package/dist/types/asset.d.ts.map +1 -1
  238. package/dist/types/chain.d.ts +2 -2
  239. package/dist/types/chain.d.ts.map +1 -1
  240. package/dist/types/lend/base.d.ts +6 -6
  241. package/dist/types/lend/base.d.ts.map +1 -1
  242. package/dist/types/lend/base.js.map +1 -1
  243. package/dist/types/lend/contracts.d.ts +2 -1
  244. package/dist/types/lend/contracts.d.ts.map +1 -1
  245. package/dist/types/providers.d.ts +21 -0
  246. package/dist/types/providers.d.ts.map +1 -0
  247. package/dist/types/providers.js +2 -0
  248. package/dist/types/providers.js.map +1 -0
  249. package/dist/types/swap/base.d.ts +136 -35
  250. package/dist/types/swap/base.d.ts.map +1 -1
  251. package/dist/types/swap/base.js.map +1 -1
  252. package/dist/utils/approve.d.ts +82 -0
  253. package/dist/utils/approve.d.ts.map +1 -0
  254. package/dist/utils/{permit2.js → approve.js} +48 -14
  255. package/dist/utils/approve.js.map +1 -0
  256. package/dist/utils/approve.test.d.ts +2 -0
  257. package/dist/utils/approve.test.d.ts.map +1 -0
  258. package/dist/utils/{permit2.test.js → approve.test.js} +95 -2
  259. package/dist/utils/approve.test.js.map +1 -0
  260. package/dist/utils/assets.d.ts +6 -0
  261. package/dist/utils/assets.d.ts.map +1 -1
  262. package/dist/utils/assets.js +10 -0
  263. package/dist/utils/assets.js.map +1 -1
  264. package/dist/utils/ens.d.ts +25 -0
  265. package/dist/utils/ens.d.ts.map +1 -0
  266. package/dist/utils/ens.js +53 -0
  267. package/dist/utils/ens.js.map +1 -0
  268. package/dist/utils/ens.test.d.ts +2 -0
  269. package/dist/utils/ens.test.d.ts.map +1 -0
  270. package/dist/utils/ens.test.js +75 -0
  271. package/dist/utils/ens.test.js.map +1 -0
  272. package/dist/utils/validateAddresses.d.ts +32 -0
  273. package/dist/utils/validateAddresses.d.ts.map +1 -0
  274. package/dist/utils/validateAddresses.js +103 -0
  275. package/dist/utils/validateAddresses.js.map +1 -0
  276. package/dist/utils/validateAddresses.test.d.ts +2 -0
  277. package/dist/utils/validateAddresses.test.d.ts.map +1 -0
  278. package/dist/utils/validateAddresses.test.js +314 -0
  279. package/dist/utils/validateAddresses.test.js.map +1 -0
  280. package/dist/utils/validation.d.ts +5 -0
  281. package/dist/utils/validation.d.ts.map +1 -1
  282. package/dist/utils/validation.js +10 -0
  283. package/dist/utils/validation.js.map +1 -1
  284. package/dist/wallet/core/namespace/WalletNamespace.d.ts +21 -9
  285. package/dist/wallet/core/namespace/WalletNamespace.d.ts.map +1 -1
  286. package/dist/wallet/core/namespace/WalletNamespace.js +44 -15
  287. package/dist/wallet/core/namespace/WalletNamespace.js.map +1 -1
  288. package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js +4 -4
  289. package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js.map +1 -1
  290. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts +4 -16
  291. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts.map +1 -1
  292. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js.map +1 -1
  293. package/dist/wallet/core/providers/hosted/types/index.d.ts +6 -11
  294. package/dist/wallet/core/providers/hosted/types/index.d.ts.map +1 -1
  295. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts +2 -9
  296. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts.map +1 -1
  297. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js.map +1 -1
  298. package/dist/wallet/core/wallets/abstract/Wallet.d.ts +6 -17
  299. package/dist/wallet/core/wallets/abstract/Wallet.d.ts.map +1 -1
  300. package/dist/wallet/core/wallets/abstract/Wallet.js +7 -6
  301. package/dist/wallet/core/wallets/abstract/Wallet.js.map +1 -1
  302. package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.d.ts +10 -1
  303. package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.d.ts.map +1 -1
  304. package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.js +2 -2
  305. package/dist/wallet/core/wallets/abstract/__mocks__/TestWallet.js.map +1 -1
  306. package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js +12 -4
  307. package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js.map +1 -1
  308. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts +3 -10
  309. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts.map +1 -1
  310. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js.map +1 -1
  311. package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js.map +1 -1
  312. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +3 -10
  313. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
  314. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
  315. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.d.ts +2 -4
  316. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.d.ts.map +1 -1
  317. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js +6 -8
  318. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js.map +1 -1
  319. package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js +4 -4
  320. package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js.map +1 -1
  321. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +2 -9
  322. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
  323. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
  324. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts +3 -10
  325. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
  326. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js.map +1 -1
  327. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts +3 -10
  328. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
  329. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
  330. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts +3 -9
  331. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts.map +1 -1
  332. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js +3 -2
  333. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js.map +1 -1
  334. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +3 -9
  335. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
  336. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js +3 -2
  337. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
  338. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +3 -9
  339. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
  340. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +3 -2
  341. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
  342. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.d.ts +2 -4
  343. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.d.ts.map +1 -1
  344. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js +11 -13
  345. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js.map +1 -1
  346. package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js +6 -6
  347. package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js.map +1 -1
  348. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts +5 -10
  349. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts.map +1 -1
  350. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js +3 -3
  351. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js.map +1 -1
  352. package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts +2 -6
  353. package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts.map +1 -1
  354. package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.js.map +1 -1
  355. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts +5 -10
  356. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
  357. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js +3 -3
  358. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js.map +1 -1
  359. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts +5 -10
  360. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
  361. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
  362. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
  363. package/package.json +3 -2
  364. package/src/__mocks__/MockAssets.ts +54 -6
  365. package/src/__tests__/actions.test.ts +1 -1
  366. package/src/actions.ts +73 -61
  367. package/src/constants/assets.ts +781 -10
  368. package/src/constants/providers.ts +5 -0
  369. package/src/constants/supportedChains.ts +22 -2
  370. package/src/ens/EnsNamespace.spec.ts +171 -0
  371. package/src/ens/EnsNamespace.ts +210 -0
  372. package/src/ens/errors.ts +45 -0
  373. package/src/ens/index.ts +12 -0
  374. package/src/ens/types.ts +76 -0
  375. package/src/index.ts +59 -8
  376. package/src/lend/__mocks__/MockLendProvider.ts +8 -3
  377. package/src/lend/core/LendProvider.ts +27 -28
  378. package/src/lend/namespaces/BaseLendNamespace.ts +2 -6
  379. package/src/lend/namespaces/__tests__/BaseLendNamespace.spec.ts +12 -5
  380. package/src/lend/providers/aave/AaveLendProvider.ts +3 -7
  381. package/src/lend/providers/aave/__tests__/AaveLendProvider.test.ts +16 -7
  382. package/src/lend/providers/aave/addresses.ts +82 -64
  383. package/src/lend/providers/aave/sdk.ts +11 -36
  384. package/src/lend/providers/morpho/MorphoLendProvider.ts +4 -16
  385. package/src/lend/providers/morpho/__tests__/api.test.ts +65 -44
  386. package/src/lend/providers/morpho/__tests__/sdk.test.ts +43 -43
  387. package/src/lend/providers/morpho/api.ts +7 -8
  388. package/src/lend/providers/morpho/contracts.ts +62 -13
  389. package/src/lend/providers/morpho/sdk.ts +85 -63
  390. package/src/services/ChainManager.ts +22 -21
  391. package/src/services/__mocks__/MockChainManager.ts +12 -7
  392. package/src/services/tokenBalance.spec.ts +20 -24
  393. package/src/services/tokenBalance.ts +39 -33
  394. package/src/swap/__mocks__/MockSwapProvider.ts +77 -42
  395. package/src/swap/core/SwapProvider.ts +309 -50
  396. package/src/swap/core/__tests__/SwapProvider.test.ts +151 -9
  397. package/src/swap/core/markets.ts +104 -0
  398. package/src/swap/index.ts +5 -0
  399. package/src/swap/namespaces/ActionsSwapNamespace.ts +2 -2
  400. package/src/swap/namespaces/BaseSwapNamespace.ts +215 -18
  401. package/src/swap/namespaces/WalletSwapNamespace.ts +61 -14
  402. package/src/swap/namespaces/__tests__/BaseSwapNamespace.spec.ts +245 -14
  403. package/src/swap/namespaces/__tests__/WalletSwapNamespace.spec.ts +103 -8
  404. package/src/swap/providers/uniswap/UniswapSwapProvider.ts +110 -195
  405. package/src/swap/providers/uniswap/__tests__/UniswapSwapProvider.test.ts +12 -12
  406. package/src/swap/providers/uniswap/__tests__/sdk.test.ts +19 -20
  407. package/src/swap/providers/uniswap/addresses.ts +3 -1
  408. package/src/swap/providers/uniswap/encoding.ts +22 -22
  409. package/src/swap/providers/uniswap/markets.ts +84 -0
  410. package/src/swap/providers/uniswap/types.ts +4 -3
  411. package/src/swap/providers/velodrome/VelodromeSwapProvider.ts +226 -0
  412. package/src/swap/providers/velodrome/__tests__/VelodromeSwapProvider.network.test.ts +341 -0
  413. package/src/swap/providers/velodrome/__tests__/VelodromeSwapProvider.routing.test.ts +202 -0
  414. package/src/swap/providers/velodrome/__tests__/VelodromeSwapProvider.test.ts +507 -0
  415. package/src/swap/providers/velodrome/__tests__/encoding.cl.test.ts +69 -0
  416. package/src/swap/providers/velodrome/__tests__/encoding.helpers.ts +20 -0
  417. package/src/swap/providers/velodrome/__tests__/encoding.v2.test.ts +235 -0
  418. package/src/swap/providers/velodrome/abis.ts +264 -0
  419. package/src/swap/providers/velodrome/addresses.ts +107 -0
  420. package/src/swap/providers/velodrome/config.ts +46 -0
  421. package/src/swap/providers/velodrome/encoding/helpers.ts +82 -0
  422. package/src/swap/providers/velodrome/encoding/index.ts +7 -0
  423. package/src/swap/providers/velodrome/encoding/poolRouter.ts +124 -0
  424. package/src/swap/providers/velodrome/encoding/routers/approval.ts +45 -0
  425. package/src/swap/providers/velodrome/encoding/routers/cl.ts +156 -0
  426. package/src/swap/providers/velodrome/encoding/routers/v2.ts +267 -0
  427. package/src/swap/providers/velodrome/markets.ts +100 -0
  428. package/src/swap/providers/velodrome/types.ts +30 -0
  429. package/src/types/actions.ts +49 -9
  430. package/src/types/asset.ts +12 -9
  431. package/src/types/chain.ts +2 -2
  432. package/src/types/lend/base.ts +6 -6
  433. package/src/types/lend/contracts.ts +5 -1
  434. package/src/types/providers.ts +22 -0
  435. package/src/types/swap/base.ts +150 -36
  436. package/src/utils/{permit2.test.ts → approve.test.ts} +117 -1
  437. package/src/utils/{permit2.ts → approve.ts} +67 -14
  438. package/src/utils/assets.ts +14 -0
  439. package/src/utils/ens.test.ts +104 -0
  440. package/src/utils/ens.ts +85 -0
  441. package/src/utils/validateAddresses.test.ts +439 -0
  442. package/src/utils/validateAddresses.ts +153 -0
  443. package/src/utils/validation.ts +11 -0
  444. package/src/wallet/core/namespace/WalletNamespace.ts +70 -16
  445. package/src/wallet/core/namespace/__tests__/WalletNamespace.spec.ts +8 -4
  446. package/src/wallet/core/providers/hosted/abstract/HostedWalletProvider.ts +5 -17
  447. package/src/wallet/core/providers/hosted/types/index.ts +9 -11
  448. package/src/wallet/core/providers/smart/default/DefaultSmartWalletProvider.ts +5 -17
  449. package/src/wallet/core/wallets/abstract/Wallet.ts +18 -22
  450. package/src/wallet/core/wallets/abstract/__mocks__/TestWallet.ts +13 -1
  451. package/src/wallet/core/wallets/abstract/__tests__/Wallet.spec.ts +21 -5
  452. package/src/wallet/core/wallets/smart/default/DefaultSmartWallet.ts +5 -17
  453. package/src/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.ts +0 -1
  454. package/src/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.ts +3 -10
  455. package/src/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.ts +8 -8
  456. package/src/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.ts +4 -4
  457. package/src/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +3 -10
  458. package/src/wallet/node/wallets/hosted/privy/PrivyWallet.ts +5 -17
  459. package/src/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.ts +5 -17
  460. package/src/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.ts +7 -11
  461. package/src/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.ts +7 -11
  462. package/src/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +7 -11
  463. package/src/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.ts +23 -10
  464. package/src/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.ts +6 -6
  465. package/src/wallet/react/wallets/hosted/dynamic/DynamicWallet.ts +10 -18
  466. package/src/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.ts +2 -6
  467. package/src/wallet/react/wallets/hosted/privy/PrivyWallet.ts +10 -18
  468. package/src/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.ts +10 -18
  469. package/dist/supported/tokens.d.ts +0 -25
  470. package/dist/supported/tokens.d.ts.map +0 -1
  471. package/dist/supported/tokens.js +0 -44
  472. package/dist/supported/tokens.js.map +0 -1
  473. package/dist/utils/permit2.d.ts +0 -46
  474. package/dist/utils/permit2.d.ts.map +0 -1
  475. package/dist/utils/permit2.js.map +0 -1
  476. package/dist/utils/permit2.test.d.ts +0 -2
  477. package/dist/utils/permit2.test.d.ts.map +0 -1
  478. package/dist/utils/permit2.test.js.map +0 -1
  479. package/src/supported/tokens.ts +0 -66
@@ -43,6 +43,62 @@ describe('SwapProvider', () => {
43
43
  expect(provider.defaultSlippage).toBe(0.01)
44
44
  })
45
45
 
46
+ it('should use settings slippage when provider does not set one', () => {
47
+ const provider = new MockSwapProvider({}, undefined, undefined, {
48
+ defaultSlippage: 0.02,
49
+ })
50
+ expect(provider.defaultSlippage).toBe(0.02)
51
+ })
52
+
53
+ it('should prefer provider slippage over settings', () => {
54
+ const provider = new MockSwapProvider(
55
+ { defaultSlippage: 0.03 },
56
+ undefined,
57
+ undefined,
58
+ { defaultSlippage: 0.02 },
59
+ )
60
+ expect(provider.defaultSlippage).toBe(0.03)
61
+ })
62
+
63
+ it('should resolve maxSlippage: provider → settings → default', () => {
64
+ expect(new MockSwapProvider().maxSlippage).toBe(0.5)
65
+ expect(
66
+ new MockSwapProvider({}, undefined, undefined, { maxSlippage: 0.3 })
67
+ .maxSlippage,
68
+ ).toBe(0.3)
69
+ expect(
70
+ new MockSwapProvider({ maxSlippage: 0.1 }, undefined, undefined, {
71
+ maxSlippage: 0.3,
72
+ }).maxSlippage,
73
+ ).toBe(0.1)
74
+ })
75
+
76
+ it('should resolve quoteExpirationSeconds: provider → settings → default', () => {
77
+ expect(new MockSwapProvider().quoteExpirationSeconds).toBe(60)
78
+ expect(
79
+ new MockSwapProvider({}, undefined, undefined, {
80
+ quoteExpirationSeconds: 120,
81
+ }).quoteExpirationSeconds,
82
+ ).toBe(120)
83
+ expect(
84
+ new MockSwapProvider(
85
+ { quoteExpirationSeconds: 30 },
86
+ undefined,
87
+ undefined,
88
+ { quoteExpirationSeconds: 120 },
89
+ ).quoteExpirationSeconds,
90
+ ).toBe(30)
91
+ })
92
+
93
+ it('should resolve permit2ExpirationSeconds: provider → settings → default', () => {
94
+ expect(new MockSwapProvider().permit2ExpirationSeconds).toBe(2_592_000)
95
+ expect(
96
+ new MockSwapProvider({}, undefined, undefined, {
97
+ permit2ExpirationSeconds: 86400,
98
+ }).permit2ExpirationSeconds,
99
+ ).toBe(86400)
100
+ })
101
+
46
102
  it('should store market allowlist when provided', () => {
47
103
  const config: SwapMarketConfig = {
48
104
  assets: [MockUSDC, MockWETH],
@@ -148,7 +204,7 @@ describe('SwapProvider', () => {
148
204
 
149
205
  expect(provider.mockExecute).toHaveBeenCalledWith(
150
206
  expect.objectContaining({
151
- amountInWei: 100000000n, // 100 * 10^6
207
+ amountInRaw: 100000000n, // 100 * 10^6
152
208
  }),
153
209
  )
154
210
  })
@@ -169,11 +225,11 @@ describe('SwapProvider', () => {
169
225
  })
170
226
  })
171
227
 
172
- describe('getPrice()', () => {
228
+ describe('getQuote()', () => {
173
229
  it('should throw if chain not supported', async () => {
174
230
  const provider = new MockSwapProvider()
175
231
  await expect(
176
- provider.getPrice({
232
+ provider.getQuote({
177
233
  assetIn: MockUSDC,
178
234
  assetOut: MockWETH,
179
235
  chainId: 999 as SupportedChainId,
@@ -181,19 +237,19 @@ describe('SwapProvider', () => {
181
237
  ).rejects.toThrow('Chain 999 is not supported')
182
238
  })
183
239
 
184
- it('should return price quote', async () => {
240
+ it('should return quote', async () => {
185
241
  const provider = new MockSwapProvider()
186
- const price = await provider.getPrice({
242
+ const quote = await provider.getQuote({
187
243
  assetIn: MockUSDC,
188
244
  assetOut: MockWETH,
189
245
  amountIn: 100,
190
246
  chainId: 84532 as SupportedChainId,
191
247
  })
192
248
 
193
- expect(price.price).toBeDefined()
194
- expect(price.amountIn).toBeDefined()
195
- expect(price.amountOut).toBeDefined()
196
- expect(price.route).toBeDefined()
249
+ expect(quote.price).toBeDefined()
250
+ expect(quote.amountIn).toBeDefined()
251
+ expect(quote.amountOut).toBeDefined()
252
+ expect(quote.route).toBeDefined()
197
253
  })
198
254
  })
199
255
 
@@ -430,6 +486,92 @@ describe('SwapProvider', () => {
430
486
  ).not.toThrow()
431
487
  })
432
488
 
489
+ it('should filter blocked markets from getMarkets()', async () => {
490
+ const allowConfig: SwapMarketConfig = {
491
+ assets: [MockUSDC, MockWETH, MockOP],
492
+ chainId: 84532 as SupportedChainId,
493
+ }
494
+ const blockConfig: SwapMarketConfig = {
495
+ assets: [MockUSDC, MockOP],
496
+ chainId: 84532 as SupportedChainId,
497
+ }
498
+ const provider = new MockSwapProvider({
499
+ marketAllowlist: [allowConfig],
500
+ marketBlocklist: [blockConfig],
501
+ })
502
+
503
+ // Mock _getMarkets to return markets with real assets
504
+ provider.mockGetMarkets.mockResolvedValue([
505
+ {
506
+ marketId: { poolId: '0xpool1', chainId: 84532 as SupportedChainId },
507
+ assets: [MockUSDC, MockWETH],
508
+ fee: 0,
509
+ provider: 'uniswap',
510
+ },
511
+ {
512
+ marketId: { poolId: '0xpool2', chainId: 84532 as SupportedChainId },
513
+ assets: [MockUSDC, MockOP],
514
+ fee: 0,
515
+ provider: 'uniswap',
516
+ },
517
+ ])
518
+
519
+ const markets = await provider.getMarkets()
520
+ // USDC/OP is blocklisted, only USDC/WETH should remain
521
+ expect(markets).toHaveLength(1)
522
+ expect(markets[0].assets[0]).toBe(MockUSDC)
523
+ expect(markets[0].assets[1]).toBe(MockWETH)
524
+ })
525
+
526
+ it('should reject blocked market from getMarket()', async () => {
527
+ const blockConfig: SwapMarketConfig = {
528
+ assets: [MockUSDC, MockOP],
529
+ chainId: 84532 as SupportedChainId,
530
+ }
531
+ const provider = new MockSwapProvider({
532
+ marketBlocklist: [blockConfig],
533
+ })
534
+
535
+ // Mock _getMarket to return a blocked market
536
+ provider.mockGetMarket.mockResolvedValue({
537
+ marketId: { poolId: '0xpool1', chainId: 84532 as SupportedChainId },
538
+ assets: [MockUSDC, MockOP],
539
+ fee: 0,
540
+ provider: 'uniswap',
541
+ })
542
+
543
+ await expect(
544
+ provider.getMarket({
545
+ poolId: '0xpool1',
546
+ chainId: 84532 as SupportedChainId,
547
+ }),
548
+ ).rejects.toThrow('is blocked')
549
+ })
550
+
551
+ it('should allow non-blocked market from getMarket()', async () => {
552
+ const blockConfig: SwapMarketConfig = {
553
+ assets: [MockUSDC, MockOP],
554
+ chainId: 84532 as SupportedChainId,
555
+ }
556
+ const provider = new MockSwapProvider({
557
+ marketBlocklist: [blockConfig],
558
+ })
559
+
560
+ provider.mockGetMarket.mockResolvedValue({
561
+ marketId: { poolId: '0xpool1', chainId: 84532 as SupportedChainId },
562
+ assets: [MockUSDC, MockWETH],
563
+ fee: 0,
564
+ provider: 'uniswap',
565
+ })
566
+
567
+ const market = await provider.getMarket({
568
+ poolId: '0xpool1',
569
+ chainId: 84532 as SupportedChainId,
570
+ })
571
+ expect(market.assets[0]).toBe(MockUSDC)
572
+ expect(market.assets[1]).toBe(MockWETH)
573
+ })
574
+
433
575
  it('should scope filter to specific chainId when provided', () => {
434
576
  const multiChainUSDC: Asset = {
435
577
  ...MockUSDC,
@@ -0,0 +1,104 @@
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 type {
6
+ GetSwapMarketsParams,
7
+ SwapMarket,
8
+ SwapMarketConfig,
9
+ } from '@/types/swap/index.js'
10
+
11
+ /**
12
+ * Sentinel address meaning "send output to msg.sender" in Universal Router commands.
13
+ * The Universal Router maps address(1) to msg.sender and address(2) to the router itself.
14
+ * Only valid in Universal Router calldata encoding — do not use as a general-purpose address.
15
+ * Both Uniswap and Velodrome/Aerodrome Universal Router forks use this convention.
16
+ * @see https://github.com/Uniswap/universal-router/blob/main/contracts/libraries/Constants.sol
17
+ */
18
+ export const UNIVERSAL_ROUTER_MSG_SENDER =
19
+ '0x0000000000000000000000000000000000000001' as Address
20
+
21
+ /**
22
+ * Generate unique asset pairs, optionally filtered to pairs containing a required asset.
23
+ * @param assets - Full list of assets from a market config
24
+ * @param requiredAsset - If set, only pairs including this asset are returned
25
+ */
26
+ export function assetPairs(
27
+ assets: Asset[],
28
+ requiredAsset?: Asset,
29
+ ): Array<[Asset, Asset]> {
30
+ return assets
31
+ .flatMap((a, i) => assets.slice(i + 1).map((b): [Asset, Asset] => [a, b]))
32
+ .filter(
33
+ ([a, b]) => !requiredAsset || a === requiredAsset || b === requiredAsset,
34
+ )
35
+ }
36
+
37
+ /**
38
+ * Sort two addresses for deterministic pool ID computation.
39
+ * @returns [lower, higher] addresses
40
+ */
41
+ export function sortAddressPair(
42
+ addrA: string,
43
+ addrB: string,
44
+ ): [string, string] {
45
+ return addrA.toLowerCase() < addrB.toLowerCase()
46
+ ? [addrA, addrB]
47
+ : [addrB, addrA]
48
+ }
49
+
50
+ /**
51
+ * Find a specific market by poolId across a set of configs.
52
+ * @param configs - Valid market configs to search
53
+ * @param chainId - Target chain
54
+ * @param poolId - Pool ID to match
55
+ * @param toMarkets - Provider-specific function that expands a config into SwapMarket[]
56
+ * @returns Matching market
57
+ * @throws If no matching market found
58
+ */
59
+ export function findMarket<T extends SwapMarketConfig>(
60
+ configs: T[],
61
+ chainId: SupportedChainId,
62
+ poolId: string,
63
+ toMarkets: (config: T, chainId: SupportedChainId) => SwapMarket[],
64
+ ): SwapMarket {
65
+ for (const config of configs) {
66
+ if (config.chainId !== undefined && config.chainId !== chainId) continue
67
+ const match = toMarkets(config, chainId).find(
68
+ (m) => m.marketId.poolId === poolId,
69
+ )
70
+ if (match) return match
71
+ }
72
+ throw new Error(`Market with poolId ${poolId} not found on chain ${chainId}`)
73
+ }
74
+
75
+ /**
76
+ * Expand market configs into concrete SwapMarket objects with optional filters.
77
+ * @param options.configs - Valid market configs
78
+ * @param options.filters - Optional chainId and asset filters
79
+ * @param options.supportedChainIds - All chain IDs this provider supports
80
+ * @param options.toMarkets - Provider-specific function that expands a config into SwapMarket[]
81
+ */
82
+ export function expandMarkets<T extends SwapMarketConfig>(options: {
83
+ configs: T[]
84
+ filters: GetSwapMarketsParams
85
+ supportedChainIds: SupportedChainId[]
86
+ toMarkets: (
87
+ config: T,
88
+ chainId: SupportedChainId,
89
+ asset?: Asset,
90
+ ) => SwapMarket[]
91
+ }): SwapMarket[] {
92
+ const { configs, filters, supportedChainIds, toMarkets } = options
93
+ return configs.flatMap((config) => {
94
+ const chainIds = filters.chainId
95
+ ? [filters.chainId]
96
+ : config.chainId
97
+ ? [config.chainId]
98
+ : supportedChainIds
99
+
100
+ return chainIds.flatMap((chainId) =>
101
+ toMarkets(config, chainId, filters.asset),
102
+ )
103
+ })
104
+ }
package/src/swap/index.ts CHANGED
@@ -12,3 +12,8 @@ export type {
12
12
  UniswapSwapProviderConfig,
13
13
  } from '@/swap/providers/uniswap/types.js'
14
14
  export { UniswapSwapProvider } from '@/swap/providers/uniswap/UniswapSwapProvider.js'
15
+ export type {
16
+ VelodromeMarketConfig,
17
+ VelodromeSwapProviderConfig,
18
+ } from '@/swap/providers/velodrome/types.js'
19
+ export { VelodromeSwapProvider } from '@/swap/providers/velodrome/VelodromeSwapProvider.js'
@@ -1,7 +1,7 @@
1
1
  import { BaseSwapNamespace } from '@/swap/namespaces/BaseSwapNamespace.js'
2
2
 
3
3
  /**
4
- * Actions swap namespace (read-only, no wallet required)
5
- * @description Provides price(), getMarket(), and getMarkets() for read-only access without a wallet
4
+ * Actions swap namespace (read-only, no wallet required).
5
+ * Provides getQuote(), getMarket(), and getMarkets() for read-only access without a wallet.
6
6
  */
7
7
  export class ActionsSwapNamespace extends BaseSwapNamespace {}
@@ -1,37 +1,185 @@
1
1
  import type { SupportedChainId } from '@/constants/supportedChains.js'
2
+ import type { SwapQuoteParamsResolved } from '@/ens/types.js'
2
3
  import type { SwapProvider } from '@/swap/core/SwapProvider.js'
4
+ import type { SwapProviderName, SwapSettings } from '@/types/actions.js'
5
+ import type { Asset } from '@/types/asset.js'
3
6
  import type {
4
7
  GetSwapMarketParams,
5
8
  GetSwapMarketsParams,
6
9
  SwapMarket,
7
- SwapPrice,
8
- SwapPriceParams,
9
10
  SwapProviderConfig,
10
11
  SwapProviders,
12
+ SwapQuote,
13
+ SwapQuoteParams,
11
14
  } from '@/types/swap/index.js'
15
+ import { passthroughResolver, type RecipientResolver } from '@/utils/ens.js'
12
16
 
13
17
  /**
14
18
  * Base swap namespace with shared read-only operations
15
19
  */
16
20
  export abstract class BaseSwapNamespace {
17
- constructor(protected readonly providers: SwapProviders) {}
21
+ protected readonly resolveRecipient: RecipientResolver
22
+
23
+ constructor(
24
+ protected readonly providers: SwapProviders,
25
+ resolveRecipient?: RecipientResolver,
26
+ protected readonly settings?: SwapSettings,
27
+ ) {
28
+ this.resolveRecipient = resolveRecipient ?? passthroughResolver
29
+ }
18
30
 
19
31
  /**
20
- * Get price quote for a swap
32
+ * Get a swap quote with pre-built execution data.
33
+ * When `routing: 'price'` is set in settings and no explicit provider is requested,
34
+ * fetches quotes from all eligible providers in parallel and returns the best price.
35
+ * @param params - Quote parameters (assets, amounts, chain, optional provider)
36
+ * @returns The best available SwapQuote
21
37
  */
22
- async price(params: SwapPriceParams): Promise<SwapPrice> {
23
- const provider = this.getProvider()
24
- return provider.getPrice(params)
38
+ async getQuote(params: SwapQuoteParams): Promise<SwapQuote> {
39
+ const recipient = await this.resolveRecipient(params.recipient)
40
+ const resolved: SwapQuoteParamsResolved = { ...params, recipient }
41
+
42
+ // Explicit provider — skip routing
43
+ if (resolved.provider) {
44
+ return this.resolveProvider(
45
+ resolved.provider,
46
+ resolved.assetIn,
47
+ resolved.assetOut,
48
+ resolved.chainId,
49
+ ).getQuote(resolved)
50
+ }
51
+
52
+ // Price routing — quote all eligible providers, return best
53
+ if (this.settings?.routing === 'price') {
54
+ return this.getBestQuote(resolved)
55
+ }
56
+
57
+ // No routing — resolve single provider via fallback logic
58
+ return this.resolveProvider(
59
+ undefined,
60
+ resolved.assetIn,
61
+ resolved.assetOut,
62
+ resolved.chainId,
63
+ ).getQuote(resolved)
25
64
  }
26
65
 
27
66
  /**
28
- * Get a specific swap market
29
- * @param params - Market identifier
67
+ * Fetch quotes from all eligible providers in parallel and return the best.
68
+ * @param params - Quote parameters
69
+ * @returns The quote with the highest amountOut
70
+ * @throws If no provider returns a valid quote
71
+ */
72
+ private async getBestQuote(
73
+ params: SwapQuoteParamsResolved,
74
+ ): Promise<SwapQuote> {
75
+ const quotes = await this.fetchAllQuotes(params)
76
+
77
+ let best: SwapQuote | null = null
78
+ for (const quote of quotes) {
79
+ if (!best || quote.amountOutRaw > best.amountOutRaw) {
80
+ best = quote
81
+ }
82
+ }
83
+
84
+ if (!best) {
85
+ throw new Error(
86
+ `All providers failed to quote ${params.assetIn.metadata.symbol}/${params.assetOut.metadata.symbol}`,
87
+ )
88
+ }
89
+
90
+ return best
91
+ }
92
+
93
+ /**
94
+ * Fetch quotes from all eligible providers in parallel.
95
+ * Providers that don't support the pair or fail to quote are silently skipped.
96
+ * @param params - Quote parameters
97
+ * @returns Array of successful quotes (may be empty if all providers fail)
98
+ */
99
+ private async fetchAllQuotes(
100
+ params: SwapQuoteParamsResolved,
101
+ ): Promise<SwapQuote[]> {
102
+ const eligible = this.getAllProviders().filter((p) =>
103
+ p.isMarketSupported(params.assetIn, params.assetOut, params.chainId),
104
+ )
105
+
106
+ if (eligible.length === 0) {
107
+ throw new Error(
108
+ `No provider supports ${params.assetIn.metadata.symbol}/${params.assetOut.metadata.symbol} on chain ${params.chainId}`,
109
+ )
110
+ }
111
+
112
+ const results = await Promise.allSettled(
113
+ eligible.map((p) => p.getQuote(params)),
114
+ )
115
+
116
+ return results
117
+ .filter(
118
+ (r): r is PromiseFulfilledResult<SwapQuote> => r.status === 'fulfilled',
119
+ )
120
+ .map((r) => r.value)
121
+ }
122
+
123
+ /**
124
+ * Fetch quotes from all eligible providers in parallel.
125
+ * Unlike getQuote(), returns all successful quotes instead of just the best.
126
+ * If an explicit provider is specified, returns a single-element array from that provider.
127
+ * @param params - Quote parameters (assets, amounts, chain, optional provider)
128
+ * @returns Array of SwapQuotes sorted by amountOut descending (best first)
129
+ */
130
+ async getQuotes(params: SwapQuoteParams): Promise<SwapQuote[]> {
131
+ const recipient = await this.resolveRecipient(params.recipient)
132
+ const resolved: SwapQuoteParamsResolved = { ...params, recipient }
133
+
134
+ if (resolved.provider) {
135
+ return [
136
+ await this.resolveProvider(
137
+ resolved.provider,
138
+ resolved.assetIn,
139
+ resolved.assetOut,
140
+ resolved.chainId,
141
+ ).getQuote(resolved),
142
+ ]
143
+ }
144
+
145
+ const quotes = await this.fetchAllQuotes(resolved)
146
+ return quotes.sort((a, b) =>
147
+ a.amountOutRaw > b.amountOutRaw
148
+ ? -1
149
+ : a.amountOutRaw < b.amountOutRaw
150
+ ? 1
151
+ : 0,
152
+ )
153
+ }
154
+
155
+ /**
156
+ * Get a specific swap market by ID.
157
+ * @param params - Market identifier (poolId + chainId)
158
+ * @param provider - Optional provider name to query directly instead of searching all
30
159
  * @returns Market information
31
160
  */
32
- async getMarket(params: GetSwapMarketParams): Promise<SwapMarket> {
33
- const provider = this.getProvider()
34
- return provider.getMarket(params)
161
+ async getMarket(
162
+ params: GetSwapMarketParams,
163
+ provider?: SwapProviderName,
164
+ ): Promise<SwapMarket> {
165
+ if (provider) {
166
+ const named = this.providers[provider]
167
+ if (!named) {
168
+ throw new Error(`Swap provider "${provider}" not configured`)
169
+ }
170
+ return named.getMarket(params)
171
+ }
172
+
173
+ for (const p of this.getAllProviders()) {
174
+ try {
175
+ return await p.getMarket(params)
176
+ } catch {
177
+ continue
178
+ }
179
+ }
180
+ throw new Error(
181
+ `Market with poolId ${params.poolId} not found on chain ${params.chainId}`,
182
+ )
35
183
  }
36
184
 
37
185
  /**
@@ -59,19 +207,68 @@ export abstract class BaseSwapNamespace {
59
207
  return Array.from(chainIds)
60
208
  }
61
209
 
62
- // SwapProviders keys are optional (uniswap?, aerodrome?, etc.) so filter out unconfigured ones
210
+ // SwapProviders keys are optional (uniswap?, velodrome?, etc.) so filter out unconfigured ones
63
211
  protected getAllProviders(): Array<SwapProvider<SwapProviderConfig>> {
64
212
  return Object.values(this.providers).filter(
65
213
  (p): p is SwapProvider<SwapProviderConfig> => p !== undefined,
66
214
  )
67
215
  }
68
216
 
69
- // Future: resolve the best provider for given params (e.g. best price across Uniswap, Aerodrome, etc.)
70
- protected getProvider(): SwapProvider<SwapProviderConfig> {
71
- const provider = this.providers.uniswap
72
- if (!provider) {
217
+ /**
218
+ * Resolve which provider handles a request.
219
+ *
220
+ * Precedence:
221
+ * 1. Explicit `provider` param on the call
222
+ * 2. routing.defaultProvider (when no strategy set)
223
+ * 3. routing.strategy match (market-aware, defaultProvider as tiebreaker)
224
+ * 4. First provider whose allowlist matches
225
+ * 5. First configured provider
226
+ */
227
+ protected resolveProvider(
228
+ provider: SwapProviderName | undefined,
229
+ assetIn: Asset,
230
+ assetOut: Asset,
231
+ chainId: SupportedChainId,
232
+ ): SwapProvider<SwapProviderConfig> {
233
+ const allProviders = this.getAllProviders()
234
+ if (allProviders.length === 0) {
73
235
  throw new Error('No swap provider configured')
74
236
  }
75
- return provider
237
+
238
+ // 1. Explicit provider param
239
+ if (provider) {
240
+ const named = this.providers[provider]
241
+ if (!named) {
242
+ throw new Error(`Swap provider "${provider}" not configured`)
243
+ }
244
+ return named
245
+ }
246
+
247
+ // Single provider — no routing needed
248
+ if (allProviders.length === 1) {
249
+ return allProviders[0]
250
+ }
251
+
252
+ // 2. defaultProvider with no routing strategy — always use it
253
+ if (this.settings?.defaultProvider && !this.settings.routing) {
254
+ const provider = this.providers[this.settings.defaultProvider]
255
+ if (provider) return provider
256
+ }
257
+
258
+ // 3. Match by market allowlist
259
+ for (const p of allProviders) {
260
+ if (p.isMarketSupported(assetIn, assetOut, chainId)) {
261
+ return p
262
+ }
263
+ }
264
+
265
+ // 4. Match by chain support
266
+ for (const p of allProviders) {
267
+ if (p.isChainSupported(chainId)) {
268
+ return p
269
+ }
270
+ }
271
+
272
+ return allProviders[0]
76
273
  }
77
274
  }