-
-
Notifications
You must be signed in to change notification settings - Fork 2k
Description
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.