@coin-voyage/paykit
Version:
Seamless crypto payments. Onboard users from any chain, any coin into your app with one click.
53 lines (52 loc) • 2.33 kB
JavaScript
import { usePrepareTransaction } from "@coin-voyage/crypto/hooks";
import { assert } from "@coin-voyage/shared/common";
import { useBackendApi } from "../components/contexts/api";
import { fetchPaymentDetails } from "../lib/api/payment-details";
export function usePayFromWallet({ senderAddr, payOrder, setPayOrder, chainType, log }) {
const actions = usePrepareTransaction(chainType);
const api = useBackendApi();
const payFromWallet = async (currency) => {
assert(payOrder != undefined, "PayOrder is required");
assert(senderAddr != undefined, "Sender address is required");
assert(actions != undefined, "Transaction actions must be defined");
const params = currency.quoteId
? { payorder_id: payOrder.id, quote_id: currency.quoteId }
: {
payorder_id: payOrder.id,
source_currency: {
address: currency.address,
chain_id: currency.chain_id,
},
refund_address: senderAddr,
};
const paymentDetails = await fetchPaymentDetails(api, params, payOrder);
const paymentData = paymentDetails.data;
log(`[PAY-WITH-TOKEN] Final Quote for Order: ${JSON.stringify(paymentDetails)}, params: ${JSON.stringify(params)}`);
try {
const txHash = await actions.execute({
amount: BigInt(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,
});
setPayOrder({
...payOrder,
deposit_tx_hash: txHash,
payment: paymentData,
status: paymentDetails.status,
});
log(`[PAY-WITH-TOKEN] Transaction hash: ${txHash}`);
return txHash;
}
catch (e) {
if (e.message?.includes("rejected"))
return undefined;
log(`[PAY-WITH-TOKEN] Error sending token: ${e}`);
throw e;
}
};
return { payFromWallet };
}