From cfda458afd5c1261d583effe43faa95dc17c9656 Mon Sep 17 00:00:00 2001 From: Hayden Shively <17186559+haydenshively@users.noreply.github.com> Date: Fri, 31 May 2024 23:33:24 -0500 Subject: [PATCH 1/6] Remove console.log from MarketsPage --- earn/src/pages/MarketsPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/earn/src/pages/MarketsPage.tsx b/earn/src/pages/MarketsPage.tsx index e45aad96..b9c4c389 100644 --- a/earn/src/pages/MarketsPage.tsx +++ b/earn/src/pages/MarketsPage.tsx @@ -107,7 +107,6 @@ export default function MarketsPage() { () => activeChain.id === base.id && (capabilities?.[84532]?.auxiliaryFunds.supported ?? false), [activeChain.id, capabilities] ); - console.log(capabilities?.[84532]?.auxiliaryFunds.supported); // MARK: custom hooks const { lendingPairs, refetchOracleData, refetchLenderData } = useLendingPairs(activeChain.id); From 015eaf2d2fea32078f745f37dde2ae4d89e48902 Mon Sep 17 00:00:00 2001 From: Hayden Shively <17186559+haydenshively@users.noreply.github.com> Date: Sat, 1 Jun 2024 16:28:43 -0500 Subject: [PATCH 2/6] More flexible useLendingPair params --- earn/src/components/boost/ImportBoostWidget.tsx | 2 +- earn/src/pages/AdvancedPage.tsx | 6 +----- shared/src/hooks/UseLendingPairs.ts | 16 +++++++++------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/earn/src/components/boost/ImportBoostWidget.tsx b/earn/src/components/boost/ImportBoostWidget.tsx index da21f929..e7b9ae24 100644 --- a/earn/src/components/boost/ImportBoostWidget.tsx +++ b/earn/src/components/boost/ImportBoostWidget.tsx @@ -186,7 +186,7 @@ export default function ImportBoostWidget(props: ImportBoostWidgetProps) { const { address: userAddress } = useAccount(); const { lendingPairs } = useLendingPairs(activeChain.id); - const lendingPair = useLendingPair(lendingPairs, cardInfo.token0.address, cardInfo.token1.address); + const lendingPair = useLendingPair(lendingPairs, cardInfo.uniswapPool); // Generate labels for input range (slider) const labels: string[] = []; diff --git a/earn/src/pages/AdvancedPage.tsx b/earn/src/pages/AdvancedPage.tsx index 6d311cdd..d3799fd0 100644 --- a/earn/src/pages/AdvancedPage.tsx +++ b/earn/src/pages/AdvancedPage.tsx @@ -199,11 +199,7 @@ export default function AdvancedPage() { ); }, [borrowerNftBorrowers, searchParams]); - const market = useLendingPair( - lendingPairs, - selectedMarginAccount?.token0.address, - selectedMarginAccount?.token1.address - ); + const market = useLendingPair(lendingPairs, selectedMarginAccount?.uniswapPool as Address | undefined); const availablePools = useUniswapPools(lendingPairs); diff --git a/shared/src/hooks/UseLendingPairs.ts b/shared/src/hooks/UseLendingPairs.ts index 8893adbb..9af45f50 100644 --- a/shared/src/hooks/UseLendingPairs.ts +++ b/shared/src/hooks/UseLendingPairs.ts @@ -199,14 +199,16 @@ export function useLendingPairs(chainId: number) { }; } -export function useLendingPair(lendingPairs: LendingPair[], token0?: Address, token1?: Address) { - return useMemo( - () => - lendingPairs.find( +export function useLendingPair(lendingPairs: LendingPair[], pool?: Address, token0?: Address, token1?: Address) { + return useMemo(() => { + if (pool) { + return lendingPairs.find((pair) => pool.toLowerCase() === pair.uniswapPool.toLowerCase()); + } else { + return lendingPairs.find( (pair) => pair.token0.address.toLowerCase() === token0?.toLowerCase() && pair.token1.address.toLowerCase() === token1?.toLowerCase() - ), - [lendingPairs, token0, token1] - ); + ); + } + }, [lendingPairs, pool, token0, token1]); } From be3f81e3d101caca156fca3f694392af4a4ea4ed Mon Sep 17 00:00:00 2001 From: Hayden Shively <17186559+haydenshively@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:50:20 -0500 Subject: [PATCH 3/6] Refactor and delete unused code (#872) --- earn/public/privacy.pdf | Bin 102311 -> 0 bytes earn/public/terms.pdf | Bin 223151 -> 0 bytes earn/src/components/advanced/BorrowGraph.tsx | 2 +- .../src/components/advanced/BorrowMetrics.tsx | 67 ++-- .../components/advanced/GlobalStatsTable.tsx | 3 +- .../TokenAllocationPieChartWidget.tsx | 2 +- .../advanced/TokenAllocationWidget.tsx | 2 +- .../advanced/UniswapPositionList.tsx | 2 +- .../advanced/modal/AddCollateralModal.tsx | 7 +- .../components/advanced/modal/BorrowModal.tsx | 60 +-- .../advanced/modal/ClearWarningModal.tsx | 21 +- .../advanced/modal/ImportUniswapNFTModal.tsx | 2 +- .../advanced/modal/NewSmartWalletModal.tsx | 10 +- .../advanced/modal/RemoveCollateralModal.tsx | 22 +- .../components/advanced/modal/RepayModal.tsx | 17 +- .../advanced/modal/WithdrawAnteModal.tsx | 32 +- .../modal/WithdrawUniswapNFTModal.tsx | 4 +- .../advanced/modal/tab/AddCollateralTab.tsx | 2 +- .../tab/AddUniswapNFTAsCollateralTab.tsx | 4 +- .../components/boost/ImportBoostWidget.tsx | 31 +- .../components/common/MaxSlippageInput.tsx | 5 +- .../src/components/common/PendingTxnModal.tsx | 4 +- .../markets/borrow/BorrowingWidget.tsx | 2 +- .../markets/liquidate/LiquidateTab.tsx | 8 +- .../markets/liquidate/LiquidateTable.tsx | 9 +- .../components/markets/modal/BorrowModal.tsx | 63 ++-- .../markets/modal/BorrowModalUniswap.tsx | 35 +- .../markets/modal/UpdateBorrowerModal.tsx | 2 +- .../markets/modal/UpdateCollateralModal.tsx | 5 +- .../content/AddCollateralModalContent.tsx | 2 +- .../modal/content/BorrowModalContent.tsx | 42 +-- .../content/RemoveCollateralModalContent.tsx | 42 +-- .../modal/content/RepayModalContent.tsx | 2 +- .../content/ToUniswapNFTModalContent.tsx | 8 +- .../components/markets/monitor/StatsTable.tsx | 6 +- .../portfolio/LendingPairPeerCard.tsx | 2 +- .../components/portfolio/PortfolioGrid.tsx | 2 +- .../portfolio/PortfolioPieChartWidget.tsx | 3 +- .../components/portfolio/PortfolioTooltip.tsx | 2 +- .../portfolio/modal/BridgeModal.tsx | 63 ---- .../portfolio/modal/WithdrawModal.tsx | 4 +- earn/src/connector/FactoryActions.ts | 39 -- earn/src/connector/MarginAccountActions.ts | 57 --- earn/src/data/GlobalStats.ts | 5 - earn/src/data/MarginAccount.ts | 352 ------------------ earn/src/data/PriceRelayResponse.ts | 0 earn/src/data/RedeemRewardReponse.ts | 4 - earn/src/data/constants/Addresses.ts | 6 - earn/src/data/constants/Breakpoints.ts | 15 - earn/src/data/constants/Signatures.ts | 4 - earn/src/data/constants/Values.ts | 23 -- earn/src/data/hooks/UseRedeem.ts | 6 +- .../useDeprecatedMarginAccountShim.ts} | 58 ++- earn/src/pages/AdvancedPage.tsx | 177 ++++----- earn/src/pages/BoostPage.tsx | 5 +- earn/src/pages/MarketsPage.tsx | 15 +- earn/src/pages/PortfolioPage.tsx | 9 +- earn/src/pages/boost/ManageBoostPage.tsx | 2 +- .../components/borrow/MarginAccountHeader.tsx | 4 +- .../borrow/modal/PendingTxnModal.tsx | 4 +- shared/src/data/Borrower.ts | 10 +- shared/src/hooks/UseBorrowerNft.ts | 24 +- shared/src/hooks/UseBorrowers.ts | 42 +-- shared/src/hooks/UseLendingPairs.ts | 23 +- shared/src/hooks/UseLocalStorage.ts | 12 +- shared/src/hooks/UseUniswapPools.ts | 2 +- shared/src/util/Chains.ts | 2 +- 67 files changed, 449 insertions(+), 1052 deletions(-) delete mode 100644 earn/public/privacy.pdf delete mode 100644 earn/public/terms.pdf delete mode 100644 earn/src/components/portfolio/modal/BridgeModal.tsx delete mode 100644 earn/src/connector/FactoryActions.ts delete mode 100644 earn/src/connector/MarginAccountActions.ts delete mode 100644 earn/src/data/GlobalStats.ts delete mode 100644 earn/src/data/MarginAccount.ts delete mode 100644 earn/src/data/PriceRelayResponse.ts delete mode 100644 earn/src/data/RedeemRewardReponse.ts delete mode 100644 earn/src/data/constants/Addresses.ts delete mode 100644 earn/src/data/constants/Breakpoints.ts delete mode 100644 earn/src/data/constants/Signatures.ts delete mode 100644 earn/src/data/constants/Values.ts rename earn/src/data/{BorrowerNft.ts => hooks/useDeprecatedMarginAccountShim.ts} (50%) diff --git a/earn/public/privacy.pdf b/earn/public/privacy.pdf deleted file mode 100644 index 4a23ad2aa7c105ea0cebd28f20e1c7cf6c8396f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102311 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

W(~HC2X3D#FAAuO7eQyXWTpMoOo` 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 o1TeHp7Y>1`+ttMI%f-Vye8h}j7{8D_x4S} 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 L4GtmjuYUgv(Fg(s diff --git a/earn/public/terms.pdf b/earn/public/terms.pdf deleted file mode 100644 index bb8492ecbc97505e4d0626aed9822e590f86c63e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223151 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 z 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 FM^zh5F>lrmR4VD2Psr67~a<8%?ZeaX9V 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 diff --git a/earn/src/components/advanced/BorrowGraph.tsx b/earn/src/components/advanced/BorrowGraph.tsx index bf8b1d21..24bf93f0 100644 --- a/earn/src/components/advanced/BorrowGraph.tsx +++ b/earn/src/components/advanced/BorrowGraph.tsx @@ -8,7 +8,7 @@ import { RESPONSIVE_BREAKPOINT_MD, RESPONSIVE_BREAKPOINT_SM, RESPONSIVE_BREAKPOINTS, -} from '../../data/constants/Breakpoints'; +} from 'shared/lib/data/constants/Breakpoints'; import Graph from '../graph/Graph'; const TEXT_COLOR = '#82a0b6'; diff --git a/earn/src/components/advanced/BorrowMetrics.tsx b/earn/src/components/advanced/BorrowMetrics.tsx index 3b0c1b6d..d2c1d57d 100644 --- a/earn/src/components/advanced/BorrowMetrics.tsx +++ b/earn/src/components/advanced/BorrowMetrics.tsx @@ -4,17 +4,18 @@ import { formatDistanceToNowStrict } from 'date-fns'; import Tooltip from 'shared/lib/components/common/Tooltip'; import { Display, Text } from 'shared/lib/components/common/Typography'; import { auctionCurve, sqrtRatioToTick } from 'shared/lib/data/BalanceSheet'; +import { RESPONSIVE_BREAKPOINT_MD, RESPONSIVE_BREAKPOINT_SM } from 'shared/lib/data/constants/Breakpoints'; import { MANAGER_NAME_MAP } from 'shared/lib/data/constants/ChainSpecific'; import { GREY_700 } from 'shared/lib/data/constants/Colors'; +import { LendingPair } from 'shared/lib/data/LendingPair'; import useChain from 'shared/lib/hooks/UseChain'; -import { getEtherscanUrlForChain } from 'shared/lib/util/Chains'; +import { getBlockExplorerUrl } from 'shared/lib/util/Chains'; import { formatTokenAmount } from 'shared/lib/util/Numbers'; import styled from 'styled-components'; import { Address } from 'viem'; import { usePublicClient } from 'wagmi'; -import { BorrowerNftBorrower } from '../../data/BorrowerNft'; -import { RESPONSIVE_BREAKPOINT_MD, RESPONSIVE_BREAKPOINT_SM } from '../../data/constants/Breakpoints'; +import { BorrowerNftBorrower } from '../../data/hooks/useDeprecatedMarginAccountShim'; const BORROW_TITLE_TEXT_COLOR = 'rgba(130, 160, 182, 1)'; const MAX_HEALTH = 10; @@ -165,14 +166,16 @@ function HealthMetricCard(props: { health: number }) { } export type BorrowMetricsProps = { - marginAccount?: BorrowerNftBorrower; - dailyInterest0: number; - dailyInterest1: number; + borrowerNft?: BorrowerNftBorrower; + market?: LendingPair; userHasNoMarginAccounts: boolean; }; export function BorrowMetrics(props: BorrowMetricsProps) { - const { marginAccount, dailyInterest0, dailyInterest1, userHasNoMarginAccounts } = props; + const { borrowerNft, market, userHasNoMarginAccounts } = props; + + const dailyInterest0 = ((market?.kitty0Info.borrowAPR || 0) / 365) * (borrowerNft?.liabilities.amount0 || 0); + const dailyInterest1 = ((market?.kitty1Info.borrowAPR || 0) / 365) * (borrowerNft?.liabilities.amount1 || 0); const activeChain = useChain(); @@ -180,27 +183,27 @@ export function BorrowMetrics(props: BorrowMetricsProps) { const [mostRecentModifyTime, setMostRecentModifyTime] = useState(null); const [token0Collateral, token1Collateral] = useMemo( - () => marginAccount?.assets.amountsAt(sqrtRatioToTick(marginAccount.sqrtPriceX96)) ?? [0, 0], - [marginAccount] + () => borrowerNft?.assets.amountsAt(sqrtRatioToTick(borrowerNft.sqrtPriceX96)) ?? [0, 0], + [borrowerNft] ); const publicClient = usePublicClient({ chainId: activeChain.id }); useEffect(() => { (async () => { setMostRecentModifyTime(null); - if (!publicClient || !marginAccount?.mostRecentModify) return; - const block = await publicClient.getBlock({ blockNumber: marginAccount.mostRecentModify.blockNumber }); + if (!publicClient || !borrowerNft?.mostRecentModify?.blockNumber) return; + const block = await publicClient.getBlock({ blockNumber: borrowerNft.mostRecentModify.blockNumber }); setMostRecentModifyTime(new Date(Number(block.timestamp) * 1000)); })(); - }, [publicClient, marginAccount, setMostRecentModifyTime]); + }, [publicClient, borrowerNft?.mostRecentModify?.blockNumber, setMostRecentModifyTime]); useEffect(() => { const interval = setInterval(() => setCurrentTime(Date.now()), 200); - if (!marginAccount?.warningTime) clearInterval(interval); + if (!borrowerNft?.warningTime) clearInterval(interval); return () => clearInterval(interval); - }, [marginAccount?.warningTime]); + }, [borrowerNft]); - if (!marginAccount) + if (!borrowerNft) return ( @@ -218,17 +221,17 @@ export function BorrowMetrics(props: BorrowMetricsProps) { ); - const etherscanUrl = getEtherscanUrlForChain(activeChain); + const etherscanUrl = getBlockExplorerUrl(activeChain); - const mostRecentManager = marginAccount.mostRecentModify - ? (marginAccount.mostRecentModify.args.manager as Address) + const mostRecentManager = borrowerNft.mostRecentModify + ? (borrowerNft.mostRecentModify.args.manager as Address) : '0x'; const mostRecentManagerName = Object.hasOwn(MANAGER_NAME_MAP, mostRecentManager) ? MANAGER_NAME_MAP[mostRecentManager] : undefined; const mostRecentManagerUrl = `${etherscanUrl}/address/${mostRecentManager}`; - const mostRecentModifyHash = marginAccount.mostRecentModify?.transactionHash; + const mostRecentModifyHash = borrowerNft.mostRecentModify?.transactionHash; const mostRecentModifyUrl = `${etherscanUrl}/tx/${mostRecentModifyHash}`; const mostRecentModifyTimeStr = mostRecentModifyTime ? formatDistanceToNowStrict(mostRecentModifyTime, { @@ -238,8 +241,8 @@ export function BorrowMetrics(props: BorrowMetricsProps) { : ''; let liquidationAuctionStr = 'Not started'; - if (marginAccount.warningTime > 0) { - const auctionStartTime = marginAccount.warningTime + 5 * 60; + if (borrowerNft.warningTime > 0) { + const auctionStartTime = borrowerNft.warningTime + 5 * 60; const currentTime = Date.now() / 1000; if (currentTime < auctionStartTime) { liquidationAuctionStr = `Begins in ${(auctionStartTime - currentTime).toFixed(1)} seconds`; @@ -252,34 +255,34 @@ export function BorrowMetrics(props: BorrowMetricsProps) { - + {mostRecentModifyHash && ( @@ -295,9 +298,9 @@ export function BorrowMetrics(props: BorrowMetricsProps) { )} - {marginAccount.userDataHex} + {borrowerNft.userDataHex} - {marginAccount.warningTime > 0 && ( + {borrowerNft.warningTime > 0 && ( {liquidationAuctionStr} diff --git a/earn/src/components/advanced/GlobalStatsTable.tsx b/earn/src/components/advanced/GlobalStatsTable.tsx index e19f1f19..b8d04108 100644 --- a/earn/src/components/advanced/GlobalStatsTable.tsx +++ b/earn/src/components/advanced/GlobalStatsTable.tsx @@ -1,12 +1,11 @@ import { Display, Text } from 'shared/lib/components/common/Typography'; +import { RESPONSIVE_BREAKPOINT_XS } from 'shared/lib/data/constants/Breakpoints'; import { GREY_700 } from 'shared/lib/data/constants/Colors'; import { GNFormat } from 'shared/lib/data/GoodNumber'; import { LendingPair } from 'shared/lib/data/LendingPair'; import { roundPercentage } from 'shared/lib/util/Numbers'; import styled from 'styled-components'; -import { RESPONSIVE_BREAKPOINT_XS } from '../../data/constants/Breakpoints'; - const STAT_LABEL_TEXT_COLOR = 'rgba(130, 160, 182, 1)'; const STAT_VALUE_TEXT_COLOR = 'rgba(255, 255, 255, 1)'; diff --git a/earn/src/components/advanced/TokenAllocationPieChartWidget.tsx b/earn/src/components/advanced/TokenAllocationPieChartWidget.tsx index 4f117828..0481ba5a 100644 --- a/earn/src/components/advanced/TokenAllocationPieChartWidget.tsx +++ b/earn/src/components/advanced/TokenAllocationPieChartWidget.tsx @@ -9,7 +9,7 @@ import { rgb, rgba } from 'shared/lib/util/Colors'; import styled from 'styled-components'; import tw from 'twin.macro'; -import { BorrowerNftBorrower } from '../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../data/hooks/useDeprecatedMarginAccountShim'; // MARK: Capturing Mouse Data on container div --------------------------------------- diff --git a/earn/src/components/advanced/TokenAllocationWidget.tsx b/earn/src/components/advanced/TokenAllocationWidget.tsx index 72771e22..2c6376ee 100644 --- a/earn/src/components/advanced/TokenAllocationWidget.tsx +++ b/earn/src/components/advanced/TokenAllocationWidget.tsx @@ -7,7 +7,7 @@ import styled from 'styled-components'; import TokenAllocationPieChartWidget from './TokenAllocationPieChartWidget'; import { ReactComponent as PieChartIcon } from '../../assets/svg/pie_chart.svg'; -import { BorrowerNftBorrower } from '../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../data/hooks/useDeprecatedMarginAccountShim'; const ACCENT_COLOR = 'rgba(130, 160, 182, 1)'; diff --git a/earn/src/components/advanced/UniswapPositionList.tsx b/earn/src/components/advanced/UniswapPositionList.tsx index 508c936c..c9e822e7 100644 --- a/earn/src/components/advanced/UniswapPositionList.tsx +++ b/earn/src/components/advanced/UniswapPositionList.tsx @@ -17,7 +17,7 @@ import styled from 'styled-components'; import ImportUniswapNFTModal from './modal/ImportUniswapNFTModal'; import { WithdrawUniswapNFTModal } from './modal/WithdrawUniswapNFTModal'; -import { BorrowerNftBorrower } from '../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../data/hooks/useDeprecatedMarginAccountShim'; import TokenPairIcons from '../common/TokenPairIcons'; import { InRangeBadge, diff --git a/earn/src/components/advanced/modal/AddCollateralModal.tsx b/earn/src/components/advanced/modal/AddCollateralModal.tsx index 792d2542..065f40d0 100644 --- a/earn/src/components/advanced/modal/AddCollateralModal.tsx +++ b/earn/src/components/advanced/modal/AddCollateralModal.tsx @@ -8,8 +8,7 @@ import { UniswapNFTPosition } from 'shared/lib/data/Uniswap'; import { AddCollateralTab } from './tab/AddCollateralTab'; import { AddUniswapNFTAsCollateralTab } from './tab/AddUniswapNFTAsCollateralTab'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; -import { MAX_UNISWAP_POSITIONS } from '../../../data/constants/Values'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; const SECONDARY_COLOR = '#CCDFED'; @@ -33,7 +32,7 @@ export default function AddCollateralModal(props: AddCollateralModalProps) { const [modalState, setModalState] = useState(() => { // Only show the select collateral type modal if there are uniswap NFT positions and the user has not already // added the maximum number of uniswap positions. - if (uniswapNFTPositions.size > 0 && borrower.assets.uniswapPositions.length < MAX_UNISWAP_POSITIONS) { + if (uniswapNFTPositions.size > 0 && borrower.assets.uniswapPositions.length < 3) { return AddCollateralModalState.SELECT_COLLATERAL_TYPE; } return AddCollateralModalState.TOKENS; @@ -44,7 +43,7 @@ export default function AddCollateralModal(props: AddCollateralModalProps) { setModalState(() => { // Only show the select collateral type modal if there are uniswap NFT positions and the user has not already // added the maximum number of uniswap positions. - if (uniswapNFTPositions.size > 0 && borrower.assets.uniswapPositions.length < MAX_UNISWAP_POSITIONS) { + if (uniswapNFTPositions.size > 0 && borrower.assets.uniswapPositions.length < 3) { return AddCollateralModalState.SELECT_COLLATERAL_TYPE; } return AddCollateralModalState.TOKENS; diff --git a/earn/src/components/advanced/modal/BorrowModal.tsx b/earn/src/components/advanced/modal/BorrowModal.tsx index 60404998..13d62383 100644 --- a/earn/src/components/advanced/modal/BorrowModal.tsx +++ b/earn/src/components/advanced/modal/BorrowModal.tsx @@ -1,9 +1,7 @@ -import { useState, useMemo, useEffect } from 'react'; +import { useState, useEffect } from 'react'; -import { ethers } from 'ethers'; import { borrowerAbi } from 'shared/lib/abis/Borrower'; import { borrowerNftAbi } from 'shared/lib/abis/BorrowerNft'; -import { factoryAbi } from 'shared/lib/abis/Factory'; import { FilledStylizedButton } from 'shared/lib/components/common/Buttons'; import { CustomMaxButton } from 'shared/lib/components/common/Input'; import Modal from 'shared/lib/components/common/Modal'; @@ -13,7 +11,6 @@ import { Assets, Liabilities } from 'shared/lib/data/Borrower'; import { ALOE_II_BORROWER_NFT_ADDRESS, ALOE_II_BORROWER_NFT_SIMPLE_MANAGER_ADDRESS, - ALOE_II_FACTORY_ADDRESS, } from 'shared/lib/data/constants/ChainSpecific'; import { TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; @@ -22,10 +19,10 @@ import { Token } from 'shared/lib/data/Token'; import useChain from 'shared/lib/hooks/UseChain'; import { formatNumberInput, truncateDecimals } from 'shared/lib/util/Numbers'; import styled from 'styled-components'; -import { Address, Hex, WriteContractReturnType } from 'viem'; -import { useAccount, useReadContract, useSimulateContract, useWriteContract } from 'wagmi'; +import { Address, encodeFunctionData, formatEther, WriteContractReturnType } from 'viem'; +import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../common/HealthBar'; import TokenAmountSelectInput from '../../portfolio/TokenAmountSelectInput'; @@ -68,7 +65,7 @@ function getConfirmButton(state: ConfirmButtonState, token: Token): { text: stri type BorrowButtonProps = { borrower: BorrowerNftBorrower; - etherToSend: GN; + etherToSend: bigint; userAddress: Address; borrowToken: Token; borrowAmount: GN; @@ -101,12 +98,11 @@ function BorrowButton(props: BorrowButtonProps) { const amount0Big = isBorrowingToken0 ? borrowAmount : GN.zero(borrowToken.decimals); const amount1Big = isBorrowingToken0 ? GN.zero(borrowToken.decimals) : borrowAmount; - const borrowerInterface = new ethers.utils.Interface(borrowerAbi); - const encodedData = borrowerInterface.encodeFunctionData('borrow', [ - amount0Big.toBigNumber(), - amount1Big.toBigNumber(), - shouldWithdrawToWallet ? userAddress : borrower.address, - ]); + const encodedData = encodeFunctionData({ + abi: borrowerAbi, + functionName: 'borrow', + args: [amount0Big.toBigInt(), amount1Big.toBigInt(), shouldWithdrawToWallet ? userAddress : borrower.address], + }); const { data: borrowConfig, isLoading: prepareContractIsLoading } = useSimulateContract({ address: ALOE_II_BORROWER_NFT_ADDRESS[activeChain.id], @@ -116,10 +112,10 @@ function BorrowButton(props: BorrowButtonProps) { userAddress, [borrower.index], [ALOE_II_BORROWER_NFT_SIMPLE_MANAGER_ADDRESS[activeChain.id]], - [encodedData as Hex], - [etherToSend.toBigNumber().div(1e13).toNumber()], + [encodedData], + [Number(etherToSend / 10_000_000_000_000n)], ], - value: etherToSend.toBigInt(), + value: etherToSend, query: { enabled: Boolean(userAddress) && borrowAmount.isGtZero() && !isUnhealthy && !notEnoughSupply }, chainId: activeChain.id, }); @@ -175,15 +171,13 @@ function BorrowButton(props: BorrowButtonProps) { export type BorrowModalProps = { borrower: BorrowerNftBorrower; market: LendingPair; - accountEtherBalance?: GN; isOpen: boolean; setIsOpen: (open: boolean) => void; setPendingTxn: (pendingTxn: WriteContractReturnType | null) => void; }; export default function BorrowModal(props: BorrowModalProps) { - const { borrower, market, accountEtherBalance, isOpen, setIsOpen, setPendingTxn } = props; - const activeChain = useChain(); + const { borrower, market, isOpen, setIsOpen, setPendingTxn } = props; const [borrowAmountStr, setBorrowAmountStr] = useState(''); const [borrowToken, setBorrowToken] = useState(borrower.token0); @@ -199,19 +193,6 @@ export default function BorrowModal(props: BorrowModalProps) { setShouldWithdrawToWallet(true); }, [isOpen, borrower.token0]); - const { data: anteData } = useReadContract({ - abi: factoryAbi, - address: ALOE_II_FACTORY_ADDRESS[activeChain.id], - functionName: 'getParameters', - args: [borrower.uniswapPool as Address], - chainId: activeChain.id, - }); - - const ante = useMemo(() => { - if (!anteData) return GN.zero(18); - return GN.fromBigInt(anteData[0], 18); - }, [anteData]); - const tokenOptions = [borrower.token0, borrower.token1]; const isToken0 = borrowToken.equals(borrower.token0); @@ -221,10 +202,7 @@ export default function BorrowModal(props: BorrowModalProps) { const newLiability = existingLiability.add(borrowAmount); - let etherToSend = GN.zero(18, 10); - if (accountEtherBalance !== undefined && accountEtherBalance.lt(ante)) { - etherToSend = ante.sub(accountEtherBalance); - } + let etherToSend = market.amountEthRequiredBeforeBorrowing(borrower.ethBalance!.toBigInt()); if (!userAddress || !isOpen) { return null; @@ -342,10 +320,10 @@ export default function BorrowModal(props: BorrowModalProps) { {newLiability.toString(GNFormat.DECIMAL)}. The borrowed funds will be{' '} {shouldWithdrawToWallet ? 'withdrawn to your wallet for immediate use.' : 'left in the NFT for future use.'} - {etherToSend.isGtZero() && ( + {etherToSend > 0n && ( - You will need to provide an additional {etherToSend.toString(GNFormat.DECIMAL)} ETH to cover the gas fees - in the event that you are liquidated. + You will need to provide an additional {formatEther(etherToSend)} ETH to + cover the gas fees in the event that you are liquidated. )}

@@ -370,7 +348,7 @@ export default function BorrowModal(props: BorrowModalProps) { setPendingTxn={setPendingTxn} /> - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/advanced/modal/ClearWarningModal.tsx b/earn/src/components/advanced/modal/ClearWarningModal.tsx index 3e640a2e..25730ed4 100644 --- a/earn/src/components/advanced/modal/ClearWarningModal.tsx +++ b/earn/src/components/advanced/modal/ClearWarningModal.tsx @@ -4,12 +4,12 @@ import { FilledStylizedButton } from 'shared/lib/components/common/Buttons'; import Modal from 'shared/lib/components/common/Modal'; import { Text } from 'shared/lib/components/common/Typography'; import { Q32, TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; -import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; import { LendingPair } from 'shared/lib/data/LendingPair'; import useChain from 'shared/lib/hooks/UseChain'; +import { formatEther } from 'viem'; import { useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; const SECONDARY_COLOR = '#CCDFED'; const TERTIARY_COLOR = '#4b6980'; @@ -37,7 +37,7 @@ function getConfirmButton(state: ConfirmButtonState): { text: string; enabled: b type ClearWarningButtonProps = { borrower: BorrowerNftBorrower; - etherToSend: GN; + etherToSend: bigint; setIsOpen: (open: boolean) => void; setPendingTxn: (result: WriteContractReturnType | null) => void; }; @@ -55,7 +55,7 @@ function ClearWarningButton(props: ClearWarningButtonProps) { abi: borrowerAbi, functionName: 'clear', args: [Q32], - value: etherToSend.toBigInt(), + value: etherToSend, chainId: activeChain.id, }); const { writeContractAsync: clearWarning, isPending: isAskingUserToClearWarning } = useWriteContract(); @@ -93,22 +93,17 @@ function ClearWarningButton(props: ClearWarningButtonProps) { export type ClearWarningModalProps = { borrower: BorrowerNftBorrower; market: LendingPair; - accountEtherBalance?: GN; isOpen: boolean; setIsOpen: (open: boolean) => void; setPendingTxn: (pendingTxn: WriteContractReturnType | null) => void; }; export default function ClearWarningModal(props: ClearWarningModalProps) { - const { borrower, market, accountEtherBalance, isOpen, setIsOpen, setPendingTxn } = props; + const { borrower, market, isOpen, setIsOpen, setPendingTxn } = props; if (!isOpen) return null; - const ante = market.factoryData.ante; - let etherToSend = GN.zero(18, 10); - if (accountEtherBalance !== undefined && accountEtherBalance.lt(ante)) { - etherToSend = ante.sub(accountEtherBalance); - } + let etherToSend = market.amountEthRequiredBeforeBorrowing(borrower.ethBalance!.toBigInt()); return ( @@ -119,7 +114,7 @@ export default function ClearWarningModal(props: ClearWarningModalProps) { Your account is healthy, and you're ending the liquidation auction by replenishing the ante with{' '} - {etherToSend.toString(GNFormat.DECIMAL)} ETH. This is necessary to cover gas fees in the event that you are + {formatEther(etherToSend)} ETH. This is necessary to cover gas fees in the event that you are liquidated again.
@@ -131,7 +126,7 @@ export default function ClearWarningModal(props: ClearWarningModalProps) { setPendingTxn={setPendingTxn} /> - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/advanced/modal/ImportUniswapNFTModal.tsx b/earn/src/components/advanced/modal/ImportUniswapNFTModal.tsx index a851b01b..c00d9533 100644 --- a/earn/src/components/advanced/modal/ImportUniswapNFTModal.tsx +++ b/earn/src/components/advanced/modal/ImportUniswapNFTModal.tsx @@ -3,7 +3,7 @@ import Modal from 'shared/lib/components/common/Modal'; import { UniswapNFTPosition, UniswapPosition } from 'shared/lib/data/Uniswap'; import { AddUniswapNFTAsCollateralTab } from './tab/AddUniswapNFTAsCollateralTab'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; export type ImportUniswapNFTModalProps = { isOpen: boolean; diff --git a/earn/src/components/advanced/modal/NewSmartWalletModal.tsx b/earn/src/components/advanced/modal/NewSmartWalletModal.tsx index 748cfa10..fbece773 100644 --- a/earn/src/components/advanced/modal/NewSmartWalletModal.tsx +++ b/earn/src/components/advanced/modal/NewSmartWalletModal.tsx @@ -9,6 +9,7 @@ import Pagination from 'shared/lib/components/common/Pagination'; import { Text } from 'shared/lib/components/common/Typography'; import { ALOE_II_BORROWER_NFT_ADDRESS } from 'shared/lib/data/constants/ChainSpecific'; import { TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; +import { Token } from 'shared/lib/data/Token'; import useChain from 'shared/lib/hooks/UseChain'; import { generateBytes12Salt } from 'shared/lib/util/Salt'; import styled from 'styled-components'; @@ -16,7 +17,6 @@ import { Address } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; import { ReactComponent as SearchIcon } from '../../../assets/svg/search.svg'; -import { UniswapPoolInfo } from '../../../data/MarginAccount'; import SmartWalletButton from '../SmartWalletButton'; const ITEMS_PER_PAGE = 5; @@ -30,6 +30,12 @@ const SmartWalletOptionsPage = styled.div` min-height: 212px; `; +type UniswapPoolInfo = { + token0: Token; + token1: Token; + fee: number; +}; + type CreateSmartWalletButtonProps = { poolAddress: string; uniswapPoolInfo: UniswapPoolInfo; @@ -210,7 +216,7 @@ export default function NewSmartWalletModal(props: NewSmartWalletModalProps) { setPendingTxn={setPendingTxn} /> - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/advanced/modal/RemoveCollateralModal.tsx b/earn/src/components/advanced/modal/RemoveCollateralModal.tsx index 7129e9bc..37f86cf8 100644 --- a/earn/src/components/advanced/modal/RemoveCollateralModal.tsx +++ b/earn/src/components/advanced/modal/RemoveCollateralModal.tsx @@ -2,7 +2,6 @@ import { useEffect, useMemo, useState } from 'react'; import { type WriteContractReturnType } from '@wagmi/core'; import Big from 'big.js'; -import { BigNumber, ethers } from 'ethers'; import { borrowerAbi } from 'shared/lib/abis/Borrower'; import { borrowerNftAbi } from 'shared/lib/abis/BorrowerNft'; import { FilledStylizedButton } from 'shared/lib/components/common/Buttons'; @@ -20,10 +19,10 @@ import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; import { Token } from 'shared/lib/data/Token'; import useChain from 'shared/lib/hooks/UseChain'; import { formatNumberInput, truncateDecimals } from 'shared/lib/util/Numbers'; -import { Address, Hex } from 'viem'; +import { Address, encodeFunctionData, formatUnits, Hex } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../common/HealthBar'; import TokenAmountSelectInput from '../../portfolio/TokenAmountSelectInput'; @@ -75,12 +74,11 @@ function RemoveCollateralButton(props: RemoveCollateralButtonProps) { const amount1 = isToken0Collateral ? GN.zero(collateralToken.decimals) : collateralAmount; const encodedData = useMemo(() => { - const borrowerInterface = new ethers.utils.Interface(borrowerAbi); - return borrowerInterface.encodeFunctionData('transfer', [ - amount0.toBigNumber(), - amount1.toBigNumber(), - userAddress, - ]); + return encodeFunctionData({ + abi: borrowerAbi, + functionName: 'transfer', + args: [amount0.toBigInt(), amount1.toBigInt(), userAddress], + }) }, [amount0, amount1, userAddress]); const { data: removeCollateralConfig } = useSimulateContract({ @@ -176,8 +174,8 @@ export default function RemoveCollateralModal(props: RemoveCollateralModalProps) )[isToken0 ? 0 : 1]; const max = Math.min(existingCollateral.toNumber(), maxWithdrawBasedOnHealth); // Mitigate the case when the number is represented in scientific notation - const bigMax = BigNumber.from(new Big(max).mul(10 ** collateralToken.decimals).toFixed(0)); - const maxString = ethers.utils.formatUnits(bigMax, collateralToken.decimals); + const bigMax = BigInt(new Big(max).mul(10 ** collateralToken.decimals).toFixed(0)); + const maxString = formatUnits(bigMax, collateralToken.decimals);; const newAssets = new Assets( isToken0 ? newCollateralAmount : borrower.assets.amount0, @@ -263,7 +261,7 @@ export default function RemoveCollateralModal(props: RemoveCollateralModalProps) setPendingTxn={setPendingTxn} /> - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/advanced/modal/RepayModal.tsx b/earn/src/components/advanced/modal/RepayModal.tsx index 2e2b212a..3feb1f09 100644 --- a/earn/src/components/advanced/modal/RepayModal.tsx +++ b/earn/src/components/advanced/modal/RepayModal.tsx @@ -1,7 +1,6 @@ import { useState, useEffect } from 'react'; import { type WriteContractReturnType } from '@wagmi/core'; -import { ethers } from 'ethers'; import { borrowerAbi } from 'shared/lib/abis/Borrower'; import { borrowerNftAbi } from 'shared/lib/abis/BorrowerNft'; import { routerAbi } from 'shared/lib/abis/Router'; @@ -23,10 +22,10 @@ import useChain from 'shared/lib/hooks/UseChain'; import { usePermit2, Permit2State } from 'shared/lib/hooks/UsePermit2'; import { formatNumberInput, truncateDecimals } from 'shared/lib/util/Numbers'; import styled from 'styled-components'; -import { Address, Chain, Hex } from 'viem'; +import { Address, Chain, encodeFunctionData, Hex } from 'viem'; import { useAccount, useBalance, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; import { MarginAccount } from '../../../data/MarginAccount'; import HealthBar from '../../common/HealthBar'; import TokenAmountSelectInput from '../../portfolio/TokenAmountSelectInput'; @@ -233,11 +232,11 @@ function RepayButton(props: RepayButtonProps) { const amount0Big = isToken0 ? repayAmount : GN.zero(repayToken.decimals); const amount1Big = isToken0 ? GN.zero(repayToken.decimals) : repayAmount; - const borrowerInterface = new ethers.utils.Interface(borrowerAbi); - const encodedData = borrowerInterface.encodeFunctionData('repay', [ - amount0Big.toBigNumber(), - amount1Big.toBigNumber(), - ]); + const encodedData = encodeFunctionData({ + abi: borrowerAbi, + functionName: 'repay', + args: [amount0Big.toBigInt(), amount1Big.toBigInt()], + }) const repayTokenBalance = borrower.assets[isToken0 ? 'amount0' : 'amount1']; @@ -478,7 +477,7 @@ export default function RepayModal(props: RepayModalProps) { /> )} - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/advanced/modal/WithdrawAnteModal.tsx b/earn/src/components/advanced/modal/WithdrawAnteModal.tsx index f4bad42c..ae3f3b81 100644 --- a/earn/src/components/advanced/modal/WithdrawAnteModal.tsx +++ b/earn/src/components/advanced/modal/WithdrawAnteModal.tsx @@ -1,5 +1,4 @@ import { type WriteContractReturnType } from '@wagmi/core'; -import { ethers } from 'ethers'; import { borrowerAbi } from 'shared/lib/abis/Borrower'; import { borrowerNftAbi } from 'shared/lib/abis/BorrowerNft'; import { FilledStylizedButton } from 'shared/lib/components/common/Buttons'; @@ -10,12 +9,12 @@ import { ALOE_II_BORROWER_NFT_SIMPLE_MANAGER_ADDRESS, } from 'shared/lib/data/constants/ChainSpecific'; import { TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; -import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; +import { GNFormat } from 'shared/lib/data/GoodNumber'; import useChain from 'shared/lib/hooks/UseChain'; -import { Address, Chain, Hex } from 'viem'; -import { useAccount, useBalance, useSimulateContract, useWriteContract } from 'wagmi'; +import { Address, Chain, encodeFunctionData } from 'viem'; +import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; const SECONDARY_COLOR = '#CCDFED'; const TERTIARY_COLOR = '#4b6980'; @@ -53,13 +52,11 @@ type WithdrawAnteButtonProps = { function WithdrawAnteButton(props: WithdrawAnteButtonProps) { const { activeChain, borrower, userAddress, setIsOpen, setPendingTxn } = props; - const { data: borrowerBalance } = useBalance({ - address: borrower.address, - chainId: activeChain.id, - }); - - const borrowerInterface = new ethers.utils.Interface(borrowerAbi); - const encodedData = borrowerInterface.encodeFunctionData('transferEth', [borrowerBalance?.value ?? 0, userAddress]); + const encodedData = encodeFunctionData({ + abi: borrowerAbi, + functionName: 'transferEth', + args: [borrower.ethBalance?.toBigInt() ?? 0n, userAddress], + }) const { data: withdrawAnteConfig, @@ -73,7 +70,7 @@ function WithdrawAnteButton(props: WithdrawAnteButtonProps) { userAddress, [borrower.index], [ALOE_II_BORROWER_NFT_SIMPLE_MANAGER_ADDRESS[activeChain.id]], - [encodedData as Hex], + [encodedData], [0], ], query: { enabled: Boolean(userAddress) }, @@ -116,18 +113,17 @@ function WithdrawAnteButton(props: WithdrawAnteButtonProps) { export type WithdrawAnteModalProps = { borrower: BorrowerNftBorrower; - accountEthBalance?: GN; isOpen: boolean; setIsOpen: (open: boolean) => void; setPendingTxn: (pendingTxn: WriteContractReturnType | null) => void; }; export default function WithdrawAnteModal(props: WithdrawAnteModalProps) { - const { borrower, accountEthBalance, isOpen, setIsOpen, setPendingTxn } = props; + const { borrower, isOpen, setIsOpen, setPendingTxn } = props; const activeChain = useChain(); const { address: userAddress } = useAccount(); - if (!userAddress || !accountEthBalance) { + if (!userAddress || !borrower.ethBalance) { return null; } @@ -139,7 +135,7 @@ export default function WithdrawAnteModal(props: WithdrawAnteModalProps) { Summary - You're about to withdraw your {accountEthBalance.toString(GNFormat.DECIMAL)} ETH Ante from this smart + You're about to withdraw your {borrower.ethBalance.toString(GNFormat.DECIMAL)} ETH Ante from this smart wallet. @@ -152,7 +148,7 @@ export default function WithdrawAnteModal(props: WithdrawAnteModalProps) { setPendingTxn={setPendingTxn} /> - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/advanced/modal/WithdrawUniswapNFTModal.tsx b/earn/src/components/advanced/modal/WithdrawUniswapNFTModal.tsx index 69b95546..889daada 100644 --- a/earn/src/components/advanced/modal/WithdrawUniswapNFTModal.tsx +++ b/earn/src/components/advanced/modal/WithdrawUniswapNFTModal.tsx @@ -26,7 +26,7 @@ import styled from 'styled-components'; import { Address, Hex } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; import TokenPairIcons from '../../common/TokenPairIcons'; import { InRangeBadge, OutOfRangeBadge } from '../../common/UniswapPositionCard'; @@ -282,7 +282,7 @@ export function WithdrawUniswapNFTModal(props: WithdrawUniswapNFTModalProps) { setPendingTxn={setPendingTxn} /> - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/advanced/modal/tab/AddCollateralTab.tsx b/earn/src/components/advanced/modal/tab/AddCollateralTab.tsx index 0674ee84..26c85652 100644 --- a/earn/src/components/advanced/modal/tab/AddCollateralTab.tsx +++ b/earn/src/components/advanced/modal/tab/AddCollateralTab.tsx @@ -235,7 +235,7 @@ export function AddCollateralTab(props: AddCollateralTabProps) { setPendingTxn={setPendingTxn} /> - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/advanced/modal/tab/AddUniswapNFTAsCollateralTab.tsx b/earn/src/components/advanced/modal/tab/AddUniswapNFTAsCollateralTab.tsx index 4eb81fea..6735ccf7 100644 --- a/earn/src/components/advanced/modal/tab/AddUniswapNFTAsCollateralTab.tsx +++ b/earn/src/components/advanced/modal/tab/AddUniswapNFTAsCollateralTab.tsx @@ -21,7 +21,7 @@ import styled from 'styled-components'; import { Address, erc721Abi, Hex } from 'viem'; import { useAccount, usePublicClient, useReadContract, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; import TokenPairIcons from '../../../common/TokenPairIcons'; const SECONDARY_COLOR = '#CCDFED'; @@ -361,7 +361,7 @@ export function AddUniswapNFTAsCollateralTab(props: AddUniswapNFTAsCollateralTab setPendingTxn={setPendingTxn} /> - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/boost/ImportBoostWidget.tsx b/earn/src/components/boost/ImportBoostWidget.tsx index e7b9ae24..28128d1a 100644 --- a/earn/src/components/boost/ImportBoostWidget.tsx +++ b/earn/src/components/boost/ImportBoostWidget.tsx @@ -15,7 +15,7 @@ import { ALOE_II_BORROWER_NFT_ADDRESS, UNISWAP_NONFUNGIBLE_POSITION_MANAGER_ADDRESS, } from 'shared/lib/data/constants/ChainSpecific'; -import { TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; +import { API_PRICE_RELAY_LATEST_URL, TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; import { Token } from 'shared/lib/data/Token'; import { getTokenBySymbol } from 'shared/lib/data/TokenData'; @@ -32,7 +32,7 @@ import { getTheGraphClient, Uniswap24HourPoolDataQuery } from 'shared/lib/util/G import { formatUSD } from 'shared/lib/util/Numbers'; import { generateBytes12Salt } from 'shared/lib/util/Salt'; import styled from 'styled-components'; -import { erc721Abi, Hex } from 'viem'; +import { encodeFunctionData, erc721Abi, Hex } from 'viem'; import { useAccount, useBalance, @@ -43,7 +43,6 @@ import { } from 'wagmi'; import SlippageWidget from './SlippageWidget'; -import { API_PRICE_RELAY_LATEST_URL } from '../../data/constants/Values'; import { BoostCardInfo } from '../../data/Uniboost'; import { BOOST_MAX, BOOST_MIN } from '../../pages/boost/ImportBoostPage'; @@ -384,26 +383,32 @@ export default function ImportBoostWidget(props: ImportBoostWidgetProps) { return lendingPair.amountEthRequiredBeforeBorrowing(borrowerBalance?.value ?? 0n); }, [lendingPair, borrowerBalance]); - // Prepare for actual import/mint transaction - const borrowerNft = useMemo(() => new ethers.utils.Interface(borrowerNftAbi), []); // First, we `mint` so that they have a `Borrower` to put stuff in const encodedMint = useMemo(() => { if (!userAddress) return '0x'; const to = userAddress; const pools = [cardInfo.uniswapPool]; const salts = [generateBytes12Salt()]; - return borrowerNft.encodeFunctionData('mint', [to, pools, salts]) as Hex; - }, [borrowerNft, userAddress, cardInfo]); + return encodeFunctionData({ + abi: borrowerNftAbi, + functionName: 'mint', + args: [to, pools, salts], + }); + }, [userAddress, cardInfo]); // Then we `modify`, calling the BoostManager to import the Uniswap position const encodedModify = useMemo(() => { - if (!userAddress || nextNftPtrIdx === undefined) return '0x'; + if (!userAddress || nextNftPtrIdx === undefined || modifyData === undefined) return '0x'; const owner = userAddress; - const indices = [availableNft !== undefined ? availableNft.ptrIdx : nextNftPtrIdx]; + const indices = [availableNft !== undefined ? availableNft.ptrIdx : Number(nextNftPtrIdx)]; const managers = [ALOE_II_BOOST_MANAGER_ADDRESS[activeChain.id]]; const datas = [modifyData]; - const antes = [ethToSend / 10_000_000_000_000n]; - return borrowerNft.encodeFunctionData('modify', [owner, indices, managers, datas, antes]) as Hex; - }, [borrowerNft, userAddress, activeChain, availableNft, nextNftPtrIdx, modifyData, ethToSend]); + const antes = [Number(ethToSend / 10_000_000_000_000n)]; + return encodeFunctionData({ + abi: borrowerNftAbi, + functionName: 'modify', + args: [owner, indices, managers, datas, antes], + }); + }, [userAddress, activeChain, availableNft, nextNftPtrIdx, modifyData, ethToSend]); const { data: configMint, @@ -575,7 +580,7 @@ export default function ImportBoostWidget(props: ImportBoostWidgetProps) { {buttonState.label} - By using our service, you agree to our{' '} + By using this interface, you agree to our{' '} Terms of Service {' '} diff --git a/earn/src/components/common/MaxSlippageInput.tsx b/earn/src/components/common/MaxSlippageInput.tsx index e6ef9bcf..ac2fdfb1 100644 --- a/earn/src/components/common/MaxSlippageInput.tsx +++ b/earn/src/components/common/MaxSlippageInput.tsx @@ -1,14 +1,13 @@ -import React, { Fragment, useEffect, useState } from 'react'; +import { Fragment, useEffect, useState } from 'react'; import { Tab } from '@headlessui/react'; import Tooltip from 'shared/lib/components/common/Tooltip'; import { Text } from 'shared/lib/components/common/Typography'; +import { RESPONSIVE_BREAKPOINT_XS } from 'shared/lib/data/constants/Breakpoints'; import { GREY_400 } from 'shared/lib/data/constants/Colors'; import { formatNumberInput } from 'shared/lib/util/Numbers'; import styled from 'styled-components'; -import { RESPONSIVE_BREAKPOINT_XS } from '../../data/constants/Breakpoints'; - const SLIPPAGE_TOOLTIP_TEXT = `Slippage tolerance is the maximum price difference you are willing to accept between the estimated price and the execution price.`; diff --git a/earn/src/components/common/PendingTxnModal.tsx b/earn/src/components/common/PendingTxnModal.tsx index 27aebb61..67748f70 100644 --- a/earn/src/components/common/PendingTxnModal.tsx +++ b/earn/src/components/common/PendingTxnModal.tsx @@ -2,7 +2,7 @@ import { FilledGradientButton } from 'shared/lib/components/common/Buttons'; import Modal, { LoadingModal, MESSAGE_TEXT_COLOR } from 'shared/lib/components/common/Modal'; import { Text } from 'shared/lib/components/common/Typography'; import useChain from 'shared/lib/hooks/UseChain'; -import { getEtherscanUrlForChain } from 'shared/lib/util/Chains'; +import { getBlockExplorerUrl } from 'shared/lib/util/Chains'; import { Hash } from 'viem'; import { ReactComponent as ErrorIcon } from '../../assets/svg/error.svg'; @@ -25,7 +25,7 @@ function EtherscanLink(props: { txnHash: string }) { return ( { const borrowerAddress = availableNft?.address ?? predictedAddress; if (!userAddress || !borrowerAddress || !permit2Result.signature) return null; - const permit2 = new ethers.utils.Interface(permit2Abi); - return permit2.encodeFunctionData( - 'permitTransferFrom(((address,uint256),uint256,uint256),(address,uint256),address,bytes)', - [ + + return encodeFunctionData({ + abi: permit2Abi, + functionName: 'permitTransferFrom', + args: [ { permitted: { token: selectedCollateral.address, - amount: permit2Result.amount.toBigNumber(), + amount: permit2Result.amount.toBigInt(), }, - nonce: BigNumber.from(permit2Result.nonce ?? '0'), - deadline: BigNumber.from(permit2Result.deadline), + nonce: BigInt(permit2Result.nonce ?? '0'), + deadline: BigInt(permit2Result.deadline), }, { to: borrowerAddress, - requestedAmount: permit2Result.amount.toBigNumber(), + requestedAmount: permit2Result.amount.toBigInt(), }, userAddress, permit2Result.signature, - ] - ); + ], + }) }, [permit2Result, availableNft, predictedAddress, selectedCollateral.address, userAddress]); - // Prepare for actual import/mint transaction - const borrowerNft = useMemo(() => new ethers.utils.Interface(borrowerNftAbi), []); // First, we `mint` so that they have a `Borrower` to put stuff in const encodedMint = useMemo(() => { if (!userAddress || selectedLendingPair?.uniswapPool === undefined) return null; const to = userAddress; - const pools = [selectedLendingPair.uniswapPool ?? '0x']; + const pools = [selectedLendingPair.uniswapPool]; const salts = [generatedSalt]; - return borrowerNft.encodeFunctionData('mint', [to, pools, salts]) as Hex; - }, [userAddress, selectedLendingPair?.uniswapPool, generatedSalt, borrowerNft]); + + return encodeFunctionData({ + abi: borrowerNftAbi, + functionName: 'mint', + args: [to, pools, salts], + }); + }, [userAddress, selectedLendingPair?.uniswapPool, generatedSalt]); const encodedBorrowCall = useMemo(() => { if (!userAddress || !selectedLendingPair || !selectedBorrow) return null; - const borrower = new ethers.utils.Interface(borrowerAbi); const amount0 = selectedLendingPair.token0.address === selectedBorrow.address ? borrowAmount : GN.zero(selectedBorrow.decimals); const amount1 = selectedLendingPair.token1.address === selectedBorrow.address ? borrowAmount : GN.zero(selectedBorrow.decimals); - return borrower.encodeFunctionData('borrow', [amount0.toBigNumber(), amount1.toBigNumber(), userAddress]); + return encodeFunctionData({ + abi: borrowerAbi, + functionName: 'borrow', + args: [amount0.toBigInt(), amount1.toBigInt(), userAddress], + }); }, [borrowAmount, selectedBorrow, selectedLendingPair, userAddress]); const encodedModify = useMemo(() => { - const index = Boolean(availableNft) ? availableNft!.index : nextNftPtrIdx; + const index = Boolean(availableNft) + ? availableNft!.index + : nextNftPtrIdx !== undefined + ? Number(nextNftPtrIdx) + : undefined; if (!userAddress || index === undefined || ante === undefined || !encodedPermit2 || !encodedBorrowCall) return null; const owner = userAddress; const indices = [index]; const managers = [ALOE_II_PERMIT2_MANAGER_ADDRESS[activeChain.id]]; - const datas = [encodedPermit2.concat(encodedBorrowCall.slice(2))]; - const antes = [ante.toBigNumber().div(1e13)]; - return borrowerNft.encodeFunctionData('modify', [owner, indices, managers, datas, antes]) as Hex; - }, [availableNft, nextNftPtrIdx, userAddress, ante, encodedPermit2, encodedBorrowCall, activeChain.id, borrowerNft]); + const datas = [encodedPermit2.concat(encodedBorrowCall.slice(2)) as Hex]; + const antes = [ante.toBigNumber().div(1e13).toNumber()]; + + return encodeFunctionData({ + abi: borrowerNftAbi, + functionName: 'modify', + args: [owner, indices, managers, datas, antes], + }); + }, [availableNft, nextNftPtrIdx, userAddress, ante, encodedPermit2, encodedBorrowCall, activeChain.id]); const { data: configMulticallOps, diff --git a/earn/src/components/markets/modal/BorrowModalUniswap.tsx b/earn/src/components/markets/modal/BorrowModalUniswap.tsx index 84afe063..8899ff0b 100644 --- a/earn/src/components/markets/modal/BorrowModalUniswap.tsx +++ b/earn/src/components/markets/modal/BorrowModalUniswap.tsx @@ -2,7 +2,7 @@ import { useMemo, useState } from 'react'; import { type WriteContractReturnType } from '@wagmi/core'; import Big from 'big.js'; -import { BigNumber, ethers } from 'ethers'; +import { ethers } from 'ethers'; import { borrowerAbi } from 'shared/lib/abis/Borrower'; import { borrowerNftAbi } from 'shared/lib/abis/BorrowerNft'; import { volatilityOracleAbi } from 'shared/lib/abis/VolatilityOracle'; @@ -29,7 +29,7 @@ import { UniswapNFTPosition, zip } from 'shared/lib/data/Uniswap'; import useChain from 'shared/lib/hooks/UseChain'; import { formatNumberInput, formatTokenAmount } from 'shared/lib/util/Numbers'; import { generateBytes12Salt } from 'shared/lib/util/Salt'; -import { erc721Abi, Hex } from 'viem'; +import { encodeFunctionData, erc721Abi, Hex } from 'viem'; import { useAccount, useBalance, usePublicClient, useReadContract, useSimulateContract, useWriteContract } from 'wagmi'; const MAX_BORROW_PERCENTAGE = 0.8; @@ -191,16 +191,19 @@ export default function BorrowModalUniswap(props: BorrowModalProps) { const generatedSalt = useMemo(() => generateBytes12Salt(), []); - // Prepare for actual import/mint transaction - const borrowerNft = useMemo(() => new ethers.utils.Interface(borrowerNftAbi), []); // First, we `mint` so that they have a `Borrower` to put stuff in const encodedMint = useMemo(() => { if (!userAddress) return null; const to = userAddress; const pools = [selectedLendingPair.uniswapPool]; const salts = [generatedSalt]; - return borrowerNft.encodeFunctionData('mint', [to, pools, salts]) as Hex; - }, [userAddress, selectedLendingPair, generatedSalt, borrowerNft]); + + return encodeFunctionData({ + abi: borrowerNftAbi, + functionName: 'mint', + args: [to, pools, salts], + }); + }, [userAddress, selectedLendingPair, generatedSalt]); // Then we use the UniswapNFTManager to import the Uniswap NFT as collateral const encodedImportCall = useMemo(() => { @@ -219,7 +222,6 @@ export default function BorrowModalUniswap(props: BorrowModalProps) { // Finally, we borrow the requested tokens const encodedBorrowCall = useMemo(() => { if (!userAddress) return null; - const borrower = new ethers.utils.Interface(borrowerAbi); const amount0 = selectedBorrow.equals(selectedLendingPair.token0) ? borrowAmount : GN.zero(selectedLendingPair.token0.decimals); @@ -227,21 +229,30 @@ export default function BorrowModalUniswap(props: BorrowModalProps) { ? borrowAmount : GN.zero(selectedLendingPair.token1.decimals); - return borrower.encodeFunctionData('borrow', [amount0.toBigNumber(), amount1.toBigNumber(), userAddress]); + return encodeFunctionData({ + abi: borrowerAbi, + functionName: 'borrow', + args: [amount0.toBigInt(), amount1.toBigInt(), userAddress], + }) }, [borrowAmount, selectedBorrow, selectedLendingPair, userAddress]); const encodedModify = useMemo(() => { if (!userAddress || nextNftPtrIdx === undefined || !encodedBorrowCall) return null; const owner = userAddress; - const indices = [nextNftPtrIdx, nextNftPtrIdx]; + const indices = [Number(nextNftPtrIdx), Number(nextNftPtrIdx)]; const managers = [ ALOE_II_UNISWAP_NFT_MANAGER_ADDRESS[activeChain.id], ALOE_II_BORROWER_NFT_SIMPLE_MANAGER_ADDRESS[activeChain.id], ]; const datas = [encodedImportCall, encodedBorrowCall]; - const antes = [ante.toBigNumber().div(1e13), BigNumber.from(0)]; - return borrowerNft.encodeFunctionData('modify', [owner, indices, managers, datas, antes]) as Hex; - }, [userAddress, nextNftPtrIdx, ante, activeChain.id, encodedImportCall, encodedBorrowCall, borrowerNft]); + const antes = [ante.toBigNumber().div(1e13).toNumber(), 0]; + + return encodeFunctionData({ + abi: borrowerNftAbi, + functionName: 'modify', + args: [owner, indices, managers, datas, antes], + }); + }, [userAddress, nextNftPtrIdx, ante, activeChain.id, encodedImportCall, encodedBorrowCall]); const { data: multicallConfig } = useSimulateContract({ address: ALOE_II_BORROWER_NFT_ADDRESS[activeChain.id], diff --git a/earn/src/components/markets/modal/UpdateBorrowerModal.tsx b/earn/src/components/markets/modal/UpdateBorrowerModal.tsx index 9577ebea..125d9921 100644 --- a/earn/src/components/markets/modal/UpdateBorrowerModal.tsx +++ b/earn/src/components/markets/modal/UpdateBorrowerModal.tsx @@ -10,7 +10,7 @@ import styled from 'styled-components'; import BorrowModalContent from './content/BorrowModalContent'; import RepayModalContent from './content/RepayModalContent'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; export enum ConfirmationType { BORROW = 'BORROW', diff --git a/earn/src/components/markets/modal/UpdateCollateralModal.tsx b/earn/src/components/markets/modal/UpdateCollateralModal.tsx index 566f4b30..7a1dbca0 100644 --- a/earn/src/components/markets/modal/UpdateCollateralModal.tsx +++ b/earn/src/components/markets/modal/UpdateCollateralModal.tsx @@ -2,7 +2,6 @@ import { Fragment, useState } from 'react'; import { Tab } from '@headlessui/react'; import { type WriteContractReturnType } from '@wagmi/core'; -import { BigNumber } from 'ethers'; import Modal from 'shared/lib/components/common/Modal'; import { Text } from 'shared/lib/components/common/Typography'; import { GREY_700 } from 'shared/lib/data/constants/Colors'; @@ -12,7 +11,7 @@ import styled from 'styled-components'; import AddCollateralModalContent from './content/AddCollateralModalContent'; import RemoveCollateralModalContent from './content/RemoveCollateralModalContent'; import ToUniswapNFTModalContent from './content/ToUniswapNFTModalContent'; -import { BorrowerNftBorrower } from '../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; export enum ConfirmationType { DEPOSIT = 'DEPOSIT', @@ -75,7 +74,7 @@ export default function UpdateCollateralModal(props: UpdateCollateralModalProps) diff --git a/earn/src/components/markets/modal/content/AddCollateralModalContent.tsx b/earn/src/components/markets/modal/content/AddCollateralModalContent.tsx index e994d708..c709013b 100644 --- a/earn/src/components/markets/modal/content/AddCollateralModalContent.tsx +++ b/earn/src/components/markets/modal/content/AddCollateralModalContent.tsx @@ -14,7 +14,7 @@ import { Token } from 'shared/lib/data/Token'; import useChain from 'shared/lib/hooks/UseChain'; import { useAccount, useBalance, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/markets/modal/content/BorrowModalContent.tsx b/earn/src/components/markets/modal/content/BorrowModalContent.tsx index 20398e72..bf2bed69 100644 --- a/earn/src/components/markets/modal/content/BorrowModalContent.tsx +++ b/earn/src/components/markets/modal/content/BorrowModalContent.tsx @@ -4,7 +4,6 @@ import { type WriteContractReturnType } from '@wagmi/core'; import { ethers } from 'ethers'; import { borrowerAbi } from 'shared/lib/abis/Borrower'; import { borrowerNftAbi } from 'shared/lib/abis/BorrowerNft'; -import { factoryAbi } from 'shared/lib/abis/Factory'; import { FilledStylizedButton } from 'shared/lib/components/common/Buttons'; import { SquareInputWithMax } from 'shared/lib/components/common/Input'; import { MODAL_BLACK_TEXT_COLOR } from 'shared/lib/components/common/Modal'; @@ -14,7 +13,6 @@ import { Liabilities } from 'shared/lib/data/Borrower'; import { ALOE_II_BORROWER_NFT_ADDRESS, ALOE_II_BORROWER_NFT_SIMPLE_MANAGER_ADDRESS, - ALOE_II_FACTORY_ADDRESS, } from 'shared/lib/data/constants/ChainSpecific'; import { TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; @@ -22,10 +20,10 @@ import { LendingPair } from 'shared/lib/data/LendingPair'; import { Token } from 'shared/lib/data/Token'; import useChain from 'shared/lib/hooks/UseChain'; import { formatNumberInput } from 'shared/lib/util/Numbers'; -import { Address, Hex } from 'viem'; -import { useAccount, useBalance, useReadContract, useSimulateContract, useWriteContract } from 'wagmi'; +import { Address, formatEther, Hex } from 'viem'; +import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; @@ -67,7 +65,7 @@ type ConfirmButtonProps = { isLoading: boolean; isUnhealthy: boolean; notEnoughSupply: boolean; - requiredAnte?: GN; + requiredAnte?: bigint; token: Token; isBorrowingToken0: boolean; accountAddress?: Address; @@ -113,9 +111,9 @@ function ConfirmButton(props: ConfirmButtonProps) { [borrower.index], [ALOE_II_BORROWER_NFT_SIMPLE_MANAGER_ADDRESS[activeChain.id]], [encodedBorrowCall ?? '0x'], - [requiredAnte?.toBigNumber().div(1e13).toNumber() ?? 0], + [Number((requiredAnte ?? 0n) / 10_000_000_000_000n)], ], - value: requiredAnte?.toBigInt(), + value: requiredAnte, chainId: activeChain.id, query: { enabled: @@ -177,27 +175,6 @@ export default function BorrowModalContent(props: BorrowModalContentProps) { const [additionalBorrowAmountStr, setAdditionalBorrowAmountStr] = useState(''); const { address: accountAddress } = useAccount(); - const activeChain = useChain(); - - const { data: anteData } = useReadContract({ - abi: factoryAbi, - address: ALOE_II_FACTORY_ADDRESS[activeChain.id], - functionName: 'getParameters', - args: [borrower.uniswapPool as Address], - chainId: activeChain.id, - }); - - const ante = useMemo(() => { - if (!anteData) return GN.zero(18); - return GN.fromBigInt(anteData[0], 18); - }, [anteData]); - - const { data: accountEtherBalanceResult } = useBalance({ - address: borrower.address as Address, - chainId: activeChain.id, - }); - - const accountEtherBalance = accountEtherBalanceResult && GN.fromBigInt(accountEtherBalanceResult.value, 18); // TODO: This assumes that only one token is borrowed and one token is collateralized const isBorrowingToken0 = borrower.liabilities.amount0 > 0; @@ -211,8 +188,7 @@ export default function BorrowModalContent(props: BorrowModalContentProps) { const borrowAmount = GN.fromDecimalString(additionalBorrowAmountStr || '0', borrowToken.decimals); const newLiability = existingLiability.add(borrowAmount); - const requiredAnte = - accountEtherBalance !== undefined && accountEtherBalance.lt(ante) ? ante.sub(accountEtherBalance) : GN.zero(18); + const requiredAnte = lendingPair?.amountEthRequiredBeforeBorrowing(borrower.ethBalance!.toBigInt()); const lenderInfo = lendingPair?.[isBorrowingToken0 ? 'kitty0Info' : 'kitty1Info']; @@ -302,9 +278,9 @@ export default function BorrowModalContent(props: BorrowModalContentProps) { . - {requiredAnte.isGtZero() && ( + {(requiredAnte !== undefined && requiredAnte > 0n) && ( - You will need to provide an additional {requiredAnte.toString(GNFormat.LOSSY_HUMAN)} ETH to cover the gas + You will need to provide an additional {formatEther(requiredAnte)} ETH to cover the gas fees in the event that you are liquidated. )} diff --git a/earn/src/components/markets/modal/content/RemoveCollateralModalContent.tsx b/earn/src/components/markets/modal/content/RemoveCollateralModalContent.tsx index 76314560..658ea34c 100644 --- a/earn/src/components/markets/modal/content/RemoveCollateralModalContent.tsx +++ b/earn/src/components/markets/modal/content/RemoveCollateralModalContent.tsx @@ -19,10 +19,10 @@ import { TERMS_OF_SERVICE_URL } from 'shared/lib/data/constants/Values'; import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; import { Token } from 'shared/lib/data/Token'; import useChain from 'shared/lib/hooks/UseChain'; -import { Address, Hex } from 'viem'; -import { useAccount, useBalance, useSimulateContract, useWriteContract } from 'wagmi'; +import { Address, encodeFunctionData, Hex } from 'viem'; +import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; @@ -83,39 +83,31 @@ function ConfirmButton(props: ConfirmButtonProps) { const isRedeemingTooMuch = withdrawAmount.gt(maxWithdrawAmount); - const { data: borrowerBalance } = useBalance({ - address: borrower.address, - chainId: activeChain.id, - }); - const encodedWithdrawCall = useMemo(() => { if (!accountAddress) return null; - const borrowerInterface = new ethers.utils.Interface(borrowerAbi); const amount0 = isWithdrawingToken0 ? withdrawAmount : GN.zero(borrower.token0.decimals); const amount1 = isWithdrawingToken0 ? GN.zero(borrower.token1.decimals) : withdrawAmount; - return borrowerInterface.encodeFunctionData('transfer', [ - amount0.toBigNumber(), - amount1.toBigNumber(), - accountAddress, - ]) as Hex; + return encodeFunctionData({ + abi: borrowerAbi, + functionName: 'transfer', + args: [amount0.toBigInt(), amount1.toBigInt(), accountAddress], + }); }, [withdrawAmount, borrower.token0.decimals, borrower.token1.decimals, isWithdrawingToken0, accountAddress]); const encodedWithdrawAnteCall = useMemo(() => { - const borrowerInterface = new ethers.utils.Interface(borrowerAbi); - if (!accountAddress || !borrowerBalance) return null; - return borrowerInterface.encodeFunctionData('transferEth', [ - borrowerBalance?.value, - accountAddress, - ]) as Hex; - }, [accountAddress, borrowerBalance]); + if (!accountAddress || !borrower.ethBalance) return null; + + return encodeFunctionData({ + abi: borrowerAbi, + functionName: 'transferEth', + args: [borrower.ethBalance.toBigInt(), accountAddress], + }); + }, [accountAddress, borrower.ethBalance]); const combinedEncodingsForMultiManager = useMemo(() => { if (!encodedWithdrawCall || !encodedWithdrawAnteCall) return null; - return ethers.utils.defaultAbiCoder.encode( - ['bytes[]'], - [[encodedWithdrawCall, encodedWithdrawAnteCall]] - ) as Hex; + return ethers.utils.defaultAbiCoder.encode(['bytes[]'], [[encodedWithdrawCall, encodedWithdrawAnteCall]]) as Hex; }, [encodedWithdrawCall, encodedWithdrawAnteCall]); const { data: withdrawConfig, isLoading: isCheckingIfAbleToWithdraw } = useSimulateContract({ diff --git a/earn/src/components/markets/modal/content/RepayModalContent.tsx b/earn/src/components/markets/modal/content/RepayModalContent.tsx index 9e667728..079da602 100644 --- a/earn/src/components/markets/modal/content/RepayModalContent.tsx +++ b/earn/src/components/markets/modal/content/RepayModalContent.tsx @@ -16,7 +16,7 @@ import { Permit2State, usePermit2 } from 'shared/lib/hooks/UsePermit2'; import { Address, Chain } from 'viem'; import { useAccount, useBalance, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/markets/modal/content/ToUniswapNFTModalContent.tsx b/earn/src/components/markets/modal/content/ToUniswapNFTModalContent.tsx index fb07b0ed..49c53d6b 100644 --- a/earn/src/components/markets/modal/content/ToUniswapNFTModalContent.tsx +++ b/earn/src/components/markets/modal/content/ToUniswapNFTModalContent.tsx @@ -1,7 +1,7 @@ import { useMemo } from 'react'; import { type WriteContractReturnType } from '@wagmi/core'; -import { BigNumber, ethers } from 'ethers'; +import { ethers } from 'ethers'; import { borrowerNftAbi } from 'shared/lib/abis/BorrowerNft'; import { FilledStylizedButton } from 'shared/lib/components/common/Buttons'; import { Text } from 'shared/lib/components/common/Typography'; @@ -17,7 +17,7 @@ import useChain from 'shared/lib/hooks/UseChain'; import { Hex } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/BorrowerNft'; +import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; @@ -53,7 +53,7 @@ function getConfirmButton(state: ConfirmButtonState): { text: string; enabled: b type ConfirmButtonProps = { borrower: BorrowerNftBorrower; positionToWithdraw: UniswapPosition; - uniswapNftId: BigNumber; + uniswapNftId: number; setIsOpen: (open: boolean) => void; setPendingTxnResult: (result: WriteContractReturnType | null) => void; }; @@ -134,7 +134,7 @@ function ConfirmButton(props: ConfirmButtonProps) { export type RemoveCollateralModalContentProps = { borrower: BorrowerNftBorrower; positionToWithdraw: UniswapPosition; - uniswapNftId: BigNumber; + uniswapNftId: number; setIsOpen: (isOpen: boolean) => void; setPendingTxnResult: (result: WriteContractReturnType | null) => void; }; diff --git a/earn/src/components/markets/monitor/StatsTable.tsx b/earn/src/components/markets/monitor/StatsTable.tsx index 0e188b88..9714a376 100644 --- a/earn/src/components/markets/monitor/StatsTable.tsx +++ b/earn/src/components/markets/monitor/StatsTable.tsx @@ -21,7 +21,7 @@ import { LendingPair } from 'shared/lib/data/LendingPair'; import useChain from 'shared/lib/hooks/UseChain'; import { useChainDependentState } from 'shared/lib/hooks/UseChainDependentState'; import useSortableData from 'shared/lib/hooks/UseSortableData'; -import { getEtherscanUrlForChain } from 'shared/lib/util/Chains'; +import { getBlockExplorerUrl } from 'shared/lib/util/Chains'; import { roundPercentage } from 'shared/lib/util/Numbers'; import styled from 'styled-components'; import { Address } from 'viem'; @@ -160,7 +160,7 @@ function StatsTableRow(props: StatsTableRowProps) { const { writeContractAsync } = useWriteContract(); - const uniswapLink = `${getEtherscanUrlForChain(activeChain)}/address/${pair.uniswapPool}`; + const uniswapLink = `${getBlockExplorerUrl(activeChain)}/address/${pair.uniswapPool}`; const manipulationMetric = pair.oracleData.manipulationMetric; const manipulationThreshold = pair.manipulationThreshold; @@ -193,7 +193,7 @@ function StatsTableRow(props: StatsTableRowProps) { const isPaused = pausedUntilTime > Date.now() / 1000; const lenderLinks = [pair.kitty0.address, pair.kitty1.address].map( - (addr) => `${getEtherscanUrlForChain(activeChain)}/address/${addr}` + (addr) => `${getBlockExplorerUrl(activeChain)}/address/${addr}` ); const reserveFactorTexts = [pair.kitty0Info.reserveFactor, pair.kitty1Info.reserveFactor].map((rf) => diff --git a/earn/src/components/portfolio/LendingPairPeerCard.tsx b/earn/src/components/portfolio/LendingPairPeerCard.tsx index 113f96e7..6b1d2c4f 100644 --- a/earn/src/components/portfolio/LendingPairPeerCard.tsx +++ b/earn/src/components/portfolio/LendingPairPeerCard.tsx @@ -3,6 +3,7 @@ import { useEffect, useMemo, useState } from 'react'; import { Dropdown, DropdownOption } from 'shared/lib/components/common/Dropdown'; import Tooltip from 'shared/lib/components/common/Tooltip'; import { Display, Text } from 'shared/lib/components/common/Typography'; +import { RESPONSIVE_BREAKPOINT_SM } from 'shared/lib/data/constants/Breakpoints'; import { GREY_800 } from 'shared/lib/data/constants/Colors'; import { LendingPair } from 'shared/lib/data/LendingPair'; import { Token } from 'shared/lib/data/Token'; @@ -11,7 +12,6 @@ import { formatTokenAmount, roundPercentage } from 'shared/lib/util/Numbers'; import styled from 'styled-components'; import { Config, useClient } from 'wagmi'; -import { RESPONSIVE_BREAKPOINT_SM } from '../../data/constants/Breakpoints'; import useNumberOfUsers from '../../data/hooks/UseNumberOfUsers'; import { useEthersProvider } from '../../util/Provider'; diff --git a/earn/src/components/portfolio/PortfolioGrid.tsx b/earn/src/components/portfolio/PortfolioGrid.tsx index fa0c0723..0a1a0d53 100644 --- a/earn/src/components/portfolio/PortfolioGrid.tsx +++ b/earn/src/components/portfolio/PortfolioGrid.tsx @@ -1,4 +1,5 @@ import { Display, Text } from 'shared/lib/components/common/Typography'; +import { RESPONSIVE_BREAKPOINT_SM } from 'shared/lib/data/constants/Breakpoints'; import { GREY_800 } from 'shared/lib/data/constants/Colors'; import { Token } from 'shared/lib/data/Token'; import { rgb } from 'shared/lib/util/Colors'; @@ -6,7 +7,6 @@ import styled from 'styled-components'; import AssetPriceChartWidget from './AssetPriceChartWidget'; import PortfolioMetrics from './PortfolioMetrics'; -import { RESPONSIVE_BREAKPOINT_SM } from '../../data/constants/Breakpoints'; import { TokenBalance, TokenPriceData, TokenQuote } from '../../pages/PortfolioPage'; const STATUS_GREEN = 'rgba(0, 196, 140, 1)'; diff --git a/earn/src/components/portfolio/PortfolioPieChartWidget.tsx b/earn/src/components/portfolio/PortfolioPieChartWidget.tsx index 20dcc390..8c89111c 100644 --- a/earn/src/components/portfolio/PortfolioPieChartWidget.tsx +++ b/earn/src/components/portfolio/PortfolioPieChartWidget.tsx @@ -1,13 +1,12 @@ import { useMemo, useRef } from 'react'; import { Text } from 'shared/lib/components/common/Typography'; +import { RESPONSIVE_BREAKPOINT_LG } from 'shared/lib/data/constants/Breakpoints'; import { GREY_800 } from 'shared/lib/data/constants/Colors'; import { Token } from 'shared/lib/data/Token'; import styled from 'styled-components'; import tw from 'twin.macro'; -import { RESPONSIVE_BREAKPOINT_LG } from '../../data/constants/Breakpoints'; - // MARK: Capturing Mouse Data on container div --------------------------------------- const PIE_CHART_HOVER_GROWTH = 1.05; diff --git a/earn/src/components/portfolio/PortfolioTooltip.tsx b/earn/src/components/portfolio/PortfolioTooltip.tsx index 3d529eac..1d0a276e 100644 --- a/earn/src/components/portfolio/PortfolioTooltip.tsx +++ b/earn/src/components/portfolio/PortfolioTooltip.tsx @@ -1,12 +1,12 @@ import React from 'react'; import { Text } from 'shared/lib/components/common/Typography'; +import { RESPONSIVE_BREAKPOINT_MD } from 'shared/lib/data/constants/Breakpoints'; import { GREY_700, GREY_900 } from 'shared/lib/data/constants/Colors'; import styled from 'styled-components'; import tw from 'twin.macro'; import { ReactComponent as CloseModalIcon } from '../../assets/svg/close_modal.svg'; -import { RESPONSIVE_BREAKPOINT_MD } from '../../data/constants/Breakpoints'; const TooltipContainer = styled.div.attrs((props: { verticallyCentered?: boolean; filled?: boolean }) => props)` ${tw`flex flex-col items-center justify-center absolute`} diff --git a/earn/src/components/portfolio/modal/BridgeModal.tsx b/earn/src/components/portfolio/modal/BridgeModal.tsx deleted file mode 100644 index 3b6d994e..00000000 --- a/earn/src/components/portfolio/modal/BridgeModal.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useMemo } from 'react'; - -import { Bridge } from '@socket.tech/plugin'; -import { ethers } from 'ethers'; -import Modal from 'shared/lib/components/common/Modal'; -import { BRIDGE_SUPPORTED_CHAINS } from 'shared/lib/data/constants/ChainSpecific'; -import { GREY_800, GREY_900 } from 'shared/lib/data/constants/Colors'; -import { Token } from 'shared/lib/data/Token'; -import { getTokens } from 'shared/lib/data/TokenData'; -import useChain from 'shared/lib/hooks/UseChain'; -import { mainnet } from 'wagmi/chains'; - -export type BridgeModalProps = { - isOpen: boolean; - selectedAsset: Token; - setIsOpen: (isOpen: boolean) => void; -}; - -export default function BridgeModal(props: BridgeModalProps) { - const { isOpen, selectedAsset, setIsOpen } = props; - const activeChain = useChain(); - // @ts-ignore - const provider = new ethers.providers.Web3Provider(window.ethereum as any); - - const supportedChainIds = BRIDGE_SUPPORTED_CHAINS.map((chain) => chain.id); - const tokens = useMemo(() => { - return supportedChainIds - .map((chainId) => - getTokens(chainId).map((token) => { - return { ...token }; - }) - ) - .flat(); - }, [supportedChainIds]); - - if (!provider) { - return null; - } - - return ( - - - - ); -} diff --git a/earn/src/components/portfolio/modal/WithdrawModal.tsx b/earn/src/components/portfolio/modal/WithdrawModal.tsx index 26f0b681..2485f977 100644 --- a/earn/src/components/portfolio/modal/WithdrawModal.tsx +++ b/earn/src/components/portfolio/modal/WithdrawModal.tsx @@ -12,9 +12,9 @@ import { LendingPair } from 'shared/lib/data/LendingPair'; import { Token } from 'shared/lib/data/Token'; import useChain from 'shared/lib/hooks/UseChain'; import { formatNumberInput, truncateDecimals } from 'shared/lib/util/Numbers'; +import { zeroAddress } from 'viem'; import { useAccount } from 'wagmi'; -import { ZERO_ADDRESS } from '../../../data/constants/Addresses'; import { RedeemState, useRedeem } from '../../../data/hooks/UseRedeem'; import { TokenBalance } from '../../../pages/PortfolioPage'; import PairDropdown from '../../common/PairDropdown'; @@ -109,7 +109,7 @@ export default function WithdrawModal(props: WithdrawModalProps) { activeChain.id, lender?.address, inputValue[1] ? GN.Q(112) : amount, - isOpen && account.address ? account.address : ZERO_ADDRESS + isOpen && account.address ? account.address : zeroAddress ); const maxAmount = GN.fromBigInt(maxAmountBN, selectedToken.decimals); diff --git a/earn/src/connector/FactoryActions.ts b/earn/src/connector/FactoryActions.ts deleted file mode 100644 index d3fa3aaa..00000000 --- a/earn/src/connector/FactoryActions.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { BigNumber, Contract, ContractReceipt, Signer } from 'ethers'; -import { factoryAbi } from 'shared/lib/abis/Factory'; -import { ALOE_II_FACTORY_ADDRESS } from 'shared/lib/data/constants/ChainSpecific'; -import { Chain } from 'viem'; - -import { BLOCKS_TO_WAIT, GAS_ESTIMATION_SCALING } from '../data/constants/Values'; - -export async function createMarginAccount( - signer: Signer, - poolAddress: string, - ownerAddress: string, - completionCallback: (receipt?: ContractReceipt) => void, - chain: Chain -): Promise { - const factory = new Contract(ALOE_II_FACTORY_ADDRESS[chain.id], factoryAbi, signer); - - let transactionOptions: any = {}; - - try { - const estimatedGas = ( - (await factory.estimateGas.createMarginAccount(poolAddress, ownerAddress)) as BigNumber - ).toNumber(); - - transactionOptions['gasLimit'] = (estimatedGas * GAS_ESTIMATION_SCALING).toFixed(0); - } catch (e) { - console.error('Error while estimating gas'); - console.error(e); - } - - try { - const transactionResponse = await factory.createMarginAccount(poolAddress, ownerAddress, transactionOptions); - const receipt = await transactionResponse.wait(BLOCKS_TO_WAIT); - completionCallback(receipt); - } catch (e) { - // User probably rejected in MetaMask or wallet - console.error(e); - completionCallback(); - } -} diff --git a/earn/src/connector/MarginAccountActions.ts b/earn/src/connector/MarginAccountActions.ts deleted file mode 100644 index 8298439f..00000000 --- a/earn/src/connector/MarginAccountActions.ts +++ /dev/null @@ -1,57 +0,0 @@ -import Big from 'big.js'; -import { ethers } from 'ethers'; -import JSBI from 'jsbi'; -import { Kitty } from 'shared/lib/data/Kitty'; -import { Token } from 'shared/lib/data/Token'; - -export function getTransferInActionArgs(token: Token, amount: number): string { - const address = token.address; - const bigAmount = new Big(amount.toFixed(Math.min(token.decimals, 20))).mul(10 ** token.decimals); - - return ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [address, bigAmount.toFixed(0)]); -} - -export function getTransferOutActionArgs(token: Token, amount: number): string { - const address = token.address; - const bigAmount = new Big(amount.toFixed(Math.min(token.decimals, 20))).mul(10 ** token.decimals); - - return ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [address, bigAmount.toFixed(0)]); -} - -export function getMintActionArgs(token: Token, kitty: Kitty, amount: number): string { - const address = kitty.address; - const bigAmount = new Big(amount.toFixed(Math.min(token.decimals, 20))).mul(10 ** token.decimals); - - return ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [address, bigAmount.toFixed(0)]); -} - -export function getBurnActionArgs(token: Token, kitty: Kitty, amount: number): string { - const address = kitty.address; - const bigAmount = new Big(amount.toFixed(Math.min(token.decimals, 20))).mul(10 ** token.decimals); - - return ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [address, bigAmount.toFixed(0)]); -} - -export function getBorrowActionArgs(token0: Token, amount0: number, token1: Token, amount1: number): string { - const bigAmount0 = new Big(amount0.toFixed(Math.min(token0.decimals, 20))).mul(10 ** token0.decimals); - const bigAmount1 = new Big(amount1.toFixed(Math.min(token1.decimals, 20))).mul(10 ** token1.decimals); - - return ethers.utils.defaultAbiCoder.encode(['uint256', 'uint256'], [bigAmount0.toFixed(0), bigAmount1.toFixed(0)]); -} - -export function getRepayActionArgs(token0: Token, amount0: number, token1: Token, amount1: number): string { - const bigAmount0 = new Big(amount0.toFixed(Math.min(token0.decimals, 20))).mul(10 ** token0.decimals); - const bigAmount1 = new Big(amount1.toFixed(Math.min(token1.decimals, 20))).mul(10 ** token1.decimals); - - return ethers.utils.defaultAbiCoder.encode(['uint256', 'uint256'], [bigAmount0.toFixed(0), bigAmount1.toFixed(0)]); -} - -export function getAddLiquidityActionArgs(lower: number, upper: number, liquidity: JSBI): string { - if (lower > upper) [lower, upper] = [upper, lower]; - return ethers.utils.defaultAbiCoder.encode(['int24', 'int24', 'uint128'], [lower, upper, liquidity.toString(10)]); -} - -export function getRemoveLiquidityActionArgs(lower: number, upper: number, liquidity: JSBI): string { - if (lower > upper) [lower, upper] = [upper, lower]; - return ethers.utils.defaultAbiCoder.encode(['int24', 'int24', 'uint128'], [lower, upper, liquidity.toString(10)]); -} diff --git a/earn/src/data/GlobalStats.ts b/earn/src/data/GlobalStats.ts deleted file mode 100644 index 07b264ad..00000000 --- a/earn/src/data/GlobalStats.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type GlobalStats = { - poolCount: number; - users: number; - totalValueLocked: number; -}; diff --git a/earn/src/data/MarginAccount.ts b/earn/src/data/MarginAccount.ts deleted file mode 100644 index a06b22c2..00000000 --- a/earn/src/data/MarginAccount.ts +++ /dev/null @@ -1,352 +0,0 @@ -import Big from 'big.js'; -import { CallReturnContext, ContractCallContext, ContractCallReturnContext, Multicall } from 'ethereum-multicall'; -import { BigNumber, ethers } from 'ethers'; -import JSBI from 'jsbi'; -import { borrowerAbi } from 'shared/lib/abis/Borrower'; -import { borrowerLensAbi } from 'shared/lib/abis/BorrowerLens'; -import { erc20Abi } from 'shared/lib/abis/ERC20'; -import { factoryAbi } from 'shared/lib/abis/Factory'; -import { volatilityOracleAbi } from 'shared/lib/abis/VolatilityOracle'; -import { Assets, Liabilities } from 'shared/lib/data/Borrower'; -import { - ALOE_II_FACTORY_ADDRESS, - ALOE_II_BORROWER_LENS_ADDRESS, - ALOE_II_ORACLE_ADDRESS, - MULTICALL_ADDRESS, -} from 'shared/lib/data/constants/ChainSpecific'; -import { Q32 } from 'shared/lib/data/constants/Values'; -import { FeeTier, NumericFeeTierToEnum } from 'shared/lib/data/FeeTier'; -import { GN } from 'shared/lib/data/GoodNumber'; -import { Token } from 'shared/lib/data/Token'; -import { getToken } from 'shared/lib/data/TokenData'; -import { UniswapPosition } from 'shared/lib/data/Uniswap'; -import { toBig, toImpreciseNumber } from 'shared/lib/util/Numbers'; -import { Address, Hex } from 'viem'; - -import { TOPIC0_CREATE_BORROWER_EVENT } from './constants/Signatures'; - -type ContractCallReturnContextEntries = { - [key: string]: ContractCallReturnContext; -}; - -function convertBigNumbersForReturnContexts(callReturnContexts: CallReturnContext[]): CallReturnContext[] { - return callReturnContexts.map((callReturnContext) => { - callReturnContext.returnValues = callReturnContext.returnValues.map((returnValue) => { - // If the return value is a BigNumber, convert it to an ethers BigNumber - if (returnValue?.type === 'BigNumber' && returnValue?.hex) { - returnValue = BigNumber.from(returnValue.hex); - } - return returnValue; - }); - return callReturnContext; - }); -} - -/** - * For the use-cases that require all of the data - */ -export type MarginAccount = { - address: Address; - uniswapPool: string; - token0: Token; - token1: Token; - feeTier: FeeTier; - assets: Assets; - liabilities: Liabilities; - sqrtPriceX96: Big; - health: number; - lender0: Address; - lender1: Address; - iv: number; - nSigma: number; - userDataHex: Hex; - warningTime: number; -}; - -/** - * For the use-cases that may not require all of the data - * (When we don't want to fetch more than we need) - */ -export type MarginAccountPreview = Omit; - -export async function getMarginAccountsForUser( - chainId: number, - provider: ethers.providers.Provider, - userAddress: string -): Promise<{ address: string; uniswapPool: string }[]> { - let logs: ethers.providers.Log[] = []; - try { - logs = await provider.getLogs({ - fromBlock: 0, - toBlock: 'latest', - address: ALOE_II_FACTORY_ADDRESS[chainId], - topics: [TOPIC0_CREATE_BORROWER_EVENT, null, `0x000000000000000000000000${userAddress.slice(2)}`], - }); - } catch (e) { - console.error(e); - } - if (logs.length === 0) return []; - - const accounts: { address: string; uniswapPool: string }[] = logs.map((item: any) => { - return { - address: item.data.slice(0, 2) + item.data.slice(26), - uniswapPool: item.topics[1].slice(26), - }; - }); - - return accounts; -} - -export type UniswapPoolInfo = { - token0: Token; - token1: Token; - fee: number; -}; - -export async function fetchBorrowerDatas( - chainId: number, - provider: ethers.providers.BaseProvider, - addresses: Address[], - uniswapPoolDataMap: Map -): Promise { - const multicall = new Multicall({ - ethersProvider: provider, - tryAggregate: true, - multicallCustomContractAddress: MULTICALL_ADDRESS[chainId], - }); - const borrowerUniswapPoolCallContext: ContractCallContext[] = addresses.map((borrowerAddress) => ({ - reference: `${borrowerAddress}`, - contractAddress: borrowerAddress, - abi: borrowerAbi as any, - calls: [{ reference: 'uniswapPool', methodName: 'UNISWAP_POOL', methodParameters: [] }], - })); - const borrowerUniswapPools = (await multicall.call(borrowerUniswapPoolCallContext)).results; - - const marginAccountCallContext: ContractCallContext[] = []; - - // Fetch all the data for the margin accounts - addresses.forEach((accountAddress) => { - const uniswapPool = borrowerUniswapPools[accountAddress].callsReturnContext[0].returnValues[0]; - const uniswapPoolInfo = uniswapPoolDataMap.get(uniswapPool) ?? null; - - if (uniswapPoolInfo === null) return; - - const token0 = uniswapPoolInfo.token0; - const token1 = uniswapPoolInfo.token1; - const fee = uniswapPoolInfo.fee; - - if (!token0 || !token1) return; - // Fetching the data for the margin account using three contracts - marginAccountCallContext.push({ - reference: `${accountAddress}-account`, - contractAddress: accountAddress, - abi: borrowerAbi as any, - calls: [ - { - reference: 'lender0', - methodName: 'LENDER0', - methodParameters: [], - }, - { - reference: 'lender1', - methodName: 'LENDER1', - methodParameters: [], - }, - { - reference: 'slot0', - methodName: 'slot0', - methodParameters: [], - }, - { - reference: 'getLiabilities', - methodName: 'getLiabilities', - methodParameters: [], - }, - ], - }); - marginAccountCallContext.push({ - reference: `${accountAddress}-oracle`, - contractAddress: ALOE_II_ORACLE_ADDRESS[chainId], - abi: volatilityOracleAbi as any, - calls: [ - { - reference: 'consult', - methodName: 'consult', - methodParameters: [uniswapPool, Q32], - }, - ], - }); - marginAccountCallContext.push({ - reference: `${accountAddress}-token0`, - contractAddress: token0.address, - abi: erc20Abi as any, - calls: [ - { - reference: 'balanceOf', - methodName: 'balanceOf', - methodParameters: [accountAddress], - }, - ], - }); - marginAccountCallContext.push({ - reference: `${accountAddress}-token1`, - contractAddress: token1.address, - abi: erc20Abi as any, - calls: [ - { - reference: 'balanceOf', - methodName: 'balanceOf', - methodParameters: [accountAddress], - }, - ], - }); - marginAccountCallContext.push({ - reference: `${accountAddress}-lens`, - contractAddress: ALOE_II_BORROWER_LENS_ADDRESS[chainId], - abi: borrowerLensAbi as any, - calls: [ - { - reference: 'getHealth', - methodName: 'getHealth', - methodParameters: [accountAddress], - }, - { - reference: 'getUniswapPositions', - methodName: 'getUniswapPositions', - methodParameters: [accountAddress], - }, - ], - context: { - fee: fee, - token0Address: token0.address, - token1Address: token1.address, - chainId: chainId, - accountAddress: accountAddress, - uniswapPool: uniswapPool, - }, - }); - marginAccountCallContext.push({ - reference: `${accountAddress}-nSigma`, - contractAddress: ALOE_II_FACTORY_ADDRESS[chainId], - abi: factoryAbi as any, - calls: [ - { - reference: 'getParameters', - methodName: 'getParameters', - methodParameters: [uniswapPool], - }, - ], - }); - }); - - const marginAccountResults = (await multicall.call(marginAccountCallContext)).results; - - const correspondingMarginAccountResults: Map = new Map(); - - // Convert the results into a map of account address to the results - Object.entries(marginAccountResults).forEach(([key, value]) => { - const entryAccountAddress = key.split('-')[0]; - const entryType = key.split('-')[1]; - const existingValue = correspondingMarginAccountResults.get(entryAccountAddress); - if (existingValue) { - existingValue[entryType] = value; - correspondingMarginAccountResults.set(entryAccountAddress, existingValue); - } else { - correspondingMarginAccountResults.set(entryAccountAddress, { [entryType]: value }); - } - }); - - const marginAccounts: MarginAccount[] = []; - - correspondingMarginAccountResults.forEach((value) => { - const { - lens: lensResults, - account: accountResults, - oracle: oracleResults, - token0: token0Results, - token1: token1Results, - } = value; - const accountReturnContexts = convertBigNumbersForReturnContexts(accountResults.callsReturnContext); - const lensReturnContexts = convertBigNumbersForReturnContexts(lensResults.callsReturnContext); - const token0ReturnContexts = convertBigNumbersForReturnContexts(token0Results.callsReturnContext); - const token1ReturnContexts = convertBigNumbersForReturnContexts(token1Results.callsReturnContext); - const { fee, token0Address, token1Address, chainId, accountAddress, uniswapPool } = - lensResults.originalContractCallContext.context; - // Reconstruct the objects (since we can't transfer them as is through the context) - const feeTier = NumericFeeTierToEnum(fee); - const token0 = getToken(chainId, token0Address)!; - const token1 = getToken(chainId, token1Address)!; - const liabilitiesData = accountReturnContexts[3].returnValues; - const token0Balance = token0ReturnContexts[0].returnValues[0]; - const token1Balance = token1ReturnContexts[0].returnValues[0]; - const healthData = lensReturnContexts[0].returnValues; - const nSigma = convertBigNumbersForReturnContexts(value.nSigma.callsReturnContext)[0].returnValues[1] / 10; - - const health = toImpreciseNumber(healthData[0].lt(healthData[1]) ? healthData[0] : healthData[1], 18); - const liabilities: Liabilities = { - amount0: toImpreciseNumber(liabilitiesData[0], token0.decimals), - amount1: toImpreciseNumber(liabilitiesData[1], token1.decimals), - }; - - const uniswapPositionData = lensReturnContexts[1].returnValues; - const uniswapPositionBounds = uniswapPositionData[0] as number[]; - const uniswapPositionLiquidity = uniswapPositionData[1] as { hex: Hex }[]; - - const uniswapPositions: UniswapPosition[] = []; - uniswapPositionLiquidity.forEach((liquidity, i) => { - uniswapPositions.push({ - lower: uniswapPositionBounds[i * 2], - upper: uniswapPositionBounds[i * 2 + 1], - liquidity: JSBI.BigInt(liquidity.hex), - }); - }); - // const uniswapPositionFees = uniswapPositionData[2]; - - const assets = new Assets( - GN.fromBigNumber(token0Balance, token0.decimals), - GN.fromBigNumber(token1Balance, token1.decimals), - uniswapPositions - ); - - const slot0 = accountReturnContexts[2].returnValues[0] as BigNumber; - const userDataHex = slot0.shr(144).mask(64).toHexString() as Hex; - const warningTime = slot0.shr(208).mask(40).toNumber(); - - const oracleReturnValues = convertBigNumbersForReturnContexts(oracleResults.callsReturnContext)[0].returnValues; - const marginAccount: MarginAccount = { - address: accountAddress, - sqrtPriceX96: toBig(oracleReturnValues[1]), - iv: toImpreciseNumber(oracleReturnValues[2], 12), - uniswapPool, - feeTier, - assets, - liabilities, - health, - token0, - token1, - lender0: accountReturnContexts[0].returnValues[0], - lender1: accountReturnContexts[1].returnValues[0], - nSigma, - userDataHex, - warningTime, - }; - marginAccounts.push(marginAccount); - }); - - return marginAccounts; -} - -export async function fetchMarginAccounts( - chainId: number, - provider: ethers.providers.BaseProvider, - userAddress: string, - uniswapPoolDataMap: Map -): Promise { - const borrowers = await getMarginAccountsForUser(chainId, provider, userAddress); - return fetchBorrowerDatas( - chainId, - provider, - borrowers.map((b) => b.address as Address), - uniswapPoolDataMap - ); -} diff --git a/earn/src/data/PriceRelayResponse.ts b/earn/src/data/PriceRelayResponse.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/earn/src/data/RedeemRewardReponse.ts b/earn/src/data/RedeemRewardReponse.ts deleted file mode 100644 index 0487d7a5..00000000 --- a/earn/src/data/RedeemRewardReponse.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type RedeemRewardResponse = { - success: boolean; - message: string; -}; diff --git a/earn/src/data/constants/Addresses.ts b/earn/src/data/constants/Addresses.ts deleted file mode 100644 index 7305a0b9..00000000 --- a/earn/src/data/constants/Addresses.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; - -export const UNISWAP_POOL_DENYLIST = [ - '0x27807dD7ADF218e1f4d885d54eD51C70eFb9dE50', // USDT-MIM on Arbitrum - '0xa9bA2535BdAc4c6A5dc3c3f112763A84BD472816', -].map((address) => address.toLowerCase()); diff --git a/earn/src/data/constants/Breakpoints.ts b/earn/src/data/constants/Breakpoints.ts deleted file mode 100644 index 96e272b7..00000000 --- a/earn/src/data/constants/Breakpoints.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const RESPONSIVE_BREAKPOINTS = { - LG: 1400, - MD: 1200, - SM: 768, - XS: 480, -}; - -export const RESPONSIVE_BREAKPOINT_LG = `${RESPONSIVE_BREAKPOINTS.LG}px`; -export const RESPONSIVE_BREAKPOINT_MD = `${RESPONSIVE_BREAKPOINTS.MD}px`; -export const RESPONSIVE_BREAKPOINT_SM = `${RESPONSIVE_BREAKPOINTS.SM}px`; -export const RESPONSIVE_BREAKPOINT_XS = `${RESPONSIVE_BREAKPOINTS.XS}px`; - -export const BROWSE_CARD_WIDTH_XL = '580px'; -export const BROWSE_CARD_WIDTH_LG = '500px'; -export const BROWSE_CARD_WIDTH_MD = '400px'; diff --git a/earn/src/data/constants/Signatures.ts b/earn/src/data/constants/Signatures.ts deleted file mode 100644 index 5c256238..00000000 --- a/earn/src/data/constants/Signatures.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const TOPIC0_CREATE_BORROWER_EVENT = '0x1ff0a9a76572c6e0f2f781872c1e45b4bab3a0d90df274ebf884b4c11e3068f4'; -export const TOPIC0_ENROLL_COURIER_EVENT = '0x9038af148c4bb36b89ff46ec17f02b27c5ab1e0ca181c0f0981b986a78b002d5'; -export const TOPIC0_CREATE_MARKET_EVENT = '0x3f53d2c2743b2b162c0aa5d678be4058d3ae2043700424be52c04105df3e2411'; -export const TOPIC0_UPDATE_ORACLE = '0x965518ee86dc5d32ef4108b1f8b7b15e2192959e251d990dac29c49ed3dcb79c'; diff --git a/earn/src/data/constants/Values.ts b/earn/src/data/constants/Values.ts deleted file mode 100644 index 13464366..00000000 --- a/earn/src/data/constants/Values.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BigNumber } from 'ethers'; -import { toBig } from 'shared/lib/util/Numbers'; -import { isDappnet } from 'shared/lib/util/Utils'; - -export const UINT256_MAX = '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'; -export const BLOCKS_TO_WAIT = 1; -export const DEFAULT_RATIO_CHANGE = '5.0'; -export const RATIO_CHANGE_CUTOFF = 0; -export const API_URL = 'https://api.aloe.capital'; -export const GAS_ESTIMATION_SCALING = 1.1; -export const Q48 = BigNumber.from('0x1000000000000'); -export const Q96 = BigNumber.from('0x1000000000000000000000000'); -export const BIGQ96 = toBig(Q96); -export const MAX_UNISWAP_POSITIONS = 3; - -export const API_PRICE_RELAY_LATEST_URL = 'https://api-price.aloe.capital/price-relay/v1/latest'; -export const API_PRICE_RELAY_HISTORICAL_URL = 'https://api-price.aloe.capital/price-relay/v1/historical'; -export const API_PRICE_RELAY_CONSOLIDATED_URL = 'https://api-price.aloe.capital/price-relay/v1/consolidated'; - -export function primeUrl() { - // NOTE: trailing `/` is important for .eth domain resolution to work - return isDappnet() ? 'https://prime.aloe.eth/' : 'https://prime.aloe.capital/'; -} diff --git a/earn/src/data/hooks/UseRedeem.ts b/earn/src/data/hooks/UseRedeem.ts index c988cb2e..625bdf75 100644 --- a/earn/src/data/hooks/UseRedeem.ts +++ b/earn/src/data/hooks/UseRedeem.ts @@ -1,7 +1,7 @@ import { lenderLensAbi } from 'shared/lib/abis/LenderLens'; import { ALOE_II_LENDER_LENS_ADDRESS } from 'shared/lib/data/constants/ChainSpecific'; import { GN } from 'shared/lib/data/GoodNumber'; -import { Address, erc4626Abi, maxUint256 } from 'viem'; +import { Address, erc4626Abi, maxUint256, zeroAddress } from 'viem'; import { useReadContract, useReadContracts, @@ -9,8 +9,6 @@ import { useWriteContract, } from 'wagmi'; -import { ZERO_ADDRESS } from '../constants/Addresses'; - export enum RedeemState { WAITING_FOR_INPUT, FETCHING_DATA, @@ -49,7 +47,7 @@ export function useRedeem( contracts: [ { ...erc4626, functionName: 'maxWithdraw', args: [owner] }, { ...erc4626, functionName: 'maxRedeem', args: [owner] }, - { ...lenderLens, functionName: 'isMaxRedeemDynamic', args: [lender ?? ZERO_ADDRESS, owner] }, + { ...lenderLens, functionName: 'isMaxRedeemDynamic', args: [lender ?? zeroAddress, owner] }, ] as const, allowFailure: false, query: { enabled: lender !== undefined }, diff --git a/earn/src/data/BorrowerNft.ts b/earn/src/data/hooks/useDeprecatedMarginAccountShim.ts similarity index 50% rename from earn/src/data/BorrowerNft.ts rename to earn/src/data/hooks/useDeprecatedMarginAccountShim.ts index 13026b50..4a32b009 100644 --- a/earn/src/data/BorrowerNft.ts +++ b/earn/src/data/hooks/useDeprecatedMarginAccountShim.ts @@ -2,14 +2,32 @@ import { useMemo } from 'react'; import Big from 'big.js'; import { borrowerNftAbi } from 'shared/lib/abis/BorrowerNft'; -import { Borrower } from 'shared/lib/data/Borrower'; -import { NumericFeeTierToEnum } from 'shared/lib/data/FeeTier'; -import { GNFormat } from 'shared/lib/data/GoodNumber'; +import { Assets, Liabilities } from 'shared/lib/data/Borrower'; +import { FeeTier, NumericFeeTierToEnum } from 'shared/lib/data/FeeTier'; +import { GN, GNFormat } from 'shared/lib/data/GoodNumber'; import { LendingPair } from 'shared/lib/data/LendingPair'; -import { BorrowerNftRef } from 'shared/lib/hooks/UseBorrowerNft'; -import { GetContractEventsReturnType } from 'viem'; +import { Token } from 'shared/lib/data/Token'; +import { BorrowerNft } from 'shared/lib/hooks/UseBorrowerNft'; +import { Address, GetContractEventsReturnType, Hex } from 'viem'; -import { MarginAccount } from './MarginAccount'; +export type MarginAccount = { + address: Address; + uniswapPool: Address; + token0: Token; + token1: Token; + feeTier: FeeTier; + assets: Assets; + liabilities: Liabilities; + sqrtPriceX96: Big; + health: number; + lender0: Address; + lender1: Address; + iv: number; + nSigma: number; + userDataHex: Hex; + warningTime: number; + ethBalance?: GN; +}; export type BorrowerNftBorrower = MarginAccount & { tokenId: string; @@ -19,25 +37,24 @@ export type BorrowerNftBorrower = MarginAccount & { export function useDeprecatedMarginAccountShim( lendingPairs: LendingPair[], - borrowerNftRefs: BorrowerNftRef[], - borrowers: Borrower[] | undefined + borrowerNfts: BorrowerNft[] ): BorrowerNftBorrower[] | null { return useMemo(() => { - if (borrowers === undefined || borrowerNftRefs.length !== borrowers.length) return null; + if (borrowerNfts.some((nft) => nft.borrower === undefined)) return null; - const borrowerNfts = borrowerNftRefs.map((ref, i) => { - const borrower = borrowers[i]; - const pair = lendingPairs.find((pair) => pair.uniswapPool.toLowerCase() === ref.uniswapPool.toLowerCase())!; + const results = borrowerNfts.map((nft) => { + const borrower = nft.borrower!; + const pair = lendingPairs.find((pair) => pair.uniswapPool.toLowerCase() === nft.uniswapPool.toLowerCase())!; const sqrtPriceX96 = new Big(pair.oracleData.sqrtPriceX96.toString(GNFormat.INT)); const iv = pair.iv; return { - tokenId: ref.tokenId, - index: ref.index, - mostRecentModify: ref.mostRecentModify, - address: ref.address, - uniswapPool: ref.uniswapPool, + tokenId: nft.tokenId, + index: nft.index, + mostRecentModify: nft.mostRecentModify, + address: nft.address, + uniswapPool: nft.uniswapPool, token0: pair.token0, token1: pair.token1, feeTier: NumericFeeTierToEnum(pair.uniswapFeeTier), @@ -54,9 +71,10 @@ export function useDeprecatedMarginAccountShim( nSigma: pair.factoryData.nSigma, userDataHex: borrower.userData, warningTime: borrower.warnTime, + ethBalance: borrower.ethBalance, } as BorrowerNftBorrower; }); - borrowerNfts.reverse(); - return borrowerNfts; - }, [lendingPairs, borrowerNftRefs, borrowers]); + results.sort((a, b) => Number((b.mostRecentModify?.blockNumber || 0n) - (a.mostRecentModify?.blockNumber || 0n))); + return results; + }, [lendingPairs, borrowerNfts]); } diff --git a/earn/src/pages/AdvancedPage.tsx b/earn/src/pages/AdvancedPage.tsx index d3799fd0..732dcbc7 100644 --- a/earn/src/pages/AdvancedPage.tsx +++ b/earn/src/pages/AdvancedPage.tsx @@ -1,15 +1,14 @@ import { useEffect, useMemo, useState } from 'react'; import { type WriteContractReturnType } from '@wagmi/core'; -import { ethers } from 'ethers'; import JSBI from 'jsbi'; import { useSearchParams } from 'react-router-dom'; import Banner from 'shared/lib/components/banner/Banner'; import AppPage from 'shared/lib/components/common/AppPage'; import { Text } from 'shared/lib/components/common/Typography'; +import { RESPONSIVE_BREAKPOINT_SM } from 'shared/lib/data/constants/Breakpoints'; import { ALOE_II_BORROWER_NFT_ADDRESS } from 'shared/lib/data/constants/ChainSpecific'; import { GetNumericFeeTier } from 'shared/lib/data/FeeTier'; -import { GN } from 'shared/lib/data/GoodNumber'; import { Token } from 'shared/lib/data/Token'; import { fetchUniswapNFTPositions, UniswapNFTPosition } from 'shared/lib/data/Uniswap'; import { useBorrowerNfts } from 'shared/lib/hooks/UseBorrowerNft'; @@ -17,11 +16,10 @@ import useChain from 'shared/lib/hooks/UseChain'; import { useLendingPair, useLendingPairs } from 'shared/lib/hooks/UseLendingPairs'; import { useTokenColors } from 'shared/lib/hooks/UseTokenColors'; import { useUniswapPools } from 'shared/lib/hooks/UseUniswapPools'; -import { getEtherscanUrlForChain } from 'shared/lib/util/Chains'; +import { getBlockExplorerUrl } from 'shared/lib/util/Chains'; import styled from 'styled-components'; -import { Address } from 'viem'; import { linea } from 'viem/chains'; -import { Config, useAccount, useBalance, useBlockNumber, useClient, usePublicClient } from 'wagmi'; +import { Config, useAccount, useBlockNumber, useClient, usePublicClient } from 'wagmi'; import { ReactComponent as InfoIcon } from '../assets/svg/info.svg'; import { BorrowMetrics } from '../components/advanced/BorrowMetrics'; @@ -38,12 +36,11 @@ import SmartWalletButton, { NewSmartWalletButton } from '../components/advanced/ import { TokenAllocationWidget } from '../components/advanced/TokenAllocationWidget'; import { UniswapPositionList } from '../components/advanced/UniswapPositionList'; import PendingTxnModal, { PendingTxnModalStatus } from '../components/common/PendingTxnModal'; -import { useDeprecatedMarginAccountShim } from '../data/BorrowerNft'; -import { RESPONSIVE_BREAKPOINT_SM } from '../data/constants/Breakpoints'; +import { useDeprecatedMarginAccountShim } from '../data/hooks/useDeprecatedMarginAccountShim'; import { useEthersProvider } from '../util/Provider'; const BORROW_TITLE_TEXT_COLOR = 'rgba(130, 160, 182, 1)'; -const SELECTED_MARGIN_ACCOUNT_KEY = 'account'; +const SELECTED_BORROWER_NFT_ID = 'nft'; const Container = styled.div` display: grid; @@ -158,12 +155,13 @@ export default function AdvancedPage() { const { lendingPairs, refetchOracleData, refetchLenderData } = useLendingPairs(activeChain.id); const { data: tokenColors } = useTokenColors(lendingPairs); - const { borrowerNftRefs, borrowers, refetchBorrowerNftRefs, refetchBorrowers } = useBorrowerNfts( - lendingPairs, + const availablePools = useUniswapPools(lendingPairs); + const { borrowerNfts, refetchBorrowerNftRefs, refetchBorrowers } = useBorrowerNfts( + availablePools, userAddress, activeChain.id ); - const borrowerNftBorrowers = useDeprecatedMarginAccountShim(lendingPairs, borrowerNftRefs, borrowers); + const borrowerNftsDeprecated = useDeprecatedMarginAccountShim(lendingPairs, borrowerNfts); // Poll for `blockNumber` when app is in the foreground. Not much different than a `useInterval` that stops // when in the background @@ -191,28 +189,17 @@ export default function AdvancedPage() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [blockNumber]); - const selectedMarginAccount = useMemo(() => { - const marginAccountSearchParam = searchParams.get(SELECTED_MARGIN_ACCOUNT_KEY); - if (!marginAccountSearchParam) return borrowerNftBorrowers?.[0]; - return ( - borrowerNftBorrowers?.find((account) => account.address === marginAccountSearchParam) ?? borrowerNftBorrowers?.[0] - ); - }, [borrowerNftBorrowers, searchParams]); + const selection = useMemo(() => { + if (!borrowerNftsDeprecated || borrowerNftsDeprecated.length === 0) return undefined; - const market = useLendingPair(lendingPairs, selectedMarginAccount?.uniswapPool as Address | undefined); + const nftId = searchParams.get(SELECTED_BORROWER_NFT_ID); + let idx = borrowerNftsDeprecated.findIndex((ref) => parseInt(ref.tokenId.slice(-4), 16).toString() === nftId); + if (idx === -1) idx = 0; - const availablePools = useUniswapPools(lendingPairs); + return borrowerNftsDeprecated[idx]; + }, [searchParams, borrowerNftsDeprecated]); - // MARK: Reset search param if margin account doesn't exist - useEffect(() => { - if ( - borrowerNftBorrowers?.length && - selectedMarginAccount?.address !== searchParams.get(SELECTED_MARGIN_ACCOUNT_KEY) - ) { - searchParams.delete(SELECTED_MARGIN_ACCOUNT_KEY); - setSearchParams(searchParams); - } - }, [borrowerNftBorrowers?.length, searchParams, selectedMarginAccount, setSearchParams]); + const market = useLendingPair(lendingPairs, selection?.uniswapPool); useEffect(() => { (async () => { @@ -220,7 +207,7 @@ export default function AdvancedPage() { const fetchedUniswapNFTPositions = await fetchUniswapNFTPositions(userAddress, provider); setUniswapNFTPositions(fetchedUniswapNFTPositions); })(); - }, [provider, setUniswapNFTPositions, userAddress]); + }, [userAddress, provider, setUniswapNFTPositions]); const publicClient = usePublicClient({ chainId: activeChain.id }); useEffect(() => { @@ -239,34 +226,28 @@ export default function AdvancedPage() { })(); }, [publicClient, pendingTxn, setOpenedModal, setPendingTxnModalStatus]); - const { data: accountEtherBalanceResult } = useBalance({ - address: selectedMarginAccount?.address as Address, - chainId: activeChain.id, - query: { enabled: selectedMarginAccount !== undefined }, - }); - - const accountEtherBalance = accountEtherBalanceResult && GN.fromBigInt(accountEtherBalanceResult.value, 18); - const filteredNonZeroUniswapNFTPositions = useMemo(() => { const filteredPositions: Map = new Map(); - if (selectedMarginAccount == null) return filteredPositions; + if (!selection) return filteredPositions; + uniswapNFTPositions.forEach((position, tokenId) => { if ( - selectedMarginAccount.token0.equals(position.token0) && - selectedMarginAccount.token1.equals(position.token1) && - GetNumericFeeTier(selectedMarginAccount.feeTier) === position.fee && + position.token0.equals(selection.token0) && + position.token1.equals(selection.token1) && + position.fee === GetNumericFeeTier(selection.feeTier) && JSBI.greaterThan(position.liquidity, JSBI.BigInt('0')) ) { filteredPositions.set(tokenId, position); } }); return filteredPositions; - }, [selectedMarginAccount, uniswapNFTPositions]); + }, [selection, uniswapNFTPositions]); const withdrawableUniswapNFTPositions = useMemo(() => { const filteredPositions: Map = new Map(); - if (selectedMarginAccount == null) return filteredPositions; - selectedMarginAccount.assets.uniswapPositions.forEach((uniswapPosition) => { + if (!selection) return filteredPositions; + + selection.assets.uniswapPositions.forEach((uniswapPosition) => { const isNonZero = JSBI.greaterThan(uniswapPosition.liquidity, JSBI.BigInt('0')); const matchingNFTPosition = Array.from(uniswapNFTPositions.entries()).find(([, position]) => { return position.lower === uniswapPosition.lower && position.upper === uniswapPosition.upper; @@ -276,32 +257,22 @@ export default function AdvancedPage() { } }); return filteredPositions; - }, [selectedMarginAccount, uniswapNFTPositions]); - - const defaultPool = Array.from(availablePools.keys())[0]; + }, [selection, uniswapNFTPositions]); - const dailyInterest0 = - ((market?.kitty0Info.borrowAPR || 0) / 365) * (selectedMarginAccount?.liabilities.amount0 || 0); - const dailyInterest1 = - ((market?.kitty1Info.borrowAPR || 0) / 365) * (selectedMarginAccount?.liabilities.amount1 || 0); - - const baseEtherscanUrl = getEtherscanUrlForChain(activeChain); - const selectedMarginAccountEtherscanUrl = `${baseEtherscanUrl}/address/${selectedMarginAccount?.address}`; - const selectedBorrowerOpenseaUrl = `https://opensea.io/assets/${activeChain.name}/${ + const blockExplorerUrl = getBlockExplorerUrl(activeChain); + const selectionUrlBlockExplorer = `${blockExplorerUrl}/address/${selection?.address}`; + const selectionUrlOpensea = `https://opensea.io/assets/${activeChain.name}/${ ALOE_II_BORROWER_NFT_ADDRESS[activeChain.id] - }/${selectedMarginAccount ? ethers.BigNumber.from(selectedMarginAccount!.tokenId).toString() : ''}`; - - const hasLiabilities = Object.values(selectedMarginAccount?.liabilities ?? {}).some((liability) => { - return liability > 0; - }); - - const accountHasEther = accountEtherBalance?.isGtZero() ?? false; + }/${selection ? BigInt(selection.tokenId).toString(10) : ''}`; - const userHasNoMarginAccounts = borrowerNftBorrowers?.length === 0; + const selectionHasEther = selection?.ethBalance!.isGtZero() ?? false; + const selectionHasLiabilities = Boolean( + (selection?.liabilities.amount0 ?? 0) > 0 || (selection?.liabilities.amount1 ?? 0) > 0 + ); - const canWithdrawAnte = !hasLiabilities && accountHasEther; - const canClearWarning = - selectedMarginAccount && selectedMarginAccount.health >= 1 && selectedMarginAccount.warningTime > 0; + const userHasBorrowers = borrowerNfts.length > 0; + const canWithdrawAnte = selectionHasEther && !selectionHasLiabilities; + const canClearWarning = selection && selection.health >= 1 && selection.warningTime > 0; return ( <> @@ -326,51 +297,50 @@ export default function AdvancedPage() { onRepay={() => setOpenedModal(OpenedModal.REPAY)} onWithdrawAnte={canWithdrawAnte ? () => setOpenedModal(OpenedModal.WITHDRAW_ANTE) : undefined} onClearWarning={canClearWarning ? () => setOpenedModal(OpenedModal.CLEAR_WARNING) : undefined} - isDisabled={!selectedMarginAccount || !isConnected} + isDisabled={!selection || !isConnected} /> - {borrowerNftBorrowers?.map((account) => ( - { - // When a new account is selected, we need to update the - // selectedMarginAccount, selectedMarketInfo, and uniswapPositions - // setSelectedMarginAccount(account); - setSearchParams({ [SELECTED_MARGIN_ACCOUNT_KEY]: account.address }); - }} - key={account.address} - /> - ))} + {borrowerNftsDeprecated?.map((nft, i) => { + const tokenCounter = parseInt(nft.tokenId.slice(-4), 16); + return ( + { + setSearchParams({ [SELECTED_BORROWER_NFT_ID]: tokenCounter.toString() }); + }} + key={nft.address} + /> + ); + })} setOpenedModal(OpenedModal.NEW_SMART_WALLET)} /> - + - {selectedMarginAccount && ( + {selection && (
- + View on Etherscan @@ -378,7 +348,7 @@ export default function AdvancedPage() { - + View on OpenSea @@ -390,52 +360,49 @@ export default function AdvancedPage() { {availablePools.size > 0 && ( setOpenedModal(isOpen ? OpenedModal.NEW_SMART_WALLET : OpenedModal.NONE)} setPendingTxn={setPendingTxn} /> )} - {selectedMarginAccount && market && ( + {selection && market && ( <> setOpenedModal(isOpen ? OpenedModal.ADD_COLLATERAL : OpenedModal.NONE)} setPendingTxn={setPendingTxn} /> setOpenedModal(isOpen ? OpenedModal.REMOVE_COLLATERAL : OpenedModal.NONE)} setPendingTxn={setPendingTxn} /> setOpenedModal(isOpen ? OpenedModal.BORROW : OpenedModal.NONE)} setPendingTxn={setPendingTxn} /> setOpenedModal(isOpen ? OpenedModal.REPAY : OpenedModal.NONE)} setPendingTxn={setPendingTxn} /> setOpenedModal(isOpen ? OpenedModal.WITHDRAW_ANTE : OpenedModal.NONE)} setPendingTxn={setPendingTxn} /> setOpenedModal(isOpen ? OpenedModal.CLEAR_WARNING : OpenedModal.NONE)} setPendingTxn={setPendingTxn} diff --git a/earn/src/pages/BoostPage.tsx b/earn/src/pages/BoostPage.tsx index 29882d9c..17bc7cf5 100644 --- a/earn/src/pages/BoostPage.tsx +++ b/earn/src/pages/BoostPage.tsx @@ -1,6 +1,5 @@ import { useEffect, useMemo, useState } from 'react'; -import { ethers } from 'ethers'; import JSBI from 'jsbi'; import { factoryAbi } from 'shared/lib/abis/Factory'; import { uniswapV3PoolAbi } from 'shared/lib/abis/UniswapV3Pool'; @@ -15,7 +14,7 @@ import useChain from 'shared/lib/hooks/UseChain'; import { useChainDependentState } from 'shared/lib/hooks/UseChainDependentState'; import { getProminentColor, rgb } from 'shared/lib/util/Colors'; import styled from 'styled-components'; -import { Address } from 'viem'; +import { Address, zeroAddress } from 'viem'; import { Config, useAccount, useClient, useReadContracts } from 'wagmi'; import BoostCard from '../components/boost/BoostCard'; @@ -261,7 +260,7 @@ export default function BoostPage() { null ); }) - .filter((info) => info.lender0 !== ethers.constants.AddressZero || info.lender1 !== ethers.constants.AddressZero); + .filter((info) => info.lender0 !== zeroAddress || info.lender1 !== zeroAddress); }, [slot0Data, uniswapNFTPositions, marketDatas, userAddress, activeChain.id, colors]); /*////////////////////////////////////////////////////////////// diff --git a/earn/src/pages/MarketsPage.tsx b/earn/src/pages/MarketsPage.tsx index b9c4c389..0044fc5c 100644 --- a/earn/src/pages/MarketsPage.tsx +++ b/earn/src/pages/MarketsPage.tsx @@ -18,8 +18,10 @@ import { useLendingPairsBalances } from 'shared/lib/hooks/UseLendingPairBalances import { useLendingPairs } from 'shared/lib/hooks/UseLendingPairs'; import { useLatestPriceRelay } from 'shared/lib/hooks/UsePriceRelay'; import { useTokenColors } from 'shared/lib/hooks/UseTokenColors'; +import { useUniswapPools } from 'shared/lib/hooks/UseUniswapPools'; import { formatUSDAuto } from 'shared/lib/util/Numbers'; import styled from 'styled-components'; +import { zeroAddress } from 'viem'; import { base, linea } from 'viem/chains'; import { useAccount, useBlockNumber, usePublicClient } from 'wagmi'; import { useCapabilities } from 'wagmi/experimental'; @@ -29,8 +31,7 @@ import BorrowingWidget from '../components/markets/borrow/BorrowingWidget'; import LiquidateTab from '../components/markets/liquidate/LiquidateTab'; import InfoTab from '../components/markets/monitor/InfoTab'; import SupplyTable, { SupplyTableRow } from '../components/markets/supply/SupplyTable'; -import { useDeprecatedMarginAccountShim } from '../data/BorrowerNft'; -import { ZERO_ADDRESS } from '../data/constants/Addresses'; +import { useDeprecatedMarginAccountShim } from '../data/hooks/useDeprecatedMarginAccountShim'; const SECONDARY_COLOR = 'rgba(130, 160, 182, 1)'; const SELECTED_TAB_KEY = 'selectedTab'; @@ -113,6 +114,7 @@ export default function MarketsPage() { const { data: tokenColors } = useTokenColors(lendingPairs); const { data: tokenQuotes } = useLatestPriceRelay(lendingPairs); const { balances: balancesMap, refetch: refetchBalances } = useLendingPairsBalances(lendingPairs, activeChain.id); + const uniswapPools = useUniswapPools(lendingPairs); const borrowerNftFilterParams = useMemo( () => ({ @@ -127,12 +129,11 @@ export default function MarketsPage() { [activeChain.id] ); const { - borrowerNftRefs, - borrowers: rawBorrowers, + borrowerNfts, refetchBorrowerNftRefs, refetchBorrowers, - } = useBorrowerNfts(lendingPairs, userAddress, activeChain.id, borrowerNftFilterParams); - const borrowers = useDeprecatedMarginAccountShim(lendingPairs, borrowerNftRefs, rawBorrowers); + } = useBorrowerNfts(uniswapPools, userAddress, activeChain.id, borrowerNftFilterParams); + const borrowers = useDeprecatedMarginAccountShim(lendingPairs, borrowerNfts); // Poll for `blockNumber` when app is in the foreground. Not much different than a `useInterval` that stops // when in the background @@ -183,7 +184,7 @@ export default function MarketsPage() { const supplyRows = useMemo(() => { const rows: SupplyTableRow[] = []; - const ethBalance = balancesMap.get(ZERO_ADDRESS); + const ethBalance = balancesMap.get(zeroAddress); lendingPairs.forEach((pair) => { const isToken0Weth = pair.token0.name === 'Wrapped Ether'; const isToken1Weth = pair.token1.name === 'Wrapped Ether'; diff --git a/earn/src/pages/PortfolioPage.tsx b/earn/src/pages/PortfolioPage.tsx index 408621bf..3b3cde4a 100644 --- a/earn/src/pages/PortfolioPage.tsx +++ b/earn/src/pages/PortfolioPage.tsx @@ -3,6 +3,7 @@ import { useEffect, useMemo, useState } from 'react'; import { type WriteContractReturnType } from '@wagmi/core'; import AppPage from 'shared/lib/components/common/AppPage'; import { Text } from 'shared/lib/components/common/Typography'; +import { RESPONSIVE_BREAKPOINT_SM, RESPONSIVE_BREAKPOINT_XS } from 'shared/lib/data/constants/Breakpoints'; import { GREY_700 } from 'shared/lib/data/constants/Colors'; import { Token } from 'shared/lib/data/Token'; import { getTokenBySymbol } from 'shared/lib/data/TokenData'; @@ -23,7 +24,6 @@ import PendingTxnModal, { PendingTxnModalStatus } from '../components/common/Pen import { AssetBar } from '../components/portfolio/AssetBar'; import { AssetBarPlaceholder } from '../components/portfolio/AssetBarPlaceholder'; import LendingPairPeerCard from '../components/portfolio/LendingPairPeerCard'; -import BridgeModal from '../components/portfolio/modal/BridgeModal'; import EarnInterestModal from '../components/portfolio/modal/EarnInterestModal'; import SendCryptoModal from '../components/portfolio/modal/SendCryptoModal'; import WithdrawModal from '../components/portfolio/modal/WithdrawModal'; @@ -31,7 +31,6 @@ import PortfolioActionButton from '../components/portfolio/PortfolioActionButton import PortfolioBalance from '../components/portfolio/PortfolioBalance'; import PortfolioGrid from '../components/portfolio/PortfolioGrid'; import PortfolioPageWidgetWrapper from '../components/portfolio/PortfolioPageWidgetWrapper'; -import { RESPONSIVE_BREAKPOINT_SM, RESPONSIVE_BREAKPOINT_XS } from '../data/constants/Breakpoints'; const ASSET_BAR_TOOLTIP_TEXT = `This bar shows the assets in your portfolio. Hover/click on a segment to see more details.`; @@ -105,7 +104,6 @@ export default function PortfolioPage() { const [isSendCryptoModalOpen, setIsSendCryptoModalOpen] = useState(false); const [isEarnInterestModalOpen, setIsEarnInterestModalOpen] = useState(false); const [isWithdrawModalOpen, setIsWithdrawModalOpen] = useState(false); - const [isBridgeModalOpen, setIsBridgeModalOpen] = useState(false); const [isPendingTxnModalOpen, setIsPendingTxnModalOpen] = useState(false); const [pendingTxnModalStatus, setPendingTxnModalStatus] = useState(null); @@ -322,9 +320,7 @@ export default function PortfolioPage() { label={'Bridge'} disabled={true} Icon={} - onClick={() => { - if (isConnected) setIsBridgeModalOpen(true); - }} + onClick={() => {}} />
@@ -379,7 +375,6 @@ export default function PortfolioPage() { setIsOpen={setIsWithdrawModalOpen} setPendingTxn={setPendingTxn} /> - )} diff --git a/prime/src/components/borrow/modal/PendingTxnModal.tsx b/prime/src/components/borrow/modal/PendingTxnModal.tsx index c3057496..80ada512 100644 --- a/prime/src/components/borrow/modal/PendingTxnModal.tsx +++ b/prime/src/components/borrow/modal/PendingTxnModal.tsx @@ -1,7 +1,7 @@ import { LoadingModal, MESSAGE_TEXT_COLOR } from 'shared/lib/components/common/Modal'; import { Text } from 'shared/lib/components/common/Typography'; import useChain from 'shared/lib/hooks/UseChain'; -import { getEtherscanUrlForChain } from 'shared/lib/util/Chains'; +import { getBlockExplorerUrl } from 'shared/lib/util/Chains'; export type PendingTxnModalProps = { open: boolean; @@ -19,7 +19,7 @@ export default function PendingTxnModal(props: PendingTxnModalProps) { {props.txnHash && ( [number]; +}; + +export type BorrowerNft = BorrowerNftRef & { + borrower?: Borrower; }; type BorrowerNftFilterParams = { @@ -193,14 +198,21 @@ export function useBorrowerNftRefs( } export function useBorrowerNfts( - lendingPairs: LendingPair[], + uniswapPools: UniswapPoolsMap, owner: Address | undefined, chainId: number, filterParams?: BorrowerNftFilterParams, staleTime = 60 * 1_000 ) { const { borrowerNftRefs, refetchBorrowerNftRefs } = useBorrowerNftRefs(owner, chainId, filterParams, staleTime); - const { borrowers, refetchBorrowers } = useBorrowers(lendingPairs, borrowerNftRefs, chainId, staleTime); + const { borrowers, refetchBorrowers } = useBorrowers(uniswapPools, borrowerNftRefs, chainId, staleTime); + + const borrowerNfts = useMemo(() => { + return borrowerNftRefs.map((borrowerNftRef, i) => ({ + ...borrowerNftRef, + borrower: borrowers.at(i), + } as BorrowerNft)); + }, [borrowerNftRefs, borrowers]); - return { borrowerNftRefs, borrowers, refetchBorrowerNftRefs, refetchBorrowers }; + return { borrowerNfts, refetchBorrowerNftRefs, refetchBorrowers }; } diff --git a/shared/src/hooks/UseBorrowers.ts b/shared/src/hooks/UseBorrowers.ts index 6536a583..a9f0c87c 100644 --- a/shared/src/hooks/UseBorrowers.ts +++ b/shared/src/hooks/UseBorrowers.ts @@ -1,5 +1,4 @@ import { Address } from 'viem'; -import { LendingPair } from '../data/LendingPair'; import { useReadContracts } from 'wagmi'; import { borrowerLensAbi } from '../abis/BorrowerLens'; import { ALOE_II_BORROWER_LENS_ADDRESS } from '../data/constants/ChainSpecific'; @@ -9,6 +8,7 @@ import { GN } from '../data/GoodNumber'; import JSBI from 'jsbi'; import { UniswapPosition } from '../data/Uniswap'; import { useQueryClient } from '@tanstack/react-query'; +import { UniswapPoolsMap } from './UseUniswapPools'; export type BorrowerRef = { /** @@ -27,7 +27,7 @@ export type BorrowerRef = { }; export function useBorrowers( - lendingPairs: LendingPair[], + uniswapPools: UniswapPoolsMap, borrowerRefs: BorrowerRef[], chainId: number, staleTime = 60 * 1_000 @@ -53,25 +53,14 @@ export function useBorrowers( }, }); - const lendingPairsForEvents = useMemo(() => { - let missing = false; - const res = borrowerRefs.map((ref) => { - const pair = lendingPairs.find((pair) => pair.uniswapPool.toLowerCase() === ref.uniswapPool.toLowerCase()); - if (pair === undefined) missing = true; - return pair; - }); - - if (missing) return undefined; - return res as LendingPair[]; - }, [borrowerRefs, lendingPairs]); - const borrowers = useMemo(() => { - if (summaryData === undefined || lendingPairsForEvents === undefined) return undefined; + if (summaryData === undefined) return []; return borrowerRefs.map((ref, i) => { const { uniswapPool, owner, address } = ref; const [balanceEth, balance0, balance1, liabilities0, liabilities1, slot0, liquidity] = summaryData[i]; - const pair = lendingPairsForEvents[i]; + if (!uniswapPools.has(uniswapPool)) return undefined; + const { token0, token1, fee: uniswapFee } = uniswapPools.get(uniswapPool)!; const positionTicks: { lower: number; upper: number }[] = []; for (let i = 0; i < 3; i++) { @@ -85,21 +74,26 @@ export function useBorrowers( return DerivedBorrower.from({ ethBalance: GN.fromBigInt(balanceEth, 18), assets: new Assets( - GN.fromBigInt(balance0, pair.token0.decimals), - GN.fromBigInt(balance1, pair.token1.decimals), + GN.fromBigInt(balance0, token0.decimals), + GN.fromBigInt(balance1, token1.decimals), positionTicks.map((v, i) => ({ ...v, liquidity: JSBI.BigInt(liquidity[i].toString()) } as UniswapPosition)) ), liabilities: { - amount0: GN.fromBigInt(liabilities0, pair.token0.decimals), - amount1: GN.fromBigInt(liabilities1, pair.token1.decimals), + amount0: GN.fromBigInt(liabilities0, token0.decimals), + amount1: GN.fromBigInt(liabilities1, token1.decimals), }, slot0, - address: address!, - owner: owner!, - uniswapPool: uniswapPool!, + address, + owner, + uniswapPool: { + address: uniswapPool, + fee: uniswapFee, + }, + token0, + token1, }); }); - }, [borrowerRefs, lendingPairsForEvents, summaryData]); + }, [uniswapPools, borrowerRefs, summaryData]); const queryClient = useQueryClient(); const refetchBorrowers = useCallback(() => { diff --git a/shared/src/hooks/UseLendingPairs.ts b/shared/src/hooks/UseLendingPairs.ts index 9af45f50..b3d427b8 100644 --- a/shared/src/hooks/UseLendingPairs.ts +++ b/shared/src/hooks/UseLendingPairs.ts @@ -41,14 +41,19 @@ export function useLendingPairs(chainId: number) { strict: true, }); - const query = { + const refetchManually = { enabled: !isFetching, staleTime: Infinity, - refetchOnMount: 'always', + refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, } as const; + const refetchManuallyAndOnMount = { + ...refetchManually, + refetchOnMount: 'always', + } as const; + // Get fee tier of each Uniswap pool that has a market. Only refreshes when `logs` changes. const { data: feeData } = useReadContracts({ contracts: logs?.map( @@ -61,13 +66,7 @@ export function useLendingPairs(chainId: number) { } as const) ), allowFailure: false, - query: { - enabled: !isFetching, - staleTime: Infinity, - refetchOnMount: false, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - }, + query: refetchManually, }); // Get factory parameters for each market. Only refreshes on page load. @@ -81,7 +80,7 @@ export function useLendingPairs(chainId: number) { } as const) ), allowFailure: false, - query, + query: refetchManuallyAndOnMount, }); // Get instantaneous price and other oracle data for each market. Refreshes on page load and/or manually. @@ -107,7 +106,7 @@ export function useLendingPairs(chainId: number) { ]) .flat(), allowFailure: false, - query, + query: refetchManuallyAndOnMount, }); // Get main data for each market. Refreshes on page load and/or manually. @@ -131,7 +130,7 @@ export function useLendingPairs(chainId: number) { ) ?? []), ], allowFailure: false, - query, + query: refetchManuallyAndOnMount, }); const queryClient = useQueryClient(); diff --git a/shared/src/hooks/UseLocalStorage.ts b/shared/src/hooks/UseLocalStorage.ts index e5f12c91..7e86ed68 100644 --- a/shared/src/hooks/UseLocalStorage.ts +++ b/shared/src/hooks/UseLocalStorage.ts @@ -9,19 +9,19 @@ export default function useLocalStorage(key: string, initialValue: T) { const item = window.localStorage.getItem(key); return item ? JSON.parse(item) : initialValue; } catch (error) { - console.error(error); + console.error('Error retrieving value from local storage:', error); return initialValue; } }); - const setValue = (value: T | ((val: T) => T)) => { + const setValue = (valueOrOperator: T | ((x: T) => T)) => { try { - const valueToStore = value instanceof Function ? value(storedValue) : value; - setStoredValue(valueToStore); + const value = valueOrOperator instanceof Function ? valueOrOperator(storedValue) : valueOrOperator; + setStoredValue(value); if (typeof window !== 'undefined') { - window.localStorage.setItem(key, JSON.stringify(valueToStore)); + window.localStorage.setItem(key, JSON.stringify(value)); } } catch (error) { - console.error(error); + console.error('Error setting value in local storage:', error); } }; return [storedValue, setValue] as const; diff --git a/shared/src/hooks/UseUniswapPools.ts b/shared/src/hooks/UseUniswapPools.ts index 731f21b6..caf9d1bc 100644 --- a/shared/src/hooks/UseUniswapPools.ts +++ b/shared/src/hooks/UseUniswapPools.ts @@ -4,7 +4,7 @@ import { Token } from '../data/Token'; import { GetNumericFeeTier } from '../data/FeeTier'; import { Address } from 'viem'; -type UniswapPoolsMap = Map; +export type UniswapPoolsMap = Map; /** * Isolates Uniswap pool changes from other `lendingPairs` changes to prevent unnecessary renders/fetches. diff --git a/shared/src/util/Chains.ts b/shared/src/util/Chains.ts index 0b0fa87c..ee0f8341 100644 --- a/shared/src/util/Chains.ts +++ b/shared/src/util/Chains.ts @@ -6,6 +6,6 @@ import { DEFAULT_ETHERSCAN_URL } from '../data/constants/Values'; * @param chain the chain to get the Etherscan url for * @returns the Etherscan url for the given chain */ -export function getEtherscanUrlForChain(chain: Chain): string { +export function getBlockExplorerUrl(chain: Chain): string { return chain.blockExplorers?.default.url ?? DEFAULT_ETHERSCAN_URL; } From 0a98d47af4dbbbffbf0805e8e4c35d1a03328343 Mon Sep 17 00:00:00 2001 From: Hayden Shively <17186559+haydenshively@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:04:50 -0500 Subject: [PATCH 4/6] Move hooks from src/data/hooks to src/hooks --- .../src/components/advanced/BorrowMetrics.tsx | 2 +- .../components/advanced/SmartWalletButton.tsx | 2 +- .../TokenAllocationPieChartWidget.tsx | 2 +- .../advanced/TokenAllocationWidget.tsx | 2 +- .../advanced/UniswapPositionList.tsx | 2 +- .../advanced/modal/AddCollateralModal.tsx | 2 +- .../components/advanced/modal/BorrowModal.tsx | 2 +- .../advanced/modal/ClearWarningModal.tsx | 2 +- .../advanced/modal/ImportUniswapNFTModal.tsx | 2 +- .../advanced/modal/RemoveCollateralModal.tsx | 2 +- .../components/advanced/modal/RepayModal.tsx | 5 +- .../advanced/modal/WithdrawAnteModal.tsx | 2 +- .../modal/WithdrawUniswapNFTModal.tsx | 2 +- .../advanced/modal/tab/AddCollateralTab.tsx | 2 +- .../tab/AddUniswapNFTAsCollateralTab.tsx | 2 +- earn/src/components/boost/BurnBoostModal.tsx | 2 +- .../markets/borrow/BorrowingWidget.tsx | 2 +- .../markets/modal/UpdateBorrowerModal.tsx | 2 +- .../markets/modal/UpdateCollateralModal.tsx | 2 +- .../markets/modal/WithdrawModal.tsx | 2 +- .../content/AddCollateralModalContent.tsx | 2 +- .../modal/content/BorrowModalContent.tsx | 2 +- .../content/RemoveCollateralModalContent.tsx | 2 +- .../modal/content/RepayModalContent.tsx | 2 +- .../content/ToUniswapNFTModalContent.tsx | 2 +- .../portfolio/LendingPairPeerCard.tsx | 2 +- .../portfolio/modal/WithdrawModal.tsx | 2 +- earn/src/data/Uniboost.ts | 2 +- earn/src/{data => }/hooks/UseNumberOfUsers.ts | 0 .../src/{data => }/hooks/UseProminentColor.ts | 0 earn/src/{data => }/hooks/UseRedeem.ts | 0 .../hooks/useDeprecatedMarginAccountShim.ts | 0 earn/src/pages/AdvancedPage.tsx | 2 +- earn/src/pages/MarketsPage.tsx | 2 +- earn/src/util/Etherscan.ts | 54 ------------------- 35 files changed, 31 insertions(+), 86 deletions(-) rename earn/src/{data => }/hooks/UseNumberOfUsers.ts (100%) rename earn/src/{data => }/hooks/UseProminentColor.ts (100%) rename earn/src/{data => }/hooks/UseRedeem.ts (100%) rename earn/src/{data => }/hooks/useDeprecatedMarginAccountShim.ts (100%) delete mode 100644 earn/src/util/Etherscan.ts diff --git a/earn/src/components/advanced/BorrowMetrics.tsx b/earn/src/components/advanced/BorrowMetrics.tsx index d2c1d57d..9cfacd24 100644 --- a/earn/src/components/advanced/BorrowMetrics.tsx +++ b/earn/src/components/advanced/BorrowMetrics.tsx @@ -15,7 +15,7 @@ import styled from 'styled-components'; import { Address } from 'viem'; import { usePublicClient } from 'wagmi'; -import { BorrowerNftBorrower } from '../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../hooks/useDeprecatedMarginAccountShim'; const BORROW_TITLE_TEXT_COLOR = 'rgba(130, 160, 182, 1)'; const MAX_HEALTH = 10; diff --git a/earn/src/components/advanced/SmartWalletButton.tsx b/earn/src/components/advanced/SmartWalletButton.tsx index 2ee0bf96..81e31511 100644 --- a/earn/src/components/advanced/SmartWalletButton.tsx +++ b/earn/src/components/advanced/SmartWalletButton.tsx @@ -5,7 +5,7 @@ import { rgba } from 'shared/lib/util/Colors'; import styled from 'styled-components'; import { ReactComponent as PlusIcon } from '../../assets/svg/plus.svg'; -import useProminentColor from '../../data/hooks/UseProminentColor'; +import useProminentColor from '../../hooks/UseProminentColor'; const Container = styled.button.attrs( (props: { backgroundGradient: string; active: boolean; $animate: boolean }) => props diff --git a/earn/src/components/advanced/TokenAllocationPieChartWidget.tsx b/earn/src/components/advanced/TokenAllocationPieChartWidget.tsx index 0481ba5a..737dd4ac 100644 --- a/earn/src/components/advanced/TokenAllocationPieChartWidget.tsx +++ b/earn/src/components/advanced/TokenAllocationPieChartWidget.tsx @@ -9,7 +9,7 @@ import { rgb, rgba } from 'shared/lib/util/Colors'; import styled from 'styled-components'; import tw from 'twin.macro'; -import { BorrowerNftBorrower } from '../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../hooks/useDeprecatedMarginAccountShim'; // MARK: Capturing Mouse Data on container div --------------------------------------- diff --git a/earn/src/components/advanced/TokenAllocationWidget.tsx b/earn/src/components/advanced/TokenAllocationWidget.tsx index 2c6376ee..7f857e60 100644 --- a/earn/src/components/advanced/TokenAllocationWidget.tsx +++ b/earn/src/components/advanced/TokenAllocationWidget.tsx @@ -7,7 +7,7 @@ import styled from 'styled-components'; import TokenAllocationPieChartWidget from './TokenAllocationPieChartWidget'; import { ReactComponent as PieChartIcon } from '../../assets/svg/pie_chart.svg'; -import { BorrowerNftBorrower } from '../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../hooks/useDeprecatedMarginAccountShim'; const ACCENT_COLOR = 'rgba(130, 160, 182, 1)'; diff --git a/earn/src/components/advanced/UniswapPositionList.tsx b/earn/src/components/advanced/UniswapPositionList.tsx index c9e822e7..e1907dd1 100644 --- a/earn/src/components/advanced/UniswapPositionList.tsx +++ b/earn/src/components/advanced/UniswapPositionList.tsx @@ -17,7 +17,7 @@ import styled from 'styled-components'; import ImportUniswapNFTModal from './modal/ImportUniswapNFTModal'; import { WithdrawUniswapNFTModal } from './modal/WithdrawUniswapNFTModal'; -import { BorrowerNftBorrower } from '../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../hooks/useDeprecatedMarginAccountShim'; import TokenPairIcons from '../common/TokenPairIcons'; import { InRangeBadge, diff --git a/earn/src/components/advanced/modal/AddCollateralModal.tsx b/earn/src/components/advanced/modal/AddCollateralModal.tsx index 065f40d0..95d2606c 100644 --- a/earn/src/components/advanced/modal/AddCollateralModal.tsx +++ b/earn/src/components/advanced/modal/AddCollateralModal.tsx @@ -8,7 +8,7 @@ import { UniswapNFTPosition } from 'shared/lib/data/Uniswap'; import { AddCollateralTab } from './tab/AddCollateralTab'; import { AddUniswapNFTAsCollateralTab } from './tab/AddUniswapNFTAsCollateralTab'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/advanced/modal/BorrowModal.tsx b/earn/src/components/advanced/modal/BorrowModal.tsx index 13d62383..9f4311be 100644 --- a/earn/src/components/advanced/modal/BorrowModal.tsx +++ b/earn/src/components/advanced/modal/BorrowModal.tsx @@ -22,7 +22,7 @@ import styled from 'styled-components'; import { Address, encodeFunctionData, formatEther, WriteContractReturnType } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../common/HealthBar'; import TokenAmountSelectInput from '../../portfolio/TokenAmountSelectInput'; diff --git a/earn/src/components/advanced/modal/ClearWarningModal.tsx b/earn/src/components/advanced/modal/ClearWarningModal.tsx index 25730ed4..95f46b84 100644 --- a/earn/src/components/advanced/modal/ClearWarningModal.tsx +++ b/earn/src/components/advanced/modal/ClearWarningModal.tsx @@ -9,7 +9,7 @@ import useChain from 'shared/lib/hooks/UseChain'; import { formatEther } from 'viem'; import { useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; const SECONDARY_COLOR = '#CCDFED'; const TERTIARY_COLOR = '#4b6980'; diff --git a/earn/src/components/advanced/modal/ImportUniswapNFTModal.tsx b/earn/src/components/advanced/modal/ImportUniswapNFTModal.tsx index c00d9533..fee3f699 100644 --- a/earn/src/components/advanced/modal/ImportUniswapNFTModal.tsx +++ b/earn/src/components/advanced/modal/ImportUniswapNFTModal.tsx @@ -3,7 +3,7 @@ import Modal from 'shared/lib/components/common/Modal'; import { UniswapNFTPosition, UniswapPosition } from 'shared/lib/data/Uniswap'; import { AddUniswapNFTAsCollateralTab } from './tab/AddUniswapNFTAsCollateralTab'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; export type ImportUniswapNFTModalProps = { isOpen: boolean; diff --git a/earn/src/components/advanced/modal/RemoveCollateralModal.tsx b/earn/src/components/advanced/modal/RemoveCollateralModal.tsx index 37f86cf8..10f8634e 100644 --- a/earn/src/components/advanced/modal/RemoveCollateralModal.tsx +++ b/earn/src/components/advanced/modal/RemoveCollateralModal.tsx @@ -22,7 +22,7 @@ import { formatNumberInput, truncateDecimals } from 'shared/lib/util/Numbers'; import { Address, encodeFunctionData, formatUnits, Hex } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../common/HealthBar'; import TokenAmountSelectInput from '../../portfolio/TokenAmountSelectInput'; diff --git a/earn/src/components/advanced/modal/RepayModal.tsx b/earn/src/components/advanced/modal/RepayModal.tsx index 3feb1f09..0e1dfa4f 100644 --- a/earn/src/components/advanced/modal/RepayModal.tsx +++ b/earn/src/components/advanced/modal/RepayModal.tsx @@ -25,8 +25,7 @@ import styled from 'styled-components'; import { Address, Chain, encodeFunctionData, Hex } from 'viem'; import { useAccount, useBalance, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; -import { MarginAccount } from '../../../data/MarginAccount'; +import { BorrowerNftBorrower, MarginAccount } from '../../../hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../common/HealthBar'; import TokenAmountSelectInput from '../../portfolio/TokenAmountSelectInput'; @@ -236,7 +235,7 @@ function RepayButton(props: RepayButtonProps) { abi: borrowerAbi, functionName: 'repay', args: [amount0Big.toBigInt(), amount1Big.toBigInt()], - }) + }); const repayTokenBalance = borrower.assets[isToken0 ? 'amount0' : 'amount1']; diff --git a/earn/src/components/advanced/modal/WithdrawAnteModal.tsx b/earn/src/components/advanced/modal/WithdrawAnteModal.tsx index ae3f3b81..5d8f3d5d 100644 --- a/earn/src/components/advanced/modal/WithdrawAnteModal.tsx +++ b/earn/src/components/advanced/modal/WithdrawAnteModal.tsx @@ -14,7 +14,7 @@ import useChain from 'shared/lib/hooks/UseChain'; import { Address, Chain, encodeFunctionData } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; const SECONDARY_COLOR = '#CCDFED'; const TERTIARY_COLOR = '#4b6980'; diff --git a/earn/src/components/advanced/modal/WithdrawUniswapNFTModal.tsx b/earn/src/components/advanced/modal/WithdrawUniswapNFTModal.tsx index 889daada..df1c904e 100644 --- a/earn/src/components/advanced/modal/WithdrawUniswapNFTModal.tsx +++ b/earn/src/components/advanced/modal/WithdrawUniswapNFTModal.tsx @@ -26,7 +26,7 @@ import styled from 'styled-components'; import { Address, Hex } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; import TokenPairIcons from '../../common/TokenPairIcons'; import { InRangeBadge, OutOfRangeBadge } from '../../common/UniswapPositionCard'; diff --git a/earn/src/components/advanced/modal/tab/AddCollateralTab.tsx b/earn/src/components/advanced/modal/tab/AddCollateralTab.tsx index 26c85652..06e4c512 100644 --- a/earn/src/components/advanced/modal/tab/AddCollateralTab.tsx +++ b/earn/src/components/advanced/modal/tab/AddCollateralTab.tsx @@ -14,7 +14,7 @@ import useChain from 'shared/lib/hooks/UseChain'; import { formatNumberInput, truncateDecimals } from 'shared/lib/util/Numbers'; import { useAccount, useBalance, useSimulateContract, useWriteContract } from 'wagmi'; -import { MarginAccount } from '../../../../data/MarginAccount'; +import { MarginAccount } from '../../../../hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; import TokenAmountSelectInput from '../../../portfolio/TokenAmountSelectInput'; diff --git a/earn/src/components/advanced/modal/tab/AddUniswapNFTAsCollateralTab.tsx b/earn/src/components/advanced/modal/tab/AddUniswapNFTAsCollateralTab.tsx index 6735ccf7..aba1995c 100644 --- a/earn/src/components/advanced/modal/tab/AddUniswapNFTAsCollateralTab.tsx +++ b/earn/src/components/advanced/modal/tab/AddUniswapNFTAsCollateralTab.tsx @@ -21,7 +21,7 @@ import styled from 'styled-components'; import { Address, erc721Abi, Hex } from 'viem'; import { useAccount, usePublicClient, useReadContract, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../../hooks/useDeprecatedMarginAccountShim'; import TokenPairIcons from '../../../common/TokenPairIcons'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/boost/BurnBoostModal.tsx b/earn/src/components/boost/BurnBoostModal.tsx index 8b888eee..2818a44f 100644 --- a/earn/src/components/boost/BurnBoostModal.tsx +++ b/earn/src/components/boost/BurnBoostModal.tsx @@ -14,8 +14,8 @@ import useChain from 'shared/lib/hooks/UseChain'; import { Hex } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { MarginAccount } from '../../data/MarginAccount'; import { BoostCardInfo } from '../../data/Uniboost'; +import { MarginAccount } from '../../hooks/useDeprecatedMarginAccountShim'; import MaxSlippageInput from '../common/MaxSlippageInput'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/markets/borrow/BorrowingWidget.tsx b/earn/src/components/markets/borrow/BorrowingWidget.tsx index 4ba9dd86..ba5e09a7 100644 --- a/earn/src/components/markets/borrow/BorrowingWidget.tsx +++ b/earn/src/components/markets/borrow/BorrowingWidget.tsx @@ -21,7 +21,7 @@ import { Address, Chain } from 'viem'; import { Config, useClient } from 'wagmi'; import { ReactComponent as CheckIcon } from '../../../assets/svg/check.svg'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; import { useEthersProvider } from '../../../util/Provider'; import HealthGauge from '../../common/HealthGauge'; import BorrowModal from '../modal/BorrowModal'; diff --git a/earn/src/components/markets/modal/UpdateBorrowerModal.tsx b/earn/src/components/markets/modal/UpdateBorrowerModal.tsx index 125d9921..6626585d 100644 --- a/earn/src/components/markets/modal/UpdateBorrowerModal.tsx +++ b/earn/src/components/markets/modal/UpdateBorrowerModal.tsx @@ -10,7 +10,7 @@ import styled from 'styled-components'; import BorrowModalContent from './content/BorrowModalContent'; import RepayModalContent from './content/RepayModalContent'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; export enum ConfirmationType { BORROW = 'BORROW', diff --git a/earn/src/components/markets/modal/UpdateCollateralModal.tsx b/earn/src/components/markets/modal/UpdateCollateralModal.tsx index 7a1dbca0..acdd6b15 100644 --- a/earn/src/components/markets/modal/UpdateCollateralModal.tsx +++ b/earn/src/components/markets/modal/UpdateCollateralModal.tsx @@ -11,7 +11,7 @@ import styled from 'styled-components'; import AddCollateralModalContent from './content/AddCollateralModalContent'; import RemoveCollateralModalContent from './content/RemoveCollateralModalContent'; import ToUniswapNFTModalContent from './content/ToUniswapNFTModalContent'; -import { BorrowerNftBorrower } from '../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../hooks/useDeprecatedMarginAccountShim'; export enum ConfirmationType { DEPOSIT = 'DEPOSIT', diff --git a/earn/src/components/markets/modal/WithdrawModal.tsx b/earn/src/components/markets/modal/WithdrawModal.tsx index 74742626..4e4a5704 100644 --- a/earn/src/components/markets/modal/WithdrawModal.tsx +++ b/earn/src/components/markets/modal/WithdrawModal.tsx @@ -14,7 +14,7 @@ import { formatNumberInput } from 'shared/lib/util/Numbers'; import { Address } from 'viem'; import { useReadContract } from 'wagmi'; -import { RedeemState, useRedeem } from '../../../data/hooks/UseRedeem'; +import { RedeemState, useRedeem } from '../../../hooks/UseRedeem'; import { TokenIconsWithTooltip } from '../../common/TokenIconsWithTooltip'; import { SupplyTableRow } from '../supply/SupplyTable'; diff --git a/earn/src/components/markets/modal/content/AddCollateralModalContent.tsx b/earn/src/components/markets/modal/content/AddCollateralModalContent.tsx index c709013b..e864dc19 100644 --- a/earn/src/components/markets/modal/content/AddCollateralModalContent.tsx +++ b/earn/src/components/markets/modal/content/AddCollateralModalContent.tsx @@ -14,7 +14,7 @@ import { Token } from 'shared/lib/data/Token'; import useChain from 'shared/lib/hooks/UseChain'; import { useAccount, useBalance, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../../hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/markets/modal/content/BorrowModalContent.tsx b/earn/src/components/markets/modal/content/BorrowModalContent.tsx index bf2bed69..f0cb3062 100644 --- a/earn/src/components/markets/modal/content/BorrowModalContent.tsx +++ b/earn/src/components/markets/modal/content/BorrowModalContent.tsx @@ -23,7 +23,7 @@ import { formatNumberInput } from 'shared/lib/util/Numbers'; import { Address, formatEther, Hex } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../../hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/markets/modal/content/RemoveCollateralModalContent.tsx b/earn/src/components/markets/modal/content/RemoveCollateralModalContent.tsx index 658ea34c..5c5e36a8 100644 --- a/earn/src/components/markets/modal/content/RemoveCollateralModalContent.tsx +++ b/earn/src/components/markets/modal/content/RemoveCollateralModalContent.tsx @@ -22,7 +22,7 @@ import useChain from 'shared/lib/hooks/UseChain'; import { Address, encodeFunctionData, Hex } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../../hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/markets/modal/content/RepayModalContent.tsx b/earn/src/components/markets/modal/content/RepayModalContent.tsx index 079da602..cf789397 100644 --- a/earn/src/components/markets/modal/content/RepayModalContent.tsx +++ b/earn/src/components/markets/modal/content/RepayModalContent.tsx @@ -16,7 +16,7 @@ import { Permit2State, usePermit2 } from 'shared/lib/hooks/UsePermit2'; import { Address, Chain } from 'viem'; import { useAccount, useBalance, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../../hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/markets/modal/content/ToUniswapNFTModalContent.tsx b/earn/src/components/markets/modal/content/ToUniswapNFTModalContent.tsx index 49c53d6b..667a261d 100644 --- a/earn/src/components/markets/modal/content/ToUniswapNFTModalContent.tsx +++ b/earn/src/components/markets/modal/content/ToUniswapNFTModalContent.tsx @@ -17,7 +17,7 @@ import useChain from 'shared/lib/hooks/UseChain'; import { Hex } from 'viem'; import { useAccount, useSimulateContract, useWriteContract } from 'wagmi'; -import { BorrowerNftBorrower } from '../../../../data/hooks/useDeprecatedMarginAccountShim'; +import { BorrowerNftBorrower } from '../../../../hooks/useDeprecatedMarginAccountShim'; import HealthBar from '../../../common/HealthBar'; const SECONDARY_COLOR = '#CCDFED'; diff --git a/earn/src/components/portfolio/LendingPairPeerCard.tsx b/earn/src/components/portfolio/LendingPairPeerCard.tsx index 6b1d2c4f..b1ebe5ff 100644 --- a/earn/src/components/portfolio/LendingPairPeerCard.tsx +++ b/earn/src/components/portfolio/LendingPairPeerCard.tsx @@ -12,7 +12,7 @@ import { formatTokenAmount, roundPercentage } from 'shared/lib/util/Numbers'; import styled from 'styled-components'; import { Config, useClient } from 'wagmi'; -import useNumberOfUsers from '../../data/hooks/UseNumberOfUsers'; +import useNumberOfUsers from '../../hooks/UseNumberOfUsers'; import { useEthersProvider } from '../../util/Provider'; const Container = styled.div` diff --git a/earn/src/components/portfolio/modal/WithdrawModal.tsx b/earn/src/components/portfolio/modal/WithdrawModal.tsx index 2485f977..f21630c6 100644 --- a/earn/src/components/portfolio/modal/WithdrawModal.tsx +++ b/earn/src/components/portfolio/modal/WithdrawModal.tsx @@ -15,7 +15,7 @@ import { formatNumberInput, truncateDecimals } from 'shared/lib/util/Numbers'; import { zeroAddress } from 'viem'; import { useAccount } from 'wagmi'; -import { RedeemState, useRedeem } from '../../../data/hooks/UseRedeem'; +import { RedeemState, useRedeem } from '../../../hooks/UseRedeem'; import { TokenBalance } from '../../../pages/PortfolioPage'; import PairDropdown from '../../common/PairDropdown'; import TokenAmountSelectInput from '../TokenAmountSelectInput'; diff --git a/earn/src/data/Uniboost.ts b/earn/src/data/Uniboost.ts index 04c29bd2..810ef527 100644 --- a/earn/src/data/Uniboost.ts +++ b/earn/src/data/Uniboost.ts @@ -28,7 +28,7 @@ import { } from 'shared/lib/data/Uniswap'; import { Address, erc20Abi } from 'viem'; -import { MarginAccount } from './MarginAccount'; +import { MarginAccount } from '../hooks/useDeprecatedMarginAccountShim'; export enum BoostCardType { UNISWAP_NFT, diff --git a/earn/src/data/hooks/UseNumberOfUsers.ts b/earn/src/hooks/UseNumberOfUsers.ts similarity index 100% rename from earn/src/data/hooks/UseNumberOfUsers.ts rename to earn/src/hooks/UseNumberOfUsers.ts diff --git a/earn/src/data/hooks/UseProminentColor.ts b/earn/src/hooks/UseProminentColor.ts similarity index 100% rename from earn/src/data/hooks/UseProminentColor.ts rename to earn/src/hooks/UseProminentColor.ts diff --git a/earn/src/data/hooks/UseRedeem.ts b/earn/src/hooks/UseRedeem.ts similarity index 100% rename from earn/src/data/hooks/UseRedeem.ts rename to earn/src/hooks/UseRedeem.ts diff --git a/earn/src/data/hooks/useDeprecatedMarginAccountShim.ts b/earn/src/hooks/useDeprecatedMarginAccountShim.ts similarity index 100% rename from earn/src/data/hooks/useDeprecatedMarginAccountShim.ts rename to earn/src/hooks/useDeprecatedMarginAccountShim.ts diff --git a/earn/src/pages/AdvancedPage.tsx b/earn/src/pages/AdvancedPage.tsx index 732dcbc7..2dfffd15 100644 --- a/earn/src/pages/AdvancedPage.tsx +++ b/earn/src/pages/AdvancedPage.tsx @@ -36,7 +36,7 @@ import SmartWalletButton, { NewSmartWalletButton } from '../components/advanced/ import { TokenAllocationWidget } from '../components/advanced/TokenAllocationWidget'; import { UniswapPositionList } from '../components/advanced/UniswapPositionList'; import PendingTxnModal, { PendingTxnModalStatus } from '../components/common/PendingTxnModal'; -import { useDeprecatedMarginAccountShim } from '../data/hooks/useDeprecatedMarginAccountShim'; +import { useDeprecatedMarginAccountShim } from '../hooks/useDeprecatedMarginAccountShim'; import { useEthersProvider } from '../util/Provider'; const BORROW_TITLE_TEXT_COLOR = 'rgba(130, 160, 182, 1)'; diff --git a/earn/src/pages/MarketsPage.tsx b/earn/src/pages/MarketsPage.tsx index 0044fc5c..1e0c8d71 100644 --- a/earn/src/pages/MarketsPage.tsx +++ b/earn/src/pages/MarketsPage.tsx @@ -31,7 +31,7 @@ import BorrowingWidget from '../components/markets/borrow/BorrowingWidget'; import LiquidateTab from '../components/markets/liquidate/LiquidateTab'; import InfoTab from '../components/markets/monitor/InfoTab'; import SupplyTable, { SupplyTableRow } from '../components/markets/supply/SupplyTable'; -import { useDeprecatedMarginAccountShim } from '../data/hooks/useDeprecatedMarginAccountShim'; +import { useDeprecatedMarginAccountShim } from '../hooks/useDeprecatedMarginAccountShim'; const SECONDARY_COLOR = 'rgba(130, 160, 182, 1)'; const SELECTED_TAB_KEY = 'selectedTab'; diff --git a/earn/src/util/Etherscan.ts b/earn/src/util/Etherscan.ts deleted file mode 100644 index a484fb9c..00000000 --- a/earn/src/util/Etherscan.ts +++ /dev/null @@ -1,54 +0,0 @@ -import axios from 'axios'; -import { arbitrum, optimism, mainnet, goerli, base, linea, scroll } from 'viem/chains'; - -const ETHERSCAN_DOMAINS_BY_CHAIN_ID: { [chainId: number]: string } = { - [mainnet.id]: 'api.etherscan.io', - [goerli.id]: 'api-goerli.etherscan.io', - [optimism.id]: 'api-optimistic.etherscan.io', - [arbitrum.id]: 'api.arbiscan.io', - [base.id]: 'api.basescan.org', - [linea.id]: 'api.lineascan.build', - [scroll.id]: 'api.scrollscan.com', -}; - -const ETHERSCAN_API_KEYS: { [chainId: number]: string | undefined } = { - [mainnet.id]: process.env.REACT_APP_ETHERSCAN_API_KEY, - [goerli.id]: process.env.REACT_APP_ETHERSCAN_API_KEY, - [optimism.id]: process.env.REACT_APP_OPTIMISTIC_ETHERSCAN_API_KEY, - [arbitrum.id]: process.env.REACT_APP_ARBISCAN_API_KEY, - [base.id]: process.env.REACT_APP_BASESCAN_API_KEY, - [linea.id]: process.env.REACT_APP_LINEASCAN_API_KEY, - [scroll.id]: process.env.REACT_APP_SCROLLSCAN_API_KEY, -}; - -export function makeEtherscanRequest( - fromBlock: number, - address: string, - topics: (string | null)[], - shouldMatchAll: boolean, - chainId: number, - pageLength = 1000, - page?: number, - toBlock?: number -) { - const domain = ETHERSCAN_DOMAINS_BY_CHAIN_ID[chainId]; - let query = `https://${domain}/api?module=logs&action=getLogs`.concat( - `&fromBlock=${fromBlock.toFixed(0)}`, - toBlock ? `&toBlock=${toBlock.toFixed(0)}` : '&toBlock=latest', - `&address=${address}` - ); - - for (let i = 0; i < topics.length; i += 1) { - if (topics[i] === null) continue; - query += `&topic${i}=${topics[i]}`; - - if (i === topics.length - 1) break; - query += `&topic${i}_${i + 1}_opr=${shouldMatchAll ? 'and' : 'or'}`; - } - - if (page) query += `&page=${page}`; - query += `&offset=${pageLength}`; - if (ETHERSCAN_API_KEYS[chainId]) query += `&apikey=${ETHERSCAN_API_KEYS[chainId]}`; - - return axios.get(query); -} From 8fcadc82fc6149947a0cf0b7964ad7069a6d1179 Mon Sep 17 00:00:00 2001 From: Hayden Shively <17186559+haydenshively@users.noreply.github.com> Date: Mon, 3 Jun 2024 20:24:01 -0500 Subject: [PATCH 5/6] Create funding.json --- funding.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 funding.json diff --git a/funding.json b/funding.json new file mode 100644 index 00000000..80eab4c9 --- /dev/null +++ b/funding.json @@ -0,0 +1,5 @@ +{ + "opRetro": { + "projectId": "0x1f98babd3c820c63db75cc2644793dc2ecd5018e19334028f008e67e25fefe6b" + } +} From f25901e8d2f7746ad21e161e6d2372092bed77a3 Mon Sep 17 00:00:00 2001 From: Hayden Shively <17186559+haydenshively@users.noreply.github.com> Date: Wed, 5 Jun 2024 19:44:51 -0500 Subject: [PATCH 6/6] Enable Coinbase smart wallet in prod --- shared/src/components/WagmiConfig.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shared/src/components/WagmiConfig.tsx b/shared/src/components/WagmiConfig.tsx index cb1f97d7..ce767324 100644 --- a/shared/src/components/WagmiConfig.tsx +++ b/shared/src/components/WagmiConfig.tsx @@ -6,7 +6,6 @@ import { coinbaseWallet, injected, safe, walletConnect } from 'wagmi/connectors' import { ALL_CHAINS } from '../data/constants/ChainSpecific'; import { Transport } from 'viem'; import { DEFAULT_CHAIN } from '../data/constants/Values'; -import { isDevelopment } from '../util/Utils'; const transports: { [chainId: number]: Transport[] } = Object.fromEntries(ALL_CHAINS.map((c) => [c.id, []])); @@ -63,7 +62,7 @@ export const wagmiConfig = createConfig({ appName: metadata.name, // appLogoUrl: // TODO: do better than favicon chainId: DEFAULT_CHAIN.id, - preference: isDevelopment() ? 'all' : 'eoaOnly', + preference: 'all', }), safe(), ],