2019-08-21 08:53:47 +03:00
|
|
|
_section: BigNumber @<bignumber>
|
|
|
|
|
2020-02-18 01:56:13 +03:00
|
|
|
Many operations in Ethereum operation on numbers which are
|
|
|
|
[outside the range of safe values](notes-safenumbers) to use
|
|
|
|
in JavaScript.
|
|
|
|
|
|
|
|
A **BigNumber** is an object which safely allows mathematic operations
|
|
|
|
on numbers of any magnitude.
|
|
|
|
|
|
|
|
Most operations which need to return a value will return a **BigNumber**
|
|
|
|
and parameters which accept values will generally accept them.
|
|
|
|
|
2019-08-21 08:53:47 +03:00
|
|
|
|
|
|
|
_heading: Importing
|
|
|
|
|
|
|
|
_code: bignumber-import.source
|
|
|
|
|
|
|
|
_subsection: Types
|
|
|
|
|
|
|
|
_heading: BigNumberish @<bignumberish>
|
|
|
|
|
|
|
|
Many functions and methods in this library take in values which
|
|
|
|
can be non-ambiguously and safely converted to a BigNumber. These
|
|
|
|
values can be sepcified as:
|
|
|
|
|
|
|
|
_definition: **//string//**
|
|
|
|
A [hexstring](hexstring) or a decimal string, either of which may
|
|
|
|
be negative.
|
|
|
|
|
|
|
|
_definition: **//BytesLike//**
|
|
|
|
A [BytesLike](byteslike) Object, such as an Array or Uint8Array.
|
|
|
|
|
|
|
|
_definition: **//BigNumber//**
|
2020-02-18 01:56:13 +03:00
|
|
|
An existing [[bignumber]] instance.
|
2019-08-21 08:53:47 +03:00
|
|
|
|
|
|
|
_definition: **//number//**
|
2020-02-18 01:56:13 +03:00
|
|
|
A number that is within the [safe range](link-js-maxsafe) for JavaScript numbers.
|
2019-08-21 08:53:47 +03:00
|
|
|
|
|
|
|
_definition: **//BigInt//**
|
2020-02-02 15:58:29 +03:00
|
|
|
A JavaScript [BigInt](link-js-bigint)
|
2019-08-21 08:53:47 +03:00
|
|
|
object, on environments that support BigInt.
|
|
|
|
|
|
|
|
|
|
|
|
_subsection: Creating Instances
|
|
|
|
|
|
|
|
The constructor of BigNumber cannot be called directly. Instead, Use the static ``BigNumber.from``.
|
|
|
|
|
2020-02-25 22:57:11 +03:00
|
|
|
_property: ethers.BigNumber.from(aBigNumberish) => [[bignumber]]
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns an instance of a **BigNumber** for //aBigNumberish//.
|
|
|
|
|
2020-02-25 22:57:11 +03:00
|
|
|
_heading: Examples: @<>
|
2019-08-21 08:53:47 +03:00
|
|
|
|
|
|
|
_code: bignumber-create.js
|
|
|
|
|
|
|
|
|
|
|
|
_subsection: Methods
|
|
|
|
|
|
|
|
The BigNumber class is immutable, so no operations can change the value
|
|
|
|
it represents.
|
|
|
|
|
|
|
|
|
|
|
|
_heading: Math Operations
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.add(otherValue) => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the value of //bignumber// **+** //otherValue//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.sub(otherValue) => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the value of //bignumber// **–** //otherValue//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.mul(otherValue) => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the value of //bignumber// **×** //otherValue//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.div(divisor) => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the value of //bignumber// **÷** //divisor//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.mod(divisor) => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the value of the **remainder** of //bignumber// ÷ //divisor//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.pow(exponent) => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the value of //bignumber// to the power of //exponent//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.abs() => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the absolute value of //bignumber//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.maskn(bitcount) => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the value of //bignumber// with bits beyond
|
|
|
|
the //bitcount// least significant bits set to zero.
|
|
|
|
|
|
|
|
|
|
|
|
_heading: Two's Compliment
|
|
|
|
|
2020-02-02 15:58:29 +03:00
|
|
|
[Two's Complicment](link-wiki-twoscomplement)
|
2019-08-23 22:25:13 +03:00
|
|
|
is an elegant method used to encode and decode fixed-width signed values
|
|
|
|
while efficiently preserving mathematic operations.
|
|
|
|
Most users will not need to interact with these.
|
2019-08-21 08:53:47 +03:00
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.fromTwos(bitwidth) => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the value of //bignumber// converted from twos-compliment with //bitwidth//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.toTwos(bitwidth) => [[bignumber]] @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns a BigNumber with the value of //bignumber// converted to twos-compliment with //bitwidth//.
|
|
|
|
|
|
|
|
|
|
|
|
_heading: Comparison and Equivalence
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.eq(otherValue) => boolean @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns true if and only if the value of //bignumber// is equal to //otherValue//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.lt(otherValue) => boolean @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns true if and only if the value of //bignumber// **<** //otherValue//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.lte(otherValue) => boolean @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns true if and only if the value of //bignumber// **≤** //otherValue//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.gt(otherValue) => boolean @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns true if and only if the value of //bignumber// **>** //otherValue//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.gte(otherValue) => boolean @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns true if and only if the value of //bignumber// **≥** //otherValue//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.isZero() => boolean @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns true if and only if the value of //bignumber// is zero.
|
|
|
|
|
|
|
|
|
|
|
|
_heading: Conversion
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.toNumber() => number @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns the value of //bignumber// as a JavaScript value.
|
|
|
|
|
|
|
|
This will **throw an error**
|
|
|
|
if the value is greater than or equal to //Number.MAX_SAFE_INTEGER// or less than or
|
|
|
|
equal to //Number.MIN_SAFE_INTEGER//.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.toString() => string @SRC<bignumber:BigNumber.toString>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns the value of //bignumber// as a base-10 string.
|
|
|
|
|
2020-01-10 09:01:00 +03:00
|
|
|
_property: bignumber.toHexString() => string<[[datahexstring]]> @SRC<bignumber:BigNumber.toHexString>
|
2020-02-18 01:56:13 +03:00
|
|
|
Returns the value of //bignumber// as a base-16, ``0x``-prefixed [[datahexstring]].
|
2019-08-21 08:53:47 +03:00
|
|
|
|
|
|
|
|
|
|
|
_heading: Inspection
|
|
|
|
|
2020-02-25 22:57:11 +03:00
|
|
|
_property: ethers.BigNumnber.isBigNumber(object) => boolean @SRC<bignumber>
|
2019-08-21 08:53:47 +03:00
|
|
|
Returns true if and only if the //object// is a BigNumber object.
|
|
|
|
|
|
|
|
|
|
|
|
_heading: Examples
|
|
|
|
|
|
|
|
_code: bignumber-examples.js
|
|
|
|
|
2020-02-18 01:56:13 +03:00
|
|
|
|
2019-08-21 08:53:47 +03:00
|
|
|
_subsection: Notes
|
|
|
|
|
2020-02-18 01:56:13 +03:00
|
|
|
This section is a for a couple of questions that come up frequently.
|
|
|
|
|
2019-08-21 08:53:47 +03:00
|
|
|
|
2020-02-18 01:56:13 +03:00
|
|
|
_heading: Why can't I just use numbers? @<notes-safenumbers>
|
2019-08-21 08:53:47 +03:00
|
|
|
|
|
|
|
The first problem many encounter when dealing with Ethereum is
|
|
|
|
the concept of numbers. Most common currencies are broken down
|
|
|
|
with very little granularity. For example, there are only 100
|
|
|
|
cents in a single dollar. However, there are 10^^18^^ **wei** in a
|
|
|
|
single **ether**.
|
|
|
|
|
2020-02-02 15:58:29 +03:00
|
|
|
JavaScript uses [IEEE 754 double-precision binary floating point](link-wiki-ieee754)
|
2019-08-21 08:53:47 +03:00
|
|
|
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.
|
|
|
|
|
|
|
|
To demonstrate how this may be an issue in your code, consider:
|
|
|
|
|
|
|
|
_code: bignumber-ieee754.js
|
|
|
|
|
|
|
|
To remedy this, all numbers (which can be large) are stored
|
|
|
|
and manipulated as [Big Numbers](bignumber).
|
|
|
|
|
|
|
|
The functions [parseEther( etherString )](http://linkto) and
|
|
|
|
[formatEther( wei )](http://linkto) can be used to convert
|
|
|
|
between string representations, which are displayed to or entered
|
|
|
|
by the user and Big Number representations which can have
|
|
|
|
mathematical operations handled safely.
|
2020-02-18 01:56:13 +03:00
|
|
|
|
|
|
|
|
|
|
|
_heading: Why not BigNumber.js, BN.js, BigDecimal, etc?
|
|
|
|
|
|
|
|
Everyone has their own favourite Big Number library, and once someone
|
|
|
|
has choosen one, it becomes part of their identity, like their editor,
|
|
|
|
vi vs emacs. There are over 100 Big Number libraries on [npm](link-npm-query-bignumber).
|
|
|
|
|
|
|
|
One of the biggest differences between the Ethers [[bignumber]] object and
|
|
|
|
other libraries is that it is immutable, which is very important when
|
|
|
|
dealing with the asynchronous nature of the blockchain.
|
|
|
|
|
|
|
|
Capturing the value is not safe in async functions, so immutability
|
|
|
|
protects us from easy to make mistakes, which is not possible on the
|
|
|
|
low-level library's objects which supports myriad in-place operations.
|
|
|
|
|
|
|
|
Second, the Ethers [[bignumber]] provides all the functionality required
|
|
|
|
internally and should generally be sufficient for most developers while
|
|
|
|
not exposing some of the more advanced and rare functionality. So it will
|
|
|
|
be eaiser to swap out the underlying library without impacting consumers.
|
|
|
|
|
|
|
|
For example, if [[link-npm-bnjs]] was exposed, someone may use the
|
|
|
|
greatest-common-denominator functions, which would then be functionality
|
|
|
|
the replacing library should also provide to ensure anyone depending on
|
|
|
|
that functionality is not broken.
|
|
|
|
|
|
|
|
|
|
|
|
_heading: Why BN.js??
|
|
|
|
|
|
|
|
The reason why [[link-npm-bnjs]] is used internally as the big
|
|
|
|
number is because that is the library used by [[link-npm-elliptic]].
|
|
|
|
|
|
|
|
Therefore it **must** be included regardless, so we leverage that
|
|
|
|
library rather than adding another Big Number library, which would
|
|
|
|
mean two different libraries offering the same functionality.
|
|
|
|
|
|
|
|
This has saved about 85kb (80% of this library size) of library size
|
|
|
|
over other libraries which include separate Big Number libraries for
|
|
|
|
various purposes.
|
|
|
|
|
|
|
|
|
|
|
|
_heading: Why not allow us to set a global Big Number library?
|
|
|
|
|
|
|
|
Another comment that comes up frequently is tha desire to specify a
|
|
|
|
global user-defined Big Number library, which all functions would
|
|
|
|
return.
|
|
|
|
|
|
|
|
This becomes problematic since your code may live along side other
|
|
|
|
libraries or code that use Ethers. In fact, even Ethers uses a lot
|
|
|
|
of the public functions internally.
|
|
|
|
|
|
|
|
If you, for example, used a library that used ``a.plus(b)`` instead
|
|
|
|
of ``a.add(b)``, this would break Ethers when it tries to compute
|
|
|
|
fees internally, and other libraries likely have similar logic.
|
|
|
|
|
|
|
|
But, the [[bignumber]] prototype is exposed, so you can always add a
|
|
|
|
``toMyCustomBigNumber()`` method to all [[bignumber]]'s globally
|
|
|
|
which is safe.
|