11import { useProjectAccessKey } from '@0xsequence/connect'
2- import { useIndexerClient , useConfig } from '@0xsequence/hooks'
32import { 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'
64import { TransactionStatus } from '@0xsequence/indexer'
5+ import { ContractInfo , TokenMetadata } from '@0xsequence/metadata'
6+ import { findSupportedNetwork } from '@0xsequence/network'
77import pako from 'pako'
88import React , { useEffect } from 'react'
99import { Hex , formatUnits , zeroAddress } from 'viem'
1010import { usePublicClient } from 'wagmi'
1111
1212import { fetchSardineOrderStatus } from '../../api'
13- import { Collectible , CreditCardProviders } from '../../contexts/SelectPaymentModal '
13+ import { useEnvironmentContext } from '../../contexts'
1414import { TransakConfig } from '../../contexts/CheckoutModal'
15+ import { Collectible , CreditCardProviders } from '../../contexts/SelectPaymentModal'
1516import { TRANSAK_PROXY_ADDRESS } from '../../utils/transak'
16- import { useEnvironmentContext } from '../../contexts'
1717import { useSardineClientToken } from '../useSardineClientToken'
1818
1919const 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' ) )
0 commit comments