UNPKG

@coin-voyage/paykit

Version:

Seamless crypto payments. Onboard users from any chain, any coin into your app with one click.

53 lines (52 loc) 2.33 kB
import { usePrepareTransaction } from "@coin-voyage/crypto/hooks"; import { assert } from "@coin-voyage/shared/common"; import { useBackendApi } from "../components/contexts/api"; import { fetchPaymentDetails } from "../lib/api/payment-details"; export function usePayFromWallet({ senderAddr, payOrder, setPayOrder, chainType, log }) { const actions = usePrepareTransaction(chainType); const api = useBackendApi(); const payFromWallet = async (currency) => { assert(payOrder != undefined, "PayOrder is required"); assert(senderAddr != undefined, "Sender address is required"); assert(actions != undefined, "Transaction actions must be defined"); const params = currency.quoteId ? { payorder_id: payOrder.id, quote_id: currency.quoteId } : { payorder_id: payOrder.id, source_currency: { address: currency.address, chain_id: currency.chain_id, }, refund_address: senderAddr, }; const paymentDetails = await fetchPaymentDetails(api, params, payOrder); const paymentData = paymentDetails.data; log(`[PAY-WITH-TOKEN] Final Quote for Order: ${JSON.stringify(paymentDetails)}, params: ${JSON.stringify(params)}`); try { const txHash = await actions.execute({ amount: BigInt(paymentData.src.currency_amount.raw_amount), fromAddress: senderAddr, toAddress: paymentData.deposit_address, chainId: paymentData.src.chain_id, token: paymentData.src.address ? { address: paymentData.src.address, decimals: paymentData.src.decimals } : undefined, }); setPayOrder({ ...payOrder, deposit_tx_hash: txHash, payment: paymentData, status: paymentDetails.status, }); log(`[PAY-WITH-TOKEN] Transaction hash: ${txHash}`); return txHash; } catch (e) { if (e.message?.includes("rejected")) return undefined; log(`[PAY-WITH-TOKEN] Error sending token: ${e}`); throw e; } }; return { payFromWallet }; }