UNPKG

@celo-tools/celo-ethers-wrapper

Version:

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

99 lines 8.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ethers_1 = require("ethers"); const transactions_1 = require("./transactions"); class CeloProvider extends ethers_1.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 && (0, ethers_1.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 (0, ethers_1.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 = (0, ethers_1.getBigInt)(await this.send("eth_gasPrice", [feeCurrency])); const maxPriorityFeePerGasInFeeCurrency = (0, ethers_1.getBigInt)(await this.send("eth_maxPriorityFeePerGas", [feeCurrency])); const maxFeePerGasInFeeCurrency = baseFeePerGasInFeeCurrency + maxPriorityFeePerGasInFeeCurrency; return new ethers_1.FeeData(null, maxFeePerGasInFeeCurrency, maxPriorityFeePerGasInFeeCurrency); } async broadcastTransaction(signedTx) { const { hash } = await (0, ethers_1.resolveProperties)({ blockNumber: this.getBlockNumber(), hash: this._perform({ method: "broadcastTransaction", signedTransaction: signedTx, }), network: this.getNetwork(), }); const tx = (0, transactions_1.parseCeloTransaction)(signedTx); if (tx.hash !== hash) { throw new Error("@TODO: the returned hash did not match"); } return new ethers_1.TransactionResponse(tx, this); } } exports.default = CeloProvider; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2Vsb1Byb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9DZWxvUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FRZ0I7QUFDaEIsaURBQThFO0FBRTlFLE1BQXFCLFlBQWEsU0FBUSx3QkFBZTtJQUN2RCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQXlCO1FBQ3RDLHVFQUF1RTtRQUN2RSxvRUFBb0U7UUFDcEUsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLGFBQWEsRUFBRTtZQUN6RCxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO1lBQ3pCLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUEsa0JBQVMsRUFBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQy9DLGdFQUFnRTtnQkFDaEUsSUFBSSxFQUFFLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsb0JBQW9CLElBQUksSUFBSSxFQUFFO29CQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDeEMsSUFDRSxPQUFPLENBQUMsWUFBWSxJQUFJLElBQUk7d0JBQzVCLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLEVBQ3BDO3dCQUNBLHVEQUF1RDt3QkFDdkQsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTs0QkFDM0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzt5QkFDeEQsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxD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