@eth-optimism/actions-sdk 0.0.3 → 0.1.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 (243) hide show
  1. package/dist/actions.d.ts +19 -7
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +49 -19
  4. package/dist/actions.js.map +1 -1
  5. package/dist/actions.test.js +51 -81
  6. package/dist/actions.test.js.map +1 -1
  7. package/dist/constants/assets.d.ts.map +1 -1
  8. package/dist/constants/assets.js +2 -1
  9. package/dist/constants/assets.js.map +1 -1
  10. package/dist/constants/supportedChains.d.ts +1 -1
  11. package/dist/constants/supportedChains.d.ts.map +1 -1
  12. package/dist/constants/supportedChains.js +2 -1
  13. package/dist/constants/supportedChains.js.map +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/lend/core/LendProvider.d.ts +3 -2
  18. package/dist/lend/core/LendProvider.d.ts.map +1 -1
  19. package/dist/lend/core/LendProvider.js.map +1 -1
  20. package/dist/lend/core/__tests__/LendProvider.test.js +18 -48
  21. package/dist/lend/core/__tests__/LendProvider.test.js.map +1 -1
  22. package/dist/lend/index.d.ts +1 -0
  23. package/dist/lend/index.d.ts.map +1 -1
  24. package/dist/lend/index.js +1 -0
  25. package/dist/lend/index.js.map +1 -1
  26. package/dist/lend/namespaces/ActionsLendNamespace.d.ts +35 -8
  27. package/dist/lend/namespaces/ActionsLendNamespace.d.ts.map +1 -1
  28. package/dist/lend/namespaces/ActionsLendNamespace.js +45 -8
  29. package/dist/lend/namespaces/ActionsLendNamespace.js.map +1 -1
  30. package/dist/lend/namespaces/WalletLendNamespace.d.ts +43 -10
  31. package/dist/lend/namespaces/WalletLendNamespace.d.ts.map +1 -1
  32. package/dist/lend/namespaces/WalletLendNamespace.js +67 -13
  33. package/dist/lend/namespaces/WalletLendNamespace.js.map +1 -1
  34. package/dist/lend/namespaces/__tests__/ActionsLendNamespace.spec.js +23 -15
  35. package/dist/lend/namespaces/__tests__/ActionsLendNamespace.spec.js.map +1 -1
  36. package/dist/lend/namespaces/__tests__/WalletLendNamespace.spec.js +29 -11
  37. package/dist/lend/namespaces/__tests__/WalletLendNamespace.spec.js.map +1 -1
  38. package/dist/lend/providers/aave/AaveLendProvider.d.ts +82 -0
  39. package/dist/lend/providers/aave/AaveLendProvider.d.ts.map +1 -0
  40. package/dist/lend/providers/aave/AaveLendProvider.js +346 -0
  41. package/dist/lend/providers/aave/AaveLendProvider.js.map +1 -0
  42. package/dist/lend/providers/aave/addresses.d.ts +57 -0
  43. package/dist/lend/providers/aave/addresses.d.ts.map +1 -0
  44. package/dist/lend/providers/aave/addresses.js +83 -0
  45. package/dist/lend/providers/aave/addresses.js.map +1 -0
  46. package/dist/lend/providers/aave/sdk.d.ts +57 -0
  47. package/dist/lend/providers/aave/sdk.d.ts.map +1 -0
  48. package/dist/lend/providers/aave/sdk.js +260 -0
  49. package/dist/lend/providers/aave/sdk.js.map +1 -0
  50. package/dist/lend/providers/morpho/MorphoLendProvider.d.ts +4 -3
  51. package/dist/lend/providers/morpho/MorphoLendProvider.d.ts.map +1 -1
  52. package/dist/lend/providers/morpho/MorphoLendProvider.js +2 -2
  53. package/dist/lend/providers/morpho/MorphoLendProvider.js.map +1 -1
  54. package/dist/lend/providers/morpho/__tests__/MorphoLendProvider.test.js +1 -33
  55. package/dist/lend/providers/morpho/__tests__/MorphoLendProvider.test.js.map +1 -1
  56. package/dist/lend/providers/morpho/__tests__/sdk.test.js +1 -0
  57. package/dist/lend/providers/morpho/__tests__/sdk.test.js.map +1 -1
  58. package/dist/lend/providers/morpho/sdk.d.ts +4 -3
  59. package/dist/lend/providers/morpho/sdk.d.ts.map +1 -1
  60. package/dist/lend/providers/morpho/sdk.js +0 -1
  61. package/dist/lend/providers/morpho/sdk.js.map +1 -1
  62. package/dist/services/ChainManager.d.ts +1 -1
  63. package/dist/supported/tokens.d.ts.map +1 -1
  64. package/dist/supported/tokens.js +18 -2
  65. package/dist/supported/tokens.js.map +1 -1
  66. package/dist/test/MockLendProvider.d.ts +5 -4
  67. package/dist/test/MockLendProvider.d.ts.map +1 -1
  68. package/dist/test/MockLendProvider.js +5 -5
  69. package/dist/test/MockLendProvider.js.map +1 -1
  70. package/dist/test/MockPrivyClient.d.ts +10 -49
  71. package/dist/test/MockPrivyClient.d.ts.map +1 -1
  72. package/dist/test/MockPrivyClient.js +13 -72
  73. package/dist/test/MockPrivyClient.js.map +1 -1
  74. package/dist/types/actions.d.ts +26 -2
  75. package/dist/types/actions.d.ts.map +1 -1
  76. package/dist/types/lend/base.d.ts +6 -19
  77. package/dist/types/lend/base.d.ts.map +1 -1
  78. package/dist/wallet/core/namespace/WalletNamespace.d.ts +13 -13
  79. package/dist/wallet/core/namespace/WalletNamespace.d.ts.map +1 -1
  80. package/dist/wallet/core/namespace/WalletNamespace.js +13 -13
  81. package/dist/wallet/core/namespace/WalletNamespace.js.map +1 -1
  82. package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js +64 -42
  83. package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js.map +1 -1
  84. package/dist/wallet/core/providers/__tests__/WalletProvider.spec.js +51 -23
  85. package/dist/wallet/core/providers/__tests__/WalletProvider.spec.js.map +1 -1
  86. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts +12 -3
  87. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts.map +1 -1
  88. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js +3 -2
  89. package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js.map +1 -1
  90. package/dist/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.js +14 -4
  91. package/dist/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.js.map +1 -1
  92. package/dist/wallet/core/providers/hosted/types/index.d.ts +8 -2
  93. package/dist/wallet/core/providers/hosted/types/index.d.ts.map +1 -1
  94. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts +14 -6
  95. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts.map +1 -1
  96. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js +10 -6
  97. package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js.map +1 -1
  98. package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js +36 -13
  99. package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js.map +1 -1
  100. package/dist/wallet/core/wallets/abstract/Wallet.d.ts +19 -7
  101. package/dist/wallet/core/wallets/abstract/Wallet.d.ts.map +1 -1
  102. package/dist/wallet/core/wallets/abstract/Wallet.js +9 -7
  103. package/dist/wallet/core/wallets/abstract/Wallet.js.map +1 -1
  104. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts +9 -3
  105. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts.map +1 -1
  106. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js +4 -4
  107. package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js.map +1 -1
  108. package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js +1 -1
  109. package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js.map +1 -1
  110. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +24 -4
  111. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
  112. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js +21 -6
  113. package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
  114. package/dist/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +34 -14
  115. package/dist/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
  116. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.d.ts.map +1 -1
  117. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js +10 -4
  118. package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js.map +1 -1
  119. package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js +9 -1
  120. package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js.map +1 -1
  121. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +9 -2
  122. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
  123. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +6 -3
  124. package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
  125. package/dist/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js +4 -3
  126. package/dist/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js.map +1 -1
  127. package/dist/wallet/node/providers/hosted/types/index.d.ts +6 -1
  128. package/dist/wallet/node/providers/hosted/types/index.d.ts.map +1 -1
  129. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts +19 -7
  130. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
  131. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js +13 -7
  132. package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js.map +1 -1
  133. package/dist/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.js +26 -28
  134. package/dist/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.js.map +1 -1
  135. package/dist/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.js +12 -12
  136. package/dist/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.js.map +1 -1
  137. package/dist/wallet/node/wallets/hosted/privy/utils/createSigner.d.ts +6 -2
  138. package/dist/wallet/node/wallets/hosted/privy/utils/createSigner.d.ts.map +1 -1
  139. package/dist/wallet/node/wallets/hosted/privy/utils/createSigner.js +10 -7
  140. package/dist/wallet/node/wallets/hosted/privy/utils/createSigner.js.map +1 -1
  141. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts +8 -2
  142. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
  143. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
  144. package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
  145. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts +6 -2
  146. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts.map +1 -1
  147. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js +3 -3
  148. package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js.map +1 -1
  149. package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js +19 -7
  150. package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js.map +1 -1
  151. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +6 -2
  152. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
  153. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js +3 -3
  154. package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
  155. package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +7 -3
  156. package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
  157. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +6 -2
  158. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
  159. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +3 -3
  160. package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
  161. package/dist/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js +6 -3
  162. package/dist/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js.map +1 -1
  163. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js +6 -6
  164. package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js.map +1 -1
  165. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts +6 -2
  166. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts.map +1 -1
  167. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js +3 -3
  168. package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js.map +1 -1
  169. package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts +6 -0
  170. package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts.map +1 -1
  171. package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.js.map +1 -1
  172. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts +6 -2
  173. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
  174. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js +3 -3
  175. package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js.map +1 -1
  176. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts +6 -2
  177. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
  178. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
  179. package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
  180. package/package.json +5 -2
  181. package/src/actions.test.ts +55 -96
  182. package/src/actions.ts +82 -26
  183. package/src/constants/assets.ts +8 -1
  184. package/src/constants/supportedChains.ts +8 -1
  185. package/src/index.ts +1 -2
  186. package/src/lend/core/LendProvider.ts +6 -5
  187. package/src/lend/core/__tests__/LendProvider.test.ts +19 -61
  188. package/src/lend/index.ts +1 -0
  189. package/src/lend/namespaces/ActionsLendNamespace.ts +77 -13
  190. package/src/lend/namespaces/WalletLendNamespace.ts +106 -20
  191. package/src/lend/namespaces/__tests__/ActionsLendNamespace.spec.ts +24 -18
  192. package/src/lend/namespaces/__tests__/WalletLendNamespace.spec.ts +49 -11
  193. package/src/lend/providers/aave/AaveLendProvider.ts +463 -0
  194. package/src/lend/providers/aave/addresses.ts +95 -0
  195. package/src/lend/providers/aave/sdk.ts +369 -0
  196. package/src/lend/providers/morpho/MorphoLendProvider.ts +5 -5
  197. package/src/lend/providers/morpho/__tests__/MorphoLendProvider.test.ts +5 -53
  198. package/src/lend/providers/morpho/__tests__/sdk.test.ts +1 -0
  199. package/src/lend/providers/morpho/sdk.ts +3 -4
  200. package/src/supported/tokens.ts +24 -2
  201. package/src/test/MockLendProvider.ts +9 -9
  202. package/src/test/MockPrivyClient.ts +24 -91
  203. package/src/types/actions.ts +30 -2
  204. package/src/types/lend/base.ts +6 -22
  205. package/src/wallet/core/namespace/WalletNamespace.ts +13 -13
  206. package/src/wallet/core/namespace/__tests__/WalletNamespace.spec.ts +69 -70
  207. package/src/wallet/core/providers/__tests__/WalletProvider.spec.ts +55 -47
  208. package/src/wallet/core/providers/hosted/abstract/HostedWalletProvider.ts +15 -4
  209. package/src/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.ts +20 -7
  210. package/src/wallet/core/providers/hosted/types/index.ts +8 -2
  211. package/src/wallet/core/providers/smart/default/DefaultSmartWalletProvider.ts +24 -9
  212. package/src/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.ts +38 -46
  213. package/src/wallet/core/wallets/abstract/Wallet.ts +25 -17
  214. package/src/wallet/core/wallets/smart/default/DefaultSmartWallet.ts +17 -10
  215. package/src/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.ts +4 -7
  216. package/src/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.ts +37 -11
  217. package/src/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +43 -24
  218. package/src/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.ts +10 -7
  219. package/src/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.ts +17 -2
  220. package/src/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +13 -4
  221. package/src/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.ts +4 -4
  222. package/src/wallet/node/providers/hosted/types/index.ts +9 -2
  223. package/src/wallet/node/wallets/hosted/privy/PrivyWallet.ts +31 -11
  224. package/src/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.ts +35 -40
  225. package/src/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.ts +18 -14
  226. package/src/wallet/node/wallets/hosted/privy/utils/createSigner.ts +11 -9
  227. package/src/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.ts +16 -5
  228. package/src/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.ts +8 -4
  229. package/src/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.ts +25 -14
  230. package/src/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.ts +8 -4
  231. package/src/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +7 -7
  232. package/src/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +8 -4
  233. package/src/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.ts +6 -7
  234. package/src/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.ts +6 -6
  235. package/src/wallet/react/wallets/hosted/dynamic/DynamicWallet.ts +12 -5
  236. package/src/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.ts +6 -0
  237. package/src/wallet/react/wallets/hosted/privy/PrivyWallet.ts +12 -5
  238. package/src/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.ts +12 -5
  239. package/dist/constants/config.d.ts +0 -10
  240. package/dist/constants/config.d.ts.map +0 -1
  241. package/dist/constants/config.js +0 -10
  242. package/dist/constants/config.js.map +0 -1
  243. package/src/constants/config.ts +0 -9
@@ -3,11 +3,7 @@ import { describe, expect, it } from 'vitest'
3
3
 
4
4
  import { MockUSDCAsset } from '@/test/MockAssets.js'
5
5
  import { MockLendProvider } from '@/test/MockLendProvider.js'
6
- import type {
7
- LendConfig,
8
- LendMarketConfig,
9
- LendMarketId,
10
- } from '@/types/lend/index.js'
6
+ import type { LendMarketConfig, LendMarketId } from '@/types/lend/index.js'
11
7
 
12
8
  // Test helper class that exposes protected validation methods as public
13
9
  class TestLendProvider extends MockLendProvider {
@@ -27,33 +23,11 @@ class TestLendProvider extends MockLendProvider {
27
23
  describe('LendProvider', () => {
28
24
  describe('constructor and configuration', () => {
29
25
  it('should initialize with basic config', () => {
30
- const config: LendConfig = {
31
- provider: 'morpho',
32
- defaultSlippage: 100,
33
- }
34
-
35
- const provider = new MockLendProvider(config)
26
+ const provider = new MockLendProvider()
36
27
  expect(provider).toBeDefined()
37
28
  expect(provider.supportedChainIds()).toContain(84532)
38
29
  })
39
30
 
40
- it('should use default slippage when not provided', () => {
41
- const config: LendConfig = { provider: 'morpho' }
42
- const provider = new MockLendProvider(config)
43
-
44
- expect(provider.config.defaultSlippage || 50).toBe(50)
45
- })
46
-
47
- it('should use custom default slippage when provided', () => {
48
- const config: LendConfig = {
49
- provider: 'morpho',
50
- defaultSlippage: 200,
51
- }
52
- const provider = new MockLendProvider(config)
53
-
54
- expect(provider.config.defaultSlippage).toBe(200)
55
- })
56
-
57
31
  it('should store market allowlist when provided', () => {
58
32
  const mockMarket: LendMarketConfig = {
59
33
  address: '0x1234' as Address,
@@ -71,19 +45,16 @@ describe('LendProvider', () => {
71
45
  lendProvider: 'morpho',
72
46
  }
73
47
 
74
- const config: LendConfig = {
75
- provider: 'morpho',
48
+ const provider = new MockLendProvider({
76
49
  marketAllowlist: [mockMarket],
77
- }
78
-
79
- const provider = new MockLendProvider(config)
50
+ })
80
51
  expect(provider.config.marketAllowlist).toEqual([mockMarket])
81
52
  })
82
53
  })
83
54
 
84
55
  describe('abstract methods implementation', () => {
85
56
  it('should implement getMarket method', async () => {
86
- const provider = new MockLendProvider({ provider: 'morpho' })
57
+ const provider = new MockLendProvider()
87
58
  const marketId: LendMarketId = {
88
59
  address: '0x1234' as Address,
89
60
  chainId: 84532,
@@ -96,7 +67,7 @@ describe('LendProvider', () => {
96
67
  })
97
68
 
98
69
  it('should accept LendMarketConfig and extract address/chainId', async () => {
99
- const provider = new MockLendProvider({ provider: 'morpho' })
70
+ const provider = new MockLendProvider()
100
71
  const mockMarket: LendMarketConfig = {
101
72
  address: '0x5678' as Address,
102
73
  chainId: 84532,
@@ -112,7 +83,7 @@ describe('LendProvider', () => {
112
83
  })
113
84
 
114
85
  it('should implement getMarkets method', async () => {
115
- const provider = new MockLendProvider({ provider: 'morpho' })
86
+ const provider = new MockLendProvider()
116
87
  const markets = await provider.getMarkets()
117
88
 
118
89
  expect(Array.isArray(markets)).toBe(true)
@@ -121,7 +92,7 @@ describe('LendProvider', () => {
121
92
  })
122
93
 
123
94
  it('should accept optional filter parameters for getMarkets', async () => {
124
- const provider = new MockLendProvider({ provider: 'morpho' })
95
+ const provider = new MockLendProvider()
125
96
  const markets = await provider.getMarkets({ chainId: 84532 })
126
97
 
127
98
  expect(Array.isArray(markets)).toBe(true)
@@ -129,7 +100,7 @@ describe('LendProvider', () => {
129
100
  })
130
101
 
131
102
  it('should accept asset filtering parameter', async () => {
132
- const provider = new MockLendProvider({ provider: 'morpho' })
103
+ const provider = new MockLendProvider()
133
104
  const mockAsset = {
134
105
  metadata: { symbol: 'USDC', name: 'USD Coin' },
135
106
  address: { 84532: '0x123' as Address },
@@ -140,7 +111,7 @@ describe('LendProvider', () => {
140
111
  })
141
112
 
142
113
  it('should implement getPosition method', async () => {
143
- const provider = new MockLendProvider({ provider: 'morpho' })
114
+ const provider = new MockLendProvider()
144
115
  const position = await provider.getPosition('0x5678' as Address, {
145
116
  address: '0x1234' as Address,
146
117
  chainId: 84532 as const,
@@ -152,7 +123,7 @@ describe('LendProvider', () => {
152
123
  })
153
124
 
154
125
  it('should implement closePosition method', async () => {
155
- const provider = new MockLendProvider({ provider: 'morpho' })
126
+ const provider = new MockLendProvider()
156
127
  const result = await provider.closePosition({
157
128
  amount: 100,
158
129
  marketId: { address: '0x1234' as Address, chainId: 84532 as const },
@@ -165,7 +136,7 @@ describe('LendProvider', () => {
165
136
  })
166
137
 
167
138
  it('should implement withdraw method', async () => {
168
- const provider = new MockLendProvider({ provider: 'morpho' })
139
+ const provider = new MockLendProvider()
169
140
  const result = await provider.withdraw(
170
141
  '0x0000000000000000000000000000000000000001' as Address,
171
142
  500n,
@@ -178,7 +149,7 @@ describe('LendProvider', () => {
178
149
  })
179
150
 
180
151
  it('should implement openPosition method', async () => {
181
- const provider = new MockLendProvider({ provider: 'morpho' })
152
+ const provider = new MockLendProvider()
182
153
  const mockAsset = {
183
154
  address: { 84532: '0x123' as Address },
184
155
  metadata: { symbol: 'USDC', name: 'USD Coin', decimals: 6 },
@@ -201,7 +172,7 @@ describe('LendProvider', () => {
201
172
 
202
173
  describe('supportedChainIds', () => {
203
174
  it('should return array of supported chain IDs', () => {
204
- const provider = new MockLendProvider({ provider: 'morpho' })
175
+ const provider = new MockLendProvider()
205
176
  const chainIds = provider.supportedChainIds()
206
177
 
207
178
  expect(Array.isArray(chainIds)).toBe(true)
@@ -212,7 +183,7 @@ describe('LendProvider', () => {
212
183
 
213
184
  describe('validation', () => {
214
185
  it('should call validation for unsupported chainId', () => {
215
- const provider = new TestLendProvider({ provider: 'morpho' })
186
+ const provider = new TestLendProvider()
216
187
 
217
188
  expect(() => {
218
189
  provider.validateProviderSupported(999)
@@ -233,7 +204,6 @@ describe('LendProvider', () => {
233
204
  }
234
205
 
235
206
  const provider = new TestLendProvider({
236
- provider: 'morpho',
237
207
  marketAllowlist: [allowedMarket],
238
208
  })
239
209
 
@@ -253,7 +223,7 @@ describe('LendProvider', () => {
253
223
  })
254
224
 
255
225
  it('should validate chain support correctly', () => {
256
- const provider = new TestLendProvider({ provider: 'morpho' })
226
+ const provider = new TestLendProvider()
257
227
 
258
228
  expect(provider.isChainSupported(84532)).toBe(true)
259
229
  expect(provider.isChainSupported(999)).toBe(false)
@@ -261,16 +231,6 @@ describe('LendProvider', () => {
261
231
  })
262
232
 
263
233
  describe('public getters', () => {
264
- it('should provide access to defaultSlippage via getter', () => {
265
- const config: LendConfig = {
266
- provider: 'morpho',
267
- defaultSlippage: 75,
268
- }
269
- const provider = new MockLendProvider(config)
270
-
271
- expect(provider.config.defaultSlippage).toBe(75)
272
- })
273
-
274
234
  it('should provide access to marketAllowlist via getter', () => {
275
235
  const mockMarket: LendMarketConfig = {
276
236
  address: '0xabc' as Address,
@@ -288,17 +248,15 @@ describe('LendProvider', () => {
288
248
  lendProvider: 'morpho',
289
249
  }
290
250
 
291
- const config: LendConfig = {
292
- provider: 'morpho',
251
+ const provider = new MockLendProvider({
293
252
  marketAllowlist: [mockMarket],
294
- }
295
- const provider = new MockLendProvider(config)
253
+ })
296
254
 
297
255
  expect(provider.config.marketAllowlist).toEqual([mockMarket])
298
256
  })
299
257
 
300
258
  it('should return undefined for marketAllowlist when not provided', () => {
301
- const provider = new MockLendProvider({ provider: 'morpho' })
259
+ const provider = new MockLendProvider()
302
260
  expect(provider.config.marketAllowlist).toBeUndefined()
303
261
  })
304
262
  })
package/src/lend/index.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { LendProvider } from '@/lend/core/LendProvider.js'
2
+ export { AaveLendProvider } from '@/lend/providers/aave/AaveLendProvider.js'
2
3
  export { MorphoLendProvider } from '@/lend/providers/morpho/MorphoLendProvider.js'
@@ -1,26 +1,90 @@
1
1
  import type { LendProvider } from '@/lend/core/LendProvider.js'
2
- import type { BaseLendConfig, LendConfig } from '@/types/lend/index.js'
2
+ import type { AaveLendProvider } from '@/lend/providers/aave/AaveLendProvider.js'
3
+ import type { MorphoLendProvider } from '@/lend/providers/morpho/MorphoLendProvider.js'
4
+ import type { LendProviderConfig } from '@/types/actions.js'
5
+ import type {
6
+ GetLendMarketParams,
7
+ GetLendMarketsParams,
8
+ LendMarket,
9
+ LendMarketId,
10
+ } from '@/types/lend/index.js'
3
11
 
4
12
  /**
5
13
  * Actions Lend Namespace
6
14
  * @description Read-only lending operations available on actions.lend
7
15
  */
8
- export class ActionsLendNamespace<TConfig extends BaseLendConfig = LendConfig> {
9
- constructor(protected readonly provider: LendProvider<TConfig>) {}
16
+ export class ActionsLendNamespace {
17
+ constructor(
18
+ protected readonly providers: {
19
+ morpho?: LendProvider<LendProviderConfig>
20
+ aave?: LendProvider<LendProviderConfig>
21
+ },
22
+ ) {}
10
23
 
11
- get config(): TConfig {
12
- return this.provider.config
24
+ /**
25
+ * Route a market to the correct provider
26
+ * @param marketId - Market identifier to route
27
+ * @returns The provider that handles this market
28
+ * @throws Error if no provider is found for the market
29
+ */
30
+ private getProviderForMarket(
31
+ marketId: LendMarketId,
32
+ ): MorphoLendProvider | AaveLendProvider {
33
+ const allProviders = [this.providers.morpho, this.providers.aave].filter(
34
+ Boolean,
35
+ ) as Array<MorphoLendProvider | AaveLendProvider>
36
+
37
+ for (const provider of allProviders) {
38
+ const market = provider.config.marketAllowlist?.find(
39
+ (m: LendMarketId) =>
40
+ m.address.toLowerCase() === marketId.address.toLowerCase() &&
41
+ m.chainId === marketId.chainId,
42
+ )
43
+ if (market) return provider
44
+ }
45
+
46
+ throw new Error(
47
+ `No provider configured for market ${marketId.address} on chain ${marketId.chainId}`,
48
+ )
13
49
  }
14
50
 
15
- // Bind to the LendProvider's methods and carry types
51
+ /**
52
+ * Get all markets across all configured providers
53
+ * @param params - Optional filtering parameters
54
+ * @returns Promise resolving to array of markets from all providers
55
+ */
56
+ async getMarkets(params: GetLendMarketsParams = {}): Promise<LendMarket[]> {
57
+ const allProviders = [this.providers.morpho, this.providers.aave].filter(
58
+ Boolean,
59
+ ) as Array<MorphoLendProvider | AaveLendProvider>
16
60
 
17
- getMarkets = (...args: Parameters<LendProvider<TConfig>['getMarkets']>) =>
18
- this.provider.getMarkets(...args)
61
+ const results = await Promise.all(
62
+ allProviders.map((p) => p.getMarkets(params)),
63
+ )
19
64
 
20
- getMarket = (...args: Parameters<LendProvider<TConfig>['getMarket']>) =>
21
- this.provider.getMarket(...args)
65
+ return results.flat()
66
+ }
22
67
 
23
- supportedChainIds = (
24
- ...args: Parameters<LendProvider<TConfig>['supportedChainIds']>
25
- ) => this.provider.supportedChainIds(...args)
68
+ /**
69
+ * Get a specific market by routing to the correct provider
70
+ * @param params - Market identifier
71
+ * @returns Promise resolving to market information
72
+ */
73
+ async getMarket(params: GetLendMarketParams): Promise<LendMarket> {
74
+ const provider = this.getProviderForMarket(params)
75
+ return provider.getMarket(params)
76
+ }
77
+
78
+ /**
79
+ * Get supported chain IDs across all providers
80
+ * @returns Array of unique chain IDs supported by any provider
81
+ */
82
+ supportedChainIds(): number[] {
83
+ const allProviders = [this.providers.morpho, this.providers.aave].filter(
84
+ Boolean,
85
+ ) as Array<MorphoLendProvider | AaveLendProvider>
86
+
87
+ const allChains = allProviders.flatMap((p) => p.supportedChainIds())
88
+ return [...new Set(allChains)]
89
+ }
26
90
  }
@@ -1,8 +1,14 @@
1
1
  import type { LendProvider } from '@/lend/core/LendProvider.js'
2
+ import type { AaveLendProvider } from '@/lend/providers/aave/AaveLendProvider.js'
3
+ import type { MorphoLendProvider } from '@/lend/providers/morpho/MorphoLendProvider.js'
4
+ import type { LendProviderConfig } from '@/types/actions.js'
2
5
  import type {
3
- BaseLendConfig,
4
6
  ClosePositionParams,
7
+ GetLendMarketParams,
8
+ GetLendMarketsParams,
5
9
  GetPositionParams,
10
+ LendMarket,
11
+ LendMarketId,
6
12
  LendMarketPosition,
7
13
  LendOpenPositionParams,
8
14
  LendTransactionReceipt,
@@ -13,37 +19,99 @@ import type { Wallet } from '@/wallet/core/wallets/abstract/Wallet.js'
13
19
  * Wallet Lend Namespace
14
20
  * @description Full lending operations available on wallet.lend
15
21
  */
16
- export class WalletLendNamespace<
17
- TConfig extends BaseLendConfig = BaseLendConfig,
18
- > {
22
+ export class WalletLendNamespace {
19
23
  constructor(
20
- protected readonly provider: LendProvider<TConfig>,
24
+ protected readonly providers: {
25
+ morpho?: LendProvider<LendProviderConfig>
26
+ aave?: LendProvider<LendProviderConfig>
27
+ },
21
28
  private readonly wallet: Wallet,
22
29
  ) {}
23
30
 
24
- get config(): TConfig {
25
- return this.provider.config
31
+ /**
32
+ * Route a market to the correct provider
33
+ * @param marketId - Market identifier to route
34
+ * @returns The provider that handles this market
35
+ * @throws Error if no provider is found for the market
36
+ */
37
+ private getProviderForMarket(
38
+ marketId: LendMarketId,
39
+ ): MorphoLendProvider | AaveLendProvider {
40
+ const allProviders = [this.providers.morpho, this.providers.aave].filter(
41
+ Boolean,
42
+ ) as Array<MorphoLendProvider | AaveLendProvider>
43
+
44
+ for (const provider of allProviders) {
45
+ const market = provider.config.marketAllowlist?.find(
46
+ (m: LendMarketId) =>
47
+ m.address.toLowerCase() === marketId.address.toLowerCase() &&
48
+ m.chainId === marketId.chainId,
49
+ )
50
+
51
+ if (market) {
52
+ return provider
53
+ }
54
+ }
55
+
56
+ throw new Error(
57
+ `No provider configured for market ${marketId.address} on chain ${marketId.chainId}`,
58
+ )
26
59
  }
27
60
 
28
- // Inherited methods from ActionsLendNamespace
29
- getMarkets = (...args: Parameters<LendProvider<TConfig>['getMarkets']>) =>
30
- this.provider.getMarkets(...args)
61
+ /**
62
+ * Get all markets across all configured providers
63
+ * @param params - Optional filtering parameters
64
+ * @returns Promise resolving to array of markets from all providers
65
+ */
66
+ async getMarkets(params: GetLendMarketsParams = {}): Promise<LendMarket[]> {
67
+ const allProviders = [this.providers.morpho, this.providers.aave].filter(
68
+ Boolean,
69
+ ) as Array<MorphoLendProvider | AaveLendProvider>
70
+
71
+ const results = await Promise.all(
72
+ allProviders.map((p) => p.getMarkets(params)),
73
+ )
31
74
 
32
- getMarket = (...args: Parameters<LendProvider<TConfig>['getMarket']>) =>
33
- this.provider.getMarket(...args)
75
+ return results.flat()
76
+ }
34
77
 
35
- supportedChainIds = (
36
- ...args: Parameters<LendProvider<TConfig>['supportedChainIds']>
37
- ) => this.provider.supportedChainIds(...args)
78
+ /**
79
+ * Get a specific market by routing to the correct provider
80
+ * @param params - Market identifier
81
+ * @returns Promise resolving to market information
82
+ */
83
+ async getMarket(params: GetLendMarketParams): Promise<LendMarket> {
84
+ const provider = this.getProviderForMarket(params)
85
+ return provider.getMarket(params)
86
+ }
87
+
88
+ /**
89
+ * Get supported chain IDs across all providers
90
+ * @returns Array of unique chain IDs supported by any provider
91
+ */
92
+ supportedChainIds(): number[] {
93
+ const allProviders = [this.providers.morpho, this.providers.aave].filter(
94
+ Boolean,
95
+ ) as Array<MorphoLendProvider | AaveLendProvider>
96
+
97
+ const allChains = allProviders.flatMap((p) => p.supportedChainIds())
98
+ return [...new Set(allChains)]
99
+ }
38
100
 
39
101
  /**
40
102
  * Open a lending position
41
103
  * @description Signs and sends a lend transaction from the wallet for the given amount and asset
104
+ * @param params - Lending position parameters
105
+ * @param params.marketId - Market identifier to open position in
106
+ * @param params.amount - Amount to lend
107
+ * @returns Promise resolving to transaction receipt
42
108
  */
43
109
  async openPosition(
44
110
  params: LendOpenPositionParams,
45
111
  ): Promise<LendTransactionReceipt> {
46
- const lendTransaction = await this.provider.openPosition({
112
+ const provider = this.getProviderForMarket(params.marketId)
113
+
114
+ const lendTransaction = await provider.openPosition({
47
115
  ...params,
48
116
  walletAddress: this.wallet.address,
49
117
  })
@@ -77,7 +145,13 @@ export class WalletLendNamespace<
77
145
  * @returns Promise resolving to position information
78
146
  */
79
147
  async getPosition(params: GetPositionParams): Promise<LendMarketPosition> {
80
- return this.provider.getPosition(
148
+ if (!params.marketId) {
149
+ throw new Error('marketId is required')
150
+ }
151
+
152
+ const provider = this.getProviderForMarket(params.marketId)
153
+
154
+ return provider.getPosition(
81
155
  this.wallet.address,
82
156
  params.marketId,
83
157
  params.asset,
@@ -86,13 +160,17 @@ export class WalletLendNamespace<
86
160
 
87
161
  /**
88
162
  * Close a lending position (withdraw from market)
89
- * @param closePositionParams - Position closing parameters
90
- * @returns Promise resolving to transaction hash
163
+ * @param params - Position closing parameters
164
+ * @param params.marketId - Market identifier to close position in
165
+ * @param params.amount - Amount to withdraw
166
+ * @returns Promise resolving to transaction receipt
91
167
  */
92
168
  async closePosition(
93
169
  params: ClosePositionParams,
94
170
  ): Promise<LendTransactionReceipt> {
95
- const closeTransaction = await this.provider.closePosition({
171
+ const provider = this.getProviderForMarket(params.marketId)
172
+
173
+ const closeTransaction = await provider.closePosition({
96
174
  ...params,
97
175
  walletAddress: this.wallet.address,
98
176
  })
@@ -104,6 +182,14 @@ export class WalletLendNamespace<
104
182
  )
105
183
  }
106
184
 
185
+ // If both approval and closePosition are present, batch them
186
+ if (transactionData.approval && transactionData.closePosition) {
187
+ return await this.wallet.sendBatch(
188
+ [transactionData.approval, transactionData.closePosition],
189
+ params.marketId.chainId,
190
+ )
191
+ }
192
+
107
193
  if (!transactionData.closePosition) {
108
194
  throw new Error('No closePosition transaction data returned')
109
195
  }
@@ -7,19 +7,36 @@ import type { LendProvider } from '@/types/lend/index.js'
7
7
 
8
8
  describe('ActionsLendNamespace', () => {
9
9
  let mockProvider: LendProvider
10
+ let mockMarketId: { address: any; chainId: 130 }
10
11
 
11
12
  beforeEach(() => {
12
- mockProvider = createMockLendProvider()
13
+ mockMarketId = { address: getRandomAddress(), chainId: 130 as const }
14
+
15
+ mockProvider = createMockLendProvider({
16
+ marketAllowlist: [
17
+ {
18
+ address: mockMarketId.address,
19
+ chainId: mockMarketId.chainId,
20
+ name: 'Test Market',
21
+ asset: {
22
+ address: { 130: getRandomAddress() },
23
+ metadata: { symbol: 'USDC', name: 'USD Coin', decimals: 6 },
24
+ type: 'erc20' as const,
25
+ },
26
+ lendProvider: 'morpho',
27
+ },
28
+ ],
29
+ })
13
30
  })
14
31
 
15
32
  it('should create an instance with a lend provider', () => {
16
- const namespace = new ActionsLendNamespace(mockProvider)
33
+ const namespace = new ActionsLendNamespace({ morpho: mockProvider as any })
17
34
 
18
35
  expect(namespace).toBeInstanceOf(ActionsLendNamespace)
19
36
  })
20
37
 
21
38
  it('should delegate getMarkets to provider', async () => {
22
- const namespace = new ActionsLendNamespace(mockProvider)
39
+ const namespace = new ActionsLendNamespace({ morpho: mockProvider as any })
23
40
  const spy = vi.spyOn(mockProvider, 'getMarkets')
24
41
 
25
42
  await namespace.getMarkets()
@@ -28,31 +45,20 @@ describe('ActionsLendNamespace', () => {
28
45
  })
29
46
 
30
47
  it('should delegate getMarket to provider with correct parameters', async () => {
31
- const namespace = new ActionsLendNamespace(mockProvider)
32
- const marketId = getRandomAddress()
33
- const chainId = 130 as const
48
+ const namespace = new ActionsLendNamespace({ morpho: mockProvider as any })
34
49
  const spy = vi.spyOn(mockProvider, 'getMarket')
35
50
 
36
- await namespace.getMarket({ address: marketId, chainId })
51
+ await namespace.getMarket(mockMarketId)
37
52
 
38
- expect(spy).toHaveBeenCalledWith({ address: marketId, chainId })
53
+ expect(spy).toHaveBeenCalledWith(mockMarketId)
39
54
  })
40
55
 
41
56
  it('should delegate supportedChainIds to provider', () => {
42
- const namespace = new ActionsLendNamespace(mockProvider)
57
+ const namespace = new ActionsLendNamespace({ morpho: mockProvider as any })
43
58
  const spy = vi.spyOn(mockProvider, 'supportedChainIds')
44
59
 
45
60
  namespace.supportedChainIds()
46
61
 
47
62
  expect(spy).toHaveBeenCalledOnce()
48
63
  })
49
-
50
- it('should provide access to provider config', () => {
51
- const namespace = new ActionsLendNamespace(mockProvider)
52
-
53
- const config = namespace.config
54
-
55
- expect(config).toBeDefined()
56
- expect(config.defaultSlippage || 50).toBe(50)
57
- })
58
64
  })