@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
@@ -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,169 @@
1
1
  import type { SupportedChainId } from '@/constants/supportedChains.js'
2
2
  import type { SwapProvider } from '@/swap/core/SwapProvider.js'
3
+ import type { SwapProviderName, SwapSettings } from '@/types/actions.js'
4
+ import type { Asset } from '@/types/asset.js'
3
5
  import type {
4
6
  GetSwapMarketParams,
5
7
  GetSwapMarketsParams,
6
8
  SwapMarket,
7
- SwapPrice,
8
- SwapPriceParams,
9
9
  SwapProviderConfig,
10
10
  SwapProviders,
11
+ SwapQuote,
12
+ SwapQuoteParams,
11
13
  } from '@/types/swap/index.js'
12
14
 
13
15
  /**
14
16
  * Base swap namespace with shared read-only operations
15
17
  */
16
18
  export abstract class BaseSwapNamespace {
17
- constructor(protected readonly providers: SwapProviders) {}
19
+ constructor(
20
+ protected readonly providers: SwapProviders,
21
+ protected readonly settings?: SwapSettings,
22
+ ) {}
18
23
 
19
24
  /**
20
- * Get price quote for a swap
25
+ * Get a swap quote with pre-built execution data.
26
+ * When `routing: 'price'` is set in settings and no explicit provider is requested,
27
+ * fetches quotes from all eligible providers in parallel and returns the best price.
28
+ * @param params - Quote parameters (assets, amounts, chain, optional provider)
29
+ * @returns The best available SwapQuote
21
30
  */
22
- async price(params: SwapPriceParams): Promise<SwapPrice> {
23
- const provider = this.getProvider()
24
- return provider.getPrice(params)
31
+ async getQuote(params: SwapQuoteParams): Promise<SwapQuote> {
32
+ // Explicit provider skip routing
33
+ if (params.provider) {
34
+ const provider = this.resolveProvider(
35
+ params.provider,
36
+ params.assetIn,
37
+ params.assetOut,
38
+ params.chainId,
39
+ )
40
+ return provider.getQuote(params)
41
+ }
42
+
43
+ // Price routing — quote all eligible providers, return best
44
+ if (this.settings?.routing === 'price') {
45
+ return this.getBestQuote(params)
46
+ }
47
+
48
+ // No routing — resolve single provider via fallback logic
49
+ const provider = this.resolveProvider(
50
+ undefined,
51
+ params.assetIn,
52
+ params.assetOut,
53
+ params.chainId,
54
+ )
55
+ return provider.getQuote(params)
56
+ }
57
+
58
+ /**
59
+ * Fetch quotes from all eligible providers in parallel and return the best.
60
+ * @param params - Quote parameters
61
+ * @returns The quote with the highest amountOut
62
+ * @throws If no provider returns a valid quote
63
+ */
64
+ private async getBestQuote(params: SwapQuoteParams): Promise<SwapQuote> {
65
+ const quotes = await this.fetchAllQuotes(params)
66
+
67
+ let best: SwapQuote | null = null
68
+ for (const quote of quotes) {
69
+ if (!best || quote.amountOutRaw > best.amountOutRaw) {
70
+ best = quote
71
+ }
72
+ }
73
+
74
+ if (!best) {
75
+ throw new Error(
76
+ `All providers failed to quote ${params.assetIn.metadata.symbol}/${params.assetOut.metadata.symbol}`,
77
+ )
78
+ }
79
+
80
+ return best
81
+ }
82
+
83
+ /**
84
+ * Fetch quotes from all eligible providers in parallel.
85
+ * Providers that don't support the pair or fail to quote are silently skipped.
86
+ * @param params - Quote parameters
87
+ * @returns Array of successful quotes (may be empty if all providers fail)
88
+ */
89
+ private async fetchAllQuotes(params: SwapQuoteParams): Promise<SwapQuote[]> {
90
+ const eligible = this.getAllProviders().filter((p) =>
91
+ p.isMarketSupported(params.assetIn, params.assetOut, params.chainId),
92
+ )
93
+
94
+ if (eligible.length === 0) {
95
+ throw new Error(
96
+ `No provider supports ${params.assetIn.metadata.symbol}/${params.assetOut.metadata.symbol} on chain ${params.chainId}`,
97
+ )
98
+ }
99
+
100
+ const results = await Promise.allSettled(
101
+ eligible.map((p) => p.getQuote(params)),
102
+ )
103
+
104
+ return results
105
+ .filter(
106
+ (r): r is PromiseFulfilledResult<SwapQuote> => r.status === 'fulfilled',
107
+ )
108
+ .map((r) => r.value)
109
+ }
110
+
111
+ /**
112
+ * Fetch quotes from all eligible providers in parallel.
113
+ * Unlike getQuote(), returns all successful quotes instead of just the best.
114
+ * If an explicit provider is specified, returns a single-element array from that provider.
115
+ * @param params - Quote parameters (assets, amounts, chain, optional provider)
116
+ * @returns Array of SwapQuotes sorted by amountOut descending (best first)
117
+ */
118
+ async getQuotes(params: SwapQuoteParams): Promise<SwapQuote[]> {
119
+ if (params.provider) {
120
+ const provider = this.resolveProvider(
121
+ params.provider,
122
+ params.assetIn,
123
+ params.assetOut,
124
+ params.chainId,
125
+ )
126
+ return [await provider.getQuote(params)]
127
+ }
128
+
129
+ const quotes = await this.fetchAllQuotes(params)
130
+ return quotes.sort((a, b) =>
131
+ a.amountOutRaw > b.amountOutRaw
132
+ ? -1
133
+ : a.amountOutRaw < b.amountOutRaw
134
+ ? 1
135
+ : 0,
136
+ )
25
137
  }
26
138
 
27
139
  /**
28
- * Get a specific swap market
29
- * @param params - Market identifier
140
+ * Get a specific swap market by ID.
141
+ * @param params - Market identifier (poolId + chainId)
142
+ * @param provider - Optional provider name to query directly instead of searching all
30
143
  * @returns Market information
31
144
  */
32
- async getMarket(params: GetSwapMarketParams): Promise<SwapMarket> {
33
- const provider = this.getProvider()
34
- return provider.getMarket(params)
145
+ async getMarket(
146
+ params: GetSwapMarketParams,
147
+ provider?: SwapProviderName,
148
+ ): Promise<SwapMarket> {
149
+ if (provider) {
150
+ const named = this.providers[provider]
151
+ if (!named) {
152
+ throw new Error(`Swap provider "${provider}" not configured`)
153
+ }
154
+ return named.getMarket(params)
155
+ }
156
+
157
+ for (const p of this.getAllProviders()) {
158
+ try {
159
+ return await p.getMarket(params)
160
+ } catch {
161
+ continue
162
+ }
163
+ }
164
+ throw new Error(
165
+ `Market with poolId ${params.poolId} not found on chain ${params.chainId}`,
166
+ )
35
167
  }
36
168
 
37
169
  /**
@@ -59,19 +191,68 @@ export abstract class BaseSwapNamespace {
59
191
  return Array.from(chainIds)
60
192
  }
61
193
 
62
- // SwapProviders keys are optional (uniswap?, aerodrome?, etc.) so filter out unconfigured ones
194
+ // SwapProviders keys are optional (uniswap?, velodrome?, etc.) so filter out unconfigured ones
63
195
  protected getAllProviders(): Array<SwapProvider<SwapProviderConfig>> {
64
196
  return Object.values(this.providers).filter(
65
197
  (p): p is SwapProvider<SwapProviderConfig> => p !== undefined,
66
198
  )
67
199
  }
68
200
 
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) {
201
+ /**
202
+ * Resolve which provider handles a request.
203
+ *
204
+ * Precedence:
205
+ * 1. Explicit `provider` param on the call
206
+ * 2. routing.defaultProvider (when no strategy set)
207
+ * 3. routing.strategy match (market-aware, defaultProvider as tiebreaker)
208
+ * 4. First provider whose allowlist matches
209
+ * 5. First configured provider
210
+ */
211
+ protected resolveProvider(
212
+ provider: SwapProviderName | undefined,
213
+ assetIn: Asset,
214
+ assetOut: Asset,
215
+ chainId: SupportedChainId,
216
+ ): SwapProvider<SwapProviderConfig> {
217
+ const allProviders = this.getAllProviders()
218
+ if (allProviders.length === 0) {
73
219
  throw new Error('No swap provider configured')
74
220
  }
75
- return provider
221
+
222
+ // 1. Explicit provider param
223
+ if (provider) {
224
+ const named = this.providers[provider]
225
+ if (!named) {
226
+ throw new Error(`Swap provider "${provider}" not configured`)
227
+ }
228
+ return named
229
+ }
230
+
231
+ // Single provider — no routing needed
232
+ if (allProviders.length === 1) {
233
+ return allProviders[0]
234
+ }
235
+
236
+ // 2. defaultProvider with no routing strategy — always use it
237
+ if (this.settings?.defaultProvider && !this.settings.routing) {
238
+ const provider = this.providers[this.settings.defaultProvider]
239
+ if (provider) return provider
240
+ }
241
+
242
+ // 3. Match by market allowlist
243
+ for (const p of allProviders) {
244
+ if (p.isMarketSupported(assetIn, assetOut, chainId)) {
245
+ return p
246
+ }
247
+ }
248
+
249
+ // 4. Match by chain support
250
+ for (const p of allProviders) {
251
+ if (p.isChainSupported(chainId)) {
252
+ return p
253
+ }
254
+ }
255
+
256
+ return allProviders[0]
76
257
  }
77
258
  }
@@ -1,7 +1,11 @@
1
1
  import type { SupportedChainId } from '@/constants/supportedChains.js'
2
+ import { QUOTE_DISCRIMINATOR } from '@/swap/core/SwapProvider.js'
2
3
  import { BaseSwapNamespace } from '@/swap/namespaces/BaseSwapNamespace.js'
4
+ import type { SwapSettings } from '@/types/actions.js'
3
5
  import type {
4
6
  SwapProviders,
7
+ SwapQuote,
8
+ SwapQuoteParams,
5
9
  SwapReceipt,
6
10
  SwapTransaction,
7
11
  WalletSwapParams,
@@ -9,40 +13,75 @@ import type {
9
13
  import type { Wallet } from '@/wallet/core/wallets/abstract/Wallet.js'
10
14
 
11
15
  /**
12
- * Wallet swap namespace (full operations with signing)
13
- * @description Provides execute() for swapping tokens
16
+ * Wallet swap namespace with full operations including signing.
17
+ * Provides getQuote() for pricing and execute() for swapping tokens.
14
18
  */
15
19
  export class WalletSwapNamespace extends BaseSwapNamespace {
16
20
  constructor(
17
21
  providers: SwapProviders,
18
22
  private readonly wallet: Wallet,
23
+ settings?: SwapSettings,
19
24
  ) {
20
- super(providers)
25
+ super(providers, settings)
21
26
  }
22
27
 
23
28
  /**
24
- * Execute a token swap
25
- * @param params - Swap parameters including chainId
26
- * @returns Swap receipt with transaction details
29
+ * Get a swap quote with the wallet address as recipient.
30
+ * Ensures calldata is encoded for the real wallet, not a placeholder.
27
31
  */
28
- async execute(params: WalletSwapParams): Promise<SwapReceipt> {
29
- const provider = this.getProvider()
32
+ override async getQuote(params: SwapQuoteParams): Promise<SwapQuote> {
33
+ return super.getQuote({
34
+ ...params,
35
+ recipient: params.recipient ?? this.wallet.address,
36
+ })
37
+ }
30
38
 
31
- // Build swap transaction
32
- const swapTx = await provider.execute({
39
+ /**
40
+ * Get quotes from all providers with the wallet address as recipient.
41
+ */
42
+ override async getQuotes(params: SwapQuoteParams): Promise<SwapQuote[]> {
43
+ return super.getQuotes({
33
44
  ...params,
34
- walletAddress: this.wallet.address,
45
+ recipient: params.recipient ?? this.wallet.address,
35
46
  })
47
+ }
36
48
 
37
- // Execute transaction(s)
49
+ /**
50
+ * Execute a token swap.
51
+ * Accepts either raw params (re-quotes internally) or a pre-built SwapQuote (skips re-quoting).
52
+ * @param params - Swap parameters or a pre-built SwapQuote from getQuote()
53
+ * @returns Swap receipt with transaction details
54
+ */
55
+ async execute(params: WalletSwapParams | SwapQuote): Promise<SwapReceipt> {
56
+ // Inject walletAddress — raw params need it for validation,
57
+ // quotes need it for on-chain allowance checks during approval building
58
+ const executeParams =
59
+ QUOTE_DISCRIMINATOR in params
60
+ ? { ...params, recipient: this.wallet.address }
61
+ : { ...params, walletAddress: this.wallet.address }
62
+
63
+ const provider = this.resolveProvider(
64
+ params.provider,
65
+ params.assetIn,
66
+ params.assetOut,
67
+ params.chainId,
68
+ )
69
+
70
+ const swapTx = await provider.execute(executeParams)
38
71
  const receipt = await this.executeTransaction(swapTx, params.chainId)
72
+ return this.buildReceipt(swapTx, receipt)
73
+ }
39
74
 
75
+ private buildReceipt(
76
+ swapTx: SwapTransaction,
77
+ receipt: SwapReceipt['receipt'],
78
+ ): SwapReceipt {
40
79
  return {
41
80
  receipt,
42
81
  amountIn: swapTx.amountIn,
43
82
  amountOut: swapTx.amountOut,
44
- amountInWei: swapTx.amountInWei,
45
- amountOutWei: swapTx.amountOutWei,
83
+ amountInRaw: swapTx.amountInRaw,
84
+ amountOutRaw: swapTx.amountOutRaw,
46
85
  assetIn: swapTx.assetIn,
47
86
  assetOut: swapTx.assetOut,
48
87
  price: swapTx.price,