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