@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
@@ -0,0 +1,439 @@
1
+ import type { Address } from 'viem'
2
+ import { unichain } from 'viem/chains'
3
+ import { describe, expect, it } from 'vitest'
4
+
5
+ import {
6
+ createMockPrivyClient,
7
+ getMockAuthorizationContext,
8
+ } from '@/__mocks__/MockPrivyClient.js'
9
+ import { Actions } from '@/actions.js'
10
+ import {
11
+ NATIVELY_SUPPORTED_ASSETS,
12
+ OP_DEMO,
13
+ USDC_DEMO,
14
+ } from '@/constants/assets.js'
15
+ import {
16
+ POOL_ADDRESSES_MAINNET,
17
+ POOL_ADDRESSES_TESTNET,
18
+ WETH_GATEWAY_ADDRESSES_MAINNET,
19
+ WETH_GATEWAY_ADDRESSES_TESTNET,
20
+ } from '@/lend/providers/aave/addresses.js'
21
+ import { MORPHO_CONTRACTS } from '@/lend/providers/morpho/contracts.js'
22
+ import { UNISWAP_ADDRESSES } from '@/swap/providers/uniswap/addresses.js'
23
+ import { VELODROME_CHAINS } from '@/swap/providers/velodrome/addresses.js'
24
+ import type { Asset } from '@/types/asset.js'
25
+ import type { LendMarketConfig } from '@/types/lend/index.js'
26
+ import {
27
+ validateAddressMap,
28
+ validateAssetAddresses,
29
+ validateConfigAddresses,
30
+ } from '@/utils/validateAddresses.js'
31
+ import { HostedWalletProviderRegistry } from '@/wallet/core/providers/hosted/registry/HostedWalletProviderRegistry.js'
32
+ import type { HostedWalletProvidersSchema } from '@/wallet/core/providers/hosted/types/index.js'
33
+ import { PrivyHostedWalletProvider } from '@/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js'
34
+ import type {
35
+ NodeOptionsMap,
36
+ NodeToActionsOptionsMap,
37
+ } from '@/wallet/node/providers/hosted/types/index.js'
38
+
39
+ const VALID_ADDRESS = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Address
40
+ const VALID_ADDRESS_2 = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' as Address
41
+ const INVALID_ADDRESS = '0xabc' as Address
42
+ const INVALID_ADDRESS_2 = '0xdeadbeef' as Address
43
+
44
+ describe('validateAddressMap', () => {
45
+ it('throws when any address in the map is malformed, listing the bad address, key name, and chain ID', () => {
46
+ const map = {
47
+ 10: { poolAddress: INVALID_ADDRESS },
48
+ }
49
+ expect(() => validateAddressMap(map)).toThrow(/poolAddress\[10\]/)
50
+ expect(() => validateAddressMap(map)).toThrow(INVALID_ADDRESS)
51
+ })
52
+
53
+ it('collects multiple failures and throws once with all of them listed', () => {
54
+ const map = {
55
+ 10: { poolAddress: INVALID_ADDRESS },
56
+ 8453: { rewardAddress: INVALID_ADDRESS_2 },
57
+ }
58
+ let err: Error | undefined
59
+ try {
60
+ validateAddressMap(map)
61
+ } catch (e) {
62
+ err = e as Error
63
+ }
64
+ expect(err).toBeDefined()
65
+ expect(err!.message).toMatch(/poolAddress\[10\]/)
66
+ expect(err!.message).toMatch(/rewardAddress\[8453\]/)
67
+ })
68
+
69
+ it('passes for valid checksummed addresses', () => {
70
+ const map = {
71
+ 10: { poolAddress: VALID_ADDRESS },
72
+ 8453: { rewardAddress: VALID_ADDRESS_2 },
73
+ }
74
+ expect(() => validateAddressMap(map)).not.toThrow()
75
+ })
76
+
77
+ it('passes for valid lowercase (non-checksummed) addresses', () => {
78
+ const map = {
79
+ 10: { poolAddress: VALID_ADDRESS.toLowerCase() as Address },
80
+ }
81
+ expect(() => validateAddressMap(map)).not.toThrow()
82
+ })
83
+
84
+ it('returns the original map reference on success', () => {
85
+ const map = { 10: { poolAddress: VALID_ADDRESS } }
86
+ expect(validateAddressMap(map)).toBe(map)
87
+ })
88
+
89
+ it('handles simple Record<number, Address> values', () => {
90
+ const map: Record<number, Address> = { 10: INVALID_ADDRESS }
91
+ expect(() => validateAddressMap(map)).toThrow(/\[10\]/)
92
+ })
93
+ })
94
+
95
+ describe('validateAssetAddresses', () => {
96
+ it("skips 'native' entries without throwing", () => {
97
+ const map = { 1: 'native' as const, 10: 'native' as const }
98
+ expect(() => validateAssetAddresses(map)).not.toThrow()
99
+ })
100
+
101
+ it('throws with location info for invalid non-native addresses', () => {
102
+ const map = { 10: INVALID_ADDRESS }
103
+ expect(() => validateAssetAddresses(map)).toThrow(/\[10\]/)
104
+ expect(() => validateAssetAddresses(map)).toThrow(INVALID_ADDRESS)
105
+ })
106
+
107
+ it('collects multiple failures before throwing', () => {
108
+ const map = { 10: INVALID_ADDRESS, 8453: INVALID_ADDRESS_2 }
109
+ let err: Error | undefined
110
+ try {
111
+ validateAssetAddresses(map)
112
+ } catch (e) {
113
+ err = e as Error
114
+ }
115
+ expect(err).toBeDefined()
116
+ expect(err!.message).toMatch(/\[10\]/)
117
+ expect(err!.message).toMatch(/\[8453\]/)
118
+ })
119
+
120
+ it('passes for valid addresses and skips native', () => {
121
+ const map = { 1: 'native' as const, 10: VALID_ADDRESS }
122
+ expect(() => validateAssetAddresses(map)).not.toThrow()
123
+ })
124
+
125
+ it('passes for valid addresses', () => {
126
+ const map = { 10: VALID_ADDRESS }
127
+ expect(() => validateAssetAddresses(map)).not.toThrow()
128
+ })
129
+ })
130
+
131
+ describe('validateConfigAddresses', () => {
132
+ const validMarket: LendMarketConfig = {
133
+ address: VALID_ADDRESS,
134
+ chainId: unichain.id,
135
+ name: 'Valid Market',
136
+ asset: {
137
+ address: { [unichain.id]: VALID_ADDRESS_2 },
138
+ metadata: { decimals: 18, name: 'WETH', symbol: 'WETH' },
139
+ type: 'erc20',
140
+ },
141
+ lendProvider: 'morpho',
142
+ }
143
+
144
+ const invalidMarketAddress: LendMarketConfig = {
145
+ ...validMarket,
146
+ address: INVALID_ADDRESS,
147
+ }
148
+
149
+ const invalidAssetAddress: LendMarketConfig = {
150
+ ...validMarket,
151
+ asset: {
152
+ ...validMarket.asset,
153
+ address: { [unichain.id]: INVALID_ADDRESS },
154
+ },
155
+ }
156
+
157
+ const validAsset: Asset = {
158
+ address: { [unichain.id]: VALID_ADDRESS },
159
+ metadata: { decimals: 6, name: 'USDC', symbol: 'USDC' },
160
+ type: 'erc20',
161
+ }
162
+
163
+ const invalidAsset: Asset = {
164
+ address: { [unichain.id]: INVALID_ADDRESS },
165
+ metadata: { decimals: 6, name: 'USDC', symbol: 'USDC' },
166
+ type: 'erc20',
167
+ }
168
+
169
+ it('throws with a descriptive message when a bad address appears in marketAllowlist', () => {
170
+ expect(() =>
171
+ validateConfigAddresses({
172
+ lend: { morpho: { marketAllowlist: [invalidMarketAddress] } },
173
+ }),
174
+ ).toThrow(/lend\.morpho\.marketAllowlist/)
175
+ })
176
+
177
+ it('throws with a descriptive message when a bad address appears in marketBlocklist', () => {
178
+ expect(() =>
179
+ validateConfigAddresses({
180
+ lend: { morpho: { marketBlocklist: [invalidMarketAddress] } },
181
+ }),
182
+ ).toThrow(/lend\.morpho\.marketBlocklist/)
183
+ })
184
+
185
+ it('throws with a descriptive message when a bad address appears in assets.allow', () => {
186
+ expect(() =>
187
+ validateConfigAddresses({ assets: { allow: [invalidAsset] } }),
188
+ ).toThrow(/assets\.allow/)
189
+ })
190
+
191
+ it('throws with a descriptive message when a bad address appears in assets.block', () => {
192
+ expect(() =>
193
+ validateConfigAddresses({ assets: { block: [invalidAsset] } }),
194
+ ).toThrow(/assets\.block/)
195
+ })
196
+
197
+ it('throws with a descriptive message when a bad address appears in lend.aave.marketAllowlist', () => {
198
+ expect(() =>
199
+ validateConfigAddresses({
200
+ lend: {
201
+ aave: {
202
+ marketAllowlist: [
203
+ { ...invalidMarketAddress, lendProvider: 'aave' },
204
+ ],
205
+ },
206
+ },
207
+ }),
208
+ ).toThrow(/lend\.aave\.marketAllowlist/)
209
+ })
210
+
211
+ it('throws with a descriptive message when a bad address appears in lend.aave.marketBlocklist', () => {
212
+ expect(() =>
213
+ validateConfigAddresses({
214
+ lend: {
215
+ aave: {
216
+ marketBlocklist: [
217
+ { ...invalidMarketAddress, lendProvider: 'aave' },
218
+ ],
219
+ },
220
+ },
221
+ }),
222
+ ).toThrow(/lend\.aave\.marketBlocklist/)
223
+ })
224
+
225
+ it('throws with a descriptive message when a bad address appears in swap.uniswap.marketAllowlist', () => {
226
+ expect(() =>
227
+ validateConfigAddresses({
228
+ swap: {
229
+ uniswap: {
230
+ marketAllowlist: [{ assets: [invalidAsset, validAsset] }],
231
+ },
232
+ },
233
+ }),
234
+ ).toThrow(/swap\.uniswap\.marketAllowlist/)
235
+ })
236
+
237
+ it('throws with a descriptive message when a bad address appears in swap.uniswap.marketBlocklist', () => {
238
+ expect(() =>
239
+ validateConfigAddresses({
240
+ swap: {
241
+ uniswap: {
242
+ marketBlocklist: [{ assets: [invalidAsset, validAsset] }],
243
+ },
244
+ },
245
+ }),
246
+ ).toThrow(/swap\.uniswap\.marketBlocklist/)
247
+ })
248
+
249
+ it('collects failures across multiple config sections and throws once with all of them', () => {
250
+ let err: Error | undefined
251
+ try {
252
+ validateConfigAddresses({
253
+ lend: {
254
+ morpho: {
255
+ marketAllowlist: [invalidMarketAddress],
256
+ marketBlocklist: [invalidAssetAddress],
257
+ },
258
+ },
259
+ assets: { allow: [invalidAsset] },
260
+ })
261
+ } catch (e) {
262
+ err = e as Error
263
+ }
264
+ expect(err).toBeDefined()
265
+ expect(err!.message).toMatch(/lend\.morpho\.marketAllowlist/)
266
+ expect(err!.message).toMatch(/lend\.morpho\.marketBlocklist/)
267
+ expect(err!.message).toMatch(/assets\.allow/)
268
+ })
269
+
270
+ it('returns void (no throw) when all addresses are valid', () => {
271
+ expect(() =>
272
+ validateConfigAddresses({
273
+ lend: { morpho: { marketAllowlist: [validMarket] } },
274
+ assets: { allow: [validAsset] },
275
+ }),
276
+ ).not.toThrow()
277
+ })
278
+ })
279
+
280
+ describe('hardcoded address maps contain valid EVM addresses', () => {
281
+ it('all hardcoded address maps contain valid EVM addresses', () => {
282
+ expect(() => validateAddressMap(POOL_ADDRESSES_MAINNET)).not.toThrow()
283
+ expect(() => validateAddressMap(POOL_ADDRESSES_TESTNET)).not.toThrow()
284
+ expect(() =>
285
+ validateAddressMap(WETH_GATEWAY_ADDRESSES_MAINNET),
286
+ ).not.toThrow()
287
+ expect(() =>
288
+ validateAddressMap(WETH_GATEWAY_ADDRESSES_TESTNET),
289
+ ).not.toThrow()
290
+ expect(() =>
291
+ validateAddressMap(
292
+ MORPHO_CONTRACTS as unknown as Record<number, Record<string, Address>>,
293
+ ),
294
+ ).not.toThrow()
295
+ expect(() =>
296
+ validateAddressMap(
297
+ UNISWAP_ADDRESSES as Record<number, Record<string, Address>>,
298
+ ),
299
+ ).not.toThrow()
300
+ // Velodrome: contracts are cleanly separated from metadata
301
+ const veloContracts = Object.fromEntries(
302
+ Object.entries(VELODROME_CHAINS).map(([id, cfg]) => [id, cfg!.contracts]),
303
+ )
304
+ expect(() =>
305
+ validateAddressMap(
306
+ veloContracts as unknown as Record<number, Record<string, Address>>,
307
+ ),
308
+ ).not.toThrow()
309
+ })
310
+
311
+ it('all hardcoded asset address maps contain valid EVM addresses', () => {
312
+ for (const asset of NATIVELY_SUPPORTED_ASSETS) {
313
+ expect(() => validateAssetAddresses(asset.address)).not.toThrow()
314
+ }
315
+ expect(() => validateAssetAddresses(USDC_DEMO.address)).not.toThrow()
316
+ expect(() => validateAssetAddresses(OP_DEMO.address)).not.toThrow()
317
+ })
318
+ })
319
+
320
+ describe('Actions constructor address validation', () => {
321
+ type TestInstanceMap = { privy: PrivyHostedWalletProvider }
322
+ type TestConfigMap = { privy: NodeOptionsMap['privy'] }
323
+ type TestWalletProvider = HostedWalletProvidersSchema<
324
+ 'privy',
325
+ TestInstanceMap,
326
+ TestConfigMap,
327
+ NodeToActionsOptionsMap
328
+ >
329
+
330
+ class TestHostedWalletProviderRegistry extends HostedWalletProviderRegistry<
331
+ TestInstanceMap,
332
+ TestConfigMap,
333
+ 'privy'
334
+ > {
335
+ constructor() {
336
+ super()
337
+ this.register<'privy'>({
338
+ type: 'privy',
339
+ validateOptions(options): options is NodeOptionsMap['privy'] {
340
+ return Boolean((options as NodeOptionsMap['privy'])?.privyClient)
341
+ },
342
+ create({ chainManager }, options) {
343
+ return new PrivyHostedWalletProvider({
344
+ privyClient: options.privyClient,
345
+ chainManager,
346
+ authorizationContext: options.authorizationContext,
347
+ })
348
+ },
349
+ })
350
+ }
351
+ }
352
+
353
+ const baseWalletConfig = {
354
+ hostedWalletConfig: {
355
+ provider: {
356
+ type: 'privy' as const,
357
+ config: {
358
+ privyClient: createMockPrivyClient('test-id', 'test-secret'),
359
+ authorizationContext: getMockAuthorizationContext(),
360
+ },
361
+ },
362
+ },
363
+ smartWalletConfig: { provider: { type: 'default' as const } },
364
+ }
365
+
366
+ it('throws on construction when ActionsConfig contains an invalid address', () => {
367
+ expect(
368
+ () =>
369
+ new Actions<
370
+ TestWalletProvider['providerTypes'],
371
+ TestWalletProvider,
372
+ 'privy'
373
+ >(
374
+ {
375
+ chains: [{ chainId: unichain.id }],
376
+ lend: {
377
+ morpho: {
378
+ marketAllowlist: [
379
+ {
380
+ address: '0xbad' as Address,
381
+ chainId: unichain.id,
382
+ name: 'Bad Market',
383
+ asset: {
384
+ address: { [unichain.id]: VALID_ADDRESS },
385
+ metadata: { decimals: 18, name: 'WETH', symbol: 'WETH' },
386
+ type: 'erc20',
387
+ },
388
+ lendProvider: 'morpho',
389
+ },
390
+ ],
391
+ },
392
+ },
393
+ wallet: baseWalletConfig,
394
+ },
395
+ {
396
+ hostedWalletProviderRegistry:
397
+ new TestHostedWalletProviderRegistry(),
398
+ },
399
+ ),
400
+ ).toThrow(/Invalid addresses found/)
401
+ })
402
+
403
+ it('constructs successfully when all addresses are valid', () => {
404
+ expect(
405
+ () =>
406
+ new Actions<
407
+ TestWalletProvider['providerTypes'],
408
+ TestWalletProvider,
409
+ 'privy'
410
+ >(
411
+ {
412
+ chains: [{ chainId: unichain.id }],
413
+ lend: {
414
+ morpho: {
415
+ marketAllowlist: [
416
+ {
417
+ address: VALID_ADDRESS,
418
+ chainId: unichain.id,
419
+ name: 'Valid Market',
420
+ asset: {
421
+ address: { [unichain.id]: VALID_ADDRESS_2 },
422
+ metadata: { decimals: 18, name: 'WETH', symbol: 'WETH' },
423
+ type: 'erc20',
424
+ },
425
+ lendProvider: 'morpho',
426
+ },
427
+ ],
428
+ },
429
+ },
430
+ wallet: baseWalletConfig,
431
+ },
432
+ {
433
+ hostedWalletProviderRegistry:
434
+ new TestHostedWalletProviderRegistry(),
435
+ },
436
+ ),
437
+ ).not.toThrow()
438
+ })
439
+ })
@@ -0,0 +1,153 @@
1
+ import type { Address } from 'viem'
2
+ import { getAddress } from 'viem'
3
+
4
+ import type { SupportedChainId } from '@/constants/supportedChains.js'
5
+ import type { AssetsConfig, LendConfig, SwapConfig } from '@/types/actions.js'
6
+ import type { Asset } from '@/types/asset.js'
7
+ import type { LendProviderConfig } from '@/types/lend/index.js'
8
+ import type { SwapProviderConfig } from '@/types/swap/index.js'
9
+
10
+ type NamedAddresses = Record<string, Address>
11
+
12
+ /**
13
+ * Validates all values in an address map.
14
+ * Values may be a single Address or a record of named addresses.
15
+ * Collects all failures before throwing a single Error listing every invalid entry.
16
+ * @returns The original map reference if all addresses are valid.
17
+ * @throws Error listing all invalid addresses with their chain IDs and key names.
18
+ */
19
+ export function validateAddressMap<
20
+ M extends Partial<Record<number, Address | NamedAddresses>>,
21
+ >(map: M): M {
22
+ const errors: string[] = []
23
+
24
+ for (const [chainId, value] of Object.entries(map)) {
25
+ if (value === undefined) continue
26
+ if (typeof value === 'string') {
27
+ try {
28
+ getAddress(value)
29
+ } catch {
30
+ errors.push(` - [${chainId}]: ${value} (not a valid EVM address)`)
31
+ }
32
+ } else {
33
+ for (const [key, addr] of Object.entries(value as NamedAddresses)) {
34
+ try {
35
+ getAddress(addr)
36
+ } catch {
37
+ errors.push(
38
+ ` - ${key}[${chainId}]: ${addr} (not a valid EVM address)`,
39
+ )
40
+ }
41
+ }
42
+ }
43
+ }
44
+
45
+ if (errors.length > 0) {
46
+ throw new Error(`Invalid addresses found:\n${errors.join('\n')}`)
47
+ }
48
+ return map
49
+ }
50
+
51
+ /**
52
+ * Validates a Partial<Record<SupportedChainId, Address | 'native'>> asset address map.
53
+ * Skips entries where the value is 'native'.
54
+ * Collects all failures before throwing a single Error.
55
+ * @throws Error listing all invalid addresses with their chain IDs.
56
+ */
57
+ export function validateAssetAddresses(
58
+ map: Partial<Record<SupportedChainId, Address | 'native'>>,
59
+ ): void {
60
+ const errors: string[] = []
61
+
62
+ for (const [chainId, value] of Object.entries(map)) {
63
+ if (value === undefined || value === 'native') continue
64
+ try {
65
+ getAddress(value)
66
+ } catch {
67
+ errors.push(` - [${chainId}]: ${value} (not a valid EVM address)`)
68
+ }
69
+ }
70
+
71
+ if (errors.length > 0) {
72
+ throw new Error(`Invalid addresses found:\n${errors.join('\n')}`)
73
+ }
74
+ }
75
+
76
+ interface AddressEntry {
77
+ path: string
78
+ value: string
79
+ }
80
+
81
+ function assetAddresses(asset: Asset, path: string): AddressEntry[] {
82
+ return Object.entries(asset.address)
83
+ .filter(([, addr]) => addr !== 'native')
84
+ .map(([chainId, addr]) => ({
85
+ path: `${path}.address[${chainId}]`,
86
+ value: addr as string,
87
+ }))
88
+ }
89
+
90
+ function lendProviderAddresses(
91
+ config: LendProviderConfig,
92
+ providerPath: string,
93
+ ): AddressEntry[] {
94
+ return (['marketAllowlist', 'marketBlocklist'] as const).flatMap((key) =>
95
+ (config[key] ?? []).flatMap((m, i) => [
96
+ { path: `${providerPath}.${key}[${i}].address`, value: m.address },
97
+ ...assetAddresses(m.asset, `${providerPath}.${key}[${i}].asset`),
98
+ ]),
99
+ )
100
+ }
101
+
102
+ function swapProviderAddresses(
103
+ config: SwapProviderConfig,
104
+ providerPath: string,
105
+ ): AddressEntry[] {
106
+ return (['marketAllowlist', 'marketBlocklist'] as const).flatMap((key) =>
107
+ (config[key] ?? []).flatMap((m, i) =>
108
+ m.assets.flatMap((asset, j) =>
109
+ assetAddresses(asset, `${providerPath}.${key}[${i}].assets[${j}]`),
110
+ ),
111
+ ),
112
+ )
113
+ }
114
+
115
+ /**
116
+ * Validates all developer-supplied addresses in an ActionsConfig.
117
+ * Iterates all lend and swap providers generically, so new providers are covered automatically.
118
+ * Collects all failures before throwing a single Error.
119
+ * @throws Error listing all invalid addresses with their locations and chain IDs.
120
+ */
121
+ export function validateConfigAddresses(config: {
122
+ lend?: LendConfig
123
+ swap?: SwapConfig
124
+ assets?: AssetsConfig
125
+ }): void {
126
+ const addresses: AddressEntry[] = [
127
+ ...Object.entries(config.lend ?? {}).flatMap(([name, cfg]) =>
128
+ lendProviderAddresses(cfg as LendProviderConfig, `lend.${name}`),
129
+ ),
130
+ ...Object.entries(config.swap ?? {}).flatMap(([name, cfg]) =>
131
+ swapProviderAddresses(cfg as SwapProviderConfig, `swap.${name}`),
132
+ ),
133
+ ...(config.assets?.allow ?? []).flatMap((a, i) =>
134
+ assetAddresses(a, `assets.allow[${i}]`),
135
+ ),
136
+ ...(config.assets?.block ?? []).flatMap((a, i) =>
137
+ assetAddresses(a, `assets.block[${i}]`),
138
+ ),
139
+ ]
140
+
141
+ const errors = addresses.flatMap(({ path, value }) => {
142
+ try {
143
+ getAddress(value)
144
+ return []
145
+ } catch {
146
+ return [` - ${path}: ${value} (not a valid EVM address)`]
147
+ }
148
+ })
149
+
150
+ if (errors.length > 0) {
151
+ throw new Error(`Invalid addresses found:\n${errors.join('\n')}`)
152
+ }
153
+ }
@@ -1,4 +1,5 @@
1
1
  import type { Address } from 'viem'
2
+ import { isAddress } from 'viem'
2
3
 
3
4
  import type { SupportedChainId } from '@/constants/supportedChains.js'
4
5
  import type { Asset } from '@/types/asset.js'
@@ -74,3 +75,13 @@ export function validateAssetOnChain(
74
75
  )
75
76
  }
76
77
  }
78
+
79
+ /**
80
+ * Validate that a resolved recipient address is not the zero address.
81
+ * ENS names are skipped — only resolved `Address` values are checked.
82
+ */
83
+ export function validateRecipient(recipient: string | undefined): void {
84
+ if (recipient && isAddress(recipient)) {
85
+ validateNotZeroAddress(recipient, 'recipient')
86
+ }
87
+ }