@coin-voyage/paykit
Version:
Seamless crypto payments. Onboard users from any chain, any coin into your app with one click.
62 lines • 2.68 kB
JavaScript
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);
assert(!!senderAddr);
assert(!!actions);
const paymentDetails = await api.payOrderPaymentDetails({
payOrderId: payOrder.id,
outTokenAddress: currency?.address ?? undefined,
outChainId: currency.chain_id,
refundAddress: 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 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({
amount: paymentDetails.source_amount.raw_amount,
fromAddress: senderAddr,
toAddress: paymentDetails.deposit_address,
chainId: paymentDetails.source_currency.chain_id,
token: paymentDetails.source_currency.address ? {
address: paymentDetails.source_currency.address,
decimals: paymentDetails.source_currency.decimals,
} : undefined
});
updatedPayOrder.deposit_tx_hash = txHash;
if (txHash) {
await api.processPayOrder(payOrder.id, 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