Hooks Principais
useAnyspendQuote
Obtenha informações de preços em tempo real para trocas de tokens e transações entre cadeias.
import { useAnyspendQuote } from "@b3dotfun/sdk/anyspend" ;
const {
anyspendQuote ,
isLoadingAnyspendQuote ,
getAnyspendQuoteError ,
refetchAnyspendQuote
} = useAnyspendQuote ( quoteRequest );
Parâmetros
Objeto de configuração de cotação
Interface QuoteRequest
interface QuoteRequest {
srcChain : number ; // ID da cadeia de origem
dstChain : number ; // ID da cadeia de destino
srcTokenAddress : string ; // Endereço do contrato do token de origem
dstTokenAddress : string ; // Endereço do contrato do token de destino
type : "swap" | "custom" ; // Tipo de ordem
tradeType : "EXACT_INPUT" | "EXACT_OUTPUT" ;
amount : string ; // Quantidade na menor unidade (wei)
}
Valores de Retorno
Dados da cotação com preços e taxas
Indicador de estado de carregamento
Objeto de erro se a cotação falhar
Função para atualizar manualmente a cotação
Exemplo de Uso
Componente de Cotação de Troca
function SwapQuote () {
const quoteRequest = {
srcChain: 1 , // Ethereum
dstChain: 8333 , // B3
srcTokenAddress: "0xA0b86a33E6Fb6Dd9a9B3d8B5FEb2b3C8e7D9Ff1E" , // USDC
dstTokenAddress: "0x0000000000000000000000000000000000000000" , // ETH
type: "swap" ,
tradeType: "EXACT_INPUT" ,
amount: "1000000" , // 1 USDC (6 decimais)
};
const { anyspendQuote , isLoadingAnyspendQuote , getAnyspendQuoteError } =
useAnyspendQuote ( quoteRequest );
if ( isLoadingAnyspendQuote ) return < div > Obtendo melhor preço... </ div > ;
if ( getAnyspendQuoteError ) return < div > Falha ao obter cotação </ div > ;
return (
< div >
< p > Você receberá: { anyspendQuote ?. expectedOutput } ETH </ p >
< p > Taxa de rede: $ { anyspendQuote ?. networkFeeUsd } </ p >
< p > Taxa de serviço: $ { anyspendQuote ?. serviceFeeUsd } </ p >
< p > Custo total: $ { anyspendQuote ?. totalUsdCost } </ p >
</ div >
);
}
useAnyspendCreateOrder
Crie e execute ordens AnySpend com tratamento de erro abrangente.
import { useAnyspendCreateOrder } from "@b3dotfun/sdk/anyspend" ;
const {
createOrder ,
isCreatingOrder ,
createOrderError
} = useAnyspendCreateOrder ( options );
Parâmetros
Objeto de configuração com funções de callback
Interface CreateOrderOptions
interface CreateOrderOptions {
onSuccess ?: ( data : OrderResponse ) => void ;
onError ?: ( error : Error ) => void ;
onSettled ?: () => void ;
}
Valores de Retorno
createOrder
(request: CreateOrderRequest) => void
Função para criar e executar uma ordem
Indicador de estado de criação da ordem
Objeto de erro se a criação da ordem falhar
Exemplo de Uso
function PaymentForm () {
const { createOrder , isCreatingOrder } = useAnyspendCreateOrder ({
onSuccess : ( data ) => {
console . log ( "Ordem criada:" , data . data . id );
// Redirecionar para pagamento ou mostrar sucesso
router . push ( `/payment/ ${ data . data . id } ` );
},
onError : ( error ) => {
console . error ( "Falha na ordem:" , error . message );
toast . error ( "Pagamento falhou. Por favor, tente novamente." );
},
});
const handlePayment = () => {
createOrder ({
recipientAddress: userWalletAddress ,
orderType: "swap" ,
srcChain: 1 ,
dstChain: 8333 ,
srcToken: {
chainId: 1 ,
address: "0xA0b86a33E6Fb6Dd9a9B3d8B5FEb2b3C8e7D9Ff1E" ,
name: "USD Coin" ,
symbol: "USDC" ,
decimals: 6 ,
},
dstToken: {
chainId: 8333 ,
address: "0x0000000000000000000000000000000000000000" ,
name: "Ether" ,
symbol: "ETH" ,
decimals: 18 ,
},
srcAmount: "1000000" , // 1 USDC
expectedDstAmount: "500000000000000000" , // ~0.5 ETH
creatorAddress: userWalletAddress ,
});
};
return (
< button
onClick = { handlePayment }
disabled = { isCreatingOrder }
>
{ isCreatingOrder ? "Processando..." : "Pagar com Cripto" }
</ button >
);
}
useAnyspendOrderAndTransactions
Monitore o status da ordem e rastreie as transações da blockchain associadas em tempo real.
import { useAnyspendOrderAndTransactions } from "@b3dotfun/sdk/anyspend" ;
const {
orderAndTransactions ,
isLoadingOrderAndTransactions ,
getOrderAndTransactionsError
} = useAnyspendOrderAndTransactions ( orderId );
Parâmetros
ID da ordem para rastrear e monitorar
Valores de Retorno
orderAndTransactions
OrderWithTransactions | null
Dados completos da ordem com detalhes da transação
isLoadingOrderAndTransactions
Indicador de estado de carregamento
getOrderAndTransactionsError
Objeto de erro se a busca falhar
Interface OrderWithTransactions
interface OrderWithTransactions {
data : {
order : Order ; // Detalhes e status da ordem
depositTxs : Transaction []; // Transações de depósito do usuário
relayTx ?: Transaction ; // Transação de relay entre cadeias
executeTx ?: Transaction ; // Transação de execução final
refundTxs : Transaction []; // Transações de reembolso (se houver)
};
}
Exemplo de Uso
function OrderTracker ({ orderId } : { orderId : string }) {
const { orderAndTransactions , isLoadingOrderAndTransactions } =
useAnyspendOrderAndTransactions ( orderId );
if ( isLoadingOrderAndTransactions ) {
return < div > Carregando status da ordem... </ div > ;
}
if ( ! orderAndTransactions ) {
return < div > Ordem não encontrada </ div > ;
}
const { order , depositTxs , executeTx , refundTxs } = orderAndTransactions . data ;
const getStatusMessage = ( status : string ) => {
switch ( status ) {
case "scanning_deposit_transaction" :
return "⏳ Aguardando confirmação do pagamento..." ;
case "relay" :
return "🔄 Processando transação entre cadeias..." ;
case "executed" :
return "✅ Transação concluída com sucesso!" ;
case "refunded" :
return "↩️ Reembolso processado" ;
default :
return "🔄 Processando..." ;
}
};
return (
< div className = "order-status" >
< h2 > Ordem # { orderId . slice ( 0 , 8 ) } </ h2 >
< p > { getStatusMessage ( order . status ) } </ p >
{ depositTxs . length > 0 && (
< div >
< h3 > Transação de Pagamento </ h3 >
< a
href = { `https://etherscan.io/tx/ ${ depositTxs [ 0 ]. txHash } ` }
target = "_blank"
rel = "noopener noreferrer"
>
Ver no Etherscan
</ a >
</ div >
) }
{ executeTx && (
< div >
< h3 > Transação de Execução </ h3 >
< a
href = { `https://explorer.b3.fun/tx/ ${ executeTx . txHash } ` }
target = "_blank"
rel = "noopener noreferrer"
>
Ver no Explorador B3
</ a >
</ div >
) }
{ order . errorDetails && (
< div className = "error" >
< strong > Erro: </ strong > { order . errorDetails }
</ div >
) }
</ div >
);
}
useAnyspendOrderHistory
Recupere o histórico de ordens paginado para um endereço de usuário.
import { useAnyspendOrderHistory } from "@b3dotfun/sdk/anyspend" ;
const {
orderHistory ,
isLoadingOrderHistory ,
getOrderHistoryError
} = useAnyspendOrderHistory ( creatorAddress , limit , offset );
Parâmetros
Endereço da carteira do usuário
Número de ordens para buscar (máximo 100)
Exemplo de Uso
Componente de Histórico de Ordens
function OrderHistory ({ userAddress } : { userAddress : string }) {
const [ page , setPage ] = useState ( 0 );
const pageSize = 10 ;
const { orderHistory , isLoadingOrderHistory } = useAnyspendOrderHistory (
userAddress ,
pageSize ,
page * pageSize
);
if ( isLoadingOrderHistory ) {
return < div > Carregando histórico de ordens... </ div > ;
}
return (
< div >
< h2 > Suas Ordens </ h2 >
{ orderHistory ?. data . map (( order ) => (
< div key = { order . id } className = "order-item" >
< p > Tipo: { order . type } </ p >
< p > Status: { order . status } </ p >
< p > Quantidade: { order . srcAmount } { order . srcToken . symbol } </ p >
< p > Data: {new Date ( order . createdAt ). toLocaleDateString () } </ p >
</ div >
)) }
< button
onClick = { () => setPage ( page - 1 ) }
disabled = { page === 0 }
>
Anterior
</ button >
< button
onClick = { () => setPage ( page + 1 ) }
disabled = { ! orderHistory ?. data || orderHistory . data . length < pageSize }
>
Próximo
</ button >
</ div >
);
}
Hooks Adicionais
useAnyspendTokens
Obtenha tokens disponíveis para uma cadeia específica.
const { tokens , isLoadingTokens } = useAnyspendTokens ( 1 , "USDC" );
useCoinbaseOnrampOptions
Obtenha a configuração de onramp da Coinbase para pagamentos em fiat.
const { coinbaseOptions , isLoadingCoinbaseOptions } = useCoinbaseOnrampOptions ();
useStripeClientSecret
Obtenha a intenção de pagamento do Stripe para pagamentos com cartão de crédito.
const { clientSecret , isLoadingClientSecret } = useStripeClientSecret ( orderData );
Padrões de Hook
Padrão de Tratamento de Erros
function PaymentComponent () {
const { createOrder , isCreatingOrder } = useAnyspendCreateOrder ({
onError : ( error ) => {
// Registrar erro para depuração
console . error ( "Pagamento falhou:" , error );
// Mostrar mensagem amigável ao usuário
switch ( error . message ) {
case "INSUFFICIENT_BALANCE" :
toast . error ( "Saldo insuficiente. Por favor, adicione fundos." );
break ;
case "SLIPPAGE" :
toast . error ( "Movimento de preço desfavorável. Por favor, tente novamente." );
break ;
default :
toast . error ( "Pagamento falhou. Por favor, tente novamente." );
}
},
});
// Implementação do componente...
}
Padrão de Estado de Carregamento
function SwapInterface () {
const { anyspendQuote , isLoadingAnyspendQuote } = useAnyspendQuote ( quoteRequest );
const { createOrder , isCreatingOrder } = useAnyspendCreateOrder ();
const isLoading = isLoadingAnyspendQuote || isCreatingOrder ;
return (
< div >
{ isLoading && < LoadingSpinner /> }
{ /* Resto do componente */ }
</ div >
);
}
Padrão de Atualizações em Tempo Real
Atualizações em Tempo Real
function OrderStatus ({ orderId } : { orderId : string }) {
const { orderAndTransactions } = useAnyspendOrderAndTransactions ( orderId );
// Auto-atualização a cada 5 segundos para ordens pendentes
useEffect (() => {
if ( orderAndTransactions ?. data . order . status === "relay" ) {
const interval = setInterval (() => {
// A atualização é tratada automaticamente pelo hook
}, 5000 );
return () => clearInterval ( interval );
}
}, [ orderAndTransactions ?. data . order . status ]);
// Implementação do componente...
}
Próximos Passos