@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.
- package/dist/actions.d.ts +19 -7
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +49 -19
- package/dist/actions.js.map +1 -1
- package/dist/actions.test.js +51 -81
- package/dist/actions.test.js.map +1 -1
- package/dist/constants/assets.d.ts.map +1 -1
- package/dist/constants/assets.js +2 -1
- package/dist/constants/assets.js.map +1 -1
- package/dist/constants/supportedChains.d.ts +1 -1
- package/dist/constants/supportedChains.d.ts.map +1 -1
- package/dist/constants/supportedChains.js +2 -1
- package/dist/constants/supportedChains.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lend/core/LendProvider.d.ts +3 -2
- package/dist/lend/core/LendProvider.d.ts.map +1 -1
- package/dist/lend/core/LendProvider.js.map +1 -1
- package/dist/lend/core/__tests__/LendProvider.test.js +18 -48
- package/dist/lend/core/__tests__/LendProvider.test.js.map +1 -1
- package/dist/lend/index.d.ts +1 -0
- package/dist/lend/index.d.ts.map +1 -1
- package/dist/lend/index.js +1 -0
- package/dist/lend/index.js.map +1 -1
- package/dist/lend/namespaces/ActionsLendNamespace.d.ts +35 -8
- package/dist/lend/namespaces/ActionsLendNamespace.d.ts.map +1 -1
- package/dist/lend/namespaces/ActionsLendNamespace.js +45 -8
- package/dist/lend/namespaces/ActionsLendNamespace.js.map +1 -1
- package/dist/lend/namespaces/WalletLendNamespace.d.ts +43 -10
- package/dist/lend/namespaces/WalletLendNamespace.d.ts.map +1 -1
- package/dist/lend/namespaces/WalletLendNamespace.js +67 -13
- package/dist/lend/namespaces/WalletLendNamespace.js.map +1 -1
- package/dist/lend/namespaces/__tests__/ActionsLendNamespace.spec.js +23 -15
- package/dist/lend/namespaces/__tests__/ActionsLendNamespace.spec.js.map +1 -1
- package/dist/lend/namespaces/__tests__/WalletLendNamespace.spec.js +29 -11
- package/dist/lend/namespaces/__tests__/WalletLendNamespace.spec.js.map +1 -1
- package/dist/lend/providers/aave/AaveLendProvider.d.ts +82 -0
- package/dist/lend/providers/aave/AaveLendProvider.d.ts.map +1 -0
- package/dist/lend/providers/aave/AaveLendProvider.js +346 -0
- package/dist/lend/providers/aave/AaveLendProvider.js.map +1 -0
- package/dist/lend/providers/aave/addresses.d.ts +57 -0
- package/dist/lend/providers/aave/addresses.d.ts.map +1 -0
- package/dist/lend/providers/aave/addresses.js +83 -0
- package/dist/lend/providers/aave/addresses.js.map +1 -0
- package/dist/lend/providers/aave/sdk.d.ts +57 -0
- package/dist/lend/providers/aave/sdk.d.ts.map +1 -0
- package/dist/lend/providers/aave/sdk.js +260 -0
- package/dist/lend/providers/aave/sdk.js.map +1 -0
- package/dist/lend/providers/morpho/MorphoLendProvider.d.ts +4 -3
- package/dist/lend/providers/morpho/MorphoLendProvider.d.ts.map +1 -1
- package/dist/lend/providers/morpho/MorphoLendProvider.js +2 -2
- package/dist/lend/providers/morpho/MorphoLendProvider.js.map +1 -1
- package/dist/lend/providers/morpho/__tests__/MorphoLendProvider.test.js +1 -33
- package/dist/lend/providers/morpho/__tests__/MorphoLendProvider.test.js.map +1 -1
- package/dist/lend/providers/morpho/__tests__/sdk.test.js +1 -0
- package/dist/lend/providers/morpho/__tests__/sdk.test.js.map +1 -1
- package/dist/lend/providers/morpho/sdk.d.ts +4 -3
- package/dist/lend/providers/morpho/sdk.d.ts.map +1 -1
- package/dist/lend/providers/morpho/sdk.js +0 -1
- package/dist/lend/providers/morpho/sdk.js.map +1 -1
- package/dist/services/ChainManager.d.ts +1 -1
- package/dist/supported/tokens.d.ts.map +1 -1
- package/dist/supported/tokens.js +18 -2
- package/dist/supported/tokens.js.map +1 -1
- package/dist/test/MockLendProvider.d.ts +5 -4
- package/dist/test/MockLendProvider.d.ts.map +1 -1
- package/dist/test/MockLendProvider.js +5 -5
- package/dist/test/MockLendProvider.js.map +1 -1
- package/dist/test/MockPrivyClient.d.ts +10 -49
- package/dist/test/MockPrivyClient.d.ts.map +1 -1
- package/dist/test/MockPrivyClient.js +13 -72
- package/dist/test/MockPrivyClient.js.map +1 -1
- package/dist/types/actions.d.ts +26 -2
- package/dist/types/actions.d.ts.map +1 -1
- package/dist/types/lend/base.d.ts +6 -19
- package/dist/types/lend/base.d.ts.map +1 -1
- package/dist/wallet/core/namespace/WalletNamespace.d.ts +13 -13
- package/dist/wallet/core/namespace/WalletNamespace.d.ts.map +1 -1
- package/dist/wallet/core/namespace/WalletNamespace.js +13 -13
- package/dist/wallet/core/namespace/WalletNamespace.js.map +1 -1
- package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js +64 -42
- package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js.map +1 -1
- package/dist/wallet/core/providers/__tests__/WalletProvider.spec.js +51 -23
- package/dist/wallet/core/providers/__tests__/WalletProvider.spec.js.map +1 -1
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts +12 -3
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js +3 -2
- package/dist/wallet/core/providers/hosted/abstract/HostedWalletProvider.js.map +1 -1
- package/dist/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.js +14 -4
- package/dist/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.js.map +1 -1
- package/dist/wallet/core/providers/hosted/types/index.d.ts +8 -2
- package/dist/wallet/core/providers/hosted/types/index.d.ts.map +1 -1
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts +14 -6
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.d.ts.map +1 -1
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js +10 -6
- package/dist/wallet/core/providers/smart/default/DefaultSmartWalletProvider.js.map +1 -1
- package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js +36 -13
- package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js.map +1 -1
- package/dist/wallet/core/wallets/abstract/Wallet.d.ts +19 -7
- package/dist/wallet/core/wallets/abstract/Wallet.d.ts.map +1 -1
- package/dist/wallet/core/wallets/abstract/Wallet.js +9 -7
- package/dist/wallet/core/wallets/abstract/Wallet.js.map +1 -1
- package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts +9 -3
- package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.d.ts.map +1 -1
- package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js +4 -4
- package/dist/wallet/core/wallets/smart/default/DefaultSmartWallet.js.map +1 -1
- package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js +1 -1
- package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js.map +1 -1
- package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +24 -4
- package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js +21 -6
- package/dist/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +34 -14
- package/dist/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.d.ts.map +1 -1
- package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js +10 -4
- package/dist/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.js.map +1 -1
- package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js +9 -1
- package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js.map +1 -1
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +9 -2
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +6 -3
- package/dist/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js +4 -3
- package/dist/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/node/providers/hosted/types/index.d.ts +6 -1
- package/dist/wallet/node/providers/hosted/types/index.d.ts.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts +19 -7
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js +13 -7
- package/dist/wallet/node/wallets/hosted/privy/PrivyWallet.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.js +26 -28
- package/dist/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.js +12 -12
- package/dist/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/utils/createSigner.d.ts +6 -2
- package/dist/wallet/node/wallets/hosted/privy/utils/createSigner.d.ts.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/utils/createSigner.js +10 -7
- package/dist/wallet/node/wallets/hosted/privy/utils/createSigner.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts +8 -2
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
- package/dist/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts +6 -2
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js +3 -3
- package/dist/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.js.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js +19 -7
- package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts +6 -2
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js +3 -3
- package/dist/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +7 -3
- package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts +6 -2
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js +3 -3
- package/dist/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.js.map +1 -1
- package/dist/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js +6 -3
- package/dist/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js +6 -6
- package/dist/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts +6 -2
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.d.ts.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js +3 -3
- package/dist/wallet/react/wallets/hosted/dynamic/DynamicWallet.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts +6 -0
- package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.d.ts.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts +6 -2
- package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.d.ts.map +1 -1
- package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js +3 -3
- package/dist/wallet/react/wallets/hosted/privy/PrivyWallet.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts +6 -2
- package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.d.ts.map +1 -1
- package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js +2 -2
- package/dist/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.js.map +1 -1
- package/package.json +5 -2
- package/src/actions.test.ts +55 -96
- package/src/actions.ts +82 -26
- package/src/constants/assets.ts +8 -1
- package/src/constants/supportedChains.ts +8 -1
- package/src/index.ts +1 -2
- package/src/lend/core/LendProvider.ts +6 -5
- package/src/lend/core/__tests__/LendProvider.test.ts +19 -61
- package/src/lend/index.ts +1 -0
- package/src/lend/namespaces/ActionsLendNamespace.ts +77 -13
- package/src/lend/namespaces/WalletLendNamespace.ts +106 -20
- package/src/lend/namespaces/__tests__/ActionsLendNamespace.spec.ts +24 -18
- package/src/lend/namespaces/__tests__/WalletLendNamespace.spec.ts +49 -11
- package/src/lend/providers/aave/AaveLendProvider.ts +463 -0
- package/src/lend/providers/aave/addresses.ts +95 -0
- package/src/lend/providers/aave/sdk.ts +369 -0
- package/src/lend/providers/morpho/MorphoLendProvider.ts +5 -5
- package/src/lend/providers/morpho/__tests__/MorphoLendProvider.test.ts +5 -53
- package/src/lend/providers/morpho/__tests__/sdk.test.ts +1 -0
- package/src/lend/providers/morpho/sdk.ts +3 -4
- package/src/supported/tokens.ts +24 -2
- package/src/test/MockLendProvider.ts +9 -9
- package/src/test/MockPrivyClient.ts +24 -91
- package/src/types/actions.ts +30 -2
- package/src/types/lend/base.ts +6 -22
- package/src/wallet/core/namespace/WalletNamespace.ts +13 -13
- package/src/wallet/core/namespace/__tests__/WalletNamespace.spec.ts +69 -70
- package/src/wallet/core/providers/__tests__/WalletProvider.spec.ts +55 -47
- package/src/wallet/core/providers/hosted/abstract/HostedWalletProvider.ts +15 -4
- package/src/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.ts +20 -7
- package/src/wallet/core/providers/hosted/types/index.ts +8 -2
- package/src/wallet/core/providers/smart/default/DefaultSmartWalletProvider.ts +24 -9
- package/src/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.ts +38 -46
- package/src/wallet/core/wallets/abstract/Wallet.ts +25 -17
- package/src/wallet/core/wallets/smart/default/DefaultSmartWallet.ts +17 -10
- package/src/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.ts +4 -7
- package/src/wallet/node/providers/hosted/privy/PrivyHostedWalletProvider.ts +37 -11
- package/src/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +43 -24
- package/src/wallet/node/providers/hosted/registry/NodeHostedWalletProviderRegistry.ts +10 -7
- package/src/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.ts +17 -2
- package/src/wallet/node/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +13 -4
- package/src/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.ts +4 -4
- package/src/wallet/node/providers/hosted/types/index.ts +9 -2
- package/src/wallet/node/wallets/hosted/privy/PrivyWallet.ts +31 -11
- package/src/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.ts +35 -40
- package/src/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.ts +18 -14
- package/src/wallet/node/wallets/hosted/privy/utils/createSigner.ts +11 -9
- package/src/wallet/node/wallets/hosted/turnkey/TurnkeyWallet.ts +16 -5
- package/src/wallet/react/providers/hosted/dynamic/DynamicHostedWalletProvider.ts +8 -4
- package/src/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.ts +25 -14
- package/src/wallet/react/providers/hosted/privy/PrivyHostedWalletProvider.ts +8 -4
- package/src/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +7 -7
- package/src/wallet/react/providers/hosted/turnkey/TurnkeyHostedWalletProvider.ts +8 -4
- package/src/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.ts +6 -7
- package/src/wallet/react/providers/registry/ReactHostedWalletProviderRegistry.ts +6 -6
- package/src/wallet/react/wallets/hosted/dynamic/DynamicWallet.ts +12 -5
- package/src/wallet/react/wallets/hosted/dynamic/__mocks__/DynamicWalletMock.ts +6 -0
- package/src/wallet/react/wallets/hosted/privy/PrivyWallet.ts +12 -5
- package/src/wallet/react/wallets/hosted/turnkey/TurnkeyWallet.ts +12 -5
- package/dist/constants/config.d.ts +0 -10
- package/dist/constants/config.d.ts.map +0 -1
- package/dist/constants/config.js +0 -10
- package/dist/constants/config.js.map +0 -1
- package/src/constants/config.ts +0 -9
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { UiPoolDataProvider } from '@aave/contract-helpers'
|
|
2
|
+
import { formatReserves } from '@aave/math-utils'
|
|
3
|
+
import { providers } from 'ethers'
|
|
4
|
+
import type { Address } from 'viem'
|
|
5
|
+
import { base, baseSepolia, optimism, optimismSepolia } from 'viem/chains'
|
|
6
|
+
|
|
7
|
+
import type { SUPPORTED_CHAIN_IDS } from '@/constants/supportedChains.js'
|
|
8
|
+
import { getPoolAddress } from '@/lend/providers/aave/addresses.js'
|
|
9
|
+
import type { ChainManager } from '@/services/ChainManager.js'
|
|
10
|
+
import type { LendProviderConfig } from '@/types/actions.js'
|
|
11
|
+
import type {
|
|
12
|
+
ApyBreakdown,
|
|
13
|
+
LendMarket,
|
|
14
|
+
LendMarketConfig,
|
|
15
|
+
LendMarketId,
|
|
16
|
+
} from '@/types/lend/index.js'
|
|
17
|
+
import { getAssetAddress } from '@/utils/assets.js'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* UI Pool Data Provider addresses for each chain
|
|
21
|
+
* @description Contract addresses for UiPoolDataProvider on each supported chain
|
|
22
|
+
*/
|
|
23
|
+
const UI_POOL_DATA_PROVIDER_ADDRESSES: Record<number, Address> = {
|
|
24
|
+
[optimism.id]: '0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654',
|
|
25
|
+
[base.id]: '0xd82a47fdebB5bf5329b09441C3DaB4b5df2153Ad',
|
|
26
|
+
[optimismSepolia.id]: '0x86E2938daE289763D4e09a7e42c5cCcA62Cf9809',
|
|
27
|
+
[baseSepolia.id]: '0xBc9f5b7E248451CdD7cA54e717a2BFe1F32b566b',
|
|
28
|
+
} as const
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Pool Addresses Provider addresses for each chain
|
|
32
|
+
*/
|
|
33
|
+
const POOL_ADDRESSES_PROVIDER: Record<number, Address> = {
|
|
34
|
+
[optimism.id]: '0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb',
|
|
35
|
+
[base.id]: '0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D',
|
|
36
|
+
[optimismSepolia.id]: '0x36616cf17557639614c1cdDb356b1B83fc0B2132',
|
|
37
|
+
[baseSepolia.id]: '0xE4C23309117Aa30342BFaae6c95c6478e0A4Ad00',
|
|
38
|
+
} as const
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Parameters for getReserve function
|
|
42
|
+
*/
|
|
43
|
+
interface GetReserveParams {
|
|
44
|
+
/** Market identifier (asset address and chainId) */
|
|
45
|
+
marketId: LendMarketId
|
|
46
|
+
/** Chain manager instance */
|
|
47
|
+
chainManager: ChainManager
|
|
48
|
+
/** Lend configuration containing market allowlist */
|
|
49
|
+
lendConfig?: LendProviderConfig
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Parameters for getReserves function
|
|
54
|
+
*/
|
|
55
|
+
interface GetReservesParams {
|
|
56
|
+
chainManager: ChainManager
|
|
57
|
+
lendConfig: LendProviderConfig
|
|
58
|
+
markets: LendMarketConfig[]
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Find market configuration in allowlist
|
|
63
|
+
* @param marketAllowlist - Array of allowed market configurations
|
|
64
|
+
* @param marketId - Market identifier to find
|
|
65
|
+
* @returns Market configuration if found, undefined otherwise
|
|
66
|
+
*/
|
|
67
|
+
function findMarketInAllowlist(
|
|
68
|
+
marketAllowlist: LendMarketConfig[],
|
|
69
|
+
marketId: LendMarketId,
|
|
70
|
+
): LendMarketConfig | undefined {
|
|
71
|
+
return marketAllowlist.find(
|
|
72
|
+
(config) =>
|
|
73
|
+
config.address.toLowerCase() === marketId.address.toLowerCase() &&
|
|
74
|
+
config.chainId === marketId.chainId,
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Calculate APY breakdown from reserve data
|
|
80
|
+
* @param reserve - Formatted reserve data from Aave
|
|
81
|
+
* @returns APY breakdown with native APY and rewards
|
|
82
|
+
*/
|
|
83
|
+
export function calculateApyBreakdown(reserve: {
|
|
84
|
+
formattedReserve?: any
|
|
85
|
+
}): ApyBreakdown {
|
|
86
|
+
// Get supply APY from formatted reserve data
|
|
87
|
+
const supplyApy = reserve.formattedReserve?.supplyAPY
|
|
88
|
+
? parseFloat(reserve.formattedReserve.supplyAPY)
|
|
89
|
+
: 0
|
|
90
|
+
|
|
91
|
+
// Aave doesn't have vault-style performance fees
|
|
92
|
+
// Total APY = Supply APY + any rewards (to be added later)
|
|
93
|
+
return {
|
|
94
|
+
total: supplyApy,
|
|
95
|
+
native: supplyApy,
|
|
96
|
+
totalRewards: 0, // TODO: Fetch from incentives data provider if needed
|
|
97
|
+
performanceFee: 0, // Aave doesn't have performance fees
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Get detailed reserve (market) information from Aave
|
|
103
|
+
* @param params - Named parameters object
|
|
104
|
+
* @returns Promise resolving to detailed market information
|
|
105
|
+
*/
|
|
106
|
+
export async function getReserve(
|
|
107
|
+
params: GetReserveParams,
|
|
108
|
+
): Promise<LendMarket> {
|
|
109
|
+
// Find market configuration in allowlist for metadata
|
|
110
|
+
const marketConfig = params.lendConfig?.marketAllowlist
|
|
111
|
+
? findMarketInAllowlist(params.lendConfig.marketAllowlist, params.marketId)
|
|
112
|
+
: undefined
|
|
113
|
+
|
|
114
|
+
if (!marketConfig) {
|
|
115
|
+
throw new Error(
|
|
116
|
+
`Market ${params.marketId.address} on chain ${params.marketId.chainId} not found in allowlist`,
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const poolAddress = getPoolAddress(params.marketId.chainId)
|
|
121
|
+
if (!poolAddress) {
|
|
122
|
+
throw new Error(`Aave V3 not deployed on chain ${params.marketId.chainId}`)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const uiPoolDataProviderAddress =
|
|
126
|
+
UI_POOL_DATA_PROVIDER_ADDRESSES[params.marketId.chainId]
|
|
127
|
+
const poolAddressesProvider = POOL_ADDRESSES_PROVIDER[params.marketId.chainId]
|
|
128
|
+
|
|
129
|
+
if (!uiPoolDataProviderAddress || !poolAddressesProvider) {
|
|
130
|
+
throw new Error(
|
|
131
|
+
`UiPoolDataProvider not configured for chain ${params.marketId.chainId}`,
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
try {
|
|
136
|
+
// Get viem public client for this chain
|
|
137
|
+
const publicClient = params.chainManager.getPublicClient(
|
|
138
|
+
params.marketId.chainId,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
// Create ethers provider from viem's RPC URL
|
|
142
|
+
// Aave SDK requires ethers provider, not viem
|
|
143
|
+
const rpcUrl =
|
|
144
|
+
publicClient.chain?.rpcUrls.default.http[0] ||
|
|
145
|
+
publicClient.chain?.rpcUrls.public?.http[0]
|
|
146
|
+
if (!rpcUrl) {
|
|
147
|
+
throw new Error(
|
|
148
|
+
`No RPC URL available for chain ${params.marketId.chainId}`,
|
|
149
|
+
)
|
|
150
|
+
}
|
|
151
|
+
const ethersProvider = new providers.JsonRpcProvider(rpcUrl)
|
|
152
|
+
|
|
153
|
+
// Create UiPoolDataProvider instance
|
|
154
|
+
const uiPoolDataProvider = new UiPoolDataProvider({
|
|
155
|
+
uiPoolDataProviderAddress,
|
|
156
|
+
provider: ethersProvider,
|
|
157
|
+
chainId: params.marketId.chainId,
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
// Fetch reserve data
|
|
161
|
+
const reservesData = await uiPoolDataProvider.getReservesHumanized({
|
|
162
|
+
lendingPoolAddressProvider: poolAddressesProvider,
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
// Find the specific reserve for this asset
|
|
166
|
+
const assetAddress = getAssetAddress(
|
|
167
|
+
marketConfig.asset,
|
|
168
|
+
params.marketId.chainId,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
const reserve = reservesData.reservesData.find(
|
|
172
|
+
(r) => r.underlyingAsset.toLowerCase() === assetAddress.toLowerCase(),
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
if (!reserve) {
|
|
176
|
+
throw new Error(
|
|
177
|
+
`Reserve not found for asset ${assetAddress} on chain ${params.marketId.chainId}`,
|
|
178
|
+
)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Format reserves using Aave math-utils
|
|
182
|
+
const currentTimestamp = Math.floor(Date.now() / 1000)
|
|
183
|
+
const formattedReserves = formatReserves({
|
|
184
|
+
reserves: [reserve],
|
|
185
|
+
currentTimestamp,
|
|
186
|
+
marketReferenceCurrencyDecimals:
|
|
187
|
+
reservesData.baseCurrencyData.marketReferenceCurrencyDecimals,
|
|
188
|
+
marketReferencePriceInUsd:
|
|
189
|
+
reservesData.baseCurrencyData.marketReferenceCurrencyPriceInUsd,
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
const formattedReserve = formattedReserves[0]
|
|
193
|
+
|
|
194
|
+
// Calculate APY breakdown
|
|
195
|
+
const apy = calculateApyBreakdown({
|
|
196
|
+
...reserve,
|
|
197
|
+
formattedReserve,
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
// Return market information in our standard format
|
|
201
|
+
return {
|
|
202
|
+
marketId: params.marketId,
|
|
203
|
+
name: marketConfig.name,
|
|
204
|
+
asset: marketConfig.asset,
|
|
205
|
+
supply: {
|
|
206
|
+
totalAssets: BigInt(reserve.availableLiquidity),
|
|
207
|
+
totalShares: BigInt(reserve.totalScaledVariableDebt || '0'),
|
|
208
|
+
},
|
|
209
|
+
apy,
|
|
210
|
+
metadata: {
|
|
211
|
+
owner: poolAddress, // Use Pool as owner
|
|
212
|
+
curator: poolAddress, // No curator in Aave
|
|
213
|
+
fee: 0, // No performance fee in Aave
|
|
214
|
+
lastUpdate: currentTimestamp,
|
|
215
|
+
},
|
|
216
|
+
}
|
|
217
|
+
} catch (error) {
|
|
218
|
+
throw new Error(
|
|
219
|
+
`Failed to get reserve info for ${params.marketId.address}: ${
|
|
220
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
221
|
+
}`,
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Get multiple reserves (markets)
|
|
228
|
+
* @param params - Parameters including markets to fetch
|
|
229
|
+
* @returns Promise resolving to array of market information
|
|
230
|
+
*/
|
|
231
|
+
export async function getReserves(
|
|
232
|
+
params: GetReservesParams,
|
|
233
|
+
): Promise<LendMarket[]> {
|
|
234
|
+
try {
|
|
235
|
+
const reservePromises = params.markets.map((marketConfig) => {
|
|
236
|
+
return getReserve({
|
|
237
|
+
marketId: {
|
|
238
|
+
address: marketConfig.address,
|
|
239
|
+
chainId: marketConfig.chainId,
|
|
240
|
+
},
|
|
241
|
+
chainManager: params.chainManager,
|
|
242
|
+
lendConfig: params.lendConfig,
|
|
243
|
+
})
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
return await Promise.all(reservePromises)
|
|
247
|
+
} catch (error) {
|
|
248
|
+
throw new Error(
|
|
249
|
+
`Failed to get reserves: ${
|
|
250
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
251
|
+
}`,
|
|
252
|
+
)
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Aave V3 Pool ABI for getReserveData
|
|
258
|
+
* @description Minimal ABI for querying reserve data from Aave V3 Pool
|
|
259
|
+
*/
|
|
260
|
+
const POOL_GET_RESERVE_DATA_ABI = [
|
|
261
|
+
{
|
|
262
|
+
inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],
|
|
263
|
+
name: 'getReserveData',
|
|
264
|
+
outputs: [
|
|
265
|
+
{
|
|
266
|
+
components: [
|
|
267
|
+
{ name: 'data', type: 'uint256', internalType: 'uint256' },
|
|
268
|
+
],
|
|
269
|
+
name: 'configuration',
|
|
270
|
+
type: 'tuple',
|
|
271
|
+
internalType: 'struct DataTypes.ReserveConfigurationMap',
|
|
272
|
+
},
|
|
273
|
+
{ name: 'liquidityIndex', type: 'uint128', internalType: 'uint128' },
|
|
274
|
+
{
|
|
275
|
+
name: 'currentLiquidityRate',
|
|
276
|
+
type: 'uint128',
|
|
277
|
+
internalType: 'uint128',
|
|
278
|
+
},
|
|
279
|
+
{ name: 'variableBorrowIndex', type: 'uint128', internalType: 'uint128' },
|
|
280
|
+
{
|
|
281
|
+
name: 'currentVariableBorrowRate',
|
|
282
|
+
type: 'uint128',
|
|
283
|
+
internalType: 'uint128',
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
name: 'currentStableBorrowRate',
|
|
287
|
+
type: 'uint128',
|
|
288
|
+
internalType: 'uint128',
|
|
289
|
+
},
|
|
290
|
+
{ name: 'lastUpdateTimestamp', type: 'uint40', internalType: 'uint40' },
|
|
291
|
+
{ name: 'id', type: 'uint16', internalType: 'uint16' },
|
|
292
|
+
{ name: 'aTokenAddress', type: 'address', internalType: 'address' },
|
|
293
|
+
{
|
|
294
|
+
name: 'stableDebtTokenAddress',
|
|
295
|
+
type: 'address',
|
|
296
|
+
internalType: 'address',
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
name: 'variableDebtTokenAddress',
|
|
300
|
+
type: 'address',
|
|
301
|
+
internalType: 'address',
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
name: 'interestRateStrategyAddress',
|
|
305
|
+
type: 'address',
|
|
306
|
+
internalType: 'address',
|
|
307
|
+
},
|
|
308
|
+
{ name: 'accruedToTreasury', type: 'uint128', internalType: 'uint128' },
|
|
309
|
+
{ name: 'unbacked', type: 'uint128', internalType: 'uint128' },
|
|
310
|
+
{
|
|
311
|
+
name: 'isolationModeTotalDebt',
|
|
312
|
+
type: 'uint128',
|
|
313
|
+
internalType: 'uint128',
|
|
314
|
+
},
|
|
315
|
+
],
|
|
316
|
+
stateMutability: 'view',
|
|
317
|
+
type: 'function',
|
|
318
|
+
},
|
|
319
|
+
] as const
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Get aToken address for a given underlying asset
|
|
323
|
+
* @param params - Parameters including asset address, chain ID, and chain manager
|
|
324
|
+
* @returns Promise resolving to aToken address
|
|
325
|
+
* @description Queries the Aave Pool to get the aToken address for the underlying asset
|
|
326
|
+
*/
|
|
327
|
+
export async function getATokenAddress(params: {
|
|
328
|
+
underlyingAsset: Address
|
|
329
|
+
chainId: (typeof SUPPORTED_CHAIN_IDS)[number]
|
|
330
|
+
chainManager: ChainManager
|
|
331
|
+
}): Promise<Address> {
|
|
332
|
+
const poolAddress = getPoolAddress(params.chainId)
|
|
333
|
+
if (!poolAddress) {
|
|
334
|
+
throw new Error(`Aave V3 not deployed on chain ${params.chainId}`)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
try {
|
|
338
|
+
// Get viem public client for this chain
|
|
339
|
+
const publicClient = params.chainManager.getPublicClient(params.chainId)
|
|
340
|
+
|
|
341
|
+
// Query the Pool contract directly for reserve data
|
|
342
|
+
const reserveData = await publicClient.readContract({
|
|
343
|
+
address: poolAddress,
|
|
344
|
+
abi: POOL_GET_RESERVE_DATA_ABI,
|
|
345
|
+
functionName: 'getReserveData',
|
|
346
|
+
args: [params.underlyingAsset],
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
// The return is a tuple where index 8 is aTokenAddress
|
|
350
|
+
const aTokenAddress = reserveData[8]
|
|
351
|
+
|
|
352
|
+
if (
|
|
353
|
+
!aTokenAddress ||
|
|
354
|
+
aTokenAddress === '0x0000000000000000000000000000000000000000'
|
|
355
|
+
) {
|
|
356
|
+
throw new Error(
|
|
357
|
+
`No aToken found for asset ${params.underlyingAsset} on chain ${params.chainId}`,
|
|
358
|
+
)
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
return aTokenAddress
|
|
362
|
+
} catch (error) {
|
|
363
|
+
throw new Error(
|
|
364
|
+
`Failed to get aToken address for ${params.underlyingAsset}: ${
|
|
365
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
366
|
+
}`,
|
|
367
|
+
)
|
|
368
|
+
}
|
|
369
|
+
}
|
|
@@ -6,6 +6,7 @@ import { SUPPORTED_CHAIN_IDS as ACTIONS_SUPPORTED_CHAIN_IDS } from '@/constants/
|
|
|
6
6
|
import { LendProvider } from '@/lend/core/LendProvider.js'
|
|
7
7
|
import { getVault, getVaults } from '@/lend/providers/morpho/sdk.js'
|
|
8
8
|
import type { ChainManager } from '@/services/ChainManager.js'
|
|
9
|
+
import type { LendProviderConfig } from '@/types/actions.js'
|
|
9
10
|
import type {
|
|
10
11
|
GetLendMarketsParams,
|
|
11
12
|
GetMarketBalanceParams,
|
|
@@ -15,7 +16,6 @@ import type {
|
|
|
15
16
|
LendMarketPosition,
|
|
16
17
|
LendOpenPositionInternalParams,
|
|
17
18
|
LendTransaction,
|
|
18
|
-
MorphoLendConfig,
|
|
19
19
|
} from '@/types/lend/index.js'
|
|
20
20
|
import { getAssetAddress } from '@/utils/assets.js'
|
|
21
21
|
|
|
@@ -36,7 +36,7 @@ export const SUPPORTED_CHAIN_IDS = [
|
|
|
36
36
|
* Morpho lending provider implementation
|
|
37
37
|
* @description Lending provider implementation using Morpho protocol
|
|
38
38
|
*/
|
|
39
|
-
export class MorphoLendProvider extends LendProvider<
|
|
39
|
+
export class MorphoLendProvider extends LendProvider<LendProviderConfig> {
|
|
40
40
|
protected readonly SUPPORTED_CHAIN_IDS = SUPPORTED_CHAIN_IDS
|
|
41
41
|
|
|
42
42
|
private chainManager: ChainManager
|
|
@@ -46,7 +46,7 @@ export class MorphoLendProvider extends LendProvider<MorphoLendConfig> {
|
|
|
46
46
|
* @param config - Morpho lending configuration
|
|
47
47
|
* @param chainManager - Chain manager for blockchain interactions
|
|
48
48
|
*/
|
|
49
|
-
constructor(config:
|
|
49
|
+
constructor(config: LendProviderConfig, chainManager: ChainManager) {
|
|
50
50
|
super(config)
|
|
51
51
|
this.chainManager = chainManager
|
|
52
52
|
}
|
|
@@ -102,7 +102,7 @@ export class MorphoLendProvider extends LendProvider<MorphoLendConfig> {
|
|
|
102
102
|
value: 0n,
|
|
103
103
|
},
|
|
104
104
|
},
|
|
105
|
-
slippage: params.options?.slippage
|
|
105
|
+
slippage: params.options?.slippage ?? 50,
|
|
106
106
|
}
|
|
107
107
|
} catch (error) {
|
|
108
108
|
throw new Error(
|
|
@@ -155,7 +155,7 @@ export class MorphoLendProvider extends LendProvider<MorphoLendConfig> {
|
|
|
155
155
|
value: 0n,
|
|
156
156
|
},
|
|
157
157
|
},
|
|
158
|
-
slippage: params.options?.slippage
|
|
158
|
+
slippage: params.options?.slippage ?? 50,
|
|
159
159
|
}
|
|
160
160
|
} catch (error) {
|
|
161
161
|
throw new Error(
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
MockReceiverAddress,
|
|
11
11
|
MockWETHMarket,
|
|
12
12
|
} from '@/test/MockMarkets.js'
|
|
13
|
-
import type {
|
|
13
|
+
import type { LendProviderConfig } from '@/types/actions.js'
|
|
14
14
|
|
|
15
15
|
// Mock the Morpho SDK modules
|
|
16
16
|
vi.mock('@morpho-org/blue-sdk-viem', () => ({
|
|
@@ -36,13 +36,11 @@ vi.mock('@morpho-org/bundler-sdk-viem', () => ({
|
|
|
36
36
|
|
|
37
37
|
describe('MorphoLendProvider', () => {
|
|
38
38
|
let provider: MorphoLendProvider
|
|
39
|
-
let mockConfig:
|
|
39
|
+
let mockConfig: LendProviderConfig
|
|
40
40
|
let mockChainManager: ChainManager
|
|
41
41
|
|
|
42
42
|
beforeEach(() => {
|
|
43
43
|
mockConfig = {
|
|
44
|
-
provider: 'morpho',
|
|
45
|
-
defaultSlippage: 50,
|
|
46
44
|
marketAllowlist: [MockGauntletUSDCMarket, MockWETHMarket],
|
|
47
45
|
}
|
|
48
46
|
|
|
@@ -55,18 +53,6 @@ describe('MorphoLendProvider', () => {
|
|
|
55
53
|
it('should initialize with provided config', () => {
|
|
56
54
|
expect(provider).toBeInstanceOf(MorphoLendProvider)
|
|
57
55
|
})
|
|
58
|
-
|
|
59
|
-
it('should use default slippage when not provided', () => {
|
|
60
|
-
const configWithoutSlippage = {
|
|
61
|
-
...mockConfig,
|
|
62
|
-
defaultSlippage: undefined,
|
|
63
|
-
}
|
|
64
|
-
const providerWithDefaults = new MorphoLendProvider(
|
|
65
|
-
configWithoutSlippage,
|
|
66
|
-
mockChainManager,
|
|
67
|
-
)
|
|
68
|
-
expect(providerWithDefaults).toBeInstanceOf(MorphoLendProvider)
|
|
69
|
-
})
|
|
70
56
|
})
|
|
71
57
|
|
|
72
58
|
describe('closePosition', () => {
|
|
@@ -275,10 +261,7 @@ describe('MorphoLendProvider', () => {
|
|
|
275
261
|
|
|
276
262
|
describe('market allowlist configuration', () => {
|
|
277
263
|
it('should work without market allowlist', () => {
|
|
278
|
-
const configWithoutAllowlist:
|
|
279
|
-
provider: 'morpho',
|
|
280
|
-
defaultSlippage: 50,
|
|
281
|
-
}
|
|
264
|
+
const configWithoutAllowlist: LendProviderConfig = {}
|
|
282
265
|
|
|
283
266
|
const providerWithoutAllowlist = new MorphoLendProvider(
|
|
284
267
|
configWithoutAllowlist,
|
|
@@ -289,9 +272,7 @@ describe('MorphoLendProvider', () => {
|
|
|
289
272
|
})
|
|
290
273
|
|
|
291
274
|
it('should store market allowlist when provided', () => {
|
|
292
|
-
const configWithAllowlist:
|
|
293
|
-
provider: 'morpho',
|
|
294
|
-
defaultSlippage: 50,
|
|
275
|
+
const configWithAllowlist: LendProviderConfig = {
|
|
295
276
|
marketAllowlist: [MockGauntletUSDCMarket],
|
|
296
277
|
}
|
|
297
278
|
|
|
@@ -307,37 +288,8 @@ describe('MorphoLendProvider', () => {
|
|
|
307
288
|
expect(allowlist![0].name).toBe(MockGauntletUSDCMarket.name)
|
|
308
289
|
})
|
|
309
290
|
|
|
310
|
-
it('should use default slippage from config', () => {
|
|
311
|
-
const customSlippage = 150
|
|
312
|
-
const configWithSlippage: MorphoLendConfig = {
|
|
313
|
-
provider: 'morpho',
|
|
314
|
-
defaultSlippage: customSlippage,
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
const providerWithSlippage = new MorphoLendProvider(
|
|
318
|
-
configWithSlippage,
|
|
319
|
-
mockChainManager,
|
|
320
|
-
)
|
|
321
|
-
|
|
322
|
-
expect(providerWithSlippage.config.defaultSlippage).toBe(customSlippage)
|
|
323
|
-
})
|
|
324
|
-
|
|
325
|
-
it('should use fallback default slippage when not provided', () => {
|
|
326
|
-
const configWithoutSlippage: MorphoLendConfig = {
|
|
327
|
-
provider: 'morpho',
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
const providerWithoutSlippage = new MorphoLendProvider(
|
|
331
|
-
configWithoutSlippage,
|
|
332
|
-
mockChainManager,
|
|
333
|
-
)
|
|
334
|
-
|
|
335
|
-
expect(providerWithoutSlippage.config.defaultSlippage || 50).toBe(50) // Default fallback
|
|
336
|
-
})
|
|
337
|
-
|
|
338
291
|
it('should handle multiple markets in allowlist', () => {
|
|
339
|
-
const configWithMultipleMarkets:
|
|
340
|
-
provider: 'morpho',
|
|
292
|
+
const configWithMultipleMarkets: LendProviderConfig = {
|
|
341
293
|
marketAllowlist: [MockGauntletUSDCMarket, MockWETHMarket],
|
|
342
294
|
}
|
|
343
295
|
|
|
@@ -9,9 +9,9 @@ import {
|
|
|
9
9
|
} from '@/lend/providers/morpho/api.js'
|
|
10
10
|
import type { ChainManager } from '@/services/ChainManager.js'
|
|
11
11
|
import { SUPPORTED_TOKENS } from '@/supported/tokens.js'
|
|
12
|
+
import type { LendProviderConfig } from '@/types/actions.js'
|
|
12
13
|
import type {
|
|
13
14
|
ApyBreakdown,
|
|
14
|
-
LendConfig,
|
|
15
15
|
LendMarket,
|
|
16
16
|
LendMarketConfig,
|
|
17
17
|
LendMarketId,
|
|
@@ -139,7 +139,7 @@ interface GetVaultParams {
|
|
|
139
139
|
/** Chain manager instance */
|
|
140
140
|
chainManager: ChainManager
|
|
141
141
|
/** Lend configuration containing market allowlist */
|
|
142
|
-
lendConfig?:
|
|
142
|
+
lendConfig?: LendProviderConfig
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
/**
|
|
@@ -178,7 +178,6 @@ export async function getVault(params: GetVaultParams): Promise<LendMarket> {
|
|
|
178
178
|
|
|
179
179
|
// Morpho sdk doesn't support base sepolia, so we need to use the mock vault
|
|
180
180
|
if (params.marketId.chainId === 84532) {
|
|
181
|
-
console.log('Using mock vault for base sepolia')
|
|
182
181
|
return createMockVaultData(params.marketId, marketConfig)
|
|
183
182
|
}
|
|
184
183
|
|
|
@@ -244,7 +243,7 @@ export async function getVault(params: GetVaultParams): Promise<LendMarket> {
|
|
|
244
243
|
|
|
245
244
|
interface GetVaultsParams {
|
|
246
245
|
chainManager: ChainManager
|
|
247
|
-
lendConfig:
|
|
246
|
+
lendConfig: LendProviderConfig
|
|
248
247
|
markets: LendMarketConfig[]
|
|
249
248
|
}
|
|
250
249
|
|
package/src/supported/tokens.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import type { Address } from 'viem'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
base,
|
|
4
|
+
baseSepolia,
|
|
5
|
+
mainnet,
|
|
6
|
+
optimismSepolia,
|
|
7
|
+
unichain,
|
|
8
|
+
} from 'viem/chains'
|
|
3
9
|
|
|
4
10
|
import type { SupportedChainId } from '@/constants/supportedChains.js'
|
|
5
11
|
import type { Asset } from '@/types/asset.js'
|
|
@@ -11,6 +17,7 @@ export const SUPPORTED_TOKENS: Asset[] = [
|
|
|
11
17
|
[unichain.id]: '0x0000000000000000000000000000000000000000',
|
|
12
18
|
[base.id]: '0x0000000000000000000000000000000000000000',
|
|
13
19
|
[baseSepolia.id]: '0x0000000000000000000000000000000000000000',
|
|
20
|
+
[optimismSepolia.id]: '0x0000000000000000000000000000000000000000',
|
|
14
21
|
},
|
|
15
22
|
metadata: {
|
|
16
23
|
symbol: 'ETH',
|
|
@@ -19,6 +26,21 @@ export const SUPPORTED_TOKENS: Asset[] = [
|
|
|
19
26
|
},
|
|
20
27
|
type: 'native',
|
|
21
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
|
+
},
|
|
22
44
|
{
|
|
23
45
|
address: {
|
|
24
46
|
[mainnet.id]: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
@@ -38,7 +60,7 @@ export const SUPPORTED_TOKENS: Asset[] = [
|
|
|
38
60
|
},
|
|
39
61
|
metadata: {
|
|
40
62
|
symbol: 'USDC_DEMO',
|
|
41
|
-
name: 'USDC
|
|
63
|
+
name: 'USDC',
|
|
42
64
|
decimals: 6,
|
|
43
65
|
},
|
|
44
66
|
type: 'erc20',
|
|
@@ -2,6 +2,7 @@ import type { Address } from 'viem'
|
|
|
2
2
|
import { type MockedFunction, vi } from 'vitest'
|
|
3
3
|
|
|
4
4
|
import { LendProvider } from '@/lend/core/LendProvider.js'
|
|
5
|
+
import type { LendProviderConfig } from '@/types/actions.js'
|
|
5
6
|
import type { Asset } from '@/types/asset.js'
|
|
6
7
|
import type {
|
|
7
8
|
ClosePositionParams,
|
|
@@ -9,7 +10,6 @@ import type {
|
|
|
9
10
|
GetLendMarketsParams,
|
|
10
11
|
GetMarketBalanceParams,
|
|
11
12
|
LendClosePositionParams,
|
|
12
|
-
LendConfig,
|
|
13
13
|
LendMarket,
|
|
14
14
|
LendMarketId,
|
|
15
15
|
LendMarketPosition,
|
|
@@ -29,7 +29,7 @@ export interface MockLendProviderConfig {
|
|
|
29
29
|
* Mock Lend Provider for testing
|
|
30
30
|
* @description Provides a mock implementation of LendProvider following MockChainManager pattern
|
|
31
31
|
*/
|
|
32
|
-
export class MockLendProvider extends LendProvider<
|
|
32
|
+
export class MockLendProvider extends LendProvider<LendProviderConfig> {
|
|
33
33
|
public openPosition: MockedFunction<
|
|
34
34
|
(params: LendOpenPositionParams) => Promise<LendTransaction>
|
|
35
35
|
>
|
|
@@ -71,10 +71,10 @@ export class MockLendProvider extends LendProvider<LendConfig> {
|
|
|
71
71
|
private mockConfig: MockLendProviderConfig
|
|
72
72
|
|
|
73
73
|
constructor(
|
|
74
|
-
config?:
|
|
74
|
+
config?: LendProviderConfig,
|
|
75
75
|
mockConfig?: Partial<MockLendProviderConfig>,
|
|
76
76
|
) {
|
|
77
|
-
super(config || {
|
|
77
|
+
super(config || {})
|
|
78
78
|
|
|
79
79
|
this.mockConfig = {
|
|
80
80
|
supportedChains: mockConfig?.supportedChains ?? [84532],
|
|
@@ -220,7 +220,7 @@ export class MockLendProvider extends LendProvider<LendConfig> {
|
|
|
220
220
|
asset: assetAddress,
|
|
221
221
|
marketId: marketId.address,
|
|
222
222
|
apy: this.mockConfig.defaultApy,
|
|
223
|
-
slippage: options?.slippage
|
|
223
|
+
slippage: options?.slippage ?? 50,
|
|
224
224
|
transactionData: {
|
|
225
225
|
approval: {
|
|
226
226
|
to: assetAddress,
|
|
@@ -253,7 +253,7 @@ export class MockLendProvider extends LendProvider<LendConfig> {
|
|
|
253
253
|
asset: assetAddress,
|
|
254
254
|
marketId: marketId.address,
|
|
255
255
|
apy: this.mockConfig.defaultApy,
|
|
256
|
-
slippage: options?.slippage
|
|
256
|
+
slippage: options?.slippage ?? 50,
|
|
257
257
|
transactionData: {
|
|
258
258
|
approval: {
|
|
259
259
|
to: assetAddress,
|
|
@@ -347,7 +347,7 @@ export class MockLendProvider extends LendProvider<LendConfig> {
|
|
|
347
347
|
asset: assetAddress,
|
|
348
348
|
marketId: marketId.address,
|
|
349
349
|
apy: 0,
|
|
350
|
-
slippage: options?.slippage
|
|
350
|
+
slippage: options?.slippage ?? 50,
|
|
351
351
|
transactionData: {
|
|
352
352
|
closePosition: {
|
|
353
353
|
to: marketId.address,
|
|
@@ -370,7 +370,7 @@ export class MockLendProvider extends LendProvider<LendConfig> {
|
|
|
370
370
|
asset,
|
|
371
371
|
marketId: marketId || 'mock-market',
|
|
372
372
|
apy: 0,
|
|
373
|
-
slippage: options?.slippage
|
|
373
|
+
slippage: options?.slippage ?? 50,
|
|
374
374
|
transactionData: {
|
|
375
375
|
closePosition: {
|
|
376
376
|
to:
|
|
@@ -390,7 +390,7 @@ export class MockLendProvider extends LendProvider<LendConfig> {
|
|
|
390
390
|
* @returns MockLendProvider instance
|
|
391
391
|
*/
|
|
392
392
|
export function createMockLendProvider(
|
|
393
|
-
config?:
|
|
393
|
+
config?: LendProviderConfig,
|
|
394
394
|
mockConfig?: Partial<MockLendProviderConfig>,
|
|
395
395
|
): MockLendProvider {
|
|
396
396
|
return new MockLendProvider(config, mockConfig)
|