@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
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Address } from 'viem'
|
|
2
|
+
|
|
3
|
+
import type { LendMarket } from '@/types/lend/index.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Creates mock Aave reserve data for testing
|
|
7
|
+
*/
|
|
8
|
+
export function createMockAaveReserve(): LendMarket {
|
|
9
|
+
return {
|
|
10
|
+
marketId: {
|
|
11
|
+
address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' as Address, // USDC on Base
|
|
12
|
+
chainId: 8453,
|
|
13
|
+
},
|
|
14
|
+
name: 'Aave USDC Base',
|
|
15
|
+
asset: {
|
|
16
|
+
metadata: {
|
|
17
|
+
name: 'USD Coin',
|
|
18
|
+
symbol: 'USDC',
|
|
19
|
+
decimals: 6,
|
|
20
|
+
},
|
|
21
|
+
address: {
|
|
22
|
+
8453: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' as Address,
|
|
23
|
+
},
|
|
24
|
+
type: 'erc20',
|
|
25
|
+
},
|
|
26
|
+
supply: {
|
|
27
|
+
totalAssets: BigInt(10000000e6),
|
|
28
|
+
totalShares: BigInt(10000000e6),
|
|
29
|
+
},
|
|
30
|
+
apy: {
|
|
31
|
+
total: 0.0325, // 3.25%
|
|
32
|
+
native: 0.0325,
|
|
33
|
+
totalRewards: 0,
|
|
34
|
+
performanceFee: 0,
|
|
35
|
+
},
|
|
36
|
+
metadata: {
|
|
37
|
+
owner: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5' as Address,
|
|
38
|
+
curator: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5' as Address,
|
|
39
|
+
fee: 0,
|
|
40
|
+
lastUpdate: Math.floor(Date.now() / 1000),
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Creates mock ETH reserve data for testing (native asset)
|
|
47
|
+
* @description Uses type: 'native' to test native ETH handling via WETHGateway
|
|
48
|
+
*/
|
|
49
|
+
export function createMockWETHReserve(): LendMarket {
|
|
50
|
+
return {
|
|
51
|
+
marketId: {
|
|
52
|
+
address: '0x4200000000000000000000000000000000000006' as Address, // WETH on OP Stack
|
|
53
|
+
chainId: 8453,
|
|
54
|
+
},
|
|
55
|
+
name: 'Aave ETH Base',
|
|
56
|
+
asset: {
|
|
57
|
+
metadata: {
|
|
58
|
+
name: 'Ethereum',
|
|
59
|
+
symbol: 'ETH',
|
|
60
|
+
decimals: 18,
|
|
61
|
+
},
|
|
62
|
+
address: {
|
|
63
|
+
8453: 'native',
|
|
64
|
+
},
|
|
65
|
+
type: 'native',
|
|
66
|
+
},
|
|
67
|
+
supply: {
|
|
68
|
+
totalAssets: BigInt(5000e18),
|
|
69
|
+
totalShares: BigInt(5000e18),
|
|
70
|
+
},
|
|
71
|
+
apy: {
|
|
72
|
+
total: 0.018, // 1.8%
|
|
73
|
+
native: 0.018,
|
|
74
|
+
totalRewards: 0,
|
|
75
|
+
performanceFee: 0,
|
|
76
|
+
},
|
|
77
|
+
metadata: {
|
|
78
|
+
owner: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5' as Address,
|
|
79
|
+
curator: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5' as Address,
|
|
80
|
+
fee: 0,
|
|
81
|
+
lastUpdate: Math.floor(Date.now() / 1000),
|
|
82
|
+
},
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { MockReceiverAddress } from '@/lend/__mocks__/MockMarkets.js'
|
|
4
|
+
import {
|
|
5
|
+
createMockAaveReserve,
|
|
6
|
+
createMockWETHReserve,
|
|
7
|
+
} from '@/lend/providers/aave/__mocks__/mockReserve.js'
|
|
8
|
+
import { AaveLendProvider } from '@/lend/providers/aave/AaveLendProvider.js'
|
|
9
|
+
import * as aaveSdk from '@/lend/providers/aave/sdk.js'
|
|
10
|
+
import { MockChainManager } from '@/services/__mocks__/MockChainManager.js'
|
|
11
|
+
import type { ChainManager } from '@/services/ChainManager.js'
|
|
12
|
+
import type { LendProviderConfig } from '@/types/actions.js'
|
|
13
|
+
import type { Asset, LendMarketConfig } from '@/types/index.js'
|
|
14
|
+
|
|
15
|
+
// Mock the Aave SDK modules
|
|
16
|
+
vi.mock('@/lend/providers/aave/sdk.js', () => ({
|
|
17
|
+
getReserve: vi.fn(),
|
|
18
|
+
getReserves: vi.fn(),
|
|
19
|
+
getATokenAddress: vi.fn(),
|
|
20
|
+
}))
|
|
21
|
+
|
|
22
|
+
// Mock assets for Aave tests (using Base chain ID 8453)
|
|
23
|
+
const MockAaveUSDCAsset: Asset = {
|
|
24
|
+
address: {
|
|
25
|
+
8453: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
26
|
+
},
|
|
27
|
+
metadata: {
|
|
28
|
+
decimals: 6,
|
|
29
|
+
name: 'USD Coin',
|
|
30
|
+
symbol: 'USDC',
|
|
31
|
+
},
|
|
32
|
+
type: 'erc20',
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const MockAaveETHAsset: Asset = {
|
|
36
|
+
address: {
|
|
37
|
+
8453: 'native',
|
|
38
|
+
},
|
|
39
|
+
metadata: {
|
|
40
|
+
decimals: 18,
|
|
41
|
+
name: 'Ethereum',
|
|
42
|
+
symbol: 'ETH',
|
|
43
|
+
},
|
|
44
|
+
type: 'native',
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Mock market configurations for Aave
|
|
48
|
+
const MockAaveUSDCMarket: LendMarketConfig = {
|
|
49
|
+
address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
50
|
+
chainId: 8453, // Base
|
|
51
|
+
name: 'Aave USDC Base',
|
|
52
|
+
asset: MockAaveUSDCAsset,
|
|
53
|
+
lendProvider: 'aave',
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const MockAaveETHMarket: LendMarketConfig = {
|
|
57
|
+
address: '0x4200000000000000000000000000000000000006', // WETH predeploy (market uses WETH internally)
|
|
58
|
+
chainId: 8453,
|
|
59
|
+
name: 'Aave ETH Base',
|
|
60
|
+
asset: MockAaveETHAsset,
|
|
61
|
+
lendProvider: 'aave',
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
describe('AaveLendProvider', () => {
|
|
65
|
+
let provider: AaveLendProvider
|
|
66
|
+
let mockConfig: LendProviderConfig
|
|
67
|
+
let mockChainManager: ChainManager
|
|
68
|
+
|
|
69
|
+
beforeEach(() => {
|
|
70
|
+
mockConfig = {
|
|
71
|
+
marketAllowlist: [MockAaveUSDCMarket, MockAaveETHMarket],
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
mockChainManager = new MockChainManager({
|
|
75
|
+
supportedChains: [8453],
|
|
76
|
+
}) as unknown as ChainManager
|
|
77
|
+
|
|
78
|
+
provider = new AaveLendProvider(mockConfig, mockChainManager)
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
afterEach(() => {
|
|
82
|
+
vi.clearAllMocks()
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
describe('constructor', () => {
|
|
86
|
+
it('should initialize with provided config', () => {
|
|
87
|
+
expect(provider).toBeInstanceOf(AaveLendProvider)
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
describe('supportedChainIds', () => {
|
|
92
|
+
it('should return array of supported chain IDs', () => {
|
|
93
|
+
const chainIds = provider.supportedChainIds()
|
|
94
|
+
|
|
95
|
+
expect(chainIds).toHaveLength(4)
|
|
96
|
+
expect(chainIds).toContain(10) // Optimism
|
|
97
|
+
expect(chainIds).toContain(8453) // Base
|
|
98
|
+
expect(chainIds).toContain(11155420) // Optimism Sepolia
|
|
99
|
+
expect(chainIds).toContain(84532) // Base Sepolia
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
it('should return unique chain IDs', () => {
|
|
103
|
+
const chainIds = provider.supportedChainIds()
|
|
104
|
+
const uniqueIds = [...new Set(chainIds)]
|
|
105
|
+
|
|
106
|
+
expect(chainIds.length).toBe(uniqueIds.length)
|
|
107
|
+
})
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
describe('openPosition', () => {
|
|
111
|
+
beforeEach(() => {
|
|
112
|
+
const mockReserve = createMockAaveReserve()
|
|
113
|
+
vi.mocked(aaveSdk.getReserve).mockResolvedValue(mockReserve)
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
it('should successfully create a lending transaction for ERC20', async () => {
|
|
117
|
+
const amount = 1000
|
|
118
|
+
const asset = MockAaveUSDCAsset
|
|
119
|
+
const marketId = {
|
|
120
|
+
address: MockAaveUSDCMarket.address,
|
|
121
|
+
chainId: MockAaveUSDCMarket.chainId,
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const lendTransaction = await provider.openPosition({
|
|
125
|
+
amount,
|
|
126
|
+
asset,
|
|
127
|
+
marketId,
|
|
128
|
+
walletAddress: MockReceiverAddress,
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
expect(lendTransaction).toHaveProperty('amount', BigInt('1000000000'))
|
|
132
|
+
expect(lendTransaction).toHaveProperty(
|
|
133
|
+
'asset',
|
|
134
|
+
asset.address[marketId.chainId],
|
|
135
|
+
)
|
|
136
|
+
expect(lendTransaction).toHaveProperty('marketId', marketId.address)
|
|
137
|
+
expect(lendTransaction).toHaveProperty('apy')
|
|
138
|
+
expect(lendTransaction).toHaveProperty('transactionData')
|
|
139
|
+
expect(lendTransaction.transactionData).toHaveProperty('approval')
|
|
140
|
+
expect(lendTransaction.transactionData).toHaveProperty('position')
|
|
141
|
+
expect(typeof lendTransaction.apy).toBe('number')
|
|
142
|
+
expect(lendTransaction.apy).toBeGreaterThan(0)
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
it('should create native ETH deposit without approval', async () => {
|
|
146
|
+
const mockETHReserve = createMockWETHReserve()
|
|
147
|
+
vi.mocked(aaveSdk.getReserve).mockResolvedValue(mockETHReserve)
|
|
148
|
+
|
|
149
|
+
const amount = 1
|
|
150
|
+
const asset = MockAaveETHAsset
|
|
151
|
+
const marketId = {
|
|
152
|
+
address: MockAaveETHMarket.address,
|
|
153
|
+
chainId: MockAaveETHMarket.chainId,
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const lendTransaction = await provider.openPosition({
|
|
157
|
+
amount,
|
|
158
|
+
asset,
|
|
159
|
+
marketId,
|
|
160
|
+
walletAddress: MockReceiverAddress,
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
expect(lendTransaction).toHaveProperty(
|
|
164
|
+
'amount',
|
|
165
|
+
BigInt('1000000000000000000'),
|
|
166
|
+
)
|
|
167
|
+
expect(lendTransaction.transactionData).not.toHaveProperty('approval')
|
|
168
|
+
expect(lendTransaction.transactionData).toHaveProperty('position')
|
|
169
|
+
// Native ETH deposits send ETH as msg.value via WETHGateway
|
|
170
|
+
expect(lendTransaction.transactionData.position.value).toBe(
|
|
171
|
+
BigInt('1000000000000000000'),
|
|
172
|
+
)
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
it('should handle lending errors', async () => {
|
|
176
|
+
vi.mocked(aaveSdk.getReserve).mockRejectedValueOnce(
|
|
177
|
+
new Error('Market fetch failed'),
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
const asset = MockAaveUSDCAsset
|
|
181
|
+
const amount = 1000
|
|
182
|
+
const marketId = {
|
|
183
|
+
address: MockAaveUSDCMarket.address,
|
|
184
|
+
chainId: MockAaveUSDCMarket.chainId,
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
await expect(
|
|
188
|
+
provider.openPosition({
|
|
189
|
+
amount,
|
|
190
|
+
asset,
|
|
191
|
+
marketId,
|
|
192
|
+
walletAddress: MockReceiverAddress,
|
|
193
|
+
}),
|
|
194
|
+
).rejects.toThrow('Failed to open position')
|
|
195
|
+
})
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
describe('closePosition', () => {
|
|
199
|
+
beforeEach(() => {
|
|
200
|
+
const mockReserve = createMockAaveReserve()
|
|
201
|
+
vi.mocked(aaveSdk.getReserve).mockResolvedValue(mockReserve)
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
it('should successfully create a withdrawal transaction for ERC20', async () => {
|
|
205
|
+
const amount = 500
|
|
206
|
+
const asset = MockAaveUSDCAsset
|
|
207
|
+
const marketId = {
|
|
208
|
+
address: MockAaveUSDCMarket.address,
|
|
209
|
+
chainId: MockAaveUSDCMarket.chainId,
|
|
210
|
+
}
|
|
211
|
+
const walletAddress = MockReceiverAddress
|
|
212
|
+
|
|
213
|
+
const withdrawTransaction = await provider.closePosition({
|
|
214
|
+
amount,
|
|
215
|
+
asset,
|
|
216
|
+
marketId,
|
|
217
|
+
walletAddress,
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
expect(withdrawTransaction).toHaveProperty('amount', BigInt('500000000'))
|
|
221
|
+
expect(withdrawTransaction).toHaveProperty(
|
|
222
|
+
'asset',
|
|
223
|
+
asset.address[marketId.chainId],
|
|
224
|
+
)
|
|
225
|
+
expect(withdrawTransaction).toHaveProperty('marketId', marketId.address)
|
|
226
|
+
expect(withdrawTransaction).toHaveProperty('apy')
|
|
227
|
+
expect(withdrawTransaction).toHaveProperty('transactionData')
|
|
228
|
+
expect(withdrawTransaction.transactionData).toHaveProperty('position')
|
|
229
|
+
expect(withdrawTransaction.transactionData).not.toHaveProperty('approval')
|
|
230
|
+
expect(typeof withdrawTransaction.apy).toBe('number')
|
|
231
|
+
expect(withdrawTransaction.apy).toBeGreaterThan(0)
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
it('should create native ETH withdrawal with approval', async () => {
|
|
235
|
+
const mockETHReserve = createMockWETHReserve()
|
|
236
|
+
vi.mocked(aaveSdk.getReserve).mockResolvedValue(mockETHReserve)
|
|
237
|
+
vi.mocked(aaveSdk.getATokenAddress).mockResolvedValue(
|
|
238
|
+
'0xD4a0e0b9149BCee3C920d2E00b5dE09138fd8bb7',
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
const amount = 1
|
|
242
|
+
const asset = MockAaveETHAsset
|
|
243
|
+
const marketId = {
|
|
244
|
+
address: MockAaveETHMarket.address,
|
|
245
|
+
chainId: MockAaveETHMarket.chainId,
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const withdrawTransaction = await provider.closePosition({
|
|
249
|
+
amount,
|
|
250
|
+
asset,
|
|
251
|
+
marketId,
|
|
252
|
+
walletAddress: MockReceiverAddress,
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
expect(withdrawTransaction).toHaveProperty(
|
|
256
|
+
'amount',
|
|
257
|
+
BigInt('1000000000000000000'),
|
|
258
|
+
)
|
|
259
|
+
// Native ETH withdrawals require approving aWETH to WETHGateway
|
|
260
|
+
expect(withdrawTransaction.transactionData).toHaveProperty('approval')
|
|
261
|
+
expect(withdrawTransaction.transactionData).toHaveProperty('position')
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
it('should handle withdrawal errors', async () => {
|
|
265
|
+
vi.mocked(aaveSdk.getReserve).mockRejectedValueOnce(
|
|
266
|
+
new Error('Market fetch failed'),
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
const amount = 500
|
|
270
|
+
const asset = MockAaveUSDCAsset
|
|
271
|
+
const marketId = {
|
|
272
|
+
address: MockAaveUSDCMarket.address,
|
|
273
|
+
chainId: MockAaveUSDCMarket.chainId,
|
|
274
|
+
}
|
|
275
|
+
const walletAddress = MockReceiverAddress
|
|
276
|
+
|
|
277
|
+
await expect(
|
|
278
|
+
provider.closePosition({
|
|
279
|
+
amount,
|
|
280
|
+
asset,
|
|
281
|
+
marketId,
|
|
282
|
+
walletAddress,
|
|
283
|
+
}),
|
|
284
|
+
).rejects.toThrow('Market fetch failed')
|
|
285
|
+
})
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
describe('market allowlist configuration', () => {
|
|
289
|
+
it('should work without market allowlist', () => {
|
|
290
|
+
const configWithoutAllowlist: LendProviderConfig = {}
|
|
291
|
+
|
|
292
|
+
const providerWithoutAllowlist = new AaveLendProvider(
|
|
293
|
+
configWithoutAllowlist,
|
|
294
|
+
mockChainManager,
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
expect(providerWithoutAllowlist.config.marketAllowlist).toBeUndefined()
|
|
298
|
+
})
|
|
299
|
+
|
|
300
|
+
it('should store market allowlist when provided', () => {
|
|
301
|
+
const configWithAllowlist: LendProviderConfig = {
|
|
302
|
+
marketAllowlist: [MockAaveUSDCMarket],
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const providerWithAllowlist = new AaveLendProvider(
|
|
306
|
+
configWithAllowlist,
|
|
307
|
+
mockChainManager,
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
const allowlist = providerWithAllowlist.config.marketAllowlist
|
|
311
|
+
expect(allowlist).toBeDefined()
|
|
312
|
+
expect(allowlist).toHaveLength(1)
|
|
313
|
+
expect(allowlist![0].address).toBe(MockAaveUSDCMarket.address)
|
|
314
|
+
expect(allowlist![0].name).toBe(MockAaveUSDCMarket.name)
|
|
315
|
+
})
|
|
316
|
+
|
|
317
|
+
it('should handle multiple markets in allowlist', () => {
|
|
318
|
+
const configWithMultipleMarkets: LendProviderConfig = {
|
|
319
|
+
marketAllowlist: [MockAaveUSDCMarket, MockAaveETHMarket],
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const providerInstance = new AaveLendProvider(
|
|
323
|
+
configWithMultipleMarkets,
|
|
324
|
+
mockChainManager,
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
const allowlist = providerInstance.config.marketAllowlist
|
|
328
|
+
expect(allowlist).toBeDefined()
|
|
329
|
+
expect(allowlist).toHaveLength(2)
|
|
330
|
+
expect(allowlist![0].name).toBe(MockAaveUSDCMarket.name)
|
|
331
|
+
expect(allowlist![1].name).toBe(MockAaveETHMarket.name)
|
|
332
|
+
})
|
|
333
|
+
})
|
|
334
|
+
|
|
335
|
+
describe('ETH/WETH market configuration', () => {
|
|
336
|
+
it('should detect native asset type for ETH market', () => {
|
|
337
|
+
// Market is configured with ETH (type: native) but uses WETH address internally
|
|
338
|
+
expect(MockAaveETHMarket.asset.type).toBe('native')
|
|
339
|
+
expect(MockAaveETHMarket.asset.address[8453]).toBe('native')
|
|
340
|
+
// Market address points to WETH for Aave's internal operations
|
|
341
|
+
expect(MockAaveETHMarket.address).toBe(
|
|
342
|
+
'0x4200000000000000000000000000000000000006',
|
|
343
|
+
)
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
it('should use WETHGateway for ETH deposits when asset type is native', async () => {
|
|
347
|
+
const mockETHReserve = createMockWETHReserve()
|
|
348
|
+
vi.mocked(aaveSdk.getReserve).mockResolvedValue(mockETHReserve)
|
|
349
|
+
|
|
350
|
+
const lendTransaction = await provider.openPosition({
|
|
351
|
+
amount: 1,
|
|
352
|
+
asset: MockAaveETHAsset,
|
|
353
|
+
marketId: {
|
|
354
|
+
address: MockAaveETHMarket.address,
|
|
355
|
+
chainId: MockAaveETHMarket.chainId,
|
|
356
|
+
},
|
|
357
|
+
walletAddress: MockReceiverAddress,
|
|
358
|
+
})
|
|
359
|
+
|
|
360
|
+
// Native ETH deposits should have msg.value set (WETHGateway flow)
|
|
361
|
+
expect(lendTransaction.transactionData.position.value).toBe(
|
|
362
|
+
BigInt('1000000000000000000'),
|
|
363
|
+
)
|
|
364
|
+
// Should not require approval for native ETH
|
|
365
|
+
expect(lendTransaction.transactionData.approval).toBeUndefined()
|
|
366
|
+
})
|
|
367
|
+
|
|
368
|
+
it('should allow developer to configure ETH market without knowing about WETH internals', () => {
|
|
369
|
+
// Developer configures market with ETH asset
|
|
370
|
+
// SDK handles WETH internally via WETHGateway
|
|
371
|
+
const marketConfig: LendMarketConfig = {
|
|
372
|
+
address: '0x4200000000000000000000000000000000000006', // WETH address
|
|
373
|
+
chainId: 8453,
|
|
374
|
+
name: 'Aave ETH',
|
|
375
|
+
asset: MockAaveETHAsset, // Uses ETH (native) asset
|
|
376
|
+
lendProvider: 'aave',
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Verify the market uses native asset
|
|
380
|
+
expect(marketConfig.asset.type).toBe('native')
|
|
381
|
+
// Developer doesn't need to create a separate WETH asset
|
|
382
|
+
})
|
|
383
|
+
})
|
|
384
|
+
|
|
385
|
+
describe('unsupported chain handling', () => {
|
|
386
|
+
it('should throw error for unsupported chain', async () => {
|
|
387
|
+
// Use type assertion to test runtime behavior with unsupported chain
|
|
388
|
+
const unsupportedChainId = 999999 as 8453
|
|
389
|
+
const unsupportedMarket: LendMarketConfig = {
|
|
390
|
+
address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
391
|
+
chainId: unsupportedChainId,
|
|
392
|
+
name: 'Unsupported Market',
|
|
393
|
+
asset: MockAaveUSDCAsset,
|
|
394
|
+
lendProvider: 'aave',
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const configWithUnsupported: LendProviderConfig = {
|
|
398
|
+
marketAllowlist: [unsupportedMarket],
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
const providerWithUnsupported = new AaveLendProvider(
|
|
402
|
+
configWithUnsupported,
|
|
403
|
+
mockChainManager,
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
await expect(
|
|
407
|
+
providerWithUnsupported.openPosition({
|
|
408
|
+
amount: 100,
|
|
409
|
+
asset: MockAaveUSDCAsset,
|
|
410
|
+
marketId: {
|
|
411
|
+
address: unsupportedMarket.address,
|
|
412
|
+
chainId: unsupportedMarket.chainId,
|
|
413
|
+
},
|
|
414
|
+
walletAddress: MockReceiverAddress,
|
|
415
|
+
}),
|
|
416
|
+
).rejects.toThrow('not supported')
|
|
417
|
+
})
|
|
418
|
+
})
|
|
419
|
+
})
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { parseAbi } from 'viem'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Aave Pool ABI - supply and withdraw functions
|
|
5
|
+
*/
|
|
6
|
+
export const POOL_ABI = parseAbi([
|
|
7
|
+
'function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)',
|
|
8
|
+
'function withdraw(address asset, uint256 amount, address to) returns (uint256)',
|
|
9
|
+
])
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Aave Pool ABI - getReserveData for fetching reserve info including aToken addresses
|
|
13
|
+
*/
|
|
14
|
+
export const POOL_GET_RESERVE_DATA_ABI = [
|
|
15
|
+
{
|
|
16
|
+
inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],
|
|
17
|
+
name: 'getReserveData',
|
|
18
|
+
outputs: [
|
|
19
|
+
{
|
|
20
|
+
components: [
|
|
21
|
+
{ name: 'data', type: 'uint256', internalType: 'uint256' },
|
|
22
|
+
],
|
|
23
|
+
name: 'configuration',
|
|
24
|
+
type: 'tuple',
|
|
25
|
+
internalType: 'struct DataTypes.ReserveConfigurationMap',
|
|
26
|
+
},
|
|
27
|
+
{ name: 'liquidityIndex', type: 'uint128', internalType: 'uint128' },
|
|
28
|
+
{
|
|
29
|
+
name: 'currentLiquidityRate',
|
|
30
|
+
type: 'uint128',
|
|
31
|
+
internalType: 'uint128',
|
|
32
|
+
},
|
|
33
|
+
{ name: 'variableBorrowIndex', type: 'uint128', internalType: 'uint128' },
|
|
34
|
+
{
|
|
35
|
+
name: 'currentVariableBorrowRate',
|
|
36
|
+
type: 'uint128',
|
|
37
|
+
internalType: 'uint128',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'currentStableBorrowRate',
|
|
41
|
+
type: 'uint128',
|
|
42
|
+
internalType: 'uint128',
|
|
43
|
+
},
|
|
44
|
+
{ name: 'lastUpdateTimestamp', type: 'uint40', internalType: 'uint40' },
|
|
45
|
+
{ name: 'id', type: 'uint16', internalType: 'uint16' },
|
|
46
|
+
{ name: 'aTokenAddress', type: 'address', internalType: 'address' },
|
|
47
|
+
{
|
|
48
|
+
name: 'stableDebtTokenAddress',
|
|
49
|
+
type: 'address',
|
|
50
|
+
internalType: 'address',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'variableDebtTokenAddress',
|
|
54
|
+
type: 'address',
|
|
55
|
+
internalType: 'address',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'interestRateStrategyAddress',
|
|
59
|
+
type: 'address',
|
|
60
|
+
internalType: 'address',
|
|
61
|
+
},
|
|
62
|
+
{ name: 'accruedToTreasury', type: 'uint128', internalType: 'uint128' },
|
|
63
|
+
{ name: 'unbacked', type: 'uint128', internalType: 'uint128' },
|
|
64
|
+
{
|
|
65
|
+
name: 'isolationModeTotalDebt',
|
|
66
|
+
type: 'uint128',
|
|
67
|
+
internalType: 'uint128',
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
stateMutability: 'view',
|
|
71
|
+
type: 'function',
|
|
72
|
+
},
|
|
73
|
+
] as const
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Aave WETHGateway ABI - for native ETH deposits/withdrawals
|
|
77
|
+
*/
|
|
78
|
+
export const WETH_GATEWAY_ABI = parseAbi([
|
|
79
|
+
'function depositETH(address pool, address onBehalfOf, uint16 referralCode) payable',
|
|
80
|
+
'function withdrawETH(address pool, uint256 amount, address to)',
|
|
81
|
+
])
|
|
@@ -4,7 +4,9 @@ import { providers } from 'ethers'
|
|
|
4
4
|
import type { Address } from 'viem'
|
|
5
5
|
import { base, baseSepolia, optimism, optimismSepolia } from 'viem/chains'
|
|
6
6
|
|
|
7
|
+
import { WETH } from '@/constants/assets.js'
|
|
7
8
|
import type { SUPPORTED_CHAIN_IDS } from '@/constants/supportedChains.js'
|
|
9
|
+
import { POOL_GET_RESERVE_DATA_ABI } from '@/lend/providers/aave/abis/pool.js'
|
|
8
10
|
import { getPoolAddress } from '@/lend/providers/aave/addresses.js'
|
|
9
11
|
import type { ChainManager } from '@/services/ChainManager.js'
|
|
10
12
|
import type { LendProviderConfig } from '@/types/actions.js'
|
|
@@ -163,10 +165,11 @@ export async function getReserve(
|
|
|
163
165
|
})
|
|
164
166
|
|
|
165
167
|
// Find the specific reserve for this asset
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
168
|
+
// For native ETH assets, use WETH address since Aave uses WETH internally
|
|
169
|
+
const assetAddress =
|
|
170
|
+
marketConfig.asset.type === 'native'
|
|
171
|
+
? getAssetAddress(WETH, params.marketId.chainId)
|
|
172
|
+
: getAssetAddress(marketConfig.asset, params.marketId.chainId)
|
|
170
173
|
|
|
171
174
|
const reserve = reservesData.reservesData.find(
|
|
172
175
|
(r) => r.underlyingAsset.toLowerCase() === assetAddress.toLowerCase(),
|
|
@@ -253,71 +256,6 @@ export async function getReserves(
|
|
|
253
256
|
}
|
|
254
257
|
}
|
|
255
258
|
|
|
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
259
|
/**
|
|
322
260
|
* Get aToken address for a given underlying asset
|
|
323
261
|
* @param params - Parameters including asset address, chain ID, and chain manager
|