| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | import { defineProperties } from "../utils/index.js";import { AbstractSigner } from "./abstract-signer.js";/** *  A **NonceManager** wraps another [[Signer]] and automatically manages *  the nonce, ensuring serialized and sequential nonces are used during *  transaction. */export class NonceManager extends AbstractSigner {    /**     *  The Signer being managed.     */    signer;    #noncePromise;    #delta;    /**     *  Creates a new **NonceManager** to manage %%signer%%.     */    constructor(signer) {        super(signer.provider);        defineProperties(this, { signer });        this.#noncePromise = null;        this.#delta = 0;    }    async getAddress() {        return this.signer.getAddress();    }    connect(provider) {        return new NonceManager(this.signer.connect(provider));    }    async getNonce(blockTag) {        if (blockTag === "pending") {            if (this.#noncePromise == null) {                this.#noncePromise = super.getNonce("pending");            }            const delta = this.#delta;            return (await this.#noncePromise) + delta;        }        return super.getNonce(blockTag);    }    /**     *  Manually increment the nonce. This may be useful when managng     *  offline transactions.     */    increment() {        this.#delta++;    }    /**     *  Resets the nonce, causing the **NonceManager** to reload the current     *  nonce from the blockchain on the next transaction.     */    reset() {        this.#delta = 0;        this.#noncePromise = null;    }    async sendTransaction(tx) {        const noncePromise = this.getNonce("pending");        this.increment();        tx = await this.signer.populateTransaction(tx);        tx.nonce = await noncePromise;        // @TODO: Maybe handle interesting/recoverable errors?        // Like don't increment if the tx was certainly not sent        return await this.signer.sendTransaction(tx);    }    signTransaction(tx) {        return this.signer.signTransaction(tx);    }    signMessage(message) {        return this.signer.signMessage(message);    }    signTypedData(domain, types, value) {        return this.signer.signTypedData(domain, types, value);    }}//# sourceMappingURL=signer-noncemanager.js.map
 |