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) => Block; readonly #blockWithTxsFunc: (provider: Provider, block: BlockParams) => Block; constructor(blockFunc: (provider: Provider, block: BlockParams) => Block, blockWithTxsFunc: (provider: Provider, block: BlockParams) => Block) { super("org.ethers.network-plugins.custom-block"); this.#blockFunc = blockFunc; this.#blockWithTxsFunc = blockWithTxsFunc; } async getBlock(provider: Provider, block: BlockParams): Promise> { return await this.#blockFunc(provider, block); } async getBlockions(provider: Provider, block: BlockParams): Promise> { return await this.#blockWithTxsFunc(provider, block); } clone(): CustomBlockNetworkPlugin { return new CustomBlockNetworkPlugin(this.#blockFunc, this.#blockWithTxsFunc); } } */ //# sourceMappingURL=plugins-network.js.map