| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 | import { defineProperties } from "../utils/properties.js";import { assertArgument } from "../utils/index.js";import type { FeeData, Provider } from "./provider.js";import type { FetchRequest } from "../utils/fetch.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.     */    readonly name!: string;    /**     *  Creates a new **NetworkPlugin**.     */    constructor(name: string) {        defineProperties<NetworkPlugin>(this, { name });    }    /**     *  Creates a copy of this plugin.     */    clone(): NetworkPlugin {        return new NetworkPlugin(this.name);    }//    validate(network: Network): NetworkPlugin {//        return this;//    }}/** *  The gas cost parameters for a [[GasCostPlugin]]. */export type GasCostParameters = {    /**     *  The transactions base fee.     */    txBase?: number;    /**     *  The fee for creating a new account.     */    txCreate?: number;    /**     *  The fee per zero-byte in the data.     */    txDataZero?: number;    /**     *  The fee per non-zero-byte in the data.     */    txDataNonzero?: number;    /**     *  The fee per storage key in the [[link-eip-2930]] access list.     */    txAccessListStorageKey?: number;    /**     *  The fee per address in the [[link-eip-2930]] access list.     */    txAccessListAddress?: number;};/** *  A **GasCostPlugin** allows a network to provide alternative values when *  computing the intrinsic gas required for a transaction. */export class GasCostPlugin extends NetworkPlugin implements GasCostParameters {    /**     *  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.     */    readonly effectiveBlock!: number;    /**     *  The transactions base fee.     */    readonly txBase!: number;    /**     *  The fee for creating a new account.     */    readonly txCreate!: number;    /**     *  The fee per zero-byte in the data.     */    readonly txDataZero!: number;    /**     *  The fee per non-zero-byte in the data.     */    readonly txDataNonzero!: number;    /**     *  The fee per storage key in the [[link-eip-2930]] access list.     */    readonly txAccessListStorageKey!: number;    /**     *  The fee per address in the [[link-eip-2930]] access list.     */    readonly txAccessListAddress!: number;    /**     *  Creates a new GasCostPlugin from %%effectiveBlock%% until the     *  latest block or another GasCostPlugin supercedes that block number,     *  with the associated %%costs%%.     */    constructor(effectiveBlock?: number, costs?: GasCostParameters) {        if (effectiveBlock == null) { effectiveBlock = 0; }        super(`org.ethers.network.plugins.GasCost#${ (effectiveBlock || 0) }`);        const props: Record<string, number> = { effectiveBlock };        function set(name: keyof GasCostParameters, nullish: number): void {            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<GasCostPlugin>(this, props);    }    clone(): GasCostPlugin {        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.     */    readonly address!: string;    /**     *  The chain ID that the ENS contract lives on.     */    readonly targetNetwork!: number;    /**     *  Creates a new **EnsPlugin** connected to %%address%% on the     *  %%targetNetwork%%. The default ENS address and mainnet is used     *  if unspecified.     */    constructor(address?: null | string, targetNetwork?: null | number) {        super("org.ethers.plugins.network.Ens");        defineProperties<EnsPlugin>(this, {            address: (address || EnsAddress),            targetNetwork: ((targetNetwork == null) ? 1: targetNetwork)        });    }    clone(): EnsPlugin {        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 {    readonly #feeDataFunc: (provider: Provider) => Promise<FeeData>;    /**     *  The fee data function provided to the constructor.     */    get feeDataFunc(): (provider: Provider) => Promise<FeeData> {        return this.#feeDataFunc;    }    /**     *  Creates a new **FeeDataNetworkPlugin**.     */    constructor(feeDataFunc: (provider: Provider) => Promise<FeeData>) {        super("org.ethers.plugins.network.FeeData");        this.#feeDataFunc = feeDataFunc;    }    /**     *  Resolves to the fee data.     */    async getFeeData(provider: Provider): Promise<FeeData> {        return await this.#feeDataFunc(provider);    }    clone(): FeeDataNetworkPlugin {        return new FeeDataNetworkPlugin(this.#feeDataFunc);    }}export class FetchUrlFeeDataNetworkPlugin extends NetworkPlugin {    readonly #url: string;    readonly #processFunc: (f: () => Promise<FeeData>, p: Provider, r: FetchRequest) => Promise<{ gasPrice?: null | bigint, maxFeePerGas?: null | bigint, maxPriorityFeePerGas?: null | bigint }>;    /**     *  The URL to initialize the FetchRequest with in %%processFunc%%.     */    get url(): string { return this.#url; }    /**     *  The callback to use when computing the FeeData.     */    get processFunc(): (f: () => Promise<FeeData>, p: Provider, r: FetchRequest) => Promise<{ gasPrice?: null | bigint, maxFeePerGas?: null | bigint, maxPriorityFeePerGas?: null | bigint }> { return this.#processFunc; }    /**     *  Creates a new **FetchUrlFeeDataNetworkPlugin** which will     *  be used when computing the fee data for the network.     */    constructor(url: string, processFunc: (f: () => Promise<FeeData>, p: Provider, r: FetchRequest) => Promise<{ gasPrice?: null | bigint, maxFeePerGas?: null | bigint, maxPriorityFeePerGas?: null | bigint }>) {        super("org.ethers.plugins.network.FetchUrlFeeDataPlugin");        this.#url = url;        this.#processFunc = processFunc;    }    // We are immutable, so we can serve as our own clone    clone(): FetchUrlFeeDataNetworkPlugin { 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);    }}*/
 |