@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
@@ -3,12 +3,15 @@ import { decodeFunctionData } from 'viem'
3
3
  import { describe, expect, it, vi } from 'vitest'
4
4
 
5
5
  import {
6
+ buildApprovalTxIfNeeded,
7
+ buildErc20ApprovalTx,
6
8
  buildPermit2ApprovalTx,
7
9
  buildTokenApprovalTx,
8
10
  checkPermit2Allowance,
9
11
  checkTokenAllowance,
10
12
  DEFAULT_PERMIT2_EXPIRY_SECONDS,
11
- } from '@/utils/permit2.js'
13
+ getApprovalDeficit,
14
+ } from '@/utils/approve.js'
12
15
 
13
16
  const PERMIT2_ABI = [
14
17
  {
@@ -140,3 +143,116 @@ describe('buildPermit2ApprovalTx', () => {
140
143
  )
141
144
  })
142
145
  })
146
+
147
+ describe('buildErc20ApprovalTx', () => {
148
+ it('builds approval for exact amount', () => {
149
+ const tx = buildErc20ApprovalTx(TOKEN, SPENDER, 500000n)
150
+
151
+ expect(tx.to).toBe(TOKEN)
152
+ expect(tx.value).toBe(0n)
153
+ expect(tx.data).toMatch(/^0x/)
154
+ })
155
+ })
156
+
157
+ describe('getApprovalDeficit', () => {
158
+ it('returns 0n when allowance is sufficient', async () => {
159
+ const publicClient = {
160
+ readContract: vi.fn().mockResolvedValue(1000000n),
161
+ } as unknown as PublicClient
162
+
163
+ const deficit = await getApprovalDeficit({
164
+ publicClient,
165
+ token: TOKEN,
166
+ owner: OWNER,
167
+ spender: SPENDER,
168
+ amount: 500000n,
169
+ })
170
+
171
+ expect(deficit).toBe(0n)
172
+ })
173
+
174
+ it('returns deficit when allowance is insufficient', async () => {
175
+ const publicClient = {
176
+ readContract: vi.fn().mockResolvedValue(300000n),
177
+ } as unknown as PublicClient
178
+
179
+ const deficit = await getApprovalDeficit({
180
+ publicClient,
181
+ token: TOKEN,
182
+ owner: OWNER,
183
+ spender: SPENDER,
184
+ amount: 500000n,
185
+ })
186
+
187
+ expect(deficit).toBe(200000n)
188
+ })
189
+
190
+ it('returns full amount when allowance is zero', async () => {
191
+ const publicClient = {
192
+ readContract: vi.fn().mockResolvedValue(0n),
193
+ } as unknown as PublicClient
194
+
195
+ const deficit = await getApprovalDeficit({
196
+ publicClient,
197
+ token: TOKEN,
198
+ owner: OWNER,
199
+ spender: SPENDER,
200
+ amount: 500000n,
201
+ })
202
+
203
+ expect(deficit).toBe(500000n)
204
+ })
205
+ })
206
+
207
+ describe('buildApprovalTxIfNeeded', () => {
208
+ it('returns undefined when allowance is sufficient', async () => {
209
+ const publicClient = {
210
+ readContract: vi.fn().mockResolvedValue(1000000n),
211
+ } as unknown as PublicClient
212
+
213
+ const tx = await buildApprovalTxIfNeeded({
214
+ publicClient,
215
+ token: TOKEN,
216
+ owner: OWNER,
217
+ spender: SPENDER,
218
+ amount: 500000n,
219
+ })
220
+
221
+ expect(tx).toBeUndefined()
222
+ })
223
+
224
+ it('returns approval tx for the deficit only', async () => {
225
+ const publicClient = {
226
+ readContract: vi.fn().mockResolvedValue(300000n),
227
+ } as unknown as PublicClient
228
+
229
+ const tx = await buildApprovalTxIfNeeded({
230
+ publicClient,
231
+ token: TOKEN,
232
+ owner: OWNER,
233
+ spender: SPENDER,
234
+ amount: 500000n,
235
+ })
236
+
237
+ expect(tx).toBeDefined()
238
+ expect(tx!.to).toBe(TOKEN)
239
+ expect(tx!.value).toBe(0n)
240
+ })
241
+
242
+ it('returns approval for full amount when allowance is zero', async () => {
243
+ const publicClient = {
244
+ readContract: vi.fn().mockResolvedValue(0n),
245
+ } as unknown as PublicClient
246
+
247
+ const tx = await buildApprovalTxIfNeeded({
248
+ publicClient,
249
+ token: TOKEN,
250
+ owner: OWNER,
251
+ spender: SPENDER,
252
+ amount: 500000n,
253
+ })
254
+
255
+ expect(tx).toBeDefined()
256
+ expect(tx!.to).toBe(TOKEN)
257
+ })
258
+ })
@@ -75,25 +75,15 @@ export async function checkPermit2Allowance(params: {
75
75
  }
76
76
 
77
77
  /**
78
- * Build ERC20 token approval transaction to Permit2
78
+ * Build ERC20 token approval transaction to Permit2.
79
+ * Uses maxUint256 — the Uniswap-canonical pattern.
80
+ * Permit2 is immutable with no owner; spending is scoped by its own allowance system.
79
81
  */
80
82
  export function buildTokenApprovalTx(
81
83
  token: Address,
82
84
  permit2Address: Address,
83
85
  ): TransactionData {
84
- const data = encodeFunctionData({
85
- abi: erc20Abi,
86
- functionName: 'approve',
87
- // ERC20 -> Permit2: maxUint256 is the Uniswap-canonical pattern.
88
- // Permit2 is immutable with no owner — spending is scoped by its own allowance system.
89
- args: [permit2Address, maxUint256],
90
- })
91
-
92
- return {
93
- to: token,
94
- data,
95
- value: 0n,
96
- }
86
+ return buildErc20ApprovalTx(token, permit2Address, maxUint256)
97
87
  }
98
88
 
99
89
  /**
@@ -142,3 +132,66 @@ export async function checkTokenAllowance(params: {
142
132
  args: [owner, spender],
143
133
  })
144
134
  }
135
+
136
+ // ─────────────────────────────────────────────────────────────────────────────
137
+ // Generic ERC20 approval utilities
138
+ // ─────────────────────────────────────────────────────────────────────────────
139
+
140
+ /**
141
+ * Build an ERC20 approve transaction.
142
+ * @param token - ERC20 token address
143
+ * @param spender - Address to approve
144
+ * @param amount - Amount to approve
145
+ * @returns Transaction data for the approval
146
+ */
147
+ export function buildErc20ApprovalTx(
148
+ token: Address,
149
+ spender: Address,
150
+ amount: bigint,
151
+ ): TransactionData {
152
+ return {
153
+ to: token,
154
+ data: encodeFunctionData({
155
+ abi: erc20Abi,
156
+ functionName: 'approve',
157
+ args: [spender, amount],
158
+ }),
159
+ value: 0n,
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Compute how much additional ERC20 approval is needed.
165
+ * Returns 0n if current allowance is sufficient.
166
+ * @param params - Token, owner, spender, required amount, and public client
167
+ * @returns The deficit (required - current), or 0n if already sufficient
168
+ */
169
+ export async function getApprovalDeficit(params: {
170
+ publicClient: PublicClient
171
+ token: Address
172
+ owner: Address
173
+ spender: Address
174
+ amount: bigint
175
+ }): Promise<bigint> {
176
+ const current = await checkTokenAllowance(params)
177
+ return current >= params.amount ? 0n : params.amount - current
178
+ }
179
+
180
+ /**
181
+ * Build an ERC20 approval transaction only if needed, approving only the deficit.
182
+ * Checks the current on-chain allowance, returns undefined if already sufficient.
183
+ * @param params - Token, owner, spender, required amount, and public client
184
+ * @returns Approval transaction for the deficit amount, or undefined if allowance is sufficient
185
+ */
186
+ export async function buildApprovalTxIfNeeded(params: {
187
+ publicClient: PublicClient
188
+ token: Address
189
+ owner: Address
190
+ spender: Address
191
+ amount: bigint
192
+ }): Promise<TransactionData | undefined> {
193
+ const deficit = await getApprovalDeficit(params)
194
+ return deficit > 0n
195
+ ? buildErc20ApprovalTx(params.token, params.spender, deficit)
196
+ : undefined
197
+ }
@@ -86,3 +86,17 @@ export function getAssetAddress(
86
86
  }
87
87
  return address
88
88
  }
89
+
90
+ /**
91
+ * Get all non-native contract addresses for an asset across all chains, lowercased.
92
+ * @param asset - Asset to extract addresses from
93
+ * @returns Array of lowercased contract addresses
94
+ */
95
+ export function getAllAssetAddresses(asset: Asset): string[] {
96
+ return Object.values(asset.address)
97
+ .filter(
98
+ (addr): addr is Exclude<typeof addr, undefined | 'native'> =>
99
+ addr !== undefined && addr !== 'native',
100
+ )
101
+ .map((addr) => addr.toLowerCase())
102
+ }
@@ -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
+ })