@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
@@ -7,14 +7,15 @@ import {
7
7
  } from '@morpho-org/blue-sdk-viem'
8
8
  import type { Address, PublicClient } from 'viem'
9
9
 
10
+ import { NATIVELY_SUPPORTED_ASSETS } from '@/constants/assets.js'
10
11
  import {
11
12
  fetchRewards,
12
13
  type RewardsBreakdown,
13
14
  } from '@/lend/providers/morpho/api.js'
14
15
  import { getMorphoContracts } from '@/lend/providers/morpho/contracts.js'
15
16
  import type { ChainManager } from '@/services/ChainManager.js'
16
- import { SUPPORTED_TOKENS } from '@/supported/tokens.js'
17
17
  import type { LendProviderConfig } from '@/types/actions.js'
18
+ import type { Asset } from '@/types/asset.js'
18
19
  import type {
19
20
  ApyBreakdown,
20
21
  LendMarket,
@@ -27,29 +28,42 @@ import { SECONDS_PER_YEAR } from '@/utils/constants.js'
27
28
  /**
28
29
  * Fetch and calculate rewards breakdown from Morpho GraphQL API
29
30
  * @param vaultAddress - Vault address
31
+ * @param supportedAssets - Configured assets for reward categorization
32
+ * @param chainId - Chain ID for address lookup
30
33
  * @returns Promise resolving to rewards breakdown
31
34
  */
32
35
  export async function fetchAndCalculateRewards(
33
36
  vaultAddress: Address,
37
+ chainId: number,
38
+ marketAsset?: Asset,
34
39
  ): Promise<RewardsBreakdown> {
35
- const vaultData = await fetchRewards(vaultAddress)
40
+ const vaultData = await fetchRewards(vaultAddress, chainId)
36
41
 
37
42
  if (!vaultData) {
38
- // Initialize empty rewards object with all supported tokens + other
39
- const emptyRewards: Record<string, number> = {
40
- other: 0,
41
- totalRewards: 0,
42
- }
43
+ return buildEmptyRewards(chainId, marketAsset)
44
+ }
43
45
 
44
- // Add all supported tokens (lowercase) to the rewards object
45
- SUPPORTED_TOKENS.forEach((token) => {
46
- emptyRewards[token.metadata.symbol.toLowerCase()] = 0
47
- })
46
+ return calculateRewardsBreakdown(vaultData, chainId, marketAsset)
47
+ }
48
48
 
49
- return emptyRewards as unknown as RewardsBreakdown
49
+ /**
50
+ * Build an empty rewards object with all supported asset addresses initialized to 0
51
+ */
52
+ function buildEmptyRewards(
53
+ chainId: number,
54
+ marketAsset?: Asset,
55
+ ): RewardsBreakdown {
56
+ const assets = marketAsset
57
+ ? [...NATIVELY_SUPPORTED_ASSETS, marketAsset]
58
+ : NATIVELY_SUPPORTED_ASSETS
59
+ const emptyRewards: Record<string, number> = { other: 0, totalRewards: 0 }
60
+ for (const token of assets) {
61
+ const addr = token.address[chainId as keyof typeof token.address]
62
+ if (addr && addr !== 'native') {
63
+ emptyRewards[addr.toLowerCase()] = 0
64
+ }
50
65
  }
51
-
52
- return calculateRewardsBreakdown(vaultData)
66
+ return emptyRewards as RewardsBreakdown
53
67
  }
54
68
 
55
69
  /**
@@ -238,7 +252,7 @@ async function calculateVaultApy(
238
252
  }
239
253
 
240
254
  /**
241
- * Fetch vault data via direct on-chain queries (for testnets)
255
+ * Fetch vault data via direct on-chain queries (fallback when SDK unavailable)
242
256
  */
243
257
  async function fetchVaultDataOnChain(
244
258
  marketId: LendMarketId,
@@ -332,7 +346,7 @@ export async function getVault(params: GetVaultParams): Promise<LendMarket> {
332
346
  params.marketId.chainId,
333
347
  )
334
348
 
335
- // Try SDK first for supported chains (mainnets)
349
+ // Try SDK first for SDK-supported chains
336
350
  if (isSdkSupportedChain(params.marketId.chainId)) {
337
351
  try {
338
352
  const vault = await fetchAccrualVault(
@@ -343,18 +357,11 @@ export async function getVault(params: GetVaultParams): Promise<LendMarket> {
343
357
  // Fetch rewards data from API
344
358
  const rewardsBreakdown = await fetchAndCalculateRewards(
345
359
  params.marketId.address,
360
+ params.marketId.chainId,
361
+ marketConfig.asset,
346
362
  ).catch((error) => {
347
363
  console.error('Failed to fetch rewards data:', error)
348
- return {
349
- eth: 0,
350
- weth: 0,
351
- usdc: 0,
352
- usdc_demo: 0,
353
- op_demo: 0,
354
- morpho: 0,
355
- other: 0,
356
- totalRewards: 0,
357
- }
364
+ return buildEmptyRewards(params.marketId.chainId, marketConfig.asset)
358
365
  })
359
366
 
360
367
  const apyBreakdown = calculateApyBreakdown(vault, rewardsBreakdown)
@@ -381,7 +388,7 @@ export async function getVault(params: GetVaultParams): Promise<LendMarket> {
381
388
  }
382
389
  }
383
390
 
384
- // Fallback to direct on-chain queries for testnets or if SDK fails
391
+ // Fallback to direct on-chain queries if SDK unavailable or fails
385
392
  const contracts = getMorphoContracts(params.marketId.chainId)
386
393
  if (contracts) {
387
394
  return fetchVaultDataOnChain(
@@ -489,38 +496,59 @@ export function calculateApyBreakdown(
489
496
  }
490
497
  }
491
498
 
499
+ /**
500
+ * Categorize a reward asset by its address. If the address matches a supported asset, use that.
501
+ * Otherwise, fall back to 'other'.
502
+ */
503
+ function categorizeRewardAsset(
504
+ rewardAssetAddress: string | undefined,
505
+ knownAddresses: Set<string>,
506
+ ): string {
507
+ if (!rewardAssetAddress) return 'other'
508
+ const normalized = rewardAssetAddress.toLowerCase()
509
+ return knownAddresses.has(normalized) ? normalized : 'other'
510
+ }
511
+
492
512
  /**
493
513
  * Calculate detailed rewards breakdown from vault and market allocations
494
514
  * @param apiVault - Vault data from GraphQL API
515
+ * @param supportedAssets - Configured assets for reward categorization
516
+ * @param chainId - Chain ID for address lookup
495
517
  * @returns Detailed rewards breakdown
496
518
  */
497
- export function calculateRewardsBreakdown(apiVault: any): RewardsBreakdown {
498
- // Initialize rewards object with all supported tokens + other
499
- const rewardsByCategory: Record<string, number> = {
500
- other: 0,
519
+ export function calculateRewardsBreakdown(
520
+ apiVault: any,
521
+ chainId: number,
522
+ marketAsset?: Asset,
523
+ ): RewardsBreakdown {
524
+ const assets = marketAsset
525
+ ? [...NATIVELY_SUPPORTED_ASSETS, marketAsset]
526
+ : NATIVELY_SUPPORTED_ASSETS
527
+ // Build set of known asset addresses on this chain
528
+ const knownAddresses = new Set<string>()
529
+ for (const token of assets) {
530
+ const addr = token.address[chainId as keyof typeof token.address]
531
+ if (addr && addr !== 'native') {
532
+ knownAddresses.add(addr.toLowerCase())
533
+ }
501
534
  }
502
535
 
503
- // Add all supported tokens (lowercase) to the rewards object
504
- SUPPORTED_TOKENS.forEach((token) => {
505
- rewardsByCategory[token.metadata.symbol.toLowerCase()] = 0
506
- })
536
+ // Initialize rewards object with all known addresses + other
537
+ const rewardsByCategory: Record<string, number> = { other: 0 }
538
+ for (const addr of knownAddresses) {
539
+ rewardsByCategory[addr] = 0
540
+ }
507
541
 
508
542
  // Calculate vault-level rewards
509
543
  if (apiVault.state?.rewards && apiVault.state.rewards.length > 0) {
510
- apiVault.state.rewards.forEach((reward: any) => {
544
+ for (const reward of apiVault.state.rewards) {
511
545
  const rewardApr = reward.supplyApr || 0
512
- const assetSymbol = reward.asset.symbol
513
-
514
- // Use the symbol from API response for categorization
515
- const category = assetSymbol ? assetSymbol.toLowerCase() : 'other'
516
-
517
- // Add to appropriate category if supported, otherwise to 'other'
518
- if (category in rewardsByCategory) {
519
- rewardsByCategory[category] += rewardApr
520
- } else {
521
- rewardsByCategory.other += rewardApr
522
- }
523
- })
546
+ const category = categorizeRewardAsset(
547
+ reward.asset?.address,
548
+ knownAddresses,
549
+ )
550
+ rewardsByCategory[category] += rewardApr
551
+ }
524
552
  }
525
553
 
526
554
  // Calculate market-level rewards (weighted by allocation)
@@ -532,7 +560,7 @@ export function calculateRewardsBreakdown(apiVault: any): RewardsBreakdown {
532
560
  0,
533
561
  )
534
562
 
535
- apiVault.state.allocation.forEach((allocation: any) => {
563
+ for (const allocation of apiVault.state.allocation) {
536
564
  if (
537
565
  allocation.market?.state?.rewards &&
538
566
  allocation.market.state.rewards.length > 0
@@ -542,23 +570,17 @@ export function calculateRewardsBreakdown(apiVault: any): RewardsBreakdown {
542
570
  ? (allocation.supplyAssetsUsd || 0) / totalSupplyUsd
543
571
  : 0
544
572
 
545
- allocation.market.state.rewards.forEach((reward: any) => {
573
+ for (const reward of allocation.market.state.rewards) {
546
574
  const rewardApr = reward.supplyApr || 0
547
575
  const weightedRewardApr = rewardApr * weight
548
- const assetSymbol = reward.asset.symbol
549
-
550
- // Use the symbol from API response for categorization
551
- const category = assetSymbol ? assetSymbol.toLowerCase() : 'other'
552
-
553
- // Add to appropriate category if supported, otherwise to 'other'
554
- if (category in rewardsByCategory) {
555
- rewardsByCategory[category] += weightedRewardApr
556
- } else {
557
- rewardsByCategory.other += weightedRewardApr
558
- }
559
- })
576
+ const category = categorizeRewardAsset(
577
+ reward.asset?.address,
578
+ knownAddresses,
579
+ )
580
+ rewardsByCategory[category] += weightedRewardApr
581
+ }
560
582
  }
561
- })
583
+ }
562
584
  }
563
585
 
564
586
  // Calculate total rewards APR
@@ -12,7 +12,7 @@ import {
12
12
  import type { BundlerClient, SmartAccount } from 'viem/account-abstraction'
13
13
  import { createBundlerClient } from 'viem/account-abstraction'
14
14
 
15
- import type { SUPPORTED_CHAIN_IDS } from '@/constants/supportedChains.js'
15
+ import type { SupportedChainId } from '@/constants/supportedChains.js'
16
16
  import type { ChainConfig } from '@/types/chain.js'
17
17
 
18
18
  /**
@@ -22,7 +22,7 @@ import type { ChainConfig } from '@/types/chain.js'
22
22
  */
23
23
  export class ChainManager {
24
24
  /** Map of chain IDs to their corresponding public clients */
25
- private publicClients: Map<(typeof SUPPORTED_CHAIN_IDS)[number], PublicClient>
25
+ private publicClients: Map<SupportedChainId, PublicClient>
26
26
  /** Configuration for each supported chain */
27
27
  private chainConfigs: ChainConfig[]
28
28
 
@@ -41,7 +41,7 @@ export class ChainManager {
41
41
  * @returns PublicClient instance for the specified chain
42
42
  * @throws Error if no client is configured for the chain ID
43
43
  */
44
- getPublicClient(chainId: (typeof SUPPORTED_CHAIN_IDS)[number]): PublicClient {
44
+ getPublicClient(chainId: SupportedChainId): PublicClient {
45
45
  const client = this.publicClients.get(chainId)
46
46
  if (!client) {
47
47
  throw new Error(`No public client configured for chain ID: ${chainId}`)
@@ -49,6 +49,16 @@ export class ChainManager {
49
49
  return client
50
50
  }
51
51
 
52
+ /**
53
+ * Get public client for a specific chain, or undefined if not configured.
54
+ * Use this when the chain is optional (e.g. mainnet for ENS resolution).
55
+ * @param chainId - The chain ID to retrieve the public client for
56
+ * @returns PublicClient instance, or undefined if not configured
57
+ */
58
+ tryGetPublicClient(chainId: SupportedChainId): PublicClient | undefined {
59
+ return this.publicClients.get(chainId)
60
+ }
61
+
52
62
  /**
53
63
  * Get bundler client for a specific chain
54
64
  * @param chainId - The chain ID to retrieve the bundler client for
@@ -57,7 +67,7 @@ export class ChainManager {
57
67
  * @throws Error if no bundler URL is configured for the chain ID
58
68
  */
59
69
  getBundlerClient(
60
- chainId: (typeof SUPPORTED_CHAIN_IDS)[number],
70
+ chainId: SupportedChainId,
61
71
  account: SmartAccount,
62
72
  ): BundlerClient | SmartAccountClient {
63
73
  const chainConfig = this.getChainConfig(chainId)
@@ -94,9 +104,7 @@ export class ChainManager {
94
104
  * @returns RPC URL as a string
95
105
  * @throws Error if no chain config is found for the chain ID
96
106
  */
97
- getRpcUrls(
98
- chainId: (typeof SUPPORTED_CHAIN_IDS)[number],
99
- ): string[] | undefined {
107
+ getRpcUrls(chainId: SupportedChainId): string[] | undefined {
100
108
  const chainConfig = this.getChainConfig(chainId)
101
109
  return chainConfig.rpcUrls
102
110
  }
@@ -107,9 +115,7 @@ export class ChainManager {
107
115
  * @returns Bundler URL as a string or undefined if not configured
108
116
  * @throws Error if no chain config is found for the chain ID
109
117
  */
110
- getBundlerUrl(
111
- chainId: (typeof SUPPORTED_CHAIN_IDS)[number],
112
- ): string | undefined {
118
+ getBundlerUrl(chainId: SupportedChainId): string | undefined {
113
119
  const chainConfig = this.getChainConfig(chainId)
114
120
  if (!chainConfig.bundler) {
115
121
  throw new Error(`No bundler configured for chain ID: ${chainId}`)
@@ -122,7 +128,7 @@ export class ChainManager {
122
128
  * @param chainId - The chain ID to retrieve information for
123
129
  * @returns Chain object containing chain details
124
130
  */
125
- getChain(chainId: (typeof SUPPORTED_CHAIN_IDS)[number]): Chain {
131
+ getChain(chainId: SupportedChainId): Chain {
126
132
  return chainById[chainId]
127
133
  }
128
134
 
@@ -140,7 +146,7 @@ export class ChainManager {
140
146
  * @returns Transport configured with fallback RPC URLs or default http transport
141
147
  * @throws Error if no chain config is found for the chain ID
142
148
  */
143
- getTransportForChain(chainId: (typeof SUPPORTED_CHAIN_IDS)[number]) {
149
+ getTransportForChain(chainId: SupportedChainId) {
144
150
  const rpcUrls = this.getRpcUrls(chainId)
145
151
  return rpcUrls?.length
146
152
  ? fallback(rpcUrls.map((rpcUrl) => http(rpcUrl)))
@@ -155,11 +161,8 @@ export class ChainManager {
155
161
  */
156
162
  private createPublicClients(
157
163
  chains: ChainConfig[],
158
- ): Map<(typeof SUPPORTED_CHAIN_IDS)[number], PublicClient> {
159
- const clients = new Map<
160
- (typeof SUPPORTED_CHAIN_IDS)[number],
161
- PublicClient
162
- >()
164
+ ): Map<SupportedChainId, PublicClient> {
165
+ const clients = new Map<SupportedChainId, PublicClient>()
163
166
 
164
167
  for (const chainConfig of chains) {
165
168
  const chain = chainById[chainConfig.chainId]
@@ -187,9 +190,7 @@ export class ChainManager {
187
190
  * @param chainId The chain ID to retrieve the chain config for
188
191
  * @returns ChainConfig object containing chain details
189
192
  */
190
- private getChainConfig(
191
- chainId: (typeof SUPPORTED_CHAIN_IDS)[number],
192
- ): ChainConfig {
193
+ private getChainConfig(chainId: SupportedChainId): ChainConfig {
193
194
  const chainConfig = this.chainConfigs.find((c) => c.chainId === chainId)
194
195
  if (!chainConfig) {
195
196
  throw new Error(`No chain config found for chain ID: ${chainId}`)
@@ -205,7 +206,7 @@ export class ChainManager {
205
206
  * @returns Pimlico bundler client for the specified chain
206
207
  */
207
208
  private getPimlicoBundlerClient(
208
- chainId: (typeof SUPPORTED_CHAIN_IDS)[number],
209
+ chainId: SupportedChainId,
209
210
  account: SmartAccount,
210
211
  sponsorshipPolicyId?: string,
211
212
  ) {
@@ -4,10 +4,7 @@ import type { BundlerClient, SmartAccount } from 'viem/account-abstraction'
4
4
  import { unichain } from 'viem/chains'
5
5
  import { type MockedFunction, vi } from 'vitest'
6
6
 
7
- import type {
8
- SUPPORTED_CHAIN_IDS,
9
- SupportedChainId,
10
- } from '@/constants/supportedChains.js'
7
+ import type { SupportedChainId } from '@/constants/supportedChains.js'
11
8
 
12
9
  export interface MockChainManagerConfig {
13
10
  supportedChains: SupportedChainId[]
@@ -24,6 +21,9 @@ export class MockChainManager {
24
21
  public getPublicClient: MockedFunction<
25
22
  (chainId: SupportedChainId) => PublicClient
26
23
  >
24
+ public tryGetPublicClient: MockedFunction<
25
+ (chainId: SupportedChainId) => PublicClient | undefined
26
+ >
27
27
  public getBundlerClient: MockedFunction<
28
28
  (chainId: SupportedChainId, account: SmartAccount) => BundlerClient
29
29
  >
@@ -57,6 +57,11 @@ export class MockChainManager {
57
57
  }
58
58
  return client
59
59
  })
60
+ this.tryGetPublicClient = vi
61
+ .fn()
62
+ .mockImplementation((chainId: SupportedChainId) => {
63
+ return this.publicClients.get(chainId)
64
+ })
60
65
  this.getBundlerClient = vi
61
66
  .fn()
62
67
  .mockImplementation((chainId: SupportedChainId) => {
@@ -79,15 +84,15 @@ export class MockChainManager {
79
84
  })
80
85
  }
81
86
 
82
- getChain(chainId: (typeof SUPPORTED_CHAIN_IDS)[number]): Chain {
87
+ getChain(chainId: SupportedChainId): Chain {
83
88
  return chainById[chainId]
84
89
  }
85
90
 
86
- getRpcUrls(chainId: (typeof SUPPORTED_CHAIN_IDS)[number]): string[] {
91
+ getRpcUrls(chainId: SupportedChainId): string[] {
87
92
  return this.getChain(chainId).rpcUrls.default.http as string[]
88
93
  }
89
94
 
90
- getTransportForChain(_chainId: (typeof SUPPORTED_CHAIN_IDS)[number]) {
95
+ getTransportForChain(_chainId: SupportedChainId) {
91
96
  // Mock implementation returns a simple http transport
92
97
  // In tests, the actual transport behavior is typically mocked at a higher level
93
98
  return {} as unknown
@@ -29,17 +29,15 @@ describe('TokenBalance', () => {
29
29
  )
30
30
 
31
31
  expect(balance).toEqual({
32
- symbol: 'USDC',
33
- totalBalance: 1000000n,
34
- totalFormattedBalance: '1',
35
- chainBalances: [
36
- {
37
- chainId: unichain.id,
38
- balance: 1000000n,
39
- formattedBalance: '1',
40
- tokenAddress: MockUSDCAsset.address[unichain.id]!,
32
+ asset: MockUSDCAsset,
33
+ totalBalance: 1,
34
+ totalBalanceRaw: 1000000n,
35
+ chains: {
36
+ [unichain.id]: {
37
+ balance: 1,
38
+ balanceRaw: 1000000n,
41
39
  },
42
- ],
40
+ },
43
41
  })
44
42
  })
45
43
 
@@ -63,10 +61,10 @@ describe('TokenBalance', () => {
63
61
  )
64
62
 
65
63
  expect(balance).toEqual({
66
- symbol: 'UNSUPPORTED',
67
- totalBalance: 0n,
68
- totalFormattedBalance: '0',
69
- chainBalances: [],
64
+ asset: unsupportedAsset,
65
+ totalBalance: 0,
66
+ totalBalanceRaw: 0n,
67
+ chains: {},
70
68
  })
71
69
  })
72
70
  })
@@ -76,17 +74,15 @@ describe('TokenBalance', () => {
76
74
  const balance = await fetchETHBalance(chainManager, walletAddress)
77
75
 
78
76
  expect(balance).toEqual({
79
- symbol: 'ETH',
80
- totalBalance: 1000000n,
81
- totalFormattedBalance: '0.000000000001',
82
- chainBalances: [
83
- {
84
- chainId: unichain.id,
85
- balance: 1000000n,
86
- formattedBalance: '0.000000000001',
87
- tokenAddress: ETH.address[unichain.id]!,
77
+ asset: ETH,
78
+ totalBalance: 0.000000000001,
79
+ totalBalanceRaw: 1000000n,
80
+ chains: {
81
+ [unichain.id]: {
82
+ balance: 0.000000000001,
83
+ balanceRaw: 1000000n,
88
84
  },
89
- ],
85
+ },
90
86
  })
91
87
  })
92
88
  })
@@ -1,6 +1,7 @@
1
1
  import type { Address } from 'viem'
2
2
  import { erc20Abi, formatEther, formatUnits } from 'viem'
3
3
 
4
+ import { ETH } from '@/constants/assets.js'
4
5
  import type { SupportedChainId } from '@/constants/supportedChains.js'
5
6
  import type { ChainManager } from '@/services/ChainManager.js'
6
7
  import type { Asset, TokenBalance } from '@/types/asset.js'
@@ -9,7 +10,7 @@ import type { Asset, TokenBalance } from '@/types/asset.js'
9
10
  * Fetch ETH balance across all supported chains
10
11
  * @param chainManager - The chain manager
11
12
  * @param walletAddress - The wallet address
12
- * @returns Promise resolving to array of ETH balances
13
+ * @returns Promise resolving to ETH balance
13
14
  */
14
15
  export async function fetchETHBalance(
15
16
  chainManager: ChainManager,
@@ -18,26 +19,31 @@ export async function fetchETHBalance(
18
19
  const supportedChains = chainManager.getSupportedChains()
19
20
  const chainBalancePromises = supportedChains.map(async (chainId) => {
20
21
  const publicClient = chainManager.getPublicClient(chainId)
21
- const balance = await publicClient.getBalance({
22
+ const balanceRaw = await publicClient.getBalance({
22
23
  address: walletAddress,
23
24
  })
24
25
  return {
25
26
  chainId,
26
- balance,
27
- tokenAddress: 'native' as const,
28
- formattedBalance: formatEther(balance),
27
+ balanceRaw,
28
+ balance: parseFloat(formatEther(balanceRaw)),
29
29
  }
30
30
  })
31
- const chainBalances = await Promise.all(chainBalancePromises)
32
- const totalBalance = chainBalances.reduce(
33
- (total, { balance }) => total + balance,
31
+ const chainResults = await Promise.all(chainBalancePromises)
32
+ const totalBalanceRaw = chainResults.reduce(
33
+ (total, { balanceRaw }) => total + balanceRaw,
34
34
  0n,
35
35
  )
36
+
37
+ const chains: TokenBalance['chains'] = {}
38
+ for (const { chainId, balance, balanceRaw } of chainResults) {
39
+ chains[chainId] = { balance, balanceRaw }
40
+ }
41
+
36
42
  return {
37
- symbol: 'ETH',
38
- totalBalance,
39
- totalFormattedBalance: formatEther(totalBalance),
40
- chainBalances,
43
+ asset: ETH,
44
+ totalBalance: parseFloat(formatEther(totalBalanceRaw)),
45
+ totalBalanceRaw,
46
+ chains,
41
47
  }
42
48
  }
43
49
 
@@ -55,7 +61,7 @@ export async function fetchERC20Balance(
55
61
  )
56
62
 
57
63
  const chainBalancePromises = chainsWithToken.map(async (chainId) => {
58
- const { balance, tokenAddress } = await fetchERC20BalanceForChain(
64
+ const balanceRaw = await fetchBalanceForChain(
59
65
  asset,
60
66
  chainId,
61
67
  walletAddress,
@@ -63,35 +69,41 @@ export async function fetchERC20Balance(
63
69
  )
64
70
  return {
65
71
  chainId,
66
- balance,
67
- tokenAddress,
68
- formattedBalance: formatUnits(balance, asset.metadata.decimals),
72
+ balanceRaw,
73
+ balance: parseFloat(formatUnits(balanceRaw, asset.metadata.decimals)),
69
74
  }
70
75
  })
71
76
 
72
- const chainBalances = await Promise.all(chainBalancePromises)
73
- const totalBalance = chainBalances.reduce(
74
- (total, { balance }) => total + balance,
77
+ const chainResults = await Promise.all(chainBalancePromises)
78
+ const totalBalanceRaw = chainResults.reduce(
79
+ (total, { balanceRaw }) => total + balanceRaw,
75
80
  0n,
76
81
  )
77
82
 
83
+ const chains: TokenBalance['chains'] = {}
84
+ for (const { chainId, balance, balanceRaw } of chainResults) {
85
+ chains[chainId] = { balance, balanceRaw }
86
+ }
87
+
78
88
  return {
79
- symbol: asset.metadata.symbol,
80
- totalBalance,
81
- totalFormattedBalance: formatUnits(totalBalance, asset.metadata.decimals),
82
- chainBalances,
89
+ asset,
90
+ totalBalance: parseFloat(
91
+ formatUnits(totalBalanceRaw, asset.metadata.decimals),
92
+ ),
93
+ totalBalanceRaw,
94
+ chains,
83
95
  }
84
96
  }
85
97
 
86
98
  /**
87
99
  * Fetch balance for this asset on a specific chain
88
100
  */
89
- async function fetchERC20BalanceForChain(
101
+ async function fetchBalanceForChain(
90
102
  asset: Asset,
91
103
  chainId: SupportedChainId,
92
104
  walletAddress: Address,
93
105
  chainManager: ChainManager,
94
- ): Promise<{ balance: bigint; tokenAddress: Address | 'native' }> {
106
+ ): Promise<bigint> {
95
107
  const tokenAddress = asset.address[chainId]
96
108
  if (!tokenAddress) {
97
109
  throw new Error(
@@ -103,19 +115,13 @@ async function fetchERC20BalanceForChain(
103
115
 
104
116
  // Handle native ETH balance
105
117
  if (asset.type === 'native' || tokenAddress === 'native') {
106
- return {
107
- balance: await publicClient.getBalance({
108
- address: walletAddress,
109
- }),
110
- tokenAddress: 'native',
111
- }
118
+ return publicClient.getBalance({ address: walletAddress })
112
119
  }
113
120
 
114
- const balance = await publicClient.readContract({
121
+ return publicClient.readContract({
115
122
  address: tokenAddress,
116
123
  abi: erc20Abi,
117
124
  functionName: 'balanceOf',
118
125
  args: [walletAddress],
119
126
  })
120
- return { balance, tokenAddress }
121
127
  }