UNPKG

@coin-voyage/paykit

Version:

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

56 lines 2.46 kB
import { usePrepareTransaction } from "@coin-voyage/crypto/hooks"; import { assert } from "@coin-voyage/shared/common"; import { useBackendApi } from "../components/contexts/api"; export function usePayWithToken({ senderAddr, payOrder, setPayOrder, chainType, log, }) { const api = useBackendApi(); const actions = usePrepareTransaction(chainType); /** Commit to a currency + amount = initiate payment. */ const payWithToken = async (currency) => { assert(payOrder != undefined, "PayOrder is required for payment"); assert(senderAddr != undefined, "Sender address is required for payment"); assert(actions != undefined, "Transaction actions must be defined"); const paymentDetails = await api.payOrderPaymentDetails({ payorder_id: payOrder.id, token_address: currency?.address ?? undefined, chain_id: currency.chain_id, refund_address: senderAddr, }); if (!paymentDetails || paymentDetails.payorder_id != payOrder.id) { throw new Error(`[CHECKOUT] unable to generate a final quote for ${payOrder.id}`); } log(`[CHECKOUT] Final Quote for PayOrder: ${JSON.stringify(paymentDetails)}, checking out with ${currency?.address}`); const paymentData = paymentDetails.data; const updatedPayOrder = { ...payOrder, payment: paymentData, status: paymentDetails.status, }; try { const txHash = await actions.execute({ amount: 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 }); updatedPayOrder.deposit_tx_hash = txHash; log(`[CHECKOUT] Transaction hash: ${txHash}`); return txHash; } catch (e) { if (e.message?.includes("rejected")) { return undefined; } log(`[CHECKOUT] Error sending token: ${e}`); throw e; } finally { setPayOrder(updatedPayOrder); } }; return { payWithToken }; } //# sourceMappingURL=usePayWithToken.js.map