@0xfutbol/id
Version:
React component library with shared providers for 0xFutbol ID
97 lines (96 loc) • 3.74 kB
JavaScript
import {s as stringify,j as isHex,at as getContract,P as readContract,a0 as encodeAbiParameters,d as getAddress,au as keccak256,ad as ZERO_ADDRESS}from'./index-DNoa140s.js';import'react';import'react/jsx-runtime';import'@0xfutbol/id-sign';import'react-use';import'@0xfutbol/constants';import'thirdweb';import'@matchain/matchid-sdk-react';import'@tanstack/react-query';import'@matchain/matchid-sdk-react/index.css';import'react-dom';// we do not send multiple batches so this stays consistent
const BATCH_ID = 0n;
/**
* @internal - only exported for testing
*/
async function prepareBiconomyTransaction({ account, serializableTransaction, transaction, gasless, }) {
const forwarderContract = getContract({
address: gasless.relayerForwarderAddress,
chain: transaction.chain,
client: transaction.client,
});
// get the nonce
const nonce = await readContract({
contract: forwarderContract,
method: "function getNonce(address,uint256) view returns (uint256)",
params: [account.address, BATCH_ID],
});
const deadline = Math.floor(Date.now() / 1000) + (gasless.deadlineSeconds ?? 3600);
const request = {
from: account.address,
to: serializableTransaction.to,
token: ZERO_ADDRESS,
txGas: serializableTransaction.gas,
tokenGasPrice: 0n,
batchId: BATCH_ID,
batchNonce: nonce,
deadline: deadline,
data: serializableTransaction.data,
};
if (!request.to) {
throw new Error("Cannot send a transaction without a `to` address");
}
if (!request.txGas) {
throw new Error("Cannot send a transaction without a `gas` value");
}
if (!request.data) {
throw new Error("Cannot send a transaction without a `data` value");
}
// create the hash
const message = encodeAbiParameters([
{ type: "address" },
{ type: "address" },
{ type: "address" },
{ type: "uint256" },
{ type: "uint256" },
{ type: "uint256" },
{ type: "uint256" },
{ type: "bytes32" },
], [
getAddress(request.from),
getAddress(request.to),
getAddress(request.token),
request.txGas,
request.tokenGasPrice,
request.batchId,
request.batchNonce,
keccak256(request.data),
]);
const signature = await account.signMessage({ message });
return [request, signature];
}
/**
* @internal
*/
async function relayBiconomyTransaction(options) {
const [request, signature] = await prepareBiconomyTransaction(options);
// send the transaction to the biconomy api
const response = await fetch("https://api.biconomy.io/api/v2/meta-tx/native", {
method: "POST",
body: stringify({
apiId: options.gasless.apiId,
params: [request, signature],
from: request.from,
to: request.to,
gasLimit: request.txGas,
}),
headers: {
"x-api-key": options.gasless.apiKey,
"Content-Type": "application/json;charset=utf-8",
},
});
if (!response.ok) {
response.body?.cancel();
throw new Error(`Failed to send transaction: ${await response.text()}`);
}
const json = await response.json();
const transactionHash = json.txHash;
if (isHex(transactionHash)) {
return {
transactionHash: transactionHash,
chain: options.transaction.chain,
client: options.transaction.client,
};
}
throw new Error(`Failed to send transaction: ${stringify(json)}`);
}export{prepareBiconomyTransaction,relayBiconomyTransaction};//# sourceMappingURL=biconomy-Cgs27-DA.js.map