@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
JavaScript
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