@celo-tools/celo-ethers-wrapper
Version:
A minimal wrapper to make Ethers.JS compatible with the Celo network.
96 lines • 8.65 kB
JavaScript
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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