UNPKG

@celo-tools/celo-ethers-wrapper

Version:

A minimal wrapper to make Ethers.JS compatible with the Celo network.

96 lines 8.65 kB
import { FeeData, JsonRpcProvider, TransactionResponse, getBigInt, resolveProperties, } from "ethers"; import { parseCeloTransaction } from "./transactions"; export default class CeloProvider extends JsonRpcProvider { async _perform(req) { // Legacy networks do not like the type field being passed along (which // is fair), so we delete type if it is 0 and a non-EIP-1559 network if (req.method === "call" || req.method === "estimateGas") { let tx = req.transaction; if (tx && tx.type != null && getBigInt(tx.type)) { // If there are no EIP-1559 properties, it might be non-EIP-1559 if (tx.maxFeePerGas == null && tx.maxPriorityFeePerGas == null) { const feeData = await this.getFeeData(); if (feeData.maxFeePerGas == null && feeData.maxPriorityFeePerGas == null) { // Network doesn't know about EIP-1559 (and hence type) req = Object.assign({}, req, { transaction: Object.assign({}, tx, { type: undefined }), }); } } } } const request = this.getRpcRequest(req); if (request != null) { return await this.send(request.method, request.args); } return super._perform(req); } /** * Override to handle alternative gas currencies * prepareRequest in https://github.com/ethers-io/ethers.js/blob/master/packages/providers/src.ts/json-rpc-provider.ts */ getRpcRequest(req) { if (req.method === "getGasPrice") { // @ts-expect-error const param = req.feeCurrencyAddress ? // @ts-expect-error [req.feeCurrencyAddress] : []; return { method: "eth_gasPrice", args: param }; } if (req.method === "estimateGas") { const extraneous_keys = [ ["from", (x) => x], ["feeCurrency", (x) => x], ]; const tx = { ...this.getRpcTransaction(req.transaction), }; extraneous_keys.forEach(([key, fn]) => { // @ts-expect-error if (req.transaction[key]) { // @ts-expect-error tx[key] = fn(req.transaction[key]); } }); return { method: "eth_estimateGas", args: [tx] }; } return super.getRpcRequest(req); } async estimateGas(_tx) { return getBigInt(await this._perform({ method: "estimateGas", // @ts-ignore transaction: _tx, }), "%response"); } // for eip1559 and cip66 transactions are denominated in CELO, cip64 fees must be looked up in the fee token async getFeeData(feeCurrency, denominateInCelo) { if (!feeCurrency || denominateInCelo) { return super.getFeeData(); } // On Celo, `eth_gasPrice` returns the base fee for the given currency multiplied 2 // and doesn't include tips. Source: https://github.com/jmrossy/celo-ethers-wrapper/pull/20#discussion_r1579179736 const baseFeePerGasInFeeCurrency = getBigInt(await this.send("eth_gasPrice", [feeCurrency])); const maxPriorityFeePerGasInFeeCurrency = getBigInt(await this.send("eth_maxPriorityFeePerGas", [feeCurrency])); const maxFeePerGasInFeeCurrency = baseFeePerGasInFeeCurrency + maxPriorityFeePerGasInFeeCurrency; return new FeeData(null, maxFeePerGasInFeeCurrency, maxPriorityFeePerGasInFeeCurrency); } async broadcastTransaction(signedTx) { const { hash } = await resolveProperties({ blockNumber: this.getBlockNumber(), hash: this._perform({ method: "broadcastTransaction", signedTransaction: signedTx, }), network: this.getNetwork(), }); const tx = parseCeloTransaction(signedTx); if (tx.hash !== hash) { throw new Error("@TODO: the returned hash did not match"); } return new TransactionResponse(tx, this); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2Vsb1Byb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9DZWxvUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE9BQU8sRUFDUCxlQUFlLEVBRWYsbUJBQW1CLEVBRW5CLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUEwQixvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlFLE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLGVBQWU7SUFDdkQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUF5QjtRQUN0Qyx1RUFBdUU7UUFDdkUsb0VBQW9FO1FBQ3BFLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxhQUFhLEVBQUU7WUFDekQsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUN6QixJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvQyxnRUFBZ0U7Z0JBQ2hFLElBQUksRUFBRSxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLG9CQUFvQixJQUFJLElBQUksRUFBRTtvQkFDOUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3hDLElBQ0UsT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJO3dCQUM1QixPQUFPLENBQUMsb0JBQW9CLElBQUksSUFBSSxFQUNwQzt3QkFDQSx1REFBdUQ7d0JBQ3ZELEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7NEJBQzNCLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFB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