Skip to content

Support for a custom key in TransactionRequest and CallOverrides #1761

@ly0va

Description

@ly0va

Currently, Signer.checkTransaction and contracts.populateTransaction reject custom override keys to prevent typos or unsupported options as seen here and here.

While the former method can be overridden by a derived class, there is no such option for the latter, as it is not a method of any class. Moreover, it is not exported, so there is no way to utilize the existing implementation without copy-pasting it.

The problem here is that when extending a Signer or a Wallet to be used to call contracts on networks that also use web3 API, but have additional options that must be specified to modify transaction calldata prior to sending, there is no way to pass those options into Signer.signTransaction or other methods that accept a TransactionRequest from the context of a contract, since contracts.populateTransaction used by the Contract class does not allow stray CallOverrides.

To give an example, I want to be able to do something like

// mylib.Wallet extends ethers.Wallet and overrides signTransaction and checkTransaction
// methods to be suitable for a custom network that needs some custom options to modify & sign transactions
const wallet = mylib.Wallet(key, provider); 

// contract uses wallet's overridden methods to build calldata
const contract = new ethers.Contract(address, abi, wallet);

// custom overrides are passed into wallet.signTransaction which will use them to modify the calldata
const tx = await contract.myFunction(
    ...args,    // regular arguments for the contract method
    {
        gasLimit: 30000,    // standard override
        custom: { customField: "abacaba" }  // custom override
    }
);

which is currently impossible due to checks in contracts.populateTransaction which I linked above.

Alternatively, the way to do this is by extending ethers.Contract using a lot of copy-pasted code to override Contract.populateTransacton, which is not pretty.
Adding a single custom field (or any other suitable name) would be a major help and will not compromise typo checks that are in place.

Maybe there is a much simpler way to do this which I am not seeing, in which case I would be very grateful for suggestions.
If not, then my suggested way is fairly straightforward to implement and I would gladly make a PR if this solution looks fine.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or improvement.fixed/completeThis Bug is fixed or Enhancement is complete and published.minor-bumpPlanned for the next minor version bump.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions