From 3a43ed0095aea85ae641bc965e52aefb9e82f523 Mon Sep 17 00:00:00 2001 From: Hayden Shively <17186559+haydenshively@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:03:39 -0500 Subject: [PATCH] Allow users to deposit raw ETH instead of just WETH (#848) --- .../components/markets/modal/SupplyModal.tsx | 51 ++++++++++++----- .../components/portfolio/PortfolioGrid.tsx | 4 +- .../portfolio/modal/EarnInterestModal.tsx | 57 +++++++++++++------ earn/src/data/LendingPair.ts | 20 ++++++- earn/src/pages/MarketsPage.tsx | 11 +++- earn/src/pages/PortfolioPage.tsx | 12 ++-- shared/src/abis/Router.ts | 4 +- shared/src/data/TokenData.ts | 34 +---------- shared/src/data/constants/ChainSpecific.tsx | 32 +++++++---- 9 files changed, 135 insertions(+), 90 deletions(-) diff --git a/earn/src/components/markets/modal/SupplyModal.tsx b/earn/src/components/markets/modal/SupplyModal.tsx index e7376b31..e74a5894 100644 --- a/earn/src/components/markets/modal/SupplyModal.tsx +++ b/earn/src/components/markets/modal/SupplyModal.tsx @@ -8,7 +8,7 @@ import Modal from 'shared/lib/components/common/Modal'; import TokenAmountInput from 'shared/lib/components/common/TokenAmountInput'; import Tooltip from 'shared/lib/components/common/Tooltip'; import { Text } from 'shared/lib/components/common/Typography'; -import { ALOE_II_ROUTER_ADDRESS } from 'shared/lib/data/constants/ChainSpecific'; +import { ALOE_II_ROUTER_ADDRESS, ETH_RESERVED_FOR_GAS } from 'shared/lib/data/constants/ChainSpecific'; import { ROUTER_TRANSMITTANCE, TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; import { Permit2State, usePermit2 } from 'shared/lib/data/hooks/UsePermit2'; @@ -75,8 +75,9 @@ function getConfirmButton(state: ConfirmButtonState, token: Token): { text: stri } type DepositButtonProps = { - depositAmount: GN; - depositBalance: GN; + supplyAmount: GN; + userBalanceTotal: GN; + userBalanceToken: GN; token: Token; kitty: Kitty; accountAddress: Address; @@ -85,15 +86,19 @@ type DepositButtonProps = { }; function DepositButton(props: DepositButtonProps) { - const { depositAmount, depositBalance, token, kitty, accountAddress, setIsOpen, setPendingTxn } = props; + const { supplyAmount, userBalanceTotal, userBalanceToken, token, kitty, accountAddress, setIsOpen, setPendingTxn } = + props; const { activeChain } = useContext(ChainContext); const [isPending, setIsPending] = useState(false); + const supplyAmountToken = GN.min(supplyAmount, userBalanceToken); + const supplyAmountEth = supplyAmount.lte(userBalanceTotal) ? supplyAmount.sub(supplyAmountToken) : undefined; + const { state: permit2State, action: permit2Action, result: permit2Result, - } = usePermit2(activeChain, token, accountAddress, ALOE_II_ROUTER_ADDRESS[activeChain.id], depositAmount); + } = usePermit2(activeChain, token, accountAddress, ALOE_II_ROUTER_ADDRESS[activeChain.id], supplyAmountToken); const { config: depsitWithPermit2Config, refetch: refetchDepositWithPermit2 } = usePrepareContractWrite({ address: ALOE_II_ROUTER_ADDRESS[activeChain.id], @@ -107,6 +112,9 @@ function DepositButton(props: DepositButtonProps) { BigNumber.from(permit2Result.deadline), permit2Result.signature ?? '0x', ], + overrides: { + value: supplyAmountEth?.toBigNumber(), + }, chainId: activeChain.id, enabled: permit2State === Permit2State.DONE, }); @@ -142,9 +150,9 @@ function DepositButton(props: DepositButtonProps) { let confirmButtonState: ConfirmButtonState; if (isPending) { confirmButtonState = ConfirmButtonState.WAITING_FOR_TRANSACTION; - } else if (depositAmount.isZero()) { + } else if (supplyAmount.isZero()) { confirmButtonState = ConfirmButtonState.LOADING; - } else if (depositAmount.gt(depositBalance)) { + } else if (supplyAmount.gt(userBalanceTotal)) { confirmButtonState = ConfirmButtonState.INSUFFICIENT_ASSET; } else { confirmButtonState = permit2StateToButtonStateMap[permit2State] ?? ConfirmButtonState.READY; @@ -193,7 +201,7 @@ export default function SupplyModal(props: SupplyModalProps) { const { activeChain } = useContext(ChainContext); const { address: userAddress } = useAccount(); - const { refetch: refetchBalance, data: userBalanceResult } = useBalance({ + const { refetch: refetchBalanceToken, data: tokenBalanceResult } = useBalance({ address: userAddress, token: selectedRow.asset.address, chainId: activeChain.id, @@ -201,17 +209,33 @@ export default function SupplyModal(props: SupplyModalProps) { enabled: isOpen, }); + const isWeth = selectedRow.asset.name === 'Wrapped Ether'; + const { refetch: refetchBalanceEth, data: ethBalanceResult } = useBalance({ + address: userAddress, + chainId: activeChain.id, + watch: false, + enabled: isOpen && isWeth, + }); + useEffect(() => { let interval: NodeJS.Timer | null = null; - interval = setInterval(() => refetchBalance(), 13_000); + interval = setInterval(() => { + refetchBalanceToken(); + refetchBalanceEth(); + }, 13_000); return () => { if (interval != null) { clearInterval(interval); } }; - }, [refetchBalance]); + }, [refetchBalanceToken, refetchBalanceEth]); + + const tokenBalance = GN.fromBigNumber(tokenBalanceResult?.value ?? BigNumber.from(0), selectedRow.asset.decimals); + const ethBalance = GN.fromBigNumber(ethBalanceResult?.value ?? BigNumber.from(0), 18); + const userBalance = isWeth + ? tokenBalance.add(GN.max(ethBalance.sub(ETH_RESERVED_FOR_GAS[activeChain.id]), GN.zero(18))) + : tokenBalance; - const userBalance = GN.fromDecimalString(userBalanceResult?.formatted ?? '0', selectedRow.asset.decimals); const supplyAmount = GN.fromDecimalString(amount || '0', selectedRow.asset.decimals); const apyPercentage = roundPercentage(selectedRow.apy, 2).toFixed(2); @@ -273,8 +297,9 @@ export default function SupplyModal(props: SupplyModalProps) { quote.token.address === activeAssetAddress) : undefined; + activeAssetAddress != null ? tokenQuotes.find((quote) => quote.token?.address === activeAssetAddress) : undefined; const currentTokenPriceData = - activeAsset != null ? tokenPriceData.find((data) => data.token.address === activeAsset.address) : undefined; + activeAsset != null ? tokenPriceData.find((data) => data.token?.address === activeAsset.address) : undefined; const activeColor = activeAsset ? tokenColors.get(activeAsset.address) : undefined; return ( diff --git a/earn/src/components/portfolio/modal/EarnInterestModal.tsx b/earn/src/components/portfolio/modal/EarnInterestModal.tsx index c029b935..fa480ca0 100644 --- a/earn/src/components/portfolio/modal/EarnInterestModal.tsx +++ b/earn/src/components/portfolio/modal/EarnInterestModal.tsx @@ -8,9 +8,9 @@ import { BaseMaxButton } from 'shared/lib/components/common/Input'; import Modal from 'shared/lib/components/common/Modal'; import Tooltip from 'shared/lib/components/common/Tooltip'; import { Text } from 'shared/lib/components/common/Typography'; -import { ALOE_II_ROUTER_ADDRESS } from 'shared/lib/data/constants/ChainSpecific'; +import { ALOE_II_ROUTER_ADDRESS, ETH_RESERVED_FOR_GAS } from 'shared/lib/data/constants/ChainSpecific'; import { ROUTER_TRANSMITTANCE, TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; -import { GN } from 'shared/lib/data/GoodNumber'; +import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; import { usePermit2, Permit2State } from 'shared/lib/data/hooks/UsePermit2'; import { Kitty } from 'shared/lib/data/Kitty'; import { Token } from 'shared/lib/data/Token'; @@ -76,8 +76,9 @@ function getConfirmButton(state: ConfirmButtonState, token: Token): { text: stri } type DepositButtonProps = { - depositAmount: GN; - depositBalance: GN; + supplyAmount: GN; + userBalanceTotal: GN; + userBalanceToken: GN; token: Token; kitty: Kitty; accountAddress: Address; @@ -86,15 +87,19 @@ type DepositButtonProps = { }; function DepositButton(props: DepositButtonProps) { - const { depositAmount, depositBalance, token, kitty, accountAddress, setIsOpen, setPendingTxn } = props; + const { supplyAmount, userBalanceTotal, userBalanceToken, token, kitty, accountAddress, setIsOpen, setPendingTxn } = + props; const { activeChain } = useContext(ChainContext); const [isPending, setIsPending] = useState(false); + const supplyAmountToken = GN.min(supplyAmount, userBalanceToken); + const supplyAmountEth = supplyAmount.lte(userBalanceTotal) ? supplyAmount.sub(supplyAmountToken) : undefined; + const { state: permit2State, action: permit2Action, result: permit2Result, - } = usePermit2(activeChain, token, accountAddress, ALOE_II_ROUTER_ADDRESS[activeChain.id], depositAmount); + } = usePermit2(activeChain, token, accountAddress, ALOE_II_ROUTER_ADDRESS[activeChain.id], supplyAmountToken); const { config: depsitWithPermit2Config, refetch: refetchDepositWithPermit2 } = usePrepareContractWrite({ address: ALOE_II_ROUTER_ADDRESS[activeChain.id], @@ -108,6 +113,9 @@ function DepositButton(props: DepositButtonProps) { BigNumber.from(permit2Result.deadline), permit2Result.signature ?? '0x', ], + overrides: { + value: supplyAmountEth?.toBigNumber(), + }, chainId: activeChain.id, enabled: permit2State === Permit2State.DONE, }); @@ -143,9 +151,9 @@ function DepositButton(props: DepositButtonProps) { let confirmButtonState: ConfirmButtonState; if (isPending) { confirmButtonState = ConfirmButtonState.WAITING_FOR_TRANSACTION; - } else if (depositAmount.isZero()) { + } else if (supplyAmount.isZero()) { confirmButtonState = ConfirmButtonState.LOADING; - } else if (depositAmount.gt(depositBalance)) { + } else if (supplyAmount.gt(userBalanceTotal)) { confirmButtonState = ConfirmButtonState.INSUFFICIENT_ASSET; } else { confirmButtonState = permit2StateToButtonStateMap[permit2State] ?? ConfirmButtonState.READY; @@ -215,18 +223,27 @@ export default function EarnInterestModal(props: EarnInterestModalProps) { }, [defaultOption]); // Get the user's balance of the selected token - const { refetch: refetchDepositBalance, data: depositBalance } = useBalance({ + const { refetch: refetchBalanceToken, data: tokenBalanceResult } = useBalance({ address: account?.address ?? '0x', token: selectedOption.address, chainId: activeChain.id, enabled: isOpen, }); + const isWeth = selectedOption.name === 'Wrapped Ether'; + const { refetch: refetchBalanceEth, data: ethBalanceResult } = useBalance({ + address: account?.address ?? '0x', + chainId: activeChain.id, + watch: false, + enabled: isOpen && isWeth, + }); + useEffect(() => { let interval: NodeJS.Timer | null = null; if (isOpen) { interval = setInterval(() => { - refetchDepositBalance(); + refetchBalanceToken(); + refetchBalanceEth(); }, 13_000); } if (!isOpen && interval != null) { @@ -237,7 +254,7 @@ export default function EarnInterestModal(props: EarnInterestModalProps) { clearInterval(interval); } }; - }, [refetchDepositBalance, isOpen]); + }, [refetchBalanceToken, refetchBalanceEth, isOpen]); // Get the active kitty that corresponds to the selected token and is in // the selected token / collateral token lending pair @@ -261,8 +278,13 @@ export default function EarnInterestModal(props: EarnInterestModalProps) { ? selectedPairOption.token1 : selectedPairOption.token0; - const gnDepositAmount = GN.fromDecimalString(inputValue || '0', selectedOption.decimals); - const gnDepositBalance = GN.fromDecimalString(depositBalance?.formatted ?? '0', selectedOption.decimals); + const tokenBalance = GN.fromBigNumber(tokenBalanceResult?.value ?? BigNumber.from(0), selectedOption.decimals); + const ethBalance = GN.fromBigNumber(ethBalanceResult?.value ?? BigNumber.from(0), 18); + const userBalance = isWeth + ? tokenBalance.add(GN.max(ethBalance.sub(ETH_RESERVED_FOR_GAS[activeChain.id]), GN.zero(18))) + : tokenBalance; + + const supplyAmount = GN.fromDecimalString(inputValue || '0', selectedOption.decimals); return ( { - if (depositBalance != null) { - setInputValue(depositBalance?.formatted); + if (tokenBalanceResult != null) { + setInputValue(userBalance.toString(GNFormat.DECIMAL)); } }} > @@ -369,8 +391,9 @@ export default function EarnInterestModal(props: EarnInterestModalProps) {
{ const hexes = [ `${lendingPair.token0.address}.balanceOf`, @@ -382,8 +390,14 @@ export async function getLendingPairBalances( balancesMap.set(lendingPair.kitty1.address, { value: gns[3].toNumber(), gn: gns[3], form: 'underlying' }); deprecatedLendingPairBalancesArray.push({ - token0Balance: toImpreciseNumber(BigNumber.from(hexes[0]), lendingPair.token0.decimals), - token1Balance: toImpreciseNumber(BigNumber.from(hexes[1]), lendingPair.token1.decimals), + token0Balance: toImpreciseNumber( + BigNumber.from(hexes[0]).add(lendingPair.token0.name === 'Wrapped Ether' ? ethBalance : 0), + lendingPair.token0.decimals + ), + token1Balance: toImpreciseNumber( + BigNumber.from(hexes[1]).add(lendingPair.token1.name === 'Wrapped Ether' ? ethBalance : 0), + lendingPair.token1.decimals + ), kitty0Balance: toImpreciseNumber(BigNumber.from(hexes[2]), lendingPair.token0.decimals), kitty1Balance: toImpreciseNumber(BigNumber.from(hexes[3]), lendingPair.token1.decimals), }); diff --git a/earn/src/pages/MarketsPage.tsx b/earn/src/pages/MarketsPage.tsx index 2a94e33d..a267144e 100644 --- a/earn/src/pages/MarketsPage.tsx +++ b/earn/src/pages/MarketsPage.tsx @@ -26,6 +26,7 @@ import { getLendingPairBalances, LendingPairBalancesMap } from '../data/LendingP import { fetchBorrowerDatas, UniswapPoolInfo } from '../data/MarginAccount'; import { PriceRelayLatestResponse } from '../data/PriceRelayResponse'; import { getProminentColor } from '../util/Colors'; +import { ZERO_ADDRESS } from '../data/constants/Addresses'; const SECONDARY_COLOR = 'rgba(130, 160, 182, 1)'; const SELECTED_TAB_KEY = 'selectedTab'; @@ -252,11 +253,17 @@ export default function MarketsPage() { const supplyRows = useMemo(() => { const rows: SupplyTableRow[] = []; + const ethBalance = balancesMap.get(ZERO_ADDRESS); lendingPairs.forEach((pair) => { + const isToken0Weth = pair.token0.name === 'Wrapped Ether'; + const isToken1Weth = pair.token1.name === 'Wrapped Ether'; + const token0Price = tokenQuotes.get(pair.token0.symbol) || 0; const token1Price = tokenQuotes.get(pair.token1.symbol) || 0; - const token0Balance = balancesMap.get(pair.token0.address)?.value || 0; - const token1Balance = balancesMap.get(pair.token1.address)?.value || 0; + const token0Balance = + (balancesMap.get(pair.token0.address)?.value || 0) + ((isToken0Weth && ethBalance?.value) || 0); + const token1Balance = + (balancesMap.get(pair.token1.address)?.value || 0) + ((isToken1Weth && ethBalance?.value) || 0); const kitty0Balance = balancesMap.get(pair.kitty0.address)?.value || 0; const kitty1Balance = balancesMap.get(pair.kitty1.address)?.value || 0; diff --git a/earn/src/pages/PortfolioPage.tsx b/earn/src/pages/PortfolioPage.tsx index 397f6d10..395029f1 100644 --- a/earn/src/pages/PortfolioPage.tsx +++ b/earn/src/pages/PortfolioPage.tsx @@ -84,12 +84,12 @@ export type PriceEntry = { }; export type TokenQuote = { - token: Token; + token?: Token; price: number; }; export type TokenPriceData = { - token: Token; + token?: Token; priceEntries: PriceEntry[]; }; @@ -175,13 +175,13 @@ export default function PortfolioPage() { } const tokenQuoteData: TokenQuote[] = Object.entries(latestPriceResponse).map(([symbol, data]) => { return { - token: getTokenBySymbol(activeChain.id, symbol)!, + token: getTokenBySymbol(activeChain.id, symbol), price: data.price, }; }); const tokenPriceData: TokenPriceData[] = Object.entries(historicalPriceResponse).map(([symbol, data]) => { return { - token: getTokenBySymbol(activeChain.id, symbol)!, + token: getTokenBySymbol(activeChain.id, symbol), priceEntries: data.prices, }; }); @@ -240,8 +240,8 @@ export default function PortfolioPage() { const combinedBalances: TokenBalance[] = useMemo(() => { const combined = lendingPairs.flatMap((pair, i) => { - const token0Quote = tokenQuotes.find((quote) => quote.token.address === pair.token0.address); - const token1Quote = tokenQuotes.find((quote) => quote.token.address === pair.token1.address); + const token0Quote = tokenQuotes.find((quote) => quote.token?.address === pair.token0.address); + const token1Quote = tokenQuotes.find((quote) => quote.token?.address === pair.token1.address); const token0Price = token0Quote?.price || 0; const token1Price = token1Quote?.price || 0; const pairName: string = `${pair.token0.symbol}-${pair.token1.symbol}`; diff --git a/shared/src/abis/Router.ts b/shared/src/abis/Router.ts index 0d590c16..42dd385c 100644 --- a/shared/src/abis/Router.ts +++ b/shared/src/abis/Router.ts @@ -33,7 +33,7 @@ export const routerAbi = [ { name: 'signature', type: 'bytes', internalType: 'bytes' }, ], outputs: [{ name: 'shares', type: 'uint256', internalType: 'uint256' }], - stateMutability: 'nonpayable', + stateMutability: 'payable', }, { type: 'function', @@ -55,7 +55,7 @@ export const routerAbi = [ { name: 's', type: 'bytes32', internalType: 'bytes32' }, ], outputs: [{ name: 'shares', type: 'uint256', internalType: 'uint256' }], - stateMutability: 'nonpayable', + stateMutability: 'payable', }, { type: 'function', diff --git a/shared/src/data/TokenData.ts b/shared/src/data/TokenData.ts index 11ca60f0..cddd731c 100644 --- a/shared/src/data/TokenData.ts +++ b/shared/src/data/TokenData.ts @@ -1,6 +1,6 @@ import { Token } from './Token'; import { Address } from 'wagmi'; -import { arbitrum, optimism, mainnet, goerli } from 'wagmi/chains'; +import { arbitrum, optimism, mainnet } from 'wagmi/chains'; import BrettLogo from '../assets/png/brett.png'; import EthenaLogo from '../assets/png/ethena.png'; @@ -39,33 +39,6 @@ import { } from '../assets/svg/tokens'; import { base } from './BaseChain'; -const USDC_GOERLI = new Token( - goerli.id, - '0x3c80ca907ee39f6c3021b66b5a55ccc18e07141a', - 6, - 'USDC', - 'Aloe Mock USDC', - UsdcLogo -); - -const WBTC_GOERLI = new Token( - goerli.id, - '0x886055958cdf2635ff47a2071264a3413d26f959', - 8, - 'WBTC', - 'Aloe Mock WBTC', - WbtcLogo -); - -const WETH_GOERLI = new Token( - goerli.id, - '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6', - 18, - 'WETH', - 'Aloe Mock WETH', - WethLogo -); - const USDC_MAINNET = new Token( mainnet.id, '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', @@ -444,11 +417,6 @@ const TOKEN_DATA: { [chainId: number]: { [address: Address]: Token } } = { [LDO_MAINNET.address]: LDO_MAINNET, [ENA_MAINNET.address]: ENA_MAINNET, }, - [goerli.id]: { - [USDC_GOERLI.address]: USDC_GOERLI, - [WBTC_GOERLI.address]: WBTC_GOERLI, - [WETH_GOERLI.address]: WETH_GOERLI, - }, [optimism.id]: { [BRIDGED_USDC_OPTIMISM.address]: BRIDGED_USDC_OPTIMISM, [DAI_OPTIMISM.address]: DAI_OPTIMISM, diff --git a/shared/src/data/constants/ChainSpecific.tsx b/shared/src/data/constants/ChainSpecific.tsx index a29315f2..ff273a4c 100644 --- a/shared/src/data/constants/ChainSpecific.tsx +++ b/shared/src/data/constants/ChainSpecific.tsx @@ -3,6 +3,7 @@ import { base } from '../BaseChain'; import { Address } from 'wagmi'; import { ArbitrumLogo, BaseLogo, EthereumLogo, OptimismLogo } from '../../assets/svg/chains'; +import { GN } from '../GoodNumber'; export const BRIDGE_SUPPORTED_CHAINS = [mainnet, optimism, arbitrum]; @@ -42,6 +43,13 @@ export const APPROX_SECONDS_PER_BLOCK: { [chainId: number]: number } = { [base.id]: 2, }; +export const ETH_RESERVED_FOR_GAS: { [chainId: number]: GN } = { + [mainnet.id]: GN.fromDecimalString('0.1', 18), + [optimism.id]: GN.fromDecimalString('0.005', 18), + [arbitrum.id]: GN.fromDecimalString('0.005', 18), + [base.id]: GN.fromDecimalString('0.005', 18), +}; + export const MANAGER_NAME_MAP: { [manager: Address]: string } = { '0xBb5A35B80b15A8E5933fDC11646A20f6159Dd061': 'SimpleManager', '0x2b7E3A41Eac757CC1e8e9E61a4Ad5C9D6421516e': 'BorrowerNFTMultiManager', @@ -105,10 +113,10 @@ export const ALOE_II_LENDER_LENS_ADDRESS: { [chainId: number]: Address } = { }; export const ALOE_II_ROUTER_ADDRESS: { [chainId: number]: Address } = { - [mainnet.id]: '0x00000000380f13622e73eA495F25F8F7F2da7dC2', - [optimism.id]: '0x00000000380f13622e73eA495F25F8F7F2da7dC2', - [arbitrum.id]: '0x00000000380f13622e73eA495F25F8F7F2da7dC2', - [base.id]: '0x00000000380f13622e73eA495F25F8F7F2da7dC2', + [mainnet.id]: '0x00000000E06A067f9eB0fbA25c965505e9594796', + [optimism.id]: '0x00000000E06A067f9eB0fbA25c965505e9594796', + [arbitrum.id]: '0x00000000E06A067f9eB0fbA25c965505e9594796', + [base.id]: '0x00000000E06A067f9eB0fbA25c965505e9594796', }; export const ALOE_II_SIMPLE_MANAGER_ADDRESS: { [chainId: number]: Address } = { @@ -147,10 +155,10 @@ export const ALOE_II_ORACLE_ADDRESS: { [chainId: number]: Address } = { }; export const ALOE_II_UNISWAP_NFT_MANAGER_ADDRESS: { [chainId: number]: Address } = { - [mainnet.id]: '0x3EE236D69F6950525ff317D7a872439F09902C65', - [optimism.id]: '0x3EE236D69F6950525ff317D7a872439F09902C65', - [arbitrum.id]: '0x3EE236D69F6950525ff317D7a872439F09902C65', - [base.id]: '0x7357E37a60839DE89A52861Cf50851E317FFBE71', + [mainnet.id]: '0xeDE551885bC51C46Bb0da6AD0b6268396EB8aeBf', + [optimism.id]: '0xeDE551885bC51C46Bb0da6AD0b6268396EB8aeBf', + [arbitrum.id]: '0xeDE551885bC51C46Bb0da6AD0b6268396EB8aeBf', + [base.id]: '0xe56B8a872bf924Ed06929cEA57EFb1FeA58CbFB7', }; export const ALOE_II_FRONTEND_MANAGER_ADDRESS: { [chainId: number]: Address } = { @@ -168,10 +176,10 @@ export const ALOE_II_BORROWER_NFT_ADDRESS: { [chainId: number]: Address } = { }; export const ALOE_II_BOOST_MANAGER_ADDRESS: { [chainId: number]: Address } = { - [mainnet.id]: '0xB6B7521cd3bd116432FeD94c2262Dd02BA616Db4', - [optimism.id]: '0xB6B7521cd3bd116432FeD94c2262Dd02BA616Db4', - [arbitrum.id]: '0xB6B7521cd3bd116432FeD94c2262Dd02BA616Db4', - [base.id]: '0x8E287b280671700EBE66A908A56C648f930b73b4', + [mainnet.id]: '0xB08f5f4b1B9eE99e82353c9B4B499f46d98db1B5', + [optimism.id]: '0xB08f5f4b1B9eE99e82353c9B4B499f46d98db1B5', + [arbitrum.id]: '0xB08f5f4b1B9eE99e82353c9B4B499f46d98db1B5', + [base.id]: '0xC3ac51872F017cf23a815F6A952e612cB69C5482', }; export const ALOE_II_PERMIT2_MANAGER_ADDRESS: { [chainId: number]: Address } = {