const handleSendTransaction = useCallback(
async (params: HandleSendTransactionParams): Promise<void> => {
const s = await getSession();
const organizationId = params.organizationId || s?.organizationId;
const {
from,
to,
value,
data,
caip2,
sponsor,
gasLimit,
maxFeePerGas,
maxPriorityFeePerGas,
nonce: providedNonce,
successPageDuration = 2000,
} = params;
const { nonce } = await generateNonces({
from: from,
rpcUrl: DEFAULT_RPC_BY_CHAIN[caip2],
providedNonce,
});
return new Promise((resolve, reject) => {
const SendTxContainer = () => {
const cleanedData =
data && data !== "0x" && data !== "" ? data : undefined;
const action = async () => {
const { sendTransactionStatusId } =
await client.signAndSendTransaction({
walletAccount,
organizationId,
from,
to,
caip2,
sponsor: !!sponsor,
value,
data: cleanedData,
nonce,
gasLimit,
maxFeePerGas,
maxPriorityFeePerGas,
});
const { txHash } = await client.pollTransactionStatus({
httpClient: client.httpClient,
organizationId,
sendTransactionStatusId,
});
return { txHash };
};
return (
<SendTransactionPage
icon={<img src={getChainLogo(caip2)} className="h-10 w-10" />}
action={action}
caip2={caip2}
successPageDuration={successPageDuration}
onSuccess={() => resolve()}
onError={(err) => reject(err)}
/>
);
};
pushPage({
key: "Send Transaction",
content: <SendTxContainer />,
preventBack: true,
showTitle: false,
});
});
},
[pushPage, client]
);