Compare commits

..

16 Commits

Author SHA1 Message Date
Richard Moore
59239d2f61 Updated dist files. 2020-07-07 23:19:00 -04:00
Richard Moore
bf65ddbff0 Fixed splitSignature when recoveryParam is encoded directly (#893, #933). 2020-07-07 22:54:35 -04:00
Richard Moore
7e56f3d392 Fixed BigNumber string validation (#935). 2020-07-07 22:18:02 -04:00
Richard Moore
4124a568fd Adding @yuetloo web3 migration docs. 2020-07-06 18:26:11 -04:00
Yuet Loo Wong
db7202578d migration from web3 2020-07-06 17:47:51 -04:00
Richard Moore
e38fa1cdd4 Updated spell check script. 2020-07-05 00:03:50 -04:00
Richard Moore
a1b2a62e6b Updated docs build. 2020-07-05 00:02:47 -04:00
Richard Moore
f34be4e2c2 Updated dist files. 2020-07-05 00:01:57 -04:00
Richard Moore
84e253f3f9 Prevent negative exponents in BigNumber (#925). 2020-07-04 23:41:05 -04:00
Richard Moore
0fd9aa5cb6 Fixed StaticJsonRpcProvider when auto-detecting network (#901). 2020-07-04 23:06:18 -04:00
Richard Moore
2a73b6ed34 Updated docs for ESM import. 2020-07-04 22:46:47 -04:00
Richard Moore
0838135d4a Fixed typos in docs (#921). 2020-07-04 22:44:27 -04:00
Richard Moore
a144ed8a71 Fixed migration docs (#890). 2020-07-04 21:29:18 -04:00
Richard Moore
c646a0c881 Updated docs build. 2020-07-03 01:54:56 -04:00
Richard Moore
0059b7e468 Fixed documentation typos (#895, #917, #924). 2020-07-03 01:44:17 -04:00
Richard Moore
4838874127 Added WebSocket static method to Alchemy provider and updated Alchemy URLs. 2020-07-03 01:41:32 -04:00
217 changed files with 2649 additions and 1916 deletions

View File

@@ -3,6 +3,19 @@ Changelog
This change log is managed by `scripts/cmds/update-versions` but may be manually updated.
ethers/v5.0.5 (2020-07-07 23:18)
--------------------------------
- Fixed splitSignature when recoveryParam is encoded directly. ([#893](https://github.com/ethers-io/ethers.js/issues/893), [#933](https://github.com/ethers-io/ethers.js/issues/933); [bf65ddb](https://github.com/ethers-io/ethers.js/commit/bf65ddbff0036f6eb8e99c145f30edff157687f5))
- Fixed BigNumber string validation. ([#935](https://github.com/ethers-io/ethers.js/issues/935); [7e56f3d](https://github.com/ethers-io/ethers.js/commit/7e56f3d392e52815c5c859772b99660e0fc38ef5))
ethers/v5.0.4 (2020-07-04 23:46)
--------------------------------
- Prevent negative exponents in BigNumber. ([#925](https://github.com/ethers-io/ethers.js/issues/925); [84e253f](https://github.com/ethers-io/ethers.js/commit/84e253f3f9674b52fa2a17b097644e91e6474021))
- Fixed StaticJsonRpcProvider when auto-detecting network. ([#901](https://github.com/ethers-io/ethers.js/issues/901); [0fd9aa5](https://github.com/ethers-io/ethers.js/commit/0fd9aa5cb6f4a3f9c1bea9b4eeee389700db01fa))
- Added WebSocket static method to Alchemy provider and updated Alchemy URLs. ([4838874](https://github.com/ethers-io/ethers.js/commit/48388741272df8569315637f21df7c6519f79e2e))
ethers/v5.0.3 (2020-06-29 00:50)
--------------------------------

View File

@@ -27,7 +27,7 @@ Keep Updated
------------
For the latest news and advisories, please follow the [@ethersproject](https://twitter.com/ethersproject)
on Twitter (low-traffic, non-marketting, important information only) as well as watch this GitHub project.
on Twitter (low-traffic, non-marketing, important information only) as well as watch this GitHub project.
For the latest changes, see the [CHANGELOG](https://github.com/ethers-io/ethers.js/blob/master/CHANGELOG.md).
@@ -66,7 +66,7 @@ Browse the [documentation](https://docs.ethers.io/v5/) online:
- [Full API Documentation](https://docs.ethers.io/v5/api/)
- [Various Ethereum Articles](https://blog.ricmoo.com/)
Or browser the entire documentations as a [single page](https://docs.ethers.io/single-page/) to make searching easier.
Or browse the entire documentation as a [single page](https://docs.ethers.io/single-page/) to make searching easier.
Ancillary Packages
@@ -78,7 +78,7 @@ use-cases, so rather than adding them to the umbrella package, they are added as
ancillary packaged, which can be included by those who need them, while not bloating
everyone else with packages they do not need.
We will keep a list of useful pacakges here.
We will keep a list of useful packages here.
- `@ethersproject/experimental` ([documentation](https://docs.ethers.io))
- `@ethersproject/cli` ([documentation](https://docs.ethers.io))

View File

@@ -58,9 +58,10 @@ abiv
// Query parameters
apikey asc endblock startblock
Cloudflare Etherscan INFURA IPFS MetaMask Nodesmith Trezor ledgerhq
axic bitcoinjs browserify easyseed ethereumjs
goerli homestead kotti kovan mainnet morden mordor rinkeby ropsten testnet
alchemyapi Cloudflare Etherscan INFURA IPFS MetaMask Nodesmith
Trezor ledgerhq axic bitcoinjs browserify easyseed ethereumjs
goerli homestead kotti kovan mainnet morden mordor rinkeby
ropsten testnet
// Demo words
args foo eth foo foobar ll localhost passwd ricmoo tx xxx yna

View File

@@ -36,11 +36,11 @@ to the Contract's constructor.
_property: contractFactory.deploy(...args) => Promise<[[Contract]]> @<ContractFactory-deploy>
Uses the signer to deploy the Contract with //args// passed into tgee constructor and
Uses the signer to deploy the Contract with //args// passed into the constructor and
retruns a Contract which is attached to the address where this contract **will** be
deployed once the transction is mined.
deployed once the transaction is mined.
The transction can be found at ``contract.deployTransaction``, and no interactions
The transaction can be found at ``contract.deployTransaction``, and no interactions
should be made until the transaction is mined.
_code: Deploying a Contract
@@ -73,6 +73,6 @@ contract.deployTransaction
contract.deployTransaction.wait()
//!
// Now the contract is safe to ineract with
// Now the contract is safe to interact with
contract.value()
//!

View File

@@ -19,7 +19,7 @@ Returns a new instance of the Contract, but connected to
By passing in a [[Provider]], this will return a downgraded
**Contract** which only has read-only access (i.e. constant calls).
By passing in a [[Signer]]. the will return a **Contract** which
By passing in a [[Signer]]. this will return a **Contract** which
will act on behalf of that signer.
@@ -107,7 +107,7 @@ For values that have a simple meaning in JavaScript, the types are fairly
straight forward; strings and booleans are returned as JavaScript strings
and booleans.
For numbers, if the **type** is in the JavaSsript safe range (i.e. less
For numbers, if the **type** is in the JavaScript safe range (i.e. less
than 53 bits, such as an ``int24`` or ``uint48``) a normal JavaScript
number is used. Otherwise a [[BigNumber]] is returned.
@@ -150,7 +150,7 @@ signer.
_heading: Write Methods Analysis @<Contract--check>
There are secveral options to analyze properties and results of a
There are several options to analyze properties and results of a
write method without actually executing it.
_property: contract.estimateGas.METHOD_NAME(...args [ , overrides ]) => Promise<[[BigNumber]]> @<contract-estimateGas>
@@ -162,12 +162,12 @@ Returns an [[UnsignedTransaction]] which represents the transaction
that would need to be signed and submitted to the network to execute
//METHOD_NAME// with //args// and //overrides//.
_property: contract.staticCall.METHOD_NAME(...args [ , overrides ]) => Promise<any> @<contract-staticCall>
_property: contract.callStatic.METHOD_NAME(...args [ , overrides ]) => Promise<any> @<contract-callStatic>
Rather than executing the state-change of a transaction, it is possible
to ask a node to //pretend// that a call is not state-changing and
return the result.
This does not actually chagne any state, but is free. This in some cases
This does not actually change any state, but is free. This in some cases
can be used to determine if a transaction will fail or succeed.
This otherwise functions the same as a [Read-Only Method](Contract--readonly).

View File

@@ -91,7 +91,7 @@ Returns a new instance of the Contract, but connected to
By passing in a [[Provider]], this will return a downgraded
**Contract** which only has read-only access (i.e. constant calls).
By passing in a [[Signer]]. the will return a **Contract** which
By passing in a [[Signer]]. this will return a **Contract** which
will act on behalf of that signer.
_property: erc20.deployed() => Promise<Contract>

View File

@@ -2,10 +2,10 @@ _section: Contract Interaction @<contracts>
A **Contract** object is an abstraction of a contract (EVM bytecode)
deployed on the Ethereum network. It allows for a simple way to
serialize calls and transaxtions to an on-chain contract and
serialize calls and transactions to an on-chain contract and
deserialize their results and emitted logs.
A **ContractFactory** is an abstraction a contract's //bytecode//
A **ContractFactory** is an abstraction of a contract's //bytecode//
and facilitates deploying a contract.
_toc:

View File

@@ -96,7 +96,7 @@ specify a [Project Secret](link-infura-secret) which can be used
on non-public sources (like on a server) to further secure your
API access and quotas.
_property: InfuraProvider.getWebSocketProvider([ network [ , apiKey ] ]) => [[WebSocketProvider]] @<InfuraProvider-getWebSocketProvider> @SRC<providers>
_property: InfuraProvider.getWebSocketProvider([ network [ , apiKey ] ]) => [[WebSocketProvider]] @<InfuraProvider-getWebSocketProvider> @SRC<providers:InfuraProvider.getWebSocketProvider>
Create a new [[WebSocketProvider]] using the INFURA web-socket endpoint
to connect to //network// with the optional //apiKey//.

View File

@@ -55,16 +55,16 @@ _note: Note: API Keys
It is highly recommended for production services that to acquire
and specify an API Key for each sercice.
The deafult API Keys used by ethers are shared across all users,
The default API Keys used by ethers are shared across all users,
so services may throttle all services that are using the default
API Keys during periods of load without realizing it.
Many services also have monitoring and usage metrics, which are
only available if an API Key is specifie. This allows tracking
only available if an API Key is specified. This allows tracking
how many requests are being sent and which methods are being
used the most.
Some services also provide additional paid features, whichare only
Some services also provide additional paid features, which are only
available when specifying an API Key.

View File

@@ -14,7 +14,7 @@ querying the node.
_note: Note: Connecting to a Local Node
Each node implementation is slightly different and may require specific
command-line flags, configuration or settings in their UI to enable
JSON-RPC, unlock accounrs or expose specific APIs. Please consult
JSON-RPC, unlock accounts or expose specific APIs. Please consult
their documentation.
_property: jsonRpcProvider.getSigner([ addressOrIndex ]) => [[JsonRpcSigner]] @<JsonRpcProvider-getSigner> @SRC<providers/json-rpc-provider>
@@ -42,12 +42,12 @@ _property: signer.provider => [[JsonRpcProvider]]
The provider this signer was established from.
_property: signer.connectUnchecked() => [[UncheckedJsonRpcSigner]] @<JsonRpcSigner-connectUnchecked> @SRC<providers>
Returns a new Signer object which does not perform addtional checks when
Returns a new Signer object which does not perform additional checks when
sending a transaction. See [getUncheckedSigner](JsonRpcProvider-getUncheckedSigner) for more details.
_property: signer.sendUncheckedTransaction(transaction) => Promise<string<[[DataHexString]]\<32>\>> @<JsonRpcSigner-sendUncheckedTransaction> @SRC<providers>
Sends the //transaction// and returns a Promise which resolves to the
opacque transaction hash.
opaque transaction hash.
_property: signer.unlock(password) => Promise<boolean> @<JsonRpcSigner-unlock> @SRC<providers>
Request the node unlock the account (if locked) using //password//.
@@ -60,7 +60,7 @@ of a transaction before returning it. For example, the gas price and gas limit
may be adjusted by the node or the nonce automatically included, in which case
the opaque transaction hash has discarded this.
To remedy this, the [[JsonRpcSigner]] immeidately queries the provider for
To remedy this, the [[JsonRpcSigner]] immediately queries the provider for
the details using the returned transaction hash to populate the [[providers-TransactionResponse]]
object.
@@ -85,7 +85,7 @@ The [jsonRpcProvider.send](JsonRpcProvider-send) method can be used to access th
- [All JSON-RPC methods](link-json-rpc) (including the less common methods) which most
Ethereum Nodes support.
- [Parity's Trace Module](link-parity-trace) can be used to trace and debug EVM
execcution of a transaction (requires custom configuration)
execution of a transaction (requires custom configuration)
- [Geth's Debug Module](link-geth-debug) can be used to debug transactions and
internal cache state, etc.
- [Additional Geth Methods](link-geth-rpc)

View File

@@ -60,7 +60,7 @@ provider.getBlockWithTransactions(100004)
_subsection: Ethereum Naming Service (ENS) Methods @<Provider--ens-methods>
The [Ethereum Naming Service](link-ens) (ENS) allows a short and
easy-to-remember ENS Name to be atached to any set of keys
easy-to-remember ENS Name to be attached to any set of keys
and values.
One of the most common uses for this is to use a simple name to

View File

@@ -47,7 +47,7 @@ _property: signer.getBalance([ blockTag = "latest" ]) => Promise<[[BigNumber]]>
Returns the balance of this wallet at //blockTag//.
_property: signer.getChainId() => Promise<number> @<Signer-getChainId> @SRC<abstract-signer>
Returns ths chain ID this wallet is connected to.
Returns the chain ID this wallet is connected to.
_property: signer.getGasPrice() => Promise<[[BigNumber]]> @<Signer-getGasPrice> @SRC<abstract-signer>
Returns the current gas price.
@@ -121,7 +121,7 @@ properties such as the //provider// and //address// static throughout the
life-cycle of the Signer helps prevent serious issues and many other classes
and libraries make this assumption.
A sub-class **must** extend Sigenr and **must** call ``super()``.
A sub-class **must** extend Signer and **must** call ``super()``.
_property: signer.checkTransaction(transactionRequest) => [[providers-TransactionRequest]] @<Signer-checkTransaction> @SRC<abstract-signer>
This is generally not required to be overridden, but may needed to provide
@@ -197,7 +197,7 @@ The provider this wallet is connected to, which will ge used for any [[Signer--b
methods. This can be null.
_note: Note
A **Wallet** instance is immuatable, so if you wish to change the Provider, you
A **Wallet** instance is immutable, so if you wish to change the Provider, you
may use the [connect](Signer-connect) method to create a new instance connected
to the desired provider.

View File

@@ -12,12 +12,12 @@ The **JSON ABI Format** is the format that is
A JSON serialized object is always a string, which represents an Array
of Objects, where each Object has various properties describing the [[Fragment]] of the ABI.
The deserialied JSON string (which is a normal JavaScript Object) may
The deserialized JSON string (which is a normal JavaScript Object) may
also be passed into any function which accepts a JSON String ABI.
_heading: Humanb-Readable ABI
The Human-Readable ABI was
The Human-Readable ABI was @TODO
[article](link-ricmoo-humanreadableabi)

View File

@@ -45,7 +45,7 @@ _property: ethers.utils.getAddress(address) => string<[[address]]> @<utils-getA
Returns //address// as a Checksum Address.
If //address// is an invalid 40-nibble [[HexString]] or if it contains mixed case and
the checksum is invalid, an InvalidArgument Error is throw.
the checksum is invalid, an InvalidArgument Error is thrown.
The value of //address// may be any supported address format.

View File

@@ -153,7 +153,7 @@ Returns true if and only if the value of //BigNumber// **>** //otherValue//.
_property: BigNumber.gte(otherValue) => boolean @SRC<bignumber>
Returns true if and only if the value of //BigNumber// **&ge;** //otherValue//.
_property: BigNumber.isZero() => boolean @SRC<bignumber>
_property: BigNumber.isZero() => boolean @SRC<bignumber:BigNumber.isZero>
Returns true if and only if the value of //BigNumber// is zero.

View File

@@ -49,6 +49,12 @@ _property: fixednumber.round([ decimals = 0 ]) => [[FixedNumber]] @SRC<bignumbe
Returns a new FixedNumber with the value of //fixedvalue// rounded to //decimals//.
_heading: Comparison and Equivalence
_property: FixedNumber.isZero() => boolean @SRC<bignumber/fixednumber:FixedNumber.isZero>
Returns true if and only if the value of //FixedNumber// is zero.
_heading: Conversion
_property: fixednumber.toFormat(format) => [[FixedNumber]] @SRC<bignumber/fixednumber>

View File

@@ -27,7 +27,7 @@ If a topic-set is a single topic, a log topic in that position must match
**that topic**.
If a topic-set is an array of topics, a log topic in that position must
match any **one** of topics (i.e. the topic in thie position are ``OR``-ed).
match any **one** of the topics (i.e. the topic in this position are ``OR``-ed).
_table: Example Log Matching @style<full>

View File

@@ -12,7 +12,7 @@ much stronger security.
The algorithm usually used for this process is [scrypt](link-wiki-scrypt),
which is a memory and CPU intensive algorithm which computes
a key (fixed-length psudo-random series of bytes) for a given
a key (fixed-length pseudo-random series of bytes) for a given
password.
@@ -50,7 +50,7 @@ progress callback which will be periodically called with a number between
In general a progress bar makes the experience feel faster, as well as
more comfortable since there is a clear indication how much (relative) time
is remaining. Additionally, using language like //"decrpyting..."// in
is remaining. Additionally, using language like //"decrypting..."// in
a progress bar makes a user feel like there time is not being //needlessly//
wasted.

View File

@@ -54,7 +54,7 @@ function getDefinitions(source) {
const getSourceUrl = (function(path, include, exclude) {
console.log("Scanning TypeScript Sources...");
const Link = "https://github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages$FILENAME#L$LINE";
const Link = "https://github.com/ethers-io/ethers.js/blob/master/packages$FILENAME#L$LINE";
const Root = resolve(__dirname, path);
const readdir = function(path) {
@@ -151,16 +151,16 @@ function codeContextify(context) {
module.exports = {
title: "ethers",
subtitle: "v5.0-beta",
subtitle: "v5.0",
logo: "logo.svg",
prefix: "/v5",
link: "https:/\/docs-beta.ethers.io",
link: "https:/\/docs.ethers.io",
copyright: "The content of this site is licensed under the [Creative Commons License](https:/\/choosealicense.com/licenses/cc-by-4.0/). Generated on &$now;.",
markdown: {
"banner": "-----\n\nDocumentation: [html](https://docs-beta.ethers.io/)\n\n-----\n\n"
"banner": "-----\n\nDocumentation: [html](https://docs.ethers.io/)\n\n-----\n\n"
},
codeContextify: codeContextify,
@@ -217,7 +217,7 @@ module.exports = {
"link-ethers-docs": "https:/\/docs.ethers.io/",
"link-ethers-js": "https:/\/cdn.ethers.io/lib/ethers-5.0.esm.min.js",
"link-ethers-npm": "https:/\/www.npmjs.com/search?q=%40ethersproject%2F",
"link-ethers-asm-grammar": "https:/\/github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages/asm/grammar.jison",
"link-ethers-asm-grammar": "https:/\/github.com/ethers-io/ethers.js/blob/master/packages/asm/grammar.jison",
"link-eip-155": { name: "EIP-155", url: "https:/\/eips.ethereum.org/EIPS/eip-155" },
"link-eip-191": { name: "EIP-191", url: "https:/\/eips.ethereum.org/EIPS/eip-191" },

View File

@@ -38,8 +38,10 @@ Web Applications from our CDN.
_code: ES6 in the Browser @lang<html>
<script src="https://cdn.ethers.io/lib/ethers-5.0.esm.min.js"
type="application/javascipt"></script>
<script type="module">
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.0.esm.min.js";
// Your code here...
</script>
_code: ES3 (UMD) in the Browser @lang<html>
@@ -78,7 +80,7 @@ Ethereum is to use [[link-metamask]], which is a browser extension
that provides:
- A connection to the Ethereum network (a [[Provider]])
- Holds your private key and can sign thing (a [[Signer]])
- Holds your private key and can sign things (a [[Signer]])
_code: Connecting to Metamask @lang<script>

View File

@@ -99,14 +99,14 @@ interface.functions.transfer.encode(to, amount)
interface.functions.transfer.decode(callData)
// v5
interface.encodeData("transfer", [ to, amount ])
interface.decodeResult("transfer", data)
interface.encodeFunctionData("transfer", [ to, amount ])
interface.decodeFunctionResult("transfer", data)
// Or you can use any compatible signature or Fragment objects.
// Notice that signature normalization is performed for you,
// e.g. "uint" and "uint256" will be automatically converted
interface.encodeData("transfer(address,uint)", [ to, amount ])
interface.decodeResult("transfer(address to, uint256 amount)", data)
interface.encodeFunctionData("transfer(address,uint)", [ to, amount ])
interface.decodeFunctionResult("transfer(address to, uint256 amount)", data)
_heading: Events
@@ -119,7 +119,7 @@ interface.events.Transfer.decode(data, topics)
// v5
interface.encodeFilterTopics("Transfer", values)
interface.encodeEventLog("Transfer", data, topics)
interface.decodeEventLog("Transfer", data, topics)
_heading: Inspection

View File

@@ -1,13 +1,172 @@
_section: Migration: From Web3.js
TODO
_subsection: Contracts
This migration guide focuses on migrating web3.js version 1.2.9 to ethers.js v5.
_subsection: Providers
In ethers, a provider provides an abstraction for a connection to the Ethereum Network. It can be used to issue read only queries and send signed state changing transactions to the Ethereum Network.
_heading: Connecting to Ethereum
_code: @lang<script>
// web3
var Web3 = require('web3');
var web3 = new Web3('http://localhost:8545');
// ethers
var ethers = require('ethers');
const url = "http://127.0.0.1:8545";
const provider = new ethers.providers.JsonRpcProvider(url);
_heading: Connecting to Ethereum: Metamask
_code: @lang<script>
// web3
const web3 = new Web3(Web3.givenProvider);
// ethers
import { ethers } from "./dist/ethers.esm.js";
const provider = new ethers.providers.Web3Provider(window.ethereum);
_subsection: Signers
In ethers, a **signer** is an abstraction of an Ethereum Account. It can be used to sign messages and transactions and send signed transactions to the Ethereum Network.
In web3, an account can be used to sign messages and transactions.
_heading: Creating signer
_code: @lang<script>
// web3
const account = web3.eth.accounts.create();
// ethers
const signer = ethers.Wallet.createRandom();
// getting signer from JSON RPC providers
const signer = provider.getSigner();
_heading: Signing a message
_code: @lang<script>
// web3
let signature = web3.eth.accounts.sign('Some data', privateKey);
// ethers
let signature = await signer.signMessage('Some data');
_subsection: Contracts
A contract object is an abstraction of a smart contract on the Ethereum Network. It allows for easy interaction with the smart contact.
_heading: Deploying a Contract
_code: @lang<script>
// web3
const contract = new web3.eth.Contract(abi);
contract.deploy({
data: bytecode,
arguments: ["my string"]
})
.send({
from: "0x12598d2Fd88B420ED571beFDA8dD112624B5E730",
gas: 150000,
gasPrice: "30000000000000"
}), function(error, transactionHash){ ... })
.then(function(newContract){
console.log('new contract', newContract.options.address)
});
// ethers
const signer = provider.getSigner();
const factory = new ethers.ContractFactory(abi, bytecode, signer);
const contract = await factory.deploy("hello world");
console.log('contract address', contract.address);
// wait for contract creation transaction to be mined
await contract.deployTransaction.wait();
_heading: Interacting with a Contract
_code: @lang<script>
// web3
const contract = new web3.eth.Contract(abi, contractAddress);
// read only query
contract.methods.getValue().call();
// state changing operation
contract.methods.changeValue(42).send({from: ....})
.on('receipt', function(){
...
});
// ethers
// pass a provider when initiating a contract for read only queries
const contract = new ethers.Contract(contractAddress, abi, provider);
const value = await contract.getValue();
// pass a signer to create a contract instance for state changing operations
const contract = new ethers.Contract(contractAddress, abi, signer);
const tx = await contract.changeValue(33);
// wait for the transaction to be mined
const receipt = await tx.wait();
_heading: Overloaded Functions
Overloaded functions are functions that have the same name but different parameter types. In ethers, the syntax to call an overloaded contract function is different from the non-overloaded function. This section shows the differences between web3 and ethers when calling overloaded functions. See [issue #407](https://github.com/ethers-io/ethers.js/issues/407) for more details.
_code: @lang<script>
// web3
const message = await contract.methods.getMessage('nice').call();
console.log('message', message);
// ethers
const abi = ['function getMessage(string memory prefix) public view returns (string memory)',
'function getMessage() public view returns (string memory)'];
const contract = new ethers.Contract(address, abi, signer);
// this is how ethers identifies which function to call for overloaded functions
const message = await contract['getMessage(string)']('nice');
console.log('message', message);
_subsection: Numbers
_heading: BigNumber
Convert to BigNumber:
_code: @lang<script>
// web3
const bn = web3.utils.toBN('123456');
// ethers
const bn = ethers.BigNumber.from(123456);
_subsection: Utilities
_heading: Hash
Computing Keccak256 hash of a UTF-8 string in web3 and ethers:
_code: @lang<script>
// web3
web3.utils.sha3('hello world');
web3.utils.keccak256('hello world');
// ethers
ethers.utils.id('hello world')

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -80,6 +80,7 @@ Developer Documentation
* [IpcProvider](api/providers/other)
* [UrlJsonRpcProvider](api/providers/other)
* [Web3Provider](api/providers/other)
* [WebSocketProvider](api/providers/other)
* [Types](api/providers/types)
* [BlockTag](api/providers/types)
* [Network](api/providers/types)
@@ -235,6 +236,8 @@ Developer Documentation
* [Testing](testing)
* [Contributing and Hacking](contributing)
* [Building](contributing)
* [Making your changes](contributing)
* [Documentation](contributing)
* [Flatworm Docs](documentation)
* [Fragments](documentation)
* [Markdown](documentation)

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -54,6 +54,7 @@ Application Programming Interface
* [IpcProvider](providers/other)
* [UrlJsonRpcProvider](providers/other)
* [Web3Provider](providers/other)
* [WebSocketProvider](providers/other)
* [Types](providers/types)
* [BlockTag](providers/types)
* [Network](providers/types)

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -52,9 +52,9 @@ Returns the unsigned transaction which would deploy this Contract with *args* pa
#### *contractFactory* . **deploy**( ...args ) => *Promise< [Contract](/v5/api/contract/contract/) >*
Uses the signer to deploy the Contract with *args* passed into tgee constructor and retruns a Contract which is attached to the address where this contract **will** be deployed once the transction is mined.
Uses the signer to deploy the Contract with *args* passed into the constructor and retruns a Contract which is attached to the address where this contract **will** be deployed once the transaction is mined.
The transction can be found at `contract.deployTransaction`, and no interactions should be made until the transaction is mined.
The transaction can be found at `contract.deployTransaction`, and no interactions should be made until the transaction is mined.
```
@@ -86,7 +86,7 @@ contract.deployTransaction
contract.deployTransaction.wait()
//!
// Now the contract is safe to ineract with
// Now the contract is safe to interact with
contract.value()
//!
```

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -25,7 +25,7 @@ Returns a new instance of the Contract, but connected to *providerOrSigner*.
By passing in a [Provider](/v5/api/providers/provider/), this will return a downgraded **Contract** which only has read-only access (i.e. constant calls).
By passing in a [Signer](/v5/api/signer/#Signer). the will return a **Contract** which will act on behalf of that signer.
By passing in a [Signer](/v5/api/signer/#Signer). this will return a **Contract** which will act on behalf of that signer.
Properties
@@ -121,7 +121,7 @@ The type of the result depends on the ABI.
For values that have a simple meaning in JavaScript, the types are fairly straight forward; strings and booleans are returned as JavaScript strings and booleans.
For numbers, if the **type** is in the JavaSsript safe range (i.e. less than 53 bits, such as an `int24` or `uint48`) a normal JavaScript number is used. Otherwise a [BigNumber](/v5/api/utils/bignumber/) is returned.
For numbers, if the **type** is in the JavaScript safe range (i.e. less than 53 bits, such as an `int24` or `uint48`) a normal JavaScript number is used. Otherwise a [BigNumber](/v5/api/utils/bignumber/) is returned.
For bytes (both fixed length and dynamic), a [DataHexString](/v5/api/utils/bytes/#DataHexString) is returned.
@@ -156,11 +156,11 @@ Returns the estimate units of gas that would be required to execute the *METHOD_
Returns an [UnsignedTransaction](/v5/api/utils/transactions/#UnsignedTransaction) which represents the transaction that would need to be signed and submitted to the network to execute *METHOD_NAME* with *args* and *overrides*.
#### *contract* . *staticCall* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< any >*
#### *contract* . *callStatic* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< any >*
Rather than executing the state-change of a transaction, it is possible to ask a node to *pretend* that a call is not state-changing and return the result.
This does not actually chagne any state, but is free. This in some cases can be used to determine if a transaction will fail or succeed.
This does not actually change any state, but is free. This in some cases can be used to determine if a transaction will fail or succeed.
This otherwise functions the same as a [Read-Only Method](/v5/api/contract/contract/#Contract--readonly).

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -102,7 +102,7 @@ Returns a new instance of the Contract, but connected to *providerOrSigner*.
By passing in a [Provider](/v5/api/providers/provider/), this will return a downgraded **Contract** which only has read-only access (i.e. constant calls).
By passing in a [Signer](/v5/api/signer/#Signer). the will return a **Contract** which will act on behalf of that signer.
By passing in a [Signer](/v5/api/signer/#Signer). this will return a **Contract** which will act on behalf of that signer.
#### *erc20* . **deployed**( ) => *Promise< Contract >*

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -25,11 +25,11 @@ Option Properties
It is highly recommended for production services that to acquire and specify an API Key for each sercice.
The deafult API Keys used by ethers are shared across all users, so services may throttle all services that are using the default API Keys during periods of load without realizing it.
The default API Keys used by ethers are shared across all users, so services may throttle all services that are using the default API Keys during periods of load without realizing it.
Many services also have monitoring and usage metrics, which are only available if an API Key is specifie. This allows tracking how many requests are being sent and which methods are being used the most.
Many services also have monitoring and usage metrics, which are only available if an API Key is specified. This allows tracking how many requests are being sent and which methods are being used the most.
Some services also provide additional paid features, whichare only available when specifying an API Key.
Some services also provide additional paid features, which are only available when specifying an API Key.
Provider Documentation
@@ -58,6 +58,7 @@ Provider Documentation
* [IpcProvider](other)
* [UrlJsonRpcProvider](other)
* [Web3Provider](other)
* [WebSocketProvider](other)
* [Types](types)
* [BlockTag](types)
* [Network](types)

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -76,6 +76,13 @@ The *network* may be specified as **string** for a common network name, a **numb
The *apiKey* can be a **string** Project ID or an **object** with the properties `projectId` and `projectSecret` to specify a [Project Secret](https://infura.io/docs/gettingStarted/authentication) which can be used on non-public sources (like on a server) to further secure your API access and quotas.
#### *InfuraProvider* . **getWebSocketProvider**( [ network [ , apiKey ] ] ) => *[WebSocketProvider](/v5/api/providers/other/#WebSocketProvider)*
Create a new [WebSocketProvider](/v5/api/providers/other/#WebSocketProvider) using the INFURA web-socket endpoint to connect to *network* with the optional *apiKey*.
The *network* and *apiKey* are specified the same as [the constructor](/v5/api/providers/api-providers/#InfuraProvider).
#### Note: Default API keys
If no *apiKey* is provided, a shared API key will be used, which may result in reduced performance and throttled requests.
@@ -111,6 +118,9 @@ provider = new InfuraProvider("homestead", {
projectId: projectId,
projectSecret: projectSecret
});
// Connect to the INFURA WebSocket endpoints with a WebSocketProvider
provider = InfuraProvider.getWebSocketProvider()
```
AlchemyProvider

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -14,7 +14,7 @@ Connect to a JSON-RPC API located at *url* using the *aNetworkish* network. If *
#### Note: Connecting to a Local Node
Each node implementation is slightly different and may require specific command-line flags, configuration or settings in their UI to enable JSON-RPC, unlock accounrs or expose specific APIs. Please consult their documentation.
Each node implementation is slightly different and may require specific command-line flags, configuration or settings in their UI to enable JSON-RPC, unlock accounts or expose specific APIs. Please consult their documentation.
#### *jsonRpcProvider* . **getSigner**( [ addressOrIndex ] ) => *[JsonRpcSigner](/v5/api/providers/jsonrpc-provider/#JsonRpcSigner)*
@@ -48,12 +48,12 @@ The provider this signer was established from.
#### *signer* . **connectUnchecked**( ) => *[JsonRpcUncheckedSigner](/v5/api/providers/jsonrpc-provider/#UncheckedJsonRpcSigner)*
Returns a new Signer object which does not perform addtional checks when sending a transaction. See [getUncheckedSigner](/v5/api/providers/jsonrpc-provider/#JsonRpcProvider-getUncheckedSigner) for more details.
Returns a new Signer object which does not perform additional checks when sending a transaction. See [getUncheckedSigner](/v5/api/providers/jsonrpc-provider/#JsonRpcProvider-getUncheckedSigner) for more details.
#### *signer* . **sendUncheckedTransaction**( transaction ) => *Promise< string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > > >*
Sends the *transaction* and returns a Promise which resolves to the opacque transaction hash.
Sends the *transaction* and returns a Promise which resolves to the opaque transaction hash.
#### *signer* . **unlock**( password ) => *Promise< boolean >*

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -120,3 +120,13 @@ The *callback* should use the error-first calling semantics, so `(error, result)
This is identical to `sendAsync`. Historically, this used a synchronous web request, but no current browsers support this, so its use this way was deprecated quite a long time ago
WebSocketProvider
-----------------
#### **new ***ethers* . *provider* . **WebSockerProvider**( [ url [ , network ] ] )
Returns a new [WebSocketProvider](/v5/api/providers/other/#WebSocketProvider) connected to *url* as the *network*.
If *url* is unspecified, the default `"ws://localhost:8546"` will be used. If *network* is unspecified, it will be queried from the network.

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -33,7 +33,7 @@ Returns the number of transactions *address* has ever **sent**, as of *blockTag*
```javascript
// Get the balance for an account...
provider.getBalance("ricmoo.firefly.eth");
// { Promise: { BigNumber: "955864037352077165" } }
// { Promise: { BigNumber: "1578527309436018765" } }
// Get the code for a contract...
provider.getCode("registrar.firefly.eth");
@@ -45,7 +45,7 @@ provider.getStorageAt("registrar.firefly.eth", 0)
// Get transaction count of an account...
provider.getTransactionCount("ricmoo.firefly.eth");
// { Promise: 668 }
// { Promise: 673 }
```
Blocks Methods
@@ -96,7 +96,7 @@ provider.getBlockWithTransactions(100004)
// blockHash: '0xf93283571ae16dcecbe1816adc126954a739350cd1523a1559eabeae155fbb63',
// blockNumber: 100004,
// chainId: 0,
// confirmations: 10153796,
// confirmations: 10297123,
// creates: null,
// data: '0x',
// from: '0xcf00A85f3826941e7A25BFcF9Aac575d40410852',
@@ -177,16 +177,16 @@ provider.getNetwork()
// The current block number
provider.getBlockNumber()
// { Promise: 10253799 }
// { Promise: 10397126 }
// Get the current suggested gas price (in wei)...
gasPrice = await provider.getGasPrice()
// { BigNumber: "19470000000" }
// { BigNumber: "19000001123" }
// ...often this gas price is easier to understand or
// display to the user in gwei (giga-wei, or 1e9 wei)
utils.formatUnits(gasPrice, "gwei")
// '19.47'
// '19.000001123'
```
Transactions Methods

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -38,7 +38,7 @@ Returns the balance of this wallet at *blockTag*.
#### *signer* . **getChainId**( ) => *Promise< number >*
Returns ths chain ID this wallet is connected to.
Returns the chain ID this wallet is connected to.
#### *signer* . **getGasPrice**( ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >*
@@ -177,7 +177,7 @@ The provider this wallet is connected to, which will ge used for any [Blockchain
#### Note
A **Wallet** instance is immuatable, so if you wish to change the Provider, you may use the [connect](/v5/api/signer/#Signer-connect) method to create a new instance connected to the desired provider.
A **Wallet** instance is immutable, so if you wish to change the Provider, you may use the [connect](/v5/api/signer/#Signer-connect) method to create a new instance connected to the desired provider.
#### *wallet* . **publicKey** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 65 > >*
@@ -285,7 +285,7 @@ contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer)
// Get the number of tokens for this account
tokens = await contract.balanceOf(signer.getAddress())
// { BigNumber: "7712595125722568213383" }
// { BigNumber: "9709905125722568213383" }
//
// Pre-flight (check for revert) on DAI from the signer
@@ -302,7 +302,7 @@ contract.callStatic.transfer("donations.ethers.eth", tokens)
// This will fail since it is greater than the token balance
contract.callStatic.transfer("donations.ethers.eth", tokens.add(1))
// Error: call revert exception (method="transfer(address,uint256)", errorSignature="Error(string)", errorArgs=["Dai/insufficient-balance"], reason="Dai/insufficient-balance", code=CALL_EXCEPTION, version=abi/5.0.0-beta.156)
// Error: call revert exception (method="transfer(address,uint256)", errorSignature="Error(string)", errorArgs=["Dai/insufficient-balance"], reason="Dai/insufficient-balance", code=CALL_EXCEPTION, version=abi/5.0.1)
```
ExternallyOwnedAccount

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -21,7 +21,7 @@ Converting and Verifying
Returns *address* as a Checksum Address.
If *address* is an invalid 40-nibble [HexString](/v5/api/utils/bytes/#HexString) or if it contains mixed case and the checksum is invalid, an InvalidArgument Error is throw.
If *address* is an invalid 40-nibble [HexString](/v5/api/utils/bytes/#HexString) or if it contains mixed case and the checksum is invalid, an InvalidArgument Error is thrown.
The value of *address* may be any supported address format.

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -85,7 +85,7 @@ BigNumber.from(42n)
// Numbers outside the safe range fail:
BigNumber.from(Number.MAX_SAFE_INTEGER);
// Error: overflow (fault="overflow", operation="BigNumber.from", value=9007199254740991, code=NUMERIC_FAULT, version=bignumber/5.0.0-beta.139)
// Error: overflow (fault="overflow", operation="BigNumber.from", value=9007199254740991, code=NUMERIC_FAULT, version=bignumber/5.0.3)
```
Methods

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -164,20 +164,20 @@ Return a copy of *array* shuffled using [Fisher-Yates Shuffle](https://en.wikipe
```javascript
utils.randomBytes(8)
// Uint8Array [ 131, 252, 210, 50, 128, 120, 18, 68 ]
// Uint8Array [ 158, 14, 185, 6, 8, 37, 214, 172 ]
const data = [ 1, 2, 3, 4, 5, 6, 7 ];
// Returns a new Array
utils.shuffled(data);
// [
// 7,
// 6,
// 4,
// 2,
// 3,
// 1,
// 5
// 3,
// 4,
// 7,
// 2,
// 5,
// 6
// ]
// The Original is unscathed...

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -68,6 +68,13 @@ Returns a new FixedNumber with the value of *fixedvalue* **/** *otherValue*.
Returns a new FixedNumber with the value of *fixedvalue* rounded to *decimals*.
### Comparison and Equivalence
#### *FixedNumber* . **isZero**( ) => *boolean*
Returns true if and only if the value of *FixedNumber* is zero.
### Conversion
#### *fixednumber* . **toFormat**( format ) => *[FixedNumber](/v5/api/utils/fixednumber/)*

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----
@@ -52,7 +52,7 @@ utils.keccak256("0x1234")
// Do NOT use UTF-8 strings that are not a DataHexstring
utils.keccak256("hello world")
// Error: invalid arrayify value (argument="value", value="hello world", code=INVALID_ARGUMENT, version=bytes/5.0.0-beta.138)
// Error: invalid arrayify value (argument="value", value="hello world", code=INVALID_ARGUMENT, version=bytes/5.0.1)
// If needed, convert strings to bytes first:
utils.keccak256(utils.toUtf8Bytes("hello world"))

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
Documentation: [html](https://docs.ethers.io/)
-----

Some files were not shown because too many files have changed in this diff Show More