Skip to content

Commit 05e00fa

Browse files
committed
wait for transaction confirmation before triggering onSuccess with sardine
1 parent d49bd82 commit 05e00fa

File tree

3 files changed

+32
-15
lines changed

3 files changed

+32
-15
lines changed

packages/checkout/src/hooks/useCheckoutUI/index.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { useGetTokenMetadata, useGetContractInfo } from '@0xsequence/hooks'
22
import { findSupportedNetwork } from '@0xsequence/network'
3-
43
import React from 'react'
54
import { Hex } from 'viem'
65

7-
import { useOrderSummary, type UseOrderSummaryArgs, type UseOrderSummaryReturn } from './useOrderSummary'
8-
import { useCreditCardPayment, type UseCreditCardPaymentArgs, type UseCreditCardPaymentReturn } from './useCreditCardPayment'
9-
import { Collectible, CreditCardProviders } from '../../contexts/SelectPaymentModal'
106
import { TransakConfig } from '../../contexts/CheckoutModal'
7+
import { Collectible, CreditCardProviders } from '../../contexts/SelectPaymentModal'
8+
9+
import { useCreditCardPayment, type UseCreditCardPaymentArgs, type UseCreditCardPaymentReturn } from './useCreditCardPayment'
10+
import { useOrderSummary, type UseOrderSummaryArgs, type UseOrderSummaryReturn } from './useOrderSummary'
1111
// crypto payment
1212

1313
// credit card payment

packages/checkout/src/hooks/useCheckoutUI/useCreditCardPayment.tsx

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import { useProjectAccessKey } from '@0xsequence/connect'
2-
import { useIndexerClient, useConfig } from '@0xsequence/hooks'
32
import { compareAddress, waitForTransactionReceipt, TRANSACTION_CONFIRMATIONS_DEFAULT } from '@0xsequence/connect'
4-
import { findSupportedNetwork } from '@0xsequence/network'
5-
import { ContractInfo, TokenMetadata } from '@0xsequence/metadata'
3+
import { useIndexerClient, useConfig } from '@0xsequence/hooks'
64
import { TransactionStatus } from '@0xsequence/indexer'
5+
import { ContractInfo, TokenMetadata } from '@0xsequence/metadata'
6+
import { findSupportedNetwork } from '@0xsequence/network'
77
import pako from 'pako'
88
import React, { useEffect } from 'react'
99
import { Hex, formatUnits, zeroAddress } from 'viem'
1010
import { usePublicClient } from 'wagmi'
1111

1212
import { fetchSardineOrderStatus } from '../../api'
13-
import { Collectible, CreditCardProviders } from '../../contexts/SelectPaymentModal'
13+
import { useEnvironmentContext } from '../../contexts'
1414
import { TransakConfig } from '../../contexts/CheckoutModal'
15+
import { Collectible, CreditCardProviders } from '../../contexts/SelectPaymentModal'
1516
import { TRANSAK_PROXY_ADDRESS } from '../../utils/transak'
16-
import { useEnvironmentContext } from '../../contexts'
1717
import { useSardineClientToken } from '../useSardineClientToken'
1818

1919
const POLLING_TIME = 10 * 1000
@@ -88,7 +88,7 @@ export const useCreditCardPayment =
8888
const { env } = useConfig()
8989
const disableSardineClientTokenFetch =
9090
isLoadingTokenMetadatas || isLoadingCurrencyInfo || isLoadingCollectionInfo || creditCardProvider !== 'sardine'
91-
const { transakApiUrl, sardineApiUrl: sardineProxyUrl } = useEnvironmentContext()
91+
const { transakApiUrl, sardineCheckoutUrl: sardineProxyUrl } = useEnvironmentContext()
9292
const network = findSupportedNetwork(chain)
9393
const error = errorCollectionInfo || errorTokenMetadata || errorCurrencyInfo
9494
const isLoading = isLoadingCollectionInfo || isLoadingTokenMetadatas || isLoadingCurrencyInfo
@@ -334,12 +334,18 @@ interface SardineEventListenerProps {
334334
orderId: string
335335
}
336336

337-
const SardineEventListener = ({ onSuccess, onError, chainId, orderId }: SardineEventListenerProps) => {
337+
const SardineEventListener = ({ onSuccess, onError, chainId, orderId, transactionConfirmations }: SardineEventListenerProps) => {
338338
const { env } = useConfig()
339339
const projectAccessKey = useProjectAccessKey()
340+
const indexerClient = useIndexerClient(chainId)
341+
const publicClient = usePublicClient({ chainId })
340342

341343
const pollForOrderStatus = async () => {
342344
try {
345+
if (!indexerClient || !publicClient) {
346+
onError?.(new Error('Indexer or public client not available'))
347+
return
348+
}
343349
console.log('Polling for transaction status')
344350
const pollResponse = await fetchSardineOrderStatus(orderId, projectAccessKey, env.apiUrl)
345351
const status = pollResponse.resp.status
@@ -348,7 +354,18 @@ const SardineEventListener = ({ onSuccess, onError, chainId, orderId }: SardineE
348354
console.log('transaction status poll response:', status)
349355

350356
if (status === 'Complete') {
351-
onSuccess?.(transactionHash)
357+
const { txnStatus } = await waitForTransactionReceipt({
358+
txnHash: transactionHash,
359+
indexerClient,
360+
publicClient,
361+
confirmations: transactionConfirmations
362+
})
363+
364+
if (txnStatus === TransactionStatus.FAILED) {
365+
onError?.(new Error('Sardine transaction failed'))
366+
} else {
367+
onSuccess?.(transactionHash)
368+
}
352369
}
353370
if (status === 'Declined' || status === 'Cancelled') {
354371
onError?.(new Error('Failed to transfer collectible'))

packages/checkout/src/hooks/useCheckoutUI/useOrderSummary.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { ContractInfo, TokenMetadata } from '@0xsequence/metadata'
2-
import { networkImageUrl } from '@0xsequence/design-system'
3-
import { findSupportedNetwork } from '@0xsequence/network'
41
import { compareAddress, formatDisplay, NetworkBadge } from '@0xsequence/connect'
2+
import { networkImageUrl } from '@0xsequence/design-system'
53
import { useGetCoinPrices } from '@0xsequence/hooks'
4+
import { ContractInfo, TokenMetadata } from '@0xsequence/metadata'
5+
import { findSupportedNetwork } from '@0xsequence/network'
66
import { ReactNode } from 'react'
77
import { formatUnits, zeroAddress } from 'viem'
88

0 commit comments

Comments
 (0)