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