208 lines
6.5 KiB
JavaScript
208 lines
6.5 KiB
JavaScript
import { defineProperties } from "../utils/properties.js";
|
|
import { assertArgument } from "../utils/index.js";
|
|
const EnsAddress = "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e";
|
|
/**
|
|
* A **NetworkPlugin** provides additional functionality on a [[Network]].
|
|
*/
|
|
export class NetworkPlugin {
|
|
/**
|
|
* The name of the plugin.
|
|
*
|
|
* It is recommended to use reverse-domain-notation, which permits
|
|
* unique names with a known authority as well as hierarchal entries.
|
|
*/
|
|
name;
|
|
/**
|
|
* Creates a new **NetworkPlugin**.
|
|
*/
|
|
constructor(name) {
|
|
defineProperties(this, { name });
|
|
}
|
|
/**
|
|
* Creates a copy of this plugin.
|
|
*/
|
|
clone() {
|
|
return new NetworkPlugin(this.name);
|
|
}
|
|
}
|
|
/**
|
|
* A **GasCostPlugin** allows a network to provide alternative values when
|
|
* computing the intrinsic gas required for a transaction.
|
|
*/
|
|
export class GasCostPlugin extends NetworkPlugin {
|
|
/**
|
|
* The block number to treat these values as valid from.
|
|
*
|
|
* This allows a hardfork to have updated values included as well as
|
|
* mulutiple hardforks to be supported.
|
|
*/
|
|
effectiveBlock;
|
|
/**
|
|
* The transactions base fee.
|
|
*/
|
|
txBase;
|
|
/**
|
|
* The fee for creating a new account.
|
|
*/
|
|
txCreate;
|
|
/**
|
|
* The fee per zero-byte in the data.
|
|
*/
|
|
txDataZero;
|
|
/**
|
|
* The fee per non-zero-byte in the data.
|
|
*/
|
|
txDataNonzero;
|
|
/**
|
|
* The fee per storage key in the [[link-eip-2930]] access list.
|
|
*/
|
|
txAccessListStorageKey;
|
|
/**
|
|
* The fee per address in the [[link-eip-2930]] access list.
|
|
*/
|
|
txAccessListAddress;
|
|
/**
|
|
* Creates a new GasCostPlugin from %%effectiveBlock%% until the
|
|
* latest block or another GasCostPlugin supercedes that block number,
|
|
* with the associated %%costs%%.
|
|
*/
|
|
constructor(effectiveBlock, costs) {
|
|
if (effectiveBlock == null) {
|
|
effectiveBlock = 0;
|
|
}
|
|
super(`org.ethers.network.plugins.GasCost#${(effectiveBlock || 0)}`);
|
|
const props = { effectiveBlock };
|
|
function set(name, nullish) {
|
|
let value = (costs || {})[name];
|
|
if (value == null) {
|
|
value = nullish;
|
|
}
|
|
assertArgument(typeof (value) === "number", `invalud value for ${name}`, "costs", costs);
|
|
props[name] = value;
|
|
}
|
|
set("txBase", 21000);
|
|
set("txCreate", 32000);
|
|
set("txDataZero", 4);
|
|
set("txDataNonzero", 16);
|
|
set("txAccessListStorageKey", 1900);
|
|
set("txAccessListAddress", 2400);
|
|
defineProperties(this, props);
|
|
}
|
|
clone() {
|
|
return new GasCostPlugin(this.effectiveBlock, this);
|
|
}
|
|
}
|
|
/**
|
|
* An **EnsPlugin** allows a [[Network]] to specify the ENS Registry
|
|
* Contract address and the target network to use when using that
|
|
* contract.
|
|
*
|
|
* Various testnets have their own instance of the contract to use, but
|
|
* in general, the mainnet instance supports multi-chain addresses and
|
|
* should be used.
|
|
*/
|
|
export class EnsPlugin extends NetworkPlugin {
|
|
/**
|
|
* The ENS Registrty Contract address.
|
|
*/
|
|
address;
|
|
/**
|
|
* The chain ID that the ENS contract lives on.
|
|
*/
|
|
targetNetwork;
|
|
/**
|
|
* Creates a new **EnsPlugin** connected to %%address%% on the
|
|
* %%targetNetwork%%. The default ENS address and mainnet is used
|
|
* if unspecified.
|
|
*/
|
|
constructor(address, targetNetwork) {
|
|
super("org.ethers.plugins.network.Ens");
|
|
defineProperties(this, {
|
|
address: (address || EnsAddress),
|
|
targetNetwork: ((targetNetwork == null) ? 1 : targetNetwork)
|
|
});
|
|
}
|
|
clone() {
|
|
return new EnsPlugin(this.address, this.targetNetwork);
|
|
}
|
|
}
|
|
/**
|
|
* A **FeeDataNetworkPlugin** allows a network to provide and alternate
|
|
* means to specify its fee data.
|
|
*
|
|
* For example, a network which does not support [[link-eip-1559]] may
|
|
* choose to use a Gas Station site to approximate the gas price.
|
|
*/
|
|
export class FeeDataNetworkPlugin extends NetworkPlugin {
|
|
#feeDataFunc;
|
|
/**
|
|
* The fee data function provided to the constructor.
|
|
*/
|
|
get feeDataFunc() {
|
|
return this.#feeDataFunc;
|
|
}
|
|
/**
|
|
* Creates a new **FeeDataNetworkPlugin**.
|
|
*/
|
|
constructor(feeDataFunc) {
|
|
super("org.ethers.plugins.network.FeeData");
|
|
this.#feeDataFunc = feeDataFunc;
|
|
}
|
|
/**
|
|
* Resolves to the fee data.
|
|
*/
|
|
async getFeeData(provider) {
|
|
return await this.#feeDataFunc(provider);
|
|
}
|
|
clone() {
|
|
return new FeeDataNetworkPlugin(this.#feeDataFunc);
|
|
}
|
|
}
|
|
export class FetchUrlFeeDataNetworkPlugin extends NetworkPlugin {
|
|
#url;
|
|
#processFunc;
|
|
/**
|
|
* The URL to initialize the FetchRequest with in %%processFunc%%.
|
|
*/
|
|
get url() { return this.#url; }
|
|
/**
|
|
* The callback to use when computing the FeeData.
|
|
*/
|
|
get processFunc() { return this.#processFunc; }
|
|
/**
|
|
* Creates a new **FetchUrlFeeDataNetworkPlugin** which will
|
|
* be used when computing the fee data for the network.
|
|
*/
|
|
constructor(url, processFunc) {
|
|
super("org.ethers.plugins.network.FetchUrlFeeDataPlugin");
|
|
this.#url = url;
|
|
this.#processFunc = processFunc;
|
|
}
|
|
// We are immutable, so we can serve as our own clone
|
|
clone() { return this; }
|
|
}
|
|
/*
|
|
export class CustomBlockNetworkPlugin extends NetworkPlugin {
|
|
readonly #blockFunc: (provider: Provider, block: BlockParams<string>) => Block<string>;
|
|
readonly #blockWithTxsFunc: (provider: Provider, block: BlockParams<TransactionResponseParams>) => Block<TransactionResponse>;
|
|
|
|
constructor(blockFunc: (provider: Provider, block: BlockParams<string>) => Block<string>, blockWithTxsFunc: (provider: Provider, block: BlockParams<TransactionResponseParams>) => Block<TransactionResponse>) {
|
|
super("org.ethers.network-plugins.custom-block");
|
|
this.#blockFunc = blockFunc;
|
|
this.#blockWithTxsFunc = blockWithTxsFunc;
|
|
}
|
|
|
|
async getBlock(provider: Provider, block: BlockParams<string>): Promise<Block<string>> {
|
|
return await this.#blockFunc(provider, block);
|
|
}
|
|
|
|
async getBlockions(provider: Provider, block: BlockParams<TransactionResponseParams>): Promise<Block<TransactionResponse>> {
|
|
return await this.#blockWithTxsFunc(provider, block);
|
|
}
|
|
|
|
clone(): CustomBlockNetworkPlugin {
|
|
return new CustomBlockNetworkPlugin(this.#blockFunc, this.#blockWithTxsFunc);
|
|
}
|
|
}
|
|
*/
|
|
//# sourceMappingURL=plugins-network.js.map
|