UNPKG

@0xfutbol/id

Version:

React component library with shared providers for 0xFutbol ID

97 lines (96 loc) 3.74 kB
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