@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.
- package/LICENSE +1 -1
- package/dist/__mocks__/MockAssets.d.ts.map +1 -0
- package/dist/__mocks__/MockAssets.js.map +1 -0
- package/dist/__mocks__/MockPrivyClient.d.ts.map +1 -0
- package/dist/__mocks__/MockPrivyClient.js.map +1 -0
- package/dist/__mocks__/utils.d.ts.map +1 -0
- package/dist/__mocks__/utils.js.map +1 -0
- package/dist/__tests__/actions.test.d.ts.map +1 -0
- package/dist/{actions.test.js → __tests__/actions.test.js} +5 -5
- package/dist/__tests__/actions.test.js.map +1 -0
- package/dist/constants/assets.d.ts +19 -0
- package/dist/constants/assets.d.ts.map +1 -1
- package/dist/constants/assets.js +84 -6
- 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 +7 -3
- package/dist/constants/supportedChains.js.map +1 -1
- package/dist/core/asset/__mocks__/mockAsset.js +1 -1
- package/dist/core/asset/__mocks__/mockAsset.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{test → lend/__mocks__}/MockLendProvider.d.ts +7 -6
- package/dist/lend/__mocks__/MockLendProvider.d.ts.map +1 -0
- package/dist/{test → lend/__mocks__}/MockLendProvider.js +20 -21
- package/dist/lend/__mocks__/MockLendProvider.js.map +1 -0
- package/dist/{test → lend/__mocks__}/MockMarkets.d.ts +1 -1
- package/dist/lend/__mocks__/MockMarkets.d.ts.map +1 -0
- package/dist/{test → lend/__mocks__}/MockMarkets.js +1 -1
- package/dist/lend/__mocks__/MockMarkets.js.map +1 -0
- package/dist/lend/__mocks__/mockLendTransaction.d.ts +3 -12
- package/dist/lend/__mocks__/mockLendTransaction.d.ts.map +1 -1
- package/dist/lend/__mocks__/mockLendTransaction.js +3 -19
- package/dist/lend/__mocks__/mockLendTransaction.js.map +1 -1
- package/dist/lend/core/LendProvider.d.ts +14 -2
- package/dist/lend/core/LendProvider.d.ts.map +1 -1
- package/dist/lend/core/LendProvider.js +23 -2
- package/dist/lend/core/LendProvider.js.map +1 -1
- package/dist/lend/core/__tests__/LendProvider.test.js +2 -2
- package/dist/lend/core/__tests__/LendProvider.test.js.map +1 -1
- package/dist/lend/namespaces/ActionsLendNamespace.d.ts +2 -36
- package/dist/lend/namespaces/ActionsLendNamespace.d.ts.map +1 -1
- package/dist/lend/namespaces/ActionsLendNamespace.js +2 -48
- package/dist/lend/namespaces/ActionsLendNamespace.js.map +1 -1
- package/dist/lend/namespaces/BaseLendNamespace.d.ts +47 -0
- package/dist/lend/namespaces/BaseLendNamespace.d.ts.map +1 -0
- package/dist/lend/namespaces/BaseLendNamespace.js +58 -0
- package/dist/lend/namespaces/BaseLendNamespace.js.map +1 -0
- package/dist/lend/namespaces/WalletLendNamespace.d.ts +8 -36
- package/dist/lend/namespaces/WalletLendNamespace.d.ts.map +1 -1
- package/dist/lend/namespaces/WalletLendNamespace.js +14 -69
- package/dist/lend/namespaces/WalletLendNamespace.js.map +1 -1
- package/dist/lend/namespaces/__tests__/ActionsLendNamespace.spec.js +2 -2
- package/dist/lend/namespaces/__tests__/ActionsLendNamespace.spec.js.map +1 -1
- package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.d.ts +2 -0
- package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.d.ts.map +1 -0
- package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js +110 -0
- package/dist/lend/namespaces/__tests__/BaseLendNamespace.spec.js.map +1 -0
- package/dist/lend/namespaces/__tests__/WalletLendNamespace.spec.js +8 -10
- package/dist/lend/namespaces/__tests__/WalletLendNamespace.spec.js.map +1 -1
- package/dist/lend/providers/aave/AaveLendProvider.d.ts +19 -27
- package/dist/lend/providers/aave/AaveLendProvider.d.ts.map +1 -1
- package/dist/lend/providers/aave/AaveLendProvider.js +124 -180
- package/dist/lend/providers/aave/AaveLendProvider.js.map +1 -1
- package/dist/lend/providers/aave/__mocks__/mockReserve.d.ts +11 -0
- package/dist/lend/providers/aave/__mocks__/mockReserve.d.ts.map +1 -0
- package/dist/lend/providers/aave/__mocks__/mockReserve.js +80 -0
- package/dist/lend/providers/aave/__mocks__/mockReserve.js.map +1 -0
- package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.d.ts +2 -0
- package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.d.ts.map +1 -0
- package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js +315 -0
- package/dist/lend/providers/aave/__tests__/AaveLendProvider.test.js.map +1 -0
- package/dist/lend/providers/aave/abis/pool.d.ts +153 -0
- package/dist/lend/providers/aave/abis/pool.d.ts.map +1 -0
- package/dist/lend/providers/aave/abis/pool.js +79 -0
- package/dist/lend/providers/aave/abis/pool.js.map +1 -0
- package/dist/lend/providers/aave/sdk.d.ts.map +1 -1
- package/dist/lend/providers/aave/sdk.js +6 -65
- package/dist/lend/providers/aave/sdk.js.map +1 -1
- package/dist/lend/providers/morpho/MorphoLendProvider.d.ts +0 -1
- package/dist/lend/providers/morpho/MorphoLendProvider.d.ts.map +1 -1
- package/dist/lend/providers/morpho/MorphoLendProvider.js +13 -28
- package/dist/lend/providers/morpho/MorphoLendProvider.js.map +1 -1
- package/dist/lend/providers/morpho/__tests__/MorphoLendProvider.test.js +5 -24
- package/dist/lend/providers/morpho/__tests__/MorphoLendProvider.test.js.map +1 -1
- package/dist/lend/providers/morpho/__tests__/api.test.js +248 -54
- package/dist/lend/providers/morpho/__tests__/api.test.js.map +1 -1
- package/dist/lend/providers/morpho/contracts.d.ts +19 -0
- package/dist/lend/providers/morpho/contracts.d.ts.map +1 -0
- package/dist/lend/providers/morpho/contracts.js +32 -0
- package/dist/lend/providers/morpho/contracts.js.map +1 -0
- package/dist/lend/providers/morpho/sdk.d.ts.map +1 -1
- package/dist/lend/providers/morpho/sdk.js +168 -71
- package/dist/lend/providers/morpho/sdk.js.map +1 -1
- package/dist/services/ChainManager.d.ts +1 -1
- package/dist/{test → services/__mocks__}/MockChainManager.d.ts +1 -1
- package/dist/services/__mocks__/MockChainManager.d.ts.map +1 -0
- package/dist/services/__mocks__/MockChainManager.js.map +1 -0
- package/dist/services/tokenBalance.d.ts.map +1 -1
- package/dist/services/tokenBalance.js +4 -5
- package/dist/services/tokenBalance.js.map +1 -1
- package/dist/services/tokenBalance.spec.js +2 -2
- package/dist/services/tokenBalance.spec.js.map +1 -1
- package/dist/supported/tokens.d.ts +4 -4
- package/dist/supported/tokens.d.ts.map +1 -1
- package/dist/supported/tokens.js +5 -72
- package/dist/supported/tokens.js.map +1 -1
- package/dist/types/asset.d.ts +3 -3
- package/dist/types/asset.d.ts.map +1 -1
- package/dist/types/lend/base.d.ts +4 -9
- package/dist/types/lend/base.d.ts.map +1 -1
- package/dist/types/lend/contracts.d.ts +17 -0
- package/dist/types/lend/contracts.d.ts.map +1 -0
- package/dist/types/lend/contracts.js +2 -0
- package/dist/types/lend/contracts.js.map +1 -0
- package/dist/types/lend/index.d.ts +1 -0
- package/dist/types/lend/index.d.ts.map +1 -1
- package/dist/types/lend/index.js +1 -0
- package/dist/types/lend/index.js.map +1 -1
- package/dist/utils/assets.d.ts +7 -1
- package/dist/utils/assets.d.ts.map +1 -1
- package/dist/utils/assets.js +12 -1
- package/dist/utils/assets.js.map +1 -1
- package/dist/utils/assets.test.js +1 -1
- package/dist/utils/assets.test.js.map +1 -1
- package/dist/utils/constants.d.ts +5 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +5 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/wallet/core/namespace/WalletNamespace.d.ts.map +1 -1
- package/dist/wallet/core/namespace/WalletNamespace.js.map +1 -1
- package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js +4 -4
- package/dist/wallet/core/namespace/__tests__/WalletNamespace.spec.js.map +1 -1
- package/dist/wallet/core/providers/__tests__/WalletProvider.spec.js +4 -4
- package/dist/wallet/core/providers/__tests__/WalletProvider.spec.js.map +1 -1
- package/dist/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.js +2 -2
- package/dist/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.js.map +1 -1
- package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js +3 -3
- package/dist/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.js.map +1 -1
- package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js +2 -2
- package/dist/wallet/core/wallets/abstract/__tests__/Wallet.spec.js.map +1 -1
- package/dist/wallet/core/wallets/eoa/__tests__/EOAWallet.spec.js +2 -2
- package/dist/wallet/core/wallets/eoa/__tests__/EOAWallet.spec.js.map +1 -1
- package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js +3 -3
- package/dist/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.js.map +1 -1
- package/dist/wallet/core/wallets/smart/default/utils/__tests__/findSignerInArray.spec.js +1 -1
- package/dist/wallet/core/wallets/smart/default/utils/__tests__/findSignerInArray.spec.js.map +1 -1
- package/dist/wallet/core/wallets/smart/default/utils/__tests__/getSignerPublicKey.spec.js +1 -1
- package/dist/wallet/core/wallets/smart/default/utils/__tests__/getSignerPublicKey.spec.js.map +1 -1
- package/dist/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +4 -4
- package/dist/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js +2 -2
- package/dist/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.js.map +1 -1
- package/dist/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js +2 -2
- package/dist/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.js +3 -3
- 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 +2 -2
- package/dist/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.js +2 -2
- package/dist/wallet/node/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.js.map +1 -1
- package/dist/wallet/node/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.js +1 -1
- package/dist/wallet/node/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.js.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/__mocks__/DynamicHostedWalletProviderMock.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/__mocks__/DynamicHostedWalletProviderMock.js +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/__mocks__/DynamicHostedWalletProviderMock.js.map +1 -1
- package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js +5 -2
- package/dist/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/__mocks__/PrivyHostedWalletProviderMock.d.ts.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/__mocks__/PrivyHostedWalletProviderMock.js +1 -1
- package/dist/wallet/react/providers/hosted/privy/__mocks__/PrivyHostedWalletProviderMock.js.map +1 -1
- package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js +2 -2
- package/dist/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js +2 -2
- package/dist/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.js.map +1 -1
- package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js +1 -1
- package/dist/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/__tests__/DynamicWallet.spec.js +2 -2
- package/dist/wallet/react/wallets/hosted/dynamic/__tests__/DynamicWallet.spec.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/utils/__tests__/createSigner.spec.js +1 -1
- package/dist/wallet/react/wallets/hosted/dynamic/utils/__tests__/createSigner.spec.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/privy/__tests__/PrivyWallet.spec.js +2 -2
- package/dist/wallet/react/wallets/hosted/privy/__tests__/PrivyWallet.spec.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/privy/utils/__tests__/createSigner.spec.js +1 -1
- package/dist/wallet/react/wallets/hosted/privy/utils/__tests__/createSigner.spec.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.js +2 -2
- package/dist/wallet/react/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.js.map +1 -1
- package/dist/wallet/react/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.js +1 -1
- package/dist/wallet/react/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.js.map +1 -1
- package/package.json +1 -1
- package/src/{test → __mocks__}/MockPrivyClient.ts +1 -1
- package/src/{actions.test.ts → __tests__/actions.test.ts} +2 -2
- package/src/constants/assets.ts +92 -8
- package/src/constants/supportedChains.ts +10 -2
- package/src/core/asset/__mocks__/mockAsset.ts +1 -1
- package/src/index.ts +1 -1
- package/src/{test → lend/__mocks__}/MockLendProvider.ts +20 -23
- package/src/{test → lend/__mocks__}/MockMarkets.ts +1 -1
- package/src/lend/__mocks__/mockLendTransaction.ts +4 -26
- package/src/lend/core/LendProvider.ts +34 -2
- package/src/lend/core/__tests__/LendProvider.test.ts +2 -2
- package/src/lend/namespaces/ActionsLendNamespace.ts +2 -85
- package/src/lend/namespaces/BaseLendNamespace.ts +89 -0
- package/src/lend/namespaces/WalletLendNamespace.ts +25 -121
- package/src/lend/namespaces/__tests__/ActionsLendNamespace.spec.ts +10 -9
- package/src/lend/namespaces/__tests__/BaseLendNamespace.spec.ts +137 -0
- package/src/lend/namespaces/__tests__/WalletLendNamespace.spec.ts +19 -22
- package/src/lend/providers/aave/AaveLendProvider.ts +163 -231
- package/src/lend/providers/aave/__mocks__/mockReserve.ts +84 -0
- package/src/lend/providers/aave/__tests__/AaveLendProvider.test.ts +419 -0
- package/src/lend/providers/aave/abis/pool.ts +81 -0
- package/src/lend/providers/aave/sdk.ts +7 -69
- package/src/lend/providers/morpho/MorphoLendProvider.ts +20 -41
- package/src/lend/providers/morpho/__tests__/MorphoLendProvider.test.ts +8 -32
- package/src/lend/providers/morpho/__tests__/api.test.ts +277 -51
- package/src/lend/providers/morpho/contracts.ts +37 -0
- package/src/lend/providers/morpho/sdk.ts +232 -84
- package/src/services/tokenBalance.spec.ts +2 -2
- package/src/services/tokenBalance.ts +6 -7
- package/src/supported/tokens.ts +6 -79
- package/src/types/asset.ts +3 -3
- package/src/types/lend/base.ts +8 -11
- package/src/types/lend/contracts.ts +18 -0
- package/src/types/lend/index.ts +1 -0
- package/src/utils/assets.test.ts +1 -1
- package/src/utils/assets.ts +15 -1
- package/src/utils/constants.ts +4 -0
- package/src/wallet/core/namespace/WalletNamespace.ts +2 -4
- package/src/wallet/core/namespace/__tests__/WalletNamespace.spec.ts +6 -6
- package/src/wallet/core/providers/__tests__/WalletProvider.spec.ts +6 -6
- package/src/wallet/core/providers/hosted/registry/__tests__/HostedWalletProviderRegistry.spec.ts +3 -3
- package/src/wallet/core/providers/smart/default/__tests__/DefaultSmartWalletProvider.spec.ts +7 -9
- package/src/wallet/core/wallets/abstract/__tests__/Wallet.spec.ts +2 -2
- package/src/wallet/core/wallets/eoa/__tests__/EOAWallet.spec.ts +2 -2
- package/src/wallet/core/wallets/smart/default/__tests__/DefaultSmartWallet.spec.ts +3 -3
- package/src/wallet/core/wallets/smart/default/utils/__tests__/findSignerInArray.spec.ts +1 -1
- package/src/wallet/core/wallets/smart/default/utils/__tests__/getSignerPublicKey.spec.ts +1 -1
- package/src/wallet/node/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +5 -5
- package/src/wallet/node/providers/hosted/registry/__tests__/NodeHostedWalletProviderRegistry.spec.ts +3 -3
- package/src/wallet/node/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.ts +2 -2
- package/src/wallet/node/wallets/hosted/privy/__tests__/PrivyWallet.spec.ts +4 -4
- package/src/wallet/node/wallets/hosted/privy/utils/__tests__/createSigner.spec.ts +2 -2
- package/src/wallet/node/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.ts +2 -2
- package/src/wallet/node/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.ts +1 -1
- package/src/wallet/react/providers/hosted/dynamic/__mocks__/DynamicHostedWalletProviderMock.ts +1 -1
- package/src/wallet/react/providers/hosted/dynamic/__tests__/DynamicHostedWalletProvider.spec.ts +8 -5
- package/src/wallet/react/providers/hosted/privy/__mocks__/PrivyHostedWalletProviderMock.ts +1 -1
- package/src/wallet/react/providers/hosted/privy/__tests__/PrivyHostedWalletProvider.spec.ts +4 -5
- package/src/wallet/react/providers/hosted/turnkey/__tests__/TurnkeyHostedWalletProvider.spec.ts +2 -2
- package/src/wallet/react/providers/registry/__tests__/ReactHostedWalletProviderRegistry.spec.ts +5 -7
- package/src/wallet/react/wallets/hosted/dynamic/__tests__/DynamicWallet.spec.ts +2 -2
- package/src/wallet/react/wallets/hosted/dynamic/utils/__tests__/createSigner.spec.ts +1 -1
- package/src/wallet/react/wallets/hosted/privy/__tests__/PrivyWallet.spec.ts +2 -2
- package/src/wallet/react/wallets/hosted/privy/utils/__tests__/createSigner.spec.ts +1 -1
- package/src/wallet/react/wallets/hosted/turnkey/__tests__/TurnkeyWallet.spec.ts +2 -2
- package/src/wallet/react/wallets/hosted/turnkey/utils/__tests__/createSigner.spec.ts +1 -1
- package/dist/actions.test.d.ts.map +0 -1
- package/dist/actions.test.js.map +0 -1
- package/dist/test/MockAssets.d.ts.map +0 -1
- package/dist/test/MockAssets.js.map +0 -1
- package/dist/test/MockChainManager.d.ts.map +0 -1
- package/dist/test/MockChainManager.js.map +0 -1
- package/dist/test/MockLendProvider.d.ts.map +0 -1
- package/dist/test/MockLendProvider.js.map +0 -1
- package/dist/test/MockMarkets.d.ts.map +0 -1
- package/dist/test/MockMarkets.js.map +0 -1
- package/dist/test/MockPrivyClient.d.ts.map +0 -1
- package/dist/test/MockPrivyClient.js.map +0 -1
- package/dist/test/utils.d.ts.map +0 -1
- package/dist/test/utils.js.map +0 -1
- /package/dist/{test → __mocks__}/MockAssets.d.ts +0 -0
- /package/dist/{test → __mocks__}/MockAssets.js +0 -0
- /package/dist/{test → __mocks__}/MockPrivyClient.d.ts +0 -0
- /package/dist/{test → __mocks__}/MockPrivyClient.js +0 -0
- /package/dist/{test → __mocks__}/utils.d.ts +0 -0
- /package/dist/{test → __mocks__}/utils.js +0 -0
- /package/dist/{actions.test.d.ts → __tests__/actions.test.d.ts} +0 -0
- /package/dist/{test → services/__mocks__}/MockChainManager.js +0 -0
- /package/src/{test → __mocks__}/MockAssets.ts +0 -0
- /package/src/{test → __mocks__}/utils.ts +0 -0
- /package/src/{test → services/__mocks__}/MockChainManager.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChainId } from '@morpho-org/blue-sdk'
|
|
2
2
|
import { MetaMorphoAction } from '@morpho-org/blue-sdk-viem'
|
|
3
|
-
import {
|
|
3
|
+
import { erc20Abi, formatUnits } from 'viem'
|
|
4
4
|
|
|
5
5
|
import { SUPPORTED_CHAIN_IDS as ACTIONS_SUPPORTED_CHAIN_IDS } from '@/constants/supportedChains.js'
|
|
6
6
|
import { LendProvider } from '@/lend/core/LendProvider.js'
|
|
@@ -39,16 +39,13 @@ export const SUPPORTED_CHAIN_IDS = [
|
|
|
39
39
|
export class MorphoLendProvider extends LendProvider<LendProviderConfig> {
|
|
40
40
|
protected readonly SUPPORTED_CHAIN_IDS = SUPPORTED_CHAIN_IDS
|
|
41
41
|
|
|
42
|
-
private chainManager: ChainManager
|
|
43
|
-
|
|
44
42
|
/**
|
|
45
43
|
* Create a new Morpho lending provider
|
|
46
44
|
* @param config - Morpho lending configuration
|
|
47
45
|
* @param chainManager - Chain manager for blockchain interactions
|
|
48
46
|
*/
|
|
49
47
|
constructor(config: LendProviderConfig, chainManager: ChainManager) {
|
|
50
|
-
super(config)
|
|
51
|
-
this.chainManager = chainManager
|
|
48
|
+
super(config, chainManager)
|
|
52
49
|
}
|
|
53
50
|
|
|
54
51
|
/**
|
|
@@ -61,13 +58,11 @@ export class MorphoLendProvider extends LendProvider<LendProviderConfig> {
|
|
|
61
58
|
params: LendOpenPositionInternalParams,
|
|
62
59
|
): Promise<LendTransaction> {
|
|
63
60
|
try {
|
|
64
|
-
// Get asset address for the chain
|
|
65
|
-
const assetAddress =
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
)
|
|
70
|
-
}
|
|
61
|
+
// Get asset address for the chain (throws for native assets)
|
|
62
|
+
const assetAddress = getAssetAddress(
|
|
63
|
+
params.asset,
|
|
64
|
+
params.marketId.chainId,
|
|
65
|
+
)
|
|
71
66
|
|
|
72
67
|
// Get vault information for APY
|
|
73
68
|
const vaultInfo = await this.getMarket({
|
|
@@ -79,36 +74,27 @@ export class MorphoLendProvider extends LendProvider<LendProviderConfig> {
|
|
|
79
74
|
const receiver = params.walletAddress
|
|
80
75
|
const depositCallData = MetaMorphoAction.deposit(assets, receiver)
|
|
81
76
|
|
|
82
|
-
const approvalCallData = encodeFunctionData({
|
|
83
|
-
abi: erc20Abi,
|
|
84
|
-
functionName: 'approve',
|
|
85
|
-
args: [params.marketId.address, params.amountWei],
|
|
86
|
-
})
|
|
87
|
-
|
|
88
77
|
return {
|
|
89
78
|
amount: params.amountWei,
|
|
90
79
|
asset: assetAddress,
|
|
91
80
|
marketId: params.marketId.address,
|
|
92
81
|
apy: vaultInfo.apy.total,
|
|
93
82
|
transactionData: {
|
|
94
|
-
approval:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
83
|
+
approval: this.buildApprovalTx(
|
|
84
|
+
assetAddress,
|
|
85
|
+
params.marketId.address,
|
|
86
|
+
params.amountWei,
|
|
87
|
+
),
|
|
88
|
+
position: {
|
|
100
89
|
to: params.marketId.address,
|
|
101
90
|
data: depositCallData,
|
|
102
91
|
value: 0n,
|
|
103
92
|
},
|
|
104
93
|
},
|
|
105
|
-
slippage: params.options?.slippage ?? 50,
|
|
106
94
|
}
|
|
107
|
-
} catch
|
|
95
|
+
} catch {
|
|
108
96
|
throw new Error(
|
|
109
|
-
`Failed to open position with ${params.amountWei} of ${params.asset.metadata.symbol}
|
|
110
|
-
error instanceof Error ? error.message : 'Unknown error'
|
|
111
|
-
}`,
|
|
97
|
+
`Failed to open position with ${params.amountWei} of ${params.asset.metadata.symbol}`,
|
|
112
98
|
)
|
|
113
99
|
}
|
|
114
100
|
}
|
|
@@ -149,20 +135,15 @@ export class MorphoLendProvider extends LendProvider<LendProviderConfig> {
|
|
|
149
135
|
marketId: params.marketId.address,
|
|
150
136
|
apy: vaultInfo.apy.total,
|
|
151
137
|
transactionData: {
|
|
152
|
-
|
|
138
|
+
position: {
|
|
153
139
|
to: params.marketId.address,
|
|
154
140
|
data: withdrawCallData,
|
|
155
141
|
value: 0n,
|
|
156
142
|
},
|
|
157
143
|
},
|
|
158
|
-
slippage: params.options?.slippage ?? 50,
|
|
159
144
|
}
|
|
160
|
-
} catch
|
|
161
|
-
throw new Error(
|
|
162
|
-
`Failed to close position: ${
|
|
163
|
-
error instanceof Error ? error.message : 'Unknown error'
|
|
164
|
-
}`,
|
|
165
|
-
)
|
|
145
|
+
} catch {
|
|
146
|
+
throw new Error('Failed to close position')
|
|
166
147
|
}
|
|
167
148
|
}
|
|
168
149
|
|
|
@@ -247,11 +228,9 @@ export class MorphoLendProvider extends LendProvider<LendProviderConfig> {
|
|
|
247
228
|
sharesFormatted,
|
|
248
229
|
marketId: params.marketId,
|
|
249
230
|
}
|
|
250
|
-
} catch
|
|
231
|
+
} catch {
|
|
251
232
|
throw new Error(
|
|
252
|
-
`Failed to get market balance for ${params.walletAddress} in market ${params.marketId.address}
|
|
253
|
-
error instanceof Error ? error.message : 'Unknown error'
|
|
254
|
-
}`,
|
|
233
|
+
`Failed to get market balance for ${params.walletAddress} in market ${params.marketId.address}`,
|
|
255
234
|
)
|
|
256
235
|
}
|
|
257
236
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { fetchAccrualVault } from '@morpho-org/blue-sdk-viem'
|
|
2
2
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
3
3
|
|
|
4
|
-
import { createMockMorphoVault } from '@/lend/providers/morpho/__mocks__/mockVault.js'
|
|
5
|
-
import { MorphoLendProvider } from '@/lend/providers/morpho/MorphoLendProvider.js'
|
|
6
|
-
import type { ChainManager } from '@/services/ChainManager.js'
|
|
7
|
-
import { MockChainManager } from '@/test/MockChainManager.js'
|
|
8
4
|
import {
|
|
9
5
|
MockGauntletUSDCMarket,
|
|
10
6
|
MockReceiverAddress,
|
|
11
7
|
MockWETHMarket,
|
|
12
|
-
} from '@/
|
|
8
|
+
} from '@/lend/__mocks__/MockMarkets.js'
|
|
9
|
+
import { createMockMorphoVault } from '@/lend/providers/morpho/__mocks__/mockVault.js'
|
|
10
|
+
import { MorphoLendProvider } from '@/lend/providers/morpho/MorphoLendProvider.js'
|
|
11
|
+
import { MockChainManager } from '@/services/__mocks__/MockChainManager.js'
|
|
12
|
+
import type { ChainManager } from '@/services/ChainManager.js'
|
|
13
13
|
import type { LendProviderConfig } from '@/types/actions.js'
|
|
14
14
|
|
|
15
15
|
// Mock the Morpho SDK modules
|
|
@@ -107,9 +107,7 @@ describe('MorphoLendProvider', () => {
|
|
|
107
107
|
expect(withdrawTransaction).toHaveProperty('marketId', marketId.address)
|
|
108
108
|
expect(withdrawTransaction).toHaveProperty('apy')
|
|
109
109
|
expect(withdrawTransaction).toHaveProperty('transactionData')
|
|
110
|
-
expect(withdrawTransaction.transactionData).toHaveProperty(
|
|
111
|
-
'closePosition',
|
|
112
|
-
)
|
|
110
|
+
expect(withdrawTransaction.transactionData).toHaveProperty('position')
|
|
113
111
|
expect(withdrawTransaction.transactionData).not.toHaveProperty('approval')
|
|
114
112
|
expect(typeof withdrawTransaction.apy).toBe('number')
|
|
115
113
|
expect(withdrawTransaction.apy).toBeGreaterThan(0)
|
|
@@ -209,7 +207,7 @@ describe('MorphoLendProvider', () => {
|
|
|
209
207
|
expect(lendTransaction).toHaveProperty('apy')
|
|
210
208
|
expect(lendTransaction).toHaveProperty('transactionData')
|
|
211
209
|
expect(lendTransaction.transactionData).toHaveProperty('approval')
|
|
212
|
-
expect(lendTransaction.transactionData).toHaveProperty('
|
|
210
|
+
expect(lendTransaction.transactionData).toHaveProperty('position')
|
|
213
211
|
expect(typeof lendTransaction.apy).toBe('number')
|
|
214
212
|
expect(lendTransaction.apy).toBeGreaterThan(0)
|
|
215
213
|
})
|
|
@@ -233,29 +231,7 @@ describe('MorphoLendProvider', () => {
|
|
|
233
231
|
marketId,
|
|
234
232
|
walletAddress: MockReceiverAddress,
|
|
235
233
|
}),
|
|
236
|
-
).rejects.toThrow('
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
it('should use custom slippage when provided', async () => {
|
|
240
|
-
const amount = 1000
|
|
241
|
-
const asset = MockGauntletUSDCMarket.asset
|
|
242
|
-
const marketId = {
|
|
243
|
-
address: MockGauntletUSDCMarket.address,
|
|
244
|
-
chainId: MockGauntletUSDCMarket.chainId,
|
|
245
|
-
}
|
|
246
|
-
const customSlippage = 100 // 1%
|
|
247
|
-
|
|
248
|
-
const lendTransaction = await provider.openPosition({
|
|
249
|
-
amount,
|
|
250
|
-
asset,
|
|
251
|
-
marketId,
|
|
252
|
-
walletAddress: MockReceiverAddress,
|
|
253
|
-
options: {
|
|
254
|
-
slippage: customSlippage,
|
|
255
|
-
},
|
|
256
|
-
})
|
|
257
|
-
|
|
258
|
-
expect(lendTransaction).toHaveProperty('amount', BigInt('1000000000'))
|
|
234
|
+
).rejects.toThrow('Failed to open position')
|
|
259
235
|
})
|
|
260
236
|
})
|
|
261
237
|
|
|
@@ -1,22 +1,284 @@
|
|
|
1
1
|
import type { Address } from 'viem'
|
|
2
|
-
import { describe, expect, it, vi } from 'vitest'
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
3
3
|
|
|
4
4
|
import { fetchRewards } from '@/lend/providers/morpho/api.js'
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
calculateRewardsBreakdown,
|
|
7
|
+
fetchAndCalculateRewards,
|
|
8
|
+
} from '@/lend/providers/morpho/sdk.js'
|
|
6
9
|
import { externalTest } from '@/utils/test.js'
|
|
7
10
|
|
|
8
11
|
/**
|
|
9
|
-
*
|
|
10
|
-
* These tests make actual network requests and require EXTERNAL_TEST=true
|
|
12
|
+
* Mock API response for a vault with rewards
|
|
11
13
|
*/
|
|
14
|
+
const mockVaultWithRewards = {
|
|
15
|
+
address: '0x38f4f3B6533de0023b9DCd04b02F93d36ad1F9f9',
|
|
16
|
+
id: 'test-vault-id',
|
|
17
|
+
state: {
|
|
18
|
+
rewards: [
|
|
19
|
+
{
|
|
20
|
+
asset: {
|
|
21
|
+
address: '0x078d782b760474a361dda0af3839290b0ef57ad6',
|
|
22
|
+
name: 'USD Coin',
|
|
23
|
+
symbol: 'USDC',
|
|
24
|
+
chain: { id: 130 },
|
|
25
|
+
},
|
|
26
|
+
amountPerSuppliedToken: '1000000',
|
|
27
|
+
supplyApr: 0.025, // 2.5% APR
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
asset: {
|
|
31
|
+
address: '0x9994e35db50125e0df82e4c2dde62496ce330999',
|
|
32
|
+
name: 'Morpho Token',
|
|
33
|
+
symbol: 'MORPHO',
|
|
34
|
+
chain: { id: 130 },
|
|
35
|
+
},
|
|
36
|
+
amountPerSuppliedToken: '500000',
|
|
37
|
+
supplyApr: 0.01, // 1% APR
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
allocation: [
|
|
41
|
+
{
|
|
42
|
+
market: {
|
|
43
|
+
id: 'market-1',
|
|
44
|
+
uniqueKey: '0xmarket1',
|
|
45
|
+
state: {
|
|
46
|
+
rewards: [
|
|
47
|
+
{
|
|
48
|
+
supplyApr: 0.005, // 0.5% APR
|
|
49
|
+
amountPerSuppliedToken: '100000',
|
|
50
|
+
asset: {
|
|
51
|
+
address: '0xunknown',
|
|
52
|
+
symbol: 'UNKNOWN',
|
|
53
|
+
chain: { id: 130 },
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
supplyAssetsUsd: 1000000,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
market: {
|
|
63
|
+
id: 'market-2',
|
|
64
|
+
uniqueKey: '0xmarket2',
|
|
65
|
+
state: {
|
|
66
|
+
rewards: [],
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
supplyAssetsUsd: 500000,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
chain: { id: 130 },
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Mock API response for a vault with no rewards
|
|
78
|
+
*/
|
|
79
|
+
const mockVaultNoRewards = {
|
|
80
|
+
address: '0x1234567890123456789012345678901234567890',
|
|
81
|
+
id: 'empty-vault-id',
|
|
82
|
+
state: {
|
|
83
|
+
rewards: [],
|
|
84
|
+
allocation: [],
|
|
85
|
+
},
|
|
86
|
+
chain: { id: 130 },
|
|
87
|
+
}
|
|
12
88
|
|
|
13
89
|
describe('Morpho API Integration', () => {
|
|
14
90
|
const GAUNTLET_USDC_VAULT =
|
|
15
91
|
'0x38f4f3B6533de0023b9DCd04b02F93d36ad1F9f9' as Address
|
|
16
92
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
93
|
+
afterEach(() => {
|
|
94
|
+
vi.unstubAllGlobals()
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
describe('fetchRewards', () => {
|
|
98
|
+
it('should return vault data on successful API response', async () => {
|
|
99
|
+
vi.stubGlobal(
|
|
100
|
+
'fetch',
|
|
101
|
+
vi.fn().mockResolvedValue({
|
|
102
|
+
json: async () => ({
|
|
103
|
+
data: {
|
|
104
|
+
vaultByAddress: mockVaultWithRewards,
|
|
105
|
+
},
|
|
106
|
+
}),
|
|
107
|
+
}),
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
const vaultData = await fetchRewards(GAUNTLET_USDC_VAULT)
|
|
111
|
+
|
|
112
|
+
expect(vaultData).toBeDefined()
|
|
113
|
+
expect(vaultData).not.toBeNull()
|
|
114
|
+
expect(vaultData.address.toLowerCase()).toBe(
|
|
115
|
+
GAUNTLET_USDC_VAULT.toLowerCase(),
|
|
116
|
+
)
|
|
117
|
+
expect(vaultData.state.rewards).toHaveLength(2)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
it('should return null when vault not found', async () => {
|
|
121
|
+
vi.stubGlobal(
|
|
122
|
+
'fetch',
|
|
123
|
+
vi.fn().mockResolvedValue({
|
|
124
|
+
json: async () => ({
|
|
125
|
+
data: {
|
|
126
|
+
vaultByAddress: null,
|
|
127
|
+
},
|
|
128
|
+
}),
|
|
129
|
+
}),
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
const vaultData = await fetchRewards(GAUNTLET_USDC_VAULT)
|
|
133
|
+
expect(vaultData).toBeNull()
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
it('should handle API errors gracefully', async () => {
|
|
137
|
+
vi.stubGlobal(
|
|
138
|
+
'fetch',
|
|
139
|
+
vi.fn().mockRejectedValue(new Error('Network error')),
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
const vaultData = await fetchRewards(GAUNTLET_USDC_VAULT)
|
|
143
|
+
expect(vaultData).toBeNull()
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
it('should handle malformed JSON response', async () => {
|
|
147
|
+
vi.stubGlobal(
|
|
148
|
+
'fetch',
|
|
149
|
+
vi.fn().mockResolvedValue({
|
|
150
|
+
json: async () => {
|
|
151
|
+
throw new Error('Invalid JSON')
|
|
152
|
+
},
|
|
153
|
+
}),
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
const vaultData = await fetchRewards(GAUNTLET_USDC_VAULT)
|
|
157
|
+
expect(vaultData).toBeNull()
|
|
158
|
+
})
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
describe('calculateRewardsBreakdown', () => {
|
|
162
|
+
it('should calculate rewards from vault-level rewards', () => {
|
|
163
|
+
const rewards = calculateRewardsBreakdown(mockVaultWithRewards)
|
|
164
|
+
|
|
165
|
+
expect(rewards.usdc).toBe(0.025)
|
|
166
|
+
expect(rewards.morpho).toBe(0.01)
|
|
167
|
+
expect(rewards.totalRewards).toBeCloseTo(
|
|
168
|
+
0.025 + 0.01 + 0.005 * (1000000 / 1500000),
|
|
169
|
+
6,
|
|
170
|
+
)
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
it('should return zeros for vault with no rewards', () => {
|
|
174
|
+
const rewards = calculateRewardsBreakdown(mockVaultNoRewards)
|
|
175
|
+
|
|
176
|
+
expect(rewards.usdc).toBe(0)
|
|
177
|
+
expect(rewards.morpho).toBe(0)
|
|
178
|
+
expect(rewards.other).toBe(0)
|
|
179
|
+
expect(rewards.totalRewards).toBe(0)
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
it('should categorize unknown tokens as other', () => {
|
|
183
|
+
const vaultWithUnknown = {
|
|
184
|
+
...mockVaultNoRewards,
|
|
185
|
+
state: {
|
|
186
|
+
rewards: [
|
|
187
|
+
{
|
|
188
|
+
asset: { symbol: 'RARE_TOKEN' },
|
|
189
|
+
supplyApr: 0.05,
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
allocation: [],
|
|
193
|
+
},
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const rewards = calculateRewardsBreakdown(vaultWithUnknown)
|
|
197
|
+
|
|
198
|
+
expect(rewards.other).toBe(0.05)
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
it('should weight market rewards by allocation', () => {
|
|
202
|
+
const vaultWithMarketRewards = {
|
|
203
|
+
...mockVaultNoRewards,
|
|
204
|
+
state: {
|
|
205
|
+
rewards: [],
|
|
206
|
+
allocation: [
|
|
207
|
+
{
|
|
208
|
+
market: {
|
|
209
|
+
state: {
|
|
210
|
+
rewards: [{ asset: { symbol: 'USDC' }, supplyApr: 0.1 }],
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
supplyAssetsUsd: 750000, // 75% of total
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
market: {
|
|
217
|
+
state: {
|
|
218
|
+
rewards: [{ asset: { symbol: 'USDC' }, supplyApr: 0.02 }],
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
supplyAssetsUsd: 250000, // 25% of total
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const rewards = calculateRewardsBreakdown(vaultWithMarketRewards)
|
|
228
|
+
|
|
229
|
+
// Expected: 0.1 * 0.75 + 0.02 * 0.25 = 0.075 + 0.005 = 0.08
|
|
230
|
+
expect(rewards.usdc).toBeCloseTo(0.08, 6)
|
|
231
|
+
})
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
describe('fetchAndCalculateRewards', () => {
|
|
235
|
+
it('should fetch and calculate rewards breakdown', async () => {
|
|
236
|
+
vi.stubGlobal(
|
|
237
|
+
'fetch',
|
|
238
|
+
vi.fn().mockResolvedValue({
|
|
239
|
+
json: async () => ({
|
|
240
|
+
data: {
|
|
241
|
+
vaultByAddress: mockVaultWithRewards,
|
|
242
|
+
},
|
|
243
|
+
}),
|
|
244
|
+
}),
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
const rewards = await fetchAndCalculateRewards(GAUNTLET_USDC_VAULT)
|
|
248
|
+
|
|
249
|
+
expect(rewards).toBeDefined()
|
|
250
|
+
expect(typeof rewards.usdc).toBe('number')
|
|
251
|
+
expect(typeof rewards.morpho).toBe('number')
|
|
252
|
+
expect(typeof rewards.other).toBe('number')
|
|
253
|
+
expect(typeof rewards.totalRewards).toBe('number')
|
|
254
|
+
expect(rewards.usdc).toBeGreaterThan(0)
|
|
255
|
+
expect(rewards.morpho).toBeGreaterThan(0)
|
|
256
|
+
})
|
|
257
|
+
|
|
258
|
+
it('should return empty rewards when vault not found', async () => {
|
|
259
|
+
vi.stubGlobal(
|
|
260
|
+
'fetch',
|
|
261
|
+
vi.fn().mockResolvedValue({
|
|
262
|
+
json: async () => ({
|
|
263
|
+
data: {
|
|
264
|
+
vaultByAddress: null,
|
|
265
|
+
},
|
|
266
|
+
}),
|
|
267
|
+
}),
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
const rewards = await fetchAndCalculateRewards(GAUNTLET_USDC_VAULT)
|
|
271
|
+
|
|
272
|
+
expect(rewards.usdc).toBe(0)
|
|
273
|
+
expect(rewards.morpho).toBe(0)
|
|
274
|
+
expect(rewards.other).toBe(0)
|
|
275
|
+
expect(rewards.totalRewards).toBe(0)
|
|
276
|
+
})
|
|
277
|
+
})
|
|
278
|
+
|
|
279
|
+
// External tests that make real network requests (only run with EXTERNAL_TEST=true)
|
|
280
|
+
describe.runIf(externalTest())('External API Tests', () => {
|
|
281
|
+
it('should fetch raw vault data from Morpho GraphQL API', async () => {
|
|
20
282
|
const vaultData = await fetchRewards(GAUNTLET_USDC_VAULT)
|
|
21
283
|
|
|
22
284
|
expect(vaultData).toBeDefined()
|
|
@@ -25,13 +287,9 @@ describe('Morpho API Integration', () => {
|
|
|
25
287
|
GAUNTLET_USDC_VAULT.toLowerCase(),
|
|
26
288
|
)
|
|
27
289
|
expect(vaultData.state).toBeDefined()
|
|
28
|
-
},
|
|
29
|
-
30000,
|
|
30
|
-
) // 30 second timeout for network request
|
|
290
|
+
}, 30000)
|
|
31
291
|
|
|
32
|
-
|
|
33
|
-
'should fetch and calculate rewards breakdown',
|
|
34
|
-
async () => {
|
|
292
|
+
it('should fetch and calculate rewards breakdown', async () => {
|
|
35
293
|
const rewards = await fetchAndCalculateRewards(GAUNTLET_USDC_VAULT)
|
|
36
294
|
|
|
37
295
|
expect(rewards).toBeDefined()
|
|
@@ -40,57 +298,26 @@ describe('Morpho API Integration', () => {
|
|
|
40
298
|
expect(typeof rewards.other).toBe('number')
|
|
41
299
|
expect(typeof rewards.totalRewards).toBe('number')
|
|
42
300
|
|
|
43
|
-
// All reward APRs should be non-negative
|
|
44
301
|
expect(rewards.usdc).toBeGreaterThanOrEqual(0)
|
|
45
302
|
expect(rewards.morpho).toBeGreaterThanOrEqual(0)
|
|
46
303
|
expect(rewards.other).toBeGreaterThanOrEqual(0)
|
|
47
304
|
expect(rewards.totalRewards).toBeGreaterThanOrEqual(0)
|
|
48
305
|
|
|
49
|
-
// Total rewards should equal sum of individual rewards
|
|
50
306
|
const expectedTotal = rewards.usdc + rewards.morpho + rewards.other
|
|
51
307
|
expect(rewards.totalRewards).toBeCloseTo(expectedTotal, 6)
|
|
308
|
+
}, 30000)
|
|
52
309
|
|
|
53
|
-
|
|
54
|
-
// This assertion may need adjustment based on actual market conditions
|
|
55
|
-
expect(rewards.totalRewards).toBeGreaterThanOrEqual(0)
|
|
56
|
-
},
|
|
57
|
-
30000,
|
|
58
|
-
) // 30 second timeout for network request
|
|
59
|
-
|
|
60
|
-
it.runIf(externalTest())(
|
|
61
|
-
'should handle non-existent vault gracefully',
|
|
62
|
-
async () => {
|
|
310
|
+
it('should handle non-existent vault gracefully', async () => {
|
|
63
311
|
const nonExistentVault =
|
|
64
312
|
'0x0000000000000000000000000000000000000000' as Address
|
|
65
313
|
|
|
66
314
|
const vaultData = await fetchRewards(nonExistentVault)
|
|
67
315
|
expect(vaultData).toBeNull()
|
|
68
|
-
},
|
|
69
|
-
30000,
|
|
70
|
-
) // 30 second timeout for network request
|
|
71
|
-
|
|
72
|
-
it('should handle API errors gracefully', async () => {
|
|
73
|
-
// Mock fetch to simulate network error
|
|
74
|
-
vi.stubGlobal(
|
|
75
|
-
'fetch',
|
|
76
|
-
vi.fn().mockRejectedValue(new Error('Network error')),
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
const vaultData = await fetchRewards(GAUNTLET_USDC_VAULT)
|
|
81
|
-
expect(vaultData).toBeNull()
|
|
82
|
-
} finally {
|
|
83
|
-
// Restore original fetch
|
|
84
|
-
vi.unstubAllGlobals()
|
|
85
|
-
}
|
|
86
|
-
})
|
|
316
|
+
}, 30000)
|
|
87
317
|
|
|
88
|
-
|
|
89
|
-
'should validate GraphQL response structure',
|
|
90
|
-
async () => {
|
|
318
|
+
it('should validate GraphQL response structure', async () => {
|
|
91
319
|
const vaultData = await fetchRewards(GAUNTLET_USDC_VAULT)
|
|
92
320
|
|
|
93
|
-
// Verify that the response has the expected structure
|
|
94
321
|
expect(vaultData).toMatchObject({
|
|
95
322
|
address: expect.any(String),
|
|
96
323
|
state: expect.objectContaining({
|
|
@@ -98,7 +325,6 @@ describe('Morpho API Integration', () => {
|
|
|
98
325
|
allocation: expect.any(Array),
|
|
99
326
|
}),
|
|
100
327
|
})
|
|
101
|
-
},
|
|
102
|
-
|
|
103
|
-
) // 30 second timeout for network request
|
|
328
|
+
}, 30000)
|
|
329
|
+
})
|
|
104
330
|
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { baseSepolia } from 'viem/chains'
|
|
2
|
+
|
|
3
|
+
import type { MorphoContractsRegistry } from '@/types/lend/contracts.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Morpho Blue core contract - same address on all chains via CREATE2
|
|
7
|
+
*/
|
|
8
|
+
const MORPHO_BLUE = '0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb' as const
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Contract addresses for chains NOT supported by Morpho SDK (testnets).
|
|
12
|
+
* Mainnet/Base use the SDK which provides richer data including rewards.
|
|
13
|
+
*/
|
|
14
|
+
export const MORPHO_CONTRACTS: MorphoContractsRegistry = {
|
|
15
|
+
[baseSepolia.id]: {
|
|
16
|
+
morphoBlue: MORPHO_BLUE,
|
|
17
|
+
irm: '0x46415998764C29aB2a25CbeA6254146D50D22687',
|
|
18
|
+
},
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get Morpho contracts for a chain
|
|
23
|
+
* @param chainId - Chain ID
|
|
24
|
+
* @returns Morpho contracts if supported, undefined otherwise
|
|
25
|
+
*/
|
|
26
|
+
export function getMorphoContracts(chainId: number) {
|
|
27
|
+
return MORPHO_CONTRACTS[chainId]
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Check if Morpho is supported on a chain
|
|
32
|
+
* @param chainId - Chain ID
|
|
33
|
+
* @returns true if Morpho is deployed on this chain
|
|
34
|
+
*/
|
|
35
|
+
export function isMorphoChainSupported(chainId: number): boolean {
|
|
36
|
+
return chainId in MORPHO_CONTRACTS
|
|
37
|
+
}
|