UNPKG

@coin-voyage/paykit

Version:

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

57 lines 2.34 kB
import { usePrepareTransaction } from "@coin-voyage/crypto/hooks"; import { payOrderPaymentDetails, processPayOrder } from "@coin-voyage/shared/api"; import { assert } from "@coin-voyage/shared/common"; export function usePayWithToken({ senderAddr, payOrder, setPayOrder, chainType, log, apiKey, }) { const actions = usePrepareTransaction(chainType); /** Commit to a currency + amount = initiate payment. */ const payWithToken = async (currency) => { assert(!!payOrder); assert(!!senderAddr); assert(!!actions); const paymentDetails = await payOrderPaymentDetails({ payOrderId: payOrder.id, outTokenAddress: currency?.address ?? undefined, outChainId: currency.chain_id, refundAddress: senderAddr, apiKey }); 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 updatedPayOrder = { ...payOrder, deposit_address: paymentDetails.deposit_address, status: paymentDetails.status, expires_at: paymentDetails.expires_at, refund_address: paymentDetails.refund_address, source_currency: paymentDetails.source_currency, source_amount: paymentDetails.source_amount, }; try { const txHash = await actions.execute(paymentDetails); updatedPayOrder.deposit_tx_hash = txHash; if (txHash) { await processPayOrder({ payOrderId: payOrder.id, sourceTransactionHash: txHash, apiKey }); } 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