@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
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 != 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