@eth-optimism/actions-sdk 0.1.0 → 0.2.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 (283) hide show
  1. package/LICENSE +1 -1
  2. package/dist/__mocks__/MockAssets.d.ts.map +1 -0
  3. package/dist/__mocks__/MockAssets.js.map +1 -0
  4. package/dist/__mocks__/MockPrivyClient.d.ts.map +1 -0
  5. package/dist/__mocks__/MockPrivyClient.js.map +1 -0
  6. package/dist/__mocks__/utils.d.ts.map +1 -0
  7. package/dist/__mocks__/utils.js.map +1 -0
  8. package/dist/__tests__/actions.test.d.ts.map +1 -0
  9. package/dist/{actions.test.js → __tests__/actions.test.js} +5 -5
  10. package/dist/__tests__/actions.test.js.map +1 -0
  11. package/dist/constants/assets.d.ts +19 -0
  12. package/dist/constants/assets.d.ts.map +1 -1
  13. package/dist/constants/assets.js +84 -6
  14. package/dist/constants/assets.js.map +1 -1
  15. package/dist/constants/supportedChains.d.ts +1 -1
  16. package/dist/constants/supportedChains.d.ts.map +1 -1
  17. package/dist/constants/supportedChains.js +7 -3
  18. package/dist/constants/supportedChains.js.map +1 -1
  19. package/dist/core/asset/__mocks__/mockAsset.js +1 -1
  20. package/dist/core/asset/__mocks__/mockAsset.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/{test → lend/__mocks__}/MockLendProvider.d.ts +7 -6
  26. package/dist/lend/__mocks__/MockLendProvider.d.ts.map +1 -0
  27. package/dist/{test → lend/__mocks__}/MockLendProvider.js +20 -21
  28. package/dist/lend/__mocks__/MockLendProvider.js.map +1 -0
  29. package/dist/{test → lend/__mocks__}/MockMarkets.d.ts +1 -1
  30. package/dist/lend/__mocks__/MockMarkets.d.ts.map +1 -0
  31. package/dist/{test → lend/__mocks__}/MockMarkets.js +1 -1
  32. package/dist/lend/__mocks__/MockMarkets.js.map +1 -0
  33. package/dist/lend/__mocks__/mockLendTransaction.d.ts +3 -12
  34. package/dist/lend/__mocks__/mockLendTransaction.d.ts.map +1 -1
  35. package/dist/lend/__mocks__/mockLendTransaction.js +3 -19
  36. package/dist/lend/__mocks__/mockLendTransaction.js.map +1 -1
  37. package/dist/lend/core/LendProvider.d.ts +14 -2
  38. package/dist/lend/core/LendProvider.d.ts.map +1 -1
  39. package/dist/lend/core/LendProvider.js +23 -2
  40. package/dist/lend/core/LendProvider.js.map +1 -1
  41. package/dist/lend/core/__tests__/LendProvider.test.js +2 -2
  42. package/dist/lend/core/__tests__/LendProvider.test.js.map +1 -1
  43. package/dist/lend/namespaces/ActionsLendNamespace.d.ts +2 -36
  44. package/dist/lend/namespaces/ActionsLendNamespace.d.ts.map +1 -1
  45. package/dist/lend/namespaces/ActionsLendNamespace.js +2 -48
  46. package/dist/lend/namespaces/ActionsLendNamespace.js.map +1 -1
  47. package/dist/lend/namespaces/BaseLendNamespace.d.ts +47 -0
  48. package/dist/lend/namespaces/BaseLendNamespace.d.ts.map +1 -0
  49. package/dist/lend/namespaces/BaseLendNamespace.js +58 -0
  50. package/dist/lend/namespaces/BaseLendNamespace.js.map +1 -0
  51. package/dist/lend/namespaces/WalletLendNamespace.d.ts +8 -36
  52. package/dist/lend/namespaces/WalletLendNamespace.d.ts.map +1 -1
  53. package/dist/lend/namespaces/WalletLendNamespace.js +14 -69
  54. package/dist/lend/namespaces/WalletLendNamespace.js.map +1 -1
  55. package/dist/lend/namespaces/__tests__/ActionsLendNamespace.spec.js +2 -2
  56. package/dist/lend/namespaces/__tests__/ActionsLendNamespace.spec.js.map +1 -1
  57. package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.d.ts +2 -0
  58. package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.d.ts.map +1 -0
  59. package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js +110 -0
  60. package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js.map +1 -0
  61. package/dist/lend/namespaces/__tests__/WalletLendNamespace.spec.js +8 -10
  62. package/dist/lend/namespaces/__tests__/WalletLendNamespace.spec.js.map +1 -1
  63. package/dist/lend/providers/aave/AaveLendProvider.d.ts +19 -27
  64. package/dist/lend/providers/aave/AaveLendProvider.d.ts.map +1 -1
  65. package/dist/lend/providers/aave/AaveLendProvider.js +124 -180
  66. package/dist/lend/providers/aave/AaveLendProvider.js.map +1 -1
  67. package/dist/lend/providers/aave/__mocks__/mockReserve.d.ts +11 -0
  68. package/dist/lend/providers/aave/__mocks__/mockReserve.d.ts.map +1 -0
  69. package/dist/lend/providers/aave/__mocks__/mockReserve.js +80 -0
  70. package/dist/lend/providers/aave/__mocks__/mockReserve.js.map +1 -0
  71. package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.d.ts +2 -0
  72. package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.d.ts.map +1 -0
  73. package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js +315 -0
  74. package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js.map +1 -0
  75. package/dist/lend/providers/aave/abis/pool.d.ts +153 -0
  76. package/dist/lend/providers/aave/abis/pool.d.ts.map +1 -0
  77. package/dist/lend/providers/aave/abis/pool.js +79 -0
  78. package/dist/lend/providers/aave/abis/pool.js.map +1 -0
  79. package/dist/lend/providers/aave/sdk.d.ts.map +1 -1
  80. package/dist/lend/providers/aave/sdk.js +6 -65
  81. package/dist/lend/providers/aave/sdk.js.map +1 -1
  82. package/dist/lend/providers/morpho/MorphoLendProvider.d.ts +0 -1
  83. package/dist/lend/providers/morpho/MorphoLendProvider.d.ts.map +1 -1
  84. package/dist/lend/providers/morpho/MorphoLendProvider.js +13 -28
  85. package/dist/lend/providers/morpho/MorphoLendProvider.js.map +1 -1
  86. package/dist/lend/providers/morpho/__tests__/MorphoLendProvider.test.js +5 -24
  87. package/dist/lend/providers/morpho/__tests__/MorphoLendProvider.test.js.map +1 -1
  88. package/dist/lend/providers/morpho/__tests__/api.test.js +248 -54
  89. package/dist/lend/providers/morpho/__tests__/api.test.js.map +1 -1
  90. package/dist/lend/providers/morpho/contracts.d.ts +19 -0
  91. package/dist/lend/providers/morpho/contracts.d.ts.map +1 -0
  92. package/dist/lend/providers/morpho/contracts.js +32 -0
  93. package/dist/lend/providers/morpho/contracts.js.map +1 -0
  94. package/dist/lend/providers/morpho/sdk.d.ts.map +1 -1
  95. package/dist/lend/providers/morpho/sdk.js +168 -71
  96. package/dist/lend/providers/morpho/sdk.js.map +1 -1
  97. package/dist/services/ChainManager.d.ts +1 -1
  98. package/dist/{test → services/__mocks__}/MockChainManager.d.ts +1 -1
  99. package/dist/services/__mocks__/MockChainManager.d.ts.map +1 -0
  100. package/dist/services/__mocks__/MockChainManager.js.map +1 -0
  101. package/dist/services/tokenBalance.d.ts.map +1 -1
  102. package/dist/services/tokenBalance.js +4 -5
  103. package/dist/services/tokenBalance.js.map +1 -1
  104. package/dist/services/tokenBalance.spec.js +2 -2
  105. package/dist/services/tokenBalance.spec.js.map +1 -1
  106. package/dist/supported/tokens.d.ts +4 -4
  107. package/dist/supported/tokens.d.ts.map +1 -1
  108. package/dist/supported/tokens.js +5 -72
  109. package/dist/supported/tokens.js.map +1 -1
  110. package/dist/types/asset.d.ts +3 -3
  111. package/dist/types/asset.d.ts.map +1 -1
  112. package/dist/types/lend/base.d.ts +4 -9
  113. package/dist/types/lend/base.d.ts.map +1 -1
  114. package/dist/types/lend/contracts.d.ts +17 -0
  115. package/dist/types/lend/contracts.d.ts.map +1 -0
  116. package/dist/types/lend/contracts.js +2 -0
  117. package/dist/types/lend/contracts.js.map +1 -0
  118. package/dist/types/lend/index.d.ts +1 -0
  119. package/dist/types/lend/index.d.ts.map +1 -1
  120. package/dist/types/lend/index.js +1 -0
  121. package/dist/types/lend/index.js.map +1 -1
  122. package/dist/utils/assets.d.ts +7 -1
  123. package/dist/utils/assets.d.ts.map +1 -1
  124. package/dist/utils/assets.js +12 -1
  125. package/dist/utils/assets.js.map +1 -1
  126. package/dist/utils/assets.test.js +1 -1
  127. package/dist/utils/assets.test.js.map +1 -1
  128. package/dist/utils/constants.d.ts +5 -0
  129. package/dist/utils/constants.d.ts.map +1 -0
  130. package/dist/utils/constants.js +5 -0
  131. package/dist/utils/constants.js.map +1 -0
  132. package/dist/wallet/core/namespace/WalletNamespace.d.ts.map +1 -1
  133. package/dist/wallet/core/namespace/WalletNamespace.js.map +1 -1
  134. package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js +4 -4
  135. package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js.map +1 -1
  136. package/dist/wallet/core/providers/__tests__/WalletProvider.spec.js +4 -4
  137. package/dist/wallet/core/providers/__tests__/WalletProvider.spec.js.map +1 -1
  138. package/dist/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.js +2 -2
  139. package/dist/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.js.map +1 -1
  140. package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js +3 -3
  141. package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js.map +1 -1
  142. package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js +2 -2
  143. package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js.map +1 -1
  144. package/dist/wallet/core/wallets/eoa/__tests__/EOAWallet.spec.js +2 -2
  145. package/dist/wallet/core/wallets/eoa/__tests__/EOAWallet.spec.js.map +1 -1
  146. package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js +3 -3
  147. package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js.map +1 -1
  148. package/dist/wallet/core/wallets/smart/default/utils/__tests__/findSignerInArray.spec.js +1 -1
  149. package/dist/wallet/core/wallets/smart/default/utils/__tests__/findSignerInArray.spec.js.map +1 -1
  150. package/dist/wallet/core/wallets/smart/default/utils/__tests__/getSignerPublicKey.spec.js +1 -1
  151. package/dist/wallet/core/wallets/smart/default/utils/__tests__/getSignerPublicKey.spec.js.map +1 -1
  152. package/dist/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +4 -4
  153. package/dist/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
  154. package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js +2 -2
  155. package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js.map +1 -1
  156. package/dist/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js +2 -2
  157. package/dist/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js.map +1 -1
  158. package/dist/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.js +3 -3
  159. package/dist/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.js.map +1 -1
  160. package/dist/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.js +2 -2
  161. package/dist/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.js.map +1 -1
  162. package/dist/wallet/node/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.js +2 -2
  163. package/dist/wallet/node/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.js.map +1 -1
  164. package/dist/wallet/node/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.js +1 -1
  165. package/dist/wallet/node/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.js.map +1 -1
  166. package/dist/wallet/react/providers/hosted/dynamic/__mocks__/DynamicHostedWalletProviderMock.d.ts.map +1 -1
  167. package/dist/wallet/react/providers/hosted/dynamic/__mocks__/DynamicHostedWalletProviderMock.js +1 -1
  168. package/dist/wallet/react/providers/hosted/dynamic/__mocks__/DynamicHostedWalletProviderMock.js.map +1 -1
  169. package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js +5 -2
  170. package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js.map +1 -1
  171. package/dist/wallet/react/providers/hosted/privy/__mocks__/PrivyHostedWalletProviderMock.d.ts.map +1 -1
  172. package/dist/wallet/react/providers/hosted/privy/__mocks__/PrivyHostedWalletProviderMock.js +1 -1
  173. package/dist/wallet/react/providers/hosted/privy/__mocks__/PrivyHostedWalletProviderMock.js.map +1 -1
  174. package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +2 -2
  175. package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
  176. package/dist/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js +2 -2
  177. package/dist/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js.map +1 -1
  178. package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js +1 -1
  179. package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js.map +1 -1
  180. package/dist/wallet/react/wallets/hosted/dynamic/__tests__/DynamicWallet.spec.js +2 -2
  181. package/dist/wallet/react/wallets/hosted/dynamic/__tests__/DynamicWallet.spec.js.map +1 -1
  182. package/dist/wallet/react/wallets/hosted/dynamic/utils/__tests__/createSigner.spec.js +1 -1
  183. package/dist/wallet/react/wallets/hosted/dynamic/utils/__tests__/createSigner.spec.js.map +1 -1
  184. package/dist/wallet/react/wallets/hosted/privy/__tests__/PrivyWallet.spec.js +2 -2
  185. package/dist/wallet/react/wallets/hosted/privy/__tests__/PrivyWallet.spec.js.map +1 -1
  186. package/dist/wallet/react/wallets/hosted/privy/utils/__tests__/createSigner.spec.js +1 -1
  187. package/dist/wallet/react/wallets/hosted/privy/utils/__tests__/createSigner.spec.js.map +1 -1
  188. package/dist/wallet/react/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.js +2 -2
  189. package/dist/wallet/react/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.js.map +1 -1
  190. package/dist/wallet/react/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.js +1 -1
  191. package/dist/wallet/react/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.js.map +1 -1
  192. package/package.json +1 -1
  193. package/src/{test → __mocks__}/MockPrivyClient.ts +1 -1
  194. package/src/{actions.test.ts → __tests__/actions.test.ts} +2 -2
  195. package/src/constants/assets.ts +92 -8
  196. package/src/constants/supportedChains.ts +10 -2
  197. package/src/core/asset/__mocks__/mockAsset.ts +1 -1
  198. package/src/index.ts +1 -1
  199. package/src/{test → lend/__mocks__}/MockLendProvider.ts +20 -23
  200. package/src/{test → lend/__mocks__}/MockMarkets.ts +1 -1
  201. package/src/lend/__mocks__/mockLendTransaction.ts +4 -26
  202. package/src/lend/core/LendProvider.ts +34 -2
  203. package/src/lend/core/__tests__/LendProvider.test.ts +2 -2
  204. package/src/lend/namespaces/ActionsLendNamespace.ts +2 -85
  205. package/src/lend/namespaces/BaseLendNamespace.ts +89 -0
  206. package/src/lend/namespaces/WalletLendNamespace.ts +25 -121
  207. package/src/lend/namespaces/__tests__/ActionsLendNamespace.spec.ts +10 -9
  208. package/src/lend/namespaces/__tests__/BaseLendNamespace.spec.ts +137 -0
  209. package/src/lend/namespaces/__tests__/WalletLendNamespace.spec.ts +19 -22
  210. package/src/lend/providers/aave/AaveLendProvider.ts +163 -231
  211. package/src/lend/providers/aave/__mocks__/mockReserve.ts +84 -0
  212. package/src/lend/providers/aave/__tests__/AaveLendProvider.test.ts +419 -0
  213. package/src/lend/providers/aave/abis/pool.ts +81 -0
  214. package/src/lend/providers/aave/sdk.ts +7 -69
  215. package/src/lend/providers/morpho/MorphoLendProvider.ts +20 -41
  216. package/src/lend/providers/morpho/__tests__/MorphoLendProvider.test.ts +8 -32
  217. package/src/lend/providers/morpho/__tests__/api.test.ts +277 -51
  218. package/src/lend/providers/morpho/contracts.ts +37 -0
  219. package/src/lend/providers/morpho/sdk.ts +232 -84
  220. package/src/services/tokenBalance.spec.ts +2 -2
  221. package/src/services/tokenBalance.ts +6 -7
  222. package/src/supported/tokens.ts +6 -79
  223. package/src/types/asset.ts +3 -3
  224. package/src/types/lend/base.ts +8 -11
  225. package/src/types/lend/contracts.ts +18 -0
  226. package/src/types/lend/index.ts +1 -0
  227. package/src/utils/assets.test.ts +1 -1
  228. package/src/utils/assets.ts +15 -1
  229. package/src/utils/constants.ts +4 -0
  230. package/src/wallet/core/namespace/WalletNamespace.ts +2 -4
  231. package/src/wallet/core/namespace/__tests__/WalletNamespace.spec.ts +6 -6
  232. package/src/wallet/core/providers/__tests__/WalletProvider.spec.ts +6 -6
  233. package/src/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.ts +3 -3
  234. package/src/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.ts +7 -9
  235. package/src/wallet/core/wallets/abstract/__tests__/Wallet.spec.ts +2 -2
  236. package/src/wallet/core/wallets/eoa/__tests__/EOAWallet.spec.ts +2 -2
  237. package/src/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.ts +3 -3
  238. package/src/wallet/core/wallets/smart/default/utils/__tests__/findSignerInArray.spec.ts +1 -1
  239. package/src/wallet/core/wallets/smart/default/utils/__tests__/getSignerPublicKey.spec.ts +1 -1
  240. package/src/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +5 -5
  241. package/src/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.ts +3 -3
  242. package/src/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.ts +2 -2
  243. package/src/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.ts +4 -4
  244. package/src/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.ts +2 -2
  245. package/src/wallet/node/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.ts +2 -2
  246. package/src/wallet/node/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.ts +1 -1
  247. package/src/wallet/react/providers/hosted/dynamic/__mocks__/DynamicHostedWalletProviderMock.ts +1 -1
  248. package/src/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.ts +8 -5
  249. package/src/wallet/react/providers/hosted/privy/__mocks__/PrivyHostedWalletProviderMock.ts +1 -1
  250. package/src/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +4 -5
  251. package/src/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.ts +2 -2
  252. package/src/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.ts +5 -7
  253. package/src/wallet/react/wallets/hosted/dynamic/__tests__/DynamicWallet.spec.ts +2 -2
  254. package/src/wallet/react/wallets/hosted/dynamic/utils/__tests__/createSigner.spec.ts +1 -1
  255. package/src/wallet/react/wallets/hosted/privy/__tests__/PrivyWallet.spec.ts +2 -2
  256. package/src/wallet/react/wallets/hosted/privy/utils/__tests__/createSigner.spec.ts +1 -1
  257. package/src/wallet/react/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.ts +2 -2
  258. package/src/wallet/react/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.ts +1 -1
  259. package/dist/actions.test.d.ts.map +0 -1
  260. package/dist/actions.test.js.map +0 -1
  261. package/dist/test/MockAssets.d.ts.map +0 -1
  262. package/dist/test/MockAssets.js.map +0 -1
  263. package/dist/test/MockChainManager.d.ts.map +0 -1
  264. package/dist/test/MockChainManager.js.map +0 -1
  265. package/dist/test/MockLendProvider.d.ts.map +0 -1
  266. package/dist/test/MockLendProvider.js.map +0 -1
  267. package/dist/test/MockMarkets.d.ts.map +0 -1
  268. package/dist/test/MockMarkets.js.map +0 -1
  269. package/dist/test/MockPrivyClient.d.ts.map +0 -1
  270. package/dist/test/MockPrivyClient.js.map +0 -1
  271. package/dist/test/utils.d.ts.map +0 -1
  272. package/dist/test/utils.js.map +0 -1
  273. /package/dist/{test → __mocks__}/MockAssets.d.ts +0 -0
  274. /package/dist/{test → __mocks__}/MockAssets.js +0 -0
  275. /package/dist/{test → __mocks__}/MockPrivyClient.d.ts +0 -0
  276. /package/dist/{test → __mocks__}/MockPrivyClient.js +0 -0
  277. /package/dist/{test → __mocks__}/utils.d.ts +0 -0
  278. /package/dist/{test → __mocks__}/utils.js +0 -0
  279. /package/dist/{actions.test.d.ts → __tests__/actions.test.d.ts} +0 -0
  280. /package/dist/{test → services/__mocks__}/MockChainManager.js +0 -0
  281. /package/src/{test → __mocks__}/MockAssets.ts +0 -0
  282. /package/src/{test → __mocks__}/utils.ts +0 -0
  283. /package/src/{test → services/__mocks__}/MockChainManager.ts +0 -0
@@ -1,12 +1,17 @@
1
- import type { AccrualPosition } from '@morpho-org/blue-sdk'
2
- import { fetchAccrualVault } from '@morpho-org/blue-sdk-viem'
3
- import type { Address } from 'viem'
4
- import { parseEther } from 'viem'
1
+ import { type AccrualPosition, ChainId } from '@morpho-org/blue-sdk'
2
+ import {
3
+ adaptiveCurveIrmAbi,
4
+ blueAbi,
5
+ fetchAccrualVault,
6
+ metaMorphoAbi,
7
+ } from '@morpho-org/blue-sdk-viem'
8
+ import type { Address, PublicClient } from 'viem'
5
9
 
6
10
  import {
7
11
  fetchRewards,
8
12
  type RewardsBreakdown,
9
13
  } from '@/lend/providers/morpho/api.js'
14
+ import { getMorphoContracts } from '@/lend/providers/morpho/contracts.js'
10
15
  import type { ChainManager } from '@/services/ChainManager.js'
11
16
  import { SUPPORTED_TOKENS } from '@/supported/tokens.js'
12
17
  import type { LendProviderConfig } from '@/types/actions.js'
@@ -15,7 +20,9 @@ import type {
15
20
  LendMarket,
16
21
  LendMarketConfig,
17
22
  LendMarketId,
23
+ MorphoContracts,
18
24
  } from '@/types/lend/index.js'
25
+ import { SECONDS_PER_YEAR } from '@/utils/constants.js'
19
26
 
20
27
  /**
21
28
  * Fetch and calculate rewards breakdown from Morpho GraphQL API
@@ -91,41 +98,179 @@ export function calculateBaseApy(vault: any): number {
91
98
  }
92
99
  }
93
100
 
101
+ async function fetchVaultInfo(vaultAddress: Address, client: PublicClient) {
102
+ const [totalAssets, totalSupply, fee, owner, curator, supplyQueueLength] =
103
+ await Promise.all([
104
+ client.readContract({
105
+ address: vaultAddress,
106
+ abi: metaMorphoAbi,
107
+ functionName: 'totalAssets',
108
+ }),
109
+ client.readContract({
110
+ address: vaultAddress,
111
+ abi: metaMorphoAbi,
112
+ functionName: 'totalSupply',
113
+ }),
114
+ client.readContract({
115
+ address: vaultAddress,
116
+ abi: metaMorphoAbi,
117
+ functionName: 'fee',
118
+ }),
119
+ client.readContract({
120
+ address: vaultAddress,
121
+ abi: metaMorphoAbi,
122
+ functionName: 'owner',
123
+ }),
124
+ client.readContract({
125
+ address: vaultAddress,
126
+ abi: metaMorphoAbi,
127
+ functionName: 'curator',
128
+ }),
129
+ client.readContract({
130
+ address: vaultAddress,
131
+ abi: metaMorphoAbi,
132
+ functionName: 'supplyQueueLength',
133
+ }),
134
+ ])
135
+ return { totalAssets, totalSupply, fee, owner, curator, supplyQueueLength }
136
+ }
137
+
138
+ async function fetchMarketAllocation(
139
+ vaultAddress: Address,
140
+ marketIdHash: `0x${string}`,
141
+ contracts: MorphoContracts,
142
+ client: PublicClient,
143
+ ): Promise<{ vaultSupplyAssets: bigint; supplyApy: bigint } | null> {
144
+ const [marketParams, marketState, vaultPosition] = await Promise.all([
145
+ client.readContract({
146
+ address: contracts.morphoBlue,
147
+ abi: blueAbi,
148
+ functionName: 'idToMarketParams',
149
+ args: [marketIdHash],
150
+ }),
151
+ client.readContract({
152
+ address: contracts.morphoBlue,
153
+ abi: blueAbi,
154
+ functionName: 'market',
155
+ args: [marketIdHash],
156
+ }),
157
+ client.readContract({
158
+ address: contracts.morphoBlue,
159
+ abi: blueAbi,
160
+ functionName: 'position',
161
+ args: [marketIdHash, vaultAddress],
162
+ }),
163
+ ])
164
+
165
+ const [
166
+ supplyAssets,
167
+ supplyShares,
168
+ borrowAssets,
169
+ borrowShares,
170
+ lastUpdate,
171
+ marketFee,
172
+ ] = marketState
173
+ const [vaultSupplyShares] = vaultPosition
174
+
175
+ if (vaultSupplyShares === 0n) return null
176
+ const vaultSupplyAssets =
177
+ supplyShares > 0n ? (vaultSupplyShares * supplyAssets) / supplyShares : 0n
178
+ if (vaultSupplyAssets === 0n || supplyAssets === 0n) return null
179
+
180
+ const borrowRate = await client.readContract({
181
+ address: contracts.irm,
182
+ abi: adaptiveCurveIrmAbi,
183
+ functionName: 'borrowRateView',
184
+ args: [
185
+ {
186
+ loanToken: marketParams[0],
187
+ collateralToken: marketParams[1],
188
+ oracle: marketParams[2],
189
+ irm: marketParams[3],
190
+ lltv: marketParams[4],
191
+ },
192
+ {
193
+ totalSupplyAssets: supplyAssets,
194
+ totalSupplyShares: supplyShares,
195
+ totalBorrowAssets: borrowAssets,
196
+ totalBorrowShares: borrowShares,
197
+ lastUpdate,
198
+ fee: marketFee,
199
+ },
200
+ ],
201
+ })
202
+
203
+ const utilization =
204
+ supplyAssets > 0n ? (borrowAssets * BigInt(1e18)) / supplyAssets : 0n
205
+ const supplyApy = (borrowRate * utilization * SECONDS_PER_YEAR) / BigInt(1e18)
206
+ return { vaultSupplyAssets, supplyApy }
207
+ }
208
+
209
+ async function calculateVaultApy(
210
+ vaultAddress: Address,
211
+ supplyQueueLength: bigint,
212
+ contracts: MorphoContracts,
213
+ client: PublicClient,
214
+ ): Promise<number> {
215
+ let totalWeightedApy = 0n
216
+ let totalSupply = 0n
217
+
218
+ for (let i = 0n; i < supplyQueueLength; i++) {
219
+ const marketIdHash = (await client.readContract({
220
+ address: vaultAddress,
221
+ abi: metaMorphoAbi,
222
+ functionName: 'supplyQueue',
223
+ args: [i],
224
+ })) as `0x${string}`
225
+
226
+ const allocation = await fetchMarketAllocation(
227
+ vaultAddress,
228
+ marketIdHash,
229
+ contracts,
230
+ client,
231
+ )
232
+ if (!allocation) continue
233
+ totalWeightedApy += allocation.supplyApy * allocation.vaultSupplyAssets
234
+ totalSupply += allocation.vaultSupplyAssets
235
+ }
236
+
237
+ return totalSupply > 0n ? Number(totalWeightedApy / totalSupply) / 1e18 : 0
238
+ }
239
+
94
240
  /**
95
- * TEMPORARY - To be removed in https://github.com/ethereum-optimism/actions/issues/112
96
- * Create mock vault data for Base Sepolia (testnet)
97
- * @param marketId - Market identifier
98
- * @param marketConfig - Market configuration from allowlist
99
- * @returns Mock vault data with realistic values
241
+ * Fetch vault data via direct on-chain queries (for testnets)
100
242
  */
101
- function createMockVaultData(
243
+ async function fetchVaultDataOnChain(
102
244
  marketId: LendMarketId,
103
245
  marketConfig: LendMarketConfig,
104
- ): LendMarket {
105
- const mockApyBreakdown: ApyBreakdown = {
106
- total: 0.0542, // 5.42% net APY
107
- native: 0.058, // 5.8% gross APY
108
- totalRewards: 0.0235, // Total rewards APR
109
- usdc: 0.0125, // USDC rewards
110
- morpho: 0.008, // MORPHO token rewards
111
- other: 0.003, // Other protocol rewards
112
- performanceFee: 0.065, // 6.5% performance fee
113
- }
246
+ client: PublicClient,
247
+ contracts: MorphoContracts,
248
+ ): Promise<LendMarket> {
249
+ const info = await fetchVaultInfo(marketId.address, client)
250
+ const nativeApy = await calculateVaultApy(
251
+ marketId.address,
252
+ info.supplyQueueLength,
253
+ contracts,
254
+ client,
255
+ )
256
+ const performanceFee = Number(info.fee) / 1e18
114
257
 
115
258
  return {
116
259
  marketId,
117
260
  name: marketConfig.name,
118
261
  asset: marketConfig.asset,
119
- supply: {
120
- totalAssets: parseEther('125000'), // ~$125K TVL
121
- totalShares: parseEther('120000'), // Slightly lower shares (some yield accrued)
262
+ supply: { totalAssets: info.totalAssets, totalShares: info.totalSupply },
263
+ apy: {
264
+ total: nativeApy * (1 - performanceFee),
265
+ native: nativeApy,
266
+ totalRewards: 0,
267
+ performanceFee,
122
268
  },
123
- apy: mockApyBreakdown,
124
269
  metadata: {
125
- owner: '0x742d35Cc6464C42C0b15De2C4c98F7E8c3e0F1d9' as Address, // Mock owner
126
- curator: '0x8f3Cf7ad23Cd3CaDbD9735aff958023239c6A063' as Address, // Mock curator
127
- fee: mockApyBreakdown.performanceFee,
128
- lastUpdate: Math.floor(Date.now() / 1000) - 300, // 5 minutes ago
270
+ owner: info.owner,
271
+ curator: info.curator,
272
+ fee: performanceFee,
273
+ lastUpdate: Math.floor(Date.now() / 1000),
129
274
  },
130
275
  }
131
276
  }
@@ -159,6 +304,13 @@ function findMarketInAllowlist(
159
304
  )
160
305
  }
161
306
 
307
+ /**
308
+ * Check if chain is supported by Morpho SDK
309
+ */
310
+ function isSdkSupportedChain(chainId: number): boolean {
311
+ return ChainId[chainId] !== undefined
312
+ }
313
+
162
314
  /**
163
315
  * Get detailed vault information with enhanced rewards data
164
316
  * @param params - Named parameters object
@@ -176,69 +328,65 @@ export async function getVault(params: GetVaultParams): Promise<LendMarket> {
176
328
  )
177
329
  }
178
330
 
179
- // Morpho sdk doesn't support base sepolia, so we need to use the mock vault
180
- if (params.marketId.chainId === 84532) {
181
- return createMockVaultData(params.marketId, marketConfig)
182
- }
331
+ const publicClient = params.chainManager.getPublicClient(
332
+ params.marketId.chainId,
333
+ )
183
334
 
184
- try {
185
- // Fetch live vault data from Morpho SDK
186
- const vault = await fetchAccrualVault(
187
- params.marketId.address,
188
- params.chainManager.getPublicClient(params.marketId.chainId),
189
- ).catch((error) => {
190
- console.error('Failed to fetch vault info:', error)
191
- return {
192
- totalAssets: 0n,
193
- totalSupply: 0n,
194
- owner: '0x' as Address,
195
- curator: '0x' as Address,
196
- }
197
- })
335
+ // Try SDK first for supported chains (mainnets)
336
+ if (isSdkSupportedChain(params.marketId.chainId)) {
337
+ try {
338
+ const vault = await fetchAccrualVault(
339
+ params.marketId.address,
340
+ publicClient,
341
+ )
342
+
343
+ // Fetch rewards data from API
344
+ const rewardsBreakdown = await fetchAndCalculateRewards(
345
+ params.marketId.address,
346
+ ).catch((error) => {
347
+ console.error('Failed to fetch rewards data:', error)
348
+ return { usdc: 0, morpho: 0, other: 0, totalRewards: 0 }
349
+ })
350
+
351
+ const apyBreakdown = calculateApyBreakdown(vault, rewardsBreakdown)
352
+ const currentTimestampSeconds = Math.floor(Date.now() / 1000)
198
353
 
199
- // Fetch rewards data from API
200
- const rewardsBreakdown = await fetchAndCalculateRewards(
201
- params.marketId.address,
202
- ).catch((error) => {
203
- console.error('Failed to fetch rewards data:', error)
204
354
  return {
205
- usdc: 0,
206
- morpho: 0,
207
- other: 0,
208
- totalRewards: 0,
355
+ marketId: params.marketId,
356
+ name: marketConfig.name,
357
+ asset: marketConfig.asset,
358
+ supply: {
359
+ totalAssets: vault.totalAssets,
360
+ totalShares: vault.totalSupply,
361
+ },
362
+ apy: apyBreakdown,
363
+ metadata: {
364
+ owner: vault.owner,
365
+ curator: vault.curator,
366
+ fee: apyBreakdown.performanceFee,
367
+ lastUpdate: currentTimestampSeconds,
368
+ },
209
369
  }
210
- })
211
-
212
- // Calculate APY breakdown
213
- const apyBreakdown = calculateApyBreakdown(vault, rewardsBreakdown)
214
-
215
- // Return comprehensive vault information
216
- const currentTimestampSeconds = Math.floor(Date.now() / 1000)
217
-
218
- return {
219
- marketId: params.marketId,
220
- name: marketConfig.name,
221
- asset: marketConfig.asset,
222
- supply: {
223
- totalAssets: vault.totalAssets,
224
- totalShares: vault.totalSupply,
225
- },
226
- apy: apyBreakdown,
227
- metadata: {
228
- owner: vault.owner,
229
- curator: vault.curator,
230
- fee: apyBreakdown.performanceFee,
231
- lastUpdate: currentTimestampSeconds,
232
- },
370
+ } catch (error) {
371
+ console.error('SDK fetch failed, trying on-chain fallback:', error)
233
372
  }
234
- } catch (error) {
235
- console.error('Failed to get vault info:', error)
236
- throw new Error(
237
- `Failed to get vault info for ${params.marketId.address}: ${
238
- error instanceof Error ? error.message : 'Unknown error'
239
- }`,
373
+ }
374
+
375
+ // Fallback to direct on-chain queries for testnets or if SDK fails
376
+ const contracts = getMorphoContracts(params.marketId.chainId)
377
+ if (contracts) {
378
+ return fetchVaultDataOnChain(
379
+ params.marketId,
380
+ marketConfig,
381
+ publicClient,
382
+ contracts,
240
383
  )
241
384
  }
385
+
386
+ // No SDK support and no contracts configured
387
+ throw new Error(
388
+ `Chain ${params.marketId.chainId} not supported by Morpho SDK and no contracts configured`,
389
+ )
242
390
  }
243
391
 
244
392
  interface GetVaultsParams {
@@ -2,11 +2,11 @@ import type { Address } from 'viem'
2
2
  import { unichain } from 'viem/chains'
3
3
  import { beforeEach, describe, expect, it } from 'vitest'
4
4
 
5
+ import { MockUSDCAsset } from '@/__mocks__/MockAssets.js'
5
6
  import { ETH } from '@/constants/assets.js'
7
+ import { MockChainManager } from '@/services/__mocks__/MockChainManager.js'
6
8
  import type { ChainManager } from '@/services/ChainManager.js'
7
9
  import { fetchERC20Balance, fetchETHBalance } from '@/services/tokenBalance.js'
8
- import { MockUSDCAsset } from '@/test/MockAssets.js'
9
- import { MockChainManager } from '@/test/MockChainManager.js'
10
10
  import type { Asset } from '@/types/asset.js'
11
11
 
12
12
  describe('TokenBalance', () => {
@@ -1,7 +1,6 @@
1
1
  import type { Address } from 'viem'
2
2
  import { erc20Abi, formatEther, formatUnits } from 'viem'
3
3
 
4
- import { ETH } from '@/constants/assets.js'
5
4
  import type { SupportedChainId } from '@/constants/supportedChains.js'
6
5
  import type { ChainManager } from '@/services/ChainManager.js'
7
6
  import type { Asset, TokenBalance } from '@/types/asset.js'
@@ -25,7 +24,7 @@ export async function fetchETHBalance(
25
24
  return {
26
25
  chainId,
27
26
  balance,
28
- tokenAddress: ETH.address[chainId]!,
27
+ tokenAddress: 'native' as const,
29
28
  formattedBalance: formatEther(balance),
30
29
  }
31
30
  })
@@ -92,7 +91,7 @@ async function fetchERC20BalanceForChain(
92
91
  chainId: SupportedChainId,
93
92
  walletAddress: Address,
94
93
  chainManager: ChainManager,
95
- ): Promise<{ balance: bigint; tokenAddress: Address }> {
94
+ ): Promise<{ balance: bigint; tokenAddress: Address | 'native' }> {
96
95
  const tokenAddress = asset.address[chainId]
97
96
  if (!tokenAddress) {
98
97
  throw new Error(
@@ -103,20 +102,20 @@ async function fetchERC20BalanceForChain(
103
102
  const publicClient = chainManager.getPublicClient(chainId)
104
103
 
105
104
  // Handle native ETH balance
106
- if (asset.type === 'native') {
105
+ if (asset.type === 'native' || tokenAddress === 'native') {
107
106
  return {
108
107
  balance: await publicClient.getBalance({
109
108
  address: walletAddress,
110
109
  }),
111
- tokenAddress: ETH.address[chainId]!,
110
+ tokenAddress: 'native',
112
111
  }
113
112
  }
114
113
 
115
114
  const balance = await publicClient.readContract({
116
- address: tokenAddress as Address,
115
+ address: tokenAddress,
117
116
  abi: erc20Abi,
118
117
  functionName: 'balanceOf',
119
118
  args: [walletAddress],
120
119
  })
121
- return { balance, tokenAddress: tokenAddress as Address }
120
+ return { balance, tokenAddress }
122
121
  }
@@ -1,91 +1,18 @@
1
1
  import type { Address } from 'viem'
2
- import {
3
- base,
4
- baseSepolia,
5
- mainnet,
6
- optimismSepolia,
7
- unichain,
8
- } from 'viem/chains'
9
2
 
3
+ import { ETH, MORPHO, USDC, USDC_DEMO, WETH } from '@/constants/assets.js'
10
4
  import type { SupportedChainId } from '@/constants/supportedChains.js'
11
5
  import type { Asset } from '@/types/asset.js'
12
6
 
13
- export const SUPPORTED_TOKENS: Asset[] = [
14
- {
15
- address: {
16
- [mainnet.id]: '0x0000000000000000000000000000000000000000',
17
- [unichain.id]: '0x0000000000000000000000000000000000000000',
18
- [base.id]: '0x0000000000000000000000000000000000000000',
19
- [baseSepolia.id]: '0x0000000000000000000000000000000000000000',
20
- [optimismSepolia.id]: '0x0000000000000000000000000000000000000000',
21
- },
22
- metadata: {
23
- symbol: 'ETH',
24
- name: 'Ethereum',
25
- decimals: 18,
26
- },
27
- type: 'native',
28
- },
29
- {
30
- address: {
31
- [mainnet.id]: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
32
- [base.id]: '0x4200000000000000000000000000000000000006',
33
- [baseSepolia.id]: '0x4200000000000000000000000000000000000006',
34
- [optimismSepolia.id]: '0x4200000000000000000000000000000000000006',
35
- [unichain.id]: '0x4200000000000000000000000000000000000006',
36
- },
37
- metadata: {
38
- symbol: 'WETH',
39
- name: 'Wrapped Ether',
40
- decimals: 18,
41
- },
42
- type: 'erc20',
43
- },
44
- {
45
- address: {
46
- [mainnet.id]: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
47
- [unichain.id]: '0x078d782b760474a361dda0af3839290b0ef57ad6',
48
- [baseSepolia.id]: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',
49
- },
50
- metadata: {
51
- symbol: 'USDC',
52
- name: 'USDC',
53
- decimals: 6,
54
- },
55
- type: 'erc20',
56
- },
57
- {
58
- address: {
59
- [baseSepolia.id]: '0x87c25229afbc30418d0144e8dfb2bcf8efd92c6c',
60
- },
61
- metadata: {
62
- symbol: 'USDC_DEMO',
63
- name: 'USDC',
64
- decimals: 6,
65
- },
66
- type: 'erc20',
67
- },
68
- {
69
- address: {
70
- [mainnet.id]: '0x58D97B57BB95320F9a05dC918Aef65434969c2B2',
71
- [base.id]: '0xBAa5CC21fd487B8Fcc2F632f3F4E8D37262a0842',
72
- },
73
- metadata: {
74
- symbol: 'MORPHO',
75
- name: 'Morpho Token',
76
- decimals: 18,
77
- },
78
- type: 'erc20',
79
- },
80
- ]
7
+ export const SUPPORTED_TOKENS: Asset[] = [ETH, WETH, USDC, USDC_DEMO, MORPHO]
81
8
 
82
9
  /**
83
- * Find token by address and chain ID
10
+ * Get token by address and chain ID
84
11
  * @param address Token address
85
12
  * @param chainId Chain ID
86
13
  * @returns Token symbol or null if not found
87
14
  */
88
- export function findTokenByAddress(
15
+ export function getTokenByAddress(
89
16
  address: Address,
90
17
  chainId: SupportedChainId,
91
18
  ): string | null {
@@ -105,12 +32,12 @@ export function findTokenByAddress(
105
32
  * Get token address for a specific chain
106
33
  * @param symbol Token symbol
107
34
  * @param chainId Chain ID
108
- * @returns Token address or null if not supported on that chain
35
+ * @returns Token address, 'native' for native assets, or null if not supported
109
36
  */
110
37
  export function getTokenAddress(
111
38
  symbol: string,
112
39
  chainId: SupportedChainId,
113
- ): Address | null {
40
+ ): Address | 'native' | null {
114
41
  const token = SUPPORTED_TOKENS.find((t) => t.metadata.symbol === symbol)
115
42
  return token?.address[chainId] || null
116
43
  }
@@ -6,8 +6,8 @@ import type { SupportedChainId } from '@/constants/supportedChains.js'
6
6
  * Asset type inspired by EIP 7811 but adapted for multi-chain asset definitions
7
7
  */
8
8
  export interface Asset {
9
- /** Multi-chain address mapping */
10
- address: Partial<Record<SupportedChainId, Address>>
9
+ /** Multi-chain address mapping. Native assets use 'native' string to prevent accidental contract calls. */
10
+ address: Partial<Record<SupportedChainId, Address | 'native'>>
11
11
  /** Asset metadata */
12
12
  metadata: {
13
13
  decimals: number
@@ -28,7 +28,7 @@ export interface TokenBalance {
28
28
  chainBalances: Array<{
29
29
  chainId: SupportedChainId
30
30
  balance: bigint
31
- tokenAddress: Address
31
+ tokenAddress: Address | 'native'
32
32
  formattedBalance: string
33
33
  }>
34
34
  }
@@ -83,16 +83,13 @@ export interface LendTransaction {
83
83
  marketId: string
84
84
  /** Estimated APY at time of lending */
85
85
  apy: number
86
- /** Transaction data for execution (optional) */
87
- transactionData?: {
86
+ /** Transaction data for execution */
87
+ transactionData: {
88
88
  /** Approval transaction (if needed) */
89
89
  approval?: TransactionData
90
- /** Main operation transaction (openPosition or closePosition) */
91
- openPosition?: TransactionData
92
- closePosition?: TransactionData
90
+ /** Main position transaction */
91
+ position: TransactionData
93
92
  }
94
- /** Slippage tolerance used */
95
- slippage?: number
96
93
  }
97
94
 
98
95
  /**
@@ -204,8 +201,6 @@ export interface LendMarket {
204
201
  * @description Configuration options for lending operations
205
202
  */
206
203
  export interface LendOptions {
207
- /** Maximum slippage tolerance (basis points) */
208
- slippage?: number
209
204
  /** Deadline for transaction (timestamp) */
210
205
  deadline?: number
211
206
  /** Gas limit override */
@@ -268,8 +263,10 @@ export interface LendOpenPositionParams extends LendOpenPositionBaseParams {
268
263
  /**
269
264
  * Internal parameters for provider _openPosition method with amount already converted to wei
270
265
  */
271
- export interface LendOpenPositionInternalParams
272
- extends Omit<LendOpenPositionBaseParams, 'walletAddress'> {
266
+ export interface LendOpenPositionInternalParams extends Omit<
267
+ LendOpenPositionBaseParams,
268
+ 'walletAddress'
269
+ > {
273
270
  /** Amount to lend in wei */
274
271
  amountWei: bigint
275
272
  /** Wallet address for receiving shares and as owner (required in internal params) */
@@ -0,0 +1,18 @@
1
+ import type { Address } from 'viem'
2
+
3
+ /**
4
+ * Morpho contract addresses needed per chain
5
+ */
6
+ export interface MorphoContracts {
7
+ /** Morpho Blue core contract - market state, positions, supply/withdraw */
8
+ morphoBlue: Address
9
+ /** Interest Rate Model contract - borrow rate calculation for APY */
10
+ irm: Address
11
+ /** MetaMorpho vault factory (optional, only for vault creation) */
12
+ metaMorphoFactory?: Address
13
+ }
14
+
15
+ /**
16
+ * Registry mapping chainId to Morpho contracts
17
+ */
18
+ export type MorphoContractsRegistry = Record<number, MorphoContracts>
@@ -1,2 +1,3 @@
1
1
  export * from '@/types/lend/base.js'
2
+ export * from '@/types/lend/contracts.js'
2
3
  export * from '@/types/lend/morpho.js'
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
 
3
- import { MockUSDCAsset, MockWETHAsset } from '@/test/MockAssets.js'
3
+ import { MockUSDCAsset, MockWETHAsset } from '@/__mocks__/MockAssets.js'
4
4
  import { isAssetSupportedOnChain } from '@/utils/assets.js'
5
5
 
6
6
  describe('Asset Utilities', () => {
@@ -37,6 +37,15 @@ export function formatAssetAmount(amount: bigint, decimals: number): number {
37
37
  return parseFloat(result)
38
38
  }
39
39
 
40
+ /**
41
+ * Check if asset is a native asset (e.g. ETH)
42
+ * @param asset - Asset definition
43
+ * @returns Whether the asset is native
44
+ */
45
+ export function isNativeAsset(asset: Asset): boolean {
46
+ return asset.type === 'native'
47
+ }
48
+
40
49
  /**
41
50
  * Check if asset is supported on a specific chain
42
51
  * @param asset - Asset definition
@@ -55,7 +64,7 @@ export function isAssetSupportedOnChain(
55
64
  * @param asset - Asset definition
56
65
  * @param chainId - Chain ID
57
66
  * @returns Asset address on the specified chain
58
- * @throws Error if asset is not supported on the chain
67
+ * @throws Error if asset is not supported on the chain or is a native asset
59
68
  */
60
69
  export function getAssetAddress(
61
70
  asset: Asset,
@@ -67,5 +76,10 @@ export function getAssetAddress(
67
76
  `Asset ${asset.metadata.symbol} is not supported on chain ${chainId}`,
68
77
  )
69
78
  }
79
+ if (address === 'native') {
80
+ throw new Error(
81
+ `Asset ${asset.metadata.symbol} is a native asset and has no contract address.`,
82
+ )
83
+ }
70
84
  return address
71
85
  }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Seconds per year for APY calculations (365 days)
3
+ */
4
+ export const SECONDS_PER_YEAR = 31536000n