Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ export const useCryptoPayment = ({

const isApproved: boolean = (allowanceData as bigint) >= BigInt(totalPriceRaw) || isNativeCurrency

const { data: currencyBalanceData, isLoading: currencyBalanceIsLoading } = useGetTokenBalancesSummary({
const { data: currencyBalanceDataPaginated, isLoading: currencyBalanceIsLoading } = useGetTokenBalancesSummary({
chainIds: [chainId],
filter: {
accountAddresses: userAddress ? [userAddress] : [],
Expand All @@ -113,6 +113,8 @@ export const useCryptoPayment = ({
omitMetadata: true
})

const currencyBalanceData = currencyBalanceDataPaginated?.pages?.flatMap(page => page.balances)

const buyCurrencyAddress = currencyAddress
const sellCurrencyAddress = selectedCurrencyAddress || ''

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ interface OrderSummaryItem {
}

export const OrderSummaryItem = ({ contractAddress, tokenId, quantityRaw, chainId }: OrderSummaryItem) => {
const { data: tokenMetadata, isPending: isPendingTokenMetadata } = useGetTokenMetadata({
const { data: tokenMetadata, isLoading: isLoadingTokenMetadata } = useGetTokenMetadata({
chainID: String(chainId),
contractAddress,
tokenIDs: [tokenId]
})
const { data: contractInfo, isPending: isPendingContractInfo } = useGetContractInfo({
const { data: contractInfo, isLoading: isLoadingContractInfo } = useGetContractInfo({
chainID: String(chainId),
contractAddress
})
const isPending = isPendingTokenMetadata || isPendingContractInfo
const isLoading = isLoadingTokenMetadata || isLoadingContractInfo

if (isPending) {
if (isLoading) {
return <OrderSummarySkeleton />
}

Expand Down
36 changes: 25 additions & 11 deletions packages/checkout/src/views/CheckoutSelection/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
TokenImage
} from '@0xsequence/design-system'
import { useGetTokenBalancesSummary, useGetContractInfo } from '@0xsequence/hooks'
import { useEffect } from 'react'
import { zeroAddress, formatUnits } from 'viem'
import { useAccount, useConfig } from 'wagmi'

Expand All @@ -30,31 +31,44 @@ export const CheckoutSelection = () => {
const displayCreditCardCheckout = !!creditCardCheckoutSettings
const displayCryptoCheckout = !!cryptoCheckoutSettings

const { data: contractInfoData, isLoading: isPendingContractInfo } = useGetContractInfo({
const { data: contractInfoData, isLoading: isLoadingContractInfo } = useGetContractInfo({
chainID: String(cryptoCheckoutSettings?.chainId || 1),
contractAddress: cryptoCheckoutSettings?.coinQuantity?.contractAddress || ''
})

const { data: balancesData, isPending: isPendingBalances } = useGetTokenBalancesSummary({
const {
data: balancesData,
isLoading: isLoadingBalances,
fetchNextPage: fetchNextBalances,
hasNextPage: hasNextPageBalances,
isFetchingNextPage: isFetchingNextPageBalances
} = useGetTokenBalancesSummary({
chainIds: [cryptoCheckoutSettings?.chainId || 1],
filter: {
accountAddresses: accountAddress ? [accountAddress] : [],
contractStatus: ContractVerificationStatus.ALL,
omitNativeBalances: false
}
},
page: { pageSize: 40 }
})

const isPending = (isPendingContractInfo || isPendingBalances) && cryptoCheckoutSettings
useEffect(() => {
if (hasNextPageBalances && !isFetchingNextPageBalances) {
fetchNextBalances()
}
}, [hasNextPageBalances, isFetchingNextPageBalances])

const isLoading = (isLoadingContractInfo || isLoadingBalances || isFetchingNextPageBalances) && cryptoCheckoutSettings

const isNativeToken = compareAddress(cryptoCheckoutSettings?.coinQuantity?.contractAddress || '', zeroAddress)
const nativeTokenInfo = getNativeTokenInfoByChainId(cryptoCheckoutSettings?.chainId || 1, chains)

const coinDecimals = isNativeToken ? nativeTokenInfo.decimals : contractInfoData?.decimals || 0
const coinSymbol = isNativeToken ? nativeTokenInfo.symbol : contractInfoData?.symbol || 'COIN'
const coinImageUrl = isNativeToken ? nativeTokenInfo.logoURI : contractInfoData?.logoURI || ''
const coinBalance = balancesData?.find(balance =>
compareAddress(balance.contractAddress, cryptoCheckoutSettings?.coinQuantity?.contractAddress || '')
)
const coinBalance = balancesData?.pages
?.flatMap(page => page.balances)
.find(balance => compareAddress(balance.contractAddress, cryptoCheckoutSettings?.coinQuantity?.contractAddress || ''))
const userBalanceRaw = coinBalance ? coinBalance.balance : '0'
const requestedAmountRaw = cryptoCheckoutSettings?.coinQuantity?.amountRequiredRaw || '0'
const userBalance = formatUnits(BigInt(userBalanceRaw), coinDecimals)
Expand Down Expand Up @@ -142,7 +156,7 @@ export const CheckoutSelection = () => {
<Text variant="normal" color="muted">
Total
</Text>
{isPending ? (
{isLoading ? (
<Skeleton style={{ width: '100px', height: '17px' }} />
) : (
<div className="flex flex-row gap-1 items-center">
Expand All @@ -165,7 +179,7 @@ export const CheckoutSelection = () => {
onClick={onClickPayWithCard}
/>
)}
{displayCryptoCheckout && !isInsufficientBalance && !isPending && (
{displayCryptoCheckout && !isInsufficientBalance && !isLoading && (
<Button
className="w-full h-14 rounded-xl"
leftIcon={() => <TokenImage src={coinImageUrl} size="sm" />}
Expand All @@ -175,7 +189,7 @@ export const CheckoutSelection = () => {
onClick={onClickPayWithCrypto}
/>
)}
{displayCryptoCheckout && (isInsufficientBalance || isPending) && (
{displayCryptoCheckout && (isInsufficientBalance || isLoading) && (
<Button
className="w-full"
shape="square"
Expand All @@ -193,7 +207,7 @@ export const CheckoutSelection = () => {
</div>
{displayCryptoCheckout && (
<div className="flex w-full justify-end">
{isPending ? (
{isLoading ? (
<Skeleton style={{ width: '102px', height: '14px' }} />
) : (
<Text variant="small" fontWeight="bold" color="muted">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,30 @@ export const PayWithCrypto = ({
const network = findSupportedNetwork(chain)
const chainId = network?.chainId || 137

const { data: currencyBalanceData, isLoading: currencyBalanceIsLoading } = useGetTokenBalancesSummary({
const {
data: currencyBalanceData,
isLoading: currencyBalanceIsLoading,
fetchNextPage: fetchNextCurrencyBalance,
hasNextPage: hasNextCurrencyBalance,
isFetchingNextPage: isFetchingNextCurrencyBalance
} = useGetTokenBalancesSummary({
chainIds: [chainId],
filter: {
accountAddresses: userAddress ? [userAddress] : [],
contractStatus: ContractVerificationStatus.ALL,
contractWhitelist: [currencyAddress],
omitNativeBalances: skipNativeBalanceCheck ?? false
},
omitMetadata: true
omitMetadata: true,
page: { pageSize: 40 }
})

useEffect(() => {
if (hasNextCurrencyBalance && !isFetchingNextCurrencyBalance) {
fetchNextCurrencyBalance()
}
}, [hasNextCurrencyBalance, isFetchingNextCurrencyBalance])

const { data: currencyInfoData, isLoading: isLoadingCurrencyInfo } = useGetContractInfo({
chainID: String(chainId),
contractAddress: currencyAddress
Expand All @@ -64,7 +77,7 @@ export const PayWithCrypto = ({
{ disabled: !enableSwapPayments }
)

const isLoadingOptions = currencyBalanceIsLoading || isLoadingCurrencyInfo || isLoading
const isLoadingOptions = currencyBalanceIsLoading || isFetchingNextCurrencyBalance || isLoadingCurrencyInfo || isLoading

const swapsIsLoading = swapPricesIsLoading

Expand Down Expand Up @@ -114,7 +127,9 @@ export const PayWithCrypto = ({
significantDigits: 6
})

const balanceInfo = currencyBalanceData?.find(balanceData => compareAddress(currencyAddress, balanceData.contractAddress))
const balanceInfo = currencyBalanceData?.pages
?.flatMap(page => page.balances)
.find(balanceData => compareAddress(currencyAddress, balanceData.contractAddress))

const balance: bigint = BigInt(balanceInfo?.balance || '0')
// let balanceFormatted = Number(formatUnits(balance, currencyInfoData?.decimals || 0))
Expand Down
31 changes: 3 additions & 28 deletions packages/checkout/src/views/PaymentSelection/index.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
import {
useAnalyticsContext,
compareAddress,
TRANSACTION_CONFIRMATIONS_DEFAULT,
sendTransactions,
ContractVerificationStatus
} from '@0xsequence/connect'
import { useAnalyticsContext, compareAddress, TRANSACTION_CONFIRMATIONS_DEFAULT, sendTransactions } from '@0xsequence/connect'
import { Button, Divider, Text, Spinner } from '@0xsequence/design-system'
import {
useClearCachedBalances,
useGetTokenBalancesSummary,
useGetContractInfo,
SwapPricesWithCurrencyInfo,
useGetSwapPrices,
Expand Down Expand Up @@ -72,8 +65,7 @@ export const PaymentSelectionContent = () => {
onSuccess = () => {},
onError = () => {},
onClose = () => {},
supplementaryAnalyticsInfo,
skipNativeBalanceCheck
supplementaryAnalyticsInfo
} = selectPaymentSettings

const isNativeToken = compareAddress(currencyAddress, zeroAddress)
Expand Down Expand Up @@ -104,18 +96,6 @@ export const PaymentSelectionContent = () => {
}
})

const { data: _currencyBalanceData, isLoading: currencyBalanceIsLoading } = useGetTokenBalancesSummary({
chainIds: [chainId],
filter: {
accountAddresses: userAddress ? [userAddress] : [],
contractStatus: ContractVerificationStatus.ALL,
contractWhitelist: [currencyAddress],
omitNativeBalances: skipNativeBalanceCheck ?? false
},
// omitMetadata must be true to avoid a bug
omitMetadata: true
})

const { data: _currencyInfoData, isLoading: isLoadingCurrencyInfo } = useGetContractInfo({
chainID: String(chainId),
contractAddress: currencyAddress
Expand Down Expand Up @@ -151,15 +131,10 @@ export const PaymentSelectionContent = () => {
}
)

const isLoading = (allowanceIsLoading && !isNativeToken) || currencyBalanceIsLoading || isLoadingCurrencyInfo
const isLoading = (allowanceIsLoading && !isNativeToken) || isLoadingCurrencyInfo

const isApproved: boolean = (allowanceData as bigint) >= BigInt(price) || isNativeToken

// const balanceInfo = currencyBalanceData?.find(balanceData => compareAddress(currencyAddress, balanceData.contractAddress))
// const balance: bigint = BigInt(balanceInfo?.balance || '0')
// let balanceFormatted = Number(formatUnits(balance, currencyInfoData?.decimals || 0))
// balanceFormatted = Math.trunc(Number(balanceFormatted) * 10000) / 10000

useEffect(() => {
clearCachedBalances()
}, [])
Expand Down
17 changes: 6 additions & 11 deletions packages/connect/src/components/TxnDetails/TxnDetails.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { commons } from '@0xsequence/core'
import { Card, GradientAvatar, Skeleton, Text, TokenImage } from '@0xsequence/design-system'
import { useAPIClient, useGetTokenBalancesSummary, useGetTokenMetadata } from '@0xsequence/hooks'
import { ContractType, ContractVerificationStatus } from '@0xsequence/indexer'
import { useAPIClient, useGetSingleTokenBalance, useGetTokenMetadata } from '@0xsequence/hooks'
import { ContractType } from '@0xsequence/indexer'
import { useEffect, useState } from 'react'
import { formatUnits, zeroAddress } from 'viem'
import { useConfig } from 'wagmi'
Expand Down Expand Up @@ -93,14 +93,10 @@ const TransferItemInfo = ({ address, transferProps, chainId }: TransferItemInfoP
const isNFT = transferProps.contractType === ContractType.ERC1155 || transferProps.contractType === ContractType.ERC721
const nativeTokenInfo = getNativeTokenInfoByChainId(chainId, chains)

const { data: balances = [] } = useGetTokenBalancesSummary({
chainIds: [chainId],
filter: {
accountAddresses: [address],
contractStatus: ContractVerificationStatus.ALL,
contractWhitelist: [contractAddress],
omitNativeBalances: false
}
const { data: tokenBalance } = useGetSingleTokenBalance({
chainId,
contractAddress,
accountAddress: address
})

const { data: tokenMetadata } = useGetTokenMetadata({
Expand All @@ -109,7 +105,6 @@ const TransferItemInfo = ({ address, transferProps, chainId }: TransferItemInfoP
tokenIDs: transferProps.tokenIds ?? []
})

const tokenBalance = contractAddress ? balances.find(b => compareAddress(b.contractAddress, contractAddress)) : undefined
const decimals = isNativeCoin ? nativeTokenInfo.decimals : tokenBalance?.contractInfo?.decimals || 18

const imageUrl = isNativeCoin
Expand Down
Loading