Updated help for errors (#2489).
This commit is contained in:
parent
16007d4d1e
commit
38e825cee6
15
docs.wrm/troubleshooting/building.wrm
Normal file
15
docs.wrm/troubleshooting/building.wrm
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
_section: Building @<troubleshooting-building>
|
||||||
|
|
||||||
|
@TODO
|
||||||
|
|
||||||
|
_subsection: Packages
|
||||||
|
|
||||||
|
Sometimes packages get out of sync.
|
||||||
|
|
||||||
|
_code:
|
||||||
|
|
||||||
|
/home/ethers> rm package-lock.json node_modules/
|
||||||
|
|
||||||
|
/home/ethers> rm yarn.lock
|
||||||
|
|
||||||
|
/home/ethers> npm install
|
249
docs.wrm/troubleshooting/errors.wrm
Normal file
249
docs.wrm/troubleshooting/errors.wrm
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
_section: Error Codes @<error-codes>
|
||||||
|
|
||||||
|
All errors in ethers are created by the [[Logger]] class, which includes
|
||||||
|
a number of additional properties and extra data, which can assist in
|
||||||
|
debugging and when submitting issues.
|
||||||
|
|
||||||
|
When submitting an issue, please include as much of any error as possible,
|
||||||
|
but also make sure you understand the error and have tried suggested solutions
|
||||||
|
both in this trouble-shooting document and any other issues you find when
|
||||||
|
searching the GitHub issues.
|
||||||
|
|
||||||
|
|
||||||
|
_subsection: CALL_EXCEPTION @<help-CALL_EXCEPTION>
|
||||||
|
|
||||||
|
This error occurs when a call or transaction is used to interact with
|
||||||
|
the blockchain reverts (via ``revert``, ``require``, et cetera).
|
||||||
|
|
||||||
|
Due to the overall flexibility of Ethereum and Turing Completeness,
|
||||||
|
there is a large variety of reasons this can occur and troubleshooting
|
||||||
|
requires attention.
|
||||||
|
|
||||||
|
|
||||||
|
_heading: Common Causes
|
||||||
|
|
||||||
|
- The code does not exist on-chain. This may happen if you failed to wait
|
||||||
|
until the contract was deployed, the address is incorrect or if you
|
||||||
|
are connected to a different network than the contract has been deployed.
|
||||||
|
Check the code exists using ``provider.getCode(address)``.
|
||||||
|
- The wrong code is being accessed, for example if an artifact file was
|
||||||
|
not correctly updated so an older instance of the contract is being called
|
||||||
|
- The contract is failing during a ``require`` statement. For example, if
|
||||||
|
a contract method requires an //admin account// to be used, but the
|
||||||
|
contract is connected to another [[Signer]].
|
||||||
|
- The wrong ABI is being used to interact with a contract.
|
||||||
|
|
||||||
|
_heading: Debugging
|
||||||
|
|
||||||
|
- Always double check the address and network you are connected to and use
|
||||||
|
``provider.getCode(address)`` to verify the deployed code matches your
|
||||||
|
most recent version.
|
||||||
|
- Try accessing other, simpler contract methods to verify the account is correct.
|
||||||
|
|
||||||
|
|
||||||
|
_subsection: INSUFFICIENT_FUNDS @<help-INSUFFICIENT_FUNDS>
|
||||||
|
|
||||||
|
This usually occurs when a transaction is attempted, but the sending account
|
||||||
|
does not have enough ether to cover the cost of the transaction.
|
||||||
|
|
||||||
|
A transaction has an intrinsic cost which must be met, which accounts for
|
||||||
|
the value being sent, the base fee of the transaction, additional fees per byte
|
||||||
|
of calldata and whether the transaction will create a new account (i.e. the ``to``
|
||||||
|
is empty).
|
||||||
|
|
||||||
|
This error can also happen if ``provider.estimateGas`` is used with a non-zero
|
||||||
|
fee (i.e. ``gasPrice``, ``maxFeePerGas`` or ``maxPriorityFeePerGas``). If any
|
||||||
|
fee properties are specified, the ``from`` account must have sufficient ether
|
||||||
|
to execute the transaction.
|
||||||
|
|
||||||
|
|
||||||
|
_subsection: MISSING_NEW @<help-MISSING_NEW>
|
||||||
|
|
||||||
|
Classes in ethers must be instantiated with the ``new`` operator. This
|
||||||
|
error indicates that a Class is attempting to be used as a function.
|
||||||
|
|
||||||
|
_code: Examples @lang<javascript>
|
||||||
|
|
||||||
|
//_hide: privateKey = "0x0123456789012345678901234567890123456789012345678901234567890123";
|
||||||
|
//_hide: Wallet = ethers.Wallet;
|
||||||
|
|
||||||
|
// Bad:
|
||||||
|
//_throws:
|
||||||
|
ethers.Wallet(privateKey)
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
// Good:
|
||||||
|
//_result:
|
||||||
|
new ethers.Wallet(privateKey)
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
|
||||||
|
_subsection: NONCE_EXPIRED @<help-NONCE_EXPIRED>
|
||||||
|
|
||||||
|
This error occurs when a transaction is being sent with a ``nonce`` that
|
||||||
|
is lower than next required ``nonce``.
|
||||||
|
|
||||||
|
Each Ethereum transaction requires a ``nonce`` property equal to the index
|
||||||
|
of that transaction for that account for all time. So, if an account has
|
||||||
|
send four transactions over its lifetime, that means the nonces 0 though 3
|
||||||
|
(inclusive) have been used. The next transaction must use a nonce of 4.
|
||||||
|
Attempting to re-use a nonce less than 4 will result in this error.
|
||||||
|
|
||||||
|
|
||||||
|
_subsection: NUMERIC_FAULT @<help-NUMERIC_FAULT>
|
||||||
|
|
||||||
|
A [numeric fault](errors--numeric-fault) is a consequence of
|
||||||
|
performing an illegal operation with numeric values, such as
|
||||||
|
dividing by zero.
|
||||||
|
|
||||||
|
The error will indicate the ``operation``, which further indicates
|
||||||
|
the reason for the error.
|
||||||
|
|
||||||
|
|
||||||
|
_heading: Overflow @<help-NUMERIC_FAULT-overflow>
|
||||||
|
|
||||||
|
JavaScript uses [IEEE 754 double-precision binary floating point](link-wiki-ieee754)
|
||||||
|
numbers to represent numeric values. As a result, there are //holes//
|
||||||
|
in the integer set after 9,007,199,254,740,991; which is
|
||||||
|
problematic for //Ethereum// because that is only around 0.009
|
||||||
|
ether (in wei), which means any value over that will begin to
|
||||||
|
experience rounding errors.
|
||||||
|
|
||||||
|
As a result, any attempt to use a number which is outside the safe
|
||||||
|
range, which would result in incorrect values, an error is thrown.
|
||||||
|
|
||||||
|
In general, numbers should be kept as strings, [[BigNumber]] instances or
|
||||||
|
using ES2020 bigints, which all can safely be used without loss of precission.
|
||||||
|
|
||||||
|
_code: Examples @lang<javascript>
|
||||||
|
|
||||||
|
// One ether is outside the safe range
|
||||||
|
//_throws:
|
||||||
|
BigNumber.from(1000000000000000000)
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
// Providing the value as a string is safe
|
||||||
|
//_result:
|
||||||
|
BigNumber.from("1000000000000000000")
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
// As is using a bigint (notice the `n` suffix)
|
||||||
|
//_result:
|
||||||
|
BigNumber.from(1000000000000000000n)
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
// But most often, the `parseEther` function solves this
|
||||||
|
//_result:
|
||||||
|
utils.parseEther("1.0")
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
|
||||||
|
_heading: Numeric Underflow @<help-NUMERIC_FAULT-underflow>
|
||||||
|
|
||||||
|
Numeric underflow sbould not be confused with overflow.
|
||||||
|
|
||||||
|
Numeric underflow occurs when the precission of a value cannot be
|
||||||
|
safely represented in the current data type.
|
||||||
|
|
||||||
|
**Common Causes**
|
||||||
|
|
||||||
|
- Using values with fractional componets (e.g. ``BigNumber.from(1.2)``).
|
||||||
|
If you require fractions, you must use the [[FixedNumber]] class.
|
||||||
|
- Parsing string values that have more decimals than the unit supports
|
||||||
|
(e.g. ``parseUints("1.33", 1)``).
|
||||||
|
|
||||||
|
_code: Examples @lang<javascript>
|
||||||
|
|
||||||
|
// BigNumbers cannot be created with a fractional component
|
||||||
|
//_throws:
|
||||||
|
BigNumber.from(1.2)
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
// Parsing a value with more decimals than the type
|
||||||
|
//_throws:
|
||||||
|
utils.parseUnits("1.34", 1);
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
|
||||||
|
_heading: Division by zero @<help-NUMERIC_FAULT-division-by-zero>
|
||||||
|
|
||||||
|
This error occurs when dividing by zero or attempting to take the modulo zero.
|
||||||
|
|
||||||
|
|
||||||
|
_heading: Unbound Result @<help-NUMERIC_FAULT-unbound-result>
|
||||||
|
|
||||||
|
The ethers [[BigNumber]] does not support bitwise operators
|
||||||
|
on negative numbers which can result in the need for an infinite
|
||||||
|
number of set bits.
|
||||||
|
|
||||||
|
Other implementations may use negative values to indicate this,
|
||||||
|
but this is considered out of scope for ethers.
|
||||||
|
|
||||||
|
|
||||||
|
_heading: Unsupported Operation @<help-NUMERIC_FAULT-unsupported>
|
||||||
|
|
||||||
|
The ethers [[BigNumber]] does not support negative powers or bitwise
|
||||||
|
shift operation using negative values.
|
||||||
|
|
||||||
|
_code: Examples @lang<javascript>
|
||||||
|
|
||||||
|
two = BigNumber.from(2);
|
||||||
|
|
||||||
|
//_throws:
|
||||||
|
two.pow(-2)
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
// Cannot use negative values to alter shift direction
|
||||||
|
//_throws:
|
||||||
|
two.shr(-1)
|
||||||
|
//_log:
|
||||||
|
|
||||||
|
|
||||||
|
_subsection: REPLACEMENT_UNDERPRICED @<help-REPLACEMENT_UNDERPRICED>
|
||||||
|
|
||||||
|
To prevent nodes from being overloaded with junk transactions, a transaction
|
||||||
|
is only accepted into the memory pool if it has a reasonable chance of being
|
||||||
|
actually mined, which means that the account has sufficient balance, the nonce
|
||||||
|
is correct and the fee seems reasonable.
|
||||||
|
|
||||||
|
Once a transaction is in the memory pool though, to prevent an account from
|
||||||
|
flooding the network with many different transactions with the same nonce (each
|
||||||
|
of which satisfies the above criteria), to replace an existing transaction
|
||||||
|
an additional committment of a fee must be made by increasing the promised fee.
|
||||||
|
|
||||||
|
When replacing a legacy non-EIP1559 transaction, the ``gasPrice`` must be
|
||||||
|
increased. When replacing a modern, EIP-1559 transaction, the ``maxPriorityFeePerGas``
|
||||||
|
should be increased.
|
||||||
|
|
||||||
|
|
||||||
|
_subsection: TRANSACTION_REPLACED @<help-TRANSACTION_REPLACED>
|
||||||
|
|
||||||
|
This error is thrown when waiting for a transaction which has been
|
||||||
|
replaced by another, by the sender submitting a second transaction
|
||||||
|
with the same nonce, while the transaction was pending in the
|
||||||
|
transaction pool.
|
||||||
|
|
||||||
|
You can learn more about this feature in the ``.wait`` method of
|
||||||
|
[TransactionResponse](providers-TransactionResponse).
|
||||||
|
|
||||||
|
|
||||||
|
_subsection: UNPREDICTABLE_GAS_LIMIT @<help-UNPREDICTABLE_GAS_LIMIT>
|
||||||
|
|
||||||
|
During gas estimation it is possible that a transaction would actually
|
||||||
|
fail (and hence has no reasonable estimate of gas requirements) or that
|
||||||
|
the transaction is complex in a way that does not permit a node to
|
||||||
|
estiamte the gas requirements, in which case this error is thrown.
|
||||||
|
|
||||||
|
In almost all cases, this will unfortunately require you specify an
|
||||||
|
explicit ``gasLimit`` for your transaction, which will disable ether's
|
||||||
|
automatic population of the ``gasLimit`` field, which will cause this
|
||||||
|
error to go away.
|
||||||
|
|
||||||
|
To dial in an appropriate gas limit, try a value that is much higher
|
||||||
|
than you expect, and then make a few transactions to discover reasonable
|
||||||
|
values and then you can reduce this value down to that ballpark.
|
||||||
|
|
||||||
|
Keep in mind this error can also occur if the transaction would
|
||||||
|
legitimately fail, in which case the root cause must be addressed, such
|
||||||
|
as ensuring the correct [[Signer]] is being used, the appropriate allowance
|
||||||
|
for an ERC-20 token has been approved, etc.
|
62
docs.wrm/troubleshooting/help.wrm
Normal file
62
docs.wrm/troubleshooting/help.wrm
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
_section: Getting Help @<troubleshooting-issues>
|
||||||
|
|
||||||
|
@TODO
|
||||||
|
|
||||||
|
_subsection: Starting a discussion
|
||||||
|
|
||||||
|
Before opening an issue
|
||||||
|
|
||||||
|
|
||||||
|
_subsection: Opening an Issue
|
||||||
|
|
||||||
|
Keep in mind that opening an issue should be a last resort, as it
|
||||||
|
requires time and energy by the library developers to look at that
|
||||||
|
could otherwise be spent on improving the library, documentation
|
||||||
|
and tools.
|
||||||
|
|
||||||
|
Before opening an issue, please make sure you have searched any
|
||||||
|
public information, such as:
|
||||||
|
|
||||||
|
- Documentation
|
||||||
|
- GitHub Discussions
|
||||||
|
- GitHub Issues (including closed issues)
|
||||||
|
|
||||||
|
There are several types of issues tracked by ethers. Using the correct
|
||||||
|
one helps you receive feedback quicker and helps us keep the right
|
||||||
|
person
|
||||||
|
|
||||||
|
_heading: Feature Requests
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_heading: Bugs
|
||||||
|
|
||||||
|
This type of issue is for anything you you believe to be a bug in ethers.
|
||||||
|
|
||||||
|
Keep in mind that ethers is used extensively by thousands of people every
|
||||||
|
day, so while chances are possible you found a bug, please make sure to
|
||||||
|
do your due diligence to rule out user error.
|
||||||
|
|
||||||
|
If you are new to ethers, or are doing a fairly common operation, it is
|
||||||
|
quite likely what you are experiencing is a misunderstanding of how to
|
||||||
|
use a function, method or class. You should consider opening a discussion first.
|
||||||
|
|
||||||
|
|
||||||
|
Please make sure you include as much information as is useful:
|
||||||
|
|
||||||
|
- Are you using a third-party library, like Hardhat or Truffle?
|
||||||
|
- What platform are you on, a web browser, React Native, node, etc.?
|
||||||
|
- What network are you on, such as Ethereum mainnet, Optimism, etc.?
|
||||||
|
- What backend are you using, such as Geth, INFURA, Provider Engine, etc.?
|
||||||
|
|
||||||
|
|
||||||
|
_heading: Docuementation
|
||||||
|
|
||||||
|
If you have found a typo in the documentation, a feature which isn't
|
||||||
|
documented (or documented well) or just find something described in
|
||||||
|
the documentation confusing, please feel free to create an issue and
|
||||||
|
we will try to improve it.
|
||||||
|
|
||||||
|
_heading: Other
|
||||||
|
|
||||||
|
This should never be used.
|
11
docs.wrm/troubleshooting/index.wrm
Normal file
11
docs.wrm/troubleshooting/index.wrm
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
_section: TroubleShooting
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_toc:
|
||||||
|
building
|
||||||
|
errors
|
||||||
|
networks
|
||||||
|
help
|
||||||
|
|
||||||
|
_subsection: About Trbouble-Shooting
|
9
docs.wrm/troubleshooting/network.wrm
Normal file
9
docs.wrm/troubleshooting/network.wrm
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
_section: Troubleshooting Network @<troubleshooting-network>
|
||||||
|
|
||||||
|
@TODO
|
||||||
|
|
||||||
|
_subsection: Links
|
||||||
|
|
||||||
|
_subsection: Cross-Origin Resource Sharing (CORS)
|
||||||
|
|
||||||
|
_subsection: Mobile Development (Device Firewalls)
|
@ -250,7 +250,7 @@ export class Logger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (url) {
|
if (url) {
|
||||||
message += " [ See: https:/\/ethers.org/errors/" + url + " ]";
|
message += " [ See: https:/\/links.ethers.org/v5-errors-" + url + " ]";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (messageDetails.length) {
|
if (messageDetails.length) {
|
||||||
|
Loading…
Reference in New Issue
Block a user