diff --git a/docs/README.md b/docs/README.md index 9c79dd8ca..cf5753775 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,66 +7,50 @@ Documentation: [html](https://docs-beta.ethers.io/) Documentation ============= - - What is Ethers? --------------- - -The ethers.js library aims to be a complete and compact library for -interacting with the Ethereum Blockchain and its ecosystem. It was -originally designed for use with [ethers.io](Users/ricmoo/Development/ethers/ethers.js-v5/https:/ethers.io) and -has since expanded into a much more general-purpose library. - - Features -------- - - - -* Keep your private keys in your client, **safe** and sound -* Import and export **JSON wallets** (Geth, Parity and crowdsale) -* Import and export BIP 39 **mnemonic phrases** (12 word backup phrases) and HD Wallets (English, Italian, Japanese, Korean, Simplified Chinese, Traditional Chinese; more coming soon) -* Meta-classes create JavaScript objects from any contract ABI, including **ABIv2** and **Human-Readable ABI** -* Connect to Ethereum nodes over [JSON-RPC](Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethereum/wiki/wiki/JSON-RPC), [INFURA](Users/ricmoo/Development/ethers/ethers.js-v5/https:/infura.io), [Etherscan](Users/ricmoo/Development/ethers/ethers.js-v5/https:/etherscan.io), [Alchemy](Users/ricmoo/Development/ethers/ethers.js-v5/https:/alchemyapi.io), [Cloudflare](Users/ricmoo/Development/ethers/ethers.js-v5/https:/developers.cloudflare.com/distributed-web/ethereum-gateway) or [MetaMask](Users/ricmoo/Development/ethers/ethers.js-v5/https:/metamask.io). -* **ENS names** are first-class citizens; they can be used anywhere an Ethereum addresses can be used -* **Tiny** (~88kb compressed; 284kb uncompressed) -* **Complete** functionality for all your Ethereum needs -* Extensive [documentation](Users/ricmoo/Development/ethers/ethers.js-v5/https:/docs.ethers.io) -* Large collection of **test cases** which are maintained and added to -* Fully **TypeScript** ready, with definition files and full TypeScript source -* **MIT License** (including *ALL* dependencies); completely open source to do with as you please - - Developer Documentation ----------------------- - - * [Getting Started](getting-started) * [Installing](getting-started) * [Importing](getting-started) -* [Concepts](concepts) + * [Common Terminology](getting-started) + * [Connecting to Ethereum: Metamask](getting-started) + * [Contracts](getting-started) + * [Signing Messages](getting-started) +* [Ethereum Basics](concepts) * [Events](concepts/events) * [Solidity Topics](concepts/events) + * [Logs and Filtering](concepts/events) * [Gas](concepts/gas) * [Gas Price](concepts/gas) * [Gas Limit](concepts/gas) + * [Security](concepts/security) + * [Key Derivation Functions](concepts/security) * [Application Programming Interface](api) * [Contract Interaction](api/contract) * [Contract](api/contract/contract) + * [Creating Instances](api/contract/contract) * [Properties](api/contract/contract) * [Methods](api/contract/contract) * [Events](api/contract/contract) * [Meta-Class](api/contract/contract) + * [ContractFactory](api/contract/contract-factory) + * [Creating Instances](api/contract/contract-factory) + * [Properties](api/contract/contract-factory) + * [Methods](api/contract/contract-factory) * [Example: ERC-20 Contract](api/contract/example) * [Connecting to a Contract](api/contract/example) - * [Properties ^^//(inheritted from [[contract]])//^^](api/contract/example) - * [Methods ^^//(inheritted from [[contract]])//^^](api/contract/example) - * [Events ^^//(inheritted from Contract)//^^](api/contract/example) - * [Meta-Class Methods ^^//(added at Runtime)//^^](api/contract/example) - * [Meta-Class Filters ^^//(added at Runtime)//^^](api/contract/example) + * [Properties](api/contract/example) + * [Methods](api/contract/example) + * [Events](api/contract/example) + * [Meta-Class Methods](api/contract/example) + * [Meta-Class Filters](api/contract/example) * [Signers](api/signer) * [Signer](api/signer) * [Wallet](api/signer) @@ -85,11 +69,12 @@ Developer Documentation * [JsonRpcProvider](api/providers/jsonrpc-provider) * [JsonRpcSigner](api/providers/jsonrpc-provider) * [JsonRpcUncheckedSigner](api/providers/jsonrpc-provider) + * [Node-Specific Methods](api/providers/jsonrpc-provider) * [API Providers](api/providers/api-providers) * [EtherscanProvider](api/providers/api-providers) * [InfuraProvider](api/providers/api-providers) * [AlchemyProvider](api/providers/api-providers) - * [CloudfrontProvider](api/providers/api-providers) + * [CloudflareProvider](api/providers/api-providers) * [Other Providers](api/providers/other) * [FallbackProvider](api/providers/other) * [IpcProvider](api/providers/other) @@ -123,7 +108,9 @@ Developer Documentation * [ParamType](api/utils/abi/fragments) * [Addresses](api/utils/address) * [Address Formats](api/utils/address) - * [Functions](api/utils/address) + * [Converting and Verifying](api/utils/address) + * [Derivation](api/utils/address) + * [Contracts Addresses](api/utils/address) * [BigNumber](api/utils/bignumber) * [Types](api/utils/bignumber) * [Creating Instances](api/utils/bignumber) @@ -154,8 +141,9 @@ Developer Documentation * [Methods](api/utils/fixednumber) * [FixedFormat](api/utils/fixednumber) * [Hashing Algorithms](api/utils/hashing) - * [Cryptographic Hashing](api/utils/hashing) - * [Common Hashing Helpers](api/utils/hashing) + * [Cryptographic Hash Functions](api/utils/hashing) + * [HMAC](api/utils/hashing) + * [Hashing Helpers](api/utils/hashing) * [Solidity Hashing Algorithms](api/utils/hashing) * [HD Wallet](api/utils/hdnode) * [Types](api/utils/hdnode) @@ -201,6 +189,10 @@ Developer Documentation * [Nodes](api/other/assembly/ast) * [Hardware Wallets](api/other/hardware) * [LedgerSigner](api/other/hardware) + * [Experimental](api/experimental) + * [BrainWallet](api/experimental) + * [EIP1193Bridge](api/experimental) + * [NonceManager](api/experimental) * [Command Line Interfaces](cli) * [Sandbox Utility](cli/ethers) * [Help](cli/ethers) @@ -240,24 +232,12 @@ Developer Documentation * [Flatworm Docs](documentation) * [Fragments](documentation) * [Markdown](documentation) + * [Code](documentation) + * [Tables](documentation) * [Configuration](documentation) - * [Extended Directive Functions](documentation) + * [Extensions](documentation) * [License and Copyright](license) - Legacy Documentation -------------------- - -This section will be kept up to date, linking to documentation of -older versions of the library. - - - -* [version 4.0](Users/ricmoo/Development/ethers/ethers.js-v5/https:/docs.ethers.io/ethers.js) -* [version 3.0](Users/ricmoo/Development/ethers/ethers.js-v5/https:/docs.ethers.io/ethers.js/v3.0/html) - - - ------ -**Content Hash:** 1ccc27c4ba6e59efa2be69cc0fb345ea9c397f1f4444d08ec13780d0d1a46b60 \ No newline at end of file diff --git a/docs/api/README.md b/docs/api/README.md index ee42e5799..40e558f17 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -7,23 +7,24 @@ Documentation: [html](https://docs-beta.ethers.io/) Application Programming Interface ================================= - -Here... - - * [Contract Interaction](contract) * [Contract](contract/contract) + * [Creating Instances](contract/contract) * [Properties](contract/contract) * [Methods](contract/contract) * [Events](contract/contract) * [Meta-Class](contract/contract) + * [ContractFactory](contract/contract-factory) + * [Creating Instances](contract/contract-factory) + * [Properties](contract/contract-factory) + * [Methods](contract/contract-factory) * [Example: ERC-20 Contract](contract/example) * [Connecting to a Contract](contract/example) - * [Properties ^^//(inheritted from [[contract]])//^^](contract/example) - * [Methods ^^//(inheritted from [[contract]])//^^](contract/example) - * [Events ^^//(inheritted from Contract)//^^](contract/example) - * [Meta-Class Methods ^^//(added at Runtime)//^^](contract/example) - * [Meta-Class Filters ^^//(added at Runtime)//^^](contract/example) + * [Properties](contract/example) + * [Methods](contract/example) + * [Events](contract/example) + * [Meta-Class Methods](contract/example) + * [Meta-Class Filters](contract/example) * [Signers](signer) * [Signer](signer) * [Wallet](signer) @@ -42,11 +43,12 @@ Here... * [JsonRpcProvider](providers/jsonrpc-provider) * [JsonRpcSigner](providers/jsonrpc-provider) * [JsonRpcUncheckedSigner](providers/jsonrpc-provider) + * [Node-Specific Methods](providers/jsonrpc-provider) * [API Providers](providers/api-providers) * [EtherscanProvider](providers/api-providers) * [InfuraProvider](providers/api-providers) * [AlchemyProvider](providers/api-providers) - * [CloudfrontProvider](providers/api-providers) + * [CloudflareProvider](providers/api-providers) * [Other Providers](providers/other) * [FallbackProvider](providers/other) * [IpcProvider](providers/other) @@ -80,7 +82,9 @@ Here... * [ParamType](utils/abi/fragments) * [Addresses](utils/address) * [Address Formats](utils/address) - * [Functions](utils/address) + * [Converting and Verifying](utils/address) + * [Derivation](utils/address) + * [Contracts Addresses](utils/address) * [BigNumber](utils/bignumber) * [Types](utils/bignumber) * [Creating Instances](utils/bignumber) @@ -111,8 +115,9 @@ Here... * [Methods](utils/fixednumber) * [FixedFormat](utils/fixednumber) * [Hashing Algorithms](utils/hashing) - * [Cryptographic Hashing](utils/hashing) - * [Common Hashing Helpers](utils/hashing) + * [Cryptographic Hash Functions](utils/hashing) + * [HMAC](utils/hashing) + * [Hashing Helpers](utils/hashing) * [Solidity Hashing Algorithms](utils/hashing) * [HD Wallet](utils/hdnode) * [Types](utils/hdnode) @@ -158,8 +163,8 @@ Here... * [Nodes](other/assembly/ast) * [Hardware Wallets](other/hardware) * [LedgerSigner](other/hardware) +* [Experimental](experimental) + * [BrainWallet](experimental) + * [EIP1193Bridge](experimental) + * [NonceManager](experimental) - - ------ -**Content Hash:** 792936ddc8c609e435d356c2bfde1adacf9f0b5b708481720f22081f1a61f73d \ No newline at end of file diff --git a/docs/api/contract/README.md b/docs/api/contract/README.md index 78b059730..a15b57542 100644 --- a/docs/api/contract/README.md +++ b/docs/api/contract/README.md @@ -7,24 +7,21 @@ Documentation: [html](https://docs-beta.ethers.io/) Contract Interaction ==================== - -Explain what contracts are... - - * [Contract](contract) + * [Creating Instances](contract) * [Properties](contract) * [Methods](contract) * [Events](contract) * [Meta-Class](contract) +* [ContractFactory](contract-factory) + * [Creating Instances](contract-factory) + * [Properties](contract-factory) + * [Methods](contract-factory) * [Example: ERC-20 Contract](example) * [Connecting to a Contract](example) - * [Properties ^^//(inheritted from [[contract]])//^^](example) - * [Methods ^^//(inheritted from [[contract]])//^^](example) - * [Events ^^//(inheritted from Contract)//^^](example) - * [Meta-Class Methods ^^//(added at Runtime)//^^](example) - * [Meta-Class Filters ^^//(added at Runtime)//^^](example) + * [Properties](example) + * [Methods](example) + * [Events](example) + * [Meta-Class Methods](example) + * [Meta-Class Filters](example) - - ------ -**Content Hash:** f1a5079be018a7b2e6ce8b86a5a191f7a1352b976434766ea16cec21d0ce3b80 \ No newline at end of file diff --git a/docs/api/contract/contract-factory/README.md b/docs/api/contract/contract-factory/README.md new file mode 100644 index 000000000..dfb8c65fd --- /dev/null +++ b/docs/api/contract/contract-factory/README.md @@ -0,0 +1,93 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +ContractFactory +=============== + +Creating Instances +------------------ + +#### **new ***ethers* . **ContractFactory**( interface , bydecode [ , signer ] ) + + + +#### *ContractFactory* . **fromSolidity**( compilerOutput [ , signer ] ) => *[ContractFactory](/api/contract/contract-factory/)* + + + +#### *contractFactory* . **connect**( signer ) => *[Contract](/api/contract/contract/)* + + + +Properties +---------- + +#### *contractFactory* . **interface** => *[Interface](/api/utils/abi/interface/)* + + + +#### *contractFactory* . **bytecode** => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* + + + +#### *contractFactory* . **signer** => *[Signer](/api/signer/#Signer)* + + + +Methods +------- + +#### *contractFactory* . **attach**( address ) => *[Contract](/api/contract/contract/)* + +Return an instance of a [Contract](/api/contract/contract/) attched to *address*. This is the same as using the [Contract constructor](/api/contract/contract/#contract--creating) with *address* and this the the *interface* and *signerOrProvider* passed in when creating the ContractFactory. + + +#### *contractFactory* . **getDeployTransaction**( ...args ) => *[UnsignedTransaction](/api/utils/transactions/#UnsignedTransaction)* + +Returns the unsigned transaction which would deploy this Contract with *args* passed to the Contract's constructor. + + +#### *contractFactory* . **deploy**( ...args ) => *Promise< [Contract](/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. + +The transction can be found at `contract.deployTransaction`, and no interactions should be made until the transaction is mined. + + +``` +// +const signer = ethers.LocalSigner(); +const ContractFactory = ethers.ContractFactory; +// + +// If your contract constructor requires parameters, the ABI +// must include the constructor +const abi = [ + "constructor(address owner, uint256 initialValue)" +]; + +const factory = new ContractFactory(abi, bytecode, signer) + +const contract = await factory.deploy("ricmoo.eth", 42); + +// The address is available immediately, but the contract +// is NOT deployed yet +contract.address +//! + +// The transaction that the signer sent to deploy +contract.deployTransaction +//! + +// Wait until the transaction is mined +contract.deployTransaction.wait() +//! + +// Now the contract is safe to ineract with +contract.value() +//! +``` + diff --git a/docs/api/contract/contract-factory/index.html b/docs/api/contract/contract-factory/index.html new file mode 100644 index 000000000..b50863800 --- /dev/null +++ b/docs/api/contract/contract-factory/index.html @@ -0,0 +1,77 @@ + + + + ContractFactory + + + + +
+ + +

ContractFactory

+

Creating Instances

+
new ethers.ContractFactory( interface , bydecode [ , signer ] )
+
ContractFactory.fromSolidity( compilerOutput [ , signer ] ) ContractFactory
+
contractFactory.connect( signer ) Contract
+

Properties

+
contractFactory.interface Interface
+
contractFactory.bytecode string< DataHexString >
+
contractFactory.signer Signer
+

Methods

+
contractFactory.attach( address ) Contract

Return an instance of a Contract attched to address. This is the same as using the Contract constructor with address and this the the interface and signerOrProvider passed in when creating the ContractFactory.

+ +
contractFactory.getDeployTransaction( ...args ) UnsignedTransaction

Returns the unsigned transaction which would deploy this Contract with args passed to the Contract's constructor.

+ +
contractFactory.deploy( ...args ) Promise< 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.

+ +

The transction can be found at contract.deployTransaction, and no interactions should be made until the transaction is mined.

+ +
Deploying a Contract
// <hide> +const signer = ethers.LocalSigner(); +const ContractFactory = ethers.ContractFactory; +// </hide> + +// If your contract constructor requires parameters, the ABI +// must include the constructor +const abi = [ + "constructor(address owner, uint256 initialValue)" +]; + +const factory = new ContractFactory(abi, bytecode, signer) + +const contract = await factory.deploy("ricmoo.eth", 42); + +// The address is available immediately, but the contract +// is NOT deployed yet +contract.address +//! + +// The transaction that the signer sent to deploy +contract.deployTransaction +//! + +// Wait until the transaction is mined +contract.deployTransaction.wait() +//! + +// Now the contract is safe to ineract with +contract.value() +//!
+ + + +
+ + + diff --git a/docs/api/contract/contract/README.md b/docs/api/contract/contract/README.md index 383f8b660..3557a177d 100644 --- a/docs/api/contract/contract/README.md +++ b/docs/api/contract/contract/README.md @@ -7,278 +7,170 @@ Documentation: [html](https://docs-beta.ethers.io/) Contract ======== +Creating Instances +------------------ + +#### **new ***ethers* . **Contract**( address , abi , signerOrProvider ) + + + +#### *contract* . **attach**( addressOrName ) => *[Contract](/api/contract/contract/)* + +Returns a new instance of the **Contract** attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them. + + +#### *contract* . **connect**( providerOrSigner ) => *[Contract](/api/contract/contract/)* + +Returns a new instance of the Contract, but connected to *providerOrSigner*. + +By passing in a [Provider](/api/providers/provider/), this will return a downgraded **Contract** which only has read-only access (i.e. constant calls). + +By passing in a [Signer](/api/signer/#Signer). the will return a **Contract** which will act on behalf of that signer. Properties ---------- - - -#### *contract* . **address** **=>** *string< [Address](../../utils/address) >* +#### *contract* . **address** => *string< [Address](/api/utils/address/#address) >* This is the address (or ENS name) the contract was constructed with. +#### *contract* . **resolvedAddress** => *string< [Address](/api/utils/address/#address) >* + +This is a promise that will resolve to the address the **Contract** object is attached to. If an [Address](/api/utils/address/#address) was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address. -#### *contract* . **addressPromise** **=>** *string< [Address](../../utils/address) >* +#### *contract* . **deployTransaction** => *[TransactionResponse](/api/providers/types/#providers-TransactionResponse)* -This is a promise that will resolve to the address the **Contract** -object is attached to. If an [Address](../../utils/address) was provided to the constructor, -it will be equal to this; if an ENS name was provided, this will be the -resolved address. +If the **Contract** object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract. +#### *contract* . **interface** => *[Interface](/api/utils/abi/interface/)* + +This is the ABI as an [Interface](/api/utils/abi/interface/). -#### *contract* . **deployTransaction** **=>** *[TransactionResponse](../../providers/types)* +#### *contract* . **provider** => *[Provider](/api/providers/provider/)* -If the **Contract** object is the result of a ContractFactory deployment, -this is the transaction which was used to deploy the contract. +If a provider was provided to the constructor, this is that provider. If a signer was provided that had a [Provider](/api/providers/provider/), this is that provider. - - -#### *contract* . **interface** **=>** *[Interface](../../utils/abi/interface)* - -This is the ABI as an [Interface](../../utils/abi/interface). - - - - -#### *contract* . **provider** **=>** *[Provider](../../providers/provider)* - -If a provider was provided to the constructor, this is that provider. If -a signer was provided that had a [Provider](../../providers/provider), this is that provider. - - - - -#### *contract* . **signer** **=>** *[Signer](../../signer)* +#### *contract* . **signer** => *[Signer](/api/signer/#Signer)* If a signer was provided to the constructor, this is that signer. - - Methods ------- - - -#### *contract* . **attach** ( addressOrName ) **=>** *[Contract](./)* - -Returns a new instance of the **Contract** attached to a new -address. This is useful if there are multiple similar or identical -copies of a Contract on the network and you wish to interact with -each of them. - - - - -#### *contract* . **connect** ( providerOrSigner ) **=>** *[Contract](./)* - -Returns a new instance of the Contract, but connected to -*providerOrSigner*. - -By passing in a [Provider](../../providers/provider), this will return a downgraded -**Contract** which only has read-only access (i.e. constant calls). - -By passing in a [Signer](../../signer). the will return a **Contract** which -will act on behalf of that signer. - - - - -#### *contract* . **deployed** ( ) **=>** *Promise< [Contract](./) >* - - - - - - -#### *Contract* . **isIndexed** ( value ) **=>** *boolean* +#### *contract* . **deployed**( ) => *Promise< [Contract](/api/contract/contract/) >* +#### *Contract* . **isIndexed**( value ) => *boolean* Events ------ - - -#### *contract* . **queryFilter** ( event [ , fromBlockOrBlockHash [ , toBlock ] ) **=>** *Promise< Array< Event > >* +#### *contract* . **queryFilter**( event [ , fromBlockOrBlockHash [ , toBlock ] ) => *Promise< Array< Event > >* Return Events that match the *event*. +#### *contract* . **listenerCount**( [ event ] ) => *number* + +Return the number of listeners that are subscribed to *event*. If no event is provided, returns the total count of all events. -#### *contract* . **listenerCount** ( [ event ] ) **=>** *number* - -Return the number of listeners that are subscribed to *event*. If -no event is provided, returns the total count of all events. - - - - -#### *contract* . **listeners** ( event ) **=>** *Array< Listener >* +#### *contract* . **listeners**( event ) => *Array< Listener >* Return a list of listeners that are subscribed to *event*. - - -#### *contract* . **off** ( event , listener ) **=>** *this* +#### *contract* . **off**( event , listener ) => *this* Unsubscribe *listener* to *event*. - - -#### *contract* . **on** ( event , listener ) **=>** *this* +#### *contract* . **on**( event , listener ) => *this* Subscribe to *event* calling *listener* when the event occurs. +#### *contract* . **once**( event , listener ) => *this* + +Subscribe once to *event* calling *listener* when the event occurs. -#### *contract* . **once** ( event , listener ) **=>** *this* - -Subscribe once to *event* calling *listener* when the event -occurs. - - - - -#### *contract* . **removeAllListeners** ( [ event ] ) **=>** *this* - -Unsubscribe all listeners for *event*. If no event is provided, -all events are unsubscribed. - +#### *contract* . **removeAllListeners**( [ event ] ) => *this* +Unsubscribe all listeners for *event*. If no event is provided, all events are unsubscribed. Meta-Class ---------- - -A Meta-Class is a Class which has any of its properties determined -at run-time. The **Contract** object uses a Contract's ABI to -determine what methods are available, so the following sections -describe the generic ways to interact with the properties added -at run-time during the **Contract** constructor. - - ### Read-Only Methods (constant) - -A constant method is read-only and evaluates a small amount of EVM -code against the current blockchain state and can be computed by -asking a single node, which can return a result. It is therefore -free and does not require any ether, but **cannot make changes** to -the blockchain state.. - - -#### *contract* . **METHOD_NAME** ( ...args [ overrides ] ) **=>** *Promise< any >* +#### *contract* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< any >* 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 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](../../utils/bignumber) is returned. +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](/api/utils/bignumber/) is returned. -For bytes (both fixed length and dynamic), a [DataHexstring](../../utils/bytes) is returned. +For bytes (both fixed length and dynamic), a [DataHexString](/api/utils/bytes/#DataHexString) is returned. +#### *contract* . *functions* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< [Result](/api/utils/abi/interface/#Result) >* + +The result will always be a [Result](/api/utils/abi/interface/#Result), even if there is only a single return value type. + +This simplifies frameworks which wish to use the [Contract](/api/contract/contract/) object, since they do not need to inspect the return types to unwrap simplified functions. + +Another use for this method is for error recovery. For example, if a function result is an invalid UTF-8 string, the normal call using the above meta-class function will throw an exception. This allows using the Result access error to access the low-level bytes and reason for the error allowing an alternate UTF-8 error strategy to be used. + +Most developers should not require this. ### Write Methods (non-constant) +#### *contract* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< [TransactionResponse](/api/providers/types/#providers-TransactionResponse) >* -A non-constant method requires a transaction to be signed and requires -payment in the form of a fee to be paid to a miner. This transaction -will be verified by every node on the entire network as well by the -miner who will compute the new state of the blockchain after executing -it against the current state. - -It cannot return a result. If a result is required, it should be logged -using a Solidity event (or EVM log), which can then be queried from the -transaction receipt. - - -#### *contract* . **METHOD_NAME** ( ...args [ , overrides ] ) **=>** *Promise< [TransactionResponse](../../providers/types) >* - -Returns a [TransactionResponse](../../providers/types) for the transaction after -it is sent to the network. This requires the **Contract** has a -signer. - - +Returns a [TransactionResponse](/api/providers/types/#providers-TransactionResponse) for the transaction after it is sent to the network. This requires the **Contract** has a signer. ### Write Methods Analysis +#### *contract* . *estimateGas* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< [BigNumber](/api/utils/bignumber/) >* -There are secveral options to analyze properties and results of a -write method without actually executing it. +Returns the estimate units of gas that would be required to execute the *METHOD_NAME* with *args* and *overrides*. -#### *contract* . *estimate* . **METHOD_NAME** ( ...args [ , overrides ] ) **=>** *Promise< [BigNumber](../../utils/bignumber) >* +#### *contract* . *populateTransaction* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< [UnsignedTx](/api/utils/transactions/#UnsignedTransaction) >* -Returns the estimate units of gas that would be required to -execute the *METHOD_NAME* with *args* and *overrides*. +Returns an [UnsignedTransaction](/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 >* +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. -#### *contract* . *populateTransaction* . **METHOD_NAME** ( ...args [ , overrides ] ) **=>** *Promise< [UnsignedTx](../../utils/transactions) >* - -Returns an [UnsignedTransaction](../../utils/transactions) 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 >* - -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 otherwise functions the same as a [Read-Only Method](./). - +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 otherwise functions the same as a [Read-Only Method](/api/contract/contract/#contract--readonly). ### Event Filters +#### *contract* . *filters* . **EVENT_NAME**( ...args ) => *Filter* -An event filter is made up of topics, which are values logged in a -[Bloom Filter](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Bloom_filter), allowing efficient searching for entries -which match a filter. +Return a filter for *EVENT_NAME*, optionally filtering by additional constraints. + +Only `indexed` event parameters may be filtered. If a parameter is null (or not provided) then any value in that field matches. -#### *contract* . *filters* . **EVENT_NAME** ( ...args ) **=>** *Filter* - -Return a filter for *EVENT_NAME*, optionally filtering by additional -constraints. - -Only `indexed` event parameters may be filtered. If a parameter is -null (or not provided) then any value in that field matches. - - - - - ------ -**Content Hash:** 8f1f64a28b2501d01dcf4b55c405c43096f3a9daca7169a96022000a315b2ef2 \ No newline at end of file diff --git a/docs/api/contract/contract/index.html b/docs/api/contract/contract/index.html index 5383b1561..2f2fcc1bf 100644 --- a/docs/api/contract/contract/index.html +++ b/docs/api/contract/contract/index.html @@ -1,41 +1,116 @@ -Contract

Contract

+ + + + Contract + + + + +
+ -

Properties

+

Contract

Explain contract here...

-
contract . address string< Address >

This is the address (or ENS name) the contract was constructed with.

-
contract . addressPromise string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

-
contract . deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

-
contract . interface Interface

This is the ABI as an Interface.

-
contract . provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

-
contract . signer Signer

If a signer was provided to the constructor, this is that signer.

-

Methods

+

Creating Instances

+
new ethers.Contract( address , abi , signerOrProvider )
+
contract.attach( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

-
contract . attach ( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

-
contract . connect ( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

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 will act on behalf of that signer.

-
contract . deployed ( ) Promise< Contract >

-
Contract . isIndexed ( value ) boolean

-

Events

+
contract.connect( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

-
contract . queryFilter ( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

-
contract . listenerCount ( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

-
contract . listeners ( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

-
contract . off ( event , listener ) this

Unsubscribe listener to event.

-
contract . on ( event , listener ) this

Subscribe to event calling listener when the event occurs.

-
contract . once ( event , listener ) this

Subscribe once to event calling listener when the event occurs.

-
contract . removeAllListeners ( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

-

Meta-Class

-

A Meta-Class is a Class which has any of its properties determined at run-time. The Contract object uses a Contract's ABI to determine what methods are available, so the following sections describe the generic ways to interact with the properties added at run-time during the Contract constructor.

-

Read-Only Methods (constant)

-

A constant method is read-only and evaluates a small amount of EVM code against the current blockchain state and can be computed by asking a single node, which can return a result. It is therefore free and does not require any ether, but cannot make changes to the blockchain state..

-
contract . METHOD_NAME ( ...args [ overrides ] ) Promise< any >

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 is returned.

For bytes (both fixed length and dynamic), a DataHexstring is returned.

-

Write Methods (non-constant)

-

A non-constant method requires a transaction to be signed and requires payment in the form of a fee to be paid to a miner. This transaction will be verified by every node on the entire network as well by the miner who will compute the new state of the blockchain after executing it against the current state.

It cannot return a result. If a result is required, it should be logged using a Solidity event (or EVM log), which can then be queried from the transaction receipt.

-
contract . METHOD_NAME ( ...args [ , overrides ] ) Promise< TransactionResponse >

Returns a TransactionResponse for the transaction after it is sent to the network. This requires the Contract has a signer.

-

Write Methods Analysis

-

There are secveral options to analyze properties and results of a write method without actually executing it.

-
contract . estimate . METHOD_NAME ( ...args [ , overrides ] ) Promise< BigNumber >

Returns the estimate units of gas that would be required to execute the METHOD_NAME with args and overrides.

-
contract . populateTransaction . METHOD_NAME ( ...args [ , overrides ] ) Promise< UnsignedTx >

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//.

-
contract . staticCall . 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 otherwise functions the same as a Read-Only Method.

-

Event Filters

-

An event filter is made up of topics, which are values logged in a Bloom Filter, allowing efficient searching for entries which match a filter.

-
contract . filters . EVENT_NAME ( ...args ) Filter

Return a filter for EVENT_NAME, optionally filtering by additional constraints.

Only indexed event parameters may be filtered. If a parameter is null (or not provided) then any value in that field matches.

\ No newline at end of file +

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 will act on behalf of that signer.

+ +

Properties

+
contract.address string< Address >

This is the address (or ENS name) the contract was constructed with.

+ +
contract.resolvedAddress string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

+ +
contract.deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

+ +
contract.interface Interface

This is the ABI as an Interface.

+ +
contract.provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

+ +
contract.signer Signer

If a signer was provided to the constructor, this is that signer.

+ +

Methods

+
contract.deployed( ) Promise< Contract >
+
Contract.isIndexed( value ) boolean
+

Events

+
contract.queryFilter( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

+ +
contract.listenerCount( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

+ +
contract.listeners( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

+ +
contract.off( event , listener ) this

Unsubscribe listener to event.

+ +
contract.on( event , listener ) this

Subscribe to event calling listener when the event occurs.

+ +
contract.once( event , listener ) this

Subscribe once to event calling listener when the event occurs.

+ +
contract.removeAllListeners( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

+ +

Meta-Class

A Meta-Class is a Class which has any of its properties determined at run-time. The Contract object uses a Contract's ABI to determine what methods are available, so the following sections describe the generic ways to interact with the properties added at run-time during the Contract constructor.

+ +

Read-Only Methods (constant)

A constant method is read-only and evaluates a small amount of EVM code against the current blockchain state and can be computed by asking a single node, which can return a result. It is therefore free and does not require any ether, but cannot make changes to the blockchain state..

+ +
contract.METHOD_NAME( ...args [ , overrides ] ) Promise< any >

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 is returned.

+ +

For bytes (both fixed length and dynamic), a DataHexString is returned.

+ +
contract.functions.METHOD_NAME( ...args [ , overrides ] ) Promise< Result >

The result will always be a Result, even if there is only a single return value type.

+ +

This simplifies frameworks which wish to use the Contract object, since they do not need to inspect the return types to unwrap simplified functions.

+ +

Another use for this method is for error recovery. For example, if a function result is an invalid UTF-8 string, the normal call using the above meta-class function will throw an exception. This allows using the Result access error to access the low-level bytes and reason for the error allowing an alternate UTF-8 error strategy to be used.

+ +

Most developers should not require this.

+ +

Write Methods (non-constant)

A non-constant method requires a transaction to be signed and requires payment in the form of a fee to be paid to a miner. This transaction will be verified by every node on the entire network as well by the miner who will compute the new state of the blockchain after executing it against the current state.

+ +

It cannot return a result. If a result is required, it should be logged using a Solidity event (or EVM log), which can then be queried from the transaction receipt.

+ +
contract.METHOD_NAME( ...args [ , overrides ] ) Promise< TransactionResponse >

Returns a TransactionResponse for the transaction after it is sent to the network. This requires the Contract has a signer.

+ +

Write Methods Analysis

There are secveral options to analyze properties and results of a write method without actually executing it.

+ +
contract.estimateGas.METHOD_NAME( ...args [ , overrides ] ) Promise< BigNumber >

Returns the estimate units of gas that would be required to execute the METHOD_NAME with args and overrides.

+ +
contract.populateTransaction.METHOD_NAME( ...args [ , overrides ] ) Promise< UnsignedTx >

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.

+ +
contract.staticCall.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 otherwise functions the same as a Read-Only Method.

+ +

Event Filters

An event filter is made up of topics, which are values logged in a Bloom Filter, allowing efficient searching for entries which match a filter.

+ +
contract.filters.EVENT_NAME( ...args ) Filter

Return a filter for EVENT_NAME, optionally filtering by additional constraints.

+ +

Only indexed event parameters may be filtered. If a parameter is null (or not provided) then any value in that field matches.

+ +
+ + + +
+ + + diff --git a/docs/api/contract/example/README.md b/docs/api/contract/example/README.md index 13c547196..160a33a79 100644 --- a/docs/api/contract/example/README.md +++ b/docs/api/contract/example/README.md @@ -7,14 +7,10 @@ Documentation: [html](https://docs-beta.ethers.io/) Example: ERC-20 Contract ======================== - - Connecting to a Contract ------------------------ - - -``` +```javascript // A Human-Readable ABI; any supported ABI format could be used const abi = [ // Read-Only Functions @@ -30,13 +26,13 @@ const abi = [ ]; // This can be an address or an ENS name -const address = "demotoken.ethers.eth"; +const address = "dai.tokens.ethers.eth"; -// An example Provider (connceted to testnet) -const provider = ethers.getDefaultProvider("ropsten"); +// An example Provider +const provider = ethers.getDefaultProvider(); // An example Signer -const signer = ethers.Wallet.createRandom(provider); +const signer = ethers.Wallet.createRandom().connect(provider); // Read-Only; By connecting to a Provider, allows: // - Any constant function @@ -52,272 +48,161 @@ const erc20 = new ethers.Contract(address, abi, provider); const erc20_rw = new ethers.Contract(address, abi, signer) ``` - - ### ERC20Contract +#### **new ***ethers* . **Contract**( address , abi , providerOrSigner ) + +See the above code example for creating an Instance which will (in addition to the Contact methods and properties) automatically add the additional properties defined in *abi* to a **Contract** connected to *address* using the *providerOrSigner*. -#### **new** *ethers* . **Contract** ( address , abi , providerOrSigner ) +Properties +---------- -See the above code example for creating an Instance which will -(in addition to the Contact methods and properties) automatically -add the additional properties defined in *abi* to a **Contract** -connected to *address* using the *providerOrSigner*. - - - - -Properties ^(*(inheritted from [Contract](../contract))*) ---------------------------------------------------------- - - - -#### *erc20* . **address** **=>** *string< [Address](../../utils/address) >* +#### *erc20* . **address** => *string< [Address](/api/utils/address/#address) >* This is the address (or ENS name) the contract was constructed with. +#### *erc20* . **resolvedAddress** => *string< [Address](/api/utils/address/#address) >* + +This is a promise that will resolve to the address the **Contract** object is attached to. If an [Address](/api/utils/address/#address) was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address. -#### *erc20* . **addressPromise** **=>** *string< [Address](../../utils/address) >* +#### *erc20* . **deployTransaction** => *[TransactionResponse](/api/providers/types/#providers-TransactionResponse)* -This is a promise that will resolve to the address the **Contract** -object is attached to. If an [Address](../../utils/address) was provided to the constructor, -it will be equal to this; if an ENS name was provided, this will be the -resolved address. +If the **Contract** object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract. +#### *erc20* . **interface** => *[Interface](/api/utils/abi/interface/)* + +This is the ABI as an [Interface](/api/utils/abi/interface/). -#### *erc20* . **deployTransaction** **=>** *[TransactionResponse](../../providers/types)* +#### *erc20* . **provider** => *[Provider](/api/providers/provider/)* -If the **Contract** object is the result of a ContractFactory deployment, -this is the transaction which was used to deploy the contract. +If a provider was provided to the constructor, this is that provider. If a signer was provided that had a [Provider](/api/providers/provider/), this is that provider. - - -#### *erc20* . **interface** **=>** *[Interface](../../utils/abi/interface)* - -This is the ABI as an [Interface](../../utils/abi/interface). - - - - -#### *erc20* . **provider** **=>** *[Provider](../../providers/provider)* - -If a provider was provided to the constructor, this is that provider. If -a signer was provided that had a [Provider](../../providers/provider), this is that provider. - - - - -#### *erc20* . **signer** **=>** *[Signer](../../signer)* +#### *erc20* . **signer** => *[Signer](/api/signer/#Signer)* If a signer was provided to the constructor, this is that signer. +Methods +------- + +#### *erc20* . **attach**( addressOrName ) => *[Contract](/api/contract/contract/)* + +Returns a new instance of the **Contract** attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them. -Methods ^(*(inheritted from [Contract](../contract))*) ------------------------------------------------------- +#### *erc20* . **connect**( providerOrSigner ) => *[Contract](/api/contract/contract/)* + +Returns a new instance of the Contract, but connected to *providerOrSigner*. + +By passing in a [Provider](/api/providers/provider/), this will return a downgraded **Contract** which only has read-only access (i.e. constant calls). + +By passing in a [Signer](/api/signer/#Signer). the will return a **Contract** which will act on behalf of that signer. + + +#### *erc20* . **deployed**( ) => *Promise< Contract >* -#### *erc20* . **attach** ( addressOrName ) **=>** *[Contract](../contract)* - -Returns a new instance of the **Contract** attached to a new -address. This is useful if there are multiple similar or identical -copies of a Contract on the network and you wish to interact with -each of them. +#### *Contract* . **isIndexed**( value ) => *boolean* +Events +------ -#### *erc20* . **connect** ( providerOrSigner ) **=>** *[Contract](../contract)* - -Returns a new instance of the Contract, but connected to -*providerOrSigner*. - -By passing in a [Provider](../../providers/provider), this will return a downgraded -**Contract** which only has read-only access (i.e. constant calls). - -By passing in a [Signer](../../signer). the will return a **Contract** which -will act on behalf of that signer. - - - - -#### *erc20* . **deployed** ( ) **=>** *Promise< Contract >* - - - - - - -#### *Contract* . **isIndexed** ( value ) **=>** *boolean* - - - - - - -Events ^(*(inheritted from Contract)*) --------------------------------------- - - - -#### *erc20* . **queryFilter** ( event [ , fromBlockOrBlockHash [ , toBlock ] ) **=>** *Promise< Array< Event > >* +#### *erc20* . **queryFilter**( event [ , fromBlockOrBlockHash [ , toBlock ] ) => *Promise< Array< Event > >* Return Events that match the *event*. +#### *erc20* . **listenerCount**( [ event ] ) => *number* + +Return the number of listeners that are subscribed to *event*. If no event is provided, returns the total count of all events. -#### *erc20* . **listenerCount** ( [ event ] ) **=>** *number* - -Return the number of listeners that are subscribed to *event*. If -no event is provided, returns the total count of all events. - - - - -#### *erc20* . **listeners** ( event ) **=>** *Array< Listener >* +#### *erc20* . **listeners**( event ) => *Array< Listener >* Return a list of listeners that are subscribed to *event*. - - -#### *erc20* . **off** ( event , listener ) **=>** *this* +#### *erc20* . **off**( event , listener ) => *this* Unsubscribe *listener* to *event*. - - -#### *erc20* . **on** ( event , listener ) **=>** *this* +#### *erc20* . **on**( event , listener ) => *this* Subscribe to *event* calling *listener* when the event occurs. +#### *erc20* . **once**( event , listener ) => *this* + +Subscribe once to *event* calling *listener* when the event occurs. -#### *erc20* . **once** ( event , listener ) **=>** *this* +#### *erc20* . **removeAllListeners**( [ event ] ) => *this* -Subscribe once to *event* calling *listener* when the event -occurs. +Unsubscribe all listeners for *event*. If no event is provided, all events are unsubscribed. +Meta-Class Methods +------------------ + +#### *erc20* . **decimals**( [ overrides ] ) => *Promise< number >* + +Returns the number of decimal places used by this ERC-20 token. This can be used with [parseUnits](/api/utils/display-logic/#utils-parseUnits) when taking input from the user or [formatUnits](utils-formatunits] when displaying the token amounts in the UI. -#### *erc20* . **removeAllListeners** ( [ event ] ) **=>** *this* - -Unsubscribe all listeners for *event*. If no event is provided, -all events are unsubscribed. - - - - -Meta-Class Methods ^(*(added at Runtime)*) ------------------------------------------- - - -Since the Contract is a Meta-Class, the methods available here depend -on the ABI which was passed into the **Contract**. - - -#### *erc20* . **decimals** ( [ overrides ] ) **=>** *Promise< number >* - -Returns the number of decimal places used by this ERC-20 token. This can be -used with [parseUnits](../../utils/display-logic) when taking input from the user or -[formatUnits](utils-formatunits] when displaying the token amounts in the UI. - - - - -#### *erc20* . **getBalance** ( owner [ , overrides ] ) **=>** *Promise< [BigNumber](../../utils/bignumber) >* +#### *erc20* . **getBalance**( owner [ , overrides ] ) => *Promise< [BigNumber](/api/utils/bignumber/) >* Returns the balance of *owner* for this ERC-20 token. - - -#### *erc20* . **symbol** ( [ overrides ] ) **=>** *Promise< string >* +#### *erc20* . **symbol**( [ overrides ] ) => *Promise< string >* Returns the symbol of the token. +#### *erc20_rw* . **transfer**( target , amount [ , overrides ] ) => *Promise< [TransactionResponse](/api/providers/types/#providers-TransactionResponse) >* + +Transfers *amount* tokens to *target* from the current signer. The return value (a boolean) is inaccessible during a write operation using a transaction. Other techniques (such as events) are required if this value is required. On-chain contracts calling the `transfer` function have access to this result, which is why it is possible. -#### *erc20_rw* . **transfer** ( target , amount [ , overrides ] ) **=>** *Promise< [TransactionResponse](../../providers/types) >* +#### *erc20* . *callStatic* . **transfer**( target , amount [ , overrides ] ) => *Promise< boolean >* -Transfers *amount* tokens to *target* from the current signer. -The return value (a boolean) is inaccessible during a write operation -using a transaction. Other techniques (such as events) are required -if this value is required. On-chain contracts calling the `transfer` -function have access to this result, which is why it is possible. - - - - -#### *erc20* . *callStatic* . **transfer** ( target , amount [ , overrides ] ) **=>** *Promise< boolean >* - -Performs a dry-run of transferring *amount* tokens to *target* from -the current signer, without actually signing or sending a transaction. +Performs a dry-run of transferring *amount* tokens to *target* from the current signer, without actually signing or sending a transaction. This can be used to preflight check that a transaction will be successful. +#### *erc20* . *estimateGas* . **transfer**( target , amount [ , overrides ] ) => *Promise< [BigNumber](/api/utils/bignumber/) >* + +Returns an estimate for how many units of gas would be required to transfer *amount* tokens to *target*. -#### *erc20* . *estimate* . **transfer** ( target , amount [ , overrides ] ) **=>** *Promise< [BigNumber](../../utils/bignumber) >* - -Returns an estimate for how many units of gas would be required -to transfer *amount* tokens to *target*. - - - - -#### *erc20* . *populateTransaction* . **transfer** ( target , amount [ , overrides ] ) **=>** *Promise< [UnsignedTx](../../utils/transactions) >* - -Returns an [UnsignedTransaction](../../utils/transactions) which could be signed and submitted -to the network to transaction *amount* tokens to *target*. - +#### *erc20* . *populateTransaction* . **transfer**( target , amount [ , overrides ] ) => *Promise< [UnsignedTx](/api/utils/transactions/#UnsignedTransaction) >* +Returns an [UnsignedTransaction](/api/utils/transactions/#UnsignedTransaction) which could be signed and submitted to the network to transaction *amount* tokens to *target*. #### Note on Estimating and Static Calling -When you perform a static call, the current state is taken into account as -best as Ethereum can determine. There are many cases where this can provide -false positives and false negatives. The eventually consistent model of the -blockchain also means there are certain consistency modes that cannot be -known until an actual transaction is attempted. +When you perform a static call, the current state is taken into account as best as Ethereum can determine. There are many cases where this can provide false positives and false negatives. The eventually consistent model of the blockchain also means there are certain consistency modes that cannot be known until an actual transaction is attempted. +Meta-Class Filters +------------------ + +#### *erc20* . *filters* . **Transafer**( [ fromAddress [ , toAddress ] ] ) => *Filter* + +Returns a new Filter which can be used to [query](/api/contract/example/#erc20-queryfilter) or to [subscribe/unsubscribe to events](/api/contract/example/#erc20-events). + +If *fromAddress* is null or not provided, then any from address matches. If *toAddress* is null or not provided, then any to address matches. -Meta-Class Filters ^(*(added at Runtime)*) ------------------------------------------- - - -Since the Contract is a Meta-Class, the methods available here depend -on the ABI which was passed into the **Contract**. - - -#### *erc20* . *filters* . **Transafer** ( [ fromAddress [ , toAddress ] ] ) **=>** *Filter* - -Returns a new Filter which can be used to [query](./) or -to [subscribe/unsubscribe to events](./). - -If *fromAddress* is null or not provided, then any from address matches. -If *toAddress* is null or not provided, then any to address matches. - - - - - ------ -**Content Hash:** a3d2ad294a2b4b4500d3f80c7a1cdc76420fee234ad271d90f5c609b040e93fa \ No newline at end of file diff --git a/docs/api/contract/example/index.html b/docs/api/contract/example/index.html index 9f99ec47c..d5c6559ea 100644 --- a/docs/api/contract/example/index.html +++ b/docs/api/contract/example/index.html @@ -1,45 +1,133 @@ -Example: ERC-20 Contract

Example: ERC-20 Contract

+ + + + Example: ERC-20 Contract + + + + +
+ -

Connecting to a Contract

+

Example: ERC-20 Contract

+

Connecting to a Contract

+
A simple ERC-20 contract
// A Human-Readable ABI; any supported ABI format could be used +const abi = [ + // Read-Only Functions + "function balanceOf(address owner) view returns (uint256)", + "function decimals() view returns (uint8)", + "function symbol() view returns (string)", -
// A Human-Readable ABI; any supported ABI format could be used
const abi = [
    // Read-Only Functions
    "function balanceOf(address owner) view returns (uint256)",
    "function decimals() view returns (uint8)",
    "function symbol() view returns (string)",

    // Authenticated Functions
    "function transfer(address to, uint amount) returns (boolean)",

    // Events
    "event Transfer(address indexed from, address indexed to, uint amount)"
];

// This can be an address or an ENS name
const address = "demotoken.ethers.eth";

// An example Provider (connceted to testnet)
const provider = ethers.getDefaultProvider("ropsten");

// An example Signer
const signer = ethers.Wallet.createRandom(provider);

// Read-Only; By connecting to a Provider, allows:
// - Any constant function
// - Querying Filters
// - Populating Unsigned Transactions for non-constant methods
// - Estimating Gas for non-constant (as an anonymous sender)
// - Static Calling non-constant methods (as anonymous sender)
const erc20 = new ethers.Contract(address, abi, provider);

// Read-Write; By connecting to a Signer, allows:
// - Everything from Read-Only (except as Signer, not anonymous)
// - Sending transactions for non-constant functions
const erc20_rw = new ethers.Contract(address, abi, signer)
+ // Authenticated Functions + "function transfer(address to, uint amount) returns (boolean)", -

ERC20Contract inherits Contract

+ // Events + "event Transfer(address indexed from, address indexed to, uint amount)" +]; -
new ethers . Contract ( address , abi , providerOrSigner )

See the above code example for creating an Instance which will (in addition to the Contact methods and properties) automatically add the additional properties defined in abi to a Contract connected to address using the providerOrSigner.

-

Properties (inheritted from Contract)

+// This can be an address or an ENS name +const address = "dai.tokens.ethers.eth"; -
erc20 . address string< Address >

This is the address (or ENS name) the contract was constructed with.

-
erc20 . addressPromise string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

-
erc20 . deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

-
erc20 . interface Interface

This is the ABI as an Interface.

-
erc20 . provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

-
erc20 . signer Signer

If a signer was provided to the constructor, this is that signer.

-

Methods (inheritted from Contract)

+// An example Provider +const provider = ethers.getDefaultProvider(); -
erc20 . attach ( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

-
erc20 . connect ( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

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 will act on behalf of that signer.

-
erc20 . deployed ( ) Promise< Contract >

-
Contract . isIndexed ( value ) boolean

-

Events (inheritted from Contract)

+// An example Signer +const signer = ethers.Wallet.createRandom().connect(provider); -
erc20 . queryFilter ( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

-
erc20 . listenerCount ( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

-
erc20 . listeners ( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

-
erc20 . off ( event , listener ) this

Unsubscribe listener to event.

-
erc20 . on ( event , listener ) this

Subscribe to event calling listener when the event occurs.

-
erc20 . once ( event , listener ) this

Subscribe once to event calling listener when the event occurs.

-
erc20 . removeAllListeners ( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

-

Meta-Class Methods (added at Runtime)

-

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

-
erc20 . decimals ( [ overrides ] ) Promise< number >

Returns the number of decimal places used by this ERC-20 token. This can be used with parseUnits when taking input from the user or [formatUnits](utils-formatunits] when displaying the token amounts in the UI.

-
erc20 . getBalance ( owner [ , overrides ] ) Promise< BigNumber >

Returns the balance of owner for this ERC-20 token.

-
erc20 . symbol ( [ overrides ] ) Promise< string >

Returns the symbol of the token.

-
erc20_rw . transfer ( target , amount [ , overrides ] ) Promise< TransactionResponse >

Transfers amount tokens to target from the current signer. The return value (a boolean) is inaccessible during a write operation using a transaction. Other techniques (such as events) are required if this value is required. On-chain contracts calling the transfer function have access to this result, which is why it is possible.

-
erc20 . callStatic . transfer ( target , amount [ , overrides ] ) Promise< boolean >

Performs a dry-run of transferring amount tokens to target from the current signer, without actually signing or sending a transaction.

This can be used to preflight check that a transaction will be successful.

-
erc20 . estimate . transfer ( target , amount [ , overrides ] ) Promise< BigNumber >

Returns an estimate for how many units of gas would be required to transfer amount tokens to target.

-
erc20 . populateTransaction . transfer ( target , amount [ , overrides ] ) Promise< UnsignedTx >

Returns an UnsignedTransaction which could be signed and submitted to the network to transaction amount tokens to target.

-
Note on Estimating and Static Calling

When you perform a static call, the current state is taken into account as best as Ethereum can determine. There are many cases where this can provide false positives and false negatives. The eventually consistent model of the blockchain also means there are certain consistency modes that cannot be known until an actual transaction is attempted.

-

Meta-Class Filters (added at Runtime)

-

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

-
erc20 . filters . Transafer ( [ fromAddress [ , toAddress ] ] ) Filter

Returns a new Filter which can be used to query or to subscribe/unsubscribe to events.

If fromAddress is null or not provided, then any from address matches. If toAddress is null or not provided, then any to address matches.

\ No newline at end of file +// Read-Only; By connecting to a Provider, allows: +// - Any constant function +// - Querying Filters +// - Populating Unsigned Transactions for non-constant methods +// - Estimating Gas for non-constant (as an anonymous sender) +// - Static Calling non-constant methods (as anonymous sender) +const erc20 = new ethers.Contract(address, abi, provider); + +// Read-Write; By connecting to a Signer, allows: +// - Everything from Read-Only (except as Signer, not anonymous) +// - Sending transactions for non-constant functions +const erc20_rw = new ethers.Contract(address, abi, signer)

ERC20Contract inherits Contract

+
new ethers.Contract( address , abi , providerOrSigner )

See the above code example for creating an Instance which will (in addition to the Contact methods and properties) automatically add the additional properties defined in abi to a Contract connected to address using the providerOrSigner.

+ +

Properties(inheritted from Contract)

+
erc20.address string< Address >

This is the address (or ENS name) the contract was constructed with.

+ +
erc20.resolvedAddress string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

+ +
erc20.deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

+ +
erc20.interface Interface

This is the ABI as an Interface.

+ +
erc20.provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

+ +
erc20.signer Signer

If a signer was provided to the constructor, this is that signer.

+ +

Methods(inheritted from Contract)

+
erc20.attach( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

+ +
erc20.connect( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

+ +

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 will act on behalf of that signer.

+ +
erc20.deployed( ) Promise< Contract >
+
Contract.isIndexed( value ) boolean
+

Events(inheritted from Contract)

+
erc20.queryFilter( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

+ +
erc20.listenerCount( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

+ +
erc20.listeners( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

+ +
erc20.off( event , listener ) this

Unsubscribe listener to event.

+ +
erc20.on( event , listener ) this

Subscribe to event calling listener when the event occurs.

+ +
erc20.once( event , listener ) this

Subscribe once to event calling listener when the event occurs.

+ +
erc20.removeAllListeners( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

+ +

Meta-Class Methods(added at Runtime)

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

+ +
erc20.decimals( [ overrides ] ) Promise< number >

Returns the number of decimal places used by this ERC-20 token. This can be used with parseUnits when taking input from the user or [formatUnits](utils-formatunits] when displaying the token amounts in the UI.

+ +
erc20.getBalance( owner [ , overrides ] ) Promise< BigNumber >

Returns the balance of owner for this ERC-20 token.

+ +
erc20.symbol( [ overrides ] ) Promise< string >

Returns the symbol of the token.

+ +
erc20_rw.transfer( target , amount [ , overrides ] ) Promise< TransactionResponse >

Transfers amount tokens to target from the current signer. The return value (a boolean) is inaccessible during a write operation using a transaction. Other techniques (such as events) are required if this value is required. On-chain contracts calling the transfer function have access to this result, which is why it is possible.

+ +
erc20.callStatic.transfer( target , amount [ , overrides ] ) Promise< boolean >

Performs a dry-run of transferring amount tokens to target from the current signer, without actually signing or sending a transaction.

+ +

This can be used to preflight check that a transaction will be successful.

+ +
erc20.estimateGas.transfer( target , amount [ , overrides ] ) Promise< BigNumber >

Returns an estimate for how many units of gas would be required to transfer amount tokens to target.

+ +
erc20.populateTransaction.transfer( target , amount [ , overrides ] ) Promise< UnsignedTx >

Returns an UnsignedTransaction which could be signed and submitted to the network to transaction amount tokens to target.

+ +
Note on Estimating and Static Calling

When you perform a static call, the current state is taken into account as best as Ethereum can determine. There are many cases where this can provide false positives and false negatives. The eventually consistent model of the blockchain also means there are certain consistency modes that cannot be known until an actual transaction is attempted.

+ +

Meta-Class Filters(added at Runtime)

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

+ +
erc20.filters.Transafer( [ fromAddress [ , toAddress ] ] ) Filter

Returns a new Filter which can be used to query or to subscribe/unsubscribe to events.

+ +

If fromAddress is null or not provided, then any from address matches. If toAddress is null or not provided, then any to address matches.

+ +
+ + + +
+ + + diff --git a/docs/api/contract/index.html b/docs/api/contract/index.html index 8fdf00dd3..523c6c39e 100644 --- a/docs/api/contract/index.html +++ b/docs/api/contract/index.html @@ -1,3 +1,33 @@ -Contract Interaction

Contract Interaction

-

Explain what contracts are...

-
Contract
Properties
Methods
Events
Meta-Class
Example: ERC-20 Contract
Connecting to a Contract
Properties ^^//(inheritted from [[contract]])//^^
Methods ^^//(inheritted from [[contract]])//^^
Events ^^//(inheritted from Contract)//^^
Meta-Class Methods ^^//(added at Runtime)//^^
Meta-Class Filters ^^//(added at Runtime)//^^
\ No newline at end of file + + + + Contract Interaction + + + + +
+ + +

Contract Interaction

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 deserialize their results and emitted logs.

+ +

A ContractFactory is an abstraction a contract's bytecode and facilitates deploying a contract.

+ +
Contract
Creating Instances
Properties
Methods
Events
Meta-Class
ContractFactory
Creating Instances
Properties
Methods
Example: ERC-20 Contract
Connecting to a Contract
Properties
Methods
Events
Meta-Class Methods
Meta-Class Filters
+ + + +
+ + + diff --git a/docs/api/experimental/README.md b/docs/api/experimental/README.md new file mode 100644 index 000000000..263a2c972 --- /dev/null +++ b/docs/api/experimental/README.md @@ -0,0 +1,57 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Experimental +============ + +BrainWallet +----------- + +#### *BrainWallet* . **generate**( username , password [ , progressCallback ] ) => *[BrainWallet](/api/experimental/#experimental-brainwallet)* + +Generates a brain wallet, with a slightly improved experience, in which the generated wallet has a mnemonic. + + +#### *BrainWallet* . **generateLegacy**( username , password [ , progressCallback ] ) => *[BrainWallet](/api/experimental/#experimental-brainwallet)* + +Generate a brain wallet which is compatibile with the ethers v3 and earlier. + + +EIP1193Bridge +------------- + +NonceManager +------------ + +#### **new ****NonceManager**( signer ) + +Create a new NonceManager. + + +#### *nonceManager* . **signer** => *[Signer](/api/signer/#Signer)* + +The signer whose nonce is being managed. + + +#### *nonceManager* . **provider** => *[Provider](/api/providers/provider/)* + +The provider associated with the signer. + + +#### *nonceManager* . **setTransactionCount**( count ) => *void* + +Set the current transaction count (nonce) for the signer. + +This may be useful it interacting with the signer outside of using this class. + + +#### *nonceManager* . **increaseTransactionCount**( [ count = 1 ] ) => *void* + +Bump the current transaction count (nonce) by *count*. + +This may be useful it interacting with the signer outside of using this class. + + diff --git a/docs/api/experimental/index.html b/docs/api/experimental/index.html new file mode 100644 index 000000000..153be5db0 --- /dev/null +++ b/docs/api/experimental/index.html @@ -0,0 +1,61 @@ + + + + Experimental + + + + +
+ + +

Experimental

The Experimental package is used for features that are not ready to be included in the base library. The API should not be considered stable and does not follow semver versioning, so applications requiring it should specify the exact version needed.

+ +

BrainWallet inherits Wallet

Ethers removed support for BrainWallets in v4, since they are unsafe and many can be easily guessed, allowing attackers to steal the funds. This class is offered to ensure older systems which used brain wallets can still recover their funds and assets.

+ +
BrainWallet.generate( username , password [ , progressCallback ] ) BrainWallet

Generates a brain wallet, with a slightly improved experience, in which the generated wallet has a mnemonic.

+ +
BrainWallet.generateLegacy( username , password [ , progressCallback ] ) BrainWallet

Generate a brain wallet which is compatibile with the ethers v3 and earlier.

+ +

EIP1193Bridge inherits EventEmitter

The EIP1193Bridge allows a normal Ethers Signer and Provider to be exposed in as a standard EIP-1193 Provider, which may be useful when interacting with other libraries.

+ +

NonceManager inherits Signer

The NonceManager is designed to manage the nonce for a Signer, automatically increasing it as it sends transactions.

+ +

Currently the NonceManager does not handle re-broadcast. If you attempt to send a lot of transactions to the network on a node that does not control that account, the transaction pool may drop your transactions.

+ +

In the future, it'd be nice if the NonceManager remembered transactions and watched for them on the network, rebroadcasting transactions that appear to have been dropped.

+ +

Another future feature will be some sort of failure mode. For example, often a transaction is dependent on another transaction being mined first.

+ +
new NonceManager( signer )

Create a new NonceManager.

+ +
nonceManager.signer Signer

The signer whose nonce is being managed.

+ +
nonceManager.provider Provider

The provider associated with the signer.

+ +
nonceManager.setTransactionCount( count ) void

Set the current transaction count (nonce) for the signer.

+ +

This may be useful it interacting with the signer outside of using this class.

+ +
nonceManager.increaseTransactionCount( [ count = 1 ] ) void

Bump the current transaction count (nonce) by count.

+ +

This may be useful it interacting with the signer outside of using this class.

+ +
+ + + +
+ + + diff --git a/docs/api/index.html b/docs/api/index.html index 562fbaf81..270db378b 100644 --- a/docs/api/index.html +++ b/docs/api/index.html @@ -1,3 +1,31 @@ -Application Programming Interface

Application Programming Interface

-

Here...

-
Contract Interaction
Contract
Properties
Methods
Events
Meta-Class
Example: ERC-20 Contract
Connecting to a Contract
Properties ^^//(inheritted from [[contract]])//^^
Methods ^^//(inheritted from [[contract]])//^^
Events ^^//(inheritted from Contract)//^^
Meta-Class Methods ^^//(added at Runtime)//^^
Meta-Class Filters ^^//(added at Runtime)//^^
Signers
Signer
Wallet
VoidSigner
ExternallyOwnedAccount
Providers
Provider
Accounts Methods
Blocks Methods
Ethereum Naming Service (ENS) Methods
Logs Methods
Network Status Methods
Transactions Methods
Event Emitter Methods
Inspection Methods
JsonRpcProvider
JsonRpcSigner
JsonRpcUncheckedSigner
API Providers
EtherscanProvider
InfuraProvider
AlchemyProvider
CloudfrontProvider
Other Providers
FallbackProvider
IpcProvider
UrlJsonRpcProvider
Web3Provider
Types
BlockTag
Network
Block
Events and Logs
Transactions
Utilities
Application Binary Interface
Interface
Creating Instances
Properties
Formatting
Fragment Access
Signature and Topic Hashes
Encoding Data
Decoding Data
Parsing
Types
Specifying Fragments
Fragments
Formats
Fragment
ConstructorFragment
EventFragment
FunctionFragment
ParamType
Addresses
Address Formats
Functions
BigNumber
Types
Creating Instances
Methods
Notes
Byte Manipulation
Types
Inspection
Converting between Arrays and Hexstrings
Array Manipulation
Hexstring Manipulation
Signature Conversion
Random Bytes
Constants
Bytes
Strings
BigNumber
Display Logic and Input
Units
Functions
Encoding Utilities
Base58
Base64
Recursive-Length Prefix
FixedNumber
Creating Instances
Properties
Methods
FixedFormat
Hashing Algorithms
Cryptographic Hashing
Common Hashing Helpers
Solidity Hashing Algorithms
HD Wallet
Types
HDNode
Other Functions
Logging
Logger
Errors
Log Levels
Property Utilities
Signing Key
Other Functions
Strings
Bytes32String
UTF-8 Strings
UnicodeNormalizationForm
Custom UTF-8 Error Handling
Transactions
Types
Functions
Web Utilities
Wordlists
Wordlist
Languages
Other Libraries
Assembly
Ethers ASM Dialect
Opcodes
Labels
Literals
Comments
Scopes
Data Segment
Links
Stack Placeholders
Evaluation and Excution
Utilities
Assembler
Disassembler
Opcode
Abstract Syntax Tree
Types
Nodes
Hardware Wallets
LedgerSigner
\ No newline at end of file + + + + Application Programming Interface + + + + +
+ + +

Application Programming Interface

An Application Programming Interface (API) is the formal specification of the library.

+ +
Contract Interaction
Contract
Creating Instances
Properties
Methods
Events
Meta-Class
ContractFactory
Creating Instances
Properties
Methods
Example: ERC-20 Contract
Connecting to a Contract
Properties
Methods
Events
Meta-Class Methods
Meta-Class Filters
Signers
Signer
Wallet
VoidSigner
ExternallyOwnedAccount
Providers
Provider
Accounts Methods
Blocks Methods
Ethereum Naming Service (ENS) Methods
Logs Methods
Network Status Methods
Transactions Methods
Event Emitter Methods
Inspection Methods
JsonRpcProvider
JsonRpcSigner
JsonRpcUncheckedSigner
Node-Specific Methods
API Providers
EtherscanProvider
InfuraProvider
AlchemyProvider
CloudflareProvider
Other Providers
FallbackProvider
IpcProvider
UrlJsonRpcProvider
Web3Provider
Types
BlockTag
Network
Block
Events and Logs
Transactions
Utilities
Application Binary Interface
Interface
Creating Instances
Properties
Formatting
Fragment Access
Signature and Topic Hashes
Encoding Data
Decoding Data
Parsing
Types
Specifying Fragments
Fragments
Formats
Fragment
ConstructorFragment
EventFragment
FunctionFragment
ParamType
Addresses
Address Formats
Converting and Verifying
Derivation
Contracts Addresses
BigNumber
Types
Creating Instances
Methods
Notes
Byte Manipulation
Types
Inspection
Converting between Arrays and Hexstrings
Array Manipulation
Hexstring Manipulation
Signature Conversion
Random Bytes
Constants
Bytes
Strings
BigNumber
Display Logic and Input
Units
Functions
Encoding Utilities
Base58
Base64
Recursive-Length Prefix
FixedNumber
Creating Instances
Properties
Methods
FixedFormat
Hashing Algorithms
Cryptographic Hash Functions
HMAC
Hashing Helpers
Solidity Hashing Algorithms
HD Wallet
Types
HDNode
Other Functions
Logging
Logger
Errors
Log Levels
Property Utilities
Signing Key
Other Functions
Strings
Bytes32String
UTF-8 Strings
UnicodeNormalizationForm
Custom UTF-8 Error Handling
Transactions
Types
Functions
Web Utilities
Wordlists
Wordlist
Languages
Other Libraries
Assembly
Ethers ASM Dialect
Opcodes
Labels
Literals
Comments
Scopes
Data Segment
Links
Stack Placeholders
Evaluation and Excution
Utilities
Assembler
Disassembler
Opcode
Abstract Syntax Tree
Types
Nodes
Hardware Wallets
LedgerSigner
Experimental
BrainWallet
EIP1193Bridge
NonceManager
+ + + +
+ + + diff --git a/docs/api/other/README.md b/docs/api/other/README.md index 1f9e5f6f2..a8932b220 100644 --- a/docs/api/other/README.md +++ b/docs/api/other/README.md @@ -7,12 +7,6 @@ Documentation: [html](https://docs-beta.ethers.io/) Other Libraries =============== - -Now that ethers is more modular, it is possible to have additional -ancillary packages, which are not part of the core but optionally -add functionality only needed in certain situations. - - * [Assembly](assembly) * [Ethers ASM Dialect](assembly/dialect) * [Opcodes](assembly/dialect) @@ -34,7 +28,3 @@ add functionality only needed in certain situations. * [Hardware Wallets](hardware) * [LedgerSigner](hardware) - - ------ -**Content Hash:** 90507a9035452f2463c81dc6ce204622750f4781dd52673cf666afae6e607577 \ No newline at end of file diff --git a/docs/api/other/assembly/README.md b/docs/api/other/assembly/README.md index d775a682f..5e537d3ae 100644 --- a/docs/api/other/assembly/README.md +++ b/docs/api/other/assembly/README.md @@ -7,8 +7,6 @@ Documentation: [html](https://docs-beta.ethers.io/) Assembly ======== - - * [Ethers ASM Dialect](dialect) * [Opcodes](dialect) * [Labels](dialect) @@ -27,7 +25,3 @@ Assembly * [Types](ast) * [Nodes](ast) - - ------ -**Content Hash:** c29497e2f7fe90669ffd6c67b0231649074fcb869470caa58750ddbc39905727 \ No newline at end of file diff --git a/docs/api/other/assembly/api/README.md b/docs/api/other/assembly/api/README.md index b0a4d44a8..b9b47913c 100644 --- a/docs/api/other/assembly/api/README.md +++ b/docs/api/other/assembly/api/README.md @@ -7,178 +7,108 @@ Documentation: [html](https://docs-beta.ethers.io/) Utilities ========= - - Assembler --------- +#### *asm* . **parse**( code ) => *[Node](/api/other/assembly/ast/#asm-node)* -The assembler utilities allow parsing and assembling an -[Ethers ASM Dialect](../dialect) source file. +Parse an ethers-format assembly file and return the [Abstract Syntax Tree](/api/other/assembly/ast/). -#### *asm* . **parse** ( code ) **=>** *[Node](../ast)* - -Parse an ethers-format assembly file and return the [Abstract Syntax Tree](../ast). - - - - -#### *asm* . **assemble** ( node ) **=>** *string< [DataHexstring](../../../utils/bytes) >* - -Performs assembly of the [Abstract Syntax Tree](../ast) *node* and return the -resulting bytecode representation. - +#### *asm* . **assemble**( node ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* +Performs assembly of the [Abstract Syntax Tree](/api/other/assembly/ast/) *node* and return the resulting bytecode representation. Disassembler ------------ - -The **Disassembler** utilities make it easy to convert bytecode -into an object which can easily be examined for program structure. - - -#### *asm* . **disassemble** ( bytecode ) **=>** *[Bytecode](./)* +#### *asm* . **disassemble**( bytecode ) => *[Bytecode](/api/other/assembly/api/#asm-bytecode)* Returns an array of Operations given *bytecode*. +#### *asm* . **formatBytecode**( operations ) => *string* - -#### *asm* . **formatBytecode** ( operations ) **=>** *string* - -Create a formatted output of an array of [Operation](./). - - +Create a formatted output of an array of [Operation](/api/other/assembly/api/#asm-operation). ### Bytecode +#### *bytecode* . **getOperation**( offset ) => *[Operation](/api/other/assembly/api/#asm-operation)* -Each arary index represents an operation, collapsing multi-byte operations -(i.e. `PUSH`) into a single operation. - - -#### *bytecode* . **getOperation** ( offset ) **=>** *[Operation](./)* - -Get the operation at a given *offset* into the bytecode. This ensures that -the byte at *offset* is an operation and not data contained within a `PUSH`, -in which case null it returned. - - +Get the operation at a given *offset* into the bytecode. This ensures that the byte at *offset* is an operation and not data contained within a `PUSH`, in which case null it returned. ### Operation - -An **Operation** is a single command from a disassembled bytecode -stream. - - -#### *operation* . **opcode** **=>** *[Opcode](./)* +#### *operation* . **opcode** => *[Opcode](/api/other/assembly/api/#asm-opcode)* The opcode for this Operation. - - -#### *operation* . **offset** **=>** *number* +#### *operation* . **offset** => *number* The offset into the bytecode for this Operation. - - -#### *operation* . **pushValue** **=>** *string< [DataHexstring](../../../utils/bytes) >* +#### *operation* . **pushValue** => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* If the opcode is a `PUSH`, this is the value of that push - - Opcode ------ +#### *asm* . *Opcode* . **from**( valueOrMnemonic ) => *[Opcode](/api/other/assembly/api/#asm-opcode)* - -#### *asm* . *Opcode* . **from** ( valueOrMnemonic ) **=>** *[Opcode](./)* - -Create a new instnace of an Opcode for a given numeric value -(e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1"). - - +Create a new instnace of an Opcode for a given numeric value (e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1"). ### Properties - - -#### *opcode* . **value** **=>** *number* +#### *opcode* . **value** => *number* The value (bytecode as a number) of this opcode. - - -#### *opcode* . **mnemonic** **=>** *string* +#### *opcode* . **mnemonic** => *string* The mnemonic string of this opcode. - - -#### *opcode* . **delta** **=>** *number* +#### *opcode* . **delta** => *number* The number of items this opcode will consume from the stack. - - -#### *opcode* . **alpha** **=>** *number* +#### *opcode* . **alpha** => *number* The number of items this opcode will push onto the stack. - - -#### *opcode* . **doc** **=>** *string* +#### *opcode* . **doc** => *string* A short description of what this opcode does. - - -#### *opcode* . **isMemory** ( ) **=>** *"read"|"write"|"full"* +#### *opcode* . **isMemory**( ) => *"read" | "write" | "full"* Returns true if the opcode accesses memory. - - -#### *opcode* . **isStatic** ( ) **=>** *boolean* +#### *opcode* . **isStatic**( ) => *boolean* Returns true if the opcode cannot change state. - - -#### *opcode* . **isJump** ( ) **=>** *boolean* +#### *opcode* . **isJump**( ) => *boolean* Returns true if the opcode is a jumper operation. +#### *opcode* . **isPush**( ) => *number* + +Returns 0 if the opcode is not a `PUSH*`, or the number of bytes this opcode will push if it is. -#### *opcode* . **isPush** ( ) **=>** *number* - -Returns 0 if the opcode is not a `PUSH*`, or the number -of bytes this opcode will push if it is. - - - - - ------ -**Content Hash:** d71fdeafad470effc353664c161dec6982a9c29b1015a5726fd2a3f576f8e377 \ No newline at end of file diff --git a/docs/api/other/assembly/api/index.html b/docs/api/other/assembly/api/index.html index 99a04f871..05b13a993 100644 --- a/docs/api/other/assembly/api/index.html +++ b/docs/api/other/assembly/api/index.html @@ -1,32 +1,76 @@ -Utilities

Utilities

+ + + + Utilities + + + + +
+ -

Assembler

-

The assembler utilities allow parsing and assembling an Ethers ASM Dialect source file.

-
asm . parse ( code ) Node

Parse an ethers-format assembly file and return the Abstract Syntax Tree.

-
asm . assemble ( node ) string< DataHexstring >

Performs assembly of the Abstract Syntax Tree node and return the resulting bytecode representation.

-

Disassembler

-

The Disassembler utilities make it easy to convert bytecode into an object which can easily be examined for program structure.

-
asm . disassemble ( bytecode ) Bytecode

Returns an array of Operations given bytecode.

-
asm . formatBytecode ( operations ) string

Create a formatted output of an array of Operation.

-

Bytecode inherits Array<Operation>

-

Each arary index represents an operation, collapsing multi-byte operations (i.e. PUSH) into a single operation.

-
bytecode . getOperation ( offset ) Operation

Get the operation at a given offset into the bytecode. This ensures that the byte at offset is an operation and not data contained within a PUSH, in which case null it returned.

-

Operation

-

An Operation is a single command from a disassembled bytecode stream.

-
operation . opcode Opcode

The opcode for this Operation.

-
operation . offset number

The offset into the bytecode for this Operation.

-
operation . pushValue string< DataHexstring >

If the opcode is a PUSH, this is the value of that push

-

Opcode

+

Utilities

+

Assembler

The assembler utilities allow parsing and assembling an Ethers ASM Dialect source file.

-
asm . Opcode . from ( valueOrMnemonic ) Opcode

Create a new instnace of an Opcode for a given numeric value (e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1").

-

Properties

+
asm.parse( code ) Node

Parse an ethers-format assembly file and return the Abstract Syntax Tree.

-
opcode . value number

The value (bytecode as a number) of this opcode.

-
opcode . mnemonic string

The mnemonic string of this opcode.

-
opcode . delta number

The number of items this opcode will consume from the stack.

-
opcode . alpha number

The number of items this opcode will push onto the stack.

-
opcode . doc string

A short description of what this opcode does.

-
opcode . isMemory ( ) "read"  |  "write"  |  "full"

Returns true if the opcode accesses memory.

-
opcode . isStatic ( ) boolean

Returns true if the opcode cannot change state.

-
opcode . isJump ( ) boolean

Returns true if the opcode is a jumper operation.

-
opcode . isPush ( ) number

Returns 0 if the opcode is not a PUSH*, or the number of bytes this opcode will push if it is.

\ No newline at end of file +
asm.assemble( node ) string< DataHexString >

Performs assembly of the Abstract Syntax Tree node and return the resulting bytecode representation.

+ +

Disassembler

The Disassembler utilities make it easy to convert bytecode into an object which can easily be examined for program structure.

+ +
asm.disassemble( bytecode ) Bytecode

Returns an array of Operations given bytecode.

+ +
asm.formatBytecode( operations ) string

Create a formatted output of an array of Operation.

+ +

Bytecode inherits Array<Operation>

Each arary index represents an operation, collapsing multi-byte operations (i.e. PUSH) into a single operation.

+ +
bytecode.getOperation( offset ) Operation

Get the operation at a given offset into the bytecode. This ensures that the byte at offset is an operation and not data contained within a PUSH, in which case null it returned.

+ +

Operation

An Operation is a single command from a disassembled bytecode stream.

+ +
operation.opcode Opcode

The opcode for this Operation.

+ +
operation.offset number

The offset into the bytecode for this Operation.

+ +
operation.pushValue string< DataHexString >

If the opcode is a PUSH, this is the value of that push

+ +

Opcode

+
asm.Opcode.from( valueOrMnemonic ) Opcode

Create a new instnace of an Opcode for a given numeric value (e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1").

+ +

Properties

+
opcode.value number

The value (bytecode as a number) of this opcode.

+ +
opcode.mnemonic string

The mnemonic string of this opcode.

+ +
opcode.delta number

The number of items this opcode will consume from the stack.

+ +
opcode.alpha number

The number of items this opcode will push onto the stack.

+ +
opcode.doc string

A short description of what this opcode does.

+ +
opcode.isMemory( ) "read" | "write" | "full"

Returns true if the opcode accesses memory.

+ +
opcode.isStatic( ) boolean

Returns true if the opcode cannot change state.

+ +
opcode.isJump( ) boolean

Returns true if the opcode is a jumper operation.

+ +
opcode.isPush( ) number

Returns 0 if the opcode is not a PUSH*, or the number of bytes this opcode will push if it is.

+ +
+ + + +
+ + + diff --git a/docs/api/other/assembly/ast/README.md b/docs/api/other/assembly/ast/README.md index b0ad26a95..8db990ba2 100644 --- a/docs/api/other/assembly/ast/README.md +++ b/docs/api/other/assembly/ast/README.md @@ -7,245 +7,125 @@ Documentation: [html](https://docs-beta.ethers.io/) Abstract Syntax Tree ==================== - -Parsing a file using the [Ethers ASM Dialect](../dialect) will -generate an Abstract Syntax Tree. The root node will always -be a [ScopeNode](./) whose name is `_`. - -To parse a file into an Abstract Syntax tree, use the [parse](../api) -function. - - Types ----- - - ### Location - - -#### **offset** **=>** *number* +#### **offset** => *number* The offset into the source code to the start of this node. - - -#### **length** **=>** *number* +#### **length** => *number* The length of characters in the source code to the end of this node. - - -#### **source** **=>** *string* +#### **source** => *string* The source code of this node. - - Nodes ----- - -@TODO: Place a diagram here showing the hierarchy - - ### Node - - -#### *node* . **tag** **=>** *string* +#### *node* . **tag** => *string* A unique tag for this node for the lifetime of the process. +#### *node* . **location** => *[Location](/api/other/assembly/ast/#asm-location)* - -#### *node* . **location** **=>** *[Location](./)* - -The source code and location within the source code that this -node represents. - - +The source code and location within the source code that this node represents. ### ValueNode - -A **ValueNode** is a node which may manipulate the stack. - - ### LiteralNode +#### *literalNode* . **value** => *string* + +The literal value of this node, which may be a [DataHexString](/api/utils/bytes/#DataHexString) or string of a decimal number. -#### *literalNode* . **value** **=>** *string* - -The literal value of this node, which may be a [DataHexstring](../../../utils/bytes) or -string of a decimal number. - - - - -#### *literalNode* . **verbatim** **=>** *boolean* - -This is true in a [DataNode](./) context, since in that case the -value should be taken verbatim and no `PUSH` operation shoud be -added, otherwise false. - +#### *literalNode* . **verbatim** => *boolean* +This is true in a [DataNode](/api/other/assembly/ast/#asm-datanode) context, since in that case the value should be taken verbatim and no `PUSH` operation shoud be added, otherwise false. ### PopNode +#### *literalNode* . **index** => *number* -A **PopNode** is used to store a place-holder for an implicit pop from the -stack. It represents the code for an implicit place-holder (i.e. `$$`) or an -explicit place-holder (e.g. `$1`), which indicates the expect stack position -to consume. - - -#### *literalNode* . **index** **=>** *number* - -The index this **PopNode** is representing. For an implicit place-holder -this is `0`. - - +The index this **PopNode** is representing. For an implicit place-holder this is `0`. ### LinkNode - -A **LinkNode** represents a link to another [Node](./)'s data, -for example `$foo` or `#bar`. - - -#### *linkNode* . **label** **=>** *string* +#### *linkNode* . **label** => *string* Te name of the target node. +#### *linkNode* . **type** => *"offset" | "length"* - -#### *linkNode* . **type** **=>** *"offset"|"length"* - -Whether this node is for an offset or a length value of the -target node. - - +Whether this node is for an offset or a length value of the target node. ### OpcodeNode - - -#### *opcodeNode* . **opcode** **=>** *[Opcode](../api)* +#### *opcodeNode* . **opcode** => *[Opcode](/api/other/assembly/api/#asm-opcode)* The opcode for this Node. - - -#### *opcodeNode* . **operands** **=>** *Array< [ValueNode](./) >* +#### *opcodeNode* . **operands** => *Array< [ValueNode](/api/other/assembly/ast/#asm-valuenode) >* A list of all operands passed into this Node. - - ### EvaluationNode +#### *literalNode* . **verbatim** => *boolean* -An **EvaluationNode** is used to execute code and insert the results -but does not generate -any output assembly, using the `{{! code here }}` syntax. +This is true in a [DataNode](/api/other/assembly/ast/#asm-datanode) context, since in that case the value should be taken verbatim and no `PUSH` operation shoud be added, otherwise false. -#### *literalNode* . **verbatim** **=>** *boolean* - -This is true in a [DataNode](./) context, since in that case the -value should be taken verbatim and no `PUSH` operation shoud be -added, otherwise false. - - - - -#### *evaluationNode* . **script** **=>** *string* +#### *evaluationNode* . **script** => *string* The code to evaluate and produce the result to use as a literal. - - ### ExecutionNode - -An **ExecutionNode** is used to execute code but does not generate -any output assembly, using the `{{! code here }}` syntax. - - -#### *evaluationNode* . **script** **=>** *string* +#### *evaluationNode* . **script** => *string* The code to execute. Any result is ignored. - - ### LabelledNode - -A **LabelledNode** is used for any Node that has a name, and can therefore -be targetted by a [LinkNode](./). - - -#### *labelledNode* . **name** **=>** *string* +#### *labelledNode* . **name** => *string* The name of this node. - - ### LabelNode - -A **LabelNode** is used as a place to `JUMP` to by referencing it -name, using `@myLabel:`. A `JUMPDEST` is automatically inserted -at the bytecode offset. - - ### DataNode - -A **DataNode** allows for data to be inserted directly into the output -assembly, using `@myData[ ... ]`. The data is padded if needed to ensure -values that would otherwise be regarded as a `PUSH` value does not impact -anything past the data. - - -#### *dataNode* . **data** **=>** *Array< [ValueNode](./) >* +#### *dataNode* . **data** => *Array< [ValueNode](/api/other/assembly/ast/#asm-valuenode) >* The child nodes, which each represent a verbatim piece of data in insert. - - ### ScopeNode - -A **ScopeNode** allows a new frame of reference that all [LinkNode](./)'s -will use when resolving offset locations, using `@myScope{ ... }`. - - -#### *scopeNode* . **statements** **=>** *Array< [Node](./) >* +#### *scopeNode* . **statements** => *Array< [Node](/api/other/assembly/ast/#asm-node) >* The list of child nodes for this scope. - - - ------ -**Content Hash:** 27350094145eafe8e3b166698c29705f2edee81f6126de4e45d957a7c35a7109 \ No newline at end of file diff --git a/docs/api/other/assembly/ast/index.html b/docs/api/other/assembly/ast/index.html index b323d8a11..5926931df 100644 --- a/docs/api/other/assembly/ast/index.html +++ b/docs/api/other/assembly/ast/index.html @@ -1,50 +1,94 @@ -Abstract Syntax Tree

Abstract Syntax Tree

-

Parsing a file using the Ethers ASM Dialect will generate an Abstract Syntax Tree. The root node will always be a ScopeNode whose name is _.

To parse a file into an Abstract Syntax tree, use the parse function.

-

Types

+ + + + Abstract Syntax Tree + + + + +
+ -

Location

+

Abstract Syntax Tree

Parsing a file using the Ethers ASM Dialect will generate an Abstract Syntax Tree. The root node will always be a ScopeNode whose name is _.

-
offset number

The offset into the source code to the start of this node.

-
length number

The length of characters in the source code to the end of this node.

-
source string

The source code of this node.

-

Nodes

-

@TODO: Place a diagram here showing the hierarchy

-

Node

+

To parse a file into an Abstract Syntax tree, use the parse function.

-
node . tag string

A unique tag for this node for the lifetime of the process.

-
node . location Location

The source code and location within the source code that this node represents.

-

ValueNode inherits Node

-

A ValueNode is a node which may manipulate the stack.

-

LiteralNode inherits ValueNode

+

Types

+

Location

+
offset number

The offset into the source code to the start of this node.

-
literalNode . value string

The literal value of this node, which may be a DataHexstring or string of a decimal number.

-
literalNode . verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

-

PopNode inherits ValueNode

-

A PopNode is used to store a place-holder for an implicit pop from the stack. It represents the code for an implicit place-holder (i.e. $$) or an explicit place-holder (e.g. $1), which indicates the expect stack position to consume.

-
literalNode . index number

The index this PopNode is representing. For an implicit place-holder this is 0.

-

LinkNode inherits ValueNode

-

A LinkNode represents a link to another Node's data, for example $foo or #bar.

-
linkNode . label string

Te name of the target node.

-
linkNode . type "offset"  |  "length"

Whether this node is for an offset or a length value of the target node.

-

OpcodeNode inherits ValueNode

+
length number

The length of characters in the source code to the end of this node.

-
opcodeNode . opcode Opcode

The opcode for this Node.

-
opcodeNode . operands Array< ValueNode >

A list of all operands passed into this Node.

-

EvaluationNode inherits ValueNode

-

An EvaluationNode is used to execute code and insert the results but does not generate any output assembly, using the {{! code here }} syntax.

-
literalNode . verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

-
evaluationNode . script string

The code to evaluate and produce the result to use as a literal.

-

ExecutionNode inherits Node

-

An ExecutionNode is used to execute code but does not generate any output assembly, using the {{! code here }} syntax.

-
evaluationNode . script string

The code to execute. Any result is ignored.

-

LabelledNode inherits Node

-

A LabelledNode is used for any Node that has a name, and can therefore be targetted by a LinkNode.

-
labelledNode . name string

The name of this node.

-

LabelNode inherits LabelledNode

-

A LabelNode is used as a place to JUMP to by referencing it name, using @myLabel:. A JUMPDEST is automatically inserted at the bytecode offset.

-

DataNode inherits LabelledNode

-

A DataNode allows for data to be inserted directly into the output assembly, using @myData[ ... ]. The data is padded if needed to ensure values that would otherwise be regarded as a PUSH value does not impact anything past the data.

-
dataNode . data Array< ValueNode >

The child nodes, which each represent a verbatim piece of data in insert.

-

ScopeNode inherits LabelledNode

-

A ScopeNode allows a new frame of reference that all LinkNode's will use when resolving offset locations, using @myScope{ ... }.

-
scopeNode . statements Array< Node >

The list of child nodes for this scope.

\ No newline at end of file +
source string

The source code of this node.

+ +

Nodes

@TODO: Place a diagram here showing the hierarchy

+ +

Node

+
node.tag string

A unique tag for this node for the lifetime of the process.

+ +
node.location Location

The source code and location within the source code that this node represents.

+ +

ValueNode inherits Node

A ValueNode is a node which may manipulate the stack.

+ +

LiteralNode inherits ValueNode

+
literalNode.value string

The literal value of this node, which may be a DataHexString or string of a decimal number.

+ +
literalNode.verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

+ +

PopNode inherits ValueNode

A PopNode is used to store a place-holder for an implicit pop from the stack. It represents the code for an implicit place-holder (i.e. $$) or an explicit place-holder (e.g. $1), which indicates the expect stack position to consume.

+ +
literalNode.index number

The index this PopNode is representing. For an implicit place-holder this is 0.

+ +

LinkNode inherits ValueNode

A LinkNode represents a link to another Node's data, for example $foo or #bar.

+ +
linkNode.label string

Te name of the target node.

+ +
linkNode.type "offset" | "length"

Whether this node is for an offset or a length value of the target node.

+ +

OpcodeNode inherits ValueNode

+
opcodeNode.opcode Opcode

The opcode for this Node.

+ +
opcodeNode.operands Array< ValueNode >

A list of all operands passed into this Node.

+ +

EvaluationNode inherits ValueNode

An EvaluationNode is used to execute code and insert the results but does not generate any output assembly, using the {{! code here }} syntax.

+ +
literalNode.verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

+ +
evaluationNode.script string

The code to evaluate and produce the result to use as a literal.

+ +

ExecutionNode inherits Node

An ExecutionNode is used to execute code but does not generate any output assembly, using the {{! code here }} syntax.

+ +
evaluationNode.script string

The code to execute. Any result is ignored.

+ +

LabelledNode inherits Node

A LabelledNode is used for any Node that has a name, and can therefore be targetted by a LinkNode.

+ +
labelledNode.name string

The name of this node.

+ +

LabelNode inherits LabelledNode

A LabelNode is used as a place to JUMP to by referencing it name, using @myLabel:. A JUMPDEST is automatically inserted at the bytecode offset.

+ +

DataNode inherits LabelledNode

A DataNode allows for data to be inserted directly into the output assembly, using @myData[ ... ]. The data is padded if needed to ensure values that would otherwise be regarded as a PUSH value does not impact anything past the data.

+ +
dataNode.data Array< ValueNode >

The child nodes, which each represent a verbatim piece of data in insert.

+ +

ScopeNode inherits LabelledNode

A ScopeNode allows a new frame of reference that all LinkNode's will use when resolving offset locations, using @myScope{ ... }.

+ +
scopeNode.statements Array< Node >

The list of child nodes for this scope.

+ +
+ + + +
+ + + diff --git a/docs/api/other/assembly/dialect/README.md b/docs/api/other/assembly/dialect/README.md index d92b8e9e8..7ca00a38a 100644 --- a/docs/api/other/assembly/dialect/README.md +++ b/docs/api/other/assembly/dialect/README.md @@ -7,139 +7,30 @@ Documentation: [html](https://docs-beta.ethers.io/) Ethers ASM Dialect ================== - -This provides a quick, high-level overcview of the **Ethers ASM Dialect** -for EVM, which is defined by the [Ethers ASM Dialect Grammar](../../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages/asm/grammar.jison) - -Once a program is compiled by a higher level langauge into ASM (assembly), -or hand-coded directly in ASM, it needs to be assembled into bytecode. - -The assembly process performs a very small set of operations and is -intentionally simple and closely related to the underlying EVM bytecode. - -Operations include embedding programs within programs (for example the -deployment bootstrap has the runtime embedded in it) and computing the -necessary offsets for jump operations. - -The [Command-Line Assembler](../../../../cli/asm) can be used to assemble an -*Ethers ASM Dialect* file or to disassemble bytecode into its -human-readable (ish) opcodes and literals. - - Opcodes ------- - -An **Opcode** may be provided in either a *functional* or -*instructional* syntax. For Opcodes that require parameters, -the *functional* syntax is recommended and the *instructional* -syntax will raise a warning. - -@TODO: Examples - - Labels ------ - -A **Label** is a position in the program which can be jumped to. A -`JUMPDEST` is automatically added to this point in the assembled -output. - -@TODO: Exmaples - - Literals -------- - -A **Literal** puts data on the stack when executed using a `PUSH` -operation. - -A **Literal** can be provided using a [DataHexstring](../../../utils/bytes) or a decimal -byte value. - -@TODO: exmples - - Comments -------- - -To enter a comment in the **Ethers ASM Dialect**, any text following -a semi-colon (i.e. `;`) is ignored by the assembler. - - Scopes ------ - -A common case in Ethereum is to have one program embedded in another. - -The most common use of this is embedding a Contract **runtime bytecode** -within a **deployment bytecode**, which can be used as **init code**. - -When deploying a program to Ethereum, an **init transaction** is used. An -*init transaction* has a null `to` address and contains bytecode in -the `data`. This `data` bytecode is a program, that when executed -returns some other bytecode as a result, this restul is the bytecode -to be installed. - -Therefore it is important that embedded code uses jumps relative to itself, -not the entire program it is embedded in, which also means that a jump -can **only** target its own scope, no parent or child scopes. This is -enforced by the assembler. - -A scope may access the offset of any child [Data Segment](./) or -child [Scopes](./) (with respect to itself) and may access the length -of any [Data Segment](./) or [Scopes](./) anywhere in the program. - -Every program in the **Ethers ASM Dialect** has a top-leve scope named `_`. - - Data Segment ------------ - -A **Data Segment** allows arbitrary data to be embedded into a program, -which can be useful for lookup tables or deploy-time constants. - -An emtpty **Data Segment** can also be used when a labelled location is -required, but without the `JUMPDEST` which a [Labels](./) adds. - -@TODO: Example - - Links ----- - -A **Link** allows access to a [Scopes](./), [Data Segment](./) or [Labels](./). - -To access the byte offset of a labelled item, use `$foobar`. - -For a [Labels](./), the target must be directly reachable within this scope. For -a [Data Segment](./) or a [Scopes](./), it can be inside the same scope or any -child scope. - -For a [Data Segment](./) or a [Labels](./), there is an additional type of -**Link**, which provides the length of the data or bytecode respectively. A -**Length Link** is accessed by `#foobar` and is pushed on the stack as a -literal. - - Stack Placeholders ------------------ - -@TODO: exampl - - Evaluation and Excution ----------------------- - - - ------ -**Content Hash:** b8f100efb0bd6c794cc6d4ae97c0243e10e6c2fe471cf16ba4e751ed43722bba \ No newline at end of file diff --git a/docs/api/other/assembly/dialect/index.html b/docs/api/other/assembly/dialect/index.html index 8e89f058d..9bac57a7e 100644 --- a/docs/api/other/assembly/dialect/index.html +++ b/docs/api/other/assembly/dialect/index.html @@ -1,20 +1,84 @@ -Ethers ASM Dialect

Ethers ASM Dialect

-

This provides a quick, high-level overcview of the Ethers ASM Dialect for EVM, which is defined by the Ethers ASM Dialect Grammar

Once a program is compiled by a higher level langauge into ASM (assembly), or hand-coded directly in ASM, it needs to be assembled into bytecode.

The assembly process performs a very small set of operations and is intentionally simple and closely related to the underlying EVM bytecode.

Operations include embedding programs within programs (for example the deployment bootstrap has the runtime embedded in it) and computing the necessary offsets for jump operations.

The Command-Line Assembler can be used to assemble an Ethers ASM Dialect file or to disassemble bytecode into its human-readable (ish) opcodes and literals.

-

Opcodes

-

An Opcode may be provided in either a functional or instructional syntax. For Opcodes that require parameters, the functional syntax is recommended and the instructional syntax will raise a warning.

@TODO: Examples

-

Labels

-

A Label is a position in the program which can be jumped to. A JUMPDEST is automatically added to this point in the assembled output.

@TODO: Exmaples

-

Literals

-

A Literal puts data on the stack when executed using a PUSH operation.

A Literal can be provided using a DataHexstring or a decimal byte value.

@TODO: exmples

-

Comments

-

To enter a comment in the Ethers ASM Dialect, any text following a semi-colon (i.e. ;) is ignored by the assembler.

-

Scopes

-

A common case in Ethereum is to have one program embedded in another.

The most common use of this is embedding a Contract runtime bytecode within a deployment bytecode, which can be used as init code.

When deploying a program to Ethereum, an init transaction is used. An init transaction has a null to address and contains bytecode in the data. This data bytecode is a program, that when executed returns some other bytecode as a result, this restul is the bytecode to be installed.

Therefore it is important that embedded code uses jumps relative to itself, not the entire program it is embedded in, which also means that a jump can only target its own scope, no parent or child scopes. This is enforced by the assembler.

A scope may access the offset of any child Data Segment or child Scopes (with respect to itself) and may access the length of any Data Segment or Scopes anywhere in the program.

Every program in the Ethers ASM Dialect has a top-leve scope named _.

-

Data Segment

-

A Data Segment allows arbitrary data to be embedded into a program, which can be useful for lookup tables or deploy-time constants.

An emtpty Data Segment can also be used when a labelled location is required, but without the JUMPDEST which a Labels adds.

@TODO: Example

-

Links

-

A Link allows access to a Scopes, Data Segment or Labels.

To access the byte offset of a labelled item, use $foobar.

For a Labels, the target must be directly reachable within this scope. For a Data Segment or a Scopes, it can be inside the same scope or any child scope.

For a Data Segment or a Labels, there is an additional type of Link, which provides the length of the data or bytecode respectively. A Length Link is accessed by #foobar and is pushed on the stack as a literal.

-

Stack Placeholders

-

@TODO: exampl

-

Evaluation and Excution

-
\ No newline at end of file + + + + Ethers ASM Dialect + + + + +
+ + +

Ethers ASM Dialect

This provides a quick, high-level overcview of the Ethers ASM Dialect for EVM, which is defined by the Ethers ASM Dialect Grammar

+ +

Once a program is compiled by a higher level langauge into ASM (assembly), or hand-coded directly in ASM, it needs to be assembled into bytecode.

+ +

The assembly process performs a very small set of operations and is intentionally simple and closely related to the underlying EVM bytecode.

+ +

Operations include embedding programs within programs (for example the deployment bootstrap has the runtime embedded in it) and computing the necessary offsets for jump operations.

+ +

The Command-Line Assembler can be used to assemble an Ethers ASM Dialect file or to disassemble bytecode into its human-readable (ish) opcodes and literals.

+ +

Opcodes

An Opcode may be provided in either a functional or instructional syntax. For Opcodes that require parameters, the functional syntax is recommended and the instructional syntax will raise a warning.

+ +

@TODO: Examples

+ +

Labels

A Label is a position in the program which can be jumped to. A JUMPDEST is automatically added to this point in the assembled output.

+ +

@TODO: Exmaples

+ +

Literals

A Literal puts data on the stack when executed using a PUSH operation.

+ +

A Literal can be provided using a DataHexString or a decimal byte value.

+ +

@TODO: exmples

+ +

Comments

To enter a comment in the Ethers ASM Dialect, any text following a semi-colon (i.e. ;) is ignored by the assembler.

+ +

Scopes

A common case in Ethereum is to have one program embedded in another.

+ +

The most common use of this is embedding a Contract runtime bytecode within a deployment bytecode, which can be used as init code.

+ +

When deploying a program to Ethereum, an init transaction is used. An init transaction has a null to address and contains bytecode in the data. This data bytecode is a program, that when executed returns some other bytecode as a result, this restul is the bytecode to be installed.

+ +

Therefore it is important that embedded code uses jumps relative to itself, not the entire program it is embedded in, which also means that a jump can only target its own scope, no parent or child scopes. This is enforced by the assembler.

+ +

A scope may access the offset of any child Data Segment or child Scopes (with respect to itself) and may access the length of any Data Segment or Scopes anywhere in the program.

+ +

Every program in the Ethers ASM Dialect has a top-leve scope named _.

+ +

Data Segment

A Data Segment allows arbitrary data to be embedded into a program, which can be useful for lookup tables or deploy-time constants.

+ +

An emtpty Data Segment can also be used when a labelled location is required, but without the JUMPDEST which a Labels adds.

+ +

@TODO: Example

+ +

Links

A Link allows access to a Scopes, Data Segment or Labels.

+ +

To access the byte offset of a labelled item, use $foobar.

+ +

For a Labels, the target must be directly reachable within this scope. For a Data Segment or a Scopes, it can be inside the same scope or any child scope.

+ +

For a Data Segment or a Labels, there is an additional type of Link, which provides the length of the data or bytecode respectively. A Length Link is accessed by #foobar and is pushed on the stack as a literal.

+ +

Stack Placeholders

@TODO: exampl

+ +

Evaluation and Excution

+ + + + +
+ + + diff --git a/docs/api/other/assembly/index.html b/docs/api/other/assembly/index.html index 9b7f0cfa3..fd7ddda0a 100644 --- a/docs/api/other/assembly/index.html +++ b/docs/api/other/assembly/index.html @@ -1,3 +1,31 @@ -Assembly

Assembly

+ + + + Assembly + + + + +
+ -
\ No newline at end of file +

Assembly

This module should still be considered fairly experimental.

+ +
Ethers ASM Dialect
Opcodes
Labels
Literals
Comments
Scopes
Data Segment
Links
Stack Placeholders
Evaluation and Excution
Utilities
Assembler
Disassembler
Opcode
Abstract Syntax Tree
Types
Nodes
+ + + +
+ + + diff --git a/docs/api/other/hardware/README.md b/docs/api/other/hardware/README.md index fc54580b1..c8f69f14a 100644 --- a/docs/api/other/hardware/README.md +++ b/docs/api/other/hardware/README.md @@ -7,31 +7,17 @@ Documentation: [html](https://docs-beta.ethers.io/) Hardware Wallets ================ - - LedgerSigner ------------ - -The [Ledger Hardware Wallets](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/www.ledger.com) are a fairly -popular brand. - -TODO: importing - +``` +import { LedgerSigner } from "@ethersproject/hardware-wallets"; +``` ### API +#### **new ****LedgerSigner**( [ provider [ , type [ , path ] ] ] ) => *[LedgerSigner](/api/other/hardware/#hw-ledger)* + +Connects to a Ledger Hardware Wallet. The *type* if left unspecified is determined by the environment; in node the default is "hid" and in the browser "u2f" is the default. The default Ethereum path is used if *path* is left unspecified. -#### **new** **LedgerSigner** ( [ provider [ , type [ , path ] ] ] ) **=>** *[LedgerSigner](./)* - -Connects to a Ledger Hardware Wallet. The *type* if left unspecified is -determined by the environment; in node the default is "hid" and in the browser -"u2f" is the default. The default Ethereum path is used if *path* is left unspecified. - - - - - ------ -**Content Hash:** 04412211499f34796f91e7112977e6f84607638be72dc600e488df07c4465805 \ No newline at end of file diff --git a/docs/api/other/hardware/index.html b/docs/api/other/hardware/index.html index d11d26a1f..9f59df7a7 100644 --- a/docs/api/other/hardware/index.html +++ b/docs/api/other/hardware/index.html @@ -1,7 +1,35 @@ -Hardware Wallets

Hardware Wallets

+ + + + Hardware Wallets + + + + +
+ -

LedgerSigner inherits Signer

-

The Ledger Hardware Wallets are a fairly popular brand.

TODO: importing

-

API

+

Hardware Wallets

+

LedgerSigner inherits Signer

The Ledger Hardware Wallets are a fairly popular brand.

-
new LedgerSigner ( [ provider [ , type [ , path ] ] ] ) LedgerSigner

Connects to a Ledger Hardware Wallet. The type if left unspecified is determined by the environment; in node the default is "hid" and in the browser "u2f" is the default. The default Ethereum path is used if path is left unspecified.

\ No newline at end of file +
Importing in ES6 or TypeScript
import { LedgerSigner } from "@ethersproject/hardware-wallets";

API

+
new LedgerSigner( [ provider [ , type [ , path ] ] ] ) LedgerSigner

Connects to a Ledger Hardware Wallet. The type if left unspecified is determined by the environment; in node the default is "hid" and in the browser "u2f" is the default. The default Ethereum path is used if path is left unspecified.

+ +
+ + + +
+ + + diff --git a/docs/api/other/index.html b/docs/api/other/index.html index 92a36d9b5..823623517 100644 --- a/docs/api/other/index.html +++ b/docs/api/other/index.html @@ -1,3 +1,31 @@ -Other Libraries

Other Libraries

-

Now that ethers is more modular, it is possible to have additional ancillary packages, which are not part of the core but optionally add functionality only needed in certain situations.

-
Assembly
Ethers ASM Dialect
Opcodes
Labels
Literals
Comments
Scopes
Data Segment
Links
Stack Placeholders
Evaluation and Excution
Utilities
Assembler
Disassembler
Opcode
Abstract Syntax Tree
Types
Nodes
Hardware Wallets
LedgerSigner
\ No newline at end of file + + + + Other Libraries + + + + +
+ + +

Other Libraries

Now that ethers is more modular, it is possible to have additional ancillary packages, which are not part of the core but optionally add functionality only needed in certain situations.

+ +
Assembly
Ethers ASM Dialect
Opcodes
Labels
Literals
Comments
Scopes
Data Segment
Links
Stack Placeholders
Evaluation and Excution
Utilities
Assembler
Disassembler
Opcode
Abstract Syntax Tree
Types
Nodes
Hardware Wallets
LedgerSigner
+ + + +
+ + + diff --git a/docs/api/providers/README.md b/docs/api/providers/README.md index 8dbfd5e81..12541a0fb 100644 --- a/docs/api/providers/README.md +++ b/docs/api/providers/README.md @@ -7,53 +7,34 @@ Documentation: [html](https://docs-beta.ethers.io/) Providers ========= - -A **Provider** is an abstraction of a connection to the -Ethereum network, providing a concise, consistent interface -to standard Ethereum node functionality. - -The ethers.js library provides several options which should -cover the vast majority of use-cases, but also includes the -necessary functions and classes for sub-classing if a more -custom configuration is necessary. - -Most users should be able to simply use the [Default Provider](./). - - Default Provider ---------------- +#### *ethers* . **getDefaultProvider**( [ network , [ options ] ] ) => *[Provider](/api/providers/provider/)* -The default provider is the safest, easiest way to begin -developing on *Ethereum*, and it is also robust enough -for use in production. +Returns a new Provider, backed by multiple services, connected to *network*. Is no *network* is provided, **homestead** (i.e. mainnet) is used. -It creates a [FallbackProvider](other) connected to as many backend -services as possible. When a request is made, it is sent to -multiple backends simulatenously. As responses from each backend -are returned, they are checked that they agree. Once a quorum -has been reached (i.e. enough of the backends agree), the response -is provided to your application. - -This ensures that if a backend has become out-of-sync, or if it -has been compromised that its responses are dropped in favor of -responses that match the majority. +The *options* is an object, with the following properties: -#### *ethers* . **getDefaultProvider** ( [ network ] ) **=>** *[Provider](provider)* - -Returns a new Provider, backed by multiple services, connected -to *network*. Is no *network* is provided, **homestead** -(i.e. mainnet) is used. +Option Properties +#### 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, 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. + +Some services also provide additional paid features, whichare only available when specifying an API Key. + Provider Documentation ---------------------- - - * [Provider](provider) * [Accounts Methods](provider) * [Blocks Methods](provider) @@ -66,11 +47,12 @@ Provider Documentation * [JsonRpcProvider](jsonrpc-provider) * [JsonRpcSigner](jsonrpc-provider) * [JsonRpcUncheckedSigner](jsonrpc-provider) + * [Node-Specific Methods](jsonrpc-provider) * [API Providers](api-providers) * [EtherscanProvider](api-providers) * [InfuraProvider](api-providers) * [AlchemyProvider](api-providers) - * [CloudfrontProvider](api-providers) + * [CloudflareProvider](api-providers) * [Other Providers](other) * [FallbackProvider](other) * [IpcProvider](other) @@ -83,7 +65,3 @@ Provider Documentation * [Events and Logs](types) * [Transactions](types) - - ------ -**Content Hash:** 29575fb7fa8a7a126446a463e402b3d444aaf8a36c9226d0644466e3ff899b07 \ No newline at end of file diff --git a/docs/api/providers/api-providers/README.md b/docs/api/providers/api-providers/README.md index 230b92f90..57b51fdd6 100644 --- a/docs/api/providers/api-providers/README.md +++ b/docs/api/providers/api-providers/README.md @@ -7,103 +7,190 @@ Documentation: [html](https://docs-beta.ethers.io/) API Providers ============= - -There are many services which offer a web API for accessing -the Ethereum Blockchain. These Providers allow connecting -to them, which simplifies development, since you do not need -to run your own instance or cluster of Ethereum nodes. - -However, this reliance on third-party services can reduce -resiliance, security and increase the amount of required trust. -To mitigate these issues, it is recommended you use a -[Default Provider](..). - - EtherscanProvider ----------------- +#### **new ***ethers* . *providers* . **EtherscanProvider**( [ network = "homestead" , [ apiKey ] ] ) -The **EtherscanProvider** is backed by a combination of the various -[Etherscan APIs](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/etherscan.io/apis). +Create a new **EtherscanProvider** connected to *network* with the optional *apiKey*. + +The *network* may be specified as **string** for a common network name, a **number** for a common chain ID or a [Network Object]provider-(network). + +If no *apiKey* is provided, a shared API key will be used, which may result in reduced performance and throttled requests. It is highly recommended for production, you register with [Etherscan](https://etherscan.io) for your own API key. -#### *provider* . **getHistory** ( address ) **=>** *Array< History >* - -@TODO... Explain +#### 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. +It is highly recommended for production, you register with [Etherscan](https://etherscan.io) for your own API key. #### **Supported Networks** +- Homestead (Mainnet) +- Ropsten (proof-of-work testnet) +- Rinkeby (proof-of-authority testnet) +- Gorli (clique testnet) +- Kovan (proof-of-authority testnet) -* Homestead (Mainnet) -* Ropsten (proof-of-work testnet) -* Rinkeby (proof-of-authority testnet) -* Görli (clique testnet) -* Kovan (proof-of-authority testnet) +```javascript +// +const EtherscanProvider = ethers.providers.EtherscanProvider; +const apiKey = "..."; +// + +// Connect to mainnet (homestead) +provider = new EtherscanProvider(); + +// Connect to rinkeby testnet (these are equivalent) +provider = new EtherscanProvider("rinkeby"); +provider = new EtherscanProvider(4); + +const network = ethers.providers.getNetwork("rinkeby"); +// +delete network._defaultProvider; +network +// +//! + +provider = new EtherscanProvider(network); + +// Connect to mainnet (homestead) with an API key +provider = new EtherscanProvider(null, apiKey); +provider = new EtherscanProvider("homestead", apiKey); +``` + +#### *provider* . **getHistory**( address ) => *Array< History >* + +@TODO... Explain InfuraProvider -------------- +#### **new ***ethers* . *providers* . **InfuraProvider**( [ network = "homestead" , [ apiKey ] ] ) -The **InfuraProvider** is backed by the popular [INFURA](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/infura.io) -Ethereum service. +Create a new **InfuraProvider** connected to *network* with the optional *apiKey*. + +The *network* may be specified as **string** for a common network name, a **number** for a common chain ID or a [Network Object]provider-(network). + +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. + + +#### 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. + +It is highly recommended for production, you register with [INFURA](https://infura.io) for your own API key. #### **Supported Networks** - - -* Homestead (Mainnet) -* Ropsten (proof-of-work testnet) -* Rinkeby (proof-of-authority testnet) -* Görli (clique testnet) -* Kovan (proof-of-authority testnet) +- Homestead (Mainnet) +- Ropsten (proof-of-work testnet) +- Rinkeby (proof-of-authority testnet) +- Gorli (clique testnet) +- Kovan (proof-of-authority testnet) +```javascript +// +const InfuraProvider = ethers.providers.InfuraProvider; +const projectId = "..."; +const projectSecret = "..."; +// + +// Connect to mainnet (homestead) +provider = new InfuraProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new InfuraProvider("ropsten"); + +// Connect to mainnet with a Project ID (these are equivalent) +provider = new InfuraProvider(null, projectId); +provider = new InfuraProvider("homestead", projectId); + +// Connect to mainnet with a Project ID and Project Secret +provider = new InfuraProvider("homestead", { + projectId: projectId, + projectSecret: projectSecret +}); +``` + AlchemyProvider --------------- +#### **new ***ethers* . *providers* . **AlchemyProvider**( [ network = "homestead" , [ apiKey ] ] ) -The **AlchemtProvider** is backed by [Alchemy](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/alchemyapi.io). +Create a new **AlchemyProvider** connected to *network* with the optional *apiKey*. + +The *network* may be specified as **string** for a common network name, a **number** for a common chain ID or a [Network Object](/api/providers/types/#providers-Network). + + +#### 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. + +It is highly recommended for production, you register with [Alchemy](https://alchemyapi.io) for your own API key. #### **Supported Networks** - - -* Homestead (Mainnet) -* Ropsten (proof-of-work testnet) -* Rinkeby (proof-of-authority testnet) -* Görli (clique testnet) -* Kovan (proof-of-authority testnet) +- Homestead (Mainnet) +- Ropsten (proof-of-work testnet) +- Rinkeby (proof-of-authority testnet) +- Gorli (clique testnet) +- Kovan (proof-of-authority testnet) -CloudfrontProvider +```javascript +// +const AlchemyProvider = ethers.providers.AlchemyProvider; +const apiKey = "..."; +// + +// Connect to mainnet (homestead) +provider = new AlchemyProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new AlchemyProvider("ropsten"); + +// Connect to mainnet with an API key (these are equivalent) +provider = new AlchemyProvider(null, apiKey); +provider = new AlchemyProvider("homestead", apiKey); +``` + +CloudflareProvider ------------------ +#### **new ***ethers* . *providers* . **CloudflareProvider**( ) -The CloudfrontProvider is backed by the [Cloudflare Ethereum Gateway](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/developers.cloudflare.com/distributed-web/ethereum-gateway). +Create a new **CloudflareProvider** connected to mainnet (i.e. "homestead"). #### **Supported Networks** - - -* Homestead (Mainnet) +- Homestead (Mainnet) +```javascript +// +const CloudflareProvider = ethers.providers.CloudflareProvider; +// + +// Connect to mainnet (homestead) +provider = new CloudflareProvider(); +``` ------ -**Content Hash:** 79ad5dae92f00fc2ef2aceff6620ed9ae5f12d92d9e29ebc6be1c5752e65322f \ No newline at end of file diff --git a/docs/api/providers/api-providers/index.html b/docs/api/providers/api-providers/index.html index 9610d62dc..617c2206f 100644 --- a/docs/api/providers/api-providers/index.html +++ b/docs/api/providers/api-providers/index.html @@ -1,15 +1,144 @@ -API Providers

API Providers

-

There are many services which offer a web API for accessing the Ethereum Blockchain. These Providers allow connecting to them, which simplifies development, since you do not need to run your own instance or cluster of Ethereum nodes.

However, this reliance on third-party services can reduce resiliance, security and increase the amount of required trust. To mitigate these issues, it is recommended you use a Default Provider.

-

EtherscanProvider inherits Provider

-

The EtherscanProvider is backed by a combination of the various Etherscan APIs.

-
provider . getHistory ( address ) Array< History >

@TODO... Explain

-
Supported Networks
  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)
-

InfuraProvider inherits UrlJsonRpcProvider

-

The InfuraProvider is backed by the popular INFURA Ethereum service.

-
Supported Networks
  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)
-

AlchemyProvider inherits UrlJsonRpcProvider

-

The AlchemtProvider is backed by Alchemy.

-
Supported Networks
  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)
-

CloudfrontProvider inherits UrlJsonRpcProvider

-

The CloudfrontProvider is backed by the Cloudflare Ethereum Gateway.

-
Supported Networks
  • Homestead (Mainnet)
\ No newline at end of file + + + + API Providers + + + + +
+ + +

API Providers

There are many services which offer a web API for accessing the Ethereum Blockchain. These Providers allow connecting to them, which simplifies development, since you do not need to run your own instance or cluster of Ethereum nodes.

+ +

However, this reliance on third-party services can reduce resiliance, security and increase the amount of required trust. To mitigate these issues, it is recommended you use a Default Provider.

+ +

EtherscanProvider inherits Provider

The EtherscanProvider is backed by a combination of the various Etherscan APIs.

+ +
new ethers.providers.EtherscanProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new EtherscanProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a [Network Object]provider-(network).

+ +

If no apiKey is provided, a shared API key will be used, which may result in reduced performance and throttled requests. It is highly recommended for production, you register with Etherscan for your own API key.

+ +
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.

+ +

It is highly recommended for production, you register with Etherscan for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
Etherscan Examples
// <hide> +const EtherscanProvider = ethers.providers.EtherscanProvider; +const apiKey = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new EtherscanProvider(); + +// Connect to rinkeby testnet (these are equivalent) +provider = new EtherscanProvider("rinkeby"); +provider = new EtherscanProvider(4); + +const network = ethers.providers.getNetwork("rinkeby"); +// <hide> +delete network._defaultProvider; +network +// </hide> +//! + +provider = new EtherscanProvider(network); + +// Connect to mainnet (homestead) with an API key +provider = new EtherscanProvider(null, apiKey); +provider = new EtherscanProvider("homestead", apiKey);
provider.getHistory( address ) Array< History >

@TODO... Explain

+ +

InfuraProvider inherits UrlJsonRpcProvider

The InfuraProvider is backed by the popular INFURA Ethereum service.

+ +
new ethers.providers.InfuraProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new InfuraProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a [Network Object]provider-(network).

+ +

The apiKey can be a string Project ID or an object with the properties projectId and projectSecret to specify a Project Secret which can be used on non-public sources (like on a server) to further secure your API access and quotas.

+ +
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.

+ +

It is highly recommended for production, you register with INFURA for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
INFURA Examples
// <hide> +const InfuraProvider = ethers.providers.InfuraProvider; +const projectId = "..."; +const projectSecret = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new InfuraProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new InfuraProvider("ropsten"); + +// Connect to mainnet with a Project ID (these are equivalent) +provider = new InfuraProvider(null, projectId); +provider = new InfuraProvider("homestead", projectId); + +// Connect to mainnet with a Project ID and Project Secret +provider = new InfuraProvider("homestead", { + projectId: projectId, + projectSecret: projectSecret +});

AlchemyProvider inherits UrlJsonRpcProvider

The AlchemyProvider is backed by Alchemy.

+ +
new ethers.providers.AlchemyProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new AlchemyProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a Network Object.

+ +
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.

+ +

It is highly recommended for production, you register with Alchemy for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
Alchemy Examples
// <hide> +const AlchemyProvider = ethers.providers.AlchemyProvider; +const apiKey = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new AlchemyProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new AlchemyProvider("ropsten"); + +// Connect to mainnet with an API key (these are equivalent) +provider = new AlchemyProvider(null, apiKey); +provider = new AlchemyProvider("homestead", apiKey);

CloudflareProvider inherits UrlJsonRpcProvider

The CloudflareProvider is backed by the Cloudflare Ethereum Gateway.

+ +
new ethers.providers.CloudflareProvider( )

Create a new CloudflareProvider connected to mainnet (i.e. "homestead").

+ +
Supported Networks

  • Homestead (Mainnet)

+ +
Cloudflare Examples
// <hide> +const CloudflareProvider = ethers.providers.CloudflareProvider; +// </hide> + +// Connect to mainnet (homestead) +provider = new CloudflareProvider();
+ + + +
+ + + diff --git a/docs/api/providers/index.html b/docs/api/providers/index.html index c120a243f..9cd0caf08 100644 --- a/docs/api/providers/index.html +++ b/docs/api/providers/index.html @@ -1,8 +1,54 @@ -Providers

Providers

-

A Provider is an abstraction of a connection to the Ethereum network, providing a concise, consistent interface to standard Ethereum node functionality.

The ethers.js library provides several options which should cover the vast majority of use-cases, but also includes the necessary functions and classes for sub-classing if a more custom configuration is necessary.

Most users should be able to simply use the Default Provider.

-

Default Provider

-

The default provider is the safest, easiest way to begin developing on Ethereum, and it is also robust enough for use in production.

It creates a FallbackProvider connected to as many backend services as possible. When a request is made, it is sent to multiple backends simulatenously. As responses from each backend are returned, they are checked that they agree. Once a quorum has been reached (i.e. enough of the backends agree), the response is provided to your application.

This ensures that if a backend has become out-of-sync, or if it has been compromised that its responses are dropped in favor of responses that match the majority.

-
ethers . getDefaultProvider ( [ network ] ) Provider

Returns a new Provider, backed by multiple services, connected to network. Is no network is provided, homestead (i.e. mainnet) is used.

-

Provider Documentation

+ + + + Providers + + + + +
+ -
\ No newline at end of file +

Providers

A Provider is an abstraction of a connection to the Ethereum network, providing a concise, consistent interface to standard Ethereum node functionality.

+ +

The ethers.js library provides several options which should cover the vast majority of use-cases, but also includes the necessary functions and classes for sub-classing if a more custom configuration is necessary.

+ +

Most users should be able to simply use the Default Provider.

+ +

Default Provider

The default provider is the safest, easiest way to begin developing on Ethereum, and it is also robust enough for use in production.

+ +

It creates a FallbackProvider connected to as many backend services as possible. When a request is made, it is sent to multiple backends simulatenously. As responses from each backend are returned, they are checked that they agree. Once a quorum has been reached (i.e. enough of the backends agree), the response is provided to your application.

+ +

This ensures that if a backend has become out-of-sync, or if it has been compromised that its responses are dropped in favor of responses that match the majority.

+ +
ethers.getDefaultProvider( [ network , [ options ] ] ) Provider

Returns a new Provider, backed by multiple services, connected to network. Is no network is provided, homestead (i.e. mainnet) is used.

+ +

The options is an object, with the following properties:

+ +
PropertyDescription 
alchemyAlchemy API Token 
etherscanEtherscan API Token 
infuraINFURA Project ID or ProjectID and Project Secret 
quorumThe number of backends that must agree (default: 2 for mainnet, 1 for testnets) 
Option Properties 
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, 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.

+ +

Some services also provide additional paid features, whichare only available when specifying an API Key.

+ +

Provider Documentation

+
Provider
Accounts Methods
Blocks Methods
Ethereum Naming Service (ENS) Methods
Logs Methods
Network Status Methods
Transactions Methods
Event Emitter Methods
Inspection Methods
JsonRpcProvider
JsonRpcSigner
JsonRpcUncheckedSigner
Node-Specific Methods
API Providers
EtherscanProvider
InfuraProvider
AlchemyProvider
CloudflareProvider
Other Providers
FallbackProvider
IpcProvider
UrlJsonRpcProvider
Web3Provider
Types
BlockTag
Network
Block
Events and Logs
Transactions
+ + + +
+ + + diff --git a/docs/api/providers/jsonrpc-provider/README.md b/docs/api/providers/jsonrpc-provider/README.md index 897b9e975..e75f31aaf 100644 --- a/docs/api/providers/jsonrpc-provider/README.md +++ b/docs/api/providers/jsonrpc-provider/README.md @@ -7,127 +7,63 @@ Documentation: [html](https://docs-beta.ethers.io/) JsonRpcProvider =============== +#### **new ***ethers* . *providers* . **JsonRpcProvider**( [ url [ , aNetworkish ] ] ) -The [JSON-RPC API](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethereum/wiki/wiki/JSON-RPC) is a -very popular method for interacting with Ethereum and is available in all -major Ethereum node implementations (e.g. [Geth](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/geth.ethereum.org) -and [Parity](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/www.parity.io)) as well as many third-party web -services (e.g. [INFURA](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/infura.io)) - - -#### **new** *ethers* . *providers* . **JsonRpcProvider** ( [ url [ , aNetworkish ] ] ) - -Connect to a JSON-RPC API located at *url* using the /aNetworkish// network. -If *url* is not specified, the default (i.e. `http://localhost:8545`) is used -and if no network is specified, it will be determined automatically by -querying the node. - - +Connect to a JSON-RPC API located at *url* using the *aNetworkish* network. If *url* is not specified, the default (i.e. `http://localhost:8545`) is used and if no network is specified, it will be determined automatically by querying the node. #### Note: Connecting to a Local Node -Each node implementation is slightly different and may require specific command-line -flags or changes in their Settings UI to enable JSON-RPC, unlock accounrs -or expose specific APIs. Please consult theit 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 accounrs or expose specific APIs. Please consult their documentation. + + +#### *jsonRpcProvider* . **getSigner**( [ addressOrIndex ] ) => *[JsonRpcSigner](/api/providers/jsonrpc-provider/#JsonRpcSigner)* + +Returns a [JsonRpcSigner](/api/providers/jsonrpc-provider/#JsonRpcSigner) which is managed by this Ethereum node, at *addressOrIndex*. If no *addressOrIndex* is provided, the first account (account #0) is used. + + +#### *jsonRpcProvider* . **getUncheckedSigner**( [ addressOrIndex ] ) => *[JsonRpcUncheckedSigner](/api/providers/jsonrpc-provider/#UncheckedJsonRpcSigner)* - -#### *jsonRpcProvider* . **getSigner** ( [ addressOrIndex ] ) **=>** *[JsonRpcSigner](./)* - -Returns a [JsonRpcSigner](./) which is managed by this Ethereum node, at -*addressOrIndex*. If no *addressOrIndex* is provided, the first -account (account #0) is used. - - - - -#### *jsonRpcProvider* . **getUncheckedSigner** ( [ addressOrIndex ] ) **=>** *[JsonRpcUncheckedSigner](./)* - - - - - - -#### *jsonRpcProvider* . **listAccounts** ( ) **=>** *Array< string >* +#### *jsonRpcProvider* . **listAccounts**( ) => *Array< string >* Returns a list of all account addresses managed by this provider. - - -#### *jsonRpcProvider* . **send** ( method , params ) **=>** *Promise< any >* +#### *jsonRpcProvider* . **send**( method , params ) => *Promise< any >* Allows sending raw messages to the provider. -This can be used for backend-specific calls, such as for debugging or -specific account management. - - +This can be used for backend-specific calls, such as for debugging or specific account management. JsonRpcSigner ------------- - -A **JsonRpcSigner** is a simple Signer which is backed by a connected -[JsonRpcProvider](./). - - -#### *signer* . **provider** **=>** *[JsonRpcProvider](./)* +#### *signer* . **provider** => *[JsonRpcProvider](/api/providers/jsonrpc-provider/)* The provider this signer was established from. +#### *signer* . **connectUnchecked**( ) => *[JsonRpcUncheckedSigner](/api/providers/jsonrpc-provider/#UncheckedJsonRpcSigner)* + +Returns a new Signer object which does not perform addtional checks when sending a transaction. See [getUncheckedSigner](/api/providers/jsonrpc-provider/#JsonRpcProvider-getUncheckedSigner) for more details. -#### *signer* . **connectUnchecked** ( ) **=>** *[JsonRpcUncheckedSigner](./)* +#### *signer* . **sendUncheckedTransaction**( transaction ) => *Promise< string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > > >* -Returns a new Signer object which does not perform addtional checks when -sending a transaction. See [JsonRpcUncheckedSigner](./) for more details. +Sends the *transaction* and returns a Promise which resolves to the opacque transaction hash. - - -#### *signer* . **sendUncheckedTransaction** ( transaction ) **=>** *Promise< string< [DataHexstring](../../utils/bytes)< 32 > > >* - -Sends the *transaction* and returns a Promise which resolves to the -opacque transaction hash. - - - - -#### *signer* . **unlock** ( password ) **=>** *Promise< boolean >* +#### *signer* . **unlock**( password ) => *Promise< boolean >* Request the node unlock the account (if locked) using *password*. - - JsonRpcUncheckedSigner ---------------------- +Node-Specific Methods +--------------------- -The JSON-RPC API only provides a transaction hash as the response when a -transaction is sent, but the ethers Provider requires populating all details -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 -the details using the returned transaction hash to populate the [TransactionResponse](../types) -object. - -Some backends do not respond immediately and instead defer releasing the -details of a transaction it was responsible for signing until it is mined. - -The **UncheckedSigner** does not populate any additional information and will -immediately return the result as a mock [TransactionResponse](../types)-like -object, with most of the properties set to null, but allows access to the -transaction hash quickly, if that is all that is required. - - - ------ -**Content Hash:** d60a1c5ef2f317ae59bc4b22a1e9d079f1762f60f6321b5da1efbe07d8284284 \ No newline at end of file diff --git a/docs/api/providers/jsonrpc-provider/index.html b/docs/api/providers/jsonrpc-provider/index.html index f281a2ddd..38b3eb3be 100644 --- a/docs/api/providers/jsonrpc-provider/index.html +++ b/docs/api/providers/jsonrpc-provider/index.html @@ -1,16 +1,68 @@ -JsonRpcProvider

JsonRpcProvider inherits Provider

-

The JSON-RPC API is a very popular method for interacting with Ethereum and is available in all major Ethereum node implementations (e.g. Geth and Parity) as well as many third-party web services (e.g. INFURA)

-
new ethers . providers . JsonRpcProvider ( [ url [ , aNetworkish ] ] )

Connect to a JSON-RPC API located at url using the /aNetworkish network. If url is not specified, the default (i.e. http:localhost:8545) is used and if no network is specified, it will be determined automatically by querying the node.

-
Note: Connecting to a Local Node

Each node implementation is slightly different and may require specific command-line flags or changes in their Settings UI to enable JSON-RPC, unlock accounrs or expose specific APIs. Please consult theit documentation.

-
jsonRpcProvider . getSigner ( [ addressOrIndex ] ) JsonRpcSigner

Returns a JsonRpcSigner which is managed by this Ethereum node, at addressOrIndex. If no addressOrIndex is provided, the first account (account #0) is used.

-
jsonRpcProvider . getUncheckedSigner ( [ addressOrIndex ] ) JsonRpcUncheckedSigner

-
jsonRpcProvider . listAccounts ( ) Array< string >

Returns a list of all account addresses managed by this provider.

-
jsonRpcProvider . send ( method , params ) Promise< any >

Allows sending raw messages to the provider.

This can be used for backend-specific calls, such as for debugging or specific account management.

-

JsonRpcSigner inherits Signer

-

A JsonRpcSigner is a simple Signer which is backed by a connected JsonRpcProvider.

-
signer . provider JsonRpcProvider

The provider this signer was established from.

-
signer . connectUnchecked ( ) JsonRpcUncheckedSigner

Returns a new Signer object which does not perform addtional checks when sending a transaction. See JsonRpcUncheckedSigner for more details.

-
signer . sendUncheckedTransaction ( transaction ) Promise< string< DataHexstring< 32 > > >

Sends the transaction and returns a Promise which resolves to the opacque transaction hash.

-
signer . unlock ( password ) Promise< boolean >

Request the node unlock the account (if locked) using password.

-

JsonRpcUncheckedSigner inherits Signer

-

The JSON-RPC API only provides a transaction hash as the response when a transaction is sent, but the ethers Provider requires populating all details 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 the details using the returned transaction hash to populate the TransactionResponse object.

Some backends do not respond immediately and instead defer releasing the details of a transaction it was responsible for signing until it is mined.

The UncheckedSigner does not populate any additional information and will immediately return the result as a mock TransactionResponse-like object, with most of the properties set to null, but allows access to the transaction hash quickly, if that is all that is required.

\ No newline at end of file + + + + JsonRpcProvider + + + + +
+ + +

JsonRpcProvider inherits Provider

The JSON-RPC API is a very popular method for interacting with Ethereum and is available in all major Ethereum node implementations (e.g. Geth and Parity) as well as many third-party web services (e.g. INFURA)

+ +
new ethers.providers.JsonRpcProvider( [ url [ , aNetworkish ] ] )

Connect to a JSON-RPC API located at url using the aNetworkish network. If url is not specified, the default (i.e. http://localhost:8545) is used and if no network is specified, it will be determined automatically by querying the node.

+ +
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.

+ +
jsonRpcProvider.getSigner( [ addressOrIndex ] ) JsonRpcSigner

Returns a JsonRpcSigner which is managed by this Ethereum node, at addressOrIndex. If no addressOrIndex is provided, the first account (account #0) is used.

+ +
jsonRpcProvider.getUncheckedSigner( [ addressOrIndex ] ) JsonRpcUncheckedSigner
+
jsonRpcProvider.listAccounts( ) Array< string >

Returns a list of all account addresses managed by this provider.

+ +
jsonRpcProvider.send( method , params ) Promise< any >

Allows sending raw messages to the provider.

+ +

This can be used for backend-specific calls, such as for debugging or specific account management.

+ +

JsonRpcSigner inherits Signer

A JsonRpcSigner is a simple Signer which is backed by a connected JsonRpcProvider.

+ +
signer.provider JsonRpcProvider

The provider this signer was established from.

+ +
signer.connectUnchecked( ) JsonRpcUncheckedSigner

Returns a new Signer object which does not perform addtional checks when sending a transaction. See getUncheckedSigner for more details.

+ +
signer.sendUncheckedTransaction( transaction ) Promise< string< DataHexString< 32 > > >

Sends the transaction and returns a Promise which resolves to the opacque transaction hash.

+ +
signer.unlock( password ) Promise< boolean >

Request the node unlock the account (if locked) using password.

+ +

JsonRpcUncheckedSigner inherits Signer

The JSON-RPC API only provides a transaction hash as the response when a transaction is sent, but the ethers Provider requires populating all details 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 the details using the returned transaction hash to populate the TransactionResponse object.

+ +

Some backends do not respond immediately and instead defer releasing the details of a transaction it was responsible for signing until it is mined.

+ +

The UncheckedSigner does not populate any additional information and will immediately return the result as a mock TransactionResponse-like object, with most of the properties set to null, but allows access to the transaction hash quickly, if that is all that is required.

+ +

Node-Specific Methods

Many methods are less common or specific to certain Ethereum Node implementations (e.g. Parity vs Geth. These include account and admin management, debugging, deeper block and transaction exploration and other services (such as Swarm and Whisper).

+ +

The jsonRpcProvider.send method can be used to access these.

+ +

+ + + + + +
+ + + diff --git a/docs/api/providers/other/README.md b/docs/api/providers/other/README.md index 9ed94230a..3fcb02b72 100644 --- a/docs/api/providers/other/README.md +++ b/docs/api/providers/other/README.md @@ -7,181 +7,116 @@ Documentation: [html](https://docs-beta.ethers.io/) Other Providers =============== - -Others... - - FallbackProvider ---------------- +#### **new ***ethers* . *providers* . **FallbackProvider**( providers [ , quorum ] ) -The **FallbackProvider** is the most advanced [Provider](../provider) available in -ethers. +Creates a new instance of a FallbackProvider connected to *providers*. If quorum is not specified, half of the total sum of the provider weights is used. -It uses a quorum and connects to multiple [Providers](../provider) as backends, -each configured with a *priority* and a *weight* . - -When a request is made, the request is dispatched to multiple backends, randomly -choosen (higher prioirty backends are always selected first) and the results from -each are compared against the others. Only once the quorum has been reached will that -result be accepted and returned to the caller. - -By default the quorum requires 50% (rounded up) of the backends to agree. The *weight* -can be used to give a backend Provider more influence. +The *providers* can be either an array of [Provider](/api/providers/provider/) or [FallbackProviderConfig](/api/providers/other/#FallbackProviderConfig). If a [Provider](/api/providers/provider/) is provided, the defaults are a priority of 1 and a weight of 1. -#### **new** *ethers* . *providers* . **FallbackProvider** ( providers [ , quorum ] ) - -Creates a new instance of a FallbackProvider connected to *providers*. If -quorum is not specified, half of the total sum of the provider weights is -used. - -The *providers* can be either an array of [Provider](../provider) or [FallbackProviderConfig](./). -If a [Provider](../provider) is provided, the defaults are a priority of 1 and a weight of 1. - - - - -#### *provider* . **providerConfigs** **=>** *Array< [FallbackProviderConfig](./) >* +#### *provider* . **providerConfigs** => *Array< [FallbackProviderConfig](/api/providers/other/#FallbackProviderConfig) >* The list of Provider Configurations that describe the backends. +#### *provider* . **quorum** => *number* - -#### *provider* . **quorum** **=>** *number* - -The quorum the backend responses must agree upon before a result will be -resolved. By default this is *half the sum of the weights*. - - +The quorum the backend responses must agree upon before a result will be resolved. By default this is *half the sum of the weights*. ### FallbackProviderConfig - - -#### *fallbackProviderConfig* . **provider** **=>** *[Provider](../provider)* +#### *fallbackProviderConfig* . **provider** => *[Provider](/api/providers/provider/)* The provider for this configuration. +#### *fallbackProviderConfig* . **priority** => *number* + +The priority used for the provider. Higher priorities are favoured over lower priorities. If multiple providers share the same prioirty, they are choosen at random. -#### *fallbackProviderConfig* . **priority** **=>** *number* +#### *fallbackProviderConfig* . **stallTimeout** => *number* -The priority used for the provider. Higher priorities are favoured over lower -priorities. If multiple providers share the same prioirty, they are choosen -at random. +The timeout (in ms) after which another [Provider](/api/providers/provider/) will be attempted. This does not affect the current Provider; if it returns a result it is counted as part of the quorum. + +Lower values will result in more network traffic, but may reduce the response time of requests. +#### *fallbackProviderConfig* . **weight** => *number* - -#### *fallbackProviderConfig* . **stallTimeout** **=>** *number* - -The timeout (in ms) after which another [Provider](../provider) will be attempted. This -does not affect the current Provider; if it returns a result it is counted -as part of the quorum. - -Lower values will result in more network traffic, but may reduce the response -time of requests. - - - - -#### *fallbackProviderConfig* . **weight** **=>** *number* - -The weight a response from this provider provides. This can be used if a given -[Provider](../provider) is more trusted, for example. - - +The weight a response from this provider provides. This can be used if a given [Provider](/api/providers/provider/) is more trusted, for example. IpcProvider ----------- +#### *ipcProvider* . **path** => *string* -The **IpcProvider** allows the JSON-RPC API to be used over a local -filename on the file system, exposed by Geth, Parity and other nodes. - -This is only available in *node.js* (as it requires file system access, -and may have additional complications due to file permissions. See any -related notes on the documentation for the actual node implementation websites. - - -#### *ipcProvider* . **path** **=>** *string* - -The path this [Provider](../provider) is connected to. - - +The path this [Provider](/api/providers/provider/) is connected to. UrlJsonRpcProvider ------------------ +#### **new ***ethers* . *providers* . **UrlJsonRpcProvider**( [ network [ , apiKey ] ] ) -This class is intended to be sub-classed and not used directly. It -simplifies creating a [Provider](../provider) where a normal [JsonRpcProvider](../jsonrpc-provider) -would suffice, with a little extra effort needed to generate the JSON-RPC -URL. +Sub-classes do not need to override this. Instead they should override the static method `getUrl` and optionally `getApiKey`. -#### **new** *ethers* . *providers* . **UrlJsonRpcProvider** ( [ network [ , apiKey ] ] ) - -Sub-classes do not need to override this. Instead they should override the -static method `getUrl` and optionally `getApiKey`. - - - - -#### *urlJsonRpcProvider* . **apiKey** **=>** *any* +#### *urlJsonRpcProvider* . **apiKey** => *any* The value of the apiKey that was returned from `InheritedClass.getApiKey`. +#### *InheritingClass* . **getApiKey**( apiKey ) => *any* + +This function should examine the *apiKey* to ensure it is valid and return a (possible modified) value to use in `getUrl`. -#### *InheritingClass* . **getApiKey** ( apiKey ) **=>** *any* - -This function should examine the *apiKey* to ensure it is valid and -return a (possible modified) value to use in `getUrl`. - - - - -#### *InheritingClass* . **getUrl** ( network , apiKey ) **=>** *string* +#### *InheritingClass* . **getUrl**( network , apiKey ) => *string* The URL to use for the JsonRpcProvider instance. - - Web3Provider ------------ +#### **new ***ethers* . *providers* . **Web3Provider**( externalProvider [ , network ] ) -The Web3Provider is meant to ease moving from a [web3.js based](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethereum/web3.js) -application to ethers by wraping an existing Web3-compatible (such as a -[Web3HttpProvider](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-http)[Web3IpcProvider](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ipc) or -[Web3WsProvider](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ws)) and exposing it as an ethers.js [Provider](../provider) -which can then be used with the rest of the library. +Create a new **Web3Provider**, which wraps an [EIP-1193 Provider](https://eips.ethereum.org/EIPS/eip-1193) or Web3Provider-compatible Provider. -#### **new** *ethers* . *providers* . **Web3Provider** ( web3Provider [ , network ] ) - -Create a new **Web3Provider**, which wraps an [EIP-1193 Provider]() or -Web3Provider-compatible Provider. - - - - -#### *web3Provider* . **provider** **=>** *Web3CompatibleProvider* +#### *web3Provider* . **provider** => *Web3CompatibleProvider* The provider used to create this instance. +### ExternalProvider + +#### *externalProvider* . **request**( request ) => *Promise< any >* + +This follows the [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) API signature. + +The *request* should be a standard JSON-RPC payload, which should at a minimum specify the `method` and `params`. + +The result should be the actual result, which differs from the Web3.js response, which is a wrapped JSON-RPC response. +#### *externalProvider* . **sendAsync**( request , callback ) => *void* + +This follows the [Web3.js Provider Signature](https://github.com/ethereum/web3.js/blob/1.x/packages/web3-providers-http/types/index.d.ts#L57). + +The *request* should be a standard JSON-RPC payload, which should at a minimum specify the `method` and `params`. + +The *callback* should use the error-first calling semantics, so `(error, result)` where the result is a JSON-RPC wrapped result. + + +#### *externalProvider* . **send**( request , callback ) => *void* + +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 + ------ -**Content Hash:** e85f8ef6e4b1924ef63365dd6f761aa0ef5db23ebdd124686763d5061551a8bf \ No newline at end of file diff --git a/docs/api/providers/other/index.html b/docs/api/providers/other/index.html index 3348e4817..9a453e477 100644 --- a/docs/api/providers/other/index.html +++ b/docs/api/providers/other/index.html @@ -1,26 +1,100 @@ -Other Providers

Other Providers

-

Others...

-

FallbackProvider inherits Provider

-

The FallbackProvider is the most advanced Provider available in ethers.

It uses a quorum and connects to multiple Providers as backends, each configured with a priority and a weight .

When a request is made, the request is dispatched to multiple backends, randomly choosen (higher prioirty backends are always selected first) and the results from each are compared against the others. Only once the quorum has been reached will that result be accepted and returned to the caller.

By default the quorum requires 50% (rounded up) of the backends to agree. The weight can be used to give a backend Provider more influence.

-
new ethers . providers . FallbackProvider ( providers [ , quorum ] )

Creates a new instance of a FallbackProvider connected to providers. If quorum is not specified, half of the total sum of the provider weights is used.

The providers can be either an array of Provider or FallbackProviderConfig. If a Provider is provided, the defaults are a priority of 1 and a weight of 1.

-
provider . providerConfigs Array< FallbackProviderConfig >

The list of Provider Configurations that describe the backends.

-
provider . quorum number

The quorum the backend responses must agree upon before a result will be resolved. By default this is half the sum of the weights.

-

FallbackProviderConfig

+ + + + Other Providers + + + + +
+ -
fallbackProviderConfig . provider Provider

The provider for this configuration.

-
fallbackProviderConfig . priority number

The priority used for the provider. Higher priorities are favoured over lower priorities. If multiple providers share the same prioirty, they are choosen at random.

-
fallbackProviderConfig . stallTimeout number

The timeout (in ms) after which another Provider will be attempted. This does not affect the current Provider; if it returns a result it is counted as part of the quorum.

Lower values will result in more network traffic, but may reduce the response time of requests.

-
fallbackProviderConfig . weight number

The weight a response from this provider provides. This can be used if a given Provider is more trusted, for example.

-

IpcProvider inherits JsonRpcProvider

-

The IpcProvider allows the JSON-RPC API to be used over a local filename on the file system, exposed by Geth, Parity and other nodes.

This is only available in node.js (as it requires file system access, and may have additional complications due to file permissions. See any related notes on the documentation for the actual node implementation websites.

-
ipcProvider . path string

The path this Provider is connected to.

-

UrlJsonRpcProvider inherits JsonRpcProvider

-

This class is intended to be sub-classed and not used directly. It simplifies creating a Provider where a normal JsonRpcProvider would suffice, with a little extra effort needed to generate the JSON-RPC URL.

-
new ethers . providers . UrlJsonRpcProvider ( [ network [ , apiKey ] ] )

Sub-classes do not need to override this. Instead they should override the static method getUrl and optionally getApiKey.

-
urlJsonRpcProvider . apiKey any

The value of the apiKey that was returned from InheritedClass.getApiKey.

-
InheritingClass . getApiKey ( apiKey ) any

This function should examine the apiKey to ensure it is valid and return a (possible modified) value to use in getUrl.

-
InheritingClass . getUrl ( network , apiKey ) string

The URL to use for the JsonRpcProvider instance.

-

Web3Provider inherits JsonRpcProvider

-

The Web3Provider is meant to ease moving from a web3 . js based application to ethers by wraping an existing Web3-compatible (such as a Web3HttpProviderWeb3IpcProvider or Web3WsProvider) and exposing it as an ethers.js Provider which can then be used with the rest of the library.

-
new ethers . providers . Web3Provider ( web3Provider [ , network ] )

Create a new Web3Provider, which wraps an [EIP-1193 Provider]() or Web3Provider-compatible Provider.

-
web3Provider . provider Web3CompatibleProvider

The provider used to create this instance.

\ No newline at end of file +

Other Providers

Others...

+ +

FallbackProvider inherits Provider

The FallbackProvider is the most advanced Provider available in ethers.

+ +

It uses a quorum and connects to multiple Providers as backends, each configured with a priority and a weight .

+ +

When a request is made, the request is dispatched to multiple backends, randomly choosen (higher prioirty backends are always selected first) and the results from each are compared against the others. Only once the quorum has been reached will that result be accepted and returned to the caller.

+ +

By default the quorum requires 50% (rounded up) of the backends to agree. The weight can be used to give a backend Provider more influence.

+ +
new ethers.providers.FallbackProvider( providers [ , quorum ] )

Creates a new instance of a FallbackProvider connected to providers. If quorum is not specified, half of the total sum of the provider weights is used.

+ +

The providers can be either an array of Provider or FallbackProviderConfig. If a Provider is provided, the defaults are a priority of 1 and a weight of 1.

+ +
provider.providerConfigs Array< FallbackProviderConfig >

The list of Provider Configurations that describe the backends.

+ +
provider.quorum number

The quorum the backend responses must agree upon before a result will be resolved. By default this is half the sum of the weights.

+ +

FallbackProviderConfig

+
fallbackProviderConfig.provider Provider

The provider for this configuration.

+ +
fallbackProviderConfig.priority number

The priority used for the provider. Higher priorities are favoured over lower priorities. If multiple providers share the same prioirty, they are choosen at random.

+ +
fallbackProviderConfig.stallTimeout number

The timeout (in ms) after which another Provider will be attempted. This does not affect the current Provider; if it returns a result it is counted as part of the quorum.

+ +

Lower values will result in more network traffic, but may reduce the response time of requests.

+ +
fallbackProviderConfig.weight number

The weight a response from this provider provides. This can be used if a given Provider is more trusted, for example.

+ +

IpcProvider inherits JsonRpcProvider

The IpcProvider allows the JSON-RPC API to be used over a local filename on the file system, exposed by Geth, Parity and other nodes.

+ +

This is only available in node.js (as it requires file system access, and may have additional complications due to file permissions. See any related notes on the documentation for the actual node implementation websites.

+ +
ipcProvider.path string

The path this Provider is connected to.

+ +

UrlJsonRpcProvider inherits JsonRpcProvider

This class is intended to be sub-classed and not used directly. It simplifies creating a Provider where a normal JsonRpcProvider would suffice, with a little extra effort needed to generate the JSON-RPC URL.

+ +
new ethers.providers.UrlJsonRpcProvider( [ network [ , apiKey ] ] )

Sub-classes do not need to override this. Instead they should override the static method getUrl and optionally getApiKey.

+ +
urlJsonRpcProvider.apiKey any

The value of the apiKey that was returned from InheritedClass.getApiKey.

+ +
InheritingClass.getApiKey( apiKey ) any

This function should examine the apiKey to ensure it is valid and return a (possible modified) value to use in getUrl.

+ +
InheritingClass.getUrl( network , apiKey ) string

The URL to use for the JsonRpcProvider instance.

+ +

Web3Provider inherits JsonRpcProvider

The Web3Provider is meant to ease moving from a web3.js based application to ethers by wraping an existing Web3-compatible (such as a Web3HttpProvider, Web3IpcProvider or Web3WsProvider) and exposing it as an ethers.js Provider which can then be used with the rest of the library.

+ +

This may also be used to wrap a standard [EIP-1193 Provider](link-eip-1193].

+ +
new ethers.providers.Web3Provider( externalProvider [ , network ] )

Create a new Web3Provider, which wraps an EIP-1193 Provider or Web3Provider-compatible Provider.

+ +
web3Provider.provider Web3CompatibleProvider

The provider used to create this instance.

+ +

ExternalProvider

An ExternalProvider can be either one for the above mentioned Web3 Providers (or otherwise compatible) or an EIP-1193 provider.

+ +

An ExternalProvider must offer one of the following signatures, and the first matching is used:

+ +
externalProvider.request( request ) Promise< any >

This follows the EIP-1193 API signature.

+ +

The request should be a standard JSON-RPC payload, which should at a minimum specify the method and params.

+ +

The result should be the actual result, which differs from the Web3.js response, which is a wrapped JSON-RPC response.

+ +
externalProvider.sendAsync( request , callback ) void

This follows the Web3.js Provider Signature.

+ +

The request should be a standard JSON-RPC payload, which should at a minimum specify the method and params.

+ +

The callback should use the error-first calling semantics, so (error, result) where the result is a JSON-RPC wrapped result.

+ +
externalProvider.send( request , callback ) void

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

+ +
+ + + +
+ + + diff --git a/docs/api/providers/provider/README.md b/docs/api/providers/provider/README.md index 6092318e3..90afcc497 100644 --- a/docs/api/providers/provider/README.md +++ b/docs/api/providers/provider/README.md @@ -7,269 +7,306 @@ Documentation: [html](https://docs-beta.ethers.io/) Provider ======== - -Explain what a provider is... - - Accounts Methods ---------------- - - -#### *provider* . **getBalance** ( address [ , blockTag="latest" ] ) **=>** *Promise< [BigNumber](../../utils/bignumber) >* +#### *provider* . **getBalance**( address [ , blockTag = latest ] ) => *Promise< [BigNumber](/api/utils/bignumber/) >* Returns the balance of *address* as of the *blockTag* block height. +#### *provider* . **getCode**( address [ , blockTag = latest ] ) => *Promise< string< [DataHexString](/api/utils/bytes/#DataHexString) > >* + +Returns the contract code of *address* as of the *blockTag* block height. If there is no contract currently deployed, the result is `0x`. -#### *provider* . **getCode** ( address [ , blockTag="latest" ] ) **=>** *Promise< string< [DataHexstring](../../utils/bytes) > >* - -Returns the contract code of *address* as of the *blockTag* block height. If there is -no contract currently deployed, the result is `0x`. - - - - -#### *provider* . **getStorageAt** ( addr , pos [ , blockTag="latest" ] ) **=>** *Promise< string< [DataHexstring](../../utils/bytes) > >* +#### *provider* . **getStorageAt**( addr , pos [ , blockTag = latest ] ) => *Promise< string< [DataHexString](/api/utils/bytes/#DataHexString) > >* Returns the `Bytes32` value of the position *pos* at address *addr*, as of the *blockTag*. +#### *provider* . **getTransactionCount**( address [ , blockTag = latest ] ) => *Promise< number >* - -#### *provider* . **getTransactionCount** ( address [ , blockTag="latest" ] ) **=>** *Promise< number >* - -Returns the number of transactions *address* has ever **sent**, as of *blockTag*. -This value is required to be the nonce for the next transaction from *address* -sent to the network. - - - - -### Examples - +Returns the number of transactions *address* has ever **sent**, as of *blockTag*. This value is required to be the nonce for the next transaction from *address* sent to the network. ```javascript -Skipping JavaScript Evaluation. +// Get the balance for an account... +provider.getBalance("ricmoo.firefly.eth"); +//! + +// Get the code for a contract... +provider.getCode("registrar.firefly.eth"); +//! + +// Get the storage value at position 0... +provider.getStorageAt("registrar.firefly.eth", 0) +//! + +// Get transaction count of an account... +provider.getTransactionCount("ricmoo.firefly.eth"); +//! ``` - - Blocks Methods -------------- +#### *provider* . **getBlock**( block ) => *Promise< [Block](/api/providers/types/#providers-Block) >* + +Get the *block* from the network, where the `result.transactions` is a list of transaction hashes. -#### *provider* . **getBlock** ( block ) **=>** *Promise< [Block](../types) >* +#### *provider* . **getBlockWithTransactions**( block ) => *Promise< [BlockWithTransactions](/api/providers/types/#providers-BlockWithTransactions) >* -Get the *block* from the network, where the `result.transactions` is a list -of transaction hashes. - - - - -#### *provider* . **getBlockWithTransactions** ( block ) **=>** *Promise< [BlockWithTransactions](../types) >* - -Get the *block* from the network, where the `result.transactions` is -an Array of [TransactionResponse](../types) objects. +Get the *block* from the network, where the `result.transactions` is an Array of [TransactionResponse](/api/providers/types/#providers-TransactionResponse) objects. +```javascript +provider.getBlock(100004) +//! +provider.getBlockWithTransactions(100004) +//! +``` Ethereum Naming Service (ENS) Methods ------------------------------------- +#### *provider* . **lookupAddress**( address ) => *Promise< string >* -TODO: Explain ENS here... +Performs a reverse lookup of the *address* in ENS using the *Reverse Registrar*. If the name does not exist, or the forward lookup does not match, `null` is returned. -#### *provider* . **lookupAddress** ( address ) **=>** *Promise< string >* - -Performs a reverse lookup of the *address* in ENS using the -*Reverse Registrar*. If the name does not exist, or the -forward lookup does not match, `null` is returned. - - - - -#### *provider* . **resolveName** ( name ) **=>** *Promise< string< [Address](../../utils/address) > >* - -Looks up the address of *name*. If the name is not owned, or -does not have a *Resolver* configured, or the *Resolver* does -not have an address configured, `null` is returned. - - - - -### Examples +#### *provider* . **resolveName**( name ) => *Promise< string< [Address](/api/utils/address/#address) > >* +Looks up the address of *name*. If the name is not owned, or does not have a *Resolver* configured, or the *Resolver* does not have an address configured, `null` is returned. ```javascript -Skipping JavaScript Evaluation. +// Reverse lookup of an ENS by address... +provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c"); +//! + +// Lookup an address of an ENS name... +provider.resolveName("ricmoo.firefly.eth"); +//! ``` - - Logs Methods ------------ +#### *provider* . **getLogs**( filter ) => *Promise< Array< [Log](/api/providers/types/#providers-Log) > >* +Returns the Array of [Log](/api/providers/types/#providers-Log) matching the *filter*. -#### *provider* . **getLogs** ( filter ) **=>** *Promise< Array< [Log](../types) > >* - -Returns the Array of [Log](../types) matching the *filter*. - -Keep in mind that many backends will discard old events, and that requests -which are too broad may get dropped as they require too many resources to -execute the query. - - +Keep in mind that many backends will discard old events, and that requests which are too broad may get dropped as they require too many resources to execute the query. Network Status Methods ---------------------- +#### *provider* . **getNetwork**( ) => *Promise< [Network](/api/providers/types/#providers-Network) >* + +Returns the [Network](/api/providers/types/#providers-Network) this Provider is connected to. -#### *provider* . **getNetwork** ( ) **=>** *Promise< [Network](../types) >* - -Returns the [Network](../types) this Provider is connected to. - - - - -#### *provider* . **getBlockNumber** ( ) **=>** *Promise< number >* +#### *provider* . **getBlockNumber**( ) => *Promise< number >* Returns the block number (or height) of the most recently mined block. +#### *provider* . **getGasPrice**( ) => *Promise< [BigNumber](/api/utils/bignumber/) >* + +Returns a *best guess* of the [Gas Price](/concepts/gas/#gas-price) to use in a transaction. -#### *provider* . **getGasPrice** ( ) **=>** *Promise< [BigNumber](../../utils/bignumber) >* - -Returns a *best guess* of the [Gas Price](../../../concepts/gas) to use in a transaction. +```javascript +// The network information +provider.getNetwork() +// +//! +network = utils.shallowCopy(_) +delete network._defaultProvider +network +// +//! +// The current block number +provider.getBlockNumber() +//! +// Get the current suggested gas price (in wei)... +gasPrice = await provider.getGasPrice() +//! async gasPrice +// ...often this gas price is easier to understand or +// display to the user in gwei (giga-wei, or 1e9 wei) +utils.formatUnits(gasPrice, "gwei") +//! +``` Transactions Methods -------------------- +#### *provider* . **call**( transaction [ , blockTag = latest ] ) => *Promise< string< [DataHexString](/api/utils/bytes/#DataHexString) > >* + +Returns the result of executing the *transaction*, using *call*. A call does not require any ether, but cannot change any state. This is useful for calling gettings on Contracts. -#### *provider* . **call** ( transaction [ , blockTag="latest" ] ) **=>** *Promise< string< [Hexstring](../../utils/bytes) > >* +#### *provider* . **estimateGas**( transaction ) => *Promise< [BigNumber](/api/utils/bignumber/) >* -Returns the result of executing the *transaction*, using *call*. A call -does not require any ether, but cannot change any state. This is useful -for calling gettings on Contracts. +Returns an estimate of the amount of gas that would be required to submit *transaction* to the network. + +An estimate may not be accurate since there could be another transaction on the network that was not accounted for, but after being mined affected relevant state. +#### *provider* . **sendTransaction**( transaction ) => *Promise< [TransactionResponse](/api/providers/types/#providers-TransactionResponse) >* + +Submits *transaction* to the network to be mined. The *transaction* **must** be signed, and be valid (i.e. the nonce is correct and the account has sufficient balance to pay for the transaction). -#### *provider* . **estimateGas** ( transaction ) **=>** *Promise< [BigNumber](../../utils/bignumber) >* - -Returns an estimate of the amount of gas that would be required to submit *transaction* -to the network. - -An estimate may not be accurate since there could be another transaction -on the network that was not accounted for, but after being mined affected -relevant state. - - - - -#### *provider* . **sendTransaction** ( transaction ) **=>** *Promise< [TransactionResponse](../types) >* - -Submits *transaction* to the network to be mined. The *transaction* **must** be signed, -and be valid (i.e. the nonce is correct and the account has sufficient balance to pay -for the transaction). - - - - -#### *provider* . **waitForTransaction** ( transactionHash ) **=>** *Promise< [TransactionReceipt](../types) >* +#### *provider* . **waitForTransaction**( hash [ , confirms = 1 [ , timeout ] ] ) => *Promise< [TxReceipt](/api/providers/types/#providers-TransactionReceipt) >* Returns a Promise which will not resolve until *transactionHash* is mined. - - Event Emitter Methods --------------------- - -Explain events here... - - -#### *provider* . **on** ( eventName , listener ) **=>** *this* +#### *provider* . **on**( eventName , listener ) => *this* Add a *listener* to be triggered for each *eventName*. +#### *provider* . **once**( eventName , listener ) => *this* + +Add a *listener* to be triggered for only the next *eventName*, at which time it be removed. -#### *provider* . **once** ( eventName , listener ) **=>** *this* +#### *provider* . **emit**( eventName , ...args ) => *boolean* -Add a *listener* to be triggered for only the next *eventName*, -at which time it be removed. +Notify all listeners of *eventName*, passing *args* to each listener. This is generally only used internally. +#### *provider* . **off**( eventName [ , listener ] ) => *this* + +Remove a *listener* for *eventName*. If no *listener* is provided, all listeners for *eventName* are removed. -#### *provider* . **emit** ( eventName , ...args ) **=>** *boolean* +#### *provider* . **removeAllListeners**( [ eventName ] ) => *this* -Notify all listeners of *eventName*, passing *args* to each listener. This -is generally only used internally. +Remove all the listeners for *eventName*. If no *eventName* is provided, **all** events are removed. +#### *provider* . **listenerCount**( [ eventName ] ) => *number* + +Returns the number of listeners for *eventName*. If no *eventName* is provided, the total number of listeners is returned. -#### *provider* . **off** ( eventName [ , listener ] ) **=>** *this* - -Remove a *listener* for *eventName*. If no *listener* is provided, -all listeners for *eventName* are removed. - - - - -#### *provider* . **removeAllListeners** ( [ eventName ] ) **=>** *this* - -Remove all the listeners for *eventName*. If no *eventName* is provided, -**all** events are removed. - - - - -#### *provider* . **listenerCount** ( [ eventName ] ) **=>** *number* - -Returns the number of listeners for *eventName*. If no *eventName* is -provided, the total number of listeners is returned. - - - - -#### *provider* . **listeners** ( eventName ) **=>** *Array< Listener >* +#### *provider* . **listeners**( eventName ) => *Array< Listener >* Returns the list of Listeners for *eventName*. +### Events +#### **Log Filter** + +A filter is an object, representing a contract log Filter, which has the optional properties `address` (the source contract) and `topics` (a topic-set to match). + +If `address` is unspecified, the filter matches any contract address. + +See events for more information on how to specify topic-sets. + + +#### **Topic-Set Filter** + +The value of a **Topic-Set Filter** is a array of Topic-Sets. + +This event is identical to a *Log Filter* with the address omitted (i.e. from any contract). + + +#### **Transaction Filter** + +The value of a **Transaction Filter** is any transaction hash. + +This event is emitted on every block that is part of a chain that includes the given mined transaction. It is much more common that the [once](/api/providers/provider/#Provider-once) method is used than the [on](/api/providers/provider/#Provider-on) method. + + + +In addition to transaction and filter events, there are several named events. + + +Named Provider Events + + + +```javascript +// +const txHash = utils.id("dummy-data"); +const myAddress = ethers.constants.HashZero; +const myOtherAddress = ethers.constants.HashZero; +// + +provider.on("block", (blockNumber) => { + // Emitted on every block change +}) + + +provider.once(txHash, (transaction) => { + // Emitted when the transaction has been mined +}) + + +// This filter could also be generated with the Contract or +// Interface API. If address is not specified, any address +// matches and if topics is not specified, any log matches +filter = { + address: "dai.tokens.ethers.eth", + topics: [ + utils.id("Transfer(address,address,uint256") + ] +} +provider.on(filter, (log, event) => { + // Emitted whenever a DAI token transfer occurs +}) + + +// Notice this is an array of topic-sets and is identical to +// using a filter with no address (i.e. match any address) +topicSets = [ + utils.id("Transfer(address,address,uint256"), + null, + [ + myAddress, + myOtherAddress + ] +] +provider.on(topicSets, (log, event) => { + // Emitted any token is sent TO either address +}) + + +provider.on("pending", (tx) => { + // Emitted when any new pending transaction is noticed +}); + + +provider.on("error", (tx) => { + // Emitted when any error occurs +}); + +// +// Make sure our documentation builds without waiting forever +provider.removeAllListeners() +// +``` Inspection Methods ------------------ - - -#### *Provider* . **isProvider** ( object ) **=>** *boolean* +#### *Provider* . **isProvider**( object ) => *boolean* Returns true if and only if *object* is a Provider. - - - ------ -**Content Hash:** 22872aec1236c5cf8fb457e93f36ca9bcd260acddc08c1ededc642931fd1625f \ No newline at end of file diff --git a/docs/api/providers/provider/index.html b/docs/api/providers/provider/index.html index 5519e33b1..1c1fb515c 100644 --- a/docs/api/providers/provider/index.html +++ b/docs/api/providers/provider/index.html @@ -1,50 +1,219 @@ -Provider

Provider

-

Explain what a provider is...

-

Accounts Methods

+ + + + Provider + + + + +
+ -
provider . getBalance ( address [ , blockTag = "latest" ] ) Promise< BigNumber >

Returns the balance of address as of the blockTag block height.

-
provider . getCode ( address [ , blockTag = "latest" ] ) Promise< string< DataHexstring > >

Returns the contract code of address as of the blockTag block height. If there is no contract currently deployed, the result is 0x.

-
provider . getStorageAt ( addr , pos [ , blockTag = "latest" ] ) Promise< string< DataHexstring > >

Returns the Bytes32 value of the position pos at address addr, as of the blockTag.

-
provider . getTransactionCount ( address [ , blockTag = "latest" ] ) Promise< number >

Returns the number of transactions address has ever sent, as of blockTag. This value is required to be the nonce for the next transaction from address sent to the network.

-

Examples

+

Provider

Explain what a provider is...

-
Skipping JavaScript Evaluation.
+

Accounts Methods

+
provider.getBalance( address [ , blockTag = latest ] ) Promise< BigNumber >

Returns the balance of address as of the blockTag block height.

-

Blocks Methods

+
provider.getCode( address [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the contract code of address as of the blockTag block height. If there is no contract currently deployed, the result is 0x.

-
provider . getBlock ( block ) Promise< Block >

Get the block from the network, where the result.transactions is a list of transaction hashes.

-
provider . getBlockWithTransactions ( block ) Promise< BlockWithTransactions >

Get the block from the network, where the result.transactions is an Array of TransactionResponse objects.

-

Ethereum Naming Service (ENS) Methods

-

TODO: Explain ENS here...

-
provider . lookupAddress ( address ) Promise< string >

Performs a reverse lookup of the address in ENS using the Reverse Registrar. If the name does not exist, or the forward lookup does not match, null is returned.

-
provider . resolveName ( name ) Promise< string< Address > >

Looks up the address of name. If the name is not owned, or does not have a Resolver configured, or the Resolver does not have an address configured, null is returned.

-

Examples

+
provider.getStorageAt( addr , pos [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the Bytes32 value of the position pos at address addr, as of the blockTag.

-
Skipping JavaScript Evaluation.
+
provider.getTransactionCount( address [ , blockTag = latest ] ) Promise< number >

Returns the number of transactions address has ever sent, as of blockTag. This value is required to be the nonce for the next transaction from address sent to the network.

-

Logs Methods

+
Account Examples
// Get the balance for an account... +provider.getBalance("ricmoo.firefly.eth"); +//! -
provider . getLogs ( filter ) Promise< Array< Log > >

Returns the Array of Log matching the filter.

Keep in mind that many backends will discard old events, and that requests which are too broad may get dropped as they require too many resources to execute the query.

-

Network Status Methods

+// Get the code for a contract... +provider.getCode("registrar.firefly.eth"); +//! -
provider . getNetwork ( ) Promise< Network >

Returns the Network this Provider is connected to.

-
provider . getBlockNumber ( ) Promise< number >

Returns the block number (or height) of the most recently mined block.

-
provider . getGasPrice ( ) Promise< BigNumber >

Returns a best guess of the Gas Price to use in a transaction.

-

Transactions Methods

+// Get the storage value at position 0... +provider.getStorageAt("registrar.firefly.eth", 0) +//! -
provider . call ( transaction [ , blockTag = "latest" ] ) Promise< string< Hexstring > >

Returns the result of executing the transaction, using call. A call does not require any ether, but cannot change any state. This is useful for calling gettings on Contracts.

-
provider . estimateGas ( transaction ) Promise< BigNumber >

Returns an estimate of the amount of gas that would be required to submit transaction to the network.

An estimate may not be accurate since there could be another transaction on the network that was not accounted for, but after being mined affected relevant state.

-
provider . sendTransaction ( transaction ) Promise< TransactionResponse >

Submits transaction to the network to be mined. The transaction must be signed, and be valid (i.e. the nonce is correct and the account has sufficient balance to pay for the transaction).

-
provider . waitForTransaction ( transactionHash ) Promise< TransactionReceipt >

Returns a Promise which will not resolve until transactionHash is mined.

-

Event Emitter Methods

-

Explain events here...

-
provider . on ( eventName , listener ) this

Add a listener to be triggered for each eventName.

-
provider . once ( eventName , listener ) this

Add a listener to be triggered for only the next eventName, at which time it be removed.

-
provider . emit ( eventName , ...args ) boolean

Notify all listeners of eventName, passing args to each listener. This is generally only used internally.

-
provider . off ( eventName [ , listener ] ) this

Remove a listener for eventName. If no listener is provided, all listeners for eventName are removed.

-
provider . removeAllListeners ( [ eventName ] ) this

Remove all the listeners for eventName. If no eventName is provided, all events are removed.

-
provider . listenerCount ( [ eventName ] ) number

Returns the number of listeners for eventName. If no eventName is provided, the total number of listeners is returned.

-
provider . listeners ( eventName ) Array< Listener >

Returns the list of Listeners for eventName.

-

Inspection Methods

+// Get transaction count of an account... +provider.getTransactionCount("ricmoo.firefly.eth"); +//!

Blocks Methods

+
provider.getBlock( block ) Promise< Block >

Get the block from the network, where the result.transactions is a list of transaction hashes.

-
Provider . isProvider ( object ) boolean

Returns true if and only if object is a Provider.

\ No newline at end of file +
provider.getBlockWithTransactions( block ) Promise< BlockWithTransactions >

Get the block from the network, where the result.transactions is an Array of TransactionResponse objects.

+ +
Block Examples
provider.getBlock(100004) +//! + +provider.getBlockWithTransactions(100004) +//!

Ethereum Naming Service (ENS) Methods

The Ethereum Naming Service (ENS) allows a short and easy-to-remember ENS Name to be atached to any set of keys and values.

+ +

One of the most common uses for this is to use a simple name to refer to an Ethereum Address.

+ +

In the ethers API, nearly anywhere that accepts an address, an ENS name may be used instead, which can simplify code and make reading and debugging much simpler.

+ +

The provider offers some basic operations to help resolve and work with ENS names.

+ +
provider.lookupAddress( address ) Promise< string >

Performs a reverse lookup of the address in ENS using the Reverse Registrar. If the name does not exist, or the forward lookup does not match, null is returned.

+ +
provider.resolveName( name ) Promise< string< Address > >

Looks up the address of name. If the name is not owned, or does not have a Resolver configured, or the Resolver does not have an address configured, null is returned.

+ +
ENS Examples
// Reverse lookup of an ENS by address... +provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c"); +//! + +// Lookup an address of an ENS name... +provider.resolveName("ricmoo.firefly.eth"); +//!

Logs Methods

+
provider.getLogs( filter ) Promise< Array< Log > >

Returns the Array of Log matching the filter.

+ +

Keep in mind that many backends will discard old events, and that requests which are too broad may get dropped as they require too many resources to execute the query.

+ +

Network Status Methods

+
provider.getNetwork( ) Promise< Network >

Returns the Network this Provider is connected to.

+ +
provider.getBlockNumber( ) Promise< number >

Returns the block number (or height) of the most recently mined block.

+ +
provider.getGasPrice( ) Promise< BigNumber >

Returns a best guess of the Gas Price to use in a transaction.

+ +
Network Status Examples
// The network information +provider.getNetwork() +// <hide> +//! +network = utils.shallowCopy(_) +delete network._defaultProvider +network +// </hide> +//! + +// The current block number +provider.getBlockNumber() +//! + +// Get the current suggested gas price (in wei)... +gasPrice = await provider.getGasPrice() +//! async gasPrice + +// ...often this gas price is easier to understand or +// display to the user in gwei (giga-wei, or 1e9 wei) +utils.formatUnits(gasPrice, "gwei") +//!

Transactions Methods

+
provider.call( transaction [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the result of executing the transaction, using call. A call does not require any ether, but cannot change any state. This is useful for calling gettings on Contracts.

+ +
provider.estimateGas( transaction ) Promise< BigNumber >

Returns an estimate of the amount of gas that would be required to submit transaction to the network.

+ +

An estimate may not be accurate since there could be another transaction on the network that was not accounted for, but after being mined affected relevant state.

+ +
provider.sendTransaction( transaction ) Promise< TransactionResponse >

Submits transaction to the network to be mined. The transaction must be signed, and be valid (i.e. the nonce is correct and the account has sufficient balance to pay for the transaction).

+ +
provider.waitForTransaction( hash [ , confirms = 1 [ , timeout ] ] ) Promise< TxReceipt >

Returns a Promise which will not resolve until transactionHash is mined.

+ +

Event Emitter Methods

Explain events here...

+ +
provider.on( eventName , listener ) this

Add a listener to be triggered for each eventName.

+ +
provider.once( eventName , listener ) this

Add a listener to be triggered for only the next eventName, at which time it be removed.

+ +
provider.emit( eventName , ...args ) boolean

Notify all listeners of eventName, passing args to each listener. This is generally only used internally.

+ +
provider.off( eventName [ , listener ] ) this

Remove a listener for eventName. If no listener is provided, all listeners for eventName are removed.

+ +
provider.removeAllListeners( [ eventName ] ) this

Remove all the listeners for eventName. If no eventName is provided, all events are removed.

+ +
provider.listenerCount( [ eventName ] ) number

Returns the number of listeners for eventName. If no eventName is provided, the total number of listeners is returned.

+ +
provider.listeners( eventName ) Array< Listener >

Returns the list of Listeners for eventName.

+ +

Events

Any of the following may be used as the eventName in the above methods.

+ +
Log Filter

A filter is an object, representing a contract log Filter, which has the optional properties address (the source contract) and topics (a topic-set to match).

+ +

If address is unspecified, the filter matches any contract address.

+ +

See events for more information on how to specify topic-sets.

+ +
Topic-Set Filter

The value of a Topic-Set Filter is a array of Topic-Sets.

+ +

This event is identical to a Log Filter with the address omitted (i.e. from any contract).

+ +
Transaction Filter

The value of a Transaction Filter is any transaction hash.

+ +

This event is emitted on every block that is part of a chain that includes the given mined transaction. It is much more common that the once method is used than the on method.

+ +

In addition to transaction and filter events, there are several named events.

+ +
Event NameArgumentsDescription 
"block"blockNumberemitted when a new block is mined 
"error"erroremitted on any error 
"pending"pendingTransactionemitted when a new transaction enters the memory pool; only certain providers offer this event and may require running your own node for reliable results 
"willPoll"pollIdemitted prior to a polling loop is about to begin; (very rarely used by most developers) 
"poll"pollId, blockNumberemitted during each poll cycle after `blockNumber` is updated (if changed) and before any other events (if any) are emitted during the poll loop; (very rarely used by most developers) 
"didPoll"pollIdemitted after all events from a polling loop are emitted; (very rarely used by most developers) 
"debug"provider dependenteach Provider may use this to emit useful debugging information and the format is up to the developer; (very rarely used by most developers) 
Named Provider Events 
Events Example
// <hide> +const txHash = utils.id("dummy-data"); +const myAddress = ethers.constants.HashZero; +const myOtherAddress = ethers.constants.HashZero; +// </hide> + +provider.on("block", (blockNumber) => { + // Emitted on every block change +}) + + +provider.once(txHash, (transaction) => { + // Emitted when the transaction has been mined +}) + + +// This filter could also be generated with the Contract or +// Interface API. If address is not specified, any address +// matches and if topics is not specified, any log matches +filter = { + address: "dai.tokens.ethers.eth", + topics: [ + utils.id("Transfer(address,address,uint256") + ] +} +provider.on(filter, (log, event) => { + // Emitted whenever a DAI token transfer occurs +}) + + +// Notice this is an array of topic-sets and is identical to +// using a filter with no address (i.e. match any address) +topicSets = [ + utils.id("Transfer(address,address,uint256"), + null, + [ + myAddress, + myOtherAddress + ] +] +provider.on(topicSets, (log, event) => { + // Emitted any token is sent TO either address +}) + + +provider.on("pending", (tx) => { + // Emitted when any new pending transaction is noticed +}); + + +provider.on("error", (tx) => { + // Emitted when any error occurs +}); + +// <hide> +// Make sure our documentation builds without waiting forever +provider.removeAllListeners() +// </hide>

Inspection Methods

+
Provider.isProvider( object ) boolean

Returns true if and only if object is a Provider.

+ +
+ + + +
+ + + diff --git a/docs/api/providers/types/README.md b/docs/api/providers/types/README.md index 438b6860f..64fac7f38 100644 --- a/docs/api/providers/types/README.md +++ b/docs/api/providers/types/README.md @@ -7,579 +7,351 @@ Documentation: [html](https://docs-beta.ethers.io/) Types ===== - - BlockTag -------- - -A **BlockTag** specifies a specific location in the Blockchain. - - - -* **`"latest"`** -- The most recently mined block -* **`"earliest"`** -- Block #0 -* **`"pending"`** -- The block currently being prepared for mining; not all operations and backends support this BlockTag -* ***number*** -- The block at this height -* ***a negative number*** -- The block this many blocks ago - - ### EventType - -And **EventType** can be any of the following. - - - -* ***string*** -- TODO... -* ***Array> | Array>>>*** -- TODO... -* ***[EventFilter](./)*** -- TODO... - - Network ------- +#### *network* . **name** => *string* -A **Network** represents an Etherem network. +The human-readable name of the network, such as `homestead`. If the network name is unknown, this will be `"unknown"`. -#### *network* . **name** **=>** *string* - -The human-readable name of the network, such as `homestead`. If the network -name is unknown, this will be `"unknown"`. - - - - -#### *network* . **chainId** **=>** *number* +#### *network* . **chainId** => *number* The Chain ID of the network. - - -#### *network* . **ensAddress** **=>** *string< [Address](../../utils/address) >* +#### *network* . **ensAddress** => *string< [Address](/api/utils/address/#address) >* The address at which the ENS registry is deployed on this network. - - Block ----- - - -#### *block* . **hash** **=>** *string< [DataHexstring](../../utils/bytes)< 32 > >* +#### *block* . **hash** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The hash of this block. - - -#### *block* . **parentHash** **=>** *string< [DataHexstring](../../utils/bytes)< 32 > >* +#### *block* . **parentHash** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The hash of the previous block. - - -#### *block* . **number** **=>** *number* +#### *block* . **number** => *number* The height (number) of this block. - - -#### *block* . **timestamp** **=>** *number* +#### *block* . **timestamp** => *number* The timestamp of this block. - - -#### *block* . **nonce** **=>** *string< [DataHexstring](../../utils/bytes) >* +#### *block* . **nonce** => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* The nonce used as part of the proof-of-work to mine this block. This property is generally of little interest developers. - - -#### *block* . **difficulty** **=>** *number* +#### *block* . **difficulty** => *number* The difficulty target required to be met by the miner of the block. This property is generally of little interest developers. +#### *block* . **gasLimit** => *[BigNumber](/api/utils/bignumber/)* - -#### *block* . **gasLimit** **=>** *[BigNumber](../../utils/bignumber)* - -The maximum amount of gas that this block was permitted to use. This -is a value that can be voted up or voted down by miners and is used -to automatically adjust the bandwidth requirements of the network. +The maximum amount of gas that this block was permitted to use. This is a value that can be voted up or voted down by miners and is used to automatically adjust the bandwidth requirements of the network. This property is generally of little interest developers. - - -#### *block* . **gasUsed** **=>** *[BigNumber](../../utils/bignumber)* +#### *block* . **gasUsed** => *[BigNumber](/api/utils/bignumber/)* The total amount of gas used by all transactions in this block. +#### *block* . **miner** => *string* + +The coinbase address of this block, which indicates the address the miner that mined this block would like the subsidy reward to go to. -#### *block* . **miner** **=>** *string* - -The coinbase address of this block, which indicates the address the -miner that mined this block would like the subsidy reward to go to. - - - - -#### *block* . **extraData** **=>** *string* +#### *block* . **extraData** => *string* This is extra data a miner may choose to include when mining a block. This property is generally of little interest developers. - - ### Block (with transaction hashes) +#### *block* . **transactions** => *Array< string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > > >* -Often only the hashes of the transactions included in a block are needed, -so by default a block only contains this information, as it is -substantially less data. - - -#### *block* . **transactions** **=>** *Array< string< [DataHexstring](../../utils/bytes)< 32 > > >* - -A list of the transactions hashes for each transaction this block -includes. - - +A list of the transactions hashes for each transaction this block includes. ### BlockWithTransactions - -If all transactions for a block are needed, this object instead includes -the full details on each transaction. - - -#### *block* . **transactions** **=>** *Array< [TransactionResponse](./) >* +#### *block* . **transactions** => *Array< [TransactionResponse](/api/providers/types/#providers-TransactionResponse) >* A list of the transactions this block includes. - - Events and Logs --------------- - - ### EventFilter - - -#### *filter* . **address** **=>** *string< [Address](../../utils/address) >* +#### *filter* . **address** => *string< [Address](/api/utils/address/#address) >* The address to filter by, or `null` to match any address. +#### *filter* . **topics** => *Array< string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > > | Array< string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > > > >* - -#### *filter* . **topics** **=>** *Array< string< [DataHexstring](../../utils/bytes)< 32 > >|Array< string< [DataHexstring](../../utils/bytes)< 32 > > > >* - -The topics to filter by, or `null` to match any topics. Each entry represents an -**AND** condition that must match, or may be `null` to match anything. If a given -entry is an Array, then that entry is treated as an **OR** for any value in the entry. - - +The topics to filter by, or `null` to match any topics. Each entry represents an **AND** condition that must match, or may be `null` to match anything. If a given entry is an Array, then that entry is treated as an **OR** for any value in the entry. ### Filter - - -#### *filter* . **fromBlock** **=>** *[BlockTag](./)* +#### *filter* . **fromBlock** => *[BlockTag](/api/providers/types/#providers-BlockTag)* The starting block (inclusive) to search for logs matching the filter criteria. - - -#### *filter* . **toBlock** **=>** *[BlockTag](./)* +#### *filter* . **toBlock** => *[BlockTag](/api/providers/types/#providers-BlockTag)* The end block (inclusive) to search for logs matching the filter criteria. - - ### FilterByBlockHash - - -#### *filter* . **blockHash** **=>** *string< [DataHexstring](../../utils/bytes)< 32 > >* +#### *filter* . **blockHash** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The specific block (by its block hash) to search for logs matching the filter criteria. - - ### Log - - -#### *log* . **blockNumber** **=>** *number* +#### *log* . **blockNumber** => *number* The block height (number) of the block including the transaction of this log. - - -#### *log* . **blockHash** **=>** *string< [DataHexstring](../../utils/bytes)< 32 > >* +#### *log* . **blockHash** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The block hash of the block including the transaction of this log. +#### *log* . **removed** => *boolean* + +During a re-org, if a transaction is orphaned, this will be set to true to indicate the Log entry has been removed; it will likely be emitted again in the near future when another block is mined with the transaction that triggered this log, but keep in mind the values may change. -#### *log* . **removed** **=>** *boolean* - -During a re-org, if a transaction is orphaned, this will be set to true -to indicate the Log entry has been removed; it will likely be emitted -again in the near future when another block is mined with the transaction -that triggered this log, but keep in mind the values may change. - - - - -#### *log* . **transactionLogIndex** **=>** *number* +#### *log* . **transactionLogIndex** => *number* The index of this log in the transaction. - - -#### *log* . **address** **=>** *string< [Address](../../utils/address) >* +#### *log* . **address** => *string< [Address](/api/utils/address/#address) >* The address of the contract that generated this log. - - -#### *log* . **data** **=>** *string< [DataHexstring](../../utils/bytes) >* +#### *log* . **data** => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* The data included in this log. - - -#### *log* . **topics** **=>** *Array< string< [DataHexstring](../../utils/bytes)< 32 > > >* +#### *log* . **topics** => *Array< string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > > >* The list of topics (indexed properties) for this log. - - -#### *log* . **transactionHash** **=>** *string< [DataHexstring](../../utils/bytes)< 32 > >* +#### *log* . **transactionHash** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The transaction hash of the transaction of this log. - - -#### *log* . **transactionIndex** **=>** *number* +#### *log* . **transactionIndex** => *number* The index of the transaction in the block of the transaction of this log. - - -#### *log* . **logIndex** **=>** *number* +#### *log* . **logIndex** => *number* The index of this log across all logs in the entire **block**. - - Transactions ------------ - - ### TransactionRequest - -A transaction request describes a transaction that is to -be sent to the network or otherwise processed. - -All fields are optional and may be a promise which resolves -to the required type. - - -#### *transactionRequest* . **to** **=>** *string|Promise< string >* +#### *transactionRequest* . **to** => *string | Promise< string >* The address (or ENS name) this transaction it to. - - -#### *transactionRequest* . **from** **=>** *string< [Address](../../utils/address) >|Promise< string< [Address](../../utils/address) > >* +#### *transactionRequest* . **from** => *string< [Address](/api/utils/address/#address) > | Promise< string< [Address](/api/utils/address/#address) > >* The address this transaction is from. +#### *transactionRequest* . **nonce** => *number | Promise< number >* + +The nonce for this transaction. This should be set to the number of transactions ever sent **from** this address. -#### *transactionRequest* . **nonce** **=>** *number|Promise< number >* - -The nonce for this transaction. This should be set to the number of -transactions ever sent **from** this address. - - - - -#### *transactionRequest* . **gasLimit** **=>** *[BigNumber](../../utils/bignumber)|Promise< [BigNumber](../../utils/bignumber) >* +#### *transactionRequest* . **gasLimit** => *[BigNumber](/api/utils/bignumber/) | Promise< [BigNumber](/api/utils/bignumber/) >* The maximum amount of gas this transaction is permitted to use. - - -#### *transactionRequest* . **gasPrice** **=>** *[BigNumber](../../utils/bignumber)|Promise< [BigNumber](../../utils/bignumber) >* +#### *transactionRequest* . **gasPrice** => *[BigNumber](/api/utils/bignumber/) | Promise< [BigNumber](/api/utils/bignumber/) >* The price (in wei) per unit of gas this transaction will pay. - - -#### *transactionRequest* . **data** **=>** *[DataHexstring](../../utils/bytes)|Promise< [DataHexstring](../../utils/bytes) >* +#### *transactionRequest* . **data** => *[DataHexString](/api/utils/bytes/#DataHexString) | Promise< [DataHexString](/api/utils/bytes/#DataHexString) >* The transaction data. - - -#### *transactionRequest* . **value** **=>** *[BigNumber](../../utils/bignumber)|Promise< [BigNumber](../../utils/bignumber) >* +#### *transactionRequest* . **value** => *[BigNumber](/api/utils/bignumber/) | Promise< [BigNumber](/api/utils/bignumber/) >* The amount (in wei) this transaction is sending. +#### *transactionRequest* . **chainId** => *number | Promise< number >* +The chain ID this transaction is authorized on, as specified by [EIP-155](https://eips.ethereum.org/EIPS/eip-155). -#### *transactionRequest* . **chainId** **=>** *number|Promise< number >* - -The chain ID this transaction is authorized on, as specified by -[EIP-155](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-155). - -If the chain ID is 0 will disable EIP-155 and the transaction will be valid -on any network. This can be **dangerous** and care should be taken, since it -allows transactions to be replayed on networks that were possibly not -intended. - - +If the chain ID is 0 will disable EIP-155 and the transaction will be valid on any network. This can be **dangerous** and care should be taken, since it allows transactions to be replayed on networks that were possibly not intended. ### TransactionResponse +#### *transaction* . **blockNumber** => *number* -A **TransactionResponse** includes all properties of a [Transaction](../../utils/transactions) as well as several -properties that are useful once it has been mined. +The number ("height") of the block this transaction was mined in. If the block has not been mined, this is `null`. -#### *transaction* . **blockNumber** **=>** *number* +#### *transaction* . **blockHash** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* -The number ("height") of the block this transaction was mined in. If the block has not been mined, -this is `null`. +The hash of the block this transaction was mined in. If the block has not been mined, this is `null`. +#### *transaction* . **timestamp** => *number* + +The timestamp of the block this transaction was mined in. If the block has not been mined, this is `null`. -#### *transaction* . **blockHash** **=>** *string< [DataHexstring](../../utils/bytes)< 32 > >* +#### *transaction* . **confirmations** => *number* -The hash of the block this transaction was mined in. If the block has not been mined, -this is `null`. +The number of blocks that have been mined (including the initial block) since this transaction was mined. - - -#### *transaction* . **timestamp** **=>** *number* - -The timestamp of the block this transaction was mined in. If the block has not been mined, -this is `null`. - - - - -#### *transaction* . **confirmations** **=>** *number* - -The number of blocks that have been mined (including the initial block) since this -transaction was mined. - - - - -#### *transaction* . **raw** **=>** *string< [DataHexstring](../../utils/bytes) >* +#### *transaction* . **raw** => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* The serialized transaction. +#### *transaction* . **wait**( [ confirmations = 1 ] ) => *Promise< [TransactionReceipt](/api/providers/types/#providers-TransactionReceipt) >* - -#### *transaction* . **wait** ( [ confirmations=1 ] ) **=>** *Promise< [TransactionReceipt](./) >* - -Wait for *confirmations*. If 0, and the transaction has not been mined, -`null` is returned. - - +Wait for *confirmations*. If 0, and the transaction has not been mined, `null` is returned. ### TransactionReceipt +#### *receipt* . **to** => *string< [Address](/api/utils/address/#address) >* + +The address this transaction is to. This is `null` if the the transaction was an **init transaction**, used to deploy a contract. -#### *receipt* . **to** **=>** *string< [Address](../../utils/address) >* - -The address this transaction is to. This is `null` if the the -transaction was an **init transaction**, used to deploy a contract. - - - - -#### *receipt* . **from** **=>** *string< [Address](../../utils/address) >* +#### *receipt* . **from** => *string< [Address](/api/utils/address/#address) >* The address this transaction is from. +#### *receipt* . **contractAddress** => *string< [Address](/api/utils/address/#address) >* + +If this transaction has a `null` to address, it is an **init transaction** used to deploy a contract, in which case this is the address created by that contract. + +To compute a contract address, the [getContractAddress](/api/utils/address/#utils-getContractAddress) utility function can also be used with a [TransactionResponse](/api/providers/types/#providers-TransactionResponse) object, which requires the transaction nonce and the address of the sender. -#### *receipt* . **contractAddress** **=>** *string< [Address](../../utils/address) >* +#### *receipt* . **transactionIndex** => *number* -If this transaction has a ``null` to address, it is an **init transaction** -used to deploy a contract, in which case this is the address created by that -contract. - -To compute a contract address, the [getContractAddress](../../utils/address) -utility function can also be used with a [TransactionResponse](./) -object, which requires the transaction nonce and the address of the sender. +The index of this transaction in the list of transactions included in the block this transaction was mined in. - - -#### *receipt* . **transactionIndex** **=>** *number* - -The index of this transaction in the list of transactions included in -the block this transaction was mined in. - - - - -#### *receipt* . **root** **=>** *string* +#### *receipt* . **root** => *string* The intermediate state root of a receipt. -Only transactions included in blocks **before** the [Byzantium Hard Fork](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-609) -have this property, as it was replaced by the `status` property. +Only transactions included in blocks **before** the [Byzantium Hard Fork](https://eips.ethereum.org/EIPS/eip-609) have this property, as it was replaced by the `status` property. -The property is generally of little use to developers. At the time -it could be used to verify a state transition with a fraud-proof -only considering the single transaction; without it the full block -must be considered. +The property is generally of little use to developers. At the time it could be used to verify a state transition with a fraud-proof only considering the single transaction; without it the full block must be considered. - - -#### *receipt* . **gasUsed** **=>** *[BigNumber](../../utils/bignumber)* +#### *receipt* . **gasUsed** => *[BigNumber](/api/utils/bignumber/)* The amount of gas actually used by this transaction. +#### *receipt* . **logsBloom** => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* + +A [bloom-filter](https://en.wikipedia.org/wiki/Bloom_filter), which incldues all the addresses and topics included in any log in this transaction. -#### *receipt* . **logsBloom** **=>** *string< [DataHexstring](../../utils/bytes) >* - -A [bloom-filter](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Bloom_filter), which -incldues all the addresses and topics included in any log in this -transaction. - - - - -#### *receipt* . **blockHash** **=>** *string< [DataHexstring](../../utils/bytes)< 32 > >* +#### *receipt* . **blockHash** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The block hash of the block that this transaction was included in. - - -#### *receipt* . **transactionHash** **=>** *string< [DataHexstring](../../utils/bytes)< 32 > >* +#### *receipt* . **transactionHash** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The transaction hash of this transaction. - - -#### *receipt* . **logs** **=>** *Array< [Log](./) >* +#### *receipt* . **logs** => *Array< [Log](/api/providers/types/#providers-Log) >* All the logs emitted by this transaction. +#### *receipt* . **blockNumber** => *number* + +The block height (number) of the block that this transaction was included in. -#### *receipt* . **blockNumber** **=>** *number* +#### *receipt* . **confirmations** => *number* -The block height (number) of the block that this transaction was -included in. +The number of blocks that have been mined since this transaction, including the actual block it was mined in. +#### *receipt* . **cumulativeGasUsed** => *[BigNumber](/api/utils/bignumber/)* - -#### *receipt* . **confirmations** **=>** *number* - -The number of blocks that have been mined since this transaction, -including the actual block it was mined in. - - - - -#### *receipt* . **cumulativeGasUsed** **=>** *[BigNumber](../../utils/bignumber)* - -For the block this transaction was included in, this is the sum of the -gas used used by each transaction in the ordered list of transactions -up to (and including) this transaction. +For the block this transaction was included in, this is the sum of the gas used used by each transaction in the ordered list of transactions up to (and including) this transaction. This is generally of little interest to developers. +#### *receipt* . **byzantium** => *boolean* + +This is true if the block is in a [post-Byzantium Hard Fork](https://eips.ethereum.org/EIPS/eip-609) block. -#### *receipt* . **byzantium** **=>** *boolean* +#### *receipt* . **status** => *boolean* -This is true if the block is in a [post-Byzantium Hard Fork](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-609) -block. +The status of a transaction is 1 is successful or 0 if it was reverted. Only transactions included in blocks [post-Byzantium Hard Fork](https://eips.ethereum.org/EIPS/eip-609) have this property. - - -#### *receipt* . **status** **=>** *boolean* - -The status of a transaction is 1 is successful or 0 if it was -reverted. Only transactions included in blocks [post-Byzantium Hard Fork](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-609) -have this property. - - - - - ------ -**Content Hash:** 911f42520657ebece6d9fe0456cae0540134758a7253057c42acffac94fb0895 \ No newline at end of file diff --git a/docs/api/providers/types/index.html b/docs/api/providers/types/index.html index ea6d219b0..5b87b9c3c 100644 --- a/docs/api/providers/types/index.html +++ b/docs/api/providers/types/index.html @@ -1,91 +1,194 @@ -Types

Types

+ + + + Types + + + + +
+ -

BlockTag

-

A BlockTag specifies a specific location in the Blockchain.

  • "latest"–The most recently mined block
  • "earliest"–Block #0
  • "pending"–The block currently being prepared for mining; not all operations and backends support this BlockTag
  • number–The block at this height
  • a negative number–The block this many blocks ago
-

EventType

-

And EventType can be any of the following.

-

Network

-

A Network represents an Etherem network.

-
network . name string

The human-readable name of the network, such as homestead. If the network name is unknown, this will be "unknown".

-
network . chainId number

The Chain ID of the network.

-
network . ensAddress string< Address >

The address at which the ENS registry is deployed on this network.

-

Block

+

Types

+

BlockTag

A BlockTag specifies a specific location in the Blockchain.

-
block . hash string< DataHexstring< 32 > >

The hash of this block.

-
block . parentHash string< DataHexstring< 32 > >

The hash of the previous block.

-
block . number number

The height (number) of this block.

-
block . timestamp number

The timestamp of this block.

-
block . nonce string< DataHexstring >

The nonce used as part of the proof-of-work to mine this block.

This property is generally of little interest developers.

-
block . difficulty number

The difficulty target required to be met by the miner of the block.

This property is generally of little interest developers.

-
block . gasLimit BigNumber

The maximum amount of gas that this block was permitted to use. This is a value that can be voted up or voted down by miners and is used to automatically adjust the bandwidth requirements of the network.

This property is generally of little interest developers.

-
block . gasUsed BigNumber

The total amount of gas used by all transactions in this block.

-
block . miner string

The coinbase address of this block, which indicates the address the miner that mined this block would like the subsidy reward to go to.

-
block . extraData string

This is extra data a miner may choose to include when mining a block.

This property is generally of little interest developers.

-

Block (with transaction hashes)

-

Often only the hashes of the transactions included in a block are needed, so by default a block only contains this information, as it is substantially less data.

-
block . transactions Array< string< DataHexstring< 32 > > >

A list of the transactions hashes for each transaction this block includes.

-

BlockWithTransactions inherits Block

-

If all transactions for a block are needed, this object instead includes the full details on each transaction.

-
block . transactions Array< TransactionResponse >

A list of the transactions this block includes.

-

Events and Logs

+

  • "latest" -- The most recently mined block
  • "earliest" -- Block #0
  • "pending" -- The block currently being prepared for mining; not all operations and backends support this BlockTag
  • number -- The block at this height
  • a negative number -- The block this many blocks ago

-

EventFilter

+

EventType

And EventType can be any of the following.

-
filter . address string< Address >

The address to filter by, or null to match any address.

-
filter . topics Array< string< DataHexstring< 32 > >  |  Array< string< DataHexstring< 32 > > > >

The topics to filter by, or null to match any topics. Each entry represents an AND condition that must match, or may be null to match anything. If a given entry is an Array, then that entry is treated as an OR for any value in the entry.

-

Filter inherits EventFilter

+

-
filter . fromBlock BlockTag

The starting block (inclusive) to search for logs matching the filter criteria.

-
filter . toBlock BlockTag

The end block (inclusive) to search for logs matching the filter criteria.

-

FilterByBlockHash inherits EventFilter

+

Network

A Network represents an Etherem network.

-
filter . blockHash string< DataHexstring< 32 > >

The specific block (by its block hash) to search for logs matching the filter criteria.

-

Log

+
network.name string

The human-readable name of the network, such as homestead. If the network name is unknown, this will be "unknown".

-
log . blockNumber number

The block height (number) of the block including the transaction of this log.

-
log . blockHash string< DataHexstring< 32 > >

The block hash of the block including the transaction of this log.

-
log . removed boolean

During a re-org, if a transaction is orphaned, this will be set to true to indicate the Log entry has been removed; it will likely be emitted again in the near future when another block is mined with the transaction that triggered this log, but keep in mind the values may change.

-
log . transactionLogIndex number

The index of this log in the transaction.

-
log . address string< Address >

The address of the contract that generated this log.

-
log . data string< DataHexstring >

The data included in this log.

-
log . topics Array< string< DataHexstring< 32 > > >

The list of topics (indexed properties) for this log.

-
log . transactionHash string< DataHexstring< 32 > >

The transaction hash of the transaction of this log.

-
log . transactionIndex number

The index of the transaction in the block of the transaction of this log.

-
log . logIndex number

The index of this log across all logs in the entire block.

-

Transactions

+
network.chainId number

The Chain ID of the network.

-

TransactionRequest

-

A transaction request describes a transaction that is to be sent to the network or otherwise processed.

All fields are optional and may be a promise which resolves to the required type.

-
transactionRequest . to string  |  Promise< string >

The address (or ENS name) this transaction it to.

-
transactionRequest . from string< Address >  |  Promise< string< Address > >

The address this transaction is from.

-
transactionRequest . nonce number  |  Promise< number >

The nonce for this transaction. This should be set to the number of transactions ever sent from this address.

-
transactionRequest . gasLimit BigNumber  |  Promise< BigNumber >

The maximum amount of gas this transaction is permitted to use.

-
transactionRequest . gasPrice BigNumber  |  Promise< BigNumber >

The price (in wei) per unit of gas this transaction will pay.

-
transactionRequest . data DataHexstring  |  Promise< DataHexstring >

The transaction data.

-
transactionRequest . value BigNumber  |  Promise< BigNumber >

The amount (in wei) this transaction is sending.

-
transactionRequest . chainId number  |  Promise< number >

The chain ID this transaction is authorized on, as specified by EIP-155.

If the chain ID is 0 will disable EIP-155 and the transaction will be valid on any network. This can be dangerous and care should be taken, since it allows transactions to be replayed on networks that were possibly not intended.

-

TransactionResponse inherits Transaction

-

A TransactionResponse includes all properties of a Transaction as well as several properties that are useful once it has been mined.

-
transaction . blockNumber number

The number ("height") of the block this transaction was mined in. If the block has not been mined, this is null.

-
transaction . blockHash string< DataHexstring< 32 > >

The hash of the block this transaction was mined in. If the block has not been mined, this is null.

-
transaction . timestamp number

The timestamp of the block this transaction was mined in. If the block has not been mined, this is null.

-
transaction . confirmations number

The number of blocks that have been mined (including the initial block) since this transaction was mined.

-
transaction . raw string< DataHexstring >

The serialized transaction.

-
transaction . wait ( [ confirmations = 1 ] ) Promise< TransactionReceipt >

Wait for confirmations. If 0, and the transaction has not been mined, null is returned.

-

TransactionReceipt

+
network.ensAddress string< Address >

The address at which the ENS registry is deployed on this network.

-
receipt . to string< Address >

The address this transaction is to. This is null if the the transaction was an init transaction, used to deploy a contract.

-
receipt . from string< Address >

The address this transaction is from.

-
receipt . contractAddress string< Address >

If this transaction has a ``null` to address, it is an init transaction used to deploy a contract, in which case this is the address created by that contract.

To compute a contract address, the getContractAddress utility function can also be used with a TransactionResponse object, which requires the transaction nonce and the address of the sender.

-
receipt . transactionIndex number

The index of this transaction in the list of transactions included in the block this transaction was mined in.

-
receipt . root string

The intermediate state root of a receipt.

Only transactions included in blocks before the Byzantium Hard Fork have this property, as it was replaced by the status property.

The property is generally of little use to developers. At the time it could be used to verify a state transition with a fraud-proof only considering the single transaction; without it the full block must be considered.

-
receipt . gasUsed BigNumber

The amount of gas actually used by this transaction.

-
receipt . logsBloom string< DataHexstring >

A bloom-filter, which incldues all the addresses and topics included in any log in this transaction.

-
receipt . blockHash string< DataHexstring< 32 > >

The block hash of the block that this transaction was included in.

-
receipt . transactionHash string< DataHexstring< 32 > >

The transaction hash of this transaction.

-
receipt . logs Array< Log >

All the logs emitted by this transaction.

-
receipt . blockNumber number

The block height (number) of the block that this transaction was included in.

-
receipt . confirmations number

The number of blocks that have been mined since this transaction, including the actual block it was mined in.

-
receipt . cumulativeGasUsed BigNumber

For the block this transaction was included in, this is the sum of the gas used used by each transaction in the ordered list of transactions up to (and including) this transaction.

This is generally of little interest to developers.

-
receipt . byzantium boolean

This is true if the block is in a post-Byzantium Hard Fork block.

-
receipt . status boolean

The status of a transaction is 1 is successful or 0 if it was reverted. Only transactions included in blocks post-Byzantium Hard Fork have this property.

\ No newline at end of file +

Block

+
block.hash string< DataHexString< 32 > >

The hash of this block.

+ +
block.parentHash string< DataHexString< 32 > >

The hash of the previous block.

+ +
block.number number

The height (number) of this block.

+ +
block.timestamp number

The timestamp of this block.

+ +
block.nonce string< DataHexString >

The nonce used as part of the proof-of-work to mine this block.

+ +

This property is generally of little interest developers.

+ +
block.difficulty number

The difficulty target required to be met by the miner of the block.

+ +

This property is generally of little interest developers.

+ +
block.gasLimit BigNumber

The maximum amount of gas that this block was permitted to use. This is a value that can be voted up or voted down by miners and is used to automatically adjust the bandwidth requirements of the network.

+ +

This property is generally of little interest developers.

+ +
block.gasUsed BigNumber

The total amount of gas used by all transactions in this block.

+ +
block.miner string

The coinbase address of this block, which indicates the address the miner that mined this block would like the subsidy reward to go to.

+ +
block.extraData string

This is extra data a miner may choose to include when mining a block.

+ +

This property is generally of little interest developers.

+ +

Block (with transaction hashes)

Often only the hashes of the transactions included in a block are needed, so by default a block only contains this information, as it is substantially less data.

+ +
block.transactions Array< string< DataHexString< 32 > > >

A list of the transactions hashes for each transaction this block includes.

+ +

BlockWithTransactions inherits Block

If all transactions for a block are needed, this object instead includes the full details on each transaction.

+ +
block.transactions Array< TransactionResponse >

A list of the transactions this block includes.

+ +

Events and Logs

+

EventFilter

+
filter.address string< Address >

The address to filter by, or null to match any address.

+ +
filter.topics Array< string< DataHexString< 32 > > | Array< string< DataHexString< 32 > > > >

The topics to filter by, or null to match any topics. Each entry represents an AND condition that must match, or may be null to match anything. If a given entry is an Array, then that entry is treated as an OR for any value in the entry.

+ +

Filter inherits EventFilter

+
filter.fromBlock BlockTag

The starting block (inclusive) to search for logs matching the filter criteria.

+ +
filter.toBlock BlockTag

The end block (inclusive) to search for logs matching the filter criteria.

+ +

FilterByBlockHash inherits EventFilter

+
filter.blockHash string< DataHexString< 32 > >

The specific block (by its block hash) to search for logs matching the filter criteria.

+ +

Log

+
log.blockNumber number

The block height (number) of the block including the transaction of this log.

+ +
log.blockHash string< DataHexString< 32 > >

The block hash of the block including the transaction of this log.

+ +
log.removed boolean

During a re-org, if a transaction is orphaned, this will be set to true to indicate the Log entry has been removed; it will likely be emitted again in the near future when another block is mined with the transaction that triggered this log, but keep in mind the values may change.

+ +
log.transactionLogIndex number

The index of this log in the transaction.

+ +
log.address string< Address >

The address of the contract that generated this log.

+ +
log.data string< DataHexString >

The data included in this log.

+ +
log.topics Array< string< DataHexString< 32 > > >

The list of topics (indexed properties) for this log.

+ +
log.transactionHash string< DataHexString< 32 > >

The transaction hash of the transaction of this log.

+ +
log.transactionIndex number

The index of the transaction in the block of the transaction of this log.

+ +
log.logIndex number

The index of this log across all logs in the entire block.

+ +

Transactions

+

TransactionRequest

A transaction request describes a transaction that is to be sent to the network or otherwise processed.

+ +

All fields are optional and may be a promise which resolves to the required type.

+ +
transactionRequest.to string | Promise< string >

The address (or ENS name) this transaction it to.

+ +
transactionRequest.from string< Address > | Promise< string< Address > >

The address this transaction is from.

+ +
transactionRequest.nonce number | Promise< number >

The nonce for this transaction. This should be set to the number of transactions ever sent from this address.

+ +
transactionRequest.gasLimit BigNumber | Promise< BigNumber >

The maximum amount of gas this transaction is permitted to use.

+ +
transactionRequest.gasPrice BigNumber | Promise< BigNumber >

The price (in wei) per unit of gas this transaction will pay.

+ +
transactionRequest.data DataHexString | Promise< DataHexString >

The transaction data.

+ +
transactionRequest.value BigNumber | Promise< BigNumber >

The amount (in wei) this transaction is sending.

+ +
transactionRequest.chainId number | Promise< number >

The chain ID this transaction is authorized on, as specified by EIP-155.

+ +

If the chain ID is 0 will disable EIP-155 and the transaction will be valid on any network. This can be dangerous and care should be taken, since it allows transactions to be replayed on networks that were possibly not intended.

+ +

TransactionResponse inherits Transaction

A TransactionResponse includes all properties of a Transaction as well as several properties that are useful once it has been mined.

+ +
transaction.blockNumber number

The number ("height") of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.blockHash string< DataHexString< 32 > >

The hash of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.timestamp number

The timestamp of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.confirmations number

The number of blocks that have been mined (including the initial block) since this transaction was mined.

+ +
transaction.raw string< DataHexString >

The serialized transaction.

+ +
transaction.wait( [ confirmations = 1 ] ) Promise< TransactionReceipt >

Wait for confirmations. If 0, and the transaction has not been mined, null is returned.

+ +

TransactionReceipt

+
receipt.to string< Address >

The address this transaction is to. This is null if the the transaction was an init transaction, used to deploy a contract.

+ +
receipt.from string< Address >

The address this transaction is from.

+ +
receipt.contractAddress string< Address >

If this transaction has a null to address, it is an init transaction used to deploy a contract, in which case this is the address created by that contract.

+ +

To compute a contract address, the getContractAddress utility function can also be used with a TransactionResponse object, which requires the transaction nonce and the address of the sender.

+ +
receipt.transactionIndex number

The index of this transaction in the list of transactions included in the block this transaction was mined in.

+ +
receipt.root string

The intermediate state root of a receipt.

+ +

Only transactions included in blocks before the Byzantium Hard Fork have this property, as it was replaced by the status property.

+ +

The property is generally of little use to developers. At the time it could be used to verify a state transition with a fraud-proof only considering the single transaction; without it the full block must be considered.

+ +
receipt.gasUsed BigNumber

The amount of gas actually used by this transaction.

+ +
receipt.logsBloom string< DataHexString >

A bloom-filter, which incldues all the addresses and topics included in any log in this transaction.

+ +
receipt.blockHash string< DataHexString< 32 > >

The block hash of the block that this transaction was included in.

+ +
receipt.transactionHash string< DataHexString< 32 > >

The transaction hash of this transaction.

+ +
receipt.logs Array< Log >

All the logs emitted by this transaction.

+ +
receipt.blockNumber number

The block height (number) of the block that this transaction was included in.

+ +
receipt.confirmations number

The number of blocks that have been mined since this transaction, including the actual block it was mined in.

+ +
receipt.cumulativeGasUsed BigNumber

For the block this transaction was included in, this is the sum of the gas used used by each transaction in the ordered list of transactions up to (and including) this transaction.

+ +

This is generally of little interest to developers.

+ +
receipt.byzantium boolean

This is true if the block is in a post-Byzantium Hard Fork block.

+ +
receipt.status boolean

The status of a transaction is 1 is successful or 0 if it was reverted. Only transactions included in blocks post-Byzantium Hard Fork have this property.

+ +
+ + + +
+ + + diff --git a/docs/api/signer/README.md b/docs/api/signer/README.md index f3d9ed36d..c85b7116e 100644 --- a/docs/api/signer/README.md +++ b/docs/api/signer/README.md @@ -7,356 +7,321 @@ Documentation: [html](https://docs-beta.ethers.io/) Signers ======= - -A Signer represents... - - Signer ------ +#### *signer* . **connect**( provider ) => *[Signer](/api/signer/#Signer)* -The **Signer** class is abstract and cannot be directly instaniated. Instead -use one of the concreate sub-classes, such as the [Wallet](./), [VoidSigner](./) -or [JsonRpcSigner](../providers/jsonrpc-provider). +Sub-classes **must** implement this, however they may simply throw an error if changing providers is not supported. -#### *signer* . **connect** ( provider ) **=>** *[Signer](./)* - -Sub-classes **must** implement this, however they may simply throw an error -if changing providers is not supported. - - - - -#### *signer* . **getAddress** ( ) **=>** *Promise< string< [Address](../utils/address) > >* +#### *signer* . **getAddress**( ) => *Promise< string< [Address](/api/utils/address/#address) > >* Returns a Promise that resolves to the account address. -This is a Promise so that a **Signer** can be designed around an -asynchronous source, such as hardware wallets. +This is a Promise so that a **Signer** can be designed around an asynchronous source, such as hardware wallets. Sub-classes **must** implement this. - - -#### *Signer* . **isSigner** ( object ) **=>** *boolean* +#### *Signer* . **isSigner**( object ) => *boolean* Returns true if an only if *object* is a **Signer**. - - ### Blockchain Methods - - -#### *signer* . **getBalance** ( [ blockTag="latest" ] ) **=>** *Promise< [BigNumber](../utils/bignumber) >* +#### *signer* . **getBalance**( [ blockTag = "latest" ] ) => *Promise< [BigNumber](/api/utils/bignumber/) >* Returns the balance of this wallet at *blockTag*. - - -#### *signer* . **getChainId** ( ) **=>** *Promise< number >* +#### *signer* . **getChainId**( ) => *Promise< number >* Returns ths chain ID this wallet is connected to. - - -#### *signer* . **getGasPrice** ( ) **=>** *Promise< [BigNumber](../utils/bignumber) >* +#### *signer* . **getGasPrice**( ) => *Promise< [BigNumber](/api/utils/bignumber/) >* Returns the current gas price. +#### *signer* . **getTransactionCount**( [ blockTag = "latest" ] ) => *Promise< number >* + +Returns the number of transactions this account has ever sent. This is the value required to be included in transactions as the `nonce`. -#### *signer* . **getTransactionCount** ( [ blockTag="latest" ] ) **=>** *Promise< number >* +#### *signer* . **call**( transactionRequest ) => *Promise< string< [DataHexString](/api/utils/bytes/#DataHexString) > >* -Returns the number of transactions this account has ever sent. This -is the value required to be included in transactions as the `nonce`. +Returns the result of calling using the *transactionRequest*, with this account address being used as the `from` field. +#### *signer* . **estimateGas**( transactionRequest ) => *Promise< [BigNumber](/api/utils/bignumber/) >* + +Returns the result of estimating the cost to send the *transactionRequest*, with this account address being used as the `from` field. -#### *signer* . **call** ( transactionRequest ) **=>** *Promise< string< [DataHexstring](../utils/bytes) > >* - -Returns the result of calling using the *transactionRequest*, with this -account address being used as the `from` field. - - - - -#### *signer* . **estimateGas** ( transactionRequest ) **=>** *Promise< [BigNumber](../utils/bignumber) >* - -Returns the result of estimating the cost to send the *transactionRequest*, -with this account address being used as the `from` field. - - - - -#### *signer* . **resolveName** ( ensName ) **=>** *Promise< string< [Address](../utils/address) > >* +#### *signer* . **resolveName**( ensName ) => *Promise< string< [Address](/api/utils/address/#address) > >* Returns the address associated with the *ensName*. - - ### Signing +#### *signer* . **signMessage**( message ) => *Promise< string< [RawSignature](/api/utils/bytes/#signature-raw) > >* +This returns a Promise which resolves to the [Raw Signature](/api/utils/bytes/#signature-raw) of *message*. -#### *signer* . **signMessage** ( message ) **=>** *Promise< string< [FlatSignature](../utils/bytes) > >* - -This returns a Promise which resolves to the [Flat-Format Signature](../utils/bytes) -of *message*. - -Sub-classes **must** implement this, however they may throw if signing a -message is not supported. - - +Sub-classes **must** implement this, however they may throw if signing a message is not supported, such as in a Contract-based Wallet or Meta-Transaction-based Wallet. #### Note -If *message* is a string, it is **treated as a string** and -converted to its representation in UTF8 bytes. +If *message* is a string, it is **treated as a string** and converted to its representation in UTF8 bytes. -**If and only if** a message is a [Bytes](../utils/bytes) will it be treated as -binary data. +**If and only if** a message is a [Bytes](/api/utils/bytes/#Bytes) will it be treated as binary data. -For example, the string `"0x1234"` is 6 characters long (and in -this case 6 bytes long). This is **not** equivalent to the array -`[ 0x12, 0x34 ]`, which is 2 bytes long. +For example, the string `"0x1234"` is 6 characters long (and in this case 6 bytes long). This is **not** equivalent to the array `[ 0x12, 0x34 ]`, which is 2 bytes long. -A common case is to sign a hash. In this case, if the hash is a -string, it **must** be converted to an array first, using the -[arrayify](../utils/bytes) utility function. +A common case is to sign a hash. In this case, if the hash is a string, it **must** be converted to an array first, using the [arrayify](/api/utils/bytes/#utils-arrayify) utility function. -#### *signer* . **signTransaction** ( transactionRequest ) **=>** *Promise< string< [DataHexstring](../utils/bytes) > >* +#### *signer* . **signTransaction**( transactionRequest ) => *Promise< string< [DataHexString](/api/utils/bytes/#DataHexString) > >* -Returns a Promise which resolves to the signed transaction of the -*transactionRequest*. This method does not populate any missing fields. +Returns a Promise which resolves to the signed transaction of the *transactionRequest*. This method does not populate any missing fields. -Sub-classes **must** implement this, however they may throw if signing a -transaction is not supported. +Sub-classes **must** implement this, however they may throw if signing a transaction is not supported, which is common for security reasons in many clients. +#### *signer* . **sendTransaction**( transactionRequest ) => *Promise< [TransactionResponse](/api/providers/types/#providers-TransactionResponse) >* +This method populates the transactionRequest with missing fields, using [populateTransaction](/api/signer/#Signer-populateTransaction) and returns a Promise which resolves to the transaction. -#### *signer* . **sendTransaction** ( transactionRequest ) **=>** *Promise< [TransactionResponse](../providers/types) >* - -This method populates the transactionRequest with missing fields, using -[populateTransaction](./) and returns a Promise which resolves to the transaction. - -Sub-classes **must** implement this, however they may throw if signing a -transaction is not supported. - - +Sub-classes **must** implement this, however they may throw if sending a transaction is not supported, such as the [VoidSigner](/api/signer/#VoidSigner) or if the Wallet is offline and not connected to a [Provider](/api/providers/provider/). ### Sub-Classes +#### *signer* . **checkTransaction**( transactionRequest ) => *[TransactionRequest](/api/providers/types/#providers-TransactionRequest)* -It is very important that all important properties of a **Signer** are -**immutable**. Since Ethereum is very asynchronous and deals with critical -data (such as ether and other potentially valuable crypto assets), keeping -properties such as the *provider* and *address* static helps prevent -serious issues. +This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes. -A sub-class **must** call `super()`. +This should return a **copy** of the *transactionRequest*, with any properties needed by `call`, `estimateGas` and `populateTransaction` (which is used by sendTransaction). It should also throw an error if any unknown key is specified. + +The default implementation checks only valid [TransactionRequest](/api/providers/types/#providers-TransactionRequest) properties exist and adds `from` to the transaction if it does not exist. + +If there is a `from` field it **must** be verified to be equal to the Signer's address. -#### *signer* . **checkTransaction** ( transactionRequest ) **=>** *[TransactionRequest](../providers/types)* +#### *signer* . **populateTransaction**( transactionRequest ) => *Promise< [TransactionRequest](/api/providers/types/#providers-TransactionRequest) >* -This is generally not required to be overridden, but may needed to provide -custom behaviour in sub-classes. - -This should return a **copy** of the *transactionRequest*, with any properties -needed by `call`, `estimateGas` and `populateTransaction` (which is used -by sendTransaction). It should also throw an error if any unknown key is specified. - -The default implementation checks only valid [TransactionRequest](../providers/types) properties -exist and adds `from` to the transaction if it does not exist, or verifies it is equal -to the Signer's address if it does exist. - - - - -#### *signer* . **populateTransaction** ( transactionRequest ) **=>** *Promise< [TransactionRequest](../providers/types) >* - -This is generally not required to be overridden, but may needed to provide -custom behaviour in sub-classes. - -This should return a **copy** of *transactionRequest*, follow the same procedure -as `checkTransaction` and fill in any properties required for sending a transaction. -The result should have all promises resolved; if needed the [resolveProperties](../utils/properties) -utility function can be used for this. - -The default implementation calls `checkTransaction` and resolves to if it is an -ENS name, adds `gasPrice`, `nonce`, `gasLimit` and `chainId` based on the -related operations on Signer. +This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes. +This should return a **copy** of *transactionRequest*, follow the same procedure as `checkTransaction` and fill in any properties required for sending a transaction. The result should have all promises resolved; if needed the [resolveProperties](/api/utils/properties/#utils-resolveproperties) utility function can be used for this. +The default implementation calls `checkTransaction` and resolves to if it is an ENS name, adds `gasPrice`, `nonce`, `gasLimit` and `chainId` based on the related operations on Signer. Wallet ------ +#### **new ***ethers* . **Wallet**( privateKey [ , provider ] ) -The Wallet class inherits [Signer](./) and can sign transactions and messages -using a private key as a standard Externally Owned Account (EOA). +Create a new Wallet instance for *privateKey* and optionally connected to the *provider*. -#### **new** *ethers* . **Wallet** ( privateKey [ , provider ] ) +#### *ethers* . *Wallet* . **createRandom**( [ options = {} ] ) => *[Wallet](/api/signer/#Wallet)* -Create a new Wallet instance for *privateKey* and optionally -connected to the *provider*. +Returns a new Wallet with a random private key, generated from cryptographically secure entropy sources. If the current environment does not have a secure entropy source, an error is thrown. + +Wallets created using this method will have a mnemonic. +#### *ethers* . *Wallet* . **fromEncryptedJson**( json , password [ , progress ] ) => *Promise< [Wallet](/api/signer/#Wallet) >* + +Create an instance from an encrypted JSON wallet. + +If *progress* is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion. -#### *ethers* . *Wallet* . **createRandom** ( [ options={} ] ) **=>** *[Wallet](./)* +#### *ethers* . *Wallet* . **fromEncryptedJsonSync**( json , password ) => *[Wallet](/api/signer/#Wallet)* -Returns a new Wallet with a random private key, generated from -cryptographically secure entropy sources. If the current environment -does not have a secure entropy source, an error is thrown. +Create an instance from an encrypted JSON wallet. + +This operation will operate synchronously which will lock up the user interface, possibly for a non-trivial duration. Most applications should use the asynchronous `fromEncryptedJson` instead. - - -#### *ethers* . *Wallet* . **fromEncryptedJson** ( json , password [ , progress ] ) **=>** *Promise< [Wallet](./) >* - -Create an instance from an encrypted JSON wallet. If *progress* -is provided it will be called during decryption with a value between 0 and -1 indicating the progress towards completion. - - - - -#### *ethers* . *Wallet* . **fromMnemonic** ( mnemonic [ , path , [ wordlist ] ] ) **=>** *[Wallet](./)* +#### *ethers* . *Wallet* . **fromMnemonic**( mnemonic [ , path , [ wordlist ] ] ) => *[Wallet](/api/signer/#Wallet)* Create an instance from a mnemonic phrase. -If path is not specified, the Ethereum default path is used (i.e. m/44'/60'/0'/0/0). +If path is not specified, the Ethereum default path is used (i.e. `m/44'/60'/0'/0/0`). If wordlist is not specified, the English Wordlist is used. - - ### Properties - - -#### *wallet* . **address** **=>** *string< [Address](../utils/address) >* +#### *wallet* . **address** => *string< [Address](/api/utils/address/#address) >* The address for the account this Wallet represents. +#### *wallet* . **provider** => *[Provider](/api/providers/provider/)* - -#### *wallet* . **provider** **=>** *[Provider](../providers/provider)* - -The provider this wallet is connected to, which will ge used for any [Blockchain Methods](./) -methods. This can be null. - - +The provider this wallet is connected to, which will ge used for any [Blockchain Methods](/api/signer/#Signer--blockchain-methods) methods. This can be null. #### Note -A **Wallet** instance is immuatable, so if you wish to change the Provider, you -may use the [connect](./) method to create a new instance connected -to the desired provider. +A **Wallet** instance is immuatable, so if you wish to change the Provider, you may use the [connect](/api/signer/#Signer-connect) method to create a new instance connected to the desired provider. - - -#### *wallet* . **publicKey** **=>** *string< [DataHexstring](../utils/bytes)< 65 > >* +#### *wallet* . **publicKey** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 65 > >* The uncompressed public key for this Wallet represents. - - ### Methods +#### *wallet* . **encrypt**( password , [ options = {} , [ progress ] ] ) => *Promise< string >* + +Encrypt the wallet using *password* returning a Promise which resolves to a JSON wallet. + +If *progress* is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion. -#### *wallet* . **encrypt** ( password , [ options={} , [ progress ] ] ) **=>** *Promise< string >* +```javascript +// Create a wallet instance from a mnemonic... +mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" +walletMnemonic = Wallet.fromMnemonic(mnemonic) -Encrypt the wallet using *password* returning a Promise which resolves -to a JSON wallet. +// ...or from a private key +walletPrivateKey = new Wallet(walletMnemonic.privateKey) +walletMnemonic.address === walletPrivateKey.address +//! +// The address as a Promise per the Signer API +walletMnemonic.getAddress() +//! +// A Wallet address is also available synchronously +walletMnemonic.address +//! + +// The internal cryptographic components +walletMnemonic.privateKey +//! +walletMnemonic.publicKey +//! + +// The wallet mnemonic +walletMnemonic.mnemonic +//! + +// Note: A wallet created with a private key does not +// have a mnemonic (the derivation prevents it) +walletPrivateKey.mnemonic +//! + +// Signing a message +walletMnemonic.signMessage("Hello World") +//! + +tx = { + to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72", + value: utils.parseEther("1.0") +} + +// Signing a transaction +walletMnemonic.signTransaction(tx) +//! + +// The connect method returns a new instance of the +// Wallet connected to a provider +wallet = walletMnemonic.connect(provider) + +// Querying the network +wallet.getBalance(); +//! +wallet.getTransactionCount(); +//! + +// Sending ether +wallet.sendTransaction(tx) +// +//! error +// +``` VoidSigner ---------- - -A **VoidSigner** is a simple Signer which cannot sign. - -It is useful as a read-only signer, when an API requires a -Signer as a parameter, but it is known only read-only operations -will be carried. - -For example, the `call` operation will automatically have the -provided address passed along during the execution. - - -#### **new** *ethers* . **VoidSigner** ( address ) **=>** *[VoidSigner](./)* +#### **new ***ethers* . **VoidSigner**( address [ , provider ] ) => *[VoidSigner](/api/signer/#VoidSigner)* Create a new instance of a **VoidSigner** for *address*. - - -#### *voidSigner* . **address** **=>** *string< [Address](../utils/address) >* +#### *voidSigner* . **address** => *string< [Address](/api/utils/address/#address) >* The address of this **VoidSigner**. +```javascript +address = "0x8ba1f109551bD432803012645Ac136ddd64DBA72" +signer = new ethers.VoidSigner(address, provider) +// The DAI token contract +abi = [ + "function balanceOf(address) view returns (uint)", + "function transfer(address, uint) returns (bool)" +] +contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer) + +// +//! +// +// Get the number of tokens for this account +tokens = await contract.balanceOf(signer.getAddress()) +//! async tokens + +// +// Pre-flight (check for revert) on DAI from the signer +// +// Note: We do not have the private key at this point, this +// simply allows us to check what would happen if we +// did. This can be useful to check before prompting +// a request in the UI +// + +// This will pass since the token balance is available +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 +``` ExternallyOwnedAccount ---------------------- +#### *eoa* . **address** => *string< [Address](/api/utils/address/#address) >* -This is an interface which contains a minimal set of properties -required for Externally Owned Accounts which can have certain -operations performed, such as encoding as a JSON wallet. +The [Address](/api/utils/address/#address) of this EOA. -#### *eoa* . **address** **=>** *string< [Address](../utils/address) >* - -The [Address](../utils/address) of this EOA. - - - - -#### *eoa* . **privateKey** **=>** *string< [DataHexstring](../utils/bytes)< 32 > >* +#### *eoa* . **privateKey** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The privateKey of this EOA +#### *eoa* . **mnemonic** => *[Mnemonic](/api/utils/hdnode/#Mnemonic)* + +*Optional*. The account HD mnemonic, if it has one and can be determined. Some sources do not encode the mnemonic, such as an HD extended keys. -#### *eoa* . **mnemonic** **=>** *[Mnemonic](../utils/hdnode)* - -*Optional*. The account HD mnemonic, if it has one and can be -determined. Some sources do not encode the mnemonic, such as an -HD extended keys. - - - - - ------ -**Content Hash:** 142e4d9da1f8b8a900a2e97de899649447054c6addb8cba0fb3342ff02d29fd8 \ No newline at end of file diff --git a/docs/api/signer/index.html b/docs/api/signer/index.html index 3cf18bbe6..446820f20 100644 --- a/docs/api/signer/index.html +++ b/docs/api/signer/index.html @@ -1,51 +1,254 @@ -Signers

Signers

-

A Signer represents...

-

Signer

-

The Signer class is abstract and cannot be directly instaniated. Instead use one of the concreate sub-classes, such as the Wallet, VoidSigner or JsonRpcSigner.

-
signer . connect ( provider ) Signer

Sub-classes must implement this, however they may simply throw an error if changing providers is not supported.

-
signer . getAddress ( ) Promise< string< Address > >

Returns a Promise that resolves to the account address.

This is a Promise so that a Signer can be designed around an asynchronous source, such as hardware wallets.

Sub-classes must implement this.

-
Signer . isSigner ( object ) boolean

Returns true if an only if object is a Signer.

-

Blockchain Methods

+ + + + Signers + + + + +
+ -
signer . getBalance ( [ blockTag = "latest" ] ) Promise< BigNumber >

Returns the balance of this wallet at blockTag.

-
signer . getChainId ( ) Promise< number >

Returns ths chain ID this wallet is connected to.

-
signer . getGasPrice ( ) Promise< BigNumber >

Returns the current gas price.

-
signer . getTransactionCount ( [ blockTag = "latest" ] ) Promise< number >

Returns the number of transactions this account has ever sent. This is the value required to be included in transactions as the nonce.

-
signer . call ( transactionRequest ) Promise< string< DataHexstring > >

Returns the result of calling using the transactionRequest, with this account address being used as the from field.

-
signer . estimateGas ( transactionRequest ) Promise< BigNumber >

Returns the result of estimating the cost to send the transactionRequest, with this account address being used as the from field.

-
signer . resolveName ( ensName ) Promise< string< Address > >

Returns the address associated with the ensName.

-

Signing

+

Signers

A Signer in ethers is an abstraction of an Ethereum Account, which can be used to sign messages and transactions and send signed transactions to the Ethereum Network to execute state changing operations.

-
signer . signMessage ( message ) Promise< string< FlatSignature > >

This returns a Promise which resolves to the Flat-Format Signature of message.

Sub-classes must implement this, however they may throw if signing a message is not supported.

-
Note

If message is a string, it is treated as a string and converted to its representation in UTF8 bytes.

If and only if a message is a Bytes will it be treated as binary data.

For example, the string "0x1234" is 6 characters long (and in this case 6 bytes long). This is not equivalent to the array [ 0x12, 0x34 ], which is 2 bytes long.

A common case is to sign a hash. In this case, if the hash is a string, it must be converted to an array first, using the arrayify utility function.

+

The available operations depends largely on the sub-class used.

-
signer . signTransaction ( transactionRequest ) Promise< string< DataHexstring > >

Returns a Promise which resolves to the signed transaction of the transactionRequest. This method does not populate any missing fields.

Sub-classes must implement this, however they may throw if signing a transaction is not supported.

-
signer . sendTransaction ( transactionRequest ) Promise< TransactionResponse >

This method populates the transactionRequest with missing fields, using populateTransaction and returns a Promise which resolves to the transaction.

Sub-classes must implement this, however they may throw if signing a transaction is not supported.

-

Sub-Classes

-

It is very important that all important properties of a Signer are immutable. Since Ethereum is very asynchronous and deals with critical data (such as ether and other potentially valuable crypto assets), keeping properties such as the provider and address static helps prevent serious issues.

A sub-class must call super().

-
signer . checkTransaction ( transactionRequest ) TransactionRequest

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

This should return a copy of the transactionRequest, with any properties needed by call, estimateGas and populateTransaction (which is used by sendTransaction). It should also throw an error if any unknown key is specified.

The default implementation checks only valid TransactionRequest properties exist and adds from to the transaction if it does not exist, or verifies it is equal to the Signer's address if it does exist.

-
signer . populateTransaction ( transactionRequest ) Promise< TransactionRequest >

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

This should return a copy of transactionRequest, follow the same procedure as checkTransaction and fill in any properties required for sending a transaction. The result should have all promises resolved; if needed the resolveProperties utility function can be used for this.

The default implementation calls checkTransaction and resolves to if it is an ENS name, adds gasPrice, nonce, gasLimit and chainId based on the related operations on Signer.

-

-

The Wallet class inherits Signer and can sign transactions and messages using a private key as a standard Externally Owned Account (EOA).

-
new ethers . Wallet ( privateKey [ , provider ] )

Create a new Wallet instance for privateKey and optionally connected to the provider.

-
ethers . Wallet . createRandom ( [ options = {} ] ) Wallet

Returns a new Wallet with a random private key, generated from cryptographically secure entropy sources. If the current environment does not have a secure entropy source, an error is thrown.

-
ethers . Wallet . fromEncryptedJson ( json , password [ , progress ] ) Promise< Wallet >

Create an instance from an encrypted JSON wallet. If progress is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion.

-
ethers . Wallet . fromMnemonic ( mnemonic [ , path , [ wordlist ] ] ) Wallet

Create an instance from a mnemonic phrase.

If path is not specified, the Ethereum default path is used (i.e. m/44'/60'/0'/0/0).

If wordlist is not specified, the English Wordlist is used.

-

Properties

+

For example, a Signer from MetaMask can send transactions and sign messages but cannot sign a transaction (without broadcasting it).

-
wallet . address string< Address >

The address for the account this Wallet represents.

-
wallet . provider Provider

The provider this wallet is connected to, which will ge used for any Blockchain Methods methods. This can be null.

-
Note

A Wallet instance is immuatable, so if you wish to change the Provider, you may use the connect method to create a new instance connected to the desired provider.

-
wallet . publicKey string< DataHexstring< 65 > >

The uncompressed public key for this Wallet represents.

-

Methods

+

The most common Signers you will encounter are:

-
wallet . encrypt ( password , [ options = {} , [ progress ] ] ) Promise< string >

Encrypt the wallet using password returning a Promise which resolves to a JSON wallet.

-

VoidSigner inherits Signer

-

A VoidSigner is a simple Signer which cannot sign.

It is useful as a read-only signer, when an API requires a Signer as a parameter, but it is known only read-only operations will be carried.

For example, the call operation will automatically have the provided address passed along during the execution.

-
new ethers . VoidSigner ( address ) VoidSigner

Create a new instance of a VoidSigner for address.

-
voidSigner . address string< Address >

The address of this VoidSigner.

-

ExternallyOwnedAccount

-

This is an interface which contains a minimal set of properties required for Externally Owned Accounts which can have certain operations performed, such as encoding as a JSON wallet.

-
eoa . address string< Address >

The Address of this EOA.

-
eoa . privateKey string< DataHexstring< 32 > >

The privateKey of this EOA

-
eoa . mnemonic Mnemonic

Optional. The account HD mnemonic, if it has one and can be determined. Some sources do not encode the mnemonic, such as an HD extended keys.

\ No newline at end of file +

+ +

Signer

The Signer class is abstract and cannot be directly instaniated.

+ +

Instead use one of the concreate sub-classes, such as the Wallet, VoidSigner or JsonRpcSigner.

+ +
signer.connect( provider ) Signer

Sub-classes must implement this, however they may simply throw an error if changing providers is not supported.

+ +
signer.getAddress( ) Promise< string< Address > >

Returns a Promise that resolves to the account address.

+ +

This is a Promise so that a Signer can be designed around an asynchronous source, such as hardware wallets.

+ +

Sub-classes must implement this.

+ +
Signer.isSigner( object ) boolean

Returns true if an only if object is a Signer.

+ +

Blockchain Methods

+
signer.getBalance( [ blockTag = "latest" ] ) Promise< BigNumber >

Returns the balance of this wallet at blockTag.

+ +
signer.getChainId( ) Promise< number >

Returns ths chain ID this wallet is connected to.

+ +
signer.getGasPrice( ) Promise< BigNumber >

Returns the current gas price.

+ +
signer.getTransactionCount( [ blockTag = "latest" ] ) Promise< number >

Returns the number of transactions this account has ever sent. This is the value required to be included in transactions as the nonce.

+ +
signer.call( transactionRequest ) Promise< string< DataHexString > >

Returns the result of calling using the transactionRequest, with this account address being used as the from field.

+ +
signer.estimateGas( transactionRequest ) Promise< BigNumber >

Returns the result of estimating the cost to send the transactionRequest, with this account address being used as the from field.

+ +
signer.resolveName( ensName ) Promise< string< Address > >

Returns the address associated with the ensName.

+ +

Signing

+
signer.signMessage( message ) Promise< string< RawSignature > >

This returns a Promise which resolves to the Raw Signature of message.

+ +

Sub-classes must implement this, however they may throw if signing a message is not supported, such as in a Contract-based Wallet or Meta-Transaction-based Wallet.

+ +
Note

If message is a string, it is treated as a string and converted to its representation in UTF8 bytes.

+ +

If and only if a message is a Bytes will it be treated as binary data.

+ +

For example, the string "0x1234" is 6 characters long (and in this case 6 bytes long). This is not equivalent to the array [ 0x12, 0x34 ], which is 2 bytes long.

+ +

A common case is to sign a hash. In this case, if the hash is a string, it must be converted to an array first, using the arrayify utility function.

+ +
+
signer.signTransaction( transactionRequest ) Promise< string< DataHexString > >

Returns a Promise which resolves to the signed transaction of the transactionRequest. This method does not populate any missing fields.

+ +

Sub-classes must implement this, however they may throw if signing a transaction is not supported, which is common for security reasons in many clients.

+ +
signer.sendTransaction( transactionRequest ) Promise< TransactionResponse >

This method populates the transactionRequest with missing fields, using populateTransaction and returns a Promise which resolves to the transaction.

+ +

Sub-classes must implement this, however they may throw if sending a transaction is not supported, such as the VoidSigner or if the Wallet is offline and not connected to a Provider.

+ +

Sub-Classes

It is very important that all important properties of a Signer are immutable. Since Ethereum is very asynchronous and deals with critical data (such as ether and other potentially valuable crypto assets), keeping 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().

+ +
signer.checkTransaction( transactionRequest ) TransactionRequest

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

+ +

This should return a copy of the transactionRequest, with any properties needed by call, estimateGas and populateTransaction (which is used by sendTransaction). It should also throw an error if any unknown key is specified.

+ +

The default implementation checks only valid TransactionRequest properties exist and adds from to the transaction if it does not exist.

+ +

If there is a from field it must be verified to be equal to the Signer's address.

+ +
signer.populateTransaction( transactionRequest ) Promise< TransactionRequest >

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

+ +

This should return a copy of transactionRequest, follow the same procedure as checkTransaction and fill in any properties required for sending a transaction. The result should have all promises resolved; if needed the resolveProperties utility function can be used for this.

+ +

The default implementation calls checkTransaction and resolves to if it is an ENS name, adds gasPrice, nonce, gasLimit and chainId based on the related operations on Signer.

+ +

Wallet inherits ExternallyOwnedAccount and Signer

The Wallet class inherits Signer and can sign transactions and messages using a private key as a standard Externally Owned Account (EOA).

+ +
new ethers.Wallet( privateKey [ , provider ] )

Create a new Wallet instance for privateKey and optionally connected to the provider.

+ +
ethers.Wallet.createRandom( [ options = {} ] ) Wallet

Returns a new Wallet with a random private key, generated from cryptographically secure entropy sources. If the current environment does not have a secure entropy source, an error is thrown.

+ +

Wallets created using this method will have a mnemonic.

+ +
ethers.Wallet.fromEncryptedJson( json , password [ , progress ] ) Promise< Wallet >

Create an instance from an encrypted JSON wallet.

+ +

If progress is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion.

+ +
ethers.Wallet.fromEncryptedJsonSync( json , password ) Wallet

Create an instance from an encrypted JSON wallet.

+ +

This operation will operate synchronously which will lock up the user interface, possibly for a non-trivial duration. Most applications should use the asynchronous fromEncryptedJson instead.

+ +
ethers.Wallet.fromMnemonic( mnemonic [ , path , [ wordlist ] ] ) Wallet

Create an instance from a mnemonic phrase.

+ +

If path is not specified, the Ethereum default path is used (i.e. m/44'/60'/0'/0/0).

+ +

If wordlist is not specified, the English Wordlist is used.

+ +

Properties

+
wallet.address string< Address >

The address for the account this Wallet represents.

+ +
wallet.provider Provider

The provider this wallet is connected to, which will ge used for any Blockchain Methods methods. This can be null.

+ +
Note

A Wallet instance is immuatable, so if you wish to change the Provider, you may use the connect method to create a new instance connected to the desired provider.

+ +
wallet.publicKey string< DataHexString< 65 > >

The uncompressed public key for this Wallet represents.

+ +

Methods

+
wallet.encrypt( password , [ options = {} , [ progress ] ] ) Promise< string >

Encrypt the wallet using password returning a Promise which resolves to a JSON wallet.

+ +

If progress is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion.

+ +
Wallet Examples
// Create a wallet instance from a mnemonic... +mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" +walletMnemonic = Wallet.fromMnemonic(mnemonic) + +// ...or from a private key +walletPrivateKey = new Wallet(walletMnemonic.privateKey) + +walletMnemonic.address === walletPrivateKey.address +//! + +// The address as a Promise per the Signer API +walletMnemonic.getAddress() +//! + +// A Wallet address is also available synchronously +walletMnemonic.address +//! + +// The internal cryptographic components +walletMnemonic.privateKey +//! +walletMnemonic.publicKey +//! + +// The wallet mnemonic +walletMnemonic.mnemonic +//! + +// Note: A wallet created with a private key does not +// have a mnemonic (the derivation prevents it) +walletPrivateKey.mnemonic +//! + +// Signing a message +walletMnemonic.signMessage("Hello World") +//! + +tx = { + to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72", + value: utils.parseEther("1.0") +} + +// Signing a transaction +walletMnemonic.signTransaction(tx) +//! + +// The connect method returns a new instance of the +// Wallet connected to a provider +wallet = walletMnemonic.connect(provider) + +// Querying the network +wallet.getBalance(); +//! +wallet.getTransactionCount(); +//! + +// Sending ether +wallet.sendTransaction(tx) +// <hide> +//! error +// </hide>

VoidSigner inherits Signer

A VoidSigner is a simple Signer which cannot sign.

+ +

It is useful as a read-only signer, when an API requires a Signer as a parameter, but it is known only read-only operations will be carried.

+ +

For example, the call operation will automatically have the provided address passed along during the execution.

+ +
new ethers.VoidSigner( address [ , provider ] ) VoidSigner

Create a new instance of a VoidSigner for address.

+ +
voidSigner.address string< Address >

The address of this VoidSigner.

+ +
VoidSigner Pre-flight Example
address = "0x8ba1f109551bD432803012645Ac136ddd64DBA72" +signer = new ethers.VoidSigner(address, provider) + +// The DAI token contract +abi = [ + "function balanceOf(address) view returns (uint)", + "function transfer(address, uint) returns (bool)" +] +contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer) + +// <hide> +//! +// </hide> +// Get the number of tokens for this account +tokens = await contract.balanceOf(signer.getAddress()) +//! async tokens + +// +// Pre-flight (check for revert) on DAI from the signer +// +// Note: We do not have the private key at this point, this +// simply allows us to check what would happen if we +// did. This can be useful to check before prompting +// a request in the UI +// + +// This will pass since the token balance is available +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

ExternallyOwnedAccount

This is an interface which contains a minimal set of properties required for Externally Owned Accounts which can have certain operations performed, such as encoding as a JSON wallet.

+ +
eoa.address string< Address >

The Address of this EOA.

+ +
eoa.privateKey string< DataHexString< 32 > >

The privateKey of this EOA

+ +
eoa.mnemonic Mnemonic

Optional. The account HD mnemonic, if it has one and can be determined. Some sources do not encode the mnemonic, such as an HD extended keys.

+ +
+ + + +
+ + + diff --git a/docs/api/utils/README.md b/docs/api/utils/README.md index c5e7ef00e..a7d5a6a58 100644 --- a/docs/api/utils/README.md +++ b/docs/api/utils/README.md @@ -7,11 +7,6 @@ Documentation: [html](https://docs-beta.ethers.io/) Utilities ========= - -These utilities are used extensively within the library, but -are also quite useful for application developers. - - * [Application Binary Interface](abi) * [Interface](abi/interface) * [Creating Instances](abi/interface) @@ -33,7 +28,9 @@ are also quite useful for application developers. * [ParamType](abi/fragments) * [Addresses](address) * [Address Formats](address) - * [Functions](address) + * [Converting and Verifying](address) + * [Derivation](address) + * [Contracts Addresses](address) * [BigNumber](bignumber) * [Types](bignumber) * [Creating Instances](bignumber) @@ -64,8 +61,9 @@ are also quite useful for application developers. * [Methods](fixednumber) * [FixedFormat](fixednumber) * [Hashing Algorithms](hashing) - * [Cryptographic Hashing](hashing) - * [Common Hashing Helpers](hashing) + * [Cryptographic Hash Functions](hashing) + * [HMAC](hashing) + * [Hashing Helpers](hashing) * [Solidity Hashing Algorithms](hashing) * [HD Wallet](hdnode) * [Types](hdnode) @@ -91,7 +89,3 @@ are also quite useful for application developers. * [Wordlist](wordlists) * [Languages](wordlists) - - ------ -**Content Hash:** 5be9157e89f865d007e6b7e1fb3bb47369a474882824264c5241e5bb05c80865 \ No newline at end of file diff --git a/docs/api/utils/abi/README.md b/docs/api/utils/abi/README.md index 8da6eaa0f..cdaf67751 100644 --- a/docs/api/utils/abi/README.md +++ b/docs/api/utils/abi/README.md @@ -7,8 +7,6 @@ Documentation: [html](https://docs-beta.ethers.io/) Application Binary Interface ============================ - - * [Interface](interface) * [Creating Instances](interface) * [Properties](interface) @@ -28,7 +26,3 @@ Application Binary Interface * [FunctionFragment](fragments) * [ParamType](fragments) - - ------ -**Content Hash:** 8705c8efbee955960d66f6e6a387af64ad3392dc48f0db81645c1b900ff315e8 \ No newline at end of file diff --git a/docs/api/utils/abi/fragments/README.md b/docs/api/utils/abi/fragments/README.md index 65c9358d2..daaf00051 100644 --- a/docs/api/utils/abi/fragments/README.md +++ b/docs/api/utils/abi/fragments/README.md @@ -7,392 +7,230 @@ Documentation: [html](https://docs-beta.ethers.io/) Fragments ========= - -Explain an ABI. - - Formats ------- - - ### JSON String ABI (Solidity Output JSON) - -The **JSON ABI Format** is the format that is -[output from the Solidity compiler](../../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/solidity.readthedocs.io/en/v0.6.0/using-the-compiler.html). - -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 -also be passed into any function which accepts a JSON String ABI. - - ### Humanb-Readable ABI - -The Human-Readable ABI was - -[article](../../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917) - - ### Output Formats +#### *ethers* . *utils* . *FragmentTypes* . **full** => *string* -Each [Fragment](./) and [ParamType](./) may be output using its `format` -method. +This is a full human-readable string, including all parameter names, any optional modifiers (e.g. `indexed`, `public`, etc) and white-space to aid in human readabiliy. -#### *ethers* . *utils* . *FragmentTypes* . **full** **=>** *string* +#### *ethers* . *utils* . *FragmentTypes* . **minimal** => *string* -This is a full human-readable string, including all parameter names, any -optional modifiers (e.g. `indexed`, `public`, etc) and white-space -to aid in human readabiliy. +This is similar to `full`, except with no unnecessary whitespace or parameter names. This is useful for storing a minimal string which can still fully reconstruct the original Fragment using [Fragment . from](/api/utils/abi/fragments/#Fragment-from). +#### *ethers* . *utils* . *FragmentTypes* . **json** => *string* + +This returns a JavaScript Object which is safe to call `JSON.stringify` on to create a JSON string. -#### *ethers* . *utils* . *FragmentTypes* . **minimal** **=>** *string* - -This is similar to `full`, except with no unnecessary whitespace or parameter -names. This is useful for storing a minimal string which can still fully -reconstruct the original Fragment using [Fragment . from](./). - - - - -#### *ethers* . *utils* . *FragmentTypes* . **json** **=>** *string* - -This returns a JavaScript Object which is safe to call `JSON.stringify` -on to create a JSON string. - - - - -#### *ethers* . *utils* . *FragmentTypes* . **sighash** **=>** *string* - -This is a minimal output format, which is used by Solidity when computing a -signature hash or an event topic hash. - +#### *ethers* . *utils* . *FragmentTypes* . **sighash** => *string* +This is a minimal output format, which is used by Solidity when computing a signature hash or an event topic hash. #### Note -The `sighash` format is **insufficient** to re-create the original [Fragment](./), -since it discards modifiers such as indexed, anonymous, stateMutability, etc. - - +The `sighash` format is **insufficient** to re-create the original [Fragment](/api/utils/abi/fragments/#Fragment), since it discards modifiers such as indexed, anonymous, stateMutability, etc. Fragment -------- - -An ABI is a collection of **Fragments**, where each fragment specifies: - - - -* An [Event](./) -* A [Function](./) -* A [Constructor](./) - - ### Properties +#### *fragment* . **name** => *string* + +This is the name of the Event or Function. This will be null for a [ConstructorFragment](/api/utils/abi/fragments/#ConstructorFragment). -#### *fragment* . **name** **=>** *string* +#### *fragment* . **type** => *string* -This is the name of the Event or Function. This will be null for -a [ConstructorFragment](./). +This is a string which indicates the type of the [Fragment](/api/utils/abi/fragments/#Fragment). This will be one of: + +- `constructor` +- `event` +- `function` -#### *fragment* . **type** **=>** *string* - -This is a string which indicates the type of the [Fragment](./). This -will be one of: - - - -* `constructor` -* `event` -* `function` - - - - -#### *fragment* . **inputs** **=>** *Array< [ParamType](./) >* - -This is an array of of each [ParamType](./) for the input parameters to -the Constructor, Event of Function. - +#### *fragment* . **inputs** => *Array< [ParamType](/api/utils/abi/fragments/#ParamType) >* +This is an array of of each [ParamType](/api/utils/abi/fragments/#ParamType) for the input parameters to the Constructor, Event of Function. ### Methods - - -#### *ethers* . *utils* . *Fragment* . **from** ( objectOrString ) **=>** *[Fragment](./)* +#### *ethers* . *utils* . *Fragment* . **from**( objectOrString ) => *[Fragment](/api/utils/abi/fragments/#Fragment)* Returns a - - -#### *ethers* . *utils* . *Fragment* . **isFragment** ( object ) **=>** *boolean* +#### *ethers* . *utils* . *Fragment* . **isFragment**( object ) => *boolean* Tra lal al - - ConstructorFragment ------------------- - - ### Properties +#### *fragment* . **gas** => *[BigNumber](/api/utils/bignumber/)* + +This is the gas limit that should be used during deployment. It may be null. -#### *fragment* . **gas** **=>** *[BigNumber](../../bignumber)* +#### *fragment* . **payable** => *boolean* -This is the gas limit that should be used during deployment. It may be -null. +This is whether the constructor may receive ether during deployment as an endowment (i.e. msg.value != 0). - - -#### *fragment* . **payable** **=>** *boolean* - -This is whether the constructor may receive ether during deployment as -an endowment (i.e. msg.value != 0). - - - - -#### *fragment* . **stateMutability** **=>** *string* +#### *fragment* . **stateMutability** => *string* This is the state mutability of the constructor. It can be any of: - - -* `nonpayable` -* `payable` +- `nonpayable` +- `payable` ### Methods - - -#### *ethers* . *utils* . *ConstructorFragment* . **from** ( objectOrString ) **=>** *[ConstructorFragment](./)* +#### *ethers* . *utils* . *ConstructorFragment* . **from**( objectOrString ) => *[ConstructorFragment](/api/utils/abi/fragments/#ConstructorFragment)* Tra la la... - - -#### *ethers* . *utils* . *ConstructorFragment* . **isConstructorFragment** ( object ) **=>** *boolean* +#### *ethers* . *utils* . *ConstructorFragment* . **isConstructorFragment**( object ) => *boolean* Tra lal al - - EventFragment ------------- - - ### Properties +#### *fragment* . **anonymous** => *boolean* - -#### *fragment* . **anonymous** **=>** *boolean* - -This is whether the event is anonymous. An anonymous Event does not inject its -topic hash as topic0 when creating a log. - - +This is whether the event is anonymous. An anonymous Event does not inject its topic hash as topic0 when creating a log. ### Methods - - -#### *ethers* . *utils* . *EventFragment* . **from** ( objectOrString ) **=>** *[EventFragment](./)* +#### *ethers* . *utils* . *EventFragment* . **from**( objectOrString ) => *[EventFragment](/api/utils/abi/fragments/#EventFragment)* Tra la la... - - -#### *ethers* . *utils* . *EventFragment* . **isEventFragment** ( object ) **=>** *boolean* +#### *ethers* . *utils* . *EventFragment* . **isEventFragment**( object ) => *boolean* Tra lal al - - FunctionFragment ---------------- - - ### Properties +#### *fragment* . **constant** => *boolean* + +This is whether the function is constant (i.e. does not change state). This is true if the state mutability is `pure` or `view`. -#### *fragment* . **constant** **=>** *boolean* - -This is whether the function is constant (i.e. does not change state). This -is true if the state mutability is `pure` or `view`. - - - - -#### *fragment* . **stateMutability** **=>** *string* +#### *fragment* . **stateMutability** => *string* This is the state mutability of the constructor. It can be any of: - - -* `nonpayable` -* `payable` -* `pure` -* `view` +- `nonpayable` +- `payable` +- `pure` +- `view` -#### *fragment* . **outputs** **=>** *Array< [ParamType](./) >* +#### *fragment* . **outputs** => *Array< [ParamType](/api/utils/abi/fragments/#ParamType) >* A list of the Function output parameters. - - ### Method - - -#### *ethers* . *utils* . *FunctionFragment* . **from** ( objectOrString ) **=>** *[FunctionFragment](./)* +#### *ethers* . *utils* . *FunctionFragment* . **from**( objectOrString ) => *[FunctionFragment](/api/utils/abi/fragments/#FunctionFragment)* Tra la la... - - -#### *ethers* . *utils* . *FunctionFragment* . **isFunctionFragment** ( object ) **=>** *boolean* +#### *ethers* . *utils* . *FunctionFragment* . **isFunctionFragment**( object ) => *boolean* Tra lal al - - ParamType --------- - -The following examples will represent the Solidity parameter: - -`string foobar` - - ### Properties +#### *paramType* . **name** => *string* + +The local parameter name. This may be null for unnamed parameters. For example, the parameter definition `string foobar` would be `foobar`. -#### *paramType* . **name** **=>** *string* +#### *paramType* . **type** => *string* -The local parameter name. This may be null for unnamed parameters. For example, -the parameter definition `string foobar` would be `foobar`. +The full type of the parameter, including tuple and array symbols. This may be null for unnamed parameters. For the above example, this would be `foobar`. +#### *paramType* . **baseType** => *string* + +The base type of the parameter. For primitive types (e.g. `address`, `uint256`, etc) this is equal to [type](/api/utils/abi/fragments/#ParamType-type). For arrays, it will be the string `array` and for a tuple, it will be the string `tuple`. -#### *paramType* . **type** **=>** *string* +#### *paramType* . **indexed** => *boolean* -The full type of the parameter, including tuple and array symbols. This may be null -for unnamed parameters. For the above example, this would be `foobar`. +Whether the parameter has been marked as indexed. This **only** applies to parameters which are part of an [EventFragment](/api/utils/abi/fragments/#EventFragment). +#### *paramType* . **arrayChildren** => *[ParamType](/api/utils/abi/fragments/#ParamType)* + +The type of children of the array. This is null for for any parameter wjhich is not an array. -#### *paramType* . **basetype** **=>** *string* +#### *paramType* . **arrayLength** => *number* -The base type of the parameter. For primitive types (e.g. `address`, `uint256`, etc) -this is equal to [type](./). For arrays, it will be the string `array` and for -a tuple, it will be the string `tuple`. +The length of the array, or `-1` for dynamic-length arrays. This is null for parameters which is not arrays. - - -#### *paramType* . **indexed** **=>** *boolean* - -Whether the parameter has been marked as indexed. This **only** applies -to parameters which are part of an [EventFragment](./). - - - - -#### *paramType* . **arrayChildren** **=>** *[ParamType](./)* - -The type of children of the array. This is null for for any parameter -wjhich is not an array. - - - - -#### *paramType* . **arrayLength** **=>** *number* - -The length of the array, or `-1` for dynamic-length arrays. This is -null for parameters which is not arrays. - - - - -#### *paramType* . **components** **=>** *Array< [ParamType](./) >* +#### *paramType* . **components** => *Array< [ParamType](/api/utils/abi/fragments/#ParamType) >* The components of a tuple. This is null for non-tuple parameters. - - ### Methods +#### *paramType* . **format**( [ outputType = sighash ] ) Tra la la... -#### *paramType* . **format** ( [ outputType=sighash ] ) +#### *ethers* . *utils* . *ParamType* . **from**( objectOrString ) => *[ParamType](/api/utils/abi/fragments/#ParamType)* Tra la la... - - -#### *ethers* . *utils* . *ParamType* . **from** ( objectOrString ) **=>** *[ParamType](./)* +#### *ethers* . *utils* . *ParamType* . **isParamType**( object ) => *boolean* Tra la la... - - -#### *ethers* . *utils* . *ParamType* . **isParamType** ( object ) **=>** *boolean* - -Tra la la... - - - - - ------ -**Content Hash:** b3b5bca0e0fe90226032a0727af0e449044a395b8bceb808b47a022024ee560b \ No newline at end of file diff --git a/docs/api/utils/abi/fragments/index.html b/docs/api/utils/abi/fragments/index.html index 365eb4457..70ba01e2d 100644 --- a/docs/api/utils/abi/fragments/index.html +++ b/docs/api/utils/abi/fragments/index.html @@ -1,73 +1,138 @@ -Fragments

Fragments

-

Explain an ABI.

-

Formats

+ + + + Fragments + + + + +
+ -

JSON String ABI (Solidity Output JSON)

-

The JSON ABI Format is the format that is output from the Solidity compiler.

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 also be passed into any function which accepts a JSON String ABI.

-

Humanb-Readable ABI

-

The Human-Readable ABI was

article

-

Output Formats

-

Each Fragment and ParamType may be output using its format method.

-
ethers . utils . FragmentTypes . full string

This is a full human-readable string, including all parameter names, any optional modifiers (e.g. indexed, public, etc) and white-space to aid in human readabiliy.

-
ethers . utils . FragmentTypes . minimal string

This is similar to full, except with no unnecessary whitespace or parameter names. This is useful for storing a minimal string which can still fully reconstruct the original Fragment using Fragment . from.

-
ethers . utils . FragmentTypes . json string

This returns a JavaScript Object which is safe to call JSON.stringify on to create a JSON string.

-
ethers . utils . FragmentTypes . sighash string

This is a minimal output format, which is used by Solidity when computing a signature hash or an event topic hash.

-
Note

The sighash format is insufficient to re-create the original Fragment, since it discards modifiers such as indexed, anonymous, stateMutability, etc.

-

Fragment

-

An ABI is a collection of Fragments, where each fragment specifies:

-

Properties

+

Fragments

Explain an ABI.

-
fragment . name string

This is the name of the Event or Function. This will be null for a ConstructorFragment.

-
fragment . type string

This is a string which indicates the type of the Fragment. This will be one of:

  • constructor
  • event
  • function
-
fragment . inputs Array< ParamType >

This is an array of of each ParamType for the input parameters to the Constructor, Event of Function.

-

Methods

+

Formats

+

JSON String ABI (Solidity Output JSON)

The JSON ABI Format is the format that is output from the Solidity compiler.

-
ethers . utils . Fragment . from ( objectOrString ) Fragment

Returns a

-
ethers . utils . Fragment . isFragment ( object ) boolean

Tra lal al

-

ConstructorFragment inherits Fragment

+

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.

-

Properties

+

The deserialied JSON string (which is a normal JavaScript Object) may also be passed into any function which accepts a JSON String ABI.

-
fragment . gas BigNumber

This is the gas limit that should be used during deployment. It may be null.

-
fragment . payable boolean

This is whether the constructor may receive ether during deployment as an endowment (i.e. msg.value != 0).

-
fragment . stateMutability string

This is the state mutability of the constructor. It can be any of:

  • nonpayable
  • payable
-

Methods

+

Humanb-Readable ABI

The Human-Readable ABI was

-
ethers . utils . ConstructorFragment . from ( objectOrString ) ConstructorFragment

Tra la la...

-
ethers . utils . ConstructorFragment . isConstructorFragment ( object ) boolean

Tra lal al

-

EventFragment inherits Fragment

+

article

-

Properties

+

Output Formats

Each Fragment and ParamType may be output using its format method.

-
fragment . anonymous boolean

This is whether the event is anonymous. An anonymous Event does not inject its topic hash as topic0 when creating a log.

-

Methods

+
ethers.utils.FragmentTypes.full string

This is a full human-readable string, including all parameter names, any optional modifiers (e.g. indexed, public, etc) and white-space to aid in human readabiliy.

-
ethers . utils . EventFragment . from ( objectOrString ) EventFragment

Tra la la...

-
ethers . utils . EventFragment . isEventFragment ( object ) boolean

Tra lal al

-

FunctionFragment inherits ConstructorFragment

+
ethers.utils.FragmentTypes.minimal string

This is similar to full, except with no unnecessary whitespace or parameter names. This is useful for storing a minimal string which can still fully reconstruct the original Fragment using Fragment&thinsp;.&thinsp;from.

-

Properties

+
ethers.utils.FragmentTypes.json string

This returns a JavaScript Object which is safe to call JSON.stringify on to create a JSON string.

-
fragment . constant boolean

This is whether the function is constant (i.e. does not change state). This is true if the state mutability is pure or view.

-
fragment . stateMutability string

This is the state mutability of the constructor. It can be any of:

  • nonpayable
  • payable
  • pure
  • view
-
fragment . outputs Array< ParamType >

A list of the Function output parameters.

-

Method

+
ethers.utils.FragmentTypes.sighash string

This is a minimal output format, which is used by Solidity when computing a signature hash or an event topic hash.

-
ethers . utils . FunctionFragment . from ( objectOrString ) FunctionFragment

Tra la la...

-
ethers . utils . FunctionFragment . isFunctionFragment ( object ) boolean

Tra lal al

-

ParamType

-

The following examples will represent the Solidity parameter:

string foobar

-

Properties

+
Note

The sighash format is insufficient to re-create the original Fragment, since it discards modifiers such as indexed, anonymous, stateMutability, etc.

-
paramType . name string

The local parameter name. This may be null for unnamed parameters. For example, the parameter definition string foobar would be foobar.

-
paramType . type string

The full type of the parameter, including tuple and array symbols. This may be null for unnamed parameters. For the above example, this would be foobar.

-
paramType . basetype string

The base type of the parameter. For primitive types (e.g. address, uint256, etc) this is equal to type. For arrays, it will be the string array and for a tuple, it will be the string tuple.

-
paramType . indexed boolean

Whether the parameter has been marked as indexed. This only applies to parameters which are part of an EventFragment.

-
paramType . arrayChildren ParamType

The type of children of the array. This is null for for any parameter wjhich is not an array.

-
paramType . arrayLength number

The length of the array, or -1 for dynamic-length arrays. This is null for parameters which is not arrays.

-
paramType . components Array< ParamType >

The components of a tuple. This is null for non-tuple parameters.

-

Methods

-

Tra la la...

-
paramType . format ( [ outputType = sighash ] )

Tra la la...

-
ethers . utils . ParamType . from ( objectOrString ) ParamType

Tra la la...

-
ethers . utils . ParamType . isParamType ( object ) boolean

Tra la la...

\ No newline at end of file +

Fragment

An ABI is a collection of Fragments, where each fragment specifies:

+ +

+ +

Properties

+
fragment.name string

This is the name of the Event or Function. This will be null for a ConstructorFragment.

+ +
fragment.type string

This is a string which indicates the type of the Fragment. This will be one of:

+ +

  • constructor
  • event
  • function

+ +
fragment.inputs Array< ParamType >

This is an array of of each ParamType for the input parameters to the Constructor, Event of Function.

+ +

Methods

+
ethers.utils.Fragment.from( objectOrString ) Fragment

Returns a

+ +
ethers.utils.Fragment.isFragment( object ) boolean

Tra lal al

+ +

ConstructorFragment inherits Fragment

+

Properties

+
fragment.gas BigNumber

This is the gas limit that should be used during deployment. It may be null.

+ +
fragment.payable boolean

This is whether the constructor may receive ether during deployment as an endowment (i.e. msg.value != 0).

+ +
fragment.stateMutability string

This is the state mutability of the constructor. It can be any of:

+ +

  • nonpayable
  • payable

+ +

Methods

+
ethers.utils.ConstructorFragment.from( objectOrString ) ConstructorFragment

Tra la la...

+ +
ethers.utils.ConstructorFragment.isConstructorFragment( object ) boolean

Tra lal al

+ +

EventFragment inherits Fragment

+

Properties

+
fragment.anonymous boolean

This is whether the event is anonymous. An anonymous Event does not inject its topic hash as topic0 when creating a log.

+ +

Methods

+
ethers.utils.EventFragment.from( objectOrString ) EventFragment

Tra la la...

+ +
ethers.utils.EventFragment.isEventFragment( object ) boolean

Tra lal al

+ +

FunctionFragment inherits ConstructorFragment

+

Properties

+
fragment.constant boolean

This is whether the function is constant (i.e. does not change state). This is true if the state mutability is pure or view.

+ +
fragment.stateMutability string

This is the state mutability of the constructor. It can be any of:

+ +

  • nonpayable
  • payable
  • pure
  • view

+ +
fragment.outputs Array< ParamType >

A list of the Function output parameters.

+ +

Method

+
ethers.utils.FunctionFragment.from( objectOrString ) FunctionFragment

Tra la la...

+ +
ethers.utils.FunctionFragment.isFunctionFragment( object ) boolean

Tra lal al

+ +

ParamType

The following examples will represent the Solidity parameter:

+ +

string foobar

+ +

Properties

+
paramType.name string

The local parameter name. This may be null for unnamed parameters. For example, the parameter definition string foobar would be foobar.

+ +
paramType.type string

The full type of the parameter, including tuple and array symbols. This may be null for unnamed parameters. For the above example, this would be foobar.

+ +
paramType.baseType string

The base type of the parameter. For primitive types (e.g. address, uint256, etc) this is equal to type. For arrays, it will be the string array and for a tuple, it will be the string tuple.

+ +
paramType.indexed boolean

Whether the parameter has been marked as indexed. This only applies to parameters which are part of an EventFragment.

+ +
paramType.arrayChildren ParamType

The type of children of the array. This is null for for any parameter wjhich is not an array.

+ +
paramType.arrayLength number

The length of the array, or -1 for dynamic-length arrays. This is null for parameters which is not arrays.

+ +
paramType.components Array< ParamType >

The components of a tuple. This is null for non-tuple parameters.

+ +

Methods

Tra la la...

+ +
paramType.format( [ outputType = sighash ] )

Tra la la...

+ +
ethers.utils.ParamType.from( objectOrString ) ParamType

Tra la la...

+ +
ethers.utils.ParamType.isParamType( object ) boolean

Tra la la...

+ +
+ + + +
+ + + diff --git a/docs/api/utils/abi/index.html b/docs/api/utils/abi/index.html index c6df03725..23ca6a500 100644 --- a/docs/api/utils/abi/index.html +++ b/docs/api/utils/abi/index.html @@ -1,3 +1,35 @@ -Application Binary Interface

Application Binary Interface

+ + + + Application Binary Interface + + + + + \ No newline at end of file +

Application Binary Interface

An Application Binary Interface (ABI) is a collection of Fragments which specify how to interact with various components of a Contract.

+ +

An Interface helps organize Fragments by type as well as provides the functionality required to encode, decode and work with each component.

+ +

Most developers will not require this low-level access to encoding and decoding the binary data on the network and will most likely use a Contract which provides a more convenient interface. Some framework, tool developers or developers using advanced techniques may find these classes and utilities useful.

+ + + + + +
+ + + diff --git a/docs/api/utils/abi/interface/README.md b/docs/api/utils/abi/interface/README.md index 0e5ef1c13..a3c20cbae 100644 --- a/docs/api/utils/abi/interface/README.md +++ b/docs/api/utils/abi/interface/README.md @@ -7,347 +7,201 @@ Documentation: [html](https://docs-beta.ethers.io/) Interface ========= - -The **Interface** Class abstracts the encoding and decoding required -to interact with contracts on the Ethereum network. - -Many of the standards organically evolved along side the [Solidity](../../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/solidity.readthedocs.io/en/v0.6.2) -language, which other languages have adopted to remain compatibile with -existing deployed contracts. - -The EVM itself does not understand what the ABI is. It is simply an agreed -upon set of formats to encode various types of data which each contract can -expect so they can interoperate with each other. - - Creating Instances ------------------ +#### **new ***ethers* . *utils* . **Interface**( abi ) +Create a new **Interface** from a JSON string or object representing *abi*. -#### **new** *ethers* . *utils* . **Interface** ( abi ) - -Create a new **Interface** from a JSON string or object representing -*abi*. - -The *abi* may be a JSON string or the parsed Object (using JSON.parse) -which is emitted by the [Solidity compiler](../../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/solidity.readthedocs.io/en/v0.6.0/using-the-compiler.html) (or compatible languages). - -The *abi* may also be a [Human-Readable Abi](../../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917), -which is a format the Ethers created to simplify manually typing the ABI -into the source and so that a Contract ABI can also be referenced easily -within the same source file. - +The *abi* may be a JSON string or the parsed Object (using JSON.parse) which is emitted by the [Solidity compiler](https://solidity.readthedocs.io/en/v0.6.0/using-the-compiler.html#output-description) (or compatible languages). +The *abi* may also be a [Human-Readable Abi](https://blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917), which is a format the Ethers created to simplify manually typing the ABI into the source and so that a Contract ABI can also be referenced easily within the same source file. Properties ---------- +#### *interface* . **fragments** => *Array< [Fragment](/api/utils/abi/fragments/#Fragment) >* + +All the [Fragments](/api/utils/abi/fragments/#Fragment) in the interface. -#### *interface* . **fragments** **=>** *Array< [Fragment](../fragments) >* +#### *interface* . **events** => *Array< [EventFragment](/api/utils/abi/fragments/#EventFragment) >* -All the [Fragments](../fragments) in the interface. +All the [Event Fragments](/api/utils/abi/fragments/#EventFragment) in the interface. +#### *interface* . **functions** => *Array< [FunctionFragment](/api/utils/abi/fragments/#FunctionFragment) >* + +All the [Function Fragments](/api/utils/abi/fragments/#FunctionFragment) in the interface. -#### *interface* . **events** **=>** *Array< [EventFragment](../fragments) >* - -All the [Event Fragments](../fragments) in the interface. - - - - -#### *interface* . **functions** **=>** *Array< [FunctionFragment](../fragments) >* - -All the [Function Fragments](../fragments) in the interface. - - - - -#### *interface* . **deploy** **=>** *[ConstructorFragment](../fragments)* - -The [Constructor Fragments](../fragments) for the interface. - +#### *interface* . **deploy** => *[ConstructorFragment](/api/utils/abi/fragments/#ConstructorFragment)* +The [Constructor Fragments](/api/utils/abi/fragments/#ConstructorFragment) for the interface. Formatting ---------- +#### *interface* . **format**( [ format ] ) => *string | Array< string >* - -#### *interface* . **format** ( [ format ] ) **=>** *string|Array< string >* - -Return the formatted **Interface**. If the format type is `json` a -single string is returned, otherwise an Array of the human-readable -strings is returned. - - +Return the formatted **Interface**. If the format type is `json` a single string is returned, otherwise an Array of the human-readable strings is returned. Fragment Access --------------- +#### *interface* . **getFunction**( fragment ) => *[FunctionFragment](/api/utils/abi/fragments/#FunctionFragment)* + +Returns the [FunctionFragment](/api/utils/abi/fragments/#FunctionFragment) for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)). -#### *interface* . **getFunction** ( fragment ) **=>** *[FunctionFragment](../fragments)* - -Returns the [FunctionFragment](../fragments) for *fragment* (see [Specifying Fragments](./)). - - - - -#### *interface* . **getEvent** ( fragment ) **=>** *[EventFragment](../fragments)* - -Returns the [EventFragment](../fragments) for *fragment* (see [Specifying Fragments](./)). - +#### *interface* . **getEvent**( fragment ) => *[EventFragment](/api/utils/abi/fragments/#EventFragment)* +Returns the [EventFragment](/api/utils/abi/fragments/#EventFragment) for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)). Signature and Topic Hashes -------------------------- +#### *interface* . **getSighash**( fragment ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 4 > >* + +Return the sighash (or Function Selector) for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)). -#### *interface* . **getSighash** ( fragment ) **=>** *string< [DataHexstring](../../bytes)< 4 > >* - -Return the sighash (or Function Selector) for *fragment* (see [Specifying Fragments](./)). - - - - -#### *interface* . **getEventTopic** ( fragment ) **=>** *string< [DataHexstring](../../bytes)< 32 > >* - -Return the topic hash for *fragment* (see [Specifying Fragments](./)). - +#### *interface* . **getEventTopic**( fragment ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* +Return the topic hash for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)). Encoding Data ------------- +#### *interface* . **encodeDeploy**( [ values ] ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* + +Return the encoded deployment data, which can be concatenated to the deployment bytecode of a contract to pass *values* into the contract constructor. -#### *interface* . **encodeDeploy** ( [ values ] ) **=>** *string< [DataHexstring](../../bytes) >* +#### *interface* . **encodeFilterTopics**( fragment [ , values ] ) => *Array< topic | Array< topic > >* -Return the encoded deployment data, which can be concatenated to the -deployment bytecode of a contract to pass *values* into the contract -constructor. +Returns the encoded topic filter, which can be passed to getLogs for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *values*. + +Each *topic* is a 32 byte (64 nibble) [DataHexString](/api/utils/bytes/#DataHexString). +#### *interface* . **encodeFunctionData**( fragment [ , values ] ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* + +Returns the encoded data, which can be used as the data for a transaction for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *values*. -#### *interface* . **encodeFilterTopics** ( fragment [ , values ] ) **=>** *Array< topic|Array< topic > >* +#### *interface* . **encodeFunctionResult**( fragment [ , values ] ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* -Returns the encoded topic filter, which can be passed to getLogs for *fragment* -(see [Specifying Fragments](./)) for the given *values*. - -Each *topic* is a 32 byte (64 nibble) [DataHexstring](../../bytes). - - - - -#### *interface* . **encodeFunctionData** ( fragment [ , values ] ) **=>** *string< [DataHexstring](../../bytes) >* - -Returns the encoded data, which can be used as the data for a transaction for -*fragment* (see [Specifying Fragments](./)) for the given *values*. - - - - -#### *interface* . **encodeFunctionResult** ( fragment [ , values ] ) **=>** *string< [DataHexstring](../../bytes) >* - -Returns the encoded result, which would normally be the response from a call for -*fragment* (see [Specifying Fragments](./)) for the given *values*. +Returns the encoded result, which would normally be the response from a call for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *values*. Most developers will not need this method, but may be useful for authors of a mock blockchain. - - Decoding Data ------------- +#### *interface* . **decodeEventLog**( fragment , data [ , topics ] ) => *[Result](/api/utils/abi/interface/#Result)* - -#### *interface* . **decodeEventLog** ( fragment , data [ , topics ] ) **=>** *[Result](./)* - -Returns the decoded event values from an event log for -*fragment* (see [Specifying Fragments](./)) for the given *data* -with the optional *topics*. +Returns the decoded event values from an event log for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *data* with the optional *topics*. If *topics* is not specified, placeholders will be inserted into the result. +#### *interface* . **decodeFunctionData**( fragment , data ) => *[Result](/api/utils/abi/interface/#Result)* + +Returns the decoded values from transaction data for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *data*. + +Most developers will not need this method, but may be useful for debugging or inspecting transactions. -#### *interface* . **decodeFunctionData** ( fragment , data ) **=>** *[Result](./)* - -Returns the decoded values from transaction data for -*fragment* (see [Specifying Fragments](./)) for the given *data*. - -Most developers will not need this method, but may be useful for debugging -or inspecting transactions. - - - - -#### *interface* . **decodeFunctionResult** ( fragment , data ) **=>** *[Result](./)* - -Returns the decoded values from the result of a call for -*fragment* (see [Specifying Fragments](./)) for the given *data*. - +#### *interface* . **decodeFunctionResult**( fragment , data ) => *[Result](/api/utils/abi/interface/#Result)* +Returns the decoded values from the result of a call for *fragment* (see [Specifying Fragments](/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *data*. Parsing ------- +#### *interface* . **parseLog**( log ) => *[LogDescription](/api/utils/abi/interface/#LogDescription)* -The functions are generally the most useful for most developers. They will -automatically search the ABI for a matching Event or Function and decode -the components as a fully specified description. +Search the event that matches the *log* topic hash and parse the values the log represents. -#### *interface* . **parseLog** ( log ) **=>** *[LogDescription](./)* - -Search the event that matches the *log* topic hash and parse the values -the log represents. - - - - -#### *interface* . **parseTransaction** ( transaction ) **=>** *[TransactionDescription](./)* - -Search for the function that matches the *transaction* data sighash -and parse the transaction properties. - +#### *interface* . **parseTransaction**( transaction ) => *[TransactionDescription](/api/utils/abi/interface/#TransactionDescription)* +Search for the function that matches the *transaction* data sighash and parse the transaction properties. Types ----- - - ### Result - -A **Result** is an array, so each value can be accessed as a positional -argument. - -Additionally, if values are named, the identical object as its positional -value can be accessed by its name. - -The name `length` is however reserved as it is part of the Array, so -any named value for this key is renamed to `_length`. If there is a -name collision, only the first is available by its key. - - ### LogDescription - - -#### *logDescription* . **args** **=>** *[Result](./)* +#### *logDescription* . **args** => *[Result](/api/utils/abi/interface/#Result)* The values of the input parameters of the event. +#### *logDescription* . **eventFragment** => *[EventFragment](/api/utils/abi/fragments/#EventFragment)* + +The [EventFragment](/api/utils/abi/fragments/#EventFragment) which matches the topic in the Log. -#### *logDescription* . **eventFragment** **=>** *[EventFragment](../fragments)* - -The [EventFragment](../fragments) which matches the topic in the Log. - - - - -#### *logDescription* . **name** **=>** *string* +#### *logDescription* . **name** => *string* The event name. (e.g. `Transfer`) - - -#### *logDescription* . **signature** **=>** *string* +#### *logDescription* . **signature** => *string* The event signature. (e.g. `Transfer(address,address,uint256)`) - - -#### *logDescription* . **topic** **=>** *string* +#### *logDescription* . **topic** => *string* The topic hash. - - ### TransactionDescription +#### *transactionDescription* . **args** => *[Result](/api/utils/abi/interface/#Result)* + +The decoded values from the transaction data which were passed as the input parameters. -#### *transactionDescription* . **args** **=>** *[Result](./)* +#### *transactionDescription* . **functionFragment** => *[FunctionFragment](/api/utils/abi/fragments/#FunctionFragment)* -The decoded values from the transaction data which were passed -as the input parameters. +The [FunctionFragment](/api/utils/abi/fragments/#FunctionFragment) which matches the sighash in the transaction data. - - -#### *transactionDescription* . **functionFragment** **=>** *[FunctionFragment](../fragments)* - -The [FunctionFragment](../fragments) which matches the sighash in the transaction data. - - - - -#### *transactionDescription* . **name** **=>** *string* +#### *transactionDescription* . **name** => *string* The name of the function. (e.g. `transfer`) - - -#### *transactionDescription* . **sighash** **=>** *string* +#### *transactionDescription* . **sighash** => *string* The sighash (or function selector) that matched the transaction data. - - -#### *transactionDescription* . **signature** **=>** *string* +#### *transactionDescription* . **signature** => *string* The signature of the function. (e.g. `transfer(address,uint256)`) - - -#### *transactionDescription* . **value** **=>** *[BigNumber](../../bignumber)* +#### *transactionDescription* . **value** => *[BigNumber](/api/utils/bignumber/)* The value from the transaction. - - Specifying Fragments -------------------- - -When specifying a fragment to any of the functions in an **Interface**, -any of the following may be used: - - - -* The name of the event or function, if it is unique and non-ambiguous within the ABI (e.g. `transfer`) -* The signature of the event or function. The signature is normalized, so, for example, `uint` and `uint256` are equivalent (e.g. `transfer(address, uint)`) -* The sighash or topichash of the function. The sighash is often referred to the function selector in Solidity (e.g. `0xa9059cbb`) -* A [Fragment](../fragments) - - - ------ -**Content Hash:** ed5159ed39b943e91bae3e17384c149e4b55f4d80650672a092c2781a3883934 \ No newline at end of file diff --git a/docs/api/utils/abi/interface/index.html b/docs/api/utils/abi/interface/index.html index 9e61d3b29..4fbee10cb 100644 --- a/docs/api/utils/abi/interface/index.html +++ b/docs/api/utils/abi/interface/index.html @@ -1,58 +1,129 @@ -Interface

Interface

-

The Interface Class abstracts the encoding and decoding required to interact with contracts on the Ethereum network.

Many of the standards organically evolved along side the Solidity language, which other languages have adopted to remain compatibile with existing deployed contracts.

The EVM itself does not understand what the ABI is. It is simply an agreed upon set of formats to encode various types of data which each contract can expect so they can interoperate with each other.

-

Creating Instances

+ + + + Interface + + + + +
+ -
new ethers . utils . Interface ( abi )

Create a new Interface from a JSON string or object representing abi.

The abi may be a JSON string or the parsed Object (using JSON.parse) which is emitted by the Solidity compiler (or compatible languages).

The abi may also be a Human-Readable Abi, which is a format the Ethers created to simplify manually typing the ABI into the source and so that a Contract ABI can also be referenced easily within the same source file.

-

Properties

+

Interface

The Interface Class abstracts the encoding and decoding required to interact with contracts on the Ethereum network.

-
interface . fragments Array< Fragment >

All the Fragments in the interface.

-
interface . events Array< EventFragment >

All the Event Fragments in the interface.

-
interface . functions Array< FunctionFragment >

All the Function Fragments in the interface.

-
interface . deploy ConstructorFragment

The Constructor Fragments for the interface.

-

Formatting

+

Many of the standards organically evolved along side the Solidity language, which other languages have adopted to remain compatibile with existing deployed contracts.

-
interface . format ( [ format ] ) string  |  Array< string >

Return the formatted Interface. If the format type is json a single string is returned, otherwise an Array of the human-readable strings is returned.

-

Fragment Access

+

The EVM itself does not understand what the ABI is. It is simply an agreed upon set of formats to encode various types of data which each contract can expect so they can interoperate with each other.

-
interface . getFunction ( fragment ) FunctionFragment

Returns the FunctionFragment for fragment (see Specifying Fragments).

-
interface . getEvent ( fragment ) EventFragment

Returns the EventFragment for fragment (see Specifying Fragments).

-

Signature and Topic Hashes

+

Creating Instances

+
new ethers.utils.Interface( abi )

Create a new Interface from a JSON string or object representing abi.

-
interface . getSighash ( fragment ) string< DataHexstring< 4 > >

Return the sighash (or Function Selector) for fragment (see Specifying Fragments).

-
interface . getEventTopic ( fragment ) string< DataHexstring< 32 > >

Return the topic hash for fragment (see Specifying Fragments).

-

Encoding Data

+

The abi may be a JSON string or the parsed Object (using JSON.parse) which is emitted by the Solidity compiler (or compatible languages).

-
interface . encodeDeploy ( [ values ] ) string< DataHexstring >

Return the encoded deployment data, which can be concatenated to the deployment bytecode of a contract to pass values into the contract constructor.

-
interface . encodeFilterTopics ( fragment [ , values ] ) Array< topic  |  Array< topic > >

Returns the encoded topic filter, which can be passed to getLogs for fragment (see Specifying Fragments) for the given values.

Each topic is a 32 byte (64 nibble) DataHexstring.

-
interface . encodeFunctionData ( fragment [ , values ] ) string< DataHexstring >

Returns the encoded data, which can be used as the data for a transaction for fragment (see Specifying Fragments) for the given values.

-
interface . encodeFunctionResult ( fragment [ , values ] ) string< DataHexstring >

Returns the encoded result, which would normally be the response from a call for fragment (see Specifying Fragments) for the given values.

Most developers will not need this method, but may be useful for authors of a mock blockchain.

-

Decoding Data

+

The abi may also be a Human-Readable Abi, which is a format the Ethers created to simplify manually typing the ABI into the source and so that a Contract ABI can also be referenced easily within the same source file.

-
interface . decodeEventLog ( fragment , data [ , topics ] ) Result

Returns the decoded event values from an event log for fragment (see Specifying Fragments) for the given data with the optional topics.

If topics is not specified, placeholders will be inserted into the result.

-
interface . decodeFunctionData ( fragment , data ) Result

Returns the decoded values from transaction data for fragment (see Specifying Fragments) for the given data.

Most developers will not need this method, but may be useful for debugging or inspecting transactions.

-
interface . decodeFunctionResult ( fragment , data ) Result

Returns the decoded values from the result of a call for fragment (see Specifying Fragments) for the given data.

-

Parsing

-

The functions are generally the most useful for most developers. They will automatically search the ABI for a matching Event or Function and decode the components as a fully specified description.

-
interface . parseLog ( log ) LogDescription

Search the event that matches the log topic hash and parse the values the log represents.

-
interface . parseTransaction ( transaction ) TransactionDescription

Search for the function that matches the transaction data sighash and parse the transaction properties.

-

Types

+

Properties

+
interface.fragments Array< Fragment >

All the Fragments in the interface.

-

Result inherits Array<any>

-

A Result is an array, so each value can be accessed as a positional argument.

Additionally, if values are named, the identical object as its positional value can be accessed by its name.

The name length is however reserved as it is part of the Array, so any named value for this key is renamed to _length. If there is a name collision, only the first is available by its key.

-

LogDescription

+
interface.events Array< EventFragment >

All the Event Fragments in the interface.

-
logDescription . args Result

The values of the input parameters of the event.

-
logDescription . eventFragment EventFragment

The EventFragment which matches the topic in the Log.

-
logDescription . name string

The event name. (e.g. Transfer)

-
logDescription . signature string

The event signature. (e.g. Transfer(address,address,uint256))

-
logDescription . topic string

The topic hash.

-

TransactionDescription

+
interface.functions Array< FunctionFragment >

All the Function Fragments in the interface.

-
transactionDescription . args Result

The decoded values from the transaction data which were passed as the input parameters.

-
transactionDescription . functionFragment FunctionFragment

The FunctionFragment which matches the sighash in the transaction data.

-
transactionDescription . name string

The name of the function. (e.g. transfer)

-
transactionDescription . sighash string

The sighash (or function selector) that matched the transaction data.

-
transactionDescription . signature string

The signature of the function. (e.g. transfer(address,uint256))

-
transactionDescription . value BigNumber

The value from the transaction.

-

Specifying Fragments

-

When specifying a fragment to any of the functions in an Interface, any of the following may be used:

  • The name of the event or function, if it is unique and non-ambiguous within the ABI (e.g. transfer)
  • The signature of the event or function. The signature is normalized, so, for example, uint and uint256 are equivalent (e.g. transfer(address, uint))
  • The sighash or topichash of the function. The sighash is often referred to the function selector in Solidity (e.g. 0xa9059cbb)
  • A Fragment
\ No newline at end of file +
interface.deploy ConstructorFragment

The Constructor Fragments for the interface.

+ +

Formatting

+
interface.format( [ format ] ) string | Array< string >

Return the formatted Interface. If the format type is json a single string is returned, otherwise an Array of the human-readable strings is returned.

+ +

Fragment Access

+
interface.getFunction( fragment ) FunctionFragment

Returns the FunctionFragment for fragment (see Specifying Fragments).

+ +
interface.getEvent( fragment ) EventFragment

Returns the EventFragment for fragment (see Specifying Fragments).

+ +

Signature and Topic Hashes

+
interface.getSighash( fragment ) string< DataHexString< 4 > >

Return the sighash (or Function Selector) for fragment (see Specifying Fragments).

+ +
interface.getEventTopic( fragment ) string< DataHexString< 32 > >

Return the topic hash for fragment (see Specifying Fragments).

+ +

Encoding Data

+
interface.encodeDeploy( [ values ] ) string< DataHexString >

Return the encoded deployment data, which can be concatenated to the deployment bytecode of a contract to pass values into the contract constructor.

+ +
interface.encodeFilterTopics( fragment [ , values ] ) Array< topic | Array< topic > >

Returns the encoded topic filter, which can be passed to getLogs for fragment (see Specifying Fragments) for the given values.

+ +

Each topic is a 32 byte (64 nibble) DataHexString.

+ +
interface.encodeFunctionData( fragment [ , values ] ) string< DataHexString >

Returns the encoded data, which can be used as the data for a transaction for fragment (see Specifying Fragments) for the given values.

+ +
interface.encodeFunctionResult( fragment [ , values ] ) string< DataHexString >

Returns the encoded result, which would normally be the response from a call for fragment (see Specifying Fragments) for the given values.

+ +

Most developers will not need this method, but may be useful for authors of a mock blockchain.

+ +

Decoding Data

+
interface.decodeEventLog( fragment , data [ , topics ] ) Result

Returns the decoded event values from an event log for fragment (see Specifying Fragments) for the given data with the optional topics.

+ +

If topics is not specified, placeholders will be inserted into the result.

+ +
interface.decodeFunctionData( fragment , data ) Result

Returns the decoded values from transaction data for fragment (see Specifying Fragments) for the given data.

+ +

Most developers will not need this method, but may be useful for debugging or inspecting transactions.

+ +
interface.decodeFunctionResult( fragment , data ) Result

Returns the decoded values from the result of a call for fragment (see Specifying Fragments) for the given data.

+ +

Parsing

The functions are generally the most useful for most developers. They will automatically search the ABI for a matching Event or Function and decode the components as a fully specified description.

+ +
interface.parseLog( log ) LogDescription

Search the event that matches the log topic hash and parse the values the log represents.

+ +
interface.parseTransaction( transaction ) TransactionDescription

Search for the function that matches the transaction data sighash and parse the transaction properties.

+ +

Types

+

Result inherits Array<any>

A Result is an array, so each value can be accessed as a positional argument.

+ +

Additionally, if values are named, the identical object as its positional value can be accessed by its name.

+ +

The name length is however reserved as it is part of the Array, so any named value for this key is renamed to _length. If there is a name collision, only the first is available by its key.

+ +

LogDescription

+
logDescription.args Result

The values of the input parameters of the event.

+ +
logDescription.eventFragment EventFragment

The EventFragment which matches the topic in the Log.

+ +
logDescription.name string

The event name. (e.g. Transfer)

+ +
logDescription.signature string

The event signature. (e.g. Transfer(address,address,uint256))

+ +
logDescription.topic string

The topic hash.

+ +

TransactionDescription

+
transactionDescription.args Result

The decoded values from the transaction data which were passed as the input parameters.

+ +
transactionDescription.functionFragment FunctionFragment

The FunctionFragment which matches the sighash in the transaction data.

+ +
transactionDescription.name string

The name of the function. (e.g. transfer)

+ +
transactionDescription.sighash string

The sighash (or function selector) that matched the transaction data.

+ +
transactionDescription.signature string

The signature of the function. (e.g. transfer(address,uint256))

+ +
transactionDescription.value BigNumber

The value from the transaction.

+ +

Specifying Fragments

When specifying a fragment to any of the functions in an Interface, any of the following may be used:

+ +

  • The name of the event or function, if it is unique and non-ambiguous within the ABI (e.g. transfer)
  • The signature of the event or function. The signature is normalized, so, for example, uint and uint256 are equivalent (e.g. transfer(address, uint))
  • The sighash or topichash of the function. The sighash is often referred to the function selector in Solidity (e.g. 0xa9059cbb)
  • A Fragment

+ + + + + +
+ + + diff --git a/docs/api/utils/address/README.md b/docs/api/utils/address/README.md index 884c214da..bf2d32472 100644 --- a/docs/api/utils/address/README.md +++ b/docs/api/utils/address/README.md @@ -7,99 +7,58 @@ Documentation: [html](https://docs-beta.ethers.io/) Addresses ========= - -Explain addresses,formats and checksumming here. - -Also see: [constants.AddressZero](../constants) - - Address Formats --------------- - - ### Address - -An **Address** is a [DataHexstring](../bytes) of 20 bytes (40 nibbles), with optional -mixed case. - -If the case is mixed, it is a **Checksum Address**, which uses a specific pattern -of uppercase and lowercase letters within a given address to reduce the risk -of errors introduced from typing an address or cut and paste issues. - -All functions that return an Address will return a Checksum Address. - - ### ICAP Address +Converting and Verifying +------------------------ -The **ICAP Address Format** was an early attempt to introduce a checksum -into Ethereum addresses using the popular banking industry's -[IBAN](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/International_Bank_Account_Number) -format with the country code specified as **XE**. - -Due to the way IBAN encodes address, only addresses that fit into 30 base-36 -characters are actually compatible, so the format was adapted to support 31 -base-36 characters which is large enough for a full Ethereum address, however -the preferred method was to select a private key whose address has a `0` as -the first byte, which allows the address to be formatted as a fully compatibly -standard IBAN address with 30 base-36 characters. - -In general this format is no longer widely supported anymore, however any function that -accepts an address can receive an ICAP address, and it will be converted internally. - -To convert an address into the ICAP format, see [getIcapAddress](./). - - -Functions ---------- - - - -#### *ethers* . *utils* . **getAddress** ( address ) **=>** *string< [Address](./) >* +#### *ethers* . *utils* . **getAddress**( address ) => *string< [Address](/api/utils/address/#address) >* Returns *address* as a Checksum Address. -If *address* is an invalid 40-nibble [Hexstring](../bytes) or if it contains mixed case and -the checksum is invalid, an InvalidArgument Error is throw. +If *address* is an invalid 40-nibble [HexString](/api/utils/bytes/#HexString) or if it contains mixed case and the checksum is invalid, an InvalidArgument Error is throw. The value of *address* may be any supported address format. +#### *ethers* . *utils* . **getIcapAddress**( address ) => *string< [IcapAddress](/api/utils/address/#address-icap) >* + +Returns *address* as an [ICAP address](https://github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-%28ICAP%29). Supports the same restrictions as [utils.getAddress](/api/utils/address/#utils-getAddress). -#### *ethers* . *utils* . **isAddress** ( address ) **=>** *boolean* +#### *ethers* . *utils* . **isAddress**( address ) => *boolean* Returns true if *address* is valid (in any supported format). +Derivation +---------- + +#### *ethers* . *utils* . **computeAddress**( publicOrPrivateKey ) => *string< [Address](/api/utils/address/#address) >* + +Returns the address for *publicOrPrivateKey*. A public key may be compressed or uncompressed, and a private key will be converted automatically to a public key for the derivation. -#### *ethers* . *utils* . **getIcapAddress** ( address ) **=>** *string< [IcapAddress](./) >* +#### *ethers* . *utils* . **recoverAddress**( digest , signature ) => *string< [Address](/api/utils/address/#address) >* -Returns *address* as an [ICAP address](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-%28ICAP%29). -Supports the same restrictions as [utils.getAddress](./). +Use [ECDSA Public Key Recovery](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Public_key_recovery) to determine the address that signed *digest* to which generated *signature*. +Contracts Addresses +------------------- + +#### *ethers* . *utils* . **getContractAddress**( transaction ) => *string< [Address](/api/utils/address/#address) >* + +Returns the contract address that would result if *transaction* was used to deploy a contract. -#### *ethers* . *utils* . **getContractAddress** ( transaction ) **=>** *string< [Address](./) >* +#### *ethers* . *utils* . **getCreate2Address**( from , salt , initCodeHash ) => *string< [Address](/api/utils/address/#address) >* -Returns the contract address that would result if *transaction* was -used to deploy a contract. +Returns the contract address that would result from the given [CREATE2](https://eips.ethereum.org/EIPS/eip-1014) call. - - -#### *ethers* . *utils* . **getCreate2Address** ( from , salt , initCodeHash ) **=>** *string< [Address](./) >* - -Returns the contract address that would result from the given -[CREATE2](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-1014) call. - - - - - ------ -**Content Hash:** 94de1affabe23203e5796f6ad2bd7ccacfb9dd51e5ea7db004c10cd2aea8fded \ No newline at end of file diff --git a/docs/api/utils/address/index.html b/docs/api/utils/address/index.html index a1fed3df0..37e69c822 100644 --- a/docs/api/utils/address/index.html +++ b/docs/api/utils/address/index.html @@ -1,15 +1,69 @@ -Addresses

Addresses

-

Explain addresses,formats and checksumming here.

Also see: constants . AddressZero

-

Address Formats

+ + + + Addresses + + + + +
+ -

Address

-

An Address is a DataHexstring of 20 bytes (40 nibbles), with optional mixed case.

If the case is mixed, it is a Checksum Address, which uses a specific pattern of uppercase and lowercase letters within a given address to reduce the risk of errors introduced from typing an address or cut and paste issues.

All functions that return an Address will return a Checksum Address.

-

ICAP Address

-

The ICAP Address Format was an early attempt to introduce a checksum into Ethereum addresses using the popular banking industry's IBAN format with the country code specified as XE.

Due to the way IBAN encodes address, only addresses that fit into 30 base-36 characters are actually compatible, so the format was adapted to support 31 base-36 characters which is large enough for a full Ethereum address, however the preferred method was to select a private key whose address has a 0 as the first byte, which allows the address to be formatted as a fully compatibly standard IBAN address with 30 base-36 characters.

In general this format is no longer widely supported anymore, however any function that accepts an address can receive an ICAP address, and it will be converted internally.

To convert an address into the ICAP format, see getIcapAddress.

-

Functions

+

Addresses

Explain addresses,formats and checksumming here.

-
ethers . utils . getAddress ( address ) string< Address >

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 value of address may be any supported address format.

-
ethers . utils . isAddress ( address ) boolean

Returns true if address is valid (in any supported format).

-
ethers . utils . getIcapAddress ( address ) string< IcapAddress >

Returns address as an ICAP address. Supports the same restrictions as utils . getAddress.

-
ethers . utils . getContractAddress ( transaction ) string< Address >

Returns the contract address that would result if transaction was used to deploy a contract.

-
ethers . utils . getCreate2Address ( from , salt , initCodeHash ) string< Address >

Returns the contract address that would result from the given CREATE2 call.

\ No newline at end of file +

Also see: constants.AddressZero

+ +

Address Formats

+

Address

An Address is a DataHexString of 20 bytes (40 nibbles), with optional mixed case.

+ +

If the case is mixed, it is a Checksum Address, which uses a specific pattern of uppercase and lowercase letters within a given address to reduce the risk of errors introduced from typing an address or cut and paste issues.

+ +

All functions that return an Address will return a Checksum Address.

+ +

ICAP Address

The ICAP Address Format was an early attempt to introduce a checksum into Ethereum addresses using the popular banking industry's IBAN format with the country code specified as XE.

+ +

Due to the way IBAN encodes address, only addresses that fit into 30 base-36 characters are actually compatible, so the format was adapted to support 31 base-36 characters which is large enough for a full Ethereum address, however the preferred method was to select a private key whose address has a 0 as the first byte, which allows the address to be formatted as a fully compatibly standard IBAN address with 30 base-36 characters.

+ +

In general this format is no longer widely supported anymore, however any function that accepts an address can receive an ICAP address, and it will be converted internally.

+ +

To convert an address into the ICAP format, see getIcapAddress.

+ +

Converting and Verifying

+
ethers.utils.getAddress( address ) string< Address >

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 value of address may be any supported address format.

+ +
ethers.utils.getIcapAddress( address ) string< IcapAddress >

Returns address as an ICAP address. Supports the same restrictions as utils.getAddress.

+ +
ethers.utils.isAddress( address ) boolean

Returns true if address is valid (in any supported format).

+ +

Derivation

+
ethers.utils.computeAddress( publicOrPrivateKey ) string< Address >

Returns the address for publicOrPrivateKey. A public key may be compressed or uncompressed, and a private key will be converted automatically to a public key for the derivation.

+ +
ethers.utils.recoverAddress( digest , signature ) string< Address >

Use ECDSA Public Key Recovery to determine the address that signed digest to which generated signature.

+ +

Contracts Addresses

+
ethers.utils.getContractAddress( transaction ) string< Address >

Returns the contract address that would result if transaction was used to deploy a contract.

+ +
ethers.utils.getCreate2Address( from , salt , initCodeHash ) string< Address >

Returns the contract address that would result from the given CREATE2 call.

+ +
+ + + +
+ + + diff --git a/docs/api/utils/bignumber/README.md b/docs/api/utils/bignumber/README.md index 691ec7451..143408a97 100644 --- a/docs/api/utils/bignumber/README.md +++ b/docs/api/utils/bignumber/README.md @@ -7,409 +7,231 @@ Documentation: [html](https://docs-beta.ethers.io/) BigNumber ========= - -Many operations in Ethereum operation on numbers which are -[outside the range of safe values](./) 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. - - -### Importing - - - -``` -///// -// CommonJS: - -// From the Umbrella ethers package... -const { BigNumber } = require("ethers"); - -// From the bignumber pacakge... -const { BigNumber } = require("@ethersproject/bignumber"); - - -///// -// ES6 and TypeScript: - -// From the Umbrella ethers package... -import { BigNumber } from "ethers"; - -// From the bignumber pacakge... -import { BigNumber } from "@ethersproject/bignumber"; -``` - - - Types ----- - - ### 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: - - #### ***string*** -A [hexstring](../bytes) or a decimal string, either of which may -be negative. - - +A [HexString](/api/utils/bytes/#HexString) or a decimal string, either of which may be negative. #### ***BytesLike*** -A [BytesLike](../bytes) Object, such as an Array or Uint8Array. - - +A [BytesLike](/api/utils/bytes/#BytesLike) Object, such as an Array or Uint8Array. #### ***BigNumber*** -An existing [BigNumber](./) instance. - - +An existing [BigNumber](/api/utils/bignumber/) instance. #### ***number*** -A number that is within the [safe range](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) for JavaScript numbers. - - +A number that is within the [safe range](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER#Description) for JavaScript numbers. #### ***BigInt*** -A JavaScript [BigInt](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) -object, on environments that support BigInt. - - +A JavaScript [BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) object, on environments that support BigInt. Creating Instances ------------------ - -The constructor of BigNumber cannot be called directly. Instead, Use the static `BigNumber.from`. - - -#### *ethers* . *BigNumber* . **from** ( aBigNumberish ) **=>** *[BigNumber](./)* +#### *ethers* . *BigNumber* . **from**( aBigNumberish ) => *[BigNumber](/api/utils/bignumber/)* Returns an instance of a **BigNumber** for *aBigNumberish*. - - ### Examples: - - ```javascript -Skipping JavaScript Evaluation. +// From a decimal string... +BigNumber.from("42") +//! + +// From a HexString... +BigNumber.from("0x2a") +//! + +// From a negative HexString... +BigNumber.from("-0x2a") +//! + +// From an Array (or Uint8Array)... +BigNumber.from([ 42 ]) +//! + +// From an existing BigNumber... +let one1 = constants.One; +let one2 = BigNumber.from(one1) + +one2 +//! + +// ...which returns the same instance +one1 === one2 +//! + +// From a (safe) number... +BigNumber.from(42) +//! + +// From a ES2015 BigInt... (only on platforms with BigInt support) +BigNumber.from(42n) +//! + +// Numbers outside the safe range fail: +BigNumber.from(Number.MAX_SAFE_INTEGER); +//! error ``` - - Methods ------- - -The BigNumber class is immutable, so no operations can change the value -it represents. - - ### Math Operations +#### *BigNumber* . **add**( otherValue ) => *[BigNumber](/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* **+** *otherValue*. -#### *bignumber* . **add** ( otherValue ) **=>** *[BigNumber](./)* +#### *BigNumber* . **sub**( otherValue ) => *[BigNumber](/api/utils/bignumber/)* -Returns a BigNumber with the value of *bignumber* **+** *otherValue*. +Returns a BigNumber with the value of *BigNumber* **-** *otherValue*. +#### *BigNumber* . **mul**( otherValue ) => *[BigNumber](/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* **\*** *otherValue*. -#### *bignumber* . **sub** ( otherValue ) **=>** *[BigNumber](./)* +#### *BigNumber* . **div**( divisor ) => *[BigNumber](/api/utils/bignumber/)* -Returns a BigNumber with the value of *bignumber* **–** *otherValue*. +Returns a BigNumber with the value of *BigNumber* **/** *divisor*. +#### *BigNumber* . **mod**( divisor ) => *[BigNumber](/api/utils/bignumber/)* + +Returns a BigNumber with the value of the **remainder** of *BigNumber* / *divisor*. -#### *bignumber* . **mul** ( otherValue ) **=>** *[BigNumber](./)* +#### *BigNumber* . **pow**( exponent ) => *[BigNumber](/api/utils/bignumber/)* -Returns a BigNumber with the value of *bignumber* **×** *otherValue*. +Returns a BigNumber with the value of *BigNumber* to the power of *exponent*. +#### *BigNumber* . **abs**( ) => *[BigNumber](/api/utils/bignumber/)* + +Returns a BigNumber with the absolute value of *BigNumber*. -#### *bignumber* . **div** ( divisor ) **=>** *[BigNumber](./)* - -Returns a BigNumber with the value of *bignumber* **÷** *divisor*. - - - - -#### *bignumber* . **mod** ( divisor ) **=>** *[BigNumber](./)* - -Returns a BigNumber with the value of the **remainder** of *bignumber* ÷ *divisor*. - - - - -#### *bignumber* . **pow** ( exponent ) **=>** *[BigNumber](./)* - -Returns a BigNumber with the value of *bignumber* to the power of *exponent*. - - - - -#### *bignumber* . **abs** ( ) **=>** *[BigNumber](./)* - -Returns a BigNumber with the absolute value of *bignumber*. - - - - -#### *bignumber* . **maskn** ( bitcount ) **=>** *[BigNumber](./)* - -Returns a BigNumber with the value of *bignumber* with bits beyond -the *bitcount* least significant bits set to zero. - +#### *BigNumber* . **mask**( bitcount ) => *[BigNumber](/api/utils/bignumber/)* +Returns a BigNumber with the value of *BigNumber* with bits beyond the *bitcount* least significant bits set to zero. ### Two's Compliment +#### *BigNumber* . **fromTwos**( bitwidth ) => *[BigNumber](/api/utils/bignumber/)* -[Two's Complicment](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Two%27s_complement) -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. +Returns a BigNumber with the value of *BigNumber* converted from twos-compliment with *bitwidth*. -#### *bignumber* . **fromTwos** ( bitwidth ) **=>** *[BigNumber](./)* - -Returns a BigNumber with the value of *bignumber* converted from twos-compliment with *bitwidth*. - - - - -#### *bignumber* . **toTwos** ( bitwidth ) **=>** *[BigNumber](./)* - -Returns a BigNumber with the value of *bignumber* converted to twos-compliment with *bitwidth*. - +#### *BigNumber* . **toTwos**( bitwidth ) => *[BigNumber](/api/utils/bignumber/)* +Returns a BigNumber with the value of *BigNumber* converted to twos-compliment with *bitwidth*. ### Comparison and Equivalence +#### *BigNumber* . **eq**( otherValue ) => *boolean* + +Returns true if and only if the value of *BigNumber* is equal to *otherValue*. -#### *bignumber* . **eq** ( otherValue ) **=>** *boolean* +#### *BigNumber* . **lt**( otherValue ) => *boolean* -Returns true if and only if the value of *bignumber* is equal to *otherValue*. +Returns true if and only if the value of *BigNumber* **<** *otherValue*. +#### *BigNumber* . **lte**( otherValue ) => *boolean* + +Returns true if and only if the value of *BigNumber* **<=** *otherValue*. -#### *bignumber* . **lt** ( otherValue ) **=>** *boolean* +#### *BigNumber* . **gt**( otherValue ) => *boolean* -Returns true if and only if the value of *bignumber* **<** *otherValue*. +Returns true if and only if the value of *BigNumber* **>** *otherValue*. +#### *BigNumber* . **gte**( otherValue ) => *boolean* + +Returns true if and only if the value of *BigNumber* **>=** *otherValue*. -#### *bignumber* . **lte** ( otherValue ) **=>** *boolean* - -Returns true if and only if the value of *bignumber* **≤** *otherValue*. - - - - -#### *bignumber* . **gt** ( otherValue ) **=>** *boolean* - -Returns true if and only if the value of *bignumber* **>** *otherValue*. - - - - -#### *bignumber* . **gte** ( otherValue ) **=>** *boolean* - -Returns true if and only if the value of *bignumber* **≥** *otherValue*. - - - - -#### *bignumber* . **isZero** ( ) **=>** *boolean* - -Returns true if and only if the value of *bignumber* is zero. - +#### *BigNumber* . **isZero**( ) => *boolean* +Returns true if and only if the value of *BigNumber* is zero. ### Conversion +#### *BigNumber* . **toNumber**( ) => *number* + +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*. -#### *bignumber* . **toNumber** ( ) **=>** *number* +#### *BigNumber* . **toString**( ) => *string* -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*. +Returns the value of *BigNumber* as a base-10 string. +#### *BigNumber* . **toHexString**( ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* - -#### *bignumber* . **toString** ( ) **=>** *string* - -Returns the value of *bignumber* as a base-10 string. - - - - -#### *bignumber* . **toHexString** ( ) **=>** *string< [DataHexstring](../bytes) >* - -Returns the value of *bignumber* as a base-16, `0x`-prefixed [DataHexstring](../bytes). - - +Returns the value of *BigNumber* as a base-16, `0x`-prefixed [DataHexString](/api/utils/bytes/#DataHexString). ### Inspection - - -#### *ethers* . *BigNumnber* . **isBigNumber** ( object ) **=>** *boolean* +#### *ethers* . *BigNumnber* . **isBigNumber**( object ) => *boolean* Returns true if and only if the *object* is a BigNumber object. - - ### Examples - - ```javascript -Skipping JavaScript Evaluation. +let a = BigNumber.from(42); +let b = BigNumber.from("91"); + +a.mul(b); +//! ``` - - Notes ----- - -This section is a for a couple of questions that come up frequently. - - ### Why can't I just use numbers? - -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**. - -JavaScript uses [IEEE 754 double-precision binary floating point](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Double-precision_floating-point_format) -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: - - ```javascript -Skipping JavaScript Evaluation. +(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER) +//! ``` -To remedy this, all numbers (which can be large) are stored -and manipulated as [Big Numbers](./). +To remedy this, all numbers (which can be large) are stored and manipulated as [Big Numbers](/api/utils/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. +The functions [parseEther( etherString )](/api/utils/display-logic/#utils-parseEther) and [formatEther( wei )](/api/utils/display-logic/#utils-formatEther) 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. ### 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](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/www.npmjs.com/search?q=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 [BN.js](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/www.npmjs.com/package/bn.js) 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. - - ### Why BN.js?? +### Allow us to set a global Big Number library? -The reason why [BN.js](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/www.npmjs.com/package/bn.js) is used internally as the big -number is because that is the library used by [elliptic](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/www.npmjs.com/package/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. - - -### 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. - - - ------ -**Content Hash:** 8f8f918b6d3350f7494845577cf2d350c6f0c556a963040cadbde6520395311d \ No newline at end of file diff --git a/docs/api/utils/bignumber/index.html b/docs/api/utils/bignumber/index.html index 4568705a3..3ff88675e 100644 --- a/docs/api/utils/bignumber/index.html +++ b/docs/api/utils/bignumber/index.html @@ -1,70 +1,182 @@ -BigNumber

BigNumber

-

Many operations in Ethereum operation on numbers which are outside the range of safe values 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.

-

Importing

+ + + + BigNumber + + + + +
+ -
/////
// CommonJS:

// From the Umbrella ethers package...
const { BigNumber } = require("ethers");

// From the bignumber pacakge...
const { BigNumber } = require("@ethersproject/bignumber");


/////
// ES6 and TypeScript:

// From the Umbrella ethers package...
import { BigNumber } from "ethers";

// From the bignumber pacakge...
import { BigNumber } from "@ethersproject/bignumber";
+

BigNumber

Many operations in Ethereum operation on numbers which are outside the range of safe values to use in JavaScript.

-

Types

+

A BigNumber is an object which safely allows mathematic operations on numbers of any magnitude.

-

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:

-
string

A hexstring or a decimal string, either of which may be negative.

-
BytesLike

A BytesLike Object, such as an Array or Uint8Array.

-
BigNumber

An existing BigNumber instance.

-
number

A number that is within the safe range for JavaScript numbers.

-
BigInt

A JavaScript BigInt object, on environments that support BigInt.

-

Creating Instances

-

The constructor of BigNumber cannot be called directly. Instead, Use the static BigNumber.from.

-
ethers . BigNumber . from ( aBigNumberish ) BigNumber

Returns an instance of a BigNumber for aBigNumberish.

-

Examples:

+

Most operations which need to return a value will return a BigNumber and parameters which accept values will generally accept them.

-
Skipping JavaScript Evaluation.
+

Types

+

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:

-

Methods

-

The BigNumber class is immutable, so no operations can change the value it represents.

-

Math Operations

+
string

A HexString or a decimal string, either of which may be negative.

-
bignumber . add ( otherValue ) BigNumber

Returns a BigNumber with the value of bignumber + otherValue.

-
bignumber . sub ( otherValue ) BigNumber

Returns a BigNumber with the value of bignumber otherValue.

-
bignumber . mul ( otherValue ) BigNumber

Returns a BigNumber with the value of bignumber × otherValue.

-
bignumber . div ( divisor ) BigNumber

Returns a BigNumber with the value of bignumber ÷ divisor.

-
bignumber . mod ( divisor ) BigNumber

Returns a BigNumber with the value of the remainder of bignumber ÷ divisor.

-
bignumber . pow ( exponent ) BigNumber

Returns a BigNumber with the value of bignumber to the power of exponent.

-
bignumber . abs ( ) BigNumber

Returns a BigNumber with the absolute value of bignumber.

-
bignumber . maskn ( bitcount ) BigNumber

Returns a BigNumber with the value of bignumber with bits beyond the bitcount least significant bits set to zero.

-

Two's Compliment

-

Two's Complicment 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.

-
bignumber . fromTwos ( bitwidth ) BigNumber

Returns a BigNumber with the value of bignumber converted from twos-compliment with bitwidth.

-
bignumber . toTwos ( bitwidth ) BigNumber

Returns a BigNumber with the value of bignumber converted to twos-compliment with bitwidth.

-

Comparison and Equivalence

+
BytesLike

A BytesLike Object, such as an Array or Uint8Array.

-
bignumber . eq ( otherValue ) boolean

Returns true if and only if the value of bignumber is equal to otherValue.

-
bignumber . lt ( otherValue ) boolean

Returns true if and only if the value of bignumber < otherValue.

-
bignumber . lte ( otherValue ) boolean

Returns true if and only if the value of bignumber otherValue.

-
bignumber . gt ( otherValue ) boolean

Returns true if and only if the value of bignumber > otherValue.

-
bignumber . gte ( otherValue ) boolean

Returns true if and only if the value of bignumber otherValue.

-
bignumber . isZero ( ) boolean

Returns true if and only if the value of bignumber is zero.

-

Conversion

+
BigNumber

An existing BigNumber instance.

-
bignumber . toNumber ( ) number

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.

-
bignumber . toString ( ) string

Returns the value of bignumber as a base-10 string.

-
bignumber . toHexString ( ) string< DataHexstring >

Returns the value of bignumber as a base-16, 0x-prefixed DataHexstring.

-

Inspection

+
number

A number that is within the safe range for JavaScript numbers.

-
ethers . BigNumnber . isBigNumber ( object ) boolean

Returns true if and only if the object is a BigNumber object.

-

Examples

+
BigInt

A JavaScript BigInt object, on environments that support BigInt.

-
Skipping JavaScript Evaluation.
+

Creating Instances

The constructor of BigNumber cannot be called directly. Instead, Use the static BigNumber.from.

-

Notes

-

This section is a for a couple of questions that come up frequently.

-

Why can't I just use numbers?

-

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 1018 wei in a single ether.

JavaScript uses IEEE 754 double-precision binary floating point 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:

-
Skipping JavaScript Evaluation.
-

To remedy this, all numbers (which can be large) are stored and manipulated as Big Numbers.

The functions parseEther( etherString ) and formatEther( wei ) 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.

-

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.

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 BN . js 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.

-

Why BN.js??

-

The reason why BN . js is used internally as the big number is because that is the library used by 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.

-

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.

\ No newline at end of file +
ethers.BigNumber.from( aBigNumberish ) BigNumber

Returns an instance of a BigNumber for aBigNumberish.

+ +

Examples:

+
// From a decimal string... +BigNumber.from("42") +//! + +// From a HexString... +BigNumber.from("0x2a") +//! + +// From a negative HexString... +BigNumber.from("-0x2a") +//! + +// From an Array (or Uint8Array)... +BigNumber.from([ 42 ]) +//! + +// From an existing BigNumber... +let one1 = constants.One; +let one2 = BigNumber.from(one1) + +one2 +//! + +// ...which returns the same instance +one1 === one2 +//! + +// From a (safe) number... +BigNumber.from(42) +//! + +// From a ES2015 BigInt... (only on platforms with BigInt support) +BigNumber.from(42n) +//! + +// Numbers outside the safe range fail: +BigNumber.from(Number.MAX_SAFE_INTEGER); +//! error

Methods

The BigNumber class is immutable, so no operations can change the value it represents.

+ +

Math Operations

+
BigNumber.add( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber + otherValue.

+ +
BigNumber.sub( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber - otherValue.

+ +
BigNumber.mul( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber × otherValue.

+ +
BigNumber.div( divisor ) BigNumber

Returns a BigNumber with the value of BigNumber ÷ divisor.

+ +
BigNumber.mod( divisor ) BigNumber

Returns a BigNumber with the value of the remainder of BigNumber ÷ divisor.

+ +
BigNumber.pow( exponent ) BigNumber

Returns a BigNumber with the value of BigNumber to the power of exponent.

+ +
BigNumber.abs( ) BigNumber

Returns a BigNumber with the absolute value of BigNumber.

+ +
BigNumber.mask( bitcount ) BigNumber

Returns a BigNumber with the value of BigNumber with bits beyond the bitcount least significant bits set to zero.

+ +

Two's Compliment

Two's Complicment 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.

+ +
BigNumber.fromTwos( bitwidth ) BigNumber

Returns a BigNumber with the value of BigNumber converted from twos-compliment with bitwidth.

+ +
BigNumber.toTwos( bitwidth ) BigNumber

Returns a BigNumber with the value of BigNumber converted to twos-compliment with bitwidth.

+ +

Comparison and Equivalence

+
BigNumber.eq( otherValue ) boolean

Returns true if and only if the value of BigNumber is equal to otherValue.

+ +
BigNumber.lt( otherValue ) boolean

Returns true if and only if the value of BigNumber < otherValue.

+ +
BigNumber.lte( otherValue ) boolean

Returns true if and only if the value of BigNumber otherValue.

+ +
BigNumber.gt( otherValue ) boolean

Returns true if and only if the value of BigNumber > otherValue.

+ +
BigNumber.gte( otherValue ) boolean

Returns true if and only if the value of BigNumber otherValue.

+ +
BigNumber.isZero( ) boolean

Returns true if and only if the value of BigNumber is zero.

+ +

Conversion

+
BigNumber.toNumber( ) number

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.

+ +
BigNumber.toString( ) string

Returns the value of BigNumber as a base-10 string.

+ +
BigNumber.toHexString( ) string< DataHexString >

Returns the value of BigNumber as a base-16, 0x-prefixed DataHexString.

+ +

Inspection

+
ethers.BigNumnber.isBigNumber( object ) boolean

Returns true if and only if the object is a BigNumber object.

+ +

Examples

+
let a = BigNumber.from(42); +let b = BigNumber.from("91"); + +a.mul(b); +//!

Notes

This section is a for a couple of questions that come up frequently.

+ +

Why can't I just use numbers?

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 1018 wei in a single ether.

+ +

JavaScript uses IEEE 754 double-precision binary floating point 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:

+ +
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER) +//!

To remedy this, all numbers (which can be large) are stored and manipulated as Big Numbers.

+ +

The functions parseEther( etherString ) and formatEther( wei ) 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.

+ +

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.

+ +

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 BN.js 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.

+ +

Why BN.js??

The reason why BN.js is used internally as the big number is because that is the library used by 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.

+ +

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.

+ + + + + +
+ + + diff --git a/docs/api/utils/bytes/README.md b/docs/api/utils/bytes/README.md index 3c23d709c..5d3108a8b 100644 --- a/docs/api/utils/bytes/README.md +++ b/docs/api/utils/bytes/README.md @@ -7,257 +7,173 @@ Documentation: [html](https://docs-beta.ethers.io/) Byte Manipulation ================= - -Tra la la... - - Types ----- - - ### Bytes - -A **Bytes** is any object which is an -[Array](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) or [TypedArray](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) with -each value in the valid byte range (i.e. between 0 and 255 inclusive), -or is an Object with a `length` property where each indexed property -is in the valid byte range. - - ### BytesLike +### DataHexString -A **BytesLike** can be either a [Bytes](./) or a [DataHexstring](./). - - -### DataHexstring - - -A **DataHexstring** is identical to a [Hexstring](./) except that it has -an even number of nibbles, and therefore is a valid representation of -binary data as a string. - - -### Hexstring - - -A **Hexstring** is a string which has a `0x` prefix followed by any -number of nibbles (i.e. case-insensitive hexidecumal characters, `0-9` and `a-f`). - +### HexString ### Signature - - - -* **r** and **s** --- The x co-ordinate of **r** and the **s** value of the signature -* **v** --- The parity of the y co-ordinate of **r** -* **_vs** --- The [compact representation](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-2098) of the **s** and **v** -* **recoveryParam** --- The normalized (i.e. 0 or 1) value of **v** - - -### Flat-Format Signature - - -A **Flat-Format Signature** is a common Signature format where -the r, s and v are concanenated into a 65 byte (130 nibble) -[DataHexstring](./). - +### Raw Signature ### SignatureLike - -A **SignatureLike** is similar to a [Signature](./), except redundant properties -may be omitted or it may be a [Flat-Format Signature](./). - -For example, if **_vs** is specified, **s** and **v** may be omitted. Likewise, -if **recoveryParam** is provided, **v** may be omitted (as in these cases the -missing values can be computed). - - Inspection ---------- +#### *ethers* . *utils* . **isBytes**( object ) => *boolean* + +Returns true if and only if *object* is a valid [Bytes](/api/utils/bytes/#Bytes). -#### *ethers* . *utils* . **isBytes** ( object ) **=>** *boolean* +#### *ethers* . *utils* . **isBytesLike**( object ) => *boolean* -Returns true if and only if *object* is a valid [Bytes](./). +Returns true if and only if *object* is a [Bytes](/api/utils/bytes/#Bytes) or [DataHexString](/api/utils/bytes/#DataHexString). +#### *ethers* . *utils* . **isHexString**( object , [ length ] ) => *boolean* - -#### *ethers* . *utils* . **isBytesLike** ( object ) **=>** *boolean* - -Returns true if and only if *object* is a [Bytes](./) or [DataHexstring](./). - - - - -#### *ethers* . *utils* . **isHexString** ( object , [ length ] ) **=>** *boolean* - -Returns true if and only if *object* is a valid hex string. -If *length* is specified and *object* is not a valid [DataHexstring](./) of -*length* bytes, an InvalidArgument error is thrown. - - +Returns true if and only if *object* is a valid hex string. If *length* is specified and *object* is not a valid [DataHexString](/api/utils/bytes/#DataHexString) of *length* bytes, an InvalidArgument error is thrown. Converting between Arrays and Hexstrings ---------------------------------------- +#### *ethers* . *utils* . **arrayify**( DataHexStringOrArrayish [ , options ] ) => *Uint8Array* + +Converts *DataHexStringOrArrayish* to a Uint8Array. -#### *ethers* . *utils* . **arrayify** ( datahexstringOrArrayish [ , options ] ) **=>** *Uint8Array* +#### *ethers* . *utils* . **hexlify**( hexstringOrArrayish ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* -Converts *datahexstringOrArrayish* to a Uint8Array. +Converts *hexstringOrArrayish* to a [DataHexString](/api/utils/bytes/#DataHexString). +#### *ethers* . *utils* . **hexValue**( aBigNumberish ) => *string< [HexString](/api/utils/bytes/#HexString) >* - -#### *ethers* . *utils* . **hexlify** ( hexstringOrArrayish ) **=>** *string< [DataHexstring](./) >* - -Converts *hexstringOrArrayish* to a [DataHexstring](./). - - - - -#### *ethers* . *utils* . **hexValue** ( aBigNumberish ) **=>** *string< [Hexstring](./) >* - -Converts *aBigNumberish* to a [Hexstring](./), with no *unnecessary* leading -zeros. - - - - -### Examples - +Converts *aBigNumberish* to a [HexString](/api/utils/bytes/#HexString), with no *unnecessary* leading zeros. ```javascript -Skipping JavaScript Evaluation. +// Convert a hexstring to a Uint8Array +arrayify("0x1234") +//! + +// Convert an Array to a hexstring +hexlify([1, 2, 3, 4]) +//! + +// Convert an Object to a hexstring +hexlify({ length: 2, "0": 1, "1": 2 }) +//! + +// Convert an Array to a hexstring +hexlify([ 1 ]) +//! + +// Convert a number to a stripped hex value +hexValue(1) +//! + +// Convert an Array to a stripped hex value +hexValue([ 1, 2 ]) +//! ``` - - Array Manipulation ------------------ +#### *ethers* . *utils* . **concat**( arrayOfBytesLike ) => *Uint8Array* + +Concatenates all the [BytesLike](/api/utils/bytes/#BytesLike) in *arrayOfBytesLike* into a single Uint8Array. -#### *ethers* . *utils* . **concat** ( arrayOfBytesLike ) **=>** *Uint8Array* - -Concatenates all the [BytesLike](./) in *arrayOfBytesLike* into a single Uint8Array. - - - - -#### *ethers* . *utils* . **stripZeros** ( aBytesLike ) **=>** *Uint8Array* +#### *ethers* . *utils* . **stripZeros**( aBytesLike ) => *Uint8Array* Returns a Uint8Array with all leading `0` bytes of *aBtyesLike* removed. +#### *ethers* . *utils* . **zeroPad**( aBytesLike , length ) => *Uint8Array* +Retutns a Uint8Array of the data in *aBytesLike* with `0` bytes prepended to *length* bytes long. -#### *ethers* . *utils* . **zeroPad** ( aBytesLike , length ) **=>** *Uint8Array* - -Retutns a Uint8Array of the data in *aBytesLike* with `0` bytes prepended to -*length* bytes long. - -If *aBytesLike* is already longer than *length* bytes long, an InvalidArgument -error will be thrown. - - +If *aBytesLike* is already longer than *length* bytes long, an InvalidArgument error will be thrown. Hexstring Manipulation ---------------------- +#### *ethers* . *utils* . **hexConcat**( arrayOfBytesLike ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* + +Concatenates all the [BytesLike](/api/utils/bytes/#BytesLike) in *arrayOfBytesLike* into a single [DataHexString](/api/utils/bytes/#DataHexString) -#### *ethers* . *utils* . **hexConcat** ( arrayOfBytesLike ) **=>** *string< [DataHexstring](./) >* - -Concatenates all the [BytesLike](./) in *arrayOfBytesLike* into a single [DataHexstring](./) - - - - -#### *ethers* . *utils* . **hexDataLength** ( aBytesLike ) **=>** *string< [DataHexstring](./) >* +#### *ethers* . *utils* . **hexDataLength**( aBytesLike ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* Returns the length (in bytes) of *aBytesLike*. +#### *ethers* . *utils* . **hexDataSlice**( aBytesLike , offset [ , endOffset ] ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* + +Returns a [DataHexString](/api/utils/bytes/#DataHexString) representation of a slice of *aBytesLike*, from *offset* (in bytes) to *endOffset* (in bytes). If *endOffset* is omitted, the length of *aBytesLike* is used. -#### *ethers* . *utils* . **hexDataSlice** ( aBytesLike , offset [ , endOffset ] ) **=>** *string< [DataHexstring](./) >* +#### *ethers* . *utils* . **hexStripZeros**( aBytesLike ) => *string< [HexString](/api/utils/bytes/#HexString) >* -Returns a [DataHexstring](./) representation of a slice of *aBytesLike*, from -*offset* (in bytes) to *endOffset* (in bytes). If *endOffset* is -omitted, the length of *aBytesLike* is used. +Returns a [HexString](/api/utils/bytes/#HexString) representation of *aBytesLike* with all leading zeros removed. +#### *ethers* . *utils* . **hexZeroPad**( aBytesLike , length ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* +Returns a [DataHexString](/api/utils/bytes/#DataHexString) representation of *aBytesLike* padded to *length* bytes. -#### *ethers* . *utils* . **hexStripZeros** ( aBytesLike ) **=>** *string< [Hexstring](./) >* - -Returns a [Hexstring](./) representation of *aBytesLike* with all -leading zeros removed. - - - - -#### *ethers* . *utils* . **hexZeroPad** ( aBytesLike , length ) **=>** *string< [DataHexstring](./) >* - -Returns a [DataHexstring](./) representation of *aBytesLike* padded to *length* bytes. - -If *aBytesLike* is already longer than *length* bytes long, an InvalidArgument -error will be thrown. - - +If *aBytesLike* is already longer than *length* bytes long, an InvalidArgument error will be thrown. Signature Conversion -------------------- +#### *ethers* . *utils* . **joinSignature**( aSignatureLike ) => *string< [RawSignature](/api/utils/bytes/#signature-raw) >* + +Return the raw-format of *aSignaturelike*, which is 65 bytes (130 nibbles) long, concatenating the **r**, **s** and (normalized) **v** of a Signature. -#### *ethers* . *utils* . **joinSignature** ( aSignatureLike ) **=>** *string< [FlatSignature](./) >* - -Return the flat-format of *aSignaturelike*, which is 65 bytes (130 nibbles) -long, concatenating the **r**, **s** and (normalized) **v** of a Signature. - - - - -#### *ethers* . *utils* . **splitSignature** ( aSignatureLikeOrBytesLike ) **=>** *[Signature](./)* - -Return the full expanded-format of *aSignaturelike* or a flat-format [DataHexstring](./). -Any missing properties will be computed. - +#### *ethers* . *utils* . **splitSignature**( aSignatureLikeOrBytesLike ) => *[Signature](/api/utils/bytes/#Signature)* +Return the full expanded-format of *aSignaturelike* or a raw-format [DataHexString](/api/utils/bytes/#DataHexString). Any missing properties will be computed. Random Bytes ------------ - - -#### *ethers* . *utils* . **randomBytes** ( length ) **=>** *Uint8Array* +#### *ethers* . *utils* . **randomBytes**( length ) => *Uint8Array* Return a new Uint8Array of *length* random bytes. +#### *ethers* . *utils* . **shuffled**( array ) => *Array< any >* + +Return a copy of *array* shuffled using [Fisher-Yates Shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). -#### *ethers* . *utils* . **shuffled** ( array ) **=>** *Array< any >* +```javascript +utils.randomBytes(8) +//! -Return a copy of *array* shuffled using [Fisher-Yates Shuffle](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Fisher-Yates_shuffle). +const data = [ 1, 2, 3, 4, 5, 6, 7 ]; +// Returns a new Array +utils.shuffled(data); +//! +// The Original is unscathed... +data +//! +``` - - ------ -**Content Hash:** 8736c2f7c64aa2a0ba9f987036158ef0cecc8110bbc30f88c7365f24809af3fc \ No newline at end of file diff --git a/docs/api/utils/bytes/index.html b/docs/api/utils/bytes/index.html index b6fa9da1b..d41617a29 100644 --- a/docs/api/utils/bytes/index.html +++ b/docs/api/utils/bytes/index.html @@ -1,52 +1,127 @@ -Byte Manipulation

Byte Manipulation

-

Tra la la...

-

Types

+ + + + Byte Manipulation + + + + +
+ -

Bytes

-

A Bytes is any object which is an Array or TypedArray with each value in the valid byte range (i.e. between 0 and 255 inclusive), or is an Object with a length property where each indexed property is in the valid byte range.

-

BytesLike

-

A BytesLike can be either a Bytes or a DataHexstring.

-

DataHexstring

-

A DataHexstring is identical to a Hexstring except that it has an even number of nibbles, and therefore is a valid representation of binary data as a string.

-

Hexstring

-

A Hexstring is a string which has a 0x prefix followed by any number of nibbles (i.e. case-insensitive hexidecumal characters, 0-9 and a-f).

-

Signature

-
  • r and s—The x co-ordinate of r and the s value of the signature
  • v—The parity of the y co-ordinate of r
  • _vs—The compact representation of the s and v
  • recoveryParam—The normalized (i.e. 0 or 1) value of v
-

Flat-Format Signature

-

A Flat-Format Signature is a common Signature format where the r, s and v are concanenated into a 65 byte (130 nibble) DataHexstring.

-

SignatureLike

-

A SignatureLike is similar to a Signature, except redundant properties may be omitted or it may be a Flat-Format Signature.

For example, if _vs is specified, s and v may be omitted. Likewise, if recoveryParam is provided, v may be omitted (as in these cases the missing values can be computed).

-

Inspection

+

Byte Manipulation

Tra la la...

-
ethers . utils . isBytes ( object ) boolean

Returns true if and only if object is a valid Bytes.

-
ethers . utils . isBytesLike ( object ) boolean

Returns true if and only if object is a Bytes or DataHexstring.

-
ethers . utils . isHexString ( object , [ length ] ) boolean

Returns true if and only if object is a valid hex string. If length is specified and object is not a valid DataHexstring of length bytes, an InvalidArgument error is thrown.

-

Converting between Arrays and Hexstrings

+

Types

+

Bytes

A Bytes is any object which is an Array or TypedArray with each value in the valid byte range (i.e. between 0 and 255 inclusive), or is an Object with a length property where each indexed property is in the valid byte range.

-
ethers . utils . arrayify ( datahexstringOrArrayish [ , options ] ) Uint8Array

Converts datahexstringOrArrayish to a Uint8Array.

-
ethers . utils . hexlify ( hexstringOrArrayish ) string< DataHexstring >

Converts hexstringOrArrayish to a DataHexstring.

-
ethers . utils . hexValue ( aBigNumberish ) string< Hexstring >

Converts aBigNumberish to a Hexstring, with no unnecessary leading zeros.

-

Examples

+

BytesLike

A BytesLike can be either a Bytes or a DataHexString.

-
Skipping JavaScript Evaluation.
+

DataHexString

A DataHexstring is identical to a HexString except that it has an even number of nibbles, and therefore is a valid representation of binary data as a string.

-

Array Manipulation

+

HexString

A Hexstring is a string which has a 0x prefix followed by any number of nibbles (i.e. case-insensitive hexidecumal characters, 0-9 and a-f).

-
ethers . utils . concat ( arrayOfBytesLike ) Uint8Array

Concatenates all the BytesLike in arrayOfBytesLike into a single Uint8Array.

-
ethers . utils . stripZeros ( aBytesLike ) Uint8Array

Returns a Uint8Array with all leading 0 bytes of aBtyesLike removed.

-
ethers . utils . zeroPad ( aBytesLike , length ) Uint8Array

Retutns a Uint8Array of the data in aBytesLike with 0 bytes prepended to length bytes long.

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

-

Hexstring Manipulation

+

Signature

  • r and s --- The x co-ordinate of r and the s value of the signature
  • v --- The parity of the y co-ordinate of r
  • _vs --- The compact representation of the s and v
  • recoveryParam --- The normalized (i.e. 0 or 1) value of v

-
ethers . utils . hexConcat ( arrayOfBytesLike ) string< DataHexstring >

Concatenates all the BytesLike in arrayOfBytesLike into a single DataHexstring

-
ethers . utils . hexDataLength ( aBytesLike ) string< DataHexstring >

Returns the length (in bytes) of aBytesLike.

-
ethers . utils . hexDataSlice ( aBytesLike , offset [ , endOffset ] ) string< DataHexstring >

Returns a DataHexstring representation of a slice of aBytesLike, from offset (in bytes) to endOffset (in bytes). If endOffset is omitted, the length of aBytesLike is used.

-
ethers . utils . hexStripZeros ( aBytesLike ) string< Hexstring >

Returns a Hexstring representation of aBytesLike with all leading zeros removed.

-
ethers . utils . hexZeroPad ( aBytesLike , length ) string< DataHexstring >

Returns a DataHexstring representation of aBytesLike padded to length bytes.

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

-

Signature Conversion

+

Raw Signature inherits string<DataHexString<65>>

A Raw Signature is a common Signature format where the r, s and v are concanenated into a 65 byte (130 nibble) DataHexString.

-
ethers . utils . joinSignature ( aSignatureLike ) string< FlatSignature >

Return the flat-format of aSignaturelike, which is 65 bytes (130 nibbles) long, concatenating the r, s and (normalized) v of a Signature.

-
ethers . utils . splitSignature ( aSignatureLikeOrBytesLike ) Signature

Return the full expanded-format of aSignaturelike or a flat-format DataHexstring. Any missing properties will be computed.

-

Random Bytes

+

SignatureLike

A SignatureLike is similar to a Signature, except redundant properties may be omitted or it may be a Raw Signature.

-
ethers . utils . randomBytes ( length ) Uint8Array

Return a new Uint8Array of length random bytes.

-
ethers . utils . shuffled ( array ) Array< any >

Return a copy of array shuffled using Fisher-Yates Shuffle.

\ No newline at end of file +

For example, if _vs is specified, s and v may be omitted. Likewise, if recoveryParam is provided, v may be omitted (as in these cases the missing values can be computed).

+ +

Inspection

+
ethers.utils.isBytes( object ) boolean

Returns true if and only if object is a valid Bytes.

+ +
ethers.utils.isBytesLike( object ) boolean

Returns true if and only if object is a Bytes or DataHexString.

+ +
ethers.utils.isHexString( object , [ length ] ) boolean

Returns true if and only if object is a valid hex string. If length is specified and object is not a valid DataHexString of length bytes, an InvalidArgument error is thrown.

+ +

Converting between Arrays and Hexstrings

+
ethers.utils.arrayify( DataHexStringOrArrayish [ , options ] ) Uint8Array

Converts DataHexStringOrArrayish to a Uint8Array.

+ +
ethers.utils.hexlify( hexstringOrArrayish ) string< DataHexString >

Converts hexstringOrArrayish to a DataHexString.

+ +
ethers.utils.hexValue( aBigNumberish ) string< HexString >

Converts aBigNumberish to a HexString, with no unnecessary leading zeros.

+ +
Examples
// Convert a hexstring to a Uint8Array +arrayify("0x1234") +//! + +// Convert an Array to a hexstring +hexlify([1, 2, 3, 4]) +//! + +// Convert an Object to a hexstring +hexlify({ length: 2, "0": 1, "1": 2 }) +//! + +// Convert an Array to a hexstring +hexlify([ 1 ]) +//! + +// Convert a number to a stripped hex value +hexValue(1) +//! + +// Convert an Array to a stripped hex value +hexValue([ 1, 2 ]) +//!

Array Manipulation

+
ethers.utils.concat( arrayOfBytesLike ) Uint8Array

Concatenates all the BytesLike in arrayOfBytesLike into a single Uint8Array.

+ +
ethers.utils.stripZeros( aBytesLike ) Uint8Array

Returns a Uint8Array with all leading 0 bytes of aBtyesLike removed.

+ +
ethers.utils.zeroPad( aBytesLike , length ) Uint8Array

Retutns a Uint8Array of the data in aBytesLike with 0 bytes prepended to length bytes long.

+ +

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

+ +

Hexstring Manipulation

+
ethers.utils.hexConcat( arrayOfBytesLike ) string< DataHexString >

Concatenates all the BytesLike in arrayOfBytesLike into a single DataHexString

+ +
ethers.utils.hexDataLength( aBytesLike ) string< DataHexString >

Returns the length (in bytes) of aBytesLike.

+ +
ethers.utils.hexDataSlice( aBytesLike , offset [ , endOffset ] ) string< DataHexString >

Returns a DataHexString representation of a slice of aBytesLike, from offset (in bytes) to endOffset (in bytes). If endOffset is omitted, the length of aBytesLike is used.

+ +
ethers.utils.hexStripZeros( aBytesLike ) string< HexString >

Returns a HexString representation of aBytesLike with all leading zeros removed.

+ +
ethers.utils.hexZeroPad( aBytesLike , length ) string< DataHexString >

Returns a DataHexString representation of aBytesLike padded to length bytes.

+ +

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

+ +

Signature Conversion

+
ethers.utils.joinSignature( aSignatureLike ) string< RawSignature >

Return the raw-format of aSignaturelike, which is 65 bytes (130 nibbles) long, concatenating the r, s and (normalized) v of a Signature.

+ +
ethers.utils.splitSignature( aSignatureLikeOrBytesLike ) Signature

Return the full expanded-format of aSignaturelike or a raw-format DataHexString. Any missing properties will be computed.

+ +

Random Bytes

+
ethers.utils.randomBytes( length ) Uint8Array

Return a new Uint8Array of length random bytes.

+ +
ethers.utils.shuffled( array ) Array< any >

Return a copy of array shuffled using Fisher-Yates Shuffle.

+ +
Examples
utils.randomBytes(8) +//! + +const data = [ 1, 2, 3, 4, 5, 6, 7 ]; + +// Returns a new Array +utils.shuffled(data); +//! + +// The Original is unscathed... +data +//!
+ + + +
+ + + diff --git a/docs/api/utils/constants/README.md b/docs/api/utils/constants/README.md index 782d95527..e3683c52f 100644 --- a/docs/api/utils/constants/README.md +++ b/docs/api/utils/constants/README.md @@ -7,99 +7,57 @@ Documentation: [html](https://docs-beta.ethers.io/) Constants ========= - -The **ethers.contants** Object contains commonly used values. - - -### Importing - - - -```javascript -Skipping JavaScript Evaluation. -``` - - - Bytes ----- - - -#### *ethers* . *constants* . **AddressZero** **=>** *string< [Address](../address) >* +#### *ethers* . *constants* . **AddressZero** => *string< [Address](/api/utils/address/#address) >* The Address Zero, which is 20 bytes (40 nibbles) of zero. - - -#### *ethers* . *constants* . **HashZero** **=>** *string< [DataHexstring](../bytes)< 32 > >* +#### *ethers* . *constants* . **HashZero** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The Hash Zero, which is 32 bytes (64 nibbles) of zero. - - Strings ------- +#### *ethers* . *constants* . **EtherSymbol** => *string* - -#### *ethers* . *constants* . **EtherSymbol** **=>** *string* - -The Ether symbol, **Ξ**. - - +The Ether symbol, **Xi**. BigNumber --------- - - -#### *ethers* . *constants* . **NegativeOne** **=>** *[BigNumber](../bignumber)* +#### *ethers* . *constants* . **NegativeOne** => *[BigNumber](/api/utils/bignumber/)* The BigNumber value representing `"-1"`. - - -#### *ethers* . *constants* . **Zero** **=>** *[BigNumber](../bignumber)* +#### *ethers* . *constants* . **Zero** => *[BigNumber](/api/utils/bignumber/)* The BigNumber value representing `"0"`. - - -#### *ethers* . *constants* . **One** **=>** *[BigNumber](../bignumber)* +#### *ethers* . *constants* . **One** => *[BigNumber](/api/utils/bignumber/)* The BigNumber value representing `"1"`. - - -#### *ethers* . *constants* . **Two** **=>** *[BigNumber](../bignumber)* +#### *ethers* . *constants* . **Two** => *[BigNumber](/api/utils/bignumber/)* The BigNumber value representing `"2"`. +#### *ethers* . *constants* . **WeiPerEther** => *[BigNumber](/api/utils/bignumber/)* + +The BigNumber value representing `"1000000000000000000"`, which is the number of Wei per Ether. -#### *ethers* . *constants* . **WeiPerEther** **=>** *[BigNumber](../bignumber)* - -The BigNumber value representing `"1000000000000000000"`, which is the -number of Wei per Ether. - - - - -#### *ethers* . *constants* . **MaxUint256** **=>** *[BigNumber](../bignumber)* +#### *ethers* . *constants* . **MaxUint256** => *[BigNumber](/api/utils/bignumber/)* The BigNumber value representing the maximum `uint256` value. - - - ------ -**Content Hash:** 2c8c7edeece6a1d7d8c07e666c59ffeec57423a4b908bed03e62d47b6ae758fb \ No newline at end of file diff --git a/docs/api/utils/constants/index.html b/docs/api/utils/constants/index.html index 89c44c2db..148a207f2 100644 --- a/docs/api/utils/constants/index.html +++ b/docs/api/utils/constants/index.html @@ -1,21 +1,52 @@ -Constants

Constants

-

The ethers.contants Object contains commonly used values.

-

Importing

+ + + + Constants + + + + +
+ -
Skipping JavaScript Evaluation.
+

Constants

The ethers.contants Object contains commonly used values.

-

Bytes

+

Bytes

+
ethers.constants.AddressZero string< Address >

The Address Zero, which is 20 bytes (40 nibbles) of zero.

-
ethers . constants . AddressZero string< Address >

The Address Zero, which is 20 bytes (40 nibbles) of zero.

-
ethers . constants . HashZero string< DataHexstring< 32 > >

The Hash Zero, which is 32 bytes (64 nibbles) of zero.

-

Strings

+
ethers.constants.HashZero string< DataHexString< 32 > >

The Hash Zero, which is 32 bytes (64 nibbles) of zero.

-
ethers . constants . EtherSymbol string

The Ether symbol, Ξ.

-

BigNumber

+

Strings

+
ethers.constants.EtherSymbol string

The Ether symbol, Ξ.

-
ethers . constants . NegativeOne BigNumber

The BigNumber value representing "-1".

-
ethers . constants . Zero BigNumber

The BigNumber value representing "0".

-
ethers . constants . One BigNumber

The BigNumber value representing "1".

-
ethers . constants . Two BigNumber

The BigNumber value representing "2".

-
ethers . constants . WeiPerEther BigNumber

The BigNumber value representing "1000000000000000000", which is the number of Wei per Ether.

-
ethers . constants . MaxUint256 BigNumber

The BigNumber value representing the maximum uint256 value.

\ No newline at end of file +

BigNumber

+
ethers.constants.NegativeOne BigNumber

The BigNumber value representing "-1".

+ +
ethers.constants.Zero BigNumber

The BigNumber value representing "0".

+ +
ethers.constants.One BigNumber

The BigNumber value representing "1".

+ +
ethers.constants.Two BigNumber

The BigNumber value representing "2".

+ +
ethers.constants.WeiPerEther BigNumber

The BigNumber value representing "1000000000000000000", which is the number of Wei per Ether.

+ +
ethers.constants.MaxUint256 BigNumber

The BigNumber value representing the maximum uint256 value.

+ +
+ + + +
+ + + diff --git a/docs/api/utils/display-logic/README.md b/docs/api/utils/display-logic/README.md index 369434108..1fd0fd9d1 100644 --- a/docs/api/utils/display-logic/README.md +++ b/docs/api/utils/display-logic/README.md @@ -7,106 +7,46 @@ Documentation: [html](https://docs-beta.ethers.io/) Display Logic and Input ======================= - -When creating an Application, it is useful to convert between -user-friendly strings (usually displaying **ether**) and the -machine-readable values that contracts and maths depend on -(usually in **wei**). - -For example, a Wallet may specify the balance in ether, and -gas prices in gwei for the User Interface, but when sending -a transaction, both must be specified in wei. - -The [parseUnits](./) will parse a string representing -ether, such as `1.1` into a [BigNumber](../bignumber) in wei, and is -useful when a user types in a value, such as sending 1.1 ether. - -The [formatUnits](./) will format a [BigNumberish](../bignumber) -into a string, which is useful when displaying a balance. - - Units ----- - - ### Decimal Count - -The *unit* specified may be an integer, which indicates how -many decimal place the unit has. For example, 1 ether has 18 decimal -places for wei, and if this library were used with Bitcoin, 1 BTC -has 8 decimal places for satoshis. - - ### Named Units -In addition to specifying *unit* as a number of decimals, there -are several common units, which can be passed in as a string: -* **wei** --- 0 -* **kwei** --- 3 -* **mwei** --- 6 -* **gwei** --- 9 -* **szabo** --- 12 -* **finney** --- 15 -* **ether** --- 18 - - Functions --------- - - ### Formatting - - -#### *ethers* . *utils* . **commify** ( value ) **=>** *string* +#### *ethers* . *utils* . **commify**( value ) => *string* Returns a string with value grouped by 3 digits, separated by `,`. - - ### Conversion +#### *ethers* . *utils* . **formatUnits**( value [ , unit = "ether" ] ) => *string* + +Returns a string representation of *value* formatted with *unit* digits (if it is a number) or to the unit specified (if a string). -#### *ethers* . *utils* . **formatUnits** ( value [ , unit="ether" ] ) **=>** *string* - -Returns a string representation of *value* formatted with *unit* -digits (if it is a number) or to the unit specified (if a string). - - - - -#### *ethers* . *utils* . **formatEther** ( value ) **=>** *string* +#### *ethers* . *utils* . **formatEther**( value ) => *string* The equivalent to calling `formatUnits(value, "ether")`. +#### *ethers* . *utils* . **parseUnits**( value [ , unit = "ether" ] ) => *[BigNumber](/api/utils/bignumber/)* + +Returns a [BigNumber](/api/utils/bignumber/) representation of *value*, parsed with *unit* digits (if it is a number) or from the unit specified (if a string). -#### *ethers* . *utils* . **parseUnits** ( value [ , unit="ether" ] ) **=>** *[BigNumber](../bignumber)* - -Returns a [BigNumber](../bignumber) representation of *value*, parsed with -*unit* digits (if it is a number) or from the unit specified (if -a string). - - - - -#### *ethers* . *utils* . **parseEther** ( value ) **=>** *[BigNumber](../bignumber)* +#### *ethers* . *utils* . **parseEther**( value ) => *[BigNumber](/api/utils/bignumber/)* The equivalent to calling `parseUnits(value, "ether")`. - - - ------ -**Content Hash:** dc749d05e2f4c378032440c4cdc06b705479b15b2582dca2c838021861f86a03 \ No newline at end of file diff --git a/docs/api/utils/display-logic/index.html b/docs/api/utils/display-logic/index.html index 38fd96ac6..3f0972a1c 100644 --- a/docs/api/utils/display-logic/index.html +++ b/docs/api/utils/display-logic/index.html @@ -1,19 +1,59 @@ -Display Logic and Input

Display Logic and Input

-

When creating an Application, it is useful to convert between user-friendly strings (usually displaying ether) and the machine-readable values that contracts and maths depend on (usually in wei).

For example, a Wallet may specify the balance in ether, and gas prices in gwei for the User Interface, but when sending a transaction, both must be specified in wei.

The parseUnits will parse a string representing ether, such as 1.1 into a BigNumber in wei, and is useful when a user types in a value, such as sending 1.1 ether.

The formatUnits will format a BigNumberish into a string, which is useful when displaying a balance.

-

Units

+ + + + Display Logic and Input + + + + +
+ -

Decimal Count

-

The unit specified may be an integer, which indicates how many decimal place the unit has. For example, 1 ether has 18 decimal places for wei, and if this library were used with Bitcoin, 1 BTC has 8 decimal places for satoshis.

-

Named Units

-

In addition to specifying unit as a number of decimals, there are several common units, which can be passed in as a string:

  • wei—0
  • kwei—3
  • mwei—6
  • gwei—9
  • szabo—12
  • finney—15
  • ether—18
-

Functions

+

Display Logic and Input

When creating an Application, it is useful to convert between user-friendly strings (usually displaying ether) and the machine-readable values that contracts and maths depend on (usually in wei).

-

Formatting

+

For example, a Wallet may specify the balance in ether, and gas prices in gwei for the User Interface, but when sending a transaction, both must be specified in wei.

-
ethers . utils . commify ( value ) string

Returns a string with value grouped by 3 digits, separated by ,.

-

Conversion

+

The parseUnits will parse a string representing ether, such as 1.1 into a BigNumber in wei, and is useful when a user types in a value, such as sending 1.1 ether.

-
ethers . utils . formatUnits ( value [ , unit = "ether" ] ) string

Returns a string representation of value formatted with unit digits (if it is a number) or to the unit specified (if a string).

-
ethers . utils . formatEther ( value ) string

The equivalent to calling formatUnits(value, "ether").

-
ethers . utils . parseUnits ( value [ , unit = "ether" ] ) BigNumber

Returns a BigNumber representation of value, parsed with unit digits (if it is a number) or from the unit specified (if a string).

-
ethers . utils . parseEther ( value ) BigNumber

The equivalent to calling parseUnits(value, "ether").

\ No newline at end of file +

The formatUnits will format a BigNumberish into a string, which is useful when displaying a balance.

+ +

Units

+

Decimal Count

A Unit can be specified as an number, which indicates the number of decimal places that should be used.

+ +

Examples:

+ +

  • 1 ether in wei, has 18 decimal places (i.e. 1 ether represents 1018 wei)
  • 1 bitcoin in Satoshi, has 8 decimal places (i.e. 1 bitcoin represents 108 satoshi)

+ +

Named Units

There are also several common Named Units, in which case their name (as a string) may be used.

+ +
NameDecimals 
wei0 
kwei3 
mwei6 
gwei9 
szabo12 
finney15 
ether18 

Functions

+

Formatting

+
ethers.utils.commify( value ) string

Returns a string with value grouped by 3 digits, separated by ,.

+ +

Conversion

+
ethers.utils.formatUnits( value [ , unit = "ether" ] ) string

Returns a string representation of value formatted with unit digits (if it is a number) or to the unit specified (if a string).

+ +
ethers.utils.formatEther( value ) string

The equivalent to calling formatUnits(value, "ether").

+ +
ethers.utils.parseUnits( value [ , unit = "ether" ] ) BigNumber

Returns a BigNumber representation of value, parsed with unit digits (if it is a number) or from the unit specified (if a string).

+ +
ethers.utils.parseEther( value ) BigNumber

The equivalent to calling parseUnits(value, "ether").

+ +
+ + + +
+ + + diff --git a/docs/api/utils/encoding/README.md b/docs/api/utils/encoding/README.md index 839219010..187effbba 100644 --- a/docs/api/utils/encoding/README.md +++ b/docs/api/utils/encoding/README.md @@ -7,96 +7,56 @@ Documentation: [html](https://docs-beta.ethers.io/) Encoding Utilities ================== - - Base58 ------ +#### *ethers* . *utils* . *base58* . **decode**( textData ) => *Uin8Array* + +Return a typed Uint8Array representation of *textData* decoded using base-58 encoding. -#### *ethers* . *utils* . *base58* . **decode** ( textData ) **=>** *Uin8Array* - -Return a typed Uint8Array representation of *textData* decoded using -base-58 encoding. - - - - -#### *ethers* . *utils* . *base58* . **encode** ( aBytesLike ) **=>** *string* +#### *ethers* . *utils* . *base58* . **encode**( aBytesLike ) => *string* Return *aBytesLike* encoded as a string using the base-58 encoding. - - Base64 ------ +#### *ethers* . *utils* . *base64* . **decode**( textData ) => *Uin8Array* + +Return a typed Uint8Array representation of *textData* decoded using base-64 encoding. -#### *ethers* . *utils* . *base64* . **decode** ( textData ) **=>** *Uin8Array* - -Return a typed Uint8Array representation of *textData* decoded using -base-64 encoding. - - - - -#### *ethers* . *utils* . *base64* . **encode** ( aBytesLike ) **=>** *string* +#### *ethers* . *utils* . *base64* . **encode**( aBytesLike ) => *string* Return *aBytesLike* encoded as a string using the base-64 encoding. - - Recursive-Length Prefix ----------------------- - -The [Recursive Length Prefix](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethereum/wiki/wiki/RLP) encoding is used throughout Ethereum to serialize nested -structures of Arrays and data. - - -#### *ethers* . *utils* . *RLP* . **encode** ( dataObject ) **=>** *string< [DataHexstring](../bytes) >* +#### *ethers* . *utils* . *RLP* . **encode**( dataObject ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* Encode a structured Data Object into its RLP-encoded representation. -Each Data component may be an valid [BytesLike](../bytes). +Each Data component may be an valid [BytesLike](/api/utils/bytes/#BytesLike). - - -#### *ethers* . *utils* . *RLP* . **decode** ( aBytesLike ) **=>** *[DataObject](./)* +#### *ethers* . *utils* . *RLP* . **decode**( aBytesLike ) => *[DataObject](/api/utils/encoding/#rlp--dataobject)* Decode an RLP-encoded *aBytesLike* into its structured Data Object. -All Data components will be returned as a [DataHexstring](../bytes). - - +All Data components will be returned as a [DataHexString](/api/utils/bytes/#DataHexString). ### Data Object - -A **Data Object** is a recursive structure which is used to serialize many -internal structures in Ethereum. Each **Data Object** can either be: - - - -* Binary Data -* An Array of **Data Objects** (i.e. this recursively includes Nesting) - - #### **Examples** - - -* `"0x1234"` -* `[ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]` +- `"0x1234"` +- `[ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]` - ------ -**Content Hash:** ebb4f7f25cb19e1ca1f2b2fa0a73140ec30365c55a2ff6b15c3637b5ef58ff06 \ No newline at end of file diff --git a/docs/api/utils/encoding/index.html b/docs/api/utils/encoding/index.html index 40e78fbc1..49bc1d546 100644 --- a/docs/api/utils/encoding/index.html +++ b/docs/api/utils/encoding/index.html @@ -1,17 +1,56 @@ -Encoding Utilities

Encoding Utilities

+ + + + Encoding Utilities + + + + +
+ -

Base58

+

Encoding Utilities

+

Base58

+
ethers.utils.base58.decode( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-58 encoding.

-
ethers . utils . base58 . decode ( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-58 encoding.

-
ethers . utils . base58 . encode ( aBytesLike ) string

Return aBytesLike encoded as a string using the base-58 encoding.

-

Base64

+
ethers.utils.base58.encode( aBytesLike ) string

Return aBytesLike encoded as a string using the base-58 encoding.

-
ethers . utils . base64 . decode ( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-64 encoding.

-
ethers . utils . base64 . encode ( aBytesLike ) string

Return aBytesLike encoded as a string using the base-64 encoding.

-

Recursive-Length Prefix

-

The Recursive Length Prefix encoding is used throughout Ethereum to serialize nested structures of Arrays and data.

-
ethers . utils . RLP . encode ( dataObject ) string< DataHexstring >

Encode a structured Data Object into its RLP-encoded representation.

Each Data component may be an valid BytesLike.

-
ethers . utils . RLP . decode ( aBytesLike ) DataObject

Decode an RLP-encoded aBytesLike into its structured Data Object.

All Data components will be returned as a DataHexstring.

-

Data Object

-

A Data Object is a recursive structure which is used to serialize many internal structures in Ethereum. Each Data Object can either be:

  • Binary Data
  • An Array of Data Objects (i.e. this recursively includes Nesting)
-
Examples
  • "0x1234"
  • [ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]
\ No newline at end of file +

Base64

+
ethers.utils.base64.decode( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-64 encoding.

+ +
ethers.utils.base64.encode( aBytesLike ) string

Return aBytesLike encoded as a string using the base-64 encoding.

+ +

Recursive-Length Prefix

The Recursive Length Prefix encoding is used throughout Ethereum to serialize nested structures of Arrays and data.

+ +
ethers.utils.RLP.encode( dataObject ) string< DataHexString >

Encode a structured Data Object into its RLP-encoded representation.

+ +

Each Data component may be an valid BytesLike.

+ +
ethers.utils.RLP.decode( aBytesLike ) DataObject

Decode an RLP-encoded aBytesLike into its structured Data Object.

+ +

All Data components will be returned as a DataHexString.

+ +

Data Object

A Data Object is a recursive structure which is used to serialize many internal structures in Ethereum. Each Data Object can either be:

+ +

  • Binary Data
  • An Array of Data Objects (i.e. this recursively includes Nesting)

+ +
Examples

  • "0x1234"
  • [ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]

+ +
+ + + +
+ + + diff --git a/docs/api/utils/fixednumber/README.md b/docs/api/utils/fixednumber/README.md index 7c0967539..f36c5c620 100644 --- a/docs/api/utils/fixednumber/README.md +++ b/docs/api/utils/fixednumber/README.md @@ -7,227 +7,128 @@ Documentation: [html](https://docs-beta.ethers.io/) FixedNumber =========== - -A **FixedNumber** is a fixed-width (in bits) number with an internal -base-10 divisor, which allows it to represent a decimal fractional -component. - - Creating Instances ------------------ - -The FixedNumber constructor cannot be called directly. There are several -static methods for creating a FixedNumber. - - -#### *FixedNumber* . **from** ( value [ , format="fixed" ] ) **=>** *[FixedNumber](./)* +#### *FixedNumber* . **from**( value [ , format = "fixed" ] ) => *[FixedNumber](/api/utils/fixednumber/)* Returns an instance of a **FixedNumber** for *value* as a *format*. - - -#### *FixedNumber* . **fromBytes** ( aBytesLike [ , format="fixed" ] ) **=>** *[FixedNumber](./)* +#### *FixedNumber* . **fromBytes**( aBytesLike [ , format = "fixed" ] ) => *[FixedNumber](/api/utils/fixednumber/)* Returns an instance of a **FixedNumber** for *value* as a *format*. +#### *FixedNumber* . **fromString**( value [ , format = "fixed" ] ) => *[FixedNumber](/api/utils/fixednumber/)* + +Returns an instance of a **FixedNumber** for *value* as a *format*. The *value* must not contain more decimals than the *format* permits. -#### *FixedNumber* . **fromString** ( value [ , format="fixed" ] ) **=>** *[FixedNumber](./)* - -Returns an instance of a **FixedNumber** for *value* as a *format*. The *value* must -not contain more decimals than the *format* permits. - - - - -#### *FixedNumber* . **fromValue** ( value [ , decimals=0 [ , format="fixed" ] ] ) **=>** *[FixedNumber](./)* +#### *FixedNumber* . **fromValue**( value [ , decimals = 0 [ , format = "fixed" ] ] ) => *[FixedNumber](/api/utils/fixednumber/)* Returns an instance of a **FixedNumber** for *value* with *decimals* as a *format*. - - Properties ---------- - - #### *fixednumber* . **format** -The [FixedFormat](./) of *fixednumber*. - - +The [FixedFormat](/api/utils/fixednumber/#FixedFormat) of *fixednumber*. Methods ------- - - ### Math Operations - - -#### *fixednumber* . **addUnsafe** ( otherValue ) **=>** *[FixedNumber](./)* +#### *fixednumber* . **addUnsafe**( otherValue ) => *[FixedNumber](/api/utils/fixednumber/)* Returns a new FixedNumber with the value of *fixedvalue* **+** *otherValue*. +#### *fixednumber* . **subUnsafe**( otherValue ) => *[FixedNumber](/api/utils/fixednumber/)* + +Returns a new FixedNumber with the value of *fixedvalue* **-** *otherValue*. -#### *fixednumber* . **subUnsafe** ( otherValue ) **=>** *[FixedNumber](./)* +#### *fixednumber* . **mulUnsafe**( otherValue ) => *[FixedNumber](/api/utils/fixednumber/)* -Returns a new FixedNumber with the value of *fixedvalue* **–** *otherValue*. +Returns a new FixedNumber with the value of *fixedvalue* **\*** *otherValue*. +#### *fixednumber* . **divUnsafe**( otherValue ) => *[FixedNumber](/api/utils/fixednumber/)* + +Returns a new FixedNumber with the value of *fixedvalue* **/** *otherValue*. -#### *fixednumber* . **mulUnsafe** ( otherValue ) **=>** *[FixedNumber](./)* - -Returns a new FixedNumber with the value of *fixedvalue* **×** *otherValue*. - - - - -#### *fixednumber* . **divUnsafe** ( otherValue ) **=>** *[FixedNumber](./)* - -Returns a new FixedNumber with the value of *fixedvalue* **÷** *otherValue*. - - - - -#### *fixednumber* . **round** ( [ decimals=0 ] ) **=>** *[FixedNumber](./)* +#### *fixednumber* . **round**( [ decimals = 0 ] ) => *[FixedNumber](/api/utils/fixednumber/)* Returns a new FixedNumber with the value of *fixedvalue* rounded to *decimals*. - - ### Conversion - - -#### *fixednumber* . **toFormat** ( format ) **=>** *[FixedNumber](./)* +#### *fixednumber* . **toFormat**( format ) => *[FixedNumber](/api/utils/fixednumber/)* Returns a new FixedNumber with the value of *fixedvalue* with *format*. +#### *fixednumber* . **toHexString**( ) => *string* + +Returns a [HexString](/api/utils/bytes/#HexString) representation of *fixednumber*. -#### *fixednumber* . **toHexString** ( ) **=>** *string* - -Returns a [Hexstring](../bytes) representation of *fixednumber*. - - - - -#### *fixednumber* . **toString** ( ) **=>** *string* +#### *fixednumber* . **toString**( ) => *string* Returns a string representation of *fixednumber*. +#### *fixednumber* . **toUnsafeFloat**( ) => *float* - -#### *fixednumber* . **toUnsafeFloat** ( ) **=>** *float* - -Returns a floating-point JavaScript number value of *fixednumber*. -Due to rounding in JavaScript numbers, the value is only approximate. - - +Returns a floating-point JavaScript number value of *fixednumber*. Due to rounding in JavaScript numbers, the value is only approximate. ### Inspection - - -#### *FixedNumber* . **isFixedNumber** ( value ) **=>** *boolean* +#### *FixedNumber* . **isFixedNumber**( value ) => *boolean* Returns true if and only if *value* is a **FixedNumber**. - - FixedFormat ----------- - -A **FixedFormat** is a simple object which represents a decimal -(base-10) Fixed-Point data representation. Usually using this -class directly is uneccessary, as passing in a [Format Strings](./) -directly into the [FixedNumber](./) will automatically create this. - - ### Format Strings - -A format string is composed of three components, including signed-ness, -bit-width and number of decimals. - -A signed format string begins with `fixed`, which an unsigned format -string begins with `ufixed`, followed by the width (in bits) and the -number of decimals. - -The width must be conguent to 0 mod 8 (i.e. `(width % 8) == 0`) and no -larger than 256 bits and the number of decimals must be no larger than 80. - -For example: - - - -* **fixed128x18** is signed, 128 bits wide and has 18 decimals; this is useful for most purposes -* **fixed32x0** is signed, 32 bits wide and has 0 decimals; this would be the same as a ``int32_t` in C -* **ufixed32x0** is unsigned, 32 bits wide and has 0 decimals; this would be the same as a ``uint32_t` in C -* **fixed** is shorthand for ``fixed128x18` -* **ufixed** is shorthand for ``ufixed128x18` - - ### Creating Instances +#### *FixedFormat* . **from**( value = "fixed128x18" ) => *[FixedFormat](/api/utils/fixednumber/#FixedFormat)* - -#### *FixedFormat* . **from** ( value="fixed128x18" ) **=>** *[FixedFormat](./)* - -Returns a new instance of a **FixedFormat** defined by *value*. Any valid [Format Strings](./) -may be passed in as well as any object which has any of `signed`, `width` and `decimals` -defined, including a [FixedFormat](./) object. - - +Returns a new instance of a **FixedFormat** defined by *value*. Any valid [Format Strings](/api/utils/fixednumber/#FixedFormat--strings) may be passed in as well as any object which has any of `signed`, `width` and `decimals` defined, including a [FixedFormat](/api/utils/fixednumber/#FixedFormat) object. ### Properties - - -#### *fixedFormat* . **signed** **=>** *boolean* +#### *fixedFormat* . **signed** => *boolean* The signed-ness of *fixedFormat*, true if negative values are supported. - - -#### *fixedFormat* . **width** **=>** *number* +#### *fixedFormat* . **width** => *number* The width (in bits) of *fixedFormat*. - - -#### *fixedFormat* . **decimals** **=>** *number* +#### *fixedFormat* . **decimals** => *number* The number of decimal points of *fixedFormat*. +#### *fixedFormat* . **name** => *string* - -#### *fixedFormat* . **name** **=>** *string* - -The name of the *fixedFormat*, which can be used to recreate the format -and is the string that the Solidity language uses to represent this format. - - +The name of the *fixedFormat*, which can be used to recreate the format and is the string that the Solidity language uses to represent this format. #### ***"fixed"*** @@ -235,8 +136,3 @@ and is the string that the Solidity language uses to represent this format. A shorthand for `fixed128x80`. - - - ------ -**Content Hash:** 60fa7fc0a5e28ce6608684d52fe57c2758aa6c9482cd19f71cb5b91fd7d392b8 \ No newline at end of file diff --git a/docs/api/utils/fixednumber/index.html b/docs/api/utils/fixednumber/index.html index d53207cb9..7f3527022 100644 --- a/docs/api/utils/fixednumber/index.html +++ b/docs/api/utils/fixednumber/index.html @@ -1,43 +1,94 @@ -FixedNumber

FixedNumber

-

A FixedNumber is a fixed-width (in bits) number with an internal base-10 divisor, which allows it to represent a decimal fractional component.

-

Creating Instances

-

The FixedNumber constructor cannot be called directly. There are several static methods for creating a FixedNumber.

-
FixedNumber . from ( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

-
FixedNumber . fromBytes ( aBytesLike [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

-
FixedNumber . fromString ( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format. The value must not contain more decimals than the format permits.

-
FixedNumber . fromValue ( value [ , decimals = 0 [ , format = "fixed" ] ] ) FixedNumber

Returns an instance of a FixedNumber for value with decimals as a format.

-

Properties

+ + + + FixedNumber + + + + +
+ -
fixednumber . format

The FixedFormat of fixednumber.

-

Methods

+

FixedNumber

A FixedNumber is a fixed-width (in bits) number with an internal base-10 divisor, which allows it to represent a decimal fractional component.

-

Math Operations

+

Creating Instances

The FixedNumber constructor cannot be called directly. There are several static methods for creating a FixedNumber.

-
fixednumber . addUnsafe ( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue + otherValue.

-
fixednumber . subUnsafe ( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue otherValue.

-
fixednumber . mulUnsafe ( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue × otherValue.

-
fixednumber . divUnsafe ( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue ÷ otherValue.

-
fixednumber . round ( [ decimals = 0 ] ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue rounded to decimals.

-

Conversion

+
FixedNumber.from( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

-
fixednumber . toFormat ( format ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue with format.

-
fixednumber . toHexString ( ) string

Returns a Hexstring representation of fixednumber.

-
fixednumber . toString ( ) string

Returns a string representation of fixednumber.

-
fixednumber . toUnsafeFloat ( ) float

Returns a floating-point JavaScript number value of fixednumber. Due to rounding in JavaScript numbers, the value is only approximate.

-

Inspection

+
FixedNumber.fromBytes( aBytesLike [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

-
FixedNumber . isFixedNumber ( value ) boolean

Returns true if and only if value is a FixedNumber.

-

FixedFormat

-

A FixedFormat is a simple object which represents a decimal (base-10) Fixed-Point data representation. Usually using this class directly is uneccessary, as passing in a Format Strings directly into the FixedNumber will automatically create this.

-

Format Strings

-

A format string is composed of three components, including signed-ness, bit-width and number of decimals.

A signed format string begins with fixed, which an unsigned format string begins with ufixed, followed by the width (in bits) and the number of decimals.

The width must be conguent to 0 mod 8 (i.e. (width % 8) == 0) and no larger than 256 bits and the number of decimals must be no larger than 80.

For example:

  • fixed128x18 is signed, 128 bits wide and has 18 decimals; this is useful for most purposes
  • fixed32x0 is signed, 32 bits wide and has 0 decimals; this would be the same as a ``int32_t` in C
  • ufixed32x0 is unsigned, 32 bits wide and has 0 decimals; this would be the same as a ``uint32_t` in C
  • fixed is shorthand for ``fixed128x18`
  • ufixed is shorthand for ``ufixed128x18`
-

Creating Instances

+
FixedNumber.fromString( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format. The value must not contain more decimals than the format permits.

-
FixedFormat . from ( value = "fixed128x18" ) FixedFormat

Returns a new instance of a FixedFormat defined by value. Any valid Format Strings may be passed in as well as any object which has any of signed, width and decimals defined, including a FixedFormat object.

-

Properties

+
FixedNumber.fromValue( value [ , decimals = 0 [ , format = "fixed" ] ] ) FixedNumber

Returns an instance of a FixedNumber for value with decimals as a format.

-
fixedFormat . signed boolean

The signed-ness of fixedFormat, true if negative values are supported.

-
fixedFormat . width number

The width (in bits) of fixedFormat.

-
fixedFormat . decimals number

The number of decimal points of fixedFormat.

-
fixedFormat . name string

The name of the fixedFormat, which can be used to recreate the format and is the string that the Solidity language uses to represent this format.

-
"fixed"

A shorthand for fixed128x80.

\ No newline at end of file +

Properties

+
fixednumber.format

The FixedFormat of fixednumber.

+ +

Methods

+

Math Operations

+
fixednumber.addUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue + otherValue.

+ +
fixednumber.subUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue - otherValue.

+ +
fixednumber.mulUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue × otherValue.

+ +
fixednumber.divUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue ÷ otherValue.

+ +
fixednumber.round( [ decimals = 0 ] ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue rounded to decimals.

+ +

Conversion

+
fixednumber.toFormat( format ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue with format.

+ +
fixednumber.toHexString( ) string

Returns a HexString representation of fixednumber.

+ +
fixednumber.toString( ) string

Returns a string representation of fixednumber.

+ +
fixednumber.toUnsafeFloat( ) float

Returns a floating-point JavaScript number value of fixednumber. Due to rounding in JavaScript numbers, the value is only approximate.

+ +

Inspection

+
FixedNumber.isFixedNumber( value ) boolean

Returns true if and only if value is a FixedNumber.

+ +

FixedFormat

A FixedFormat is a simple object which represents a decimal (base-10) Fixed-Point data representation. Usually using this class directly is uneccessary, as passing in a Format Strings directly into the FixedNumber will automatically create this.

+ +

Format Strings

A format string is composed of three components, including signed-ness, bit-width and number of decimals.

+ +

A signed format string begins with fixed, which an unsigned format string begins with ufixed, followed by the width (in bits) and the number of decimals.

+ +

The width must be conguent to 0 mod 8 (i.e. (width % 8) == 0) and no larger than 256 bits and the number of decimals must be no larger than 80.

+ +

For example:

+ +

  • fixed128x18 is signed, 128 bits wide and has 18 decimals; this is useful for most purposes
  • fixed32x0 is signed, 32 bits wide and has 0 decimals; this would be the same as a int32_t in C
  • ufixed32x0 is unsigned, 32 bits wide and has 0 decimals; this would be the same as a uint32_t in C
  • fixed is shorthand for fixed128x18
  • ufixed is shorthand for ufixed128x18

+ +

Creating Instances

+
FixedFormat.from( value = "fixed128x18" ) FixedFormat

Returns a new instance of a FixedFormat defined by value. Any valid Format Strings may be passed in as well as any object which has any of signed, width and decimals defined, including a FixedFormat object.

+ +

Properties

+
fixedFormat.signed boolean

The signed-ness of fixedFormat, true if negative values are supported.

+ +
fixedFormat.width number

The width (in bits) of fixedFormat.

+ +
fixedFormat.decimals number

The number of decimal points of fixedFormat.

+ +
fixedFormat.name string

The name of the fixedFormat, which can be used to recreate the format and is the string that the Solidity language uses to represent this format.

+ +
"fixed"

A shorthand for fixed128x80.

+ +
+ + + +
+ + + diff --git a/docs/api/utils/hashing/README.md b/docs/api/utils/hashing/README.md index e5571ff6e..7d12bb001 100644 --- a/docs/api/utils/hashing/README.md +++ b/docs/api/utils/hashing/README.md @@ -7,133 +7,200 @@ Documentation: [html](https://docs-beta.ethers.io/) Hashing Algorithms ================== +Cryptographic Hash Functions +---------------------------- -Explain what hash functions are? +#### *ethers* . *utils* . **id**( text ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* + +The Ethereum Identity function computs the [KECCAK256](https://en.wikipedia.org/wiki/SHA-3) hash of the *text* bytes. -Cryptographic Hashing ---------------------- +#### *ethers* . *utils* . **keccak256**( aBytesLike ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* + +Returns the [KECCAK256](https://en.wikipedia.org/wiki/SHA-3) digest *aBytesLike*. -The [Cryptographic Hash Functions](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Cryptographic_hash_function) -are a specific family of hash functions. +#### *ethers* . *utils* . **ripemd160**( aBytesLike ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 20 > >* + +Returns the [RIPEMD-160](https://en.m.wikipedia.org/wiki/RIPEMD) digest of *aBytesLike*. -#### *ethers* . *utils* . **keccak256** ( aBytesLike ) **=>** *string< [DataHexstring](../bytes)< 32 > >* +#### *ethers* . *utils* . **sha256**( aBytesLike ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* -Returns the [KECCAK256](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/SHA-3) digest *aBytesLike*. +Returns the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) digest of *aBytesLike*. +#### *ethers* . *utils* . **sha512**( aBytesLike ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 64 > >* + +Returns the [SHA2-512](https://en.wikipedia.org/wiki/SHA-2) digest of *aBytesLike*. -#### *ethers* . *utils* . **ripemd160** ( aBytesLike ) **=>** *string< [DataHexstring](../bytes)< 20 > >* +```javascript +utils.keccak256([ 0x12, 0x34 ]) +//! -Returns the [RIPEMD-160](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.m.wikipedia.org/wiki/RIPEMD) digest of *aBytesLike*. +utils.keccak256("0x") +//! +utils.keccak256("0x1234") +//! +// The value MUST be data, such as: +// - an Array of numbers +// - a data hex string (e.g. "0x1234") +// - a Uint8Array +// Do NOT use UTF-8 strings that are not a DataHexstring +utils.keccak256("hello world") +//! error -#### *ethers* . *utils* . **sha256** ( aBytesLike ) **=>** *string< [DataHexstring](../bytes)< 32 > >* +// If needed, convert strings to bytes first: +utils.keccak256(utils.toUtf8Bytes("hello world")) +//! -Returns the [SHA2-256](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/SHA-2) digest of *aBytesLike*. +// Or equivalently use the identity function: +utils.id("hello world") +//! +// Keep in mind that the string "0x1234" represents TWO +// bytes (i.e. [ 0x12, 0x34 ]. If you wish to compute the +// hash of the 6 characters "0x1234", convert it to UTF-8 +// bytes first using utils.toUtf8Bytes. +// Consider the following examples: +// Hash of TWO (2) bytes: +utils.keccak256("0x1234") +//! -#### *ethers* . *utils* . **sha512** ( aBytesLike ) **=>** *string< [DataHexstring](../bytes)< 64 > >* +// Hash of TWO (2) bytes: (same result) +utils.keccak256([ 0x12, 0x34 ]) +//! -Returns the [SHA2-512](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/SHA-2) digest of *aBytesLike*. +const bytes = utils.toUtf8Bytes("0x1234"); +// +bytes +// +//! +// Hash of SIX (6) characters (different than above) +utils.keccak256(bytes) +//! +// Hash of SIX (6) characters (same result) +utils.id("0x1234") +//! +``` +```javascript +utils.ripemd160("0x") +//! -#### *ethers* . *utils* . **computeHmac** ( algorithm , key , data ) **=>** *string< [DataHexstring](../bytes) >* +utils.ripemd160("0x1234") +//! +``` -Returns the [HMAC](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/HMAC) of *data* with *key* -using the [Algorithm](./) *algorithm*. +```javascript +utils.sha256("0x") +//! +utils.sha256("0x1234") +//! +utils.sha512("0x") +//! + +utils.sha512("0x1234") +//! +``` + +HMAC +---- + +#### *ethers* . *utils* . **computeHmac**( algorithm , key , data ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* + +Returns the [HMAC](https://en.wikipedia.org/wiki/HMAC) of *data* with *key* using the [Algorithm](/api/utils/hashing/#utils--hmac-supported-algorithm) *algorithm*. ### HMAC Supported Algorithms +#### *ethers* . *utils* . *SupportedAlgorithm* . **sha256** => *string* + +Use the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) hash algorithm. -#### *ethers* . *utils* . *SupportedAlgorithm* . **sha256** **=>** *string* +#### *ethers* . *utils* . *SupportedAlgorithm* . **sha512** => *string* -Use the [SHA2-256](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/SHA-2) hash algorithm. +Use the [SHA2-512](https://en.wikipedia.org/wiki/SHA-2) hash algorithm. +```javascript +const key = "0x0102"; +const data = "0x1234"; +utils.computeHmac("sha256", key, data) +//! +``` + +Hashing Helpers +--------------- + +#### *ethers* . *utils* . **hashMessage**( message ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* + +Computes the [EIP-191](https://eips.ethereum.org/EIPS/eip-191) personal message digest of *message*. Personal messages are converted to UTF-8 bytes and prefixed with `\x19Ethereum Signed Message:` and the length of *message*. -#### *ethers* . *utils* . *SupportedAlgorithm* . **sha512** **=>** *string* +#### *ethers* . *utils* . **namehash**( name ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* -Use the [SHA2-512](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/SHA-2) hash algorithm. +Returns the [ENS Namehash](https://docs.ens.domains/contract-api-reference/name-processing#hashing-names) of *name*. +```javascript +// @TODO: include exampels of hashMessage; it can be complex. :) +``` +```javascript +utils.namehash("") +//! -Common Hashing Helpers ----------------------- - - - -#### *ethers* . *utils* . **hashMessage** ( message ) **=>** *string< [DataHexstring](../bytes)< 32 > >* - -Computes the [EIP-191](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-191) personal message digest of *message*. Personal messages are -converted to UTF-8 bytes and prefixed with `\x19Ethereum Signed Message:` -and the length of *message*. - - - - -#### *ethers* . *utils* . **id** ( text ) **=>** *string< [DataHexstring](../bytes)< 32 > >* - -The Ethereum Identity function computs the [KECCAK256](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/SHA-3) hash of the *text* bytes. - - - - -#### *ethers* . *utils* . **namehash** ( name ) **=>** *string< [DataHexstring](../bytes)< 32 > >* - -Returns the [ENS Namehash](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/docs.ens.domains/contract-api-reference/name-processing) of *name*. - +utils.namehash("eth") +//! +utils.namehash("ricmoo.firefly.eth") +//! +utils.namehash("ricmoo.xyz") +//! +``` Solidity Hashing Algorithms --------------------------- +#### *ethers* . *utils* . **solidityPack**( types , values ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* -When using the Solidity `abi.packEncoded(...)` function, a non-standard -*tightly packed* version of encoding is used. These functions implement -the tightly packing algorithm. +Returns the non-standard encoded *values* packed according to their respecive type in *types*. -#### *ethers* . *utils* . **solidityPack** ( arrayOfTypes , arrayOfValues ) **=>** *string< [DataHexstring](../bytes) >* +#### *ethers* . *utils* . **solidityKeccak256**( types , values ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* -Returns the non-standard encoded *arrayOfValues* packed according to -their respecive type in *arrayOfTypes*. +Returns the [KECCAK256](https://en.wikipedia.org/wiki/SHA-3) of the non-standard encoded *values* packed according to their respective type in *types*. +#### *ethers* . *utils* . **soliditySha256**( types , values ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* + +Returns the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) of the non-standard encoded *values* packed according to their respective type in *types*. -#### *ethers* . *utils* . **solidityKeccak256** ( arrayOfTypes , arrayOfValues ) **=>** *string< [DataHexstring](../bytes)< 32 > >* +```javascript +utils.solidityPack([ "int16", "uint48" ], [ -1, 12 ]) +//! -Returns the [KECCAK256](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/SHA-3) of the non-standard encoded *arrayOfValues* packed -according to their respective type in *arrayOfTypes*. +utils.solidityPack([ "string", "uint8" ], [ "Hello", 3 ]) +//! +utils.solidityKeccak256([ "int16", "uint48" ], [ -1, 12 ]) +//! +utils.soliditySha256([ "int16", "uint48" ], [ -1, 12 ]) +//! +``` - -#### *ethers* . *utils* . **soliditySha256** ( arrayOfTypes , arrayOfValues ) **=>** *string< [DataHexstring](../bytes)< 32 > >* - -Returns the [SHA2-256](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/SHA-2) of the non-standard encoded *arrayOfValues* packed -according to their respective type in *arrayOfTypes*. - - - - - ------ -**Content Hash:** 5c27393d66c46e7175edbe51257fb8cb69e8dc965d45ed7913b9599deec14e80 \ No newline at end of file diff --git a/docs/api/utils/hashing/index.html b/docs/api/utils/hashing/index.html index 0eed840ce..c7367a29d 100644 --- a/docs/api/utils/hashing/index.html +++ b/docs/api/utils/hashing/index.html @@ -1,23 +1,154 @@ -Hashing Algorithms

Hashing Algorithms

-

Explain what hash functions are?

-

Cryptographic Hashing

-

The Cryptographic Hash Functions are a specific family of hash functions.

-
ethers . utils . keccak256 ( aBytesLike ) string< DataHexstring< 32 > >

Returns the KECCAK256 digest aBytesLike.

-
ethers . utils . ripemd160 ( aBytesLike ) string< DataHexstring< 20 > >

Returns the RIPEMD-160 digest of aBytesLike.

-
ethers . utils . sha256 ( aBytesLike ) string< DataHexstring< 32 > >

Returns the SHA2-256 digest of aBytesLike.

-
ethers . utils . sha512 ( aBytesLike ) string< DataHexstring< 64 > >

Returns the SHA2-512 digest of aBytesLike.

-
ethers . utils . computeHmac ( algorithm , key , data ) string< DataHexstring >

Returns the HMAC of data with key using the Algorithm algorithm.

-

HMAC Supported Algorithms

+ + + + Hashing Algorithms + + + + +
+ -
ethers . utils . SupportedAlgorithm . sha256 string

Use the SHA2-256 hash algorithm.

-
ethers . utils . SupportedAlgorithm . sha512 string

Use the SHA2-512 hash algorithm.

-

Common Hashing Helpers

+

Hashing Algorithms

Explain what hash functions are?

-
ethers . utils . hashMessage ( message ) string< DataHexstring< 32 > >

Computes the EIP-191 personal message digest of message. Personal messages are converted to UTF-8 bytes and prefixed with \x19Ethereum Signed Message: and the length of message.

-
ethers . utils . id ( text ) string< DataHexstring< 32 > >

The Ethereum Identity function computs the KECCAK256 hash of the text bytes.

-
ethers . utils . namehash ( name ) string< DataHexstring< 32 > >

Returns the ENS Namehash of name.

-

Solidity Hashing Algorithms

-

When using the Solidity abi.packEncoded(...) function, a non-standard tightly packed version of encoding is used. These functions implement the tightly packing algorithm.

-
ethers . utils . solidityPack ( arrayOfTypes , arrayOfValues ) string< DataHexstring >

Returns the non-standard encoded arrayOfValues packed according to their respecive type in arrayOfTypes.

-
ethers . utils . solidityKeccak256 ( arrayOfTypes , arrayOfValues ) string< DataHexstring< 32 > >

Returns the KECCAK256 of the non-standard encoded arrayOfValues packed according to their respective type in arrayOfTypes.

-
ethers . utils . soliditySha256 ( arrayOfTypes , arrayOfValues ) string< DataHexstring< 32 > >

Returns the SHA2-256 of the non-standard encoded arrayOfValues packed according to their respective type in arrayOfTypes.

\ No newline at end of file +

Cryptographic Hash Functions

The Cryptographic Hash Functions are a specific family of hash functions.

+ +
ethers.utils.id( text ) string< DataHexString< 32 > >

The Ethereum Identity function computs the KECCAK256 hash of the text bytes.

+ +
ethers.utils.keccak256( aBytesLike ) string< DataHexString< 32 > >

Returns the KECCAK256 digest aBytesLike.

+ +
ethers.utils.ripemd160( aBytesLike ) string< DataHexString< 20 > >

Returns the RIPEMD-160 digest of aBytesLike.

+ +
ethers.utils.sha256( aBytesLike ) string< DataHexString< 32 > >

Returns the SHA2-256 digest of aBytesLike.

+ +
ethers.utils.sha512( aBytesLike ) string< DataHexString< 64 > >

Returns the SHA2-512 digest of aBytesLike.

+ +
KECCAK256
utils.keccak256([ 0x12, 0x34 ]) +//! + +utils.keccak256("0x") +//! + +utils.keccak256("0x1234") +//! + +// The value MUST be data, such as: +// - an Array of numbers +// - a data hex string (e.g. "0x1234") +// - a Uint8Array + +// Do NOT use UTF-8 strings that are not a DataHexstring +utils.keccak256("hello world") +//! error + +// If needed, convert strings to bytes first: +utils.keccak256(utils.toUtf8Bytes("hello world")) +//! + +// Or equivalently use the identity function: +utils.id("hello world") +//! + +// Keep in mind that the string "0x1234" represents TWO +// bytes (i.e. [ 0x12, 0x34 ]. If you wish to compute the +// hash of the 6 characters "0x1234", convert it to UTF-8 +// bytes first using utils.toUtf8Bytes. + +// Consider the following examples: + +// Hash of TWO (2) bytes: +utils.keccak256("0x1234") +//! + +// Hash of TWO (2) bytes: (same result) +utils.keccak256([ 0x12, 0x34 ]) +//! + +const bytes = utils.toUtf8Bytes("0x1234"); +// <hide> +bytes +// </hide> +//! + +// Hash of SIX (6) characters (different than above) +utils.keccak256(bytes) +//! + +// Hash of SIX (6) characters (same result) +utils.id("0x1234") +//!
RIPEMD160
utils.ripemd160("0x") +//! + +utils.ripemd160("0x1234") +//!
SHA-2
utils.sha256("0x") +//! + +utils.sha256("0x1234") +//! + +utils.sha512("0x") +//! + +utils.sha512("0x1234") +//!

HMAC

+
ethers.utils.computeHmac( algorithm , key , data ) string< DataHexString >

Returns the HMAC of data with key using the Algorithm algorithm.

+ +

HMAC Supported Algorithms

+
ethers.utils.SupportedAlgorithm.sha256 string

Use the SHA2-256 hash algorithm.

+ +
ethers.utils.SupportedAlgorithm.sha512 string

Use the SHA2-512 hash algorithm.

+ +
HMAC
const key = "0x0102"; +const data = "0x1234"; +utils.computeHmac("sha256", key, data) +//!

Hashing Helpers

+
ethers.utils.hashMessage( message ) string< DataHexString< 32 > >

Computes the EIP-191 personal message digest of message. Personal messages are converted to UTF-8 bytes and prefixed with \x19Ethereum Signed Message: and the length of message.

+ +
ethers.utils.namehash( name ) string< DataHexString< 32 > >

Returns the ENS Namehash of name.

+ +
Hashing Messages
// @TODO: include exampels of hashMessage; it can be complex. :)
Namehash
utils.namehash("") +//! + +utils.namehash("eth") +//! + +utils.namehash("ricmoo.firefly.eth") +//! + +utils.namehash("ricmoo.xyz") +//!

Solidity Hashing Algorithms

When using the Solidity abi.packEncoded(...) function, a non-standard tightly packed version of encoding is used. These functions implement the tightly packing algorithm.

+ +
ethers.utils.solidityPack( types , values ) string< DataHexString >

Returns the non-standard encoded values packed according to their respecive type in types.

+ +
ethers.utils.solidityKeccak256( types , values ) string< DataHexString< 32 > >

Returns the KECCAK256 of the non-standard encoded values packed according to their respective type in types.

+ +
ethers.utils.soliditySha256( types , values ) string< DataHexString< 32 > >

Returns the SHA2-256 of the non-standard encoded values packed according to their respective type in types.

+ +
Solidity Hashing
utils.solidityPack([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.solidityPack([ "string", "uint8" ], [ "Hello", 3 ]) +//! + +utils.solidityKeccak256([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.soliditySha256([ "int16", "uint48" ], [ -1, 12 ]) +//!
+ + + +
+ + + diff --git a/docs/api/utils/hdnode/README.md b/docs/api/utils/hdnode/README.md index 4a5df4688..be1fbda6d 100644 --- a/docs/api/utils/hdnode/README.md +++ b/docs/api/utils/hdnode/README.md @@ -7,237 +7,147 @@ Documentation: [html](https://docs-beta.ethers.io/) HD Wallet ========= - -TODO: Explain [BIP32](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) [BIP-39](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.bitcoin.it/wiki/BIP_0039) and whatnot here... - - Types ----- - - ### Constants - - -#### *ethers* . *utils* . **defaultPath** **=>** *"m/44'/60'/0'/0/0"* +#### *ethers* . *utils* . **defaultPath** => *"m/44'/60'/0'/0/0"* The default path for Ethereum in an HD Wallet - - ### Mnemonic +#### *mnemonic* . **phrase** => *string* + +The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long and separated by the whitespace specified by the `locale`. -#### *mnemonic* . **phrase** **=>** *string* - -The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long -and separated by the whitespace specified by the `locale`. - - - - -#### *mnemonic* . **path** **=>** *string* +#### *mnemonic* . **path** => *string* The HD path for this mnemonic. - - -#### *mnemonic* . **locale** **=>** *string* +#### *mnemonic* . **locale** => *string* The language of the wordlist this mnemonic is using. - - HDNode ------ - - ### Creating Instances +#### *ethers* . *HDNode* . **fromMnemonic**( phrase [ , password [ , wordlist ] ] ) => *[HDNode](/api/utils/hdnode/#HDNode)* + +Return the [HDNode](/api/utils/hdnode/#HDNode) for *phrase* with the optional *password* and *wordlist*. -#### *ethers* . *HDNode* . **fromMnemonic** ( phrase [ , password [ , wordlist ] ] ) **=>** *[HDNode](./)* +#### *ethers* . *HDNode* . **fromSeed**( aBytesLike ) => *[HDNode](/api/utils/hdnode/#HDNode)* -Return the [HDNode](./) for *phrase* with the optional *password* -and *wordlist*. +Return the [HDNode](/api/utils/hdnode/#HDNode) for the seed *aBytesLike*. +#### *ethers* . *HDNode* . **fromExtendedKey**( extendedKey ) => *[HDNode](/api/utils/hdnode/#HDNode)* - -#### *ethers* . *HDNode* . **fromSeed** ( aBytesLike ) **=>** *[HDNode](./)* - -Return the [HDNode](./) for the seed *aBytesLike*. - - - - -#### *ethers* . *HDNode* . **fromExtendedKey** ( extendedKey ) **=>** *[HDNode](./)* - -Return the [HDNode](./) for the *extendedKey*. If *extendedKey* was -neutered, the **HDNode** will only be able to compute addresses and not -private keys. - - +Return the [HDNode](/api/utils/hdnode/#HDNode) for the *extendedKey*. If *extendedKey* was neutered, the **HDNode** will only be able to compute addresses and not private keys. ### Properties - - -#### *hdNode* . **privateKey** **=>** *string< [DataHexstring](../bytes)< 32 > >* +#### *hdNode* . **privateKey** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The private key for this HDNode. - - -#### *hdNode* . **publicKey** **=>** *string< [DataHexstring](../bytes)< 33 > >* +#### *hdNode* . **publicKey** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 33 > >* The (compresses) public key for this HDNode. +#### *hdNode* . **fingerprint** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 4 > >* - -#### *hdNode* . **fingerprint** **=>** *string< [DataHexstring](../bytes)< 4 > >* - -The fingerprint is meant as an index to quickly match parent and -children nodes together, however collisions may occur and software -should verify matching nodes. +The fingerprint is meant as an index to quickly match parent and children nodes together, however collisions may occur and software should verify matching nodes. Most developers will not need to use this. +#### *hdNode* . **parentFingerprint** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 4 > >* - -#### *hdNode* . **parentFingerprint** **=>** *string< [DataHexstring](../bytes)< 4 > >* - -The fingerprint of the parent node. See *fingerprint* for more -details. +The fingerprint of the parent node. See *fingerprint* for more details. Most developers will not need to use this. - - -#### *hdNode* . **address** **=>** *string< [Address](../address) >* +#### *hdNode* . **address** => *string< [Address](/api/utils/address/#address) >* The address of this HDNode. - - -#### *hdNode* . **mnemonic** **=>** *[Mnemonic](./)* +#### *hdNode* . **mnemonic** => *[Mnemonic](/api/utils/hdnode/#Mnemonic)* The mnemonic of this HDNode, if known. +#### *hdNode* . **path** => *string* + +The path of this HDNode, if known. If the *mnemonic* is also known, this will match `mnemonic.path`. -#### *hdNode* . **path** **=>** *string* +#### *hdNode* . **chainCode** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* -The path of this HDNode, if known. If the *mnemonic* is also known, -this will match `mnemonic.path`. - - - - -#### *hdNode* . **chainCode** **=>** *string< [DataHexstring](../bytes)< 32 > >* - -The chain code is used as a non-secret private key which is then used -with EC-multiply to provide the ability to derive addresses without -the private key of child non-hardened nodes. +The chain code is used as a non-secret private key which is then used with EC-multiply to provide the ability to derive addresses without the private key of child non-hardened nodes. Most developers will not need to use this. +#### *hdNode* . **index** => *number* - -#### *hdNode* . **index** **=>** *number* - -The index of this HDNode. This will match the last component of -the *path*. +The index of this HDNode. This will match the last component of the *path*. Most developers will not need to use this. +#### *hdNode* . **depth** => *number* - -#### *hdNode* . **depth** **=>** *number* - -The depth of this HDNode. This will match the number of components -(less one, the `m/`) of the *path*. +The depth of this HDNode. This will match the number of components (less one, the `m/`) of the *path*. Most developers will not need to use this. +#### *hdNode* . **extendedKey** => *string* - -#### *hdNode* . **extendedKey** **=>** *string* - -A serialized string representation of this HDNode. Not all properties -are included in the serialization, such as the mnemonic and path, so -serializing and deserializing (using the `fromExtendedKey` class -method) will result in reduced information. - - +A serialized string representation of this HDNode. Not all properties are included in the serialization, such as the mnemonic and path, so serializing and deserializing (using the `fromExtendedKey` class method) will result in reduced information. ### Methods +#### *hdNode* . **neuter**( ) => *[HDNode](/api/utils/hdnode/#HDNode)* + +Return a new instance of *hdNode* with its private key removed but all otehr properties preserved. This ensures that the key can not leak the private key of itself or any derived children, but may still be used to compute the addresses of itself and any non-hardened children. -#### *hdNode* . **neuter** ( ) **=>** *[HDNode](./)* - -Return a new instance of *hdNode* with its private key removed -but all otehr properties preserved. This ensures that the key -can not leak the private key of itself or any derived children, -but may still be used to compute the addresses of itself and -any non-hardened children. - - - - -#### *hdNode* . **derivePath** ( path ) **=>** *[HDNode](./)* - -Return a new [HDNode](./) which is the child of *hdNode* found -by deriving *path*. - +#### *hdNode* . **derivePath**( path ) => *[HDNode](/api/utils/hdnode/#HDNode)* +Return a new [HDNode](/api/utils/hdnode/#HDNode) which is the child of *hdNode* found by deriving *path*. Other Functions --------------- +#### *ethers* . *utils* . **mnemonicToSeed**( phrase [ , password ] ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 64 > >* + +Convert a mnemonic phrase to a seed, according to [BIP-39](https://en.bitcoin.it/wiki/BIP_0039). -#### *ethers* . *utils* . **mnemonicToSeed** ( phrase [ , password ] ) **=>** *string< [DataHexstring](../bytes)< 64 > >* +#### *ethers* . *utils* . **mnemonicToEntropy**( phrase [ , wordlist ] ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* -Convert a mnemonic phrase to a seed, according to [BIP-39](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.bitcoin.it/wiki/BIP_0039). +Convert a mnemonic phrase to its entropy, according to [BIP-39](https://en.bitcoin.it/wiki/BIP_0039). +#### *ethers* . *utils* . **isValidMnemonic**( phrase [ , wordlist ] ) => *boolean* + +Returns true if *phrase* is a valid mnemonic phrase, by testing the checksum. -#### *ethers* . *utils* . **mnemonicToEntropy** ( phrase [ , wordlist ] ) **=>** *string< [DataHexstring](../bytes) >* - -Convert a mnemonic phrase to its entropy, according to [BIP-39](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.bitcoin.it/wiki/BIP_0039). - - - - -#### *ethers* . *utils* . **isValidMnemonic** ( phrase [ , wordlist ] ) **=>** *boolean* - -Returns true if *phrase* is a valid mnemonic phrase, by -testing the checksum. - - - - - ------ -**Content Hash:** 042e28f2a611879151bc40783559c6310e23d466a310b508b22f264fa40d53e8 \ No newline at end of file diff --git a/docs/api/utils/hdnode/index.html b/docs/api/utils/hdnode/index.html index 6fd9beaf7..ef965741e 100644 --- a/docs/api/utils/hdnode/index.html +++ b/docs/api/utils/hdnode/index.html @@ -1,41 +1,95 @@ -HD Wallet

HD Wallet

-

TODO: Explain BIP32 BIP-39 and whatnot here...

-

Types

+ + + + HD Wallet + + + + +
+ -

Constants

+

HD Wallet

TODO: Explain BIP32 BIP-39 and whatnot here...

-
ethers . utils . defaultPath "m/44'/60'/0'/0/0"

The default path for Ethereum in an HD Wallet

-

Mnemonic

+

Types

+

Constants

+
ethers.utils.defaultPath "m/44'/60'/0'/0/0"

The default path for Ethereum in an HD Wallet

-
mnemonic . phrase string

The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long and separated by the whitespace specified by the locale.

-
mnemonic . path string

The HD path for this mnemonic.

-
mnemonic . locale string

The language of the wordlist this mnemonic is using.

-

HDNode

+

Mnemonic

+
mnemonic.phrase string

The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long and separated by the whitespace specified by the locale.

-

Creating Instances

+
mnemonic.path string

The HD path for this mnemonic.

-
ethers . HDNode . fromMnemonic ( phrase [ , password [ , wordlist ] ] ) HDNode

Return the HDNode for phrase with the optional password and wordlist.

-
ethers . HDNode . fromSeed ( aBytesLike ) HDNode

Return the HDNode for the seed aBytesLike.

-
ethers . HDNode . fromExtendedKey ( extendedKey ) HDNode

Return the HDNode for the extendedKey. If extendedKey was neutered, the HDNode will only be able to compute addresses and not private keys.

-

Properties

+
mnemonic.locale string

The language of the wordlist this mnemonic is using.

-
hdNode . privateKey string< DataHexstring< 32 > >

The private key for this HDNode.

-
hdNode . publicKey string< DataHexstring< 33 > >

The (compresses) public key for this HDNode.

-
hdNode . fingerprint string< DataHexstring< 4 > >

The fingerprint is meant as an index to quickly match parent and children nodes together, however collisions may occur and software should verify matching nodes.

Most developers will not need to use this.

-
hdNode . parentFingerprint string< DataHexstring< 4 > >

The fingerprint of the parent node. See fingerprint for more details.

Most developers will not need to use this.

-
hdNode . address string< Address >

The address of this HDNode.

-
hdNode . mnemonic Mnemonic

The mnemonic of this HDNode, if known.

-
hdNode . path string

The path of this HDNode, if known. If the mnemonic is also known, this will match mnemonic.path.

-
hdNode . chainCode string< DataHexstring< 32 > >

The chain code is used as a non-secret private key which is then used with EC-multiply to provide the ability to derive addresses without the private key of child non-hardened nodes.

Most developers will not need to use this.

-
hdNode . index number

The index of this HDNode. This will match the last component of the path.

Most developers will not need to use this.

-
hdNode . depth number

The depth of this HDNode. This will match the number of components (less one, the m/) of the path.

Most developers will not need to use this.

-
hdNode . extendedKey string

A serialized string representation of this HDNode. Not all properties are included in the serialization, such as the mnemonic and path, so serializing and deserializing (using the fromExtendedKey class method) will result in reduced information.

-

Methods

+

HDNode

+

Creating Instances

+
ethers.HDNode.fromMnemonic( phrase [ , password [ , wordlist ] ] ) HDNode

Return the HDNode for phrase with the optional password and wordlist.

-
hdNode . neuter ( ) HDNode

Return a new instance of hdNode with its private key removed but all otehr properties preserved. This ensures that the key can not leak the private key of itself or any derived children, but may still be used to compute the addresses of itself and any non-hardened children.

-
hdNode . derivePath ( path ) HDNode

Return a new HDNode which is the child of hdNode found by deriving path.

-

Other Functions

+
ethers.HDNode.fromSeed( aBytesLike ) HDNode

Return the HDNode for the seed aBytesLike.

-
ethers . utils . mnemonicToSeed ( phrase [ , password ] ) string< DataHexstring< 64 > >

Convert a mnemonic phrase to a seed, according to BIP-39.

-
ethers . utils . mnemonicToEntropy ( phrase [ , wordlist ] ) string< DataHexstring >

Convert a mnemonic phrase to its entropy, according to BIP-39.

-
ethers . utils . isValidMnemonic ( phrase [ , wordlist ] ) boolean

Returns true if phrase is a valid mnemonic phrase, by testing the checksum.

\ No newline at end of file +
ethers.HDNode.fromExtendedKey( extendedKey ) HDNode

Return the HDNode for the extendedKey. If extendedKey was neutered, the HDNode will only be able to compute addresses and not private keys.

+ +

Properties

+
hdNode.privateKey string< DataHexString< 32 > >

The private key for this HDNode.

+ +
hdNode.publicKey string< DataHexString< 33 > >

The (compresses) public key for this HDNode.

+ +
hdNode.fingerprint string< DataHexString< 4 > >

The fingerprint is meant as an index to quickly match parent and children nodes together, however collisions may occur and software should verify matching nodes.

+ +

Most developers will not need to use this.

+ +
hdNode.parentFingerprint string< DataHexString< 4 > >

The fingerprint of the parent node. See fingerprint for more details.

+ +

Most developers will not need to use this.

+ +
hdNode.address string< Address >

The address of this HDNode.

+ +
hdNode.mnemonic Mnemonic

The mnemonic of this HDNode, if known.

+ +
hdNode.path string

The path of this HDNode, if known. If the mnemonic is also known, this will match mnemonic.path.

+ +
hdNode.chainCode string< DataHexString< 32 > >

The chain code is used as a non-secret private key which is then used with EC-multiply to provide the ability to derive addresses without the private key of child non-hardened nodes.

+ +

Most developers will not need to use this.

+ +
hdNode.index number

The index of this HDNode. This will match the last component of the path.

+ +

Most developers will not need to use this.

+ +
hdNode.depth number

The depth of this HDNode. This will match the number of components (less one, the m/) of the path.

+ +

Most developers will not need to use this.

+ +
hdNode.extendedKey string

A serialized string representation of this HDNode. Not all properties are included in the serialization, such as the mnemonic and path, so serializing and deserializing (using the fromExtendedKey class method) will result in reduced information.

+ +

Methods

+
hdNode.neuter( ) HDNode

Return a new instance of hdNode with its private key removed but all otehr properties preserved. This ensures that the key can not leak the private key of itself or any derived children, but may still be used to compute the addresses of itself and any non-hardened children.

+ +
hdNode.derivePath( path ) HDNode

Return a new HDNode which is the child of hdNode found by deriving path.

+ +

Other Functions

+
ethers.utils.mnemonicToSeed( phrase [ , password ] ) string< DataHexString< 64 > >

Convert a mnemonic phrase to a seed, according to BIP-39.

+ +
ethers.utils.mnemonicToEntropy( phrase [ , wordlist ] ) string< DataHexString >

Convert a mnemonic phrase to its entropy, according to BIP-39.

+ +
ethers.utils.isValidMnemonic( phrase [ , wordlist ] ) boolean

Returns true if phrase is a valid mnemonic phrase, by testing the checksum.

+ +
+ + + +
+ + + diff --git a/docs/api/utils/index.html b/docs/api/utils/index.html index 32aa2c492..b7fb47732 100644 --- a/docs/api/utils/index.html +++ b/docs/api/utils/index.html @@ -1,3 +1,31 @@ -Utilities

Utilities

-

These utilities are used extensively within the library, but are also quite useful for application developers.

-
\ No newline at end of file + + + + Utilities + + + + +
+ + +

Utilities

These utilities are used extensively within the library, but are also quite useful for application developers.

+ + + + + +
+ + + diff --git a/docs/api/utils/logger/README.md b/docs/api/utils/logger/README.md index aa1b7187e..724a38b11 100644 --- a/docs/api/utils/logger/README.md +++ b/docs/api/utils/logger/README.md @@ -7,246 +7,145 @@ Documentation: [html](https://docs-beta.ethers.io/) Logging ======= - -These are just a few simple logging utilities provided to simplify -and standardize the error facilities across the Ethers library. - -The [Logger](./) library has zero dependencies and is intentionally -very light so it can be easily included in each library. - -The [Censorship](./) functionality relies on one instance -of the Ethers library being included. In large bundled packages or when -`npm link` is used, this may not be the case. If you require this -functionality, ensure that your bundling is configured properly. - - Logger ------ - - -#### **new** *ethers* . *utils* . **Logger** ( version ) +#### **new ***ethers* . *utils* . **Logger**( version ) Create a new logger which will include *version* in all errors thrown. - - -#### *Logger* . **globalLogger** ( ) **=>** *[Logger](./)* +#### *Logger* . **globalLogger**( ) => *[Logger](/api/utils/logger/#Logger)* Returns the singleton global logger. - - ### Logging Output - - -#### *logger* . **debug** ( ...args ) **=>** *void* +#### *logger* . **debug**( ...args ) => *void* Log debugging information. - - -#### *logger* . **info** ( ...args ) **=>** *void* +#### *logger* . **info**( ...args ) => *void* Log generic information. - - -#### *logger* . **warn** ( ...args ) **=>** *void* +#### *logger* . **warn**( ...args ) => *void* Log warnings. - - ### Errors +#### *logger* . **makeError**( message [ , code = UNKNOWN_ERROR [ , params ] ] ) => *Error* -These functions honor the current [Censorship](./) and help create -a standard error model for detecting and processing errors within Ethers. +Create an Error object with *message* and an optional *code* and additional *params* set. This is useful when an error is needed to be rejected instead of thrown. -#### *logger* . **makeError** ( message [ , code=UNKNOWN_ERROR [ , params ] ] ) **=>** *Error* +#### *logger* . **throwError**( message [ , code = UNKNOWN_ERROR [ , params ] ] ) => *never* -Create an Error object with *message* and an optional *code* and -additional *params* set. This is useful when an error is needed to be -rejected instead of thrown. +Throw an Error with *message* and an optional *code* and additional *params* set. +#### *logger* . **throwArgumentError**( message , name , value ) => *never* - -#### *logger* . **throwError** ( message [ , code=UNKNOWN_ERROR [ , params ] ] ) **=>** *never* - -Throw an Error with *message* and an optional *code* and -additional *params* set. - - - - -#### *logger* . **throwArgumentError** ( message , name , value ) **=>** *never* - -Throw an [INVALID_ARGUMENT](./) Error with *name* and *value*. - - +Throw an [INVALID_ARGUMENT](/api/utils/logger/#errors-InvalidArgument) Error with *name* and *value*. ### Usage Validation +#### *logger* . **checkAbstract**( target , kind ) => *void* -There can be used to ensure various properties and actions are safe. +Checks that *target* is not *kind* and performs the same operatons as `checkNew`. This is useful for ensuring abstract classes are not being instantiated. -#### *logger* . **checkAbstract** ( target , kind ) **=>** *void* +#### *logger* . **checkArgumentCount**( count , expectedCound [ , message ) => *void* -Checks that *target* is not *kind* and performs the same operatons -as `checkNew`. This is useful for ensuring abstract classes are not -being instantiated. +If *count* is not equal to *expectedCount*, throws a [MISSING_ARGUMENT](/api/utils/logger/#errors-MissingArgument) or [UNEXPECTED_ARGUMENT](/api/utils/logger/#errors-UnexpectedArgument) error. +#### *logger* . **checkNew**( target , kind ) => *void* + +If *target* is not a valid `this` or `target` value, throw a [MISSING_NEW](/api/utils/logger/#errors-MissingNew) error. This is useful to ensure callers of a Class are using `new`. -#### *logger* . **checkArgumentCount** ( count , expectedCound [ , message ) **=>** *void* +#### *logger* . **checkNormalize**( message ) => *void* -If *count* is not equal to *expectedCount*, throws a [MISSING_ARGUMENT](./) -or [UNEXPECTED_ARGUMENT](./) error. +Check that the environment has a correctly functioning [String.normalize](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize). If not, a [UNSUPPORTED_OPERATION](/api/utils/logger/#errors-UnsupportedOperation) error is thrown. +#### *logger* . **checkSafeUint53**( value [ , message ] ) => *void* - -#### *logger* . **checkNew** ( target , kind ) **=>** *void* - -If *target* is not a valid `this` or `target` value, throw a -[MISSING_NEW](./) error. This is useful to ensure -callers of a Class are using `new`. - - - - -#### *logger* . **checkNormalize** ( message ) **=>** *void* - -Check that the environment has a correctly functioning [String.normalize](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize). If not, a -[UNSUPPORTED_OPERATION](./) error is thrown. - - - - -#### *logger* . **checkSafeUint53** ( value [ , message ] ) **=>** *void* - -If *value* is not safe as a [JavaScript number](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Double-precision_floating-point_format), throws a -[NUMERIC_FAULT](./) error. - - +If *value* is not safe as a [JavaScript number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format), throws a [NUMERIC_FAULT](/api/utils/logger/#errors-NumericFault) error. ### Censorship - - -#### *Logger* . **setCensorship** ( censor [ , permanent=false ] ) **=>** *void* +#### *Logger* . **setCensorship**( censor [ , permanent = false ] ) => *void* Set error censorship, optionally preventing errors from being uncensored. -In production applications, this prevents any error from leaking information -by masking the message and values of errors. +In production applications, this prevents any error from leaking information by masking the message and values of errors. This can impact debugging, making it substantially more difficult. +#### *Logger* . **setLogLevel**( logLevel ) => *void* - -#### *Logger* . **setLogLevel** ( logLevel ) **=>** *void* - -Set the log level, to suppress logging output below a [particular log level](./). - - +Set the log level, to suppress logging output below a [particular log level](/api/utils/logger/#Logger-levels). Errors ------ - -Every error in Ethers has a `code` value, which is a string that will -match one of the following error codes. - - ### Generic Error Codes - - #### *Logger* . *errors* . **NOT_IMPLEMENTED** The operation is not implemented. - - #### *Logger* . *errors* . **SERVER_ERROR** There was an error communicating with a server. - - #### *Logger* . *errors* . **TIMEOUT** A timeout occurred. - - #### *Logger* . *errors* . **UNKNOWN_ERROR** A generic unknown error. - - #### *Logger* . *errors* . **UNSUPPORTED_OPERATION** The operation is not supported. - - ### Safety Error Codes - - #### *Logger* . *errors* . **BUFFER_OVERRUN** -The amount of data needed is more than the amount of data required, -which would cause the data buffer to read past its end. - - +The amount of data needed is more than the amount of data required, which would cause the data buffer to read past its end. #### *Logger* . *errors* . **NUMERIC_FAULT** There was an invalid operation done on numeric values. -Common cases of this occur when there is [overflow](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Integer_overflow), -[arithmetic underflow](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Arithmetic_underflow) in fixed numeric types or division by zero. - - +Common cases of this occur when there is [overflow](https://en.wikipedia.org/wiki/Integer_overflow), [arithmetic underflow](https://en.wikipedia.org/wiki/Arithmetic_underflow) in fixed numeric types or division by zero. ### Usage Error Codes - - #### *Logger* . *errors* . **INVALID_ARGUMENT** -The type or value of an argument is invalid. This will generally also -include the `name` and `value` of the argument. Any function which -accepts sensitive data (such as a private key) will include the string -`[[REDACTED]]` instead of the value passed in. - - +The type or value of an argument is invalid. This will generally also include the `name` and `value` of the argument. Any function which accepts sensitive data (such as a private key) will include the string `[[REDACTED]]` instead of the value passed in. #### *Logger* . *errors* . **MISSING_ARGUMENT** @@ -254,44 +153,28 @@ accepts sensitive data (such as a private key) will include the string An expected parameter was not specified. - - #### *Logger* . *errors* . **MISSING_NEW** An object is a Class, but is now being called with `new`. - - #### *Logger* . *errors* . **UNEXPECTED_ARGUMENT** Too many parameters we passed into a function. - - ### Ethereum Error Codes - - #### *Logger* . *errors* . **CALL_EXCEPTION** -An attempt to call a blockchain contract (getter) resulted in a -revert or other error. - - +An attempt to call a blockchain contract (getter) resulted in a revert or other error. #### *Logger* . *errors* . **INSUFFICIENT_FUNDS** -The account is attempting to make a transaction which costs more than is -available. - -A sending account must have enough ether to pay for the value, the gas limit -(at the gas price) as well as the intrinsic cost of data. The intrinsic cost -of data is 4 gas for each zero byte and 68 gas for each non-zero byte. - +The account is attempting to make a transaction which costs more than is available. +A sending account must have enough ether to pay for the value, the gas limit (at the gas price) as well as the intrinsic cost of data. The intrinsic cost of data is 4 gas for each zero byte and 68 gas for each non-zero byte. #### *Logger* . *errors* . **NETWORK_ERROR** @@ -299,85 +182,54 @@ of data is 4 gas for each zero byte and 68 gas for each non-zero byte. An Ethereum network validation error, such as an invalid chain ID. - - #### *Logger* . *errors* . **NONCE_EXPIRED** The nonce being specified has already been used in a mined transaction. - - #### *Logger* . *errors* . **REPLACEMENT_UNDERPRICED** -When replacing a transaction, by using a nonce which has already been sent to -the network, but which has not been mined yet the new transaction must specify -a higher gas price. - -This error occurs when the gas price is insufficient to *bribe* the transaction -pool to prefer the new transaction over the old one. Generally, the new gas price -should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the -replacement should be 15.000000001 gwei. - +When replacing a transaction, by using a nonce which has already been sent to the network, but which has not been mined yet the new transaction must specify a higher gas price. +This error occurs when the gas price is insufficient to *bribe* the transaction pool to prefer the new transaction over the old one. Generally, the new gas price should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the replacement should be 15.000000001 gwei. #### *Logger* . *errors* . **UNPREDICTABLE_GAS_LIMIT** -When estimating the required amount of gas for a transaction, a node is queried for -its best guess. +When estimating the required amount of gas for a transaction, a node is queried for its best guess. If a node is unable (or unwilling) to predict the cost, this error occurs. -The best remedy for this situation is to specify a gas limit in the transaction -manually. - -This error can also indicate that the transaction is expected to fail regardless, -if for example an account with no tokens is attempting to send a token. - +The best remedy for this situation is to specify a gas limit in the transaction manually. +This error can also indicate that the transaction is expected to fail regardless, if for example an account with no tokens is attempting to send a token. Log Levels ---------- - - #### *Logger* . *levels* . **DEBUG** Log all output, including debugging information. - - #### *Logger* . *levels* . **INFO** Only log output for infomational, warnings and errors. - - #### *Logger* . *levels* . **WARNING** Only log output for warnings and errors. - - #### *Logger* . *levels* . **ERROR** Only log output for errors. - - #### *Logger* . *levels* . **OFF** Do not output any logs. - - - ------ -**Content Hash:** 22f86858ee436554a50ae97e21e1866ac72fc3b0d0aec16ae331ab718c122c95 \ No newline at end of file diff --git a/docs/api/utils/logger/index.html b/docs/api/utils/logger/index.html index 80361b985..3d18244ac 100644 --- a/docs/api/utils/logger/index.html +++ b/docs/api/utils/logger/index.html @@ -1,61 +1,139 @@ -Logging

Logging

-

These are just a few simple logging utilities provided to simplify and standardize the error facilities across the Ethers library.

The Logger library has zero dependencies and is intentionally very light so it can be easily included in each library.

The Censorship functionality relies on one instance of the Ethers library being included. In large bundled packages or when npm link is used, this may not be the case. If you require this functionality, ensure that your bundling is configured properly.

-

Logger

+ + + + Logging + + + + +
+ -
new ethers . utils . Logger ( version )

Create a new logger which will include version in all errors thrown.

-
Logger . globalLogger ( ) Logger

Returns the singleton global logger.

-

Logging Output

+

Logging

These are just a few simple logging utilities provided to simplify and standardize the error facilities across the Ethers library.

-
logger . debug ( ...args ) void

Log debugging information.

-
logger . info ( ...args ) void

Log generic information.

-
logger . warn ( ...args ) void

Log warnings.

-

Errors

-

These functions honor the current Censorship and help create a standard error model for detecting and processing errors within Ethers.

-
logger . makeError ( message [ , code = UNKNOWN_ERROR [ , params ] ] ) Error

Create an Error object with message and an optional code and additional params set. This is useful when an error is needed to be rejected instead of thrown.

-
logger . throwError ( message [ , code = UNKNOWN_ERROR [ , params ] ] ) never

Throw an Error with message and an optional code and additional params set.

-
logger . throwArgumentError ( message , name , value ) never

Throw an INVALID_ARGUMENT Error with name and value.

-

Usage Validation

-

There can be used to ensure various properties and actions are safe.

-
logger . checkAbstract ( target , kind ) void

Checks that target is not kind and performs the same operatons as checkNew. This is useful for ensuring abstract classes are not being instantiated.

-
logger . checkArgumentCount ( count , expectedCound [ , message ) void

If count is not equal to expectedCount, throws a MISSING_ARGUMENT or UNEXPECTED_ARGUMENT error.

-
logger . checkNew ( target , kind ) void

If target is not a valid this or target value, throw a MISSING_NEW error. This is useful to ensure callers of a Class are using new.

-
logger . checkNormalize ( message ) void

Check that the environment has a correctly functioning String . normalize. If not, a UNSUPPORTED_OPERATION error is thrown.

-
logger . checkSafeUint53 ( value [ , message ] ) void

If value is not safe as a JavaScript number, throws a NUMERIC_FAULT error.

-

Censorship

+

The Logger library has zero dependencies and is intentionally very light so it can be easily included in each library.

-
Logger . setCensorship ( censor [ , permanent = false ] ) void

Set error censorship, optionally preventing errors from being uncensored.

In production applications, this prevents any error from leaking information by masking the message and values of errors.

This can impact debugging, making it substantially more difficult.

-
Logger . setLogLevel ( logLevel ) void

Set the log level, to suppress logging output below a particular log level.

-

Errors

-

Every error in Ethers has a code value, which is a string that will match one of the following error codes.

-

Generic Error Codes

+

The Censorship functionality relies on one instance of the Ethers library being included. In large bundled packages or when npm link is used, this may not be the case. If you require this functionality, ensure that your bundling is configured properly.

-
Logger . errors . NOT_IMPLEMENTED

The operation is not implemented.

-
Logger . errors . SERVER_ERROR

There was an error communicating with a server.

-
Logger . errors . TIMEOUT

A timeout occurred.

-
Logger . errors . UNKNOWN_ERROR

A generic unknown error.

-
Logger . errors . UNSUPPORTED_OPERATION

The operation is not supported.

-

Safety Error Codes

+

Logger

+
new ethers.utils.Logger( version )

Create a new logger which will include version in all errors thrown.

-
Logger . errors . BUFFER_OVERRUN

The amount of data needed is more than the amount of data required, which would cause the data buffer to read past its end.

-
Logger . errors . NUMERIC_FAULT

There was an invalid operation done on numeric values.

Common cases of this occur when there is overflow, arithmetic underflow in fixed numeric types or division by zero.

-

Usage Error Codes

+
Logger.globalLogger( ) Logger

Returns the singleton global logger.

-
Logger . errors . INVALID_ARGUMENT

The type or value of an argument is invalid. This will generally also include the name and value of the argument. Any function which accepts sensitive data (such as a private key) will include the string [[REDACTED]] instead of the value passed in.

-
Logger . errors . MISSING_ARGUMENT

An expected parameter was not specified.

-
Logger . errors . MISSING_NEW

An object is a Class, but is now being called with new.

-
Logger . errors . UNEXPECTED_ARGUMENT

Too many parameters we passed into a function.

-

Ethereum Error Codes

+

Logging Output

+
logger.debug( ...args ) void

Log debugging information.

-
Logger . errors . CALL_EXCEPTION

An attempt to call a blockchain contract (getter) resulted in a revert or other error.

-
Logger . errors . INSUFFICIENT_FUNDS

The account is attempting to make a transaction which costs more than is available.

A sending account must have enough ether to pay for the value, the gas limit (at the gas price) as well as the intrinsic cost of data. The intrinsic cost of data is 4 gas for each zero byte and 68 gas for each non-zero byte.

-
Logger . errors . NETWORK_ERROR

An Ethereum network validation error, such as an invalid chain ID.

-
Logger . errors . NONCE_EXPIRED

The nonce being specified has already been used in a mined transaction.

-
Logger . errors . REPLACEMENT_UNDERPRICED

When replacing a transaction, by using a nonce which has already been sent to the network, but which has not been mined yet the new transaction must specify a higher gas price.

This error occurs when the gas price is insufficient to bribe the transaction pool to prefer the new transaction over the old one. Generally, the new gas price should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the replacement should be 15.000000001 gwei.

-
Logger . errors . UNPREDICTABLE_GAS_LIMIT

When estimating the required amount of gas for a transaction, a node is queried for its best guess.

If a node is unable (or unwilling) to predict the cost, this error occurs.

The best remedy for this situation is to specify a gas limit in the transaction manually.

This error can also indicate that the transaction is expected to fail regardless, if for example an account with no tokens is attempting to send a token.

-

Log Levels

+
logger.info( ...args ) void

Log generic information.

-
Logger . levels . DEBUG

Log all output, including debugging information.

-
Logger . levels . INFO

Only log output for infomational, warnings and errors.

-
Logger . levels . WARNING

Only log output for warnings and errors.

-
Logger . levels . ERROR

Only log output for errors.

-
Logger . levels . OFF

Do not output any logs.

\ No newline at end of file +
logger.warn( ...args ) void

Log warnings.

+ +

Errors

These functions honor the current Censorship and help create a standard error model for detecting and processing errors within Ethers.

+ +
logger.makeError( message [ , code = UNKNOWN_ERROR [ , params ] ] ) Error

Create an Error object with message and an optional code and additional params set. This is useful when an error is needed to be rejected instead of thrown.

+ +
logger.throwError( message [ , code = UNKNOWN_ERROR [ , params ] ] ) never

Throw an Error with message and an optional code and additional params set.

+ +
logger.throwArgumentError( message , name , value ) never

Throw an INVALID_ARGUMENT Error with name and value.

+ +

Usage Validation

There can be used to ensure various properties and actions are safe.

+ +
logger.checkAbstract( target , kind ) void

Checks that target is not kind and performs the same operatons as checkNew. This is useful for ensuring abstract classes are not being instantiated.

+ +
logger.checkArgumentCount( count , expectedCound [ , message ) void

If count is not equal to expectedCount, throws a MISSING_ARGUMENT or UNEXPECTED_ARGUMENT error.

+ +
logger.checkNew( target , kind ) void

If target is not a valid this or target value, throw a MISSING_NEW error. This is useful to ensure callers of a Class are using new.

+ +
logger.checkNormalize( message ) void

Check that the environment has a correctly functioning String.normalize. If not, a UNSUPPORTED_OPERATION error is thrown.

+ +
logger.checkSafeUint53( value [ , message ] ) void

If value is not safe as a JavaScript number, throws a NUMERIC_FAULT error.

+ +

Censorship

+
Logger.setCensorship( censor [ , permanent = false ] ) void

Set error censorship, optionally preventing errors from being uncensored.

+ +

In production applications, this prevents any error from leaking information by masking the message and values of errors.

+ +

This can impact debugging, making it substantially more difficult.

+ +
Logger.setLogLevel( logLevel ) void

Set the log level, to suppress logging output below a particular log level.

+ +

Errors

Every error in Ethers has a code value, which is a string that will match one of the following error codes.

+ +

Generic Error Codes

+
Logger.errors.NOT_IMPLEMENTED

The operation is not implemented.

+ +
Logger.errors.SERVER_ERROR

There was an error communicating with a server.

+ +
Logger.errors.TIMEOUT

A timeout occurred.

+ +
Logger.errors.UNKNOWN_ERROR

A generic unknown error.

+ +
Logger.errors.UNSUPPORTED_OPERATION

The operation is not supported.

+ +

Safety Error Codes

+
Logger.errors.BUFFER_OVERRUN

The amount of data needed is more than the amount of data required, which would cause the data buffer to read past its end.

+ +
Logger.errors.NUMERIC_FAULT

There was an invalid operation done on numeric values.

+ +

Common cases of this occur when there is overflow, arithmetic underflow in fixed numeric types or division by zero.

+ +

Usage Error Codes

+
Logger.errors.INVALID_ARGUMENT

The type or value of an argument is invalid. This will generally also include the name and value of the argument. Any function which accepts sensitive data (such as a private key) will include the string [[REDACTED]] instead of the value passed in.

+ +
Logger.errors.MISSING_ARGUMENT

An expected parameter was not specified.

+ +
Logger.errors.MISSING_NEW

An object is a Class, but is now being called with new.

+ +
Logger.errors.UNEXPECTED_ARGUMENT

Too many parameters we passed into a function.

+ +

Ethereum Error Codes

+
Logger.errors.CALL_EXCEPTION

An attempt to call a blockchain contract (getter) resulted in a revert or other error.

+ +
Logger.errors.INSUFFICIENT_FUNDS

The account is attempting to make a transaction which costs more than is available.

+ +

A sending account must have enough ether to pay for the value, the gas limit (at the gas price) as well as the intrinsic cost of data. The intrinsic cost of data is 4 gas for each zero byte and 68 gas for each non-zero byte.

+ +
Logger.errors.NETWORK_ERROR

An Ethereum network validation error, such as an invalid chain ID.

+ +
Logger.errors.NONCE_EXPIRED

The nonce being specified has already been used in a mined transaction.

+ +
Logger.errors.REPLACEMENT_UNDERPRICED

When replacing a transaction, by using a nonce which has already been sent to the network, but which has not been mined yet the new transaction must specify a higher gas price.

+ +

This error occurs when the gas price is insufficient to bribe the transaction pool to prefer the new transaction over the old one. Generally, the new gas price should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the replacement should be 15.000000001 gwei.

+ +
Logger.errors.UNPREDICTABLE_GAS_LIMIT

When estimating the required amount of gas for a transaction, a node is queried for its best guess.

+ +

If a node is unable (or unwilling) to predict the cost, this error occurs.

+ +

The best remedy for this situation is to specify a gas limit in the transaction manually.

+ +

This error can also indicate that the transaction is expected to fail regardless, if for example an account with no tokens is attempting to send a token.

+ +

Log Levels

+
Logger.levels.DEBUG

Log all output, including debugging information.

+ +
Logger.levels.INFO

Only log output for infomational, warnings and errors.

+ +
Logger.levels.WARNING

Only log output for warnings and errors.

+ +
Logger.levels.ERROR

Only log output for errors.

+ +
Logger.levels.OFF

Do not output any logs.

+ +
+ + + +
+ + + diff --git a/docs/api/utils/properties/README.md b/docs/api/utils/properties/README.md index 600f2a0e2..cf9377603 100644 --- a/docs/api/utils/properties/README.md +++ b/docs/api/utils/properties/README.md @@ -7,50 +7,27 @@ Documentation: [html](https://docs-beta.ethers.io/) Property Utilities ================== - - -#### *ethers* . *utils* . **checkPropertoes** ( ) **=>** *void* +#### *ethers* . *utils* . **checkProperties**( ) => *void* +#### *ethers* . *utils* . **deepCopy**( anObject ) => *any* -#### *ethers* . *utils* . **deepCopy** ( anObject ) **=>** *any* +#### *ethers* . *utils* . **defineReadOnly**( anObject , name , value ) => *void* +#### *ethers* . *utils* . **getStatic**( aConstructor , key ) => *any* -#### *ethers* . *utils* . **defineReadOnly** ( anObject , name , value ) **=>** *void* +#### *ethers* . *utils* . **resolveProperties**( anObject ) => *Promise< any >* +#### *ethers* . *utils* . **shallowCopy**( anObject ) => *any* -#### *ethers* . *utils* . **getStatic** ( aConstructor , key ) **=>** *any* - - - - - - -#### *ethers* . *utils* . **resolveProperties** ( anObject ) **=>** *Promise< any >* - - - - - - -#### *ethers* . *utils* . **shallowCopy** ( anObject ) **=>** *any* - - - - - - - ------ -**Content Hash:** 8e7a07176855d0fdb51c85a0d3ab0bdc2049989a4015d134914275ed11a57b65 \ No newline at end of file diff --git a/docs/api/utils/properties/index.html b/docs/api/utils/properties/index.html index 13c3fdde1..d24e6aea6 100644 --- a/docs/api/utils/properties/index.html +++ b/docs/api/utils/properties/index.html @@ -1,8 +1,36 @@ -Property Utilities

Property Utilities

+ + + + Property Utilities + + + + +
+ -
ethers . utils . checkPropertoes ( ) void

-
ethers . utils . deepCopy ( anObject ) any

-
ethers . utils . defineReadOnly ( anObject , name , value ) void

-
ethers . utils . getStatic ( aConstructor , key ) any

-
ethers . utils . resolveProperties ( anObject ) Promise< any >

-
ethers . utils . shallowCopy ( anObject ) any

\ No newline at end of file +

Property Utilities

+
ethers.utils.checkProperties( ) void
+
ethers.utils.deepCopy( anObject ) any
+
ethers.utils.defineReadOnly( anObject , name , value ) void
+
ethers.utils.getStatic( aConstructor , key ) any
+
ethers.utils.resolveProperties( anObject ) Promise< any >
+
ethers.utils.shallowCopy( anObject ) any
+
+ + + +
+ + + diff --git a/docs/api/utils/signing-key/README.md b/docs/api/utils/signing-key/README.md index 26c3b3c9b..00cc1473d 100644 --- a/docs/api/utils/signing-key/README.md +++ b/docs/api/utils/signing-key/README.md @@ -7,97 +7,57 @@ Documentation: [html](https://docs-beta.ethers.io/) Signing Key =========== - - -#### **new** *ethers* . *utils* . **SigningKey** ( privateKey ) +#### **new ***ethers* . *utils* . **SigningKey**( privateKey ) Create a new SigningKey for *privateKey*. - - -#### *signingKey* . **privateKey** **=>** *string< [DataHexstring](../bytes)< 32 > >* +#### *signingKey* . **privateKey** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The private key for this Signing Key. +#### *signingKey* . **publicKey** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 65 > >* + +The uncompressed public key for this Signing Key. It will always be 65 bytes (130 nibbles) and begine with `0x04`. -#### *signingKey* . **publicKey** **=>** *string< [DataHexstring](../bytes)< 65 > >* +#### *signingKey* . **compressedPublicKey** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 33 > >* -The uncompressed public key for this Signing Key. It will always be -65 bytes (130 nibbles) and begine with `0x04`. +The compressed public key for this Signing Key. It will always be 33 bytes (66 nibbles) and begine with either `0x02` or `0x03`. - - -#### *signingKey* . **compressedPublicKey** **=>** *string< [DataHexstring](../bytes)< 33 > >* - -The compressed public key for this Signing Key. It will always be -33 bytes (66 nibbles) and begine with either `0x02` or `0x03`. - - - - -#### *signingKey* . **signDisgest** ( digest ) **=>** *[Signature](../bytes)* +#### *signingKey* . **signDigest**( digest ) => *[Signature](/api/utils/bytes/#Signature)* Sign the *digest* and return the signature. +#### *signingKey* . **computeSharedSecret**( otherKey ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* + +Compute the ECDH shared secret with *otherKey*. The *otherKey* may be either a public key or a private key, but generally will be a public key from another party. + +It is best practice that each party computes the hash of this before using it as a symmetric key. -#### *signingKey* . **computeSharedSecret** ( otherKey ) **=>** *string< [DataHexstring](../bytes)< 32 > >* - -Compute the ECDH shared secret with *otherKey*. The *otherKey* may be -either a public key or a private key, but generally will be a public key from -another party. - -It is best practice that each party computes the hash of this before using it -as a symmetric key. - - - - -#### *SigningKey* . **isSigningKey** ( anObject ) **=>** *boolean* +#### *SigningKey* . **isSigningKey**( anObject ) => *boolean* Returns true if *anObject* is a SigningKey. - - Other Functions --------------- +#### *ethers* . *utils* . **verifyMessage**( message , signature ) => *string< [Address](/api/utils/address/#address) >* + +Returns the address that signed *message* producing *signature*. The signature may have a non-canonical v (i.e. does not need to be 27 or 28), in which case it will be normalized to compute the `recoveryParam` which will then be used to compute the address; this allows systems which use the v to encode additional data (such as [EIP-155](https://eips.ethereum.org/EIPS/eip-155)) to be used since the v parameter is still completely non-ambiguous. -#### *ethers* . *utils* . **verifyMessage** ( message , signature ) **=>** *string< [Address](../address) >* - -Returns the address that signed *message* producing *signature*. The -signature may have a non-canonical v (i.e. does not need to be 27 or 28), -in which case it will be normalized to compute the `recoveryParam` which -will then be used to compute the address; this allows systems which use -the v to encode additional data (such as [EIP-155](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-155)) -to be used since the v parameter is still completely non-ambiguous. +#### *ethers* . *utils* . **recoverPublicKey**( digest , signature ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 65 > >* +#### *ethers* . *utils* . **computePublicKey**( key [ , compressed = false ] ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* -#### *ethers* . *utils* . **recocverPublicKey** ( digest , signature ) **=>** *string< [DataHexstring](../bytes)< 65 > >* +Computes the public key of *key*, optionally compressing it. The *key* can be any form of public key (compressed or uncompressed) or a private key. - - - - -#### *ethers* . *utils* . **computePublicKey** ( key [ , compressed=false ] ) **=>** *string< [DataHexstring](../bytes) >* - -Computes the public key of *key*, optionally compressing it. The *key* -can be any form of public key (compressed or uncompressed) or a private -key. - - - - - ------ -**Content Hash:** 285e65d57c4ba5901703c8a99e95632bd13aca7392d31734251d5d876e7df43e \ No newline at end of file diff --git a/docs/api/utils/signing-key/index.html b/docs/api/utils/signing-key/index.html index de763adbe..88f96d082 100644 --- a/docs/api/utils/signing-key/index.html +++ b/docs/api/utils/signing-key/index.html @@ -1,14 +1,52 @@ -Signing Key

Signing Key

+ + + + Signing Key + + + + +
+ -
new ethers . utils . SigningKey ( privateKey )

Create a new SigningKey for privateKey.

-
signingKey . privateKey string< DataHexstring< 32 > >

The private key for this Signing Key.

-
signingKey . publicKey string< DataHexstring< 65 > >

The uncompressed public key for this Signing Key. It will always be 65 bytes (130 nibbles) and begine with 0x04.

-
signingKey . compressedPublicKey string< DataHexstring< 33 > >

The compressed public key for this Signing Key. It will always be 33 bytes (66 nibbles) and begine with either 0x02 or 0x03.

-
signingKey . signDisgest ( digest ) Signature

Sign the digest and return the signature.

-
signingKey . computeSharedSecret ( otherKey ) string< DataHexstring< 32 > >

Compute the ECDH shared secret with otherKey. The otherKey may be either a public key or a private key, but generally will be a public key from another party.

It is best practice that each party computes the hash of this before using it as a symmetric key.

-
SigningKey . isSigningKey ( anObject ) boolean

Returns true if anObject is a SigningKey.

-

Other Functions

+

Signing Key

+
new ethers.utils.SigningKey( privateKey )

Create a new SigningKey for privateKey.

-
ethers . utils . verifyMessage ( message , signature ) string< Address >

Returns the address that signed message producing signature. The signature may have a non-canonical v (i.e. does not need to be 27 or 28), in which case it will be normalized to compute the `recoveryParam` which will then be used to compute the address; this allows systems which use the v to encode additional data (such as EIP-155) to be used since the v parameter is still completely non-ambiguous.

-
ethers . utils . recocverPublicKey ( digest , signature ) string< DataHexstring< 65 > >

-
ethers . utils . computePublicKey ( key [ , compressed = false ] ) string< DataHexstring >

Computes the public key of key, optionally compressing it. The key can be any form of public key (compressed or uncompressed) or a private key.

\ No newline at end of file +
signingKey.privateKey string< DataHexString< 32 > >

The private key for this Signing Key.

+ +
signingKey.publicKey string< DataHexString< 65 > >

The uncompressed public key for this Signing Key. It will always be 65 bytes (130 nibbles) and begine with 0x04.

+ +
signingKey.compressedPublicKey string< DataHexString< 33 > >

The compressed public key for this Signing Key. It will always be 33 bytes (66 nibbles) and begine with either 0x02 or 0x03.

+ +
signingKey.signDigest( digest ) Signature

Sign the digest and return the signature.

+ +
signingKey.computeSharedSecret( otherKey ) string< DataHexString< 32 > >

Compute the ECDH shared secret with otherKey. The otherKey may be either a public key or a private key, but generally will be a public key from another party.

+ +

It is best practice that each party computes the hash of this before using it as a symmetric key.

+ +
SigningKey.isSigningKey( anObject ) boolean

Returns true if anObject is a SigningKey.

+ +

Other Functions

+
ethers.utils.verifyMessage( message , signature ) string< Address >

Returns the address that signed message producing signature. The signature may have a non-canonical v (i.e. does not need to be 27 or 28), in which case it will be normalized to compute the `recoveryParam` which will then be used to compute the address; this allows systems which use the v to encode additional data (such as EIP-155) to be used since the v parameter is still completely non-ambiguous.

+ +
ethers.utils.recoverPublicKey( digest , signature ) string< DataHexString< 65 > >
+
ethers.utils.computePublicKey( key [ , compressed = false ] ) string< DataHexString >

Computes the public key of key, optionally compressing it. The key can be any form of public key (compressed or uncompressed) or a private key.

+ +
+ + + +
+ + + diff --git a/docs/api/utils/strings/README.md b/docs/api/utils/strings/README.md index 6ae143362..630ff69b6 100644 --- a/docs/api/utils/strings/README.md +++ b/docs/api/utils/strings/README.md @@ -7,297 +7,153 @@ Documentation: [html](https://docs-beta.ethers.io/) Strings ======= - -Tra la la - - Bytes32String ------------- - -A string in Solidity is length prefixed with its 256-bit (32 byte) -length, which means that even short strings require 2 words (64 bytes) -of storage. - -In many cases, we deal with short strings, so instead of prefixing -the string with its length, we can null-terminate it and fit it in a -single word (32 bytes). Since we need only a single byte for the -null termination, we can store strings up to 31 bytes long in a -word. - - #### Note -Strings that are 31 **bytes** long may contain fewer than 31 **characters**, -since UTF-8 requires multiple bytes to encode international characters. +Strings that are 31 **bytes** long may contain fewer than 31 **characters**, since UTF-8 requires multiple bytes to encode international characters. - - -#### *ethers* . *utils* . **parseBytes32String** ( aBytesLike ) **=>** *string* +#### *ethers* . *utils* . **parseBytes32String**( aBytesLike ) => *string* Returns the decoded string represented by the `Bytes32` encoded data. +#### *ethers* . *utils* . **formatBytes32String**( text ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* - -#### *ethers* . *utils* . **formatBytes32String** ( text ) **=>** *string< [DataHexstring](../bytes)< 32 > >* - -Returns a `bytes32` string representation of *text*. If the -length of *text* exceeds 31 bytes, it will throw an error. - - +Returns a `bytes32` string representation of *text*. If the length of *text* exceeds 31 bytes, it will throw an error. UTF-8 Strings ------------- +#### *ethers* . *utils* . **toUtf8Bytes**( text [ , form = current ] ) => *Uint8Array* + +Returns the UTF-8 bytes of *text*, optionally normalizing it using the [UnicodeNormalizationForm](/api/utils/strings/#strings--unicode-normalization-form) *form*. -#### *ethers* . *utils* . **toUtf8Bytes** ( text [ , form=current ] ) **=>** *Uint8Array* - -Returns the UTF-8 bytes of *text*, optionally normalizing it using the -[UnicodeNormalizationForm](./) *form*. - - - - -#### *ethers* . *utils* . **toUtf8CodePoints** ( text [ , form=current ] ) **=>** *Array< number >* - -Returns the Array of codepoints of *text*, optionally normalized using the -[UnicodeNormalizationForm](./) *form*. - +#### *ethers* . *utils* . **toUtf8CodePoints**( text [ , form = current ] ) => *Array< number >* +Returns the Array of codepoints of *text*, optionally normalized using the [UnicodeNormalizationForm](/api/utils/strings/#strings--unicode-normalization-form) *form*. #### Note -This function correctly splits each **user-perceived character** into -its codepoint, accounting for surrogate pairs. This should not be confused with -`string.split("")`, which destroys surrogate pairs, spliting between each UTF-16 -codeunit instead. +This function correctly splits each **user-perceived character** into its codepoint, accounting for surrogate pairs. This should not be confused with `string.split("")`, which destroys surrogate pairs, spliting between each UTF-16 codeunit instead. - - -#### *ethers* . *utils* . **toUtf8String** ( aBytesLike [ , onError=error ] ) **=>** *string* +#### *ethers* . *utils* . **toUtf8String**( aBytesLike [ , onError = error ] ) => *string* Returns the string represented by the UTF-8 bytes of *aBytesLike*. -The *onError* is a [Custom UTF-8 Error function](./) and if not specified -it defaults to the [error](./) function, which throws an error -on **any** UTF-8 error. - - +The *onError* is a [Custom UTF-8 Error function](/api/utils/strings/#strings--error-handling) and if not specified it defaults to the [error](/api/utils/strings/#strings--Utf8Error) function, which throws an error on **any** UTF-8 error. UnicodeNormalizationForm ------------------------ - -There are several [commonly used forms](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Unicode_equivalence) -when normalizing UTF-8 data, which allow strings to be compared or hashed in a stable -way. - - #### *ethers* . *utils* . *UnicodeNormalizationForm* . **current** Maintain the current normalization form. - - #### *ethers* . *utils* . *UnicodeNormalizationForm* . **NFC** -The Composed Normalization Form. This form uses single codepoints -which represent the fully composed character. - -For example, the **é** is a single codepoint, `0x00e9`. - +The Composed Normalization Form. This form uses single codepoints which represent the fully composed character. +For example, the **e** is a single codepoint, `0x00e9`. #### *ethers* . *utils* . *UnicodeNormalizationForm* . **NFD** -The Decomposed Normalization Form. This form uses multiple codepoints -(when necessary) to compose a character. - -For example, the **é** -is made up of two codepoints, `"0x0065"` (which is the letter `"e"`) -and `"0x0301"` which is a special diacritic UTF-8 codepoint which -indicates the previous character should have an acute accent. - +The Decomposed Normalization Form. This form uses multiple codepoints (when necessary) to compose a character. +For example, the **e** is made up of two codepoints, `"0x0065"` (which is the letter `"e"`) and `"0x0301"` which is a special diacritic UTF-8 codepoint which indicates the previous character should have an acute accent. #### *ethers* . *utils* . *UnicodeNormalizationForm* . **NFKC** -The Composed Normalization Form with Canonical Equivalence. The Canonical -representation folds characters which have the same syntactic representation -but different semantic meaning. - -For example, the Roman Numeral **I**, which has a UTF-8 -codepoint `"0x2160"`, is folded into the capital letter I, `"0x0049"`. - +The Composed Normalization Form with Canonical Equivalence. The Canonical representation folds characters which have the same syntactic representation but different semantic meaning. +For example, the Roman Numeral **I**, which has a UTF-8 codepoint `"0x2160"`, is folded into the capital letter I, `"0x0049"`. #### *ethers* . *utils* . *UnicodeNormalizationForm* . **NFKD** -The Decomposed Normalization Form with Canonical Equivalence. -See NFKC for more an example. - - +The Decomposed Normalization Form with Canonical Equivalence. See NFKC for more an example. #### Note -Only certain specified characters are folded in Canonical Equivalence, and thus -it should **not** be considered a method to acheive *any* level of security from -[homoglyph attacks](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/IDN_homograph_attack). - - +Only certain specified characters are folded in Canonical Equivalence, and thus it should **not** be considered a method to acheive *any* level of security from [homoglyph attacks](https://en.wikipedia.org/wiki/IDN_homograph_attack). Custom UTF-8 Error Handling --------------------------- +#### **errorFunction**( reason , offset , bytes , output [ , badCodepoint ] ) => *number* -When converting a string to its codepoints, there is the possibility -of invalid byte sequences. Since certain situations may need specific -ways to handle UTF-8 errors, a custom error handling function can be used, -which has the signature: - - -#### **errorFunction** ( reason , offset , bytes , output [ , badCodepoint ] ) **=>** *number* - -The *reason* is one of the [UTF-8 Error Reasons](./), *offset* is the index -into *bytes* where the error was first encountered, output is the list -of codepoints already processed (and may be modified) and in certain Error -Reasons, the *badCodepoint* indicates the currently computed codepoint, -but which would be rejected because its value is invalid. - -This function should return the number of bytes to skip past keeping in -mind the value at *offset* will already be consumed. - +The *reason* is one of the [UTF-8 Error Reasons](/api/utils/strings/#strings--error-reasons), *offset* is the index into *bytes* where the error was first encountered, output is the list of codepoints already processed (and may be modified) and in certain Error Reasons, the *badCodepoint* indicates the currently computed codepoint, but which would be rejected because its value is invalid. +This function should return the number of bytes to skip past keeping in mind the value at *offset* will already be consumed. ### UTF-8 Error Reasons - - #### *ethers* . *utils* . *Utf8ErrorReason* . **BAD_PREFIX** -A byte was encountered which is invalid to begin a UTF-8 byte -sequence with. - - +A byte was encountered which is invalid to begin a UTF-8 byte sequence with. #### *ethers* . *utils* . *Utf8ErrorReason* . **MISSING_CONTINUE** -A UTF-8 sequence was begun, but did not have enough continuation -bytes for the sequence. For this error the *ofset* is the index -at which a continuation byte was expected. - - +A UTF-8 sequence was begun, but did not have enough continuation bytes for the sequence. For this error the *ofset* is the index at which a continuation byte was expected. #### *ethers* . *utils* . *Utf8ErrorReason* . **OUT_OF_RANGE** -The computed codepoint is outside the range for valid UTF-8 -codepoints (i.e. the codepoint is greater than 0x10ffff). -This reason will pass the computed *badCountpoint* into -the custom error function. - - +The computed codepoint is outside the range for valid UTF-8 codepoints (i.e. the codepoint is greater than 0x10ffff). This reason will pass the computed *badCountpoint* into the custom error function. #### *ethers* . *utils* . *Utf8ErrorReason* . **OVERLONG** -Due to the way UTF-8 allows variable length byte sequences -to be used, it is possible to have multiple representations -of the same character, which means -[overlong sequences](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/UTF-8) -allow for a non-distinguished string to be formed, which can -impact security as multiple strings that are otherwise -equal can have different hashes. - -Generally, overlong sequences are an attempt to circumvent -some part of security, but in rare cases may be produced by -lazy libraries or used to encode the null terminating -character in a way that is safe to include in a `char*`. - -This reason will pass the computed *badCountpoint* into the -custom error function, which is actually a valid codepoint, just -one that was arrived at through unsafe methods. +Due to the way UTF-8 allows variable length byte sequences to be used, it is possible to have multiple representations of the same character, which means [overlong sequences](https://en.wikipedia.org/wiki/UTF-8#Overlong_encodings) allow for a non-distinguished string to be formed, which can impact security as multiple strings that are otherwise equal can have different hashes. +Generally, overlong sequences are an attempt to circumvent some part of security, but in rare cases may be produced by lazy libraries or used to encode the null terminating character in a way that is safe to include in a `char*`. +This reason will pass the computed *badCountpoint* into the custom error function, which is actually a valid codepoint, just one that was arrived at through unsafe methods. #### *ethers* . *utils* . *Utf8ErrorReason* . **OVERRUN** -The string does not have enough characters remaining for the -length of this sequence. - - +The string does not have enough characters remaining for the length of this sequence. #### *ethers* . *utils* . *Utf8ErrorReason* . **UNEXPECTED_CONTINUE** -This error is similar to BAD_PREFIX, since a continuation byte -cannot begin a valid sequence, but many may wish to process this -differently. However, most developers would want to trap this -and perform the same operation as a BAD_PREFIX. - - +This error is similar to BAD_PREFIX, since a continuation byte cannot begin a valid sequence, but many may wish to process this differently. However, most developers would want to trap this and perform the same operation as a BAD_PREFIX. #### *ethers* . *utils* . *Utf8ErrorReason* . **UTF16_SURROGATE** -The computed codepoint represents a value reserved for -UTF-16 surrogate pairs. -This reason will pass the computed surrogate half -*badCountpoint* into the custom error function. - - +The computed codepoint represents a value reserved for UTF-16 surrogate pairs. This reason will pass the computed surrogate half *badCountpoint* into the custom error function. ### Provided UTF-8 Error Handling Functions - -There are already several functions available for the most common -situations. - - #### *ethers* . *utils* . *Utf8ErrorFuncs* . **error** -The will throw an error on **any** error with a UTF-8 sequence, including -invalid prefix bytes, overlong sequences, UTF-16 surrogate pairs. - - +The will throw an error on **any** error with a UTF-8 sequence, including invalid prefix bytes, overlong sequences, UTF-16 surrogate pairs. #### *ethers* . *utils* . *Utf8ErrorFuncs* . **ignore** -This will drop all invalid sequences (by consuming invalid prefix bytes and -any following continuation bytes) from the final string as well as permit -overlong sequences to be converted to their equivalent string. - - +This will drop all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) from the final string as well as permit overlong sequences to be converted to their equivalent string. #### *ethers* . *utils* . *Utf8ErrorFuncs* . **replace** -This will replace all invalid sequences (by consuming invalid prefix bytes and -any following continuation bytes) with the -[UTF-8 Replacement Character](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Specials_%28Unicode_block%29), -(i.e. U+FFFD). +This will replace all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) with the [UTF-8 Replacement Character](https://en.wikipedia.org/wiki/Specials_%28Unicode_block%29#Replacement_character), (i.e. U+FFFD). - - - ------ -**Content Hash:** 07249bd69db30a03c4095abd99904dd50f0d1b924138023085e78a43e0b5e4c4 \ No newline at end of file diff --git a/docs/api/utils/strings/index.html b/docs/api/utils/strings/index.html index 00f87ca95..a551ef9c1 100644 --- a/docs/api/utils/strings/index.html +++ b/docs/api/utils/strings/index.html @@ -1,38 +1,105 @@ -Strings

Strings

-

Tra la la

-

Bytes32String

-

A string in Solidity is length prefixed with its 256-bit (32 byte) length, which means that even short strings require 2 words (64 bytes) of storage.

In many cases, we deal with short strings, so instead of prefixing the string with its length, we can null-terminate it and fit it in a single word (32 bytes). Since we need only a single byte for the null termination, we can store strings up to 31 bytes long in a word.

-
Note

Strings that are 31 bytes long may contain fewer than 31 characters, since UTF-8 requires multiple bytes to encode international characters.

-
ethers . utils . parseBytes32String ( aBytesLike ) string

Returns the decoded string represented by the Bytes32 encoded data.

-
ethers . utils . formatBytes32String ( text ) string< DataHexstring< 32 > >

Returns a bytes32 string representation of text. If the length of text exceeds 31 bytes, it will throw an error.

-

UTF-8 Strings

+ + + + Strings + + + + +
+ -
ethers . utils . toUtf8Bytes ( text [ , form = current ] ) Uint8Array

Returns the UTF-8 bytes of text, optionally normalizing it using the UnicodeNormalizationForm form.

-
ethers . utils . toUtf8CodePoints ( text [ , form = current ] ) Array< number >

Returns the Array of codepoints of text, optionally normalized using the UnicodeNormalizationForm form.

-
Note

This function correctly splits each user-perceived character into its codepoint, accounting for surrogate pairs. This should not be confused with string.split(""), which destroys surrogate pairs, spliting between each UTF-16 codeunit instead.

-
ethers . utils . toUtf8String ( aBytesLike [ , onError = error ] ) string

Returns the string represented by the UTF-8 bytes of aBytesLike.

The onError is a Custom UTF-8 Error function and if not specified it defaults to the error function, which throws an error on any UTF-8 error.

-

UnicodeNormalizationForm

-

There are several commonly used forms when normalizing UTF-8 data, which allow strings to be compared or hashed in a stable way.

-
ethers . utils . UnicodeNormalizationForm . current

Maintain the current normalization form.

-
ethers . utils . UnicodeNormalizationForm . NFC

The Composed Normalization Form. This form uses single codepoints which represent the fully composed character.

For example, the é is a single codepoint, 0x00e9.

-
ethers . utils . UnicodeNormalizationForm . NFD

The Decomposed Normalization Form. This form uses multiple codepoints (when necessary) to compose a character.

For example, the é is made up of two codepoints, "0x0065" (which is the letter "e") and "0x0301" which is a special diacritic UTF-8 codepoint which indicates the previous character should have an acute accent.

-
ethers . utils . UnicodeNormalizationForm . NFKC

The Composed Normalization Form with Canonical Equivalence. The Canonical representation folds characters which have the same syntactic representation but different semantic meaning.

For example, the Roman Numeral I, which has a UTF-8 codepoint "0x2160", is folded into the capital letter I, "0x0049".

-
ethers . utils . UnicodeNormalizationForm . NFKD

The Decomposed Normalization Form with Canonical Equivalence. See NFKC for more an example.

-
Note

Only certain specified characters are folded in Canonical Equivalence, and thus it should not be considered a method to acheive any level of security from homoglyph attacks.

-

Custom UTF-8 Error Handling

-

When converting a string to its codepoints, there is the possibility of invalid byte sequences. Since certain situations may need specific ways to handle UTF-8 errors, a custom error handling function can be used, which has the signature:

-
errorFunction ( reason , offset , bytes , output [ , badCodepoint ] ) number

The reason is one of the UTF-8 Error Reasons, offset is the index into bytes where the error was first encountered, output is the list of codepoints already processed (and may be modified) and in certain Error Reasons, the badCodepoint indicates the currently computed codepoint, but which would be rejected because its value is invalid.

This function should return the number of bytes to skip past keeping in mind the value at offset will already be consumed.

-

UTF-8 Error Reasons

+

Strings

Tra la la

-
ethers . utils . Utf8ErrorReason . BAD_PREFIX

A byte was encountered which is invalid to begin a UTF-8 byte sequence with.

-
ethers . utils . Utf8ErrorReason . MISSING_CONTINUE

A UTF-8 sequence was begun, but did not have enough continuation bytes for the sequence. For this error the ofset is the index at which a continuation byte was expected.

-
ethers . utils . Utf8ErrorReason . OUT_OF_RANGE

The computed codepoint is outside the range for valid UTF-8 codepoints (i.e. the codepoint is greater than 0x10ffff). This reason will pass the computed badCountpoint into the custom error function.

-
ethers . utils . Utf8ErrorReason . OVERLONG

Due to the way UTF-8 allows variable length byte sequences to be used, it is possible to have multiple representations of the same character, which means overlong sequences allow for a non-distinguished string to be formed, which can impact security as multiple strings that are otherwise equal can have different hashes.

Generally, overlong sequences are an attempt to circumvent some part of security, but in rare cases may be produced by lazy libraries or used to encode the null terminating character in a way that is safe to include in a char*.

This reason will pass the computed badCountpoint into the custom error function, which is actually a valid codepoint, just one that was arrived at through unsafe methods.

-
ethers . utils . Utf8ErrorReason . OVERRUN

The string does not have enough characters remaining for the length of this sequence.

-
ethers . utils . Utf8ErrorReason . UNEXPECTED_CONTINUE

This error is similar to BAD_PREFIX, since a continuation byte cannot begin a valid sequence, but many may wish to process this differently. However, most developers would want to trap this and perform the same operation as a BAD_PREFIX.

-
ethers . utils . Utf8ErrorReason . UTF16_SURROGATE

The computed codepoint represents a value reserved for UTF-16 surrogate pairs. This reason will pass the computed surrogate half badCountpoint into the custom error function.

-

Provided UTF-8 Error Handling Functions

-

There are already several functions available for the most common situations.

-
ethers . utils . Utf8ErrorFuncs . error

The will throw an error on any error with a UTF-8 sequence, including invalid prefix bytes, overlong sequences, UTF-16 surrogate pairs.

-
ethers . utils . Utf8ErrorFuncs . ignore

This will drop all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) from the final string as well as permit overlong sequences to be converted to their equivalent string.

-
ethers . utils . Utf8ErrorFuncs . replace

This will replace all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) with the UTF-8 Replacement Character, (i.e. U+FFFD).

\ No newline at end of file +

Bytes32String

A string in Solidity is length prefixed with its 256-bit (32 byte) length, which means that even short strings require 2 words (64 bytes) of storage.

+ +

In many cases, we deal with short strings, so instead of prefixing the string with its length, we can null-terminate it and fit it in a single word (32 bytes). Since we need only a single byte for the null termination, we can store strings up to 31 bytes long in a word.

+ +
Note

Strings that are 31 bytes long may contain fewer than 31 characters, since UTF-8 requires multiple bytes to encode international characters.

+ +
ethers.utils.parseBytes32String( aBytesLike ) string

Returns the decoded string represented by the Bytes32 encoded data.

+ +
ethers.utils.formatBytes32String( text ) string< DataHexString< 32 > >

Returns a bytes32 string representation of text. If the length of text exceeds 31 bytes, it will throw an error.

+ +

UTF-8 Strings

+
ethers.utils.toUtf8Bytes( text [ , form = current ] ) Uint8Array

Returns the UTF-8 bytes of text, optionally normalizing it using the UnicodeNormalizationForm form.

+ +
ethers.utils.toUtf8CodePoints( text [ , form = current ] ) Array< number >

Returns the Array of codepoints of text, optionally normalized using the UnicodeNormalizationForm form.

+ +
Note

This function correctly splits each user-perceived character into its codepoint, accounting for surrogate pairs. This should not be confused with string.split(""), which destroys surrogate pairs, spliting between each UTF-16 codeunit instead.

+ +
ethers.utils.toUtf8String( aBytesLike [ , onError = error ] ) string

Returns the string represented by the UTF-8 bytes of aBytesLike.

+ +

The onError is a Custom UTF-8 Error function and if not specified it defaults to the error function, which throws an error on any UTF-8 error.

+ +

UnicodeNormalizationForm

There are several commonly used forms when normalizing UTF-8 data, which allow strings to be compared or hashed in a stable way.

+ +
ethers.utils.UnicodeNormalizationForm.current

Maintain the current normalization form.

+ +
ethers.utils.UnicodeNormalizationForm.NFC

The Composed Normalization Form. This form uses single codepoints which represent the fully composed character.

+ +

For example, the é is a single codepoint, 0x00e9.

+ +
ethers.utils.UnicodeNormalizationForm.NFD

The Decomposed Normalization Form. This form uses multiple codepoints (when necessary) to compose a character.

+ +

For example, the é is made up of two codepoints, "0x0065" (which is the letter "e") and "0x0301" which is a special diacritic UTF-8 codepoint which indicates the previous character should have an acute accent.

+ +
ethers.utils.UnicodeNormalizationForm.NFKC

The Composed Normalization Form with Canonical Equivalence. The Canonical representation folds characters which have the same syntactic representation but different semantic meaning.

+ +

For example, the Roman Numeral I, which has a UTF-8 codepoint "0x2160", is folded into the capital letter I, "0x0049".

+ +
ethers.utils.UnicodeNormalizationForm.NFKD

The Decomposed Normalization Form with Canonical Equivalence. See NFKC for more an example.

+ +
Note

Only certain specified characters are folded in Canonical Equivalence, and thus it should not be considered a method to acheive any level of security from homoglyph attacks.

+ +

Custom UTF-8 Error Handling

When converting a string to its codepoints, there is the possibility of invalid byte sequences. Since certain situations may need specific ways to handle UTF-8 errors, a custom error handling function can be used, which has the signature:

+ +
errorFunction( reason , offset , bytes , output [ , badCodepoint ] ) number

The reason is one of the UTF-8 Error Reasons, offset is the index into bytes where the error was first encountered, output is the list of codepoints already processed (and may be modified) and in certain Error Reasons, the badCodepoint indicates the currently computed codepoint, but which would be rejected because its value is invalid.

+ +

This function should return the number of bytes to skip past keeping in mind the value at offset will already be consumed.

+ +

UTF-8 Error Reasons

+
ethers.utils.Utf8ErrorReason.BAD_PREFIX

A byte was encountered which is invalid to begin a UTF-8 byte sequence with.

+ +
ethers.utils.Utf8ErrorReason.MISSING_CONTINUE

A UTF-8 sequence was begun, but did not have enough continuation bytes for the sequence. For this error the ofset is the index at which a continuation byte was expected.

+ +
ethers.utils.Utf8ErrorReason.OUT_OF_RANGE

The computed codepoint is outside the range for valid UTF-8 codepoints (i.e. the codepoint is greater than 0x10ffff). This reason will pass the computed badCountpoint into the custom error function.

+ +
ethers.utils.Utf8ErrorReason.OVERLONG

Due to the way UTF-8 allows variable length byte sequences to be used, it is possible to have multiple representations of the same character, which means overlong sequences allow for a non-distinguished string to be formed, which can impact security as multiple strings that are otherwise equal can have different hashes.

+ +

Generally, overlong sequences are an attempt to circumvent some part of security, but in rare cases may be produced by lazy libraries or used to encode the null terminating character in a way that is safe to include in a char*.

+ +

This reason will pass the computed badCountpoint into the custom error function, which is actually a valid codepoint, just one that was arrived at through unsafe methods.

+ +
ethers.utils.Utf8ErrorReason.OVERRUN

The string does not have enough characters remaining for the length of this sequence.

+ +
ethers.utils.Utf8ErrorReason.UNEXPECTED_CONTINUE

This error is similar to BAD_PREFIX, since a continuation byte cannot begin a valid sequence, but many may wish to process this differently. However, most developers would want to trap this and perform the same operation as a BAD_PREFIX.

+ +
ethers.utils.Utf8ErrorReason.UTF16_SURROGATE

The computed codepoint represents a value reserved for UTF-16 surrogate pairs. This reason will pass the computed surrogate half badCountpoint into the custom error function.

+ +

Provided UTF-8 Error Handling Functions

There are already several functions available for the most common situations.

+ +
ethers.utils.Utf8ErrorFuncs.error

The will throw an error on any error with a UTF-8 sequence, including invalid prefix bytes, overlong sequences, UTF-16 surrogate pairs.

+ +
ethers.utils.Utf8ErrorFuncs.ignore

This will drop all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) from the final string as well as permit overlong sequences to be converted to their equivalent string.

+ +
ethers.utils.Utf8ErrorFuncs.replace

This will replace all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) with the UTF-8 Replacement Character, (i.e. U+FFFD).

+ +
+ + + +
+ + + diff --git a/docs/api/utils/transactions/README.md b/docs/api/utils/transactions/README.md index 9b8afe6e4..4eec0cdff 100644 --- a/docs/api/utils/transactions/README.md +++ b/docs/api/utils/transactions/README.md @@ -7,235 +7,128 @@ Documentation: [html](https://docs-beta.ethers.io/) Transactions ============ - - Types ----- - - ### UnsignedTransaction - -An unsigned transaction represents a transaction that has not been -signed and its values are flexible as long as they are not ambiguous. - - -#### *unsignedTransaction* . **to** **=>** *string< [Address](../address) >* +#### *unsignedTransaction* . **to** => *string< [Address](/api/utils/address/#address) >* The addres this transaction is to. - - -#### *unsignedTransaction* . **nonce** **=>** *number* +#### *unsignedTransaction* . **nonce** => *number* The nonce of this transaction. - - -#### *unsignedTransaction* . **gasLimit** **=>** *[BigNumberish](../bignumber)* +#### *unsignedTransaction* . **gasLimit** => *[BigNumberish](/api/utils/bignumber/#BigNumberish)* The gas limit for this transaction. - - -#### *unsignedTransaction* . **gasPrice** **=>** *[BigNumberish](../bignumber)* +#### *unsignedTransaction* . **gasPrice** => *[BigNumberish](/api/utils/bignumber/#BigNumberish)* The gas price for this transaction. - - -#### *unsignedTransaction* . **data** **=>** *[BytesLike](../bytes)* +#### *unsignedTransaction* . **data** => *[BytesLike](/api/utils/bytes/#BytesLike)* The data for this transaction. - - -#### *unsignedTransaction* . **value** **=>** *[BigNumberish](../bignumber)* +#### *unsignedTransaction* . **value** => *[BigNumberish](/api/utils/bignumber/#BigNumberish)* The value (in wei) for this transaction. +#### *unsignedTransaction* . **chainId** => *number* - -#### *unsignedTransaction* . **chainId** **=>** *number* - -The chain ID for this transaction. If the chain ID is 0 or null, -then [EIP-155](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-155) is disabled and legacy signing is -used, unless overridden in a signature. - - +The chain ID for this transaction. If the chain ID is 0 or null, then [EIP-155](https://eips.ethereum.org/EIPS/eip-155) is disabled and legacy signing is used, unless overridden in a signature. ### Transaction +#### *transaction* . **hash** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* -A generic object to represent a transaction. +The transaction hash, which can be used as an identifier for *transaction*. This is the keccak256 of the serialized RLP encoded representation of *transaction*. -#### *transaction* . **hash** **=>** *string< [DataHexstring](../bytes)< 32 > >* - -The transaction hash, which can be used as an identifier for -*transaction*. This is the keccak256 of the serialized RLP encoded -representation of *transaction*. - - - - -#### *unsignedTransaction* . **to** **=>** *string< [Address](../address) >* +#### *unsignedTransaction* . **to** => *string< [Address](/api/utils/address/#address) >* The address *transaction* is to. - - -#### *transaction* . **from** **=>** *string< [Address](../address) >* +#### *transaction* . **from** => *string< [Address](/api/utils/address/#address) >* The address *transaction* is from. +#### *transaction* . **nonce** => *number* + +The nonce for *transaction*. Each transaction sent to the network from an account includes this, which ensures the order and non-replayability of a transaction. This must be equal to the current number of transactions ever sent to the network by the **from** address. -#### *transaction* . **nonce** **=>** *number* +#### *transaction* . **gasLimit** => *[BigNumber](/api/utils/bignumber/)* -The nonce for *transaction*. Each transaction sent to the network -from an account includes this, which ensures the order and -non-replayability of a transaction. This must be equal to the current -number of transactions ever sent to the network by the **from** address. +The gas limit for *transaction*. An account must have enough ether to cover the gas (at the specified **gasPrice**). Any unused gas is refunded at the end of the transaction, and if there is insufficient gas to complete execution, the effects of the trasaction are reverted, but the gas is **fully consumed** and an out-of-gas error occurs. - - -#### *transaction* . **gasLimit** **=>** *[BigNumber](../bignumber)* - -The gas limit for *transaction*. An account must have enough ether to -cover the gas (at the specified **gasPrice**). Any unused gas is -refunded at the end of the transaction, and if there is insufficient gas -to complete execution, the effects of the trasaction are reverted, but -the gas is **fully consumed** and an out-of-gas error occurs. - - - - -#### *transaction* . **gasPrice** **=>** *[BigNumber](../bignumber)* +#### *transaction* . **gasPrice** => *[BigNumber](/api/utils/bignumber/)* The price (in wei) per unit of gas for *transaction*. - - -#### *transaction* . **data** **=>** *[BytesLike](../bytes)* +#### *transaction* . **data** => *[BytesLike](/api/utils/bytes/#BytesLike)* The data for *transaction*. In a contract this is the call data. - - -#### *transaction* . **value** **=>** *[BigNumber](../bignumber)* +#### *transaction* . **value** => *[BigNumber](/api/utils/bignumber/)* The value (in wei) for *transaction*. +#### *transaction* . **chainId** => *number* + +The chain ID for *transaction*. This is used as part of [EIP-155](https://eips.ethereum.org/EIPS/eip-155) to prevent replay attacks on different networks. + +For example, if a transaction was made on ropsten with an account also used on homestead, it would be possible for a transaction signed on ropsten to be executed on homestead, which is likely unintended. + +There are situations where replay may be desired, however these are very rare and it is almost always recommended to specify the chain ID. -#### *transaction* . **chainId** **=>** *number* +#### *transaction* . **r** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* -The chain ID for *transaction*. This is used as part of -[EIP-155](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-155) to prevent replay attacks on different -networks. - -For example, if a transaction was made on ropsten with an account -also used on homestead, it would be possible for a transaction -signed on ropsten to be executed on homestead, which is likely -unintended. - -There are situations where replay may be desired, however these -are very rare and it is almost always recommended to specify the -chain ID. +The r portion of the elliptic curve signatures for *transaction*. This is more accurately, the x coordinate of the point r (from which the y can be computed, along with v). - - -#### *transaction* . **r** **=>** *string< [DataHexstring](../bytes)< 32 > >* - -The r portion of the elliptic curve signatures for *transaction*. -This is more accurately, the x coordinate of the point r (from -which the y can be computed, along with v). - - - - -#### *transaction* . **s** **=>** *string< [DataHexstring](../bytes)< 32 > >* +#### *transaction* . **s** => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* The s portion of the elliptic curve signatures for *transaction*. +#### *transaction* . **v** => *number* - -#### *transaction* . **v** **=>** *number* - -The v portion of the elliptic curve signatures for *transaction*. -This is used to refine which of the two possible points a given -x-coordinate can have, and in [EIP-155](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-155) is additionally -used to encode the chain ID into the serialized transaction. - - +The v portion of the elliptic curve signatures for *transaction*. This is used to refine which of the two possible points a given x-coordinate can have, and in [EIP-155](https://eips.ethereum.org/EIPS/eip-155) is additionally used to encode the chain ID into the serialized transaction. Functions --------- - - -#### *ethers* . *utils* . **computeAddress** ( publicOrPrivateKey ) **=>** *string< [Address](../address) >* - -Compute the address of *publicOrPrivateKey*. If a public key is -provided, it may be either compressed or uncompressed. - - - - -#### *ethers* . *utils* . **parse** ( aBytesLike ) **=>** *[Transaction](./)* +#### *ethers* . *utils* . **parseTransaction**( aBytesLike ) => *[Transaction](/api/utils/transactions/#Transaction)* Parses the transaction properties from a serialized transactions. +#### *ethers* . *utils* . **serializeTransaction**( tx [ , signature ] ) => *string< [DataHexString](/api/utils/bytes/#DataHexString) >* + +Computes the serialized *transaction*, optionally serialized with the a *signature*. If *signature* is not present, the unsigned serialized transaction is returned, which can be used to compute the hash necessary to sign. + +This function uses [EIP-155](https://eips.ethereum.org/EIPS/eip-155) if a chainId is provided, otherwise legacy serialization is used. It is **highly** recommended to always specify a *chainId*. + +If *signature* includes a chain ID (explicitly or implicitly by using an [EIP-155](https://eips.ethereum.org/EIPS/eip-155) `v` or `_vs`) it will be used to compute the chain ID. + +If there is a mismatch between the chain ID of *transaction* and *signature* an error is thrown. -#### *ethers* . *utils* . **recoverAddress** ( digest , aSignatureLike ) **=>** *string< [Address](../address) >* - -Computes the address that signed *digest* to get *aSignatureLike* using the -ecrecover algorithm. - - - - -#### *ethers* . *utils* . **serialize** ( transaction [ , signature ] ) **=>** *string< [DataHexstring](../bytes) >* - -Computes the serialized *transaction*, optionally serialized with -the a *signature*. If *signature* is not present, the unsigned -serialized transaction is returned, which can be used to compute the -hash necessary to sign. - -This function uses [EIP-155](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-155) if a chainId is provided, -otherwise legacy serialization is used. It is **highly** recommended -to always specify a *chainId*. - -If *signature* includes a chain ID (explicitly or implicitly by using an -[EIP-155](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/eips.ethereum.org/EIPS/eip-155) `v` or `_vs`) it will be used to compute the -chain ID. - -If there is a mismatch between the chain ID of *transaction* and *signature* -an error is thrown. - - - - - ------ -**Content Hash:** cda81a14250e9640ccedf9111dbb11772c4f513b10adac75aedf70271273a2c3 \ No newline at end of file diff --git a/docs/api/utils/transactions/index.html b/docs/api/utils/transactions/index.html index e3d7bc681..708640f3d 100644 --- a/docs/api/utils/transactions/index.html +++ b/docs/api/utils/transactions/index.html @@ -1,33 +1,88 @@ -Transactions

Transactions

+ + + + Transactions + + + + +
+ -

Types

+

Transactions

+

Types

+

UnsignedTransaction

An unsigned transaction represents a transaction that has not been signed and its values are flexible as long as they are not ambiguous.

-

UnsignedTransaction

-

An unsigned transaction represents a transaction that has not been signed and its values are flexible as long as they are not ambiguous.

-
unsignedTransaction . to string< Address >

The addres this transaction is to.

-
unsignedTransaction . nonce number

The nonce of this transaction.

-
unsignedTransaction . gasLimit BigNumberish

The gas limit for this transaction.

-
unsignedTransaction . gasPrice BigNumberish

The gas price for this transaction.

-
unsignedTransaction . data BytesLike

The data for this transaction.

-
unsignedTransaction . value BigNumberish

The value (in wei) for this transaction.

-
unsignedTransaction . chainId number

The chain ID for this transaction. If the chain ID is 0 or null, then EIP-155 is disabled and legacy signing is used, unless overridden in a signature.

-

Transaction

-

A generic object to represent a transaction.

-
transaction . hash string< DataHexstring< 32 > >

The transaction hash, which can be used as an identifier for transaction. This is the keccak256 of the serialized RLP encoded representation of transaction.

-
unsignedTransaction . to string< Address >

The address transaction is to.

-
transaction . from string< Address >

The address transaction is from.

-
transaction . nonce number

The nonce for transaction. Each transaction sent to the network from an account includes this, which ensures the order and non-replayability of a transaction. This must be equal to the current number of transactions ever sent to the network by the from address.

-
transaction . gasLimit BigNumber

The gas limit for transaction. An account must have enough ether to cover the gas (at the specified gasPrice). Any unused gas is refunded at the end of the transaction, and if there is insufficient gas to complete execution, the effects of the trasaction are reverted, but the gas is fully consumed and an out-of-gas error occurs.

-
transaction . gasPrice BigNumber

The price (in wei) per unit of gas for transaction.

-
transaction . data BytesLike

The data for transaction. In a contract this is the call data.

-
transaction . value BigNumber

The value (in wei) for transaction.

-
transaction . chainId number

The chain ID for transaction. This is used as part of EIP-155 to prevent replay attacks on different networks.

For example, if a transaction was made on ropsten with an account also used on homestead, it would be possible for a transaction signed on ropsten to be executed on homestead, which is likely unintended.

There are situations where replay may be desired, however these are very rare and it is almost always recommended to specify the chain ID.

-
transaction . r string< DataHexstring< 32 > >

The r portion of the elliptic curve signatures for transaction. This is more accurately, the x coordinate of the point r (from which the y can be computed, along with v).

-
transaction . s string< DataHexstring< 32 > >

The s portion of the elliptic curve signatures for transaction.

-
transaction . v number

The v portion of the elliptic curve signatures for transaction. This is used to refine which of the two possible points a given x-coordinate can have, and in EIP-155 is additionally used to encode the chain ID into the serialized transaction.

-

Functions

+
unsignedTransaction.to string< Address >

The addres this transaction is to.

-
ethers . utils . computeAddress ( publicOrPrivateKey ) string< Address >

Compute the address of publicOrPrivateKey. If a public key is provided, it may be either compressed or uncompressed.

-
ethers . utils . parse ( aBytesLike ) Transaction

Parses the transaction properties from a serialized transactions.

-
ethers . utils . recoverAddress ( digest , aSignatureLike ) string< Address >

Computes the address that signed digest to get aSignatureLike using the ecrecover algorithm.

-
ethers . utils . serialize ( transaction [ , signature ] ) string< DataHexstring >

Computes the serialized transaction, optionally serialized with the a signature. If signature is not present, the unsigned serialized transaction is returned, which can be used to compute the hash necessary to sign.

This function uses EIP-155 if a chainId is provided, otherwise legacy serialization is used. It is highly recommended to always specify a chainId.

If signature includes a chain ID (explicitly or implicitly by using an EIP-155 v or _vs) it will be used to compute the chain ID.

If there is a mismatch between the chain ID of transaction and signature an error is thrown.

\ No newline at end of file +
unsignedTransaction.nonce number

The nonce of this transaction.

+ +
unsignedTransaction.gasLimit BigNumberish

The gas limit for this transaction.

+ +
unsignedTransaction.gasPrice BigNumberish

The gas price for this transaction.

+ +
unsignedTransaction.data BytesLike

The data for this transaction.

+ +
unsignedTransaction.value BigNumberish

The value (in wei) for this transaction.

+ +
unsignedTransaction.chainId number

The chain ID for this transaction. If the chain ID is 0 or null, then EIP-155 is disabled and legacy signing is used, unless overridden in a signature.

+ +

Transaction

A generic object to represent a transaction.

+ +
transaction.hash string< DataHexString< 32 > >

The transaction hash, which can be used as an identifier for transaction. This is the keccak256 of the serialized RLP encoded representation of transaction.

+ +
unsignedTransaction.to string< Address >

The address transaction is to.

+ +
transaction.from string< Address >

The address transaction is from.

+ +
transaction.nonce number

The nonce for transaction. Each transaction sent to the network from an account includes this, which ensures the order and non-replayability of a transaction. This must be equal to the current number of transactions ever sent to the network by the from address.

+ +
transaction.gasLimit BigNumber

The gas limit for transaction. An account must have enough ether to cover the gas (at the specified gasPrice). Any unused gas is refunded at the end of the transaction, and if there is insufficient gas to complete execution, the effects of the trasaction are reverted, but the gas is fully consumed and an out-of-gas error occurs.

+ +
transaction.gasPrice BigNumber

The price (in wei) per unit of gas for transaction.

+ +
transaction.data BytesLike

The data for transaction. In a contract this is the call data.

+ +
transaction.value BigNumber

The value (in wei) for transaction.

+ +
transaction.chainId number

The chain ID for transaction. This is used as part of EIP-155 to prevent replay attacks on different networks.

+ +

For example, if a transaction was made on ropsten with an account also used on homestead, it would be possible for a transaction signed on ropsten to be executed on homestead, which is likely unintended.

+ +

There are situations where replay may be desired, however these are very rare and it is almost always recommended to specify the chain ID.

+ +
transaction.r string< DataHexString< 32 > >

The r portion of the elliptic curve signatures for transaction. This is more accurately, the x coordinate of the point r (from which the y can be computed, along with v).

+ +
transaction.s string< DataHexString< 32 > >

The s portion of the elliptic curve signatures for transaction.

+ +
transaction.v number

The v portion of the elliptic curve signatures for transaction. This is used to refine which of the two possible points a given x-coordinate can have, and in EIP-155 is additionally used to encode the chain ID into the serialized transaction.

+ +

Functions

+
ethers.utils.parseTransaction( aBytesLike ) Transaction

Parses the transaction properties from a serialized transactions.

+ +
ethers.utils.serializeTransaction( tx [ , signature ] ) string< DataHexString >

Computes the serialized transaction, optionally serialized with the a signature. If signature is not present, the unsigned serialized transaction is returned, which can be used to compute the hash necessary to sign.

+ +

This function uses EIP-155 if a chainId is provided, otherwise legacy serialization is used. It is highly recommended to always specify a chainId.

+ +

If signature includes a chain ID (explicitly or implicitly by using an EIP-155 v or _vs) it will be used to compute the chain ID.

+ +

If there is a mismatch between the chain ID of transaction and signature an error is thrown.

+ +
+ + + +
+ + + diff --git a/docs/api/utils/web/README.md b/docs/api/utils/web/README.md index 0846b35aa..cd0898cff 100644 --- a/docs/api/utils/web/README.md +++ b/docs/api/utils/web/README.md @@ -7,128 +7,88 @@ Documentation: [html](https://docs-beta.ethers.io/) Web Utilities ============= +#### *ethers* . *utils* . **fetchJson**( urlOrConnectionInfo [ , json [ , processFunc ] ] ) => *Promise< any >* + +Fetch and parse the JSON content from *urlOrConnectionInfo*, with the optiona body *json* and optionally processing the result with *processFun* before returning it. -#### *ethers* . *utils* . **fetchJson** ( urlOrConnectionInfo [ , json [ , processFunc ] ] ) **=>** *Promise< any >* +#### *ethers* . *utils* . **poll**( pollFunc [ , options ] ) => *Promise< any >* -Fetch and parse the JSON content from *urlOrConnectionInfo*, with the -optiona body *json* and optionally processing the result with *processFun* -before returning it. +Repeatedly call pollFunc using the [PollOptions](/api/utils/web/#PollOptions) until it returns a value other than undefined. +### ConnectionInfo - -#### *ethers* . *utils* . **poll** ( pollFunc [ , options ] ) **=>** *Promise< any >* - -Repeatedly call pollFunc using the [Poll Options](./) until it returns a -value other than undefined. - - - - -### Connection Info - - - -#### *connection* . **url** **=>** *string* +#### *connection* . **url** => *string* The URL to connect to. +#### *connection* . **user** => *string* + +The username to use for [Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). The default is null (i.e. do not use basic authentication) -#### *connection* . **user** **=>** *string* +#### *connection* . **password** => *string* -The username to use for [Basic Authentication](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Basic_access_authentication). -The default is null (i.e. do not use basic authentication) +The password to use for [Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). The default is null (i.e. do not use basic authentication) +#### *connection* . **allowInsecureAuthentication** => *boolean* + +Allow [Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) over non-secure HTTP. The default is false. -#### *connection* . **password** **=>** *string* - -The password to use for [Basic Authentication](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Basic_access_authentication). -The default is null (i.e. do not use basic authentication) - - - - -#### *connection* . **allowInsecureAuthentication** **=>** *boolean* - -Allow [Basic Authentication](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Basic_access_authentication) over non-secure HTTP. The default is false. - - - - -#### *connection* . **timeout** **=>** *number* +#### *connection* . **timeout** => *number* How long to wait before rejecting with a *timeout* error. - - -#### *connection* . **headers** **=>** *{[key:string]:string}* +#### *connection* . **headers** => *{[key:string]:string}* Additional headers to include in the connection. +### PollOptions + +#### *options* . **timeout** => *number* + +The amount of time allowed to ellapse before triggering a timeout error. -### Poll Options +#### *options* . **floor** => *number* - - -#### *options* . **timeout** **=>** *number* - -The amount of time allowed to ellapse before triggering a timeout -error. - - - - -#### *options* . **floor** **=>** *number* - -The minimum time limit to allow for [Exponential Backoff](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Exponential_backoff). +The minimum time limit to allow for [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff). The default is 0s. +#### *options* . **ceiling** => *number* - -#### *options* . **ceiling** **=>** *number* - -The maximum time limit to allow for [Exponential Backoff](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Exponential_backoff). +The maximum time limit to allow for [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff). The default is 10s. +#### *options* . **interval** => *number* - -#### *options* . **interval** **=>** *number* - -The interval used during [Exponential Backoff](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Exponential_backoff) calculation. +The interval used during [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff) calculation. The default is 250ms. +#### *options* . **retryLimit** => *number* + +The number of times to retry in the event of an error or *undefined* is returned. -#### *options* . **retryLimit** **=>** *number* +#### *options* . **onceBlock** => *[Provider](/api/providers/provider/)* -The number of times to retry in the event of an error or *undefined* is -returned. +If this is specified, the polling will wait on new blocks from *provider* before attempting the *pollFunc* again. +#### *options* . **oncePoll** => *[Provider](/api/providers/provider/)* + +If this is specified, the polling will occur on each poll cycle of *provider* before attempting the *pollFunc* again. -#### *options* . **onceBlock** **=>** *[Provider](../../providers/provider)* - -If this is specified, the polling will wait on new blocks from -*provider* before attempting the *pollFunc* again. - - - - - ------ -**Content Hash:** 595f603aa2c0b7be3b5139c1ea9ea198dabddd6dc76793b1558911ab70bda06f \ No newline at end of file diff --git a/docs/api/utils/web/index.html b/docs/api/utils/web/index.html index 51cf53242..66ce43ce0 100644 --- a/docs/api/utils/web/index.html +++ b/docs/api/utils/web/index.html @@ -1,20 +1,68 @@ -Web Utilities

Web Utilities

+ + + + Web Utilities + + + + +
+ -
ethers . utils . fetchJson ( urlOrConnectionInfo [ , json [ , processFunc ] ] ) Promise< any >

Fetch and parse the JSON content from urlOrConnectionInfo, with the optiona body json and optionally processing the result with processFun before returning it.

-
ethers . utils . poll ( pollFunc [ , options ] ) Promise< any >

Repeatedly call pollFunc using the Poll Options until it returns a value other than undefined.

-

Connection Info

+

Web Utilities

+
ethers.utils.fetchJson( urlOrConnectionInfo [ , json [ , processFunc ] ] ) Promise< any >

Fetch and parse the JSON content from urlOrConnectionInfo, with the optiona body json and optionally processing the result with processFun before returning it.

-
connection . url string

The URL to connect to.

-
connection . user string

The username to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

-
connection . password string

The password to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

-
connection . allowInsecureAuthentication boolean

Allow Basic Authentication over non-secure HTTP. The default is false.

-
connection . timeout number

How long to wait before rejecting with a timeout error.

-
connection . headers {[key:string]:string}

Additional headers to include in the connection.

-

Poll Options

+
ethers.utils.poll( pollFunc [ , options ] ) Promise< any >

Repeatedly call pollFunc using the PollOptions until it returns a value other than undefined.

-
options . timeout number

The amount of time allowed to ellapse before triggering a timeout error.

-
options . floor number

The minimum time limit to allow for Exponential Backoff.

The default is 0s.

-
options . ceiling number

The maximum time limit to allow for Exponential Backoff.

The default is 10s.

-
options . interval number

The interval used during Exponential Backoff calculation.

The default is 250ms.

-
options . retryLimit number

The number of times to retry in the event of an error or undefined is returned.

-
options . onceBlock Provider

If this is specified, the polling will wait on new blocks from provider before attempting the pollFunc again.

\ No newline at end of file +

ConnectionInfo

+
connection.url string

The URL to connect to.

+ +
connection.user string

The username to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

+ +
connection.password string

The password to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

+ +
connection.allowInsecureAuthentication boolean

Allow Basic Authentication over non-secure HTTP. The default is false.

+ +
connection.timeout number

How long to wait before rejecting with a timeout error.

+ +
connection.headers {[key:string]:string}

Additional headers to include in the connection.

+ +

PollOptions

+
options.timeout number

The amount of time allowed to ellapse before triggering a timeout error.

+ +
options.floor number

The minimum time limit to allow for Exponential Backoff.

+ +

The default is 0s.

+ +
options.ceiling number

The maximum time limit to allow for Exponential Backoff.

+ +

The default is 10s.

+ +
options.interval number

The interval used during Exponential Backoff calculation.

+ +

The default is 250ms.

+ +
options.retryLimit number

The number of times to retry in the event of an error or undefined is returned.

+ +
options.onceBlock Provider

If this is specified, the polling will wait on new blocks from provider before attempting the pollFunc again.

+ +
options.oncePoll Provider

If this is specified, the polling will occur on each poll cycle of provider before attempting the pollFunc again.

+ +
+ + + +
+ + + diff --git a/docs/api/utils/wordlists/README.md b/docs/api/utils/wordlists/README.md index 486f0ae89..a474222c5 100644 --- a/docs/api/utils/wordlists/README.md +++ b/docs/api/utils/wordlists/README.md @@ -7,135 +7,89 @@ Documentation: [html](https://docs-beta.ethers.io/) Wordlists ========= - - Wordlist -------- - - -#### *wordlist* . **locale** **=>** *string* +#### *wordlist* . **locale** => *string* The locale for this wordlist. - - -#### *wordlist* . **getWord** ( index ) **=>** *string* +#### *wordlist* . **getWord**( index ) => *string* Returns the word at *index*. - - -#### *wordlist* . **getWordIndex** ( word ) **=>** *number* +#### *wordlist* . **getWordIndex**( word ) => *number* Returns the index of *word* within the wordlist. +#### *wordlist* . **split**( mnemonic ) => *Array< string >* + +Returns the mnemonic split into each individual word, according to a locale's valid whitespace character set. -#### *wordlist* . **split** ( mnemonic ) **=>** *Array< string >* +#### *wordlist* . **join**( words ) => *string* -Returns the mnemonic split into each individual word, according to a -locale's valid whitespace character set. +Returns the mnemonic by joining *words* together using the whitespace that is standard for the locale. +#### *Wordlist* . **check**( wordlists ) => *string< [DataHexString](/api/utils/bytes/#DataHexString)< 32 > >* + +Checks that all words map both directions correctly and return the hash of the lists. Sub-classes should use this to validate the wordlist is correct against the official wordlist hash. -#### *wordlist* . **join** ( words ) **=>** *string* - -Returns the mnemonic by joining *words* together using the -whitespace that is standard for the locale. - - - - -#### *Wordlist* . **check** ( wordlists ) **=>** *string< [DataHexstring](../bytes)< 32 > >* - -Checks that all words map both directions correctly and return the -hash of the lists. Sub-classes should use this to validate the wordlist -is correct against the official wordlist hash. - - - - -#### *Wordlist* . **register** ( wordlist [ , name ] ) **=>** *void* - -Register a wordlist with the list of wordlists, optionally overriding -the registered *name*. - +#### *Wordlist* . **register**( wordlist [ , name ] ) => *void* +Register a wordlist with the list of wordlists, optionally overriding the registered *name*. Languages --------- +#### *ethers* . *wordlists* . **cz** => *Wordlist* + +The Czech [Wordlist](/api/utils/wordlists/#Wordlist). -#### *ethers* . *wordlists* . **cz** **=>** *Wordlist* +#### *ethers* . *wordlists* . **en** => *Wordlist* -The Czech [Wordlist](./). +The English [Wordlist](/api/utils/wordlists/#Wordlist). +#### *ethers* . *wordlists* . **es** => *Wordlist* + +The Spanish [Wordlist](/api/utils/wordlists/#Wordlist). -#### *ethers* . *wordlists* . **en** **=>** *Wordlist* +#### *ethers* . *wordlists* . **fr** => *Wordlist* -The English [Wordlist](./). +The French [Wordlist](/api/utils/wordlists/#Wordlist). +#### *ethers* . *wordlists* . **it** => *Wordlist* + +The Italian [Wordlist](/api/utils/wordlists/#Wordlist). -#### *ethers* . *wordlists* . **es** **=>** *Wordlist* +#### *ethers* . *wordlists* . **ja** => *Wordlist* -The Spanish [Wordlist](./). +The Japanese [Wordlist](/api/utils/wordlists/#Wordlist). +#### *ethers* . *wordlists* . **ko** => *Wordlist* + +The Korean [Wordlist](/api/utils/wordlists/#Wordlist). -#### *ethers* . *wordlists* . **fr** **=>** *Wordlist* +#### *ethers* . *wordlists* . **zh_cn** => *Wordlist* -The French [Wordlist](./). +The Simplified Chinese [Wordlist](/api/utils/wordlists/#Wordlist). +#### *ethers* . *wordlists* . **zh_tw** => *Wordlist* + +The Traditional Chinese [Wordlist](/api/utils/wordlists/#Wordlist). -#### *ethers* . *wordlists* . **it** **=>** *Wordlist* - -The Italian [Wordlist](./). - - - - -#### *ethers* . *wordlists* . **ja** **=>** *Wordlist* - -The Japanese [Wordlist](./). - - - - -#### *ethers* . *wordlists* . **ko** **=>** *Wordlist* - -The Korean [Wordlist](./). - - - - -#### *ethers* . *wordlists* . **zh_cn** **=>** *Wordlist* - -The Simplified Chinese [Wordlist](./). - - - - -#### *ethers* . *wordlists* . **zh_tw** **=>** *Wordlist* - -The Traditional Chinese [Wordlist](./). - - - - - ------ -**Content Hash:** a5616892113b9a9a384590f4154ea1c32b078a3eb0c3eb82ac80a79c894394d7 \ No newline at end of file diff --git a/docs/api/utils/wordlists/index.html b/docs/api/utils/wordlists/index.html index 1dd887477..84f4f762c 100644 --- a/docs/api/utils/wordlists/index.html +++ b/docs/api/utils/wordlists/index.html @@ -1,22 +1,65 @@ -Wordlists

Wordlists

+ + + + Wordlists + + + + +
+ -

Wordlist

+

Wordlists

+

Wordlist

+
wordlist.locale string

The locale for this wordlist.

-
wordlist . locale string

The locale for this wordlist.

-
wordlist . getWord ( index ) string

Returns the word at index.

-
wordlist . getWordIndex ( word ) number

Returns the index of word within the wordlist.

-
wordlist . split ( mnemonic ) Array< string >

Returns the mnemonic split into each individual word, according to a locale's valid whitespace character set.

-
wordlist . join ( words ) string

Returns the mnemonic by joining words together using the whitespace that is standard for the locale.

-
Wordlist . check ( wordlists ) string< DataHexstring< 32 > >

Checks that all words map both directions correctly and return the hash of the lists. Sub-classes should use this to validate the wordlist is correct against the official wordlist hash.

-
Wordlist . register ( wordlist [ , name ] ) void

Register a wordlist with the list of wordlists, optionally overriding the registered name.

-

Languages

+
wordlist.getWord( index ) string

Returns the word at index.

-
ethers . wordlists . cz Wordlist

The Czech Wordlist.

-
ethers . wordlists . en Wordlist

The English Wordlist.

-
ethers . wordlists . es Wordlist

The Spanish Wordlist.

-
ethers . wordlists . fr Wordlist

The French Wordlist.

-
ethers . wordlists . it Wordlist

The Italian Wordlist.

-
ethers . wordlists . ja Wordlist

The Japanese Wordlist.

-
ethers . wordlists . ko Wordlist

The Korean Wordlist.

-
ethers . wordlists . zh_cn Wordlist

The Simplified Chinese Wordlist.

-
ethers . wordlists . zh_tw Wordlist

The Traditional Chinese Wordlist.

\ No newline at end of file +
wordlist.getWordIndex( word ) number

Returns the index of word within the wordlist.

+ +
wordlist.split( mnemonic ) Array< string >

Returns the mnemonic split into each individual word, according to a locale's valid whitespace character set.

+ +
wordlist.join( words ) string

Returns the mnemonic by joining words together using the whitespace that is standard for the locale.

+ +
Wordlist.check( wordlists ) string< DataHexString< 32 > >

Checks that all words map both directions correctly and return the hash of the lists. Sub-classes should use this to validate the wordlist is correct against the official wordlist hash.

+ +
Wordlist.register( wordlist [ , name ] ) void

Register a wordlist with the list of wordlists, optionally overriding the registered name.

+ +

Languages

The official wordlists availalbe in at `ethers.wordlists`. In the browser, only the english langauge is available by default; to include the others (which increases the size of the library), see the dist files in the `ethers` package.

+ +
ethers.wordlists.cz Wordlist

The Czech Wordlist.

+ +
ethers.wordlists.en Wordlist

The English Wordlist.

+ +
ethers.wordlists.es Wordlist

The Spanish Wordlist.

+ +
ethers.wordlists.fr Wordlist

The French Wordlist.

+ +
ethers.wordlists.it Wordlist

The Italian Wordlist.

+ +
ethers.wordlists.ja Wordlist

The Japanese Wordlist.

+ +
ethers.wordlists.ko Wordlist

The Korean Wordlist.

+ +
ethers.wordlists.zh_cn Wordlist

The Simplified Chinese Wordlist.

+ +
ethers.wordlists.zh_tw Wordlist

The Traditional Chinese Wordlist.

+ +
+ + + +
+ + + diff --git a/docs/cli/README.md b/docs/cli/README.md index 4ddb43e78..acfaab94f 100644 --- a/docs/cli/README.md +++ b/docs/cli/README.md @@ -7,8 +7,6 @@ Documentation: [html](https://docs-beta.ethers.io/) Command Line Interfaces ======================= - - * [Sandbox Utility](ethers) * [Help](ethers) * [Examples](ethers) @@ -28,7 +26,3 @@ Command Line Interfaces * [Plugin](plugin) * [ArgParser](plugin) - - ------ -**Content Hash:** 6d3508b2651887d84014e0ad49384e9d90385f23e63d1543869f700b7fdb61c5 \ No newline at end of file diff --git a/docs/cli/asm/README.md b/docs/cli/asm/README.md index e7746147f..a3a0fe898 100644 --- a/docs/cli/asm/README.md +++ b/docs/cli/asm/README.md @@ -7,17 +7,9 @@ Documentation: [html](https://docs-beta.ethers.io/) Assembler ========= - -The assembler Command-Line utility allows you to assemble the -[Ethers ASM Dialect](../../api/other/assembly/dialect) into deployable EVM bytecode -and disassemle EVM bytecode into human-readable mnemonics. - - Help ---- - - ``` Usage: ethers-asm [ FILENAME ] [ OPTIONS ] @@ -35,20 +27,9 @@ OTHER OPTIONS --version Show this version and exit ``` - - Example Input Files ------------------- - - -#### **SimpleStore.asm** - - - - - - ``` ; SimpleStore (uint) @@ -95,53 +76,31 @@ return(0, #myContract) ; There is no *need* for the PUSH32, it just makes ; decompiled code look nicer @checksum[ - {{= (defines.checksum ? concat([ Opcode.from("PUSH32"), id(myContract.source) ]): "0x") }} + {{= (defines.checksum ? concat([ + Opcode.from("PUSH32"), + id(myContract.source) + ]): "0x") + }} ] } ``` - - -#### **SimpleStore.bin** - - - - - - ``` 0x602a6000556044601160003960446000f334601e5760003560e01c8063209652 0x5514602457806355241077146030575b60006000fd5b60005460005260206000 0xf35b6024361415601e5760043560005560006000f3 ``` - - #### Note: Bytecode File Syntax -A bin file may be made up of multiple blocks of bytecode, each may -optionally begin with a `0x` prefix, all of which **must** be of -even length (since bytes are required, with 2 nibbles per byte) +A bin file may be made up of multiple blocks of bytecode, each may optionally begin with a `0x` prefix, all of which **must** be of even length (since bytes are required, with 2 nibbles per byte) All whitespace is ignored. - - Assembler Examples ------------------ - -The assembler converts an [Ethers ASM Dialect](../../api/other/assembly/dialect) into -bytecode by running multiple passes of an assemble stage, each pass -more closely approximating the final result. - -This allows small portions of the bytecode to be massaged and tweaked -until the bytecode stablizes. This allows for more compact jump -destinations and for code to be include more advanced meta-programming -techniques. - - ``` /home/ethers> ethers-asm SimpleStore.asm 0x602a6000556044601160003960446000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f3 @@ -155,128 +114,92 @@ techniques. 0x602a6000556065601160003960656000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f37f10358310d664c9aeb4bf4ce7a10a6a03176bd23194c8ccbd3160a6dac90774d6 ``` - - ### Options - - #### **--define KEY=VALUE** *or* **--define FLAG** -This allows key/value pairs (where the value is a string) and -flags (which the value is `true`) to be passed along to the -assembler, which can be accessed in -[Scripting Blocks](../../api/other/assembly/dialect), such as `{{= defined.someKey }}`. - - +This allows key/value pairs (where the value is a string) and flags (which the value is `true`) to be passed along to the assembler, which can be accessed in [Scripting Blocks](/api/other/assembly/dialect/#asm-dialect-scripting), such as `{{= defined.someKey }}`. #### **--ignore-warnings** -By default any warning will be treated like an error. This enabled -by-passing warnings. - - +By default any warning will be treated like an error. This enabled by-passing warnings. #### **--pic** -When a program is assembled, the labels are usually given as an -absolute byte position, which can be jumped to for loops and -control flow. This means that a program must be installed at a specific -location. +When a program is assembled, the labels are usually given as an absolute byte position, which can be jumped to for loops and control flow. This means that a program must be installed at a specific location. -Byt specifying the **Position Independent Code** flag, code -will be generated in a way such that all offsets are relative, allowing -the program to be moved without any impact to its logic. +Byt specifying the **Position Independent Code** flag, code will be generated in a way such that all offsets are relative, allowing the program to be moved without any impact to its logic. This does incur an additional gsas cost of 8 gas per offset access though. - - #### **--target LABEL** -All programs have a root scope named `_` which is by default -assembled. This option allows another labelled target (either a -[Scopes](../../api/other/assembly/dialect) or a [Data Segment](../../api/other/assembly/dialect) to be -assembled instead. The entire program is still assembled per usual, -so this only impacts which part of the program is output. - - +All programs have a root scope named `_` which is by default assembled. This option allows another labelled target (either a [Scopes](/api/other/assembly/dialect/#asm-dialect-scope) or a [Data Segment](/api/other/assembly/dialect/#asm-dialect-datasegment) to be assembled instead. The entire program is still assembled per usual, so this only impacts which part of the program is output. Disassembler Examples --------------------- - -A disassembled program shows offsets and mnemonics for the given -bytecode. This format may change in the future to be more -human-readable. - - ``` /home/ethers> ethers-asm --disassemble SimpleStore.bin -0000 : 0x2a ; #1 -0002 : 0x00 ; #1 +0000 : 0x2a ; #1 +0002 : 0x00 ; #1 0004 : SSTORE -0005 : 0x44 ; #1 -0007 : 0x11 ; #1 -0009 : 0x00 ; #1 +0005 : 0x44 ; #1 +0007 : 0x11 ; #1 +0009 : 0x00 ; #1 000b : CODECOPY -000c : 0x44 ; #1 -000e : 0x00 ; #1 +000c : 0x44 ; #1 +000e : 0x00 ; #1 0010 : RETURN 0011 : CALLVALUE -0012 : 0x1e ; #1 +0012 : 0x1e ; #1 0014 : JUMPI -0015 : 0x00 ; #1 +0015 : 0x00 ; #1 0017 : CALLDATALOAD -0018 : 0xe0 ; #1 +0018 : 0xe0 ; #1 001a : SHR 001b : DUP1 -001c : 0x20965255 ; #4 +001c : 0x20965255 ; #4 0021 : EQ -0022 : 0x24 ; #1 +0022 : 0x24 ; #1 0024 : JUMPI 0025 : DUP1 -0026 : 0x55241077 ; #4 +0026 : 0x55241077 ; #4 002b : EQ -002c : 0x30 ; #1 +002c : 0x30 ; #1 002e : JUMPI 002f*: JUMPDEST -0030 : 0x00 ; #1 -0032 : 0x00 ; #1 +0030 : 0x00 ; #1 +0032 : 0x00 ; #1 0034 : REVERT 0035*: JUMPDEST -0036 : 0x00 ; #1 +0036 : 0x00 ; #1 0038 : SLOAD -0039 : 0x00 ; #1 +0039 : 0x00 ; #1 003b : MSTORE -003c : 0x20 ; #1 -003e : 0x00 ; #1 +003c : 0x20 ; #1 +003e : 0x00 ; #1 0040 : RETURN 0041*: JUMPDEST -0042 : 0x24 ; #1 +0042 : 0x24 ; #1 0044 : CALLDATASIZE 0045 : EQ 0046 : ISZERO -0047 : 0x1e ; #1 +0047 : 0x1e ; #1 0049 : JUMPI -004a : 0x04 ; #1 +004a : 0x04 ; #1 004c : CALLDATALOAD -004d : 0x00 ; #1 +004d : 0x00 ; #1 004f : SSTORE -0050 : 0x00 ; #1 -0052 : 0x00 ; #1 +0050 : 0x00 ; #1 +0052 : 0x00 ; #1 0054 : RETURN -/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble +/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble # Same as above ``` - - - ------ -**Content Hash:** a948279ca64461ea65339332c81e2ae6705ff5eae5cf930e8ddd78e80739746e \ No newline at end of file diff --git a/docs/cli/asm/index.html b/docs/cli/asm/index.html index b1b94ad99..9516a7645 100644 --- a/docs/cli/asm/index.html +++ b/docs/cli/asm/index.html @@ -1,29 +1,187 @@ -Assembler

Assembler

-

The assembler Command-Line utility allows you to assemble the Ethers ASM Dialect into deployable EVM bytecode and disassemle EVM bytecode into human-readable mnemonics.

-

Help

+ + + + Assembler + + + + +
+ -
Usage:
   ethers-asm [ FILENAME ] [ OPTIONS ]

OPTIONS
  --define KEY=VALUE          provide assembler defines
  --disassemble               Disassemble input bytecode
  --ignore-warnings           Ignore warnings
  --pic                       generate position independent code
  --target LABEL              output LABEL bytecode (default: _)

OTHER OPTIONS
  --debug                     Show stack traces for errors
  --help                      Show this usage and exit
  --version                   Show this version and exit
+

Assembler

The assembler Command-Line utility allows you to assemble the Ethers ASM Dialect into deployable EVM bytecode and disassemle EVM bytecode into human-readable mnemonics.

-

Example Input Files

+

Help

+
Usage: + ethers-asm [ FILENAME ] [ OPTIONS ] -
SimpleStore.asm

-
; SimpleStore (uint)

; Set the inital value of 42
sstore(0, 42)

; Init code to deploy myContract
codecopy(0, $myContract, #myContract)
return(0, #myContract)

@myContract {
    ; Non-payable
    jumpi($error, callvalue)

    ; Get the Sighash
    shr({{= 256 - 32 }}, calldataload(0))

    ; getValue()
    dup1
    {{= sighash("getValue()") }}
    jumpi($getValue, eq)

    ; setValue(uint)
    dup1
    {{= sighash("setValue(uint)") }}
    jumpi($setValue, eq)

    ; No matching signature
    @error:
        revert(0, 0)

    @getValue:
        mstore(0, sload(0))
        return (0, 32)

    @setValue:
        ; Make sure we have exactly a uint
        jumpi($error, iszero(eq(calldatasize, 36)))

        ; Store the value
        sstore(0, calldataload(4))
        return (0, 0)

    ; There is no *need* for the PUSH32, it just makes
    ; decompiled code look nicer
    @checksum[
        {{= (defines.checksum ? concat([ Opcode.from("PUSH32"), id(myContract.source) ]): "0x") }}
    ]
}
+OPTIONS + --define KEY=VALUE provide assembler defines + --disassemble Disassemble input bytecode + --ignore-warnings Ignore warnings + --pic generate position independent code + --target LABEL output LABEL bytecode (default: _) -
SimpleStore.bin

-
0x602a6000556044601160003960446000f334601e5760003560e01c8063209652
0x5514602457806355241077146030575b60006000fd5b60005460005260206000
0xf35b6024361415601e5760043560005560006000f3
+OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit

Example Input Files

+
SimpleStore.asm
; SimpleStore (uint) -
Note: Bytecode File Syntax

A bin file may be made up of multiple blocks of bytecode, each may optionally begin with a 0x prefix, all of which must be of even length (since bytes are required, with 2 nibbles per byte)

All whitespace is ignored.

-

Assembler Examples

-

The assembler converts an Ethers ASM Dialect into bytecode by running multiple passes of an assemble stage, each pass more closely approximating the final result.

This allows small portions of the bytecode to be massaged and tweaked until the bytecode stablizes. This allows for more compact jump destinations and for code to be include more advanced meta-programming techniques.

-
/home/ethers> ethers-asm SimpleStore.asm
0x602a6000556044601160003960446000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f3

# Piping in ASM source code
/home/ethers> cat SimpleStore.asm | ethers-asm
# Same as above

# Setting a define which the ASM file checks and adds a checksum
/home/ethers> ethers-asm --define checksum SimpleStore.asm
0x602a6000556065601160003960656000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f37f10358310d664c9aeb4bf4ce7a10a6a03176bd23194c8ccbd3160a6dac90774d6
+; Set the inital value of 42 +sstore(0, 42) -

Options

+; Init code to deploy myContract +codecopy(0, $myContract, #myContract) +return(0, #myContract) -
--define KEY=VALUE or --define FLAG

This allows key/value pairs (where the value is a string) and flags (which the value is true) to be passed along to the assembler, which can be accessed in Scripting Blocks, such as {{= defined.someKey }}.

-
--ignore-warnings

By default any warning will be treated like an error. This enabled by-passing warnings.

-
--pic

When a program is assembled, the labels are usually given as an absolute byte position, which can be jumped to for loops and control flow. This means that a program must be installed at a specific location.

Byt specifying the Position Independent Code flag, code will be generated in a way such that all offsets are relative, allowing the program to be moved without any impact to its logic.

This does incur an additional gsas cost of 8 gas per offset access though.

-
--target LABEL

All programs have a root scope named _ which is by default assembled. This option allows another labelled target (either a Scopes or a Data Segment to be assembled instead. The entire program is still assembled per usual, so this only impacts which part of the program is output.

-

Disassembler Examples

-

A disassembled program shows offsets and mnemonics for the given bytecode. This format may change in the future to be more human-readable.

-
/home/ethers> ethers-asm --disassemble SimpleStore.bin
0000 : 0x2a                                                               ; #1 
0002 : 0x00                                                               ; #1 
0004 : SSTORE
0005 : 0x44                                                               ; #1 
0007 : 0x11                                                               ; #1 
0009 : 0x00                                                               ; #1 
000b : CODECOPY
000c : 0x44                                                               ; #1 
000e : 0x00                                                               ; #1 
0010 : RETURN
0011 : CALLVALUE
0012 : 0x1e                                                               ; #1 
0014 : JUMPI
0015 : 0x00                                                               ; #1 
0017 : CALLDATALOAD
0018 : 0xe0                                                               ; #1 
001a : SHR
001b : DUP1
001c : 0x20965255                                                         ; #4 
0021 : EQ
0022 : 0x24                                                               ; #1 
0024 : JUMPI
0025 : DUP1
0026 : 0x55241077                                                         ; #4 
002b : EQ
002c : 0x30                                                               ; #1 
002e : JUMPI
002f*: JUMPDEST
0030 : 0x00                                                               ; #1 
0032 : 0x00                                                               ; #1 
0034 : REVERT
0035*: JUMPDEST
0036 : 0x00                                                               ; #1 
0038 : SLOAD
0039 : 0x00                                                               ; #1 
003b : MSTORE
003c : 0x20                                                               ; #1 
003e : 0x00                                                               ; #1 
0040 : RETURN
0041*: JUMPDEST
0042 : 0x24                                                               ; #1 
0044 : CALLDATASIZE
0045 : EQ
0046 : ISZERO
0047 : 0x1e                                                               ; #1 
0049 : JUMPI
004a : 0x04                                                               ; #1 
004c : CALLDATALOAD
004d : 0x00                                                               ; #1 
004f : SSTORE
0050 : 0x00                                                               ; #1 
0052 : 0x00                                                               ; #1 
0054 : RETURN

/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble 
# Same as above
-
\ No newline at end of file +@myContract { + ; Non-payable + jumpi($error, callvalue) + + ; Get the Sighash + shr({{= 256 - 32 }}, calldataload(0)) + + ; getValue() + dup1 + {{= sighash("getValue()") }} + jumpi($getValue, eq) + + ; setValue(uint) + dup1 + {{= sighash("setValue(uint)") }} + jumpi($setValue, eq) + + ; No matching signature + @error: + revert(0, 0) + + @getValue: + mstore(0, sload(0)) + return (0, 32) + + @setValue: + ; Make sure we have exactly a uint + jumpi($error, iszero(eq(calldatasize, 36))) + + ; Store the value + sstore(0, calldataload(4)) + return (0, 0) + + ; There is no *need* for the PUSH32, it just makes + ; decompiled code look nicer + @checksum[ + {{= (defines.checksum ? concat([ + Opcode.from("PUSH32"), + id(myContract.source) + ]): "0x") + }} + ] +}
SimpleStore.bin
0x602a6000556044601160003960446000f334601e5760003560e01c8063209652 +0x5514602457806355241077146030575b60006000fd5b60005460005260206000 +0xf35b6024361415601e5760043560005560006000f3
Note: Bytecode File Syntax

A bin file may be made up of multiple blocks of bytecode, each may optionally begin with a 0x prefix, all of which must be of even length (since bytes are required, with 2 nibbles per byte)

+ +

All whitespace is ignored.

+ +

Assembler Examples

The assembler converts an Ethers ASM Dialect into bytecode by running multiple passes of an assemble stage, each pass more closely approximating the final result.

+ +

This allows small portions of the bytecode to be massaged and tweaked until the bytecode stablizes. This allows for more compact jump destinations and for code to be include more advanced meta-programming techniques.

+ +
/home/ethers> ethers-asm SimpleStore.asm +0x602a6000556044601160003960446000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f3 + +# Piping in ASM source code +/home/ethers> cat SimpleStore.asm | ethers-asm +# Same as above + +# Setting a define which the ASM file checks and adds a checksum +/home/ethers> ethers-asm --define checksum SimpleStore.asm +0x602a6000556065601160003960656000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f37f10358310d664c9aeb4bf4ce7a10a6a03176bd23194c8ccbd3160a6dac90774d6

Options

+
--define KEY=VALUE or --define FLAG

This allows key/value pairs (where the value is a string) and flags (which the value is true) to be passed along to the assembler, which can be accessed in Scripting Blocks, such as {{= defined.someKey }}.

+ +
--ignore-warnings

By default any warning will be treated like an error. This enabled by-passing warnings.

+ +
--pic

When a program is assembled, the labels are usually given as an absolute byte position, which can be jumped to for loops and control flow. This means that a program must be installed at a specific location.

+ +

Byt specifying the Position Independent Code flag, code will be generated in a way such that all offsets are relative, allowing the program to be moved without any impact to its logic.

+ +

This does incur an additional gsas cost of 8 gas per offset access though.

+ +
--target LABEL

All programs have a root scope named _ which is by default assembled. This option allows another labelled target (either a Scopes or a Data Segment to be assembled instead. The entire program is still assembled per usual, so this only impacts which part of the program is output.

+ +

Disassembler Examples

A disassembled program shows offsets and mnemonics for the given bytecode. This format may change in the future to be more human-readable.

+ +
/home/ethers> ethers-asm --disassemble SimpleStore.bin +0000 : 0x2a ; #1 +0002 : 0x00 ; #1 +0004 : SSTORE +0005 : 0x44 ; #1 +0007 : 0x11 ; #1 +0009 : 0x00 ; #1 +000b : CODECOPY +000c : 0x44 ; #1 +000e : 0x00 ; #1 +0010 : RETURN +0011 : CALLVALUE +0012 : 0x1e ; #1 +0014 : JUMPI +0015 : 0x00 ; #1 +0017 : CALLDATALOAD +0018 : 0xe0 ; #1 +001a : SHR +001b : DUP1 +001c : 0x20965255 ; #4 +0021 : EQ +0022 : 0x24 ; #1 +0024 : JUMPI +0025 : DUP1 +0026 : 0x55241077 ; #4 +002b : EQ +002c : 0x30 ; #1 +002e : JUMPI +002f*: JUMPDEST +0030 : 0x00 ; #1 +0032 : 0x00 ; #1 +0034 : REVERT +0035*: JUMPDEST +0036 : 0x00 ; #1 +0038 : SLOAD +0039 : 0x00 ; #1 +003b : MSTORE +003c : 0x20 ; #1 +003e : 0x00 ; #1 +0040 : RETURN +0041*: JUMPDEST +0042 : 0x24 ; #1 +0044 : CALLDATASIZE +0045 : EQ +0046 : ISZERO +0047 : 0x1e ; #1 +0049 : JUMPI +004a : 0x04 ; #1 +004c : CALLDATALOAD +004d : 0x00 ; #1 +004f : SSTORE +0050 : 0x00 ; #1 +0052 : 0x00 ; #1 +0054 : RETURN + +/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble +# Same as above
+ + + +
+ + + diff --git a/docs/cli/ens/README.md b/docs/cli/ens/README.md index ece3eab25..6f9eac6da 100644 --- a/docs/cli/ens/README.md +++ b/docs/cli/ens/README.md @@ -7,13 +7,9 @@ Documentation: [html](https://docs-beta.ethers.io/) Ethereum Naming Service ======================= - - Help ---- - - ``` Usage: ethers-ens COMMAND [ ARGS ] [ OPTIONS ] @@ -86,15 +82,6 @@ OTHER OPTIONS your bash history file. This is NOT recommended. ``` - - Examples -------- - -TODO examples - - - ------ -**Content Hash:** d7930b78b29531a5f2ea467260bd5f809711fd1747a4c0d5781708c1c4db867e \ No newline at end of file diff --git a/docs/cli/ens/index.html b/docs/cli/ens/index.html index 57855e0ef..a081efda5 100644 --- a/docs/cli/ens/index.html +++ b/docs/cli/ens/index.html @@ -1,8 +1,101 @@ -Ethereum Naming Service

Ethereum Naming Service

+ + + + Ethereum Naming Service + + + + +
+ -

Help

+

Ethereum Naming Service

+

Help

+
Usage: + ethers-ens COMMAND [ ARGS ] [ OPTIONS ] -
Usage:
   ethers-ens COMMAND [ ARGS ] [ OPTIONS ]

COMMANDS
   lookup [ NAME | ADDRESS [ ... ] ]
                              Lookup a name or address
   commit NAME                Submit a pre-commitment
      [ --duration DAYS ]        Register duration (default: 365 days)
      [ --salt SALT ]            SALT to blind the commit with
      [ --secret SECRET ]        Use id(SECRET) as the salt
      [ --owner OWNER ]          The target owner (default: current account)
   reveal NAME                Reveal a previous pre-commitment
      [ --duration DAYS ]        Register duration (default: 365 days)
      [ --salt SALT ]            SALT to blind the commit with
      [ --secret SECRET ]        Use id(SECRET) as the salt
      [ --owner OWNER ]          The target owner (default: current account)
   set-controller NAME        Set the controller (default: current account)
      [ --address ADDRESS ]      Specify another address
   set-subnode NAME           Set a subnode owner (default: current account)
      [ --address ADDRESS ]      Specify another address
   set-resolver NAME          Set the resolver (default: resolver.eth)
      [ --address ADDRESS ]      Specify another address
   set-addr NAME              Set the addr record (default: current account)
      [ --address ADDRESS ]      Specify another address
   set-text NAME KEY VALUE    Set a text record
   set-email NAME EMAIL       Set the email text record
   set-website NAME URL       Set the website text record
   set-content NAME HASH      Set the IPFS Content Hash
   migrate-registrar NAME     Migrate from the Legacy to the Permanent Registrar
   transfer NAME NEW_OWNER    Transfer registrant ownership
   reclaim NAME               Reset the controller by the registrant
      [ --address ADDRESS ]      Specify another address

ACCOUNT OPTIONS
  --account FILENAME          Load from a file (JSON, RAW or mnemonic)
  --account RAW_KEY           Use a private key (insecure *)
  --account 'MNEMONIC'        Use a mnemonic (insecure *)
  --account -                 Use secure entry for a raw key or mnemonic
  --account-void ADDRESS      Use an address as a void signer
  --account-void ENS_NAME     Add the resolved address as a void signer
  --account-rpc ADDRESS       Add the address from a JSON-RPC provider
  --account-rpc INDEX         Add the index from a JSON-RPC provider
  --mnemonic-password         Prompt for a password for mnemonics
  --xxx-mnemonic-password     Prompt for a (experimental) hard password

PROVIDER OPTIONS (default: all + homestead)
  --alchemy                   Include Alchemy
  --etherscan                 Include Etherscan
  --infura                    Include INFURA
  --nodesmith                 Include nodesmith
  --rpc URL                   Include a custom JSON-RPC
  --offline                   Dump signed transactions (no send)
  --network NETWORK           Network to connect to (default: homestead)

TRANSACTION OPTIONS (default: query network)
  --gasPrice GWEI             Default gas price for transactions(in wei)
  --gasLimit GAS              Default gas limit for transactions
  --nonce NONCE               Initial nonce for the first transaction
  --yes                       Always accept Siging and Sending

OTHER OPTIONS
  --wait                      Wait until transactions are mined
  --debug                     Show stack traces for errors
  --help                      Show this usage and exit
  --version                   Show this version and exit

(*) By including mnemonics or private keys on the command line they are
    possibly readable by other users on your system and may get stored in
    your bash history file. This is NOT recommended.
+COMMANDS + lookup [ NAME | ADDRESS [ ... ] ] + Lookup a name or address + commit NAME Submit a pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + reveal NAME Reveal a previous pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + set-controller NAME Set the controller (default: current account) + [ --address ADDRESS ] Specify another address + set-subnode NAME Set a subnode owner (default: current account) + [ --address ADDRESS ] Specify another address + set-resolver NAME Set the resolver (default: resolver.eth) + [ --address ADDRESS ] Specify another address + set-addr NAME Set the addr record (default: current account) + [ --address ADDRESS ] Specify another address + set-text NAME KEY VALUE Set a text record + set-email NAME EMAIL Set the email text record + set-website NAME URL Set the website text record + set-content NAME HASH Set the IPFS Content Hash + migrate-registrar NAME Migrate from the Legacy to the Permanent Registrar + transfer NAME NEW_OWNER Transfer registrant ownership + reclaim NAME Reset the controller by the registrant + [ --address ADDRESS ] Specify another address -

Examples

-

TODO examples

\ No newline at end of file +ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password + +PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) + +TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending + +OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

TODO examples

+ + + + + +
+ + + diff --git a/docs/cli/ethers/README.md b/docs/cli/ethers/README.md index 4810a83fc..b9130d8b4 100644 --- a/docs/cli/ethers/README.md +++ b/docs/cli/ethers/README.md @@ -7,20 +7,9 @@ Documentation: [html](https://docs-beta.ethers.io/) Sandbox Utility =============== - -The sandbox utility provides a simple way to use the most common -ethers utilities required during learning, debuging and managing -interactions with the Ethereum network. - -If no command is given, it will enter a REPL interface with many -of the ethers utilities already exposed. - - Help ---- - - ``` Usage: ethers [ COMMAND ] [ ARGS ] [ OPTIONS ] @@ -89,17 +78,9 @@ OTHER OPTIONS your bash history file. This is NOT recommended. ``` - - Examples -------- - - -### Creating Wallets - - - ``` /home/ethers> ethers init wallet.json Creating a new JSON Wallet - wallet.json @@ -117,12 +98,6 @@ Saved: wallet.json Transaction Hash: 0x8dc55b8f8dc8076acded97f9e3ed7d6162460c0221e2769806006b6d7d1156e0 ``` - - -### Sending Ether and Tokens - - - ``` # Sending ether /home/ricmoo> ethers --account wallet.json send ricmoo.firefly.eth 0.123 @@ -169,12 +144,6 @@ Response: Hash: 0xd609ecb7e3b5e8d36fd781dffceede3975ece6774b6322ea56cf1e4d0a17e3a1 ``` - - -### Signing Messages - - - ``` /home/ethers> ethers --account wallet.json sign-message 'Hello World' Password (wallet.json): ****** @@ -192,51 +161,60 @@ Signature recid: 0 ``` - - ### Scripting - -The `eval` command can be used to execute simple one-line scripts from -the command line to be passed into other commands or stored in script -environment variables. - +``` +/home/ethers> ethers --network ropsten \ + --account wallet.json \ + eval \ + 'accounts[0].getBalance().then(b => formatEther(b))' +3.141592653589793238 +``` ``` -# Get the formatted balance of an account -/home/ethers> ethers --network ropsten --account wallet.json eval 'accounts[0].getBalance().then(b => formatEther(b))' -3.141592653589793238 - -# Get the current block number -/home/ethers> ethers --network rinkeby eval "provider.getBlockNumber()" +/home/ethers> ethers --network rinkeby \ + eval "provider.getBlockNumber()" 5761009 +``` -# Convert a Solidity signature to JSON -/home/ethers> ethers eval 'utils.Fragment.from("function balanceOf(address owner) view returns (uint)").format("json")' -{"type":"function","name":"balanceOf","constant":true,"stateMutability":"view","payble":false,"inputs":[{"type":"address","name":"owner"}],"ouputs":[{"type":"uint256"}]} +``` +/home/ethers> ethers eval 'utils.Fragment.from( + "function balanceOf(address) view returns (uint)" + ).format("json")' | json_pp +{ + "inputs" : [ + { + "type" : "address", + "name" : "owner" + } + ], + "type" : "function", + "payble" : false, + "stateMutability" : "view", + "ouputs" : [ + { + "type" : "uint256" + } + ], + "name" : "balanceOf", + "constant" : true +} +``` -# Compute a topic hash +``` /home/ricmoo> ethers eval 'id("Transfer(address,address,uint256")' 0xd99659a21de82e379975ce8df556f939a4ccb95e92144f38bb0dd35730ffcdd5 +``` -# Create a random mnemonic +``` /home/ricmoo> ethers eval 'Wallet.createRandom().mnemonic' useful pond inch knock ritual matrix giggle attend dilemma convince coach amazing ``` - - ### Using Mnemonics (with a password) - -All mnemonic phrases have a password, but the default is to use the empty -string (i.e. `""`) as the password. If you have a password on your -mnemonic, the `--mnemonic-password` will prompt for the password to -use to decrypt the account. - - ``` -/home/ricmoo> ethers --account public-mnemonic.txt --mnemonic-password +/home/ricmoo> ethers --account mnemonic.txt --mnemonic-password Password (mnemonic): ****** network: homestead (chainId: 1) homestead> accounts[0].getAddress() @@ -245,18 +223,8 @@ homestead> accounts[0].getAddress() homestead> ``` - - ### Using Mnemonics (with experimental memory-hard passwords) - -The `--xxx-mnemonic-password` is similar to the `--mnemonic-password` options, -which uses a password to decrypt the account for a mnemonic, however it passes -the password through the [scrypt](../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Scrypt) -*password-based key derivation function* first, which is intentionally slow and makes -a brute-force attack far more difficult. - - ``` /home/ricmoo> ethers --account mnemonic.txt --xxx-mnemonic-password Password (mnemonic; experimental - hard): ****** @@ -268,15 +236,8 @@ homestead> accounts[0].getAddress() homestead> ``` - - #### Note This is still an experimental feature (hence the `xxx`). - - - ------ -**Content Hash:** 634cbc81bb5078d3676f94600cb7b4083777ff1b02e4681ae52ad62e5962bf5a \ No newline at end of file diff --git a/docs/cli/ethers/index.html b/docs/cli/ethers/index.html index 71f0d68b0..22fd7c36f 100644 --- a/docs/cli/ethers/index.html +++ b/docs/cli/ethers/index.html @@ -1,33 +1,216 @@ -Sandbox Utility

Sandbox Utility

-

The sandbox utility provides a simple way to use the most common ethers utilities required during learning, debuging and managing interactions with the Ethereum network.

If no command is given, it will enter a REPL interface with many of the ethers utilities already exposed.

-

Help

+ + + + Sandbox Utility + + + + +
+ -
Usage:
   ethers [ COMMAND ] [ ARGS ] [ OPTIONS ]

COMMANDS (default: sandbox)
   sandbox                    Run a REPL VM environment with ethers
   init FILENAME              Create a new JSON wallet
      [ --force ]                Overwrite any existing files
   fund TARGET                Fund TARGET with testnet ether
   info [ TARGET ... ]        Dump info for accounts, addresses and ENS names
   send TARGET ETHER          Send ETHER ether to TARGET form accounts[0]
      [ --allow-zero ]           Allow sending to the address zero
      [ --data DATA ]            Include data in the transaction
   sweep TARGET               Send all ether from accounts[0] to TARGET
   sign-message MESSAGE       Sign a MESSAGE with accounts[0]
      [ --hex ]                  The message content is hex encoded
   eval CODE                  Run CODE in a VM with ethers
   run FILENAME               Run FILENAME in a VM with ethers
   wait HASH                  Wait for a transaction HASH to be mined
   wrap-ether VALUE           Deposit VALUE into Wrapped Ether (WETH)
   unwrap-ether VALUE         Withdraw VALUE from Wrapped Ether (WETH)
   send-token TOKEN ADDRESS VALUE
                              Send VALUE tokens (at TOKEN) to ADDRESS
   compile FILENAME           Compiles a Solidity contract
      [ --no-optimize ]          Do not optimize the compiled output
      [ --warnings ]             Error on any warning
   deploy FILENAME            Compile and deploy a Solidity contract
      [ --no-optimize ]          Do not optimize the compiled output
      [ --contract NAME ]        Specify the contract to deploy

ACCOUNT OPTIONS
  --account FILENAME          Load from a file (JSON, RAW or mnemonic)
  --account RAW_KEY           Use a private key (insecure *)
  --account 'MNEMONIC'        Use a mnemonic (insecure *)
  --account -                 Use secure entry for a raw key or mnemonic
  --account-void ADDRESS      Use an address as a void signer
  --account-void ENS_NAME     Add the resolved address as a void signer
  --account-rpc ADDRESS       Add the address from a JSON-RPC provider
  --account-rpc INDEX         Add the index from a JSON-RPC provider
  --mnemonic-password         Prompt for a password for mnemonics
  --xxx-mnemonic-password     Prompt for a (experimental) hard password

PROVIDER OPTIONS (default: all + homestead)
  --alchemy                   Include Alchemy
  --etherscan                 Include Etherscan
  --infura                    Include INFURA
  --nodesmith                 Include nodesmith
  --rpc URL                   Include a custom JSON-RPC
  --offline                   Dump signed transactions (no send)
  --network NETWORK           Network to connect to (default: homestead)

TRANSACTION OPTIONS (default: query network)
  --gasPrice GWEI             Default gas price for transactions(in wei)
  --gasLimit GAS              Default gas limit for transactions
  --nonce NONCE               Initial nonce for the first transaction
  --yes                       Always accept Siging and Sending

OTHER OPTIONS
  --wait                      Wait until transactions are mined
  --debug                     Show stack traces for errors
  --help                      Show this usage and exit
  --version                   Show this version and exit

(*) By including mnemonics or private keys on the command line they are
    possibly readable by other users on your system and may get stored in
    your bash history file. This is NOT recommended.
+

Sandbox Utility

The sandbox utility provides a simple way to use the most common ethers utilities required during learning, debuging and managing interactions with the Ethereum network.

-

Examples

+

If no command is given, it will enter a REPL interface with many of the ethers utilities already exposed.

-

Creating Wallets

+

Help

+
Usage: + ethers [ COMMAND ] [ ARGS ] [ OPTIONS ] -
/home/ethers> ethers init wallet.json
Creating a new JSON Wallet - wallet.json
Keep this password and file SAFE!! If lost or forgotten
it CANNOT be recovered, by ANYone, EVER.
Choose a password: ******
Confirm password: ******
Encrypting... 100%
New account address: 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003
Saved:               wallet.json


# If you are planning to try out the Ropsten testnet...
/home/ethers> ethers --network ropsten fund 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003
Transaction Hash: 0x8dc55b8f8dc8076acded97f9e3ed7d6162460c0221e2769806006b6d7d1156e0
+COMMANDS (default: sandbox) + sandbox Run a REPL VM environment with ethers + init FILENAME Create a new JSON wallet + [ --force ] Overwrite any existing files + fund TARGET Fund TARGET with testnet ether + info [ TARGET ... ] Dump info for accounts, addresses and ENS names + send TARGET ETHER Send ETHER ether to TARGET form accounts[0] + [ --allow-zero ] Allow sending to the address zero + [ --data DATA ] Include data in the transaction + sweep TARGET Send all ether from accounts[0] to TARGET + sign-message MESSAGE Sign a MESSAGE with accounts[0] + [ --hex ] The message content is hex encoded + eval CODE Run CODE in a VM with ethers + run FILENAME Run FILENAME in a VM with ethers + wait HASH Wait for a transaction HASH to be mined + wrap-ether VALUE Deposit VALUE into Wrapped Ether (WETH) + unwrap-ether VALUE Withdraw VALUE from Wrapped Ether (WETH) + send-token TOKEN ADDRESS VALUE + Send VALUE tokens (at TOKEN) to ADDRESS + compile FILENAME Compiles a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --warnings ] Error on any warning + deploy FILENAME Compile and deploy a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --contract NAME ] Specify the contract to deploy -

Sending Ether and Tokens

+ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password -
# Sending ether
/home/ricmoo> ethers --account wallet.json send ricmoo.firefly.eth 0.123
Password (wallet.json): ******
Decrypting... 100%
Transaction:
  To:         0x8ba1f109551bD432803012645Ac136ddd64DBA72
  From:       0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C
  Value:      0.123 ether
  Nonce:      96
  Data:       0x
  Gas Limit:  21000
  Gas Price:  1.2 gwei
  Chain ID:   1
  Network:    homestead
Send Transaction? (y/N/a) y
Response:
  Hash:  0xc4adf8b379033d7ab679d199aa35e6ceee9a802ca5ab0656af067e911c4a589a


# Sending a token (SAI)
# NOTE: the contract address could be used instead but
#       popular token contract addresses are also managed
#       by ethers
/home/ricmoo> ethers --account wallet.json send-token sai.tokens.ethers.eth ricmoo.firefly.eth 1.0
Sending Tokens:
  To:              0x8ba1f109551bD432803012645Ac136ddd64DBA72
  Token Contract:  0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359
  Value:           1.0
Password (wallet.json): ******
Decrypting... 100%
Transaction:
  To:         0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359
  From:       0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C
  Value:      0.0 ether
  Nonce:      95
  Data:       0xa9059cbb0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000
  Gas Limit:  37538
  Gas Price:  1.0 gwei
  Chain ID:   1
  Network:    homestead
Send Transaction? (y/N/a) y
Response:
  Hash:  0xd609ecb7e3b5e8d36fd781dffceede3975ece6774b6322ea56cf1e4d0a17e3a1
+PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) -

Signing Messages

+TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending -
/home/ethers> ethers --account wallet.json sign-message 'Hello World'
Password (wallet.json): ******
Decrypting... 100%
Message:
  Message:        "Hello World"
  Message (hex):  0x48656c6c6f20576f726c64
Sign Message? (y/N/a) y
Signature
  Flat:   0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a161b
  r:      0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb
  s:      0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16
  vs:     0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16
  v:      27
  recid:  0
+OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit -

Scripting

-

The eval command can be used to execute simple one-line scripts from the command line to be passed into other commands or stored in script environment variables.

-
# Get the formatted balance of an account
/home/ethers> ethers --network ropsten --account wallet.json eval 'accounts[0].getBalance().then(b => formatEther(b))'
3.141592653589793238

# Get the current block number
/home/ethers> ethers --network rinkeby eval "provider.getBlockNumber()"
5761009

# Convert a Solidity signature to JSON
/home/ethers> ethers eval 'utils.Fragment.from("function balanceOf(address owner) view returns (uint)").format("json")' 
{"type":"function","name":"balanceOf","constant":true,"stateMutability":"view","payble":false,"inputs":[{"type":"address","name":"owner"}],"ouputs":[{"type":"uint256"}]}

# Compute a topic hash
/home/ricmoo> ethers eval 'id("Transfer(address,address,uint256")'
0xd99659a21de82e379975ce8df556f939a4ccb95e92144f38bb0dd35730ffcdd5

# Create a random mnemonic
/home/ricmoo> ethers eval 'Wallet.createRandom().mnemonic'
useful pond inch knock ritual matrix giggle attend dilemma convince coach amazing
+(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

+
Creating New Wallets
/home/ethers> ethers init wallet.json +Creating a new JSON Wallet - wallet.json +Keep this password and file SAFE!! If lost or forgotten +it CANNOT be recovered, by ANYone, EVER. +Choose a password: ****** +Confirm password: ****** +Encrypting... 100% +New account address: 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Saved: wallet.json -

Using Mnemonics (with a password)

-

All mnemonic phrases have a password, but the default is to use the empty string (i.e. "") as the password. If you have a password on your mnemonic, the --mnemonic-password will prompt for the password to use to decrypt the account.

-
/home/ricmoo> ethers --account public-mnemonic.txt --mnemonic-password
Password (mnemonic): ******
network: homestead (chainId: 1)
homestead> accounts[0].getAddress()
<Promise id=0 resolved>
'0x6d3F723EC1B73141AA4aC248c3ab34A5a1DAD776'
homestead>
-

Using Mnemonics (with experimental memory-hard passwords)

-

The --xxx-mnemonic-password is similar to the --mnemonic-password options, which uses a password to decrypt the account for a mnemonic, however it passes the password through the scrypt password-based key derivation function first, which is intentionally slow and makes a brute-force attack far more difficult.

-
/home/ricmoo> ethers --account mnemonic.txt --xxx-mnemonic-password
Password (mnemonic; experimental - hard): ******
Decrypting... 100%
network: homestead (chainId: 1)
homestead> accounts[0].getAddress()
<Promise id=0 resolved>
'0x56FC8792cC17971C19bEC4Ced978beEA44711EeD'
homestead>
+# If you are planning to try out the Ropsten testnet... +/home/ethers> ethers --network ropsten fund 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Transaction Hash: 0x8dc55b8f8dc8076acded97f9e3ed7d6162460c0221e2769806006b6d7d1156e0
Sending Ether and Tokens
# Sending ether +/home/ricmoo> ethers --account wallet.json send ricmoo.firefly.eth 0.123 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.123 ether + Nonce: 96 + Data: 0x + Gas Limit: 21000 + Gas Price: 1.2 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xc4adf8b379033d7ab679d199aa35e6ceee9a802ca5ab0656af067e911c4a589a -
Note

This is still an experimental feature (hence the xxx).

\ No newline at end of file + +# Sending a token (SAI) +# NOTE: the contract address could be used instead but +# popular token contract addresses are also managed +# by ethers +/home/ricmoo> ethers --account wallet.json send-token sai.tokens.ethers.eth ricmoo.firefly.eth 1.0 +Sending Tokens: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + Token Contract: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + Value: 1.0 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.0 ether + Nonce: 95 + Data: 0xa9059cbb0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000 + Gas Limit: 37538 + Gas Price: 1.0 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xd609ecb7e3b5e8d36fd781dffceede3975ece6774b6322ea56cf1e4d0a17e3a1
Signing Messages
/home/ethers> ethers --account wallet.json sign-message 'Hello World' +Password (wallet.json): ****** +Decrypting... 100% +Message: + Message: "Hello World" + Message (hex): 0x48656c6c6f20576f726c64 +Sign Message? (y/N/a) y +Signature + Flat: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a161b + r: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb + s: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + vs: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + v: 27 + recid: 0

Scripting

The eval command can be used to execute simple one-line scripts from the command line to be passed into other commands or stored in script environment variables.

+ +
Get the formatted balance of an account
/home/ethers> ethers --network ropsten \ + --account wallet.json \ + eval \ + 'accounts[0].getBalance().then(b => formatEther(b))' +3.141592653589793238
Get the current block number
/home/ethers> ethers --network rinkeby \ + eval "provider.getBlockNumber()" +5761009
Convert a Solidity signature to JSON
/home/ethers> ethers eval 'utils.Fragment.from( + "function balanceOf(address) view returns (uint)" + ).format("json")' | json_pp +{ + "inputs" : [ + { + "type" : "address", + "name" : "owner" + } + ], + "type" : "function", + "payble" : false, + "stateMutability" : "view", + "ouputs" : [ + { + "type" : "uint256" + } + ], + "name" : "balanceOf", + "constant" : true +}
Compute a topic hash
/home/ricmoo> ethers eval 'id("Transfer(address,address,uint256")' +0xd99659a21de82e379975ce8df556f939a4ccb95e92144f38bb0dd35730ffcdd5
Create a random mnemonic
/home/ricmoo> ethers eval 'Wallet.createRandom().mnemonic' +useful pond inch knock ritual matrix giggle attend dilemma convince coach amazing

Using Mnemonics (with a password)

All mnemonic phrases have a password, but the default is to use the empty string (i.e. "") as the password. If you have a password on your mnemonic, the --mnemonic-password will prompt for the password to use to decrypt the account.

+ +
/home/ricmoo> ethers --account mnemonic.txt --mnemonic-password +Password (mnemonic): ****** +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() +<Promise id=0 resolved> +'0x6d3F723EC1B73141AA4aC248c3ab34A5a1DAD776' +homestead>

Using Mnemonics (with experimental memory-hard passwords)

The --xxx-mnemonic-password is similar to the --mnemonic-password options, which uses a password to decrypt the account for a mnemonic, however it passes the password through the scrypt password-based key derivation function first, which is intentionally slow and makes a brute-force attack far more difficult.

+ +
/home/ricmoo> ethers --account mnemonic.txt --xxx-mnemonic-password +Password (mnemonic; experimental - hard): ****** +Decrypting... 100% +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() +<Promise id=0 resolved> +'0x56FC8792cC17971C19bEC4Ced978beEA44711EeD' +homestead>
Note

This is still an experimental feature (hence the xxx).

+ +
+ + + +
+ + + diff --git a/docs/cli/index.html b/docs/cli/index.html index 76046f9be..7bcbd2699 100644 --- a/docs/cli/index.html +++ b/docs/cli/index.html @@ -1,3 +1,30 @@ -Command Line Interfaces

Command Line Interfaces

+ + + + Command Line Interfaces + + + + + \ No newline at end of file +

Command Line Interfaces

+ + + + +
+ + + diff --git a/docs/cli/plugin/README.md b/docs/cli/plugin/README.md index b5087314f..51a4e7e23 100644 --- a/docs/cli/plugin/README.md +++ b/docs/cli/plugin/README.md @@ -7,210 +7,111 @@ Documentation: [html](https://docs-beta.ethers.io/) Making Your Own =============== - -The *cli* library is meant to make it easy to create command -line utilities of your own. - - CLI --- +#### **addPlugin**( command , pluginClass ) => *void* -A **CLI** handles parsing all the command-line flags, options and arguments -and instantiates a [Plugin](./) to process the command. - -A **CLI** may support multiple [Plugin](./)'s in which case the first -argument is used to determine which to run (or if no arguments, the default -plugin will be selected) or may be designed to be standalone, in which case -exactly one [Plugin](./) will be used and no command argument is allowed. +Add a *plugin* class for the *command*. After all options and flags have been consumed, the first argument will be consumed and the associated plugin class will be instantiated and run. -#### **addPlugin** ( command , pluginClass ) **=>** *void* +#### **setPlugin**( pluginClass ) => *void* -Add a *plugin* class for the *command*. After all options and flags -have been consumed, the first argument will be consumed and the -associated plugin class will be instantiated and run. +Set a dedicated [Plugin](/cli/plugin/#cli-plugin) class which will handle all input. This may not be used in conjuction with addPlugin and will not automatically accept a command from the arguments. - - -#### **setPlugin** ( pluginClass ) **=>** *void* - -Set a dedicated [Plugin](./) class which will handle all input. This -may not be used in conjuction with addPlugin and will not automatically -accept a command from the arguments. - - - - -#### **showUsage** ( [ message="" [ , status=0 ] ] ) **=>** *never* +#### **showUsage**( [ message = "" [ , status = 0 ] ] ) => *never* Shows the usage help screen for the CLI and terminates. - - -#### **run** ( args ) **=>** *Promise< void >* +#### **run**( args ) => *Promise< void >* Usually the value of *args* passed in will be `process.argv.slice(2)`. - - Plugin ------ - -Each **Plugin** manages each command of a CLI and is executed in phases. - -If the usage (i.e. help) of a CLI is requested, the static methods `getHelp` -and `getOptionHelp` are used to geneate the help screen. - -Otherwise, a plugin is instantiated and the `prepareOptions` is called. Each -plugin **must** call `super.prepareOptions`, otherwise the basic options are -not yet processed. During this time a Plugin should consume all the flags and -options it understands, since any left over flags or options will cause the -CLI to bail and issue an *unknown option* error. This should throw if a value -for a given option is invalid or some combination of options and flags is not -allowed. - -Once the prepareOptions is complete (the returned promise is resolved), the `prepareArguments` -is called. This should validate the number of arguments is expected and throw -and error if there are too many or too few arguments or if any arguments do not -make sense. - -Once the prepareArguments is complete (the returned promise is resolved), the `run` -is called. - - -#### *plugin* . **network** **=>** *[Network](../../api/providers/types)* +#### *plugin* . **network** => *[Network](/api/providers/types/#providers-Network)* The network this plugin is running for. - - -#### *plugin* . **provider** **=>** *[Provider](../../api/providers/provider)* +#### *plugin* . **provider** => *[Provider](/api/providers/provider/)* The provider for this plugin is running for. +#### *plugin* . **accounts** => *Array< [Signer](/api/signer/#Signer) >* + +The accounts passed into the plugin using `--account`, `--account-rpc` and `--account-void` which this plugin can use. -#### *plugin* . **accounts** **=>** *Array< [Signer](../../api/signer) >* - -The accounts passed into the plugin using `--account`, -`--account-rpc` and `--account-void` which this plugin can use. - - - - -#### *plugin* . **gasLimit** **=>** *[BigNumber](../../api/utils/bignumber)* +#### *plugin* . **gasLimit** => *[BigNumber](/api/utils/bignumber/)* The gas limit this plugin should use. This is null if unspecified. - - -#### *plugin* . **gasPrice** **=>** *[BigNumber](../../api/utils/bignumber)* +#### *plugin* . **gasPrice** => *[BigNumber](/api/utils/bignumber/)* The gas price this plugin should use. This is null if unspecified. - - -#### *plugin* . **nonce** **=>** *number* +#### *plugin* . **nonce** => *number* The initial nonce for the account this plugin should use. - - ### Methods - - -#### *plugin* . **prepareOptions** ( argParser [ , verifyOnly=false ] ) **=>** *Promise< void >* +#### *plugin* . **prepareOptions**( argParser [ , verifyOnly = false ] ) => *Promise< void >* +#### *plugin* . **prepareArgs**( args ) => *Promise< void >* -#### *plugin* . **prepareArgs** ( args ) **=>** *Promise< void >* +#### *plugin* . **run**( ) => *Promise< void >* +#### *plugin* . **getAddress**( addressOrName [ , message = "" , [ allowZero = false ] ] ) => *Promise< string >* + +A plugin should use this method to resolve an address. If the resovled address is the zero address and *allowZero* is not true, an error is raised. +#### *plugin* . **dump**( header , info ) => *void* -#### *plugin* . **run** ( ) **=>** *Promise< void >* +Dumps the contents of *info* to the console with a *header* in a nicely formatted style. In the future, plugins may support a JSON output format which will automatically work with this method. +#### *plugin* . **throwUsageError**( [ message = "" ] ) => *never* + +Stops exectuion of the plugin and shows the help screen of the plugin with the optional *message*. - - -#### *plugin* . **getAddress** ( addressOrName [ , message="" , [ allowZero=false ] ] ) **=>** *Promise< string >* - -A plugin should use this method to resolve an address. If the resovled address is -the zero address and *allowZero* is not true, an error is raised. - - - - -#### *plugin* . **dump** ( header , info ) **=>** *void* - -Dumps the contents of *info* to the console with a *header* in a nicely -formatted style. In the future, plugins may support a JSON output format -which will automatically work with this method. - - - - -#### *plugin* . **throwUsageError** ( [ message="" ] ) **=>** *never* - -Stops exectuion of the plugin and shows the help screen of the plugin with -the optional *message*. - - - - -#### *plugin* . **throwError** ( message ) **=>** *never* +#### *plugin* . **throwError**( message ) => *never* Stops execution of the plugin and shows *message*. - - ### Static Methods +#### *Plugin* . **getHelp** => *Help* + +Each subclass should implement this static method which is used to generate the help screen. -#### *Plugin* . **getHelp** **=>** *Help* - -Each subclass should implement this static method which is used to -generate the help screen. - - - - -#### *Plugin* . **getOptionHelp** **=>** *Array< Help >* - -Each subclass should implement this static method if it supports -additional options which is used to generate the help screen. - +#### *Plugin* . **getOptionHelp** => *Array< Help >* +Each subclass should implement this static method if it supports additional options which is used to generate the help screen. ArgParser --------- - -The **ArgParser** is used to parse a command line into flags, options -and arguments. - - ``` /home/ethers> ethers --account wallet.json --yes send ricmoo.eth 1.0 # An Option ----------^ ^ ^ @@ -225,52 +126,32 @@ and arguments. ``` -Flags are simple binary options (such as the `--yes`), which are true if present -otherwise false. +Flags are simple binary options (such as the `--yes`), which are true if present otherwise false. -Options require a single parameter follow them on the command line -(such as `--account wallet.json`, which nhas the name `account` and the value -`wallet.json`) +Options require a single parameter follow them on the command line (such as `--account wallet.json`, which nhas the name `account` and the value `wallet.json`) -Arguments are all other values on the command line, and are not accessed through -the **ArgParser** directly. +Arguments are all other values on the command line, and are not accessed through the **ArgParser** directly. -When a CLI is run, an **ArgParser** is used to validate the command line by using -prepareOptions, which consumes all flags and options leaving only the arguments -behind, which are then passed into prepareArgs. +When a CLI is run, an **ArgParser** is used to validate the command line by using prepareOptions, which consumes all flags and options leaving only the arguments behind, which are then passed into prepareArgs. -#### *argParser* . **consumeFlag** ( name ) **=>** *boolean* +#### *argParser* . **consumeFlag**( name ) => *boolean* Remove the flag *name* and return true if it is present. +#### *argParser* . **consumeMultiOptions**( names ) => *Array< {name:string,value:string} >* + +Remove all options which match any name in the Array of *names* with their values returning the list (in order) of values. -#### *argParser* . **consumeMultiOptions** ( names ) **=>** *Array< {name:string,value:string} >* +#### *argParser* . **consumeOption**( name ) => *string* -Remove all options which match any name in the Array of *names* -with their values returning the list (in order) of values. +Remove the option with its value for *name* and return the value. This will throw a UsageError if the option is included multiple times. +#### *argParser* . **consumeOptions**( name ) => *Array< string >* + +Remove all options with their values for *name* and return the list (in order) of values. -#### *argParser* . **consumeOption** ( name ) **=>** *string* - -Remove the option with its value for *name* and return the value. This -will throw a UsageError if the option is included multiple times. - - - - -#### *argParser* . **consumeOptions** ( name ) **=>** *Array< string >* - -Remove all options with their values for *name* and return the list -(in order) of values. - - - - - ------ -**Content Hash:** f9148238ca768a6f2bbbc0d0d062bc5934629f900aca1df124fe07d1582fa03f \ No newline at end of file diff --git a/docs/cli/plugin/index.html b/docs/cli/plugin/index.html index fafab1e80..2d6827a75 100644 --- a/docs/cli/plugin/index.html +++ b/docs/cli/plugin/index.html @@ -1,37 +1,109 @@ -Making Your Own

Making Your Own

-

The cli library is meant to make it easy to create command line utilities of your own.

-

CLI

-

A CLI handles parsing all the command-line flags, options and arguments and instantiates a Plugin to process the command.

A CLI may support multiple Plugin's in which case the first argument is used to determine which to run (or if no arguments, the default plugin will be selected) or may be designed to be standalone, in which case exactly one Plugin will be used and no command argument is allowed.

-
addPlugin ( command , pluginClass ) void

Add a plugin class for the command. After all options and flags have been consumed, the first argument will be consumed and the associated plugin class will be instantiated and run.

-
setPlugin ( pluginClass ) void

Set a dedicated Plugin class which will handle all input. This may not be used in conjuction with addPlugin and will not automatically accept a command from the arguments.

-
showUsage ( [ message = "" [ , status = 0 ] ] ) never

Shows the usage help screen for the CLI and terminates.

-
run ( args ) Promise< void >

Usually the value of args passed in will be process.argv.slice(2).

-

Plugin

-

Each Plugin manages each command of a CLI and is executed in phases.

If the usage (i.e. help) of a CLI is requested, the static methods getHelp and getOptionHelp are used to geneate the help screen.

Otherwise, a plugin is instantiated and the prepareOptions is called. Each plugin must call super.prepareOptions, otherwise the basic options are not yet processed. During this time a Plugin should consume all the flags and options it understands, since any left over flags or options will cause the CLI to bail and issue an unknown option error. This should throw if a value for a given option is invalid or some combination of options and flags is not allowed.

Once the prepareOptions is complete (the returned promise is resolved), the prepareArguments is called. This should validate the number of arguments is expected and throw and error if there are too many or too few arguments or if any arguments do not make sense.

Once the prepareArguments is complete (the returned promise is resolved), the run is called.

-
plugin . network Network

The network this plugin is running for.

-
plugin . provider Provider

The provider for this plugin is running for.

-
plugin . accounts Array< Signer >

The accounts passed into the plugin using --account, --account-rpc and --account-void which this plugin can use.

-
plugin . gasLimit BigNumber

The gas limit this plugin should use. This is null if unspecified.

-
plugin . gasPrice BigNumber

The gas price this plugin should use. This is null if unspecified.

-
plugin . nonce number

The initial nonce for the account this plugin should use.

-

Methods

+ + + + Making Your Own + + + + +
+ -
plugin . prepareOptions ( argParser [ , verifyOnly = false ] ) Promise< void >

-
plugin . prepareArgs ( args ) Promise< void >

-
plugin . run ( ) Promise< void >

-
plugin . getAddress ( addressOrName [ , message = "" , [ allowZero = false ] ] ) Promise< string >

A plugin should use this method to resolve an address. If the resovled address is the zero address and allowZero is not true, an error is raised.

-
plugin . dump ( header , info ) void

Dumps the contents of info to the console with a header in a nicely formatted style. In the future, plugins may support a JSON output format which will automatically work with this method.

-
plugin . throwUsageError ( [ message = "" ] ) never

Stops exectuion of the plugin and shows the help screen of the plugin with the optional message.

-
plugin . throwError ( message ) never

Stops execution of the plugin and shows message.

-

Static Methods

+

Making Your Own

The cli library is meant to make it easy to create command line utilities of your own.

-
Plugin . getHelp Help

Each subclass should implement this static method which is used to generate the help screen.

-
Plugin . getOptionHelp Array< Help >

Each subclass should implement this static method if it supports additional options which is used to generate the help screen.

-

ArgParser

-

The ArgParser is used to parse a command line into flags, options and arguments.

-
/home/ethers> ethers --account wallet.json --yes send ricmoo.eth 1.0
#  An Option ----------^                     ^   ^
#    - name =  "account"                     |   |
#    - value = "wallet.json"                 |   |
#  A Flag -----------------------------------+   |
#    - name  = "yes"                             |
#    - value = true                              |
#  Arguments ------------------------------------+
#    - count = 3
#    - [ "send", "ricmoo.eth", "1.0" ]
-

Flags are simple binary options (such as the --yes), which are true if present otherwise false.

Options require a single parameter follow them on the command line (such as --account wallet.json, which nhas the name account and the value wallet.json)

Arguments are all other values on the command line, and are not accessed through the ArgParser directly.

When a CLI is run, an ArgParser is used to validate the command line by using prepareOptions, which consumes all flags and options leaving only the arguments behind, which are then passed into prepareArgs.

-
argParser . consumeFlag ( name ) boolean

Remove the flag name and return true if it is present.

-
argParser . consumeMultiOptions ( names ) Array< {name:string,value:string} >

Remove all options which match any name in the Array of names with their values returning the list (in order) of values.

-
argParser . consumeOption ( name ) string

Remove the option with its value for name and return the value. This will throw a UsageError if the option is included multiple times.

-
argParser . consumeOptions ( name ) Array< string >

Remove all options with their values for name and return the list (in order) of values.

\ No newline at end of file +

CLI

A CLI handles parsing all the command-line flags, options and arguments and instantiates a Plugin to process the command.

+ +

A CLI may support multiple Plugin's in which case the first argument is used to determine which to run (or if no arguments, the default plugin will be selected) or may be designed to be standalone, in which case exactly one Plugin will be used and no command argument is allowed.

+ +
addPlugin( command , pluginClass ) void

Add a plugin class for the command. After all options and flags have been consumed, the first argument will be consumed and the associated plugin class will be instantiated and run.

+ +
setPlugin( pluginClass ) void

Set a dedicated Plugin class which will handle all input. This may not be used in conjuction with addPlugin and will not automatically accept a command from the arguments.

+ +
showUsage( [ message = "" [ , status = 0 ] ] ) never

Shows the usage help screen for the CLI and terminates.

+ +
run( args ) Promise< void >

Usually the value of args passed in will be process.argv.slice(2).

+ +

Plugin

Each Plugin manages each command of a CLI and is executed in phases.

+ +

If the usage (i.e. help) of a CLI is requested, the static methods getHelp and getOptionHelp are used to geneate the help screen.

+ +

Otherwise, a plugin is instantiated and the prepareOptions is called. Each plugin must call super.prepareOptions, otherwise the basic options are not yet processed. During this time a Plugin should consume all the flags and options it understands, since any left over flags or options will cause the CLI to bail and issue an unknown option error. This should throw if a value for a given option is invalid or some combination of options and flags is not allowed.

+ +

Once the prepareOptions is complete (the returned promise is resolved), the prepareArguments is called. This should validate the number of arguments is expected and throw and error if there are too many or too few arguments or if any arguments do not make sense.

+ +

Once the prepareArguments is complete (the returned promise is resolved), the run is called.

+ +
plugin.network Network

The network this plugin is running for.

+ +
plugin.provider Provider

The provider for this plugin is running for.

+ +
plugin.accounts Array< Signer >

The accounts passed into the plugin using --account, --account-rpc and --account-void which this plugin can use.

+ +
plugin.gasLimit BigNumber

The gas limit this plugin should use. This is null if unspecified.

+ +
plugin.gasPrice BigNumber

The gas price this plugin should use. This is null if unspecified.

+ +
plugin.nonce number

The initial nonce for the account this plugin should use.

+ +

Methods

+
plugin.prepareOptions( argParser [ , verifyOnly = false ] ) Promise< void >
+
plugin.prepareArgs( args ) Promise< void >
+
plugin.run( ) Promise< void >
+
plugin.getAddress( addressOrName [ , message = "" , [ allowZero = false ] ] ) Promise< string >

A plugin should use this method to resolve an address. If the resovled address is the zero address and allowZero is not true, an error is raised.

+ +
plugin.dump( header , info ) void

Dumps the contents of info to the console with a header in a nicely formatted style. In the future, plugins may support a JSON output format which will automatically work with this method.

+ +
plugin.throwUsageError( [ message = "" ] ) never

Stops exectuion of the plugin and shows the help screen of the plugin with the optional message.

+ +
plugin.throwError( message ) never

Stops execution of the plugin and shows message.

+ +

Static Methods

+
Plugin.getHelp Help

Each subclass should implement this static method which is used to generate the help screen.

+ +
Plugin.getOptionHelp Array< Help >

Each subclass should implement this static method if it supports additional options which is used to generate the help screen.

+ +

ArgParser

The ArgParser is used to parse a command line into flags, options and arguments.

+ +
/home/ethers> ethers --account wallet.json --yes send ricmoo.eth 1.0 +# An Option ----------^ ^ ^ +# - name = "account" | | +# - value = "wallet.json" | | +# A Flag -----------------------------------+ | +# - name = "yes" | +# - value = true | +# Arguments ------------------------------------+ +# - count = 3 +# - [ "send", "ricmoo.eth", "1.0" ]

Flags are simple binary options (such as the --yes), which are true if present otherwise false.

+ +

Options require a single parameter follow them on the command line (such as --account wallet.json, which nhas the name account and the value wallet.json)

+ +

Arguments are all other values on the command line, and are not accessed through the ArgParser directly.

+ +

When a CLI is run, an ArgParser is used to validate the command line by using prepareOptions, which consumes all flags and options leaving only the arguments behind, which are then passed into prepareArgs.

+ +
argParser.consumeFlag( name ) boolean

Remove the flag name and return true if it is present.

+ +
argParser.consumeMultiOptions( names ) Array< {name:string,value:string} >

Remove all options which match any name in the Array of names with their values returning the list (in order) of values.

+ +
argParser.consumeOption( name ) string

Remove the option with its value for name and return the value. This will throw a UsageError if the option is included multiple times.

+ +
argParser.consumeOptions( name ) Array< string >

Remove all options with their values for name and return the list (in order) of values.

+ +
+ + + +
+ + + diff --git a/docs/cli/typescript/README.md b/docs/cli/typescript/README.md index a32d7389e..ebe401adc 100644 --- a/docs/cli/typescript/README.md +++ b/docs/cli/typescript/README.md @@ -7,13 +7,9 @@ Documentation: [html](https://docs-beta.ethers.io/) TypeScript ========== - - Help ---- - - ``` Usage: ethers-ts FILENAME [ ... ] [ OPTIONS ] @@ -34,15 +30,6 @@ OTHER OPTIONS your bash history file. This is NOT recommended. ``` - - Examples -------- - -TODO - - - ------ -**Content Hash:** 0ec816338871905483b5982dc90ebcc446a5466f8279ff0c741e0497656247c0 \ No newline at end of file diff --git a/docs/cli/typescript/index.html b/docs/cli/typescript/index.html index bbe1a3a3b..7bbee7241 100644 --- a/docs/cli/typescript/index.html +++ b/docs/cli/typescript/index.html @@ -1,8 +1,49 @@ -TypeScript

TypeScript

+ + + + TypeScript + + + + +
+ -

Help

+

TypeScript

+

Help

+
Usage: + ethers-ts FILENAME [ ... ] [ OPTIONS ] -
Usage:
   ethers-ts FILENAME [ ... ] [ OPTIONS ]

OPTIONS
  --output FILENAME           Write the output to FILENAME (default: stdout)
  --force                     Overwrite files if they already exist
  --no-optimize               Do not run the solc optimizer
  --no-bytecode               Do not include bytecode and Factory methods

OTHER OPTIONS
  --debug                     Show stack traces for errors
  --help                      Show this usage and exit
  --version                   Show this version and exit

(*) By including mnemonics or private keys on the command line they are
    possibly readable by other users on your system and may get stored in
    your bash history file. This is NOT recommended.
+OPTIONS + --output FILENAME Write the output to FILENAME (default: stdout) + --force Overwrite files if they already exist + --no-optimize Do not run the solc optimizer + --no-bytecode Do not include bytecode and Factory methods -

Examples

-

TODO

\ No newline at end of file +OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

TODO

+ + + + + +
+ + + diff --git a/docs/concepts/README.md b/docs/concepts/README.md index 4943e89c0..2d797cffe 100644 --- a/docs/concepts/README.md +++ b/docs/concepts/README.md @@ -4,22 +4,15 @@ Documentation: [html](https://docs-beta.ethers.io/) ----- -Concepts -======== - - -This is a very breif overview of some aspects of *Ethereum* -and blockchains which developers can make use of or should -be aware of. - +Ethereum Basics +=============== * [Events](events) * [Solidity Topics](events) + * [Logs and Filtering](events) * [Gas](gas) * [Gas Price](gas) * [Gas Limit](gas) +* [Security](security) + * [Key Derivation Functions](security) - - ------ -**Content Hash:** b83b7830eb49f49872ff5bc88f533e97ff5ea8c2977a72fb689cf37514365547 \ No newline at end of file diff --git a/docs/concepts/best-practices/README.md b/docs/concepts/best-practices/README.md new file mode 100644 index 000000000..7710397cd --- /dev/null +++ b/docs/concepts/best-practices/README.md @@ -0,0 +1,28 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Best Practices +============== + +Network Changes +--------------- + +``` +// Force page refreshes on network changes +{ + // The "any" network will allow spontaneous network changes + const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); + provider.on("network", (newNetwork, oldNetwork) => { + // When a Provider makes its initial connection, it emits a "network" + // event with a null oldNetwork along with the newNetwork. So, if the + // oldNetwork exists, it represents a changing network + if (oldNetwork) { + window.location.reload(); + } + }); +} +``` + diff --git a/docs/concepts/best-practices/index.html b/docs/concepts/best-practices/index.html new file mode 100644 index 000000000..b128ed5e7 --- /dev/null +++ b/docs/concepts/best-practices/index.html @@ -0,0 +1,52 @@ + + + + Best Practices + + + + +
+ + +

Best Practices

+

Network Changes

Handling a change in the network (e.g. Ropsten vs Mainnet) is incredibly complex and a slight failure can at best make your application seem confusing and at worst cause the loss of funds, leak private data or misrepresent what an action performed.

+ +

Luckily, standard users should likely never change their networks unless tricked to do so or they make a mistake.

+ +

This is a problem you mainly need to worry about for developers, and most developers should understand the vast array of issues surrounding a network change during application operation and will understand the page reloading (which is already the default behaviour in many clients).

+ +

So, the best practice when a network change occurs is to simply refresh the page. This should cause all your UI components to reset to a known-safe state, including any banners and warnings to your users if they are on an unsupported network.

+ +

This can be acomplished by using the following function:

+ +
Automatically Refresh on Network Change
// Force page refreshes on network changes +{ + // The "any" network will allow spontaneous network changes + const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); + provider.on("network", (newNetwork, oldNetwork) => { + // When a Provider makes its initial connection, it emits a "network" + // event with a null oldNetwork along with the newNetwork. So, if the + // oldNetwork exists, it represents a changing network + if (oldNetwork) { + window.location.reload(); + } + }); +}
+ + + +
+ + + diff --git a/docs/concepts/events/README.md b/docs/concepts/events/README.md index 87909c3bf..182cf014b 100644 --- a/docs/concepts/events/README.md +++ b/docs/concepts/events/README.md @@ -7,17 +7,119 @@ Documentation: [html](https://docs-beta.ethers.io/) Events ====== - -Explain how topics and such work - - Solidity Topics --------------- +Logs and Filtering +------------------ -How to compute the topic... +### Filters + +Example Log Matching ------ -**Content Hash:** 2e822e6d641a11d92d9dc649fd5e688844e36f4b93074854a0b59c6daf831995 \ No newline at end of file +```javascript +// +const tokenAddress = ethers.constants.AddressZero; +const myAddress = ethers.constants.AddressZero; +const myOtherAddress = ethers.constants.AddressZero; +const id = ethers.utils.id; +const hexZeroPad = ethers.utils.hexZeroPad; +// + +// Short example of manually creating filters for an ERC-20 +// Transfer event. +// +// Most users should generally use the Contract API to +// compute filters, as it is much simpler, but this is +// provided as an illustration for those curious. See +// below for examples of the equivalent Contract API. + +// ERC-20: +// Transfer(address indexed src, address indexed dst, uint val) +// +// -------------------^ +// ----------------------------------------^ +// +// Notice that only *src* and *dst* are *indexed*, so ONLY they +// qualify for filtering. +// +// Also, note that in Solidity an Event uses the first topic to +// identify the Event name; for Transfer this will be: +// id("Transfer(address,address,uint256)") +// +// Other Notes: +// - A topic must be 32 bytes; so shorter types must be padded + +// List all token transfers *from* myAddress +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress or myOtherAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + [ + hexZeroPad(myAddress, 32), + hexZeroPad(myOtherAddress, 32), + ] + ] +} +``` + + +To simplify life, ..., explain here, the contract API + + +```javascript +// +const tokenAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; // DAI +const myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +const otherAddress = "0xEA517D5a070e6705Cc5467858681Ed953d285Eb9"; +const provider = ethers.getDefaultProvider(); +const Contract = ethers.Contract; +// + +const abi = [ + "event Transfer(address indexed src, address indexed dst, uint val)" +]; + +const contract = new Contract(tokenAddress, abi, provider); + +// List all token transfers *from* myAddress +contract.filters.Transfer(myAddress) +//! + +// List all token transfers *to* myAddress: +contract.filters.Transfer(null, myAddress) +//! + +// List all token transfers *from* myAddress *to* otherAddress: +contract.filters.Transfer(myAddress, otherAddress) +//! + +// List all token transfers *to* myAddress OR otherAddress: +contract.filters.Transfer(null, [ myAddress, otherAddress ]) +//! +``` + +### Other Things? TODO + diff --git a/docs/concepts/events/index.html b/docs/concepts/events/index.html index 923e2f9cb..dfbd95609 100644 --- a/docs/concepts/events/index.html +++ b/docs/concepts/events/index.html @@ -1,4 +1,141 @@ -Events

Events

-

Explain how topics and such work

-

Solidity Topics

-

How to compute the topic...

\ No newline at end of file + + + + Events + + + + +
+ + +

Events

Explain how topics and such work

+ +

Solidity Topics

How to compute the topic...

+ +

Logs and Filtering

Example hog logs are used.

+ +

Link to provider.getLogs and contract.on

+ +

Filters

Filter are used as a way to query ... efficient, explain bloom filters lightly

+ +

A filter may have up to 4 topic-sets, where each topic-set refers to a condition that must match the log topic in that position (i.e. each condition is AND-ed together).

+ +

If a topic-set is null, a log topic in that position is not filtered at all and any value matches.

+ +

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).

+ +
Topic-SetsMatching Logs 
[ A ]topic[0] = A 
[ A, null ] 
[ null, B ]topic[1] = B 
[ null, [ B ] ] 
[ null, [ B ], null ] 
[ A, B ](topic[0] = A) AND (topic[1] = B) 
[ A, [ B ] ] 
[ A, [ B ], null ] 
[ [ A, B ] ](topic[0] = A) OR (topic[0] = B) 
[ [ A, B ], null ] 
[ [ A, B ], [ C, D ] ][ (topic[0] = A) OR (topic[0] = B) ] AND [ (topic[1] = C) OR (topic[1] = D) ] 
Example Log Matching 
ERC-20 Transfer Filter Examples
// <hide> +const tokenAddress = ethers.constants.AddressZero; +const myAddress = ethers.constants.AddressZero; +const myOtherAddress = ethers.constants.AddressZero; +const id = ethers.utils.id; +const hexZeroPad = ethers.utils.hexZeroPad; +// </hide> + +// Short example of manually creating filters for an ERC-20 +// Transfer event. +// +// Most users should generally use the Contract API to +// compute filters, as it is much simpler, but this is +// provided as an illustration for those curious. See +// below for examples of the equivalent Contract API. + +// ERC-20: +// Transfer(address indexed src, address indexed dst, uint val) +// +// -------------------^ +// ----------------------------------------^ +// +// Notice that only *src* and *dst* are *indexed*, so ONLY they +// qualify for filtering. +// +// Also, note that in Solidity an Event uses the first topic to +// identify the Event name; for Transfer this will be: +// id("Transfer(address,address,uint256)") +// +// Other Notes: +// - A topic must be 32 bytes; so shorter types must be padded + +// List all token transfers *from* myAddress +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress or myOtherAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + [ + hexZeroPad(myAddress, 32), + hexZeroPad(myOtherAddress, 32), + ] + ] +}

To simplify life, ..., explain here, the contract API

+ +
ERC-20 Contract Filter Examples
// <hide> +const tokenAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; // DAI +const myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +const otherAddress = "0xEA517D5a070e6705Cc5467858681Ed953d285Eb9"; +const provider = ethers.getDefaultProvider(); +const Contract = ethers.Contract; +// </hide> + +const abi = [ + "event Transfer(address indexed src, address indexed dst, uint val)" +]; + +const contract = new Contract(tokenAddress, abi, provider); + +// List all token transfers *from* myAddress +contract.filters.Transfer(myAddress) +//! + +// List all token transfers *to* myAddress: +contract.filters.Transfer(null, myAddress) +//! + +// List all token transfers *from* myAddress *to* otherAddress: +contract.filters.Transfer(myAddress, otherAddress) +//! + +// List all token transfers *to* myAddress OR otherAddress: +contract.filters.Transfer(null, [ myAddress, otherAddress ]) +//!

Other Things? TODO

Explain what happens to strings and bytes, how to filter and retain the value

+ + + + + +
+ + + diff --git a/docs/concepts/gas/README.md b/docs/concepts/gas/README.md index 9fe70b556..40a688b3d 100644 --- a/docs/concepts/gas/README.md +++ b/docs/concepts/gas/README.md @@ -7,24 +7,9 @@ Documentation: [html](https://docs-beta.ethers.io/) Gas === - -Explain attack vectors - - Gas Price --------- - -The gas price is used somewhat like a bid, indicating an amount -you are willing to pay (per unit of execution) to have your transaction -processed. - - Gas Limit --------- - - - ------ -**Content Hash:** b1f234871903b3e3a73197e38b55138313000a83a4f4e613e7347c9983c3343f \ No newline at end of file diff --git a/docs/concepts/gas/index.html b/docs/concepts/gas/index.html index b85975635..d2f0166b8 100644 --- a/docs/concepts/gas/index.html +++ b/docs/concepts/gas/index.html @@ -1,6 +1,34 @@ -Gas

Gas

-

Explain attack vectors

-

Gas Price

-

The gas price is used somewhat like a bid, indicating an amount you are willing to pay (per unit of execution) to have your transaction processed.

-

Gas Limit

-
\ No newline at end of file + + + + Gas + + + + +
+ + +

Gas

Explain attack vectors

+ +

Gas Price

The gas price is used somewhat like a bid, indicating an amount you are willing to pay (per unit of execution) to have your transaction processed.

+ +

Gas Limit

+ + + + +
+ + + diff --git a/docs/concepts/index.html b/docs/concepts/index.html index 1fe8a1ca7..5916165cd 100644 --- a/docs/concepts/index.html +++ b/docs/concepts/index.html @@ -1,3 +1,33 @@ -Concepts

Concepts

-

This is a very breif overview of some aspects of Ethereum and blockchains which developers can make use of or should be aware of.

-
\ No newline at end of file + + + + Ethereum Basics + + + + +
+ + +

Ethereum Basics

This is a very breif overview of some aspects of Ethereum and blockchains which developers can make use of or should be aware of.

+ +

This section is fairly sparse at the moment, but will be expanded as time goes on.

+ + + + + +
+ + + diff --git a/docs/concepts/security/README.md b/docs/concepts/security/README.md new file mode 100644 index 000000000..4bfe8e21d --- /dev/null +++ b/docs/concepts/security/README.md @@ -0,0 +1,38 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Security +======== + +Key Derivation Functions +------------------------ + +### Why does it take so long? + +### Mitigating the User Experience + +### Work-Arounds (not recommended) + +```javascript +// Our wallet object +const wallet = Wallet.createRandom(); + +// The password to encrypt with +const password = "password123"; + +// WARNING: Doing this substantially reduces the security +// of the wallet. This is highly NOT recommended. + +// We override the default scrypt.N value, which is used +// to indicate the difficulty to crack this wallet. +const json = wallet.encrypt(password, { + scrypt: { + // The number must be a power of 2 (default: 131072) + N: 64 + } +}); +``` + diff --git a/docs/concepts/security/index.html b/docs/concepts/security/index.html new file mode 100644 index 000000000..00f94afbd --- /dev/null +++ b/docs/concepts/security/index.html @@ -0,0 +1,68 @@ + + + + Security + + + + +
+ + +

Security

+

Key Derivation Functions

This is not specific to Ethereum, but is a useful technique to understand and has some implications on User Experience.

+ +

Many people are concerned that encrypting and decrypting an Ethereum wallet is quite slow and can take quite some time. It is important to understand this is intentional and provides much stronger security.

+ +

The algorithm usually used for this process is scrypt, which is a memory and CPU intensive algorithm which computes a key (fixed-length psudo-random series of bytes) for a given password.

+ +

Why does it take so long?

The goal is to use as much CPU and memory as possible during this algorithm, so that a single computer can only compute a very small number of results for some fixed amount of time. To scale up an attack, the attacker requires additional compuers, increasing the cost to brute-force attack to guess the password.

+ +

For example, if a user knows their correct password, this process may take 10 seconds for them to unlock their own wallet and proceed.

+ +

But since an attacker does not know the password, they must guess; and each guess also requires 10 seconds. So, if they wish to try guessing 1 million passwords, their computer would be completely tied up for 10 million seconds, or around 115 days.

+ +

Without using an algorithm like this, a user would be able to log in instantly, however, 1 million passwords would only take a few seconds to attempt. Even secure passwords would likely be broken within a short period of time. There is no way the algorithm can be faster for a legitimate user without also being faster for an attacker.

+ +

Mitigating the User Experience

Rather than reducing the security (see below), a better practice is to make the user feel better about waiting. The Ethers encryption and decryption API allows the developer to incorporate a progress bar, by passing in a progress callback which will be periodically called with a number between 0 and 1 indication percent completion.

+ +

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 a progress bar makes a user feel like there time is not being needlessly wasted.

+ +

Work-Arounds (not recommended)

There are ways to reduce the time required to decrypt an Ethereum JSON Wallet, but please keep in mind that doing so discards nearly all security on that wallet.

+ +

The scrypt algorithm is designed to be tuned. The main purpose of this is to increase the difficulty as time goes on and computers get faster, but it can also be tuned down in situations where the security is less important.

+ +
// Our wallet object +const wallet = Wallet.createRandom(); + +// The password to encrypt with +const password = "password123"; + +// WARNING: Doing this substantially reduces the security +// of the wallet. This is highly NOT recommended. + +// We override the default scrypt.N value, which is used +// to indicate the difficulty to crack this wallet. +const json = wallet.encrypt(password, { + scrypt: { + // The number must be a power of 2 (default: 131072) + N: 64 + } +});
+ + + +
+ + + diff --git a/docs/contributing/README.md b/docs/contributing/README.md index 5918b3905..fc72c2216 100644 --- a/docs/contributing/README.md +++ b/docs/contributing/README.md @@ -7,38 +7,45 @@ Documentation: [html](https://docs-beta.ethers.io/) Contributing and Hacking ======================== - -The ethers.js library is something that I've written out of necessity, -and has grown somewhat organically over time. - -Many things are the way they are for good (at the time, at least) reasons, -but I always welcome criticism, and am completely willing to have my mind -changed on things. - -So, pull requests are always welcome, but please keep a few points in mind: - - - -* Backwards-compatibility-breaking changes will not be accepted; they may be considered for the next major version -* Security is important; adding dependencies require fairly convincing arguments as to why -* The library aims to be lean, so keep an eye on the dist/ethers.min.js file size before and after your changes -* Add test cases for both expected and unexpected input -* Any new features need to be supported by me (future issues, documentation, testing, migration), so anything that is overly complicated or specific may not be accepted - -In general, **please start an issue *before* beginning a pull request**, so we can -have a public discussion and figure out the best way to address to problem/feature. -**:)** - - Building -------- +``` +# Clone the REPO +/home/ricmoo> git clone git@github.com:ethers-io/ethers.js.git +/home/ricmoo> cd ethers.js -use npm run auto-build +# Install the base dependencies +/home/ricmoo/ethers.js> npm install -use npm run update-version +# Install each module's dependencies and link the libraries +# internally, so they reference each other +/home/ricmoo/ethers.js> npm run bootstrap +``` + +``` +# Begin watching the files and re-building whenever they change +/home/ricmoo/ethers.js> npm run auto-build +# Sometimes the issue only affects the ESM modules +/home/ricmoo/ethers.js> npm run auto-build-esm + + +# Or if you only need to run a single build +/home/ricmoo/ethers.js> npm run _build-cjs +/home/ricmoo/ethers.js> npm run _build-esm +``` + +``` +# Rebuilds all files and bundles testcases up for testing +/home/ricmoo/ethers.js> npm test + +# Often you don't need the full CI experience +/home/ricmoo/ethers.js> npm run _test-node +``` + +``` +/home/ricmoo/ethers.js> npm run update-version +``` ------ -**Content Hash:** 3afa848a6ccb408a68688beca905d8156e85277534f8cace5b7dd08991c30347 \ No newline at end of file diff --git a/docs/contributing/index.html b/docs/contributing/index.html index 76411584d..ca57d3862 100644 --- a/docs/contributing/index.html +++ b/docs/contributing/index.html @@ -1,4 +1,64 @@ -Contributing and Hacking

Contributing and Hacking

-

The ethers.js library is something that I've written out of necessity, and has grown somewhat organically over time.

Many things are the way they are for good (at the time, at least) reasons, but I always welcome criticism, and am completely willing to have my mind changed on things.

So, pull requests are always welcome, but please keep a few points in mind:

  • Backwards-compatibility-breaking changes will not be accepted; they may be considered for the next major version
  • Security is important; adding dependencies require fairly convincing arguments as to why
  • The library aims to be lean, so keep an eye on the dist/ethers.min.js file size before and after your changes
  • Add test cases for both expected and unexpected input
  • Any new features need to be supported by me (future issues, documentation, testing, migration), so anything that is overly complicated or specific may not be accepted

In general, please start an issue before beginning a pull request, so we can have a public discussion and figure out the best way to address to problem/feature. :)

-

Building

-

use npm run auto-build

use npm run update-version

\ No newline at end of file + + + + Contributing and Hacking + + + + +
+ + +

Contributing and Hacking

The ethers.js library is something that I've written out of necessity, and has grown somewhat organically over time.

+ +

Many things are the way they are for good (at the time, at least) reasons, but I always welcome criticism, and am completely willing to have my mind changed on things.

+ +

So, pull requests are always welcome, but please keep a few points in mind:

+ +

  • Backwards-compatibility-breaking changes will not be accepted; they may be considered for the next major version
  • Security is important; adding dependencies require fairly convincing arguments as to why
  • The library aims to be lean, so keep an eye on the dist/ethers.min.js file size before and after your changes
  • Add test cases for both expected and unexpected input
  • Any new features need to be supported by me (future issues, documentation, testing, migration), so anything that is overly complicated or specific may not be accepted

+ +

In general, please start an issue before beginning a pull request, so we can have a public discussion and figure out the best way to address to problem/feature. :)

+ +

Building

If you wish to modify the source code, there are a few steps involved in setting up your environment.

+ +
Preparing the Package
# Clone the REPO +/home/ricmoo> git clone git@github.com:ethers-io/ethers.js.git +/home/ricmoo> cd ethers.js + +# Install the base dependencies +/home/ricmoo/ethers.js> npm install + +# Install each module's dependencies and link the libraries +# internally, so they reference each other +/home/ricmoo/ethers.js> npm run bootstrap
Watching and Building
# Begin watching the files and re-building whenever they change +/home/ricmoo/ethers.js> npm run auto-build + + +# Sometimes the issue only affects the ESM modules +/home/ricmoo/ethers.js> npm run auto-build-esm + + +# Or if you only need to run a single build +/home/ricmoo/ethers.js> npm run _build-cjs +/home/ricmoo/ethers.js> npm run _build-esm
Testing
# Rebuilds all files and bundles testcases up for testing +/home/ricmoo/ethers.js> npm test + +# Often you don't need the full CI experience +/home/ricmoo/ethers.js> npm run _test-node
Preparing the Distribution
/home/ricmoo/ethers.js> npm run update-version
+ + + +
+ + + diff --git a/docs/cookbook/README.md b/docs/cookbook/README.md index 55b81f176..68cfe9598 100644 --- a/docs/cookbook/README.md +++ b/docs/cookbook/README.md @@ -7,10 +7,3 @@ Documentation: [html](https://docs-beta.ethers.io/) Cookbook ======== - -Cooking... - - - ------ -**Content Hash:** 25ae1ef3d5bc129f193abc65d6cf8c4d22ce8d6344fd07c1b5b27015e253d060 \ No newline at end of file diff --git a/docs/cookbook/index.html b/docs/cookbook/index.html index 7f8e502fa..cf3d3e6e0 100644 --- a/docs/cookbook/index.html +++ b/docs/cookbook/index.html @@ -1,2 +1,31 @@ -Cookbook

Cookbook

-

Cooking...

\ No newline at end of file + + + + Cookbook + + + + +
+ + +

Cookbook

Cooking...

+ + + + + +
+ + + diff --git a/docs/documentation/README.md b/docs/documentation/README.md index f4a84d360..c6ea2968a 100644 --- a/docs/documentation/README.md +++ b/docs/documentation/README.md @@ -7,185 +7,177 @@ Documentation: [html](https://docs-beta.ethers.io/) Flatworm Docs ============= - -The *Flatworm Docs* rendering script is designed to be **very** -simple, but provide enough formatting necessary for documenting -JavaScript libraries. - -A lot of its inspiration came from [Read the Docs](../Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/readthedocs/sphinx_rtd_theme) and -the [Sphinx](../Users/ricmoo/Development/ethers/ethers.js-v5/https:/www.sphinx-doc.org) project. - - Fragments --------- - -Flatworm Docs are made up of fragments. A fragment is either a lone -body of [markdown](./) text, or a -[directive](./) for specialized formatting, which may -itself have body. - - ### Directive Format - - ``` -_DIRECTIVE: VALUE @ @META +_DIRECTIVE: VALUE @ @EXTENSION BODY +MORE BODY + DIRECTIVE: The directive name VALUE: Optional; the value to pass to the directive LINK: Optional; a name for internal linking -META: Optional; extended directive functionality +EXTENSION: Optional; extended directive functionality PARAMETER: Optional; value to pass to extended directive functions BODY: Optional; the directive body (certain directives only) ``` - - ### Flatworm Directives - - #### **_section:** *TITLE* -A *section* has its **TITLE** in an H1 font. Sections are linked -to in *Table of Contents* and have a dividing line drawn above -them. If an option is specified, it is avaialble as a name for -intern linking. There should only be one `_section:` per page. +A *section* has its **TITLE** in an H1 font. Sections are linked to in *Table of Contents* and have a dividing line drawn above them. +The body supports markdown. +There should only be one `_section:` per page. + +**Extensions:** [@inherit](/documentation/#flatworm--ext-inherit), [@src](/documentation/#flatworm--ext-src), [@nav](/documentation/#flatworm--ext-nav), [@note](/documentation/#flatworm--ext-note) #### **_subsection:** *TITLE* -A *subsection* has its **TITLE** in an H2 font. Subsections are linked -to in *Table of Contents* and have a dividing line drawn above -them. If an option is specified, it is avaialble as a name for -internal linking. +A *subsection* has its **TITLE** in an H2 font. Subsections are linked to in *Table of Contents* and have a dividing line drawn above them. +The title and body support markdown. +**Extensions:** [@inherit](/documentation/#flatworm--ext-inherit), [@src](/documentation/#flatworm--ext-src), [@note](/documentation/#flatworm--ext-note) #### **_heading:** *TITLE* -A *heading* has its **TITLE** in an H3 font. If an option is specified, -it is available as a name for internal linking. +A *heading* has its **TITLE** in an H3 font. +The title and body support markdown. +**Extensions:** [@inherit](/documentation/#flatworm--ext-inherit), [@src](/documentation/#flatworm--ext-src), [@note](/documentation/#flatworm--ext-note) #### **_definition:** *TERM* -A *definition* has its **TERM** bolded and the markdown body is -indented. - +A *definition* has its **TERM** in normal text and the body is indented. +The title and body support markdown. #### **_property:** *SIGNATURE* -A *property* has its JavaScript **SIGNATURE** formatted and the -markdown body is indented. +A *property* has its JavaScript **SIGNATURE** formatted. + +The body supports markdown and the return portion of the signature support markdown links. + +**Extensions:** [@src](/documentation/#flatworm--ext-src) - - -#### **_note:** *TITLE* +#### **_note:** *BANNER* A *note* is placed in a blue bordered-box to draw attention to it. +The body supports markdown. - -#### **_warning:** *TITLE* +#### **_warning:** *BANNER* A *warning* is placed in an orange bordered-box to draw attention to it. +The body supports markdown. +#### **_code:** *CAPTION* -#### **_code:** *FILENAME* +Creates a [Code](/documentation/#flatworm--code) block. -A *code* reads the **FILENAME** and depending on the extension -adjusts it. +The body does **not** support markdown, and will be output exactly as is, with the exception of [Code Evaluation](/documentation/#flatworm--code-eval). -For JavaScript files, the file is executed, with `//!` replaced -with the result of the last statement and `//!error` is replaced -with the throw error. If the error state does not agree, rendering -fails. +If a line begins with a `"_"`, it should be escaped with a `"\"`. + +**Extensions:** [@lang](/documentation/#flatworm--ext-lang) +#### **_table:** *FOOTER* + +Creates a [Table](/documentation/#flatworm--table) structured according to the body. + +Each cell support and variables support markdown. + +**Extensions:** [@style](/documentation/#flatworm--ext-style) #### **_toc:** -A *toc* injects a Table of Contents, loading each line of the -body as a filename and recursively loads the *toc* if present, -otherwise all the *sections* and *subsections*. - +A *toc* injects a Table of Contents, loading each line of the body as a filename and recursively loads the *toc* if present, otherwise all the *sections* and *subsections*. +The body does **not** support markdown, as it is interpreted as a list of files and directories to process. #### **_null:** -A *null* is used to terminated a directive. For example, after -a *definition*, the bodies are indented, so a *null* can be -used to reset the indentation. - - - - -### Examples +A *null* is used to terminated a directive. For example, after a *definition*, the bodies are indented, so a *null* can be used to reset the indentation. +The body supports markdown. ``` -_section: Hello World @ +_section: Hello World @ +Body for section... -_subsection: Some Example @ -_heading: Large Bold Text @ +_subsection: Some Example @ +Body for subsection... + + +_heading: Large Bold Text @ +Body for heading... + _definition: Flatworm A phylum of relatively **simple** bilaterian, unsegmented, soft-bodied invertebrates. + _property: String.fromCharCode(code) => string Returns a string created from //code//, a sequence of UTF-16 code units. -_code: filename.js + +_code: heading + +// Some code goes here +while(1); + + +_table: Table Footer + +| **Name** | **Color** | +| Apple | Red | +| Banana | Yellow | +| Grape | Purple | + _toc: some-file some-directory -_definition and reset the indentation. _note: Title This is placed in a blue box. + _warning: Title This is placed in an orange box. + _null: This breaks out of a directive. For example, to end a ``` - - Markdown -------- - -The markdown is simple and does not have the flexibility of -other dialects, but allows for **bold**, *italic*, -*underlined*, `monospaced`, ^super-scripted text, -supporting [links](./) and lists. - - ``` **bold text** @@ -197,14 +189,12 @@ __underlined text__ ^^superscript text^^ +~~strikeout text~~ + - This is a list - With bullet points - With a total of three items -This is separated by -- an en-dash. - -This is separated by --- an em-dash. - This is a [Link to Ethereum](https://ethereum.org) and this is an [Internal Link](some-link). @@ -212,69 +202,141 @@ This is a self-titled link [[https://ethereumorg]] and this [[some-link]] will use the title from its directives value. ``` +Code +---- + +### JavaScript Evaluation + +``` +_code: Result of Code Example @lang + +// +const url = require("url"); +// + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// +foo +// +//! +``` + +```javascript +// +const url = require("url"); +// + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// +foo +// +//! +``` + +### Languages + + + + + +Tables +------ + +### Row Data + +### Alignment + +Alignment Conditions (higher precedence listed first) + + + +``` +_table: Result of Alignment Example @style + +| center | + +| left | +|left | + +| right | +| right| +``` + +Result of Alignment Example + + + +### Row and Column Spanning + +``` +_table: Result of Cell Spanning Example @style + +| (1x1) | (1x2) <| (2x1) | +| (2x2) <| (2x1) | ^ | +| ^ | ^ | (1x1) | +``` + +Result of Cell Spanning Example + + + +### Styles + + + + + +### Variables + +``` +_table: Result of Variables Example + +$Yes: This option is supported. +$No: This option is **not** supported +$bottom: This just represents an example of + what is possible. Notice that variable + content can span multiple lines. + +| **Feature** | **Supported** | +| Dancing Monkey | $Yes | +| Singing Turtle | $No | +| Newt Hair | $Yes | +| $bottom <| +``` + +Result of Variables Example + Configuration ------------- +Extensions +---------- -Configuration is optional (but highly recommended) and may be either -a simple JSON file (config.json) or a JS file (config.js) placed in -the top of the source folder. +### @inherit< markdown > -TODO: example JSON and example JS +### @lang< text > +### @nav< text > -Extended Directive Functions ----------------------------- +### @note< markdown > +### @src< key > +### @style< text > -### @INHERIT - - -Adds an inherits description to a directive. The *markdown* may contain links. - -This extended directive function is available for: - - - -* _section -* _subsetion -* _heading - - -### @NAV - - -Sets the name in the breadcrumbs when not the current node. - -This extended directive function is available for: - - - -* _section - - -### @SRC - - -Calls the configuration `getSourceUrl(text, VALUE)` to get a URL which -will be linked to by a link next to the *directive*. - -This extended directive function requires an advanced `config.js` [Configuration](./) -file since it requires a JavaScript function. - -This extended directive function is available for: - - - -* _section -* _subsetion -* _heading -* _property - - - ------ -**Content Hash:** d9553352210e8259406507b6b50fc3a611a1dde0aab1a979cbcc6c22af677fb9 \ No newline at end of file diff --git a/docs/documentation/index.html b/docs/documentation/index.html index 8de28c8f3..b2f92c9c0 100644 --- a/docs/documentation/index.html +++ b/docs/documentation/index.html @@ -1,38 +1,294 @@ -Flatworm Docs

Flatworm Docs

-

The Flatworm Docs rendering script is designed to be very simple, but provide enough formatting necessary for documenting JavaScript libraries.

A lot of its inspiration came from Read the Docs and the Sphinx project.

-

Fragments

-

Flatworm Docs are made up of fragments. A fragment is either a lone body of markdown text, or a directive for specialized formatting, which may itself have body.

-

Directive Format

+ + + + Flatworm Docs + + + + +
+ -
_DIRECTIVE: VALUE @<LINK> @META<PARAMETER>
BODY

DIRECTIVE:  The directive name
VALUE:      Optional; the value to pass to the directive
LINK:       Optional; a name for internal linking
META:       Optional; extended directive functionality
PARAMETER:  Optional; value to pass to extended directive functions
BODY:       Optional; the directive body (certain directives only)
+

Flatworm Docs

The Flatworm Docs rendering engine is designed to be very simple, but provide enough formatting necessary for documenting JavaScript libraries.

-

Flatworm Directives

+

A lot of its inspiration came from Read the Docs and the Sphinx project.

-
_section: TITLE

A section has its TITLE in an H1 font. Sections are linked to in Table of Contents and have a dividing line drawn above them. If an option is specified, it is avaialble as a name for intern linking. There should only be one _section: per page.

-
_subsection: TITLE

A subsection has its TITLE in an H2 font. Subsections are linked to in Table of Contents and have a dividing line drawn above them. If an option is specified, it is avaialble as a name for internal linking.

-
_heading: TITLE

A heading has its TITLE in an H3 font. If an option is specified, it is available as a name for internal linking.

-
_definition: TERM

A definition has its TERM bolded and the markdown body is indented.

-
_property: SIGNATURE

A property has its JavaScript SIGNATURE formatted and the markdown body is indented.

-
_note: TITLE

A note is placed in a blue bordered-box to draw attention to it.

-
_warning: TITLE

A warning is placed in an orange bordered-box to draw attention to it.

-
_code: FILENAME

A code reads the FILENAME and depending on the extension adjusts it.

For JavaScript files, the file is executed, with //! replaced with the result of the last statement and //!error is replaced with the throw error. If the error state does not agree, rendering fails.

-
_toc:

A toc injects a Table of Contents, loading each line of the body as a filename and recursively loads the toc if present, otherwise all the sections and subsections.

-
_null:

A null is used to terminated a directive. For example, after a definition, the bodies are indented, so a null can be used to reset the indentation.

-

Examples

+

Fragments

Each page is made up of fragments. A fragment is a directive, with an value and optional link, extensions and a body.

-
_section: Hello World @<link-to-this-section>

_subsection: Some Example @<link-to-this-subsection>

_heading: Large Bold Text @<link-to-this-heading>

_definition: Flatworm
A phylum of relatively **simple** bilaterian, unsegmented,
soft-bodied invertebrates.

_property: String.fromCharCode(code) => string
Returns a string created from //code//, a sequence of
UTF-16 code units.

_code: filename.js

_toc:
    some-file
    some-directory

_definition and reset the indentation.

_note: Title
This is placed in a blue box.

_warning: Title
This is placed in an orange box.

_null:
This breaks out of a directive. For example, to end a
+

Many directives support markdown in their value and body.

-

Markdown

-

The markdown is simple and does not have the flexibility of other dialects, but allows for bold, italic, underlined, monospaced, super-scripted text, supporting links and lists.

-
**bold text**

//italic text//

__underlined text__

``monospace code``

^^superscript text^^

- This is a list
- With bullet points
- With a total of three items

This is separated by -- an en-dash.

This is separated by --- an em-dash.

This is a [Link to Ethereum](https://ethereum.org) and this
is an [Internal Link](some-link).

This is a self-titled link [[https://ethereumorg]] and this
[[some-link]] will use the title from its directives value.
+

A fragment's body continues until another fragment is encountered.

-

Configuration

-

Configuration is optional (but highly recommended) and may be either a simple JSON file (config.json) or a JS file (config.js) placed in the top of the source folder.

TODO: example JSON and example JS

-

Extended Directive Functions

+

Directive Format

+
_DIRECTIVE: VALUE @<LINK> @EXTENSION<PARAMETER> +BODY -

@INHERIT<markdown>

-

Adds an inherits description to a directive. The markdown may contain links.

This extended directive function is available for:

  • _section
  • _subsetion
  • _heading
-

@NAV<text>

-

Sets the name in the breadcrumbs when not the current node.

This extended directive function is available for:

  • _section
-

@SRC<text>

-

Calls the configuration getSourceUrl(text, VALUE) to get a URL which will be linked to by a link next to the directive.

This extended directive function requires an advanced config.js Configuration file since it requires a JavaScript function.

This extended directive function is available for:

  • _section
  • _subsetion
  • _heading
  • _property
\ No newline at end of file +MORE BODY + +DIRECTIVE: The directive name +VALUE: Optional; the value to pass to the directive +LINK: Optional; a name for internal linking +EXTENSION: Optional; extended directive functionality +PARAMETER: Optional; value to pass to extended directive functions +BODY: Optional; the directive body (certain directives only)

Flatworm Directives

+
_section: TITLE

A section has its TITLE in an H1 font. Sections are linked to in Table of Contents and have a dividing line drawn above them.

+ +

The body supports markdown.

+ +

There should only be one _section: per page.

+ +

Extensions: @inherit, @src, @nav, @note

+ +
_subsection: TITLE

A subsection has its TITLE in an H2 font. Subsections are linked to in Table of Contents and have a dividing line drawn above them.

+ +

The title and body support markdown.

+ +

Extensions: @inherit, @src, @note

+ +
_heading: TITLE

A heading has its TITLE in an H3 font.

+ +

The title and body support markdown.

+ +

Extensions: @inherit, @src, @note

+ +
_definition: TERM

A definition has its TERM in normal text and the body is indented.

+ +

The title and body support markdown.

+ +
_property: SIGNATURE

A property has its JavaScript SIGNATURE formatted.

+ +

The body supports markdown and the return portion of the signature support markdown links.

+ +

Extensions: @src

+ +
_note: BANNER

A note is placed in a blue bordered-box to draw attention to it.

+ +

The body supports markdown.

+ +
_warning: BANNER

A warning is placed in an orange bordered-box to draw attention to it.

+ +

The body supports markdown.

+ +
_code: CAPTION

Creates a Code block.

+ +

The body does not support markdown, and will be output exactly as is, with the exception of Code Evaluation.

+ +

If a line begins with a "_", it should be escaped with a "\".

+ +

Extensions: @lang

+ +
_table: FOOTER

Creates a Table structured according to the body.

+ +

Each cell support and variables support markdown.

+ +

Extensions: @style

+ +
_toc:

A toc injects a Table of Contents, loading each line of the body as a filename and recursively loads the toc if present, otherwise all the sections and subsections.

+ +

The body does not support markdown, as it is interpreted as a list of files and directories to process.

+ +
_null:

A null is used to terminated a directive. For example, after a definition, the bodies are indented, so a null can be used to reset the indentation.

+ +

The body supports markdown.

+ +
Example
_section: Hello World @<link-main> +Body for section... + + +_subsection: Some Example @<link-secondary> +Body for subsection... + + +_heading: Large Bold Text @<link-here> +Body for heading... + + +_definition: Flatworm +A phylum of relatively **simple** bilaterian, unsegmented, +soft-bodied invertebrates. + + +_property: String.fromCharCode(code) => string +Returns a string created from //code//, a sequence of +UTF-16 code units. + + +_code: heading + +// Some code goes here +while(1); + + +_table: Table Footer + +| **Name** | **Color** | +| Apple | Red | +| Banana | Yellow | +| Grape | Purple | + + +_toc: + some-file + some-directory + + +_note: Title +This is placed in a blue box. + + +_warning: Title +This is placed in an orange box. + + +_null: +This breaks out of a directive. For example, to end a

Markdown

The markdown is simple and does not have the flexibility of other dialects, but allows for bold, italic, underlined, monospaced, superscript and strike text, supporting links and lists.

+ +

Lists are rendered as blocks of a body, so cannot be used within a title or within another list.

+ +
**bold text** + +//italic text// + +__underlined text__ + +``monospace code`` + +^^superscript text^^ + +~~strikeout text~~ + +- This is a list +- With bullet points +- With a total of three items + +This is a [Link to Ethereum](https://ethereum.org) and this +is an [Internal Link](some-link). + +This is a self-titled link [[https://ethereumorg]] and this +[[some-link]] will use the title from its directives value.

Code

The code directive creates a monospace, contained block useful for displaying code samples.

+ +

JavaScript Evaluation

For JavaScript files, the file is executed with some simple substitution.

+ +

A bare //! on a line is replaced with the result of the last statement. Building will fail if an error is thrown.

+ +

A bare //!error is replaced with the throw error. Building will fail if an error is not thrown.

+ +

Also any code included between the lines // <hide> and // </hide> will be omitted from the output, which can be used to setup variables.

+ +
Code Evaluation Example
_code: Result of Code Example @lang<javascript> + +// <hide> +const url = require("url"); +// </hide> + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// <hide> +foo +// </hide> +//!
Result of Code Example
// <hide> +const url = require("url"); +// </hide> + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// <hide> +foo +// </hide> +//!

Languages

The language can be specified using the @lang extension.

+ +
LanguageNotes 
javascriptSyntax highlights and evaluates the JavaScipt 
scriptSame as javascript, but does not evaluate the results 
shellShell scripts or command-line 
textPlain text with no syntax highlighting 

Tables

The table directive consumes the entire body up until the next directive. To terminate a table early to begin a text block, use a _null: directive.

+ +

Each line of the body should be Row Data or a Variable Declaration (or continuation of a Variable Declaration). Blank lines are ignored.

+ +

Row Data

Each Row Data line must begin and end with a "|", with each gap representing the cell data, alignment with optional column and row spanning.

+ +

Alignment

The alignment for a cell is determined by the whitespace surrounding the cell data.

+ +
AlignmentWhitespace 
Left1 or fewer spaces before the content 
Right1 or fewer spaces after the content 
Center2 or more space both before and after the content 
Alignment Conditions (higher precedence listed first) 
Alignment Example
_table: Result of Alignment Example @style<compact> + +| center | + +| left | +|left | + +| right | +| right|
center 
left 
left 
right 
right 
Result of Alignment Example 

Row and Column Spanning

A column may end its content with any number of "<" which indicates how many additional columns to extend into.

+ +

If the cell content contains only a "^", then the row above is extended into this cell (into the same number of columns).

+ +
Cell Spanning Example
_table: Result of Cell Spanning Example @style<compact> + +| (1x1) | (1x2) <| (2x1) | +| (2x2) <| (2x1) | ^ | +| ^ | ^ | (1x1) |
(1x1)(1x2)(2x1) 
(2x2)(2x1) 
(1x1) 
Result of Cell Spanning Example 

Styles

The @style extension for a table can be used to control its appearance.

+ +
NameWidthColumns 
minimalminimum sizebest fit 
compact40%evenly spaced 
wide67%evenly spaced 
full100%evenly spaced 

Variables

Often the layout of a table is easier to express and maintain without uneven or changing content within it. So the content can be defined separately within a table directive using variables. A varaible name must being with a letter and must only contain letters and numbers.

+ +

Variables are also useful when content is repeated throughout a table.

+ +

A variable is declared by starting a line with "$NAME:", which consumes all lines until the next variable declaration or until the next table row line.

+ +

A variable name must start with a letter and may consist of letters and numbers. (i.e. /[a-z][a-z0-9]*/i)

+ +
Variables Example
_table: Result of Variables Example + +$Yes: This option is supported. +$No: This option is **not** supported +$bottom: This just represents an example of + what is possible. Notice that variable + content can span multiple lines. + +| **Feature** | **Supported** | +| Dancing Monkey | $Yes | +| Singing Turtle | $No | +| Newt Hair | $Yes | +| $bottom <|
FeatureSupported 
Dancing MonkeyThis option is supported. 
Singing TurtleThis option is not supported. 
Newt HairThis option is supported. 
This just represents an example of what is possible. Notice that variable content can span multiple lines. 
Result of Variables Example 

Configuration

Configuration is optional (but highly recommended) and may be either a simple JSON file (config.json) or a JS file (config.js) placed in the top of the source folder.

+ +

TODO: example JSON and example JS

+ +

Extensions

+

@inherit< markdown >

Adds an inherits description to a directive. The markdown may contain links.

+ +

@lang< text >

Set the language a code directive should be syntax-highlighted for. If "javascript", the code will be evaluated.

+ +

@nav< text >

Sets the name in the breadcrumbs when not the current node.

+ +

@note< markdown >

Adds a note to a directive. The markdown may contain links. If the directive already has an @INHERIT extension, that will be used instead and the @NOTE will be ignored.

+ +

@src< key >

Calls the configuration getSourceUrl(key, VALUE) to get a URL which will be linked to by a link next to the directive.

+ +

This extended directive function requires an advanced config.js Configuration file since it requires a JavaScript function.

+ +

@style< text >

The Table Style to use for a table directive.

+ + + + + +
+ + + diff --git a/docs/error.html b/docs/error.html new file mode 100644 index 000000000..6e3c8bfbd --- /dev/null +++ b/docs/error.html @@ -0,0 +1,11 @@ + + + + Permanently Moved - Redirecting + + + + + \ No newline at end of file diff --git a/docs/getting-started/README.md b/docs/getting-started/README.md index 87aa77fbc..9133779e8 100644 --- a/docs/getting-started/README.md +++ b/docs/getting-started/README.md @@ -7,61 +7,281 @@ Documentation: [html](https://docs-beta.ethers.io/) Getting Started =============== - - Installing ---------- - -The various Classes and Functions are available to be imported -manually from sub-packages under the [@ethersproject](../Users/ricmoo/Development/ethers/ethers.js-v5/https:/www.npmjs.com/search?q=%40ethersproject%2F) -but for most projects, the umbrella package is the easiest way to -get started. - - ``` /home/ricmoo> npm install --save ethers@next ``` - - Importing --------- - - ### Node.js - - ``` -// CommonJS -const { ethers } = require("ethers"); - -// ES6 or TypeScript const { ethers } = require("ethers"); ``` - +``` +import { ethers } from "ethers"; +``` ### Web Browser - -It is generally better practice (for security reasons) to copy the -[ethers library](../Users/ricmoo/Development/ethers/ethers.js-v5/https:/cdn.ethers.io/lib/ethers-5.0.esm.min.js) to your own webserver and serve it -yourself. - -For quick demos or prototyping though, it can be loaded in your -Web Applications from our CDN. - - ``` ``` +``` + +``` + +Common Terminology +------------------ + +Common Terms ------ -**Content Hash:** 411fea94db73d596369fae807658111c05acc4906540f2790fda6dec071b4d4e \ No newline at end of file +Connecting to Ethereum: Metamask +-------------------------------- + +``` +// A Web3Provider wraps a standard Web3 provider, which is +// what Metamask injects as window.ethereum into each page +const provider = new ethers.providers.Web3Provider(window.ethereum) + +// The Metamask plugin also allows signing transactions to +// send ether and pay to change state within the blockchain. +// For this, we need the account signer... +const signer = provider.getSigner() +``` + +### Querying the Blockchain + +```javascript +// Look up the current block number +provider.getBlockNumber() +//! + +// Get the balance of an account (by address or ENS name) +balance = await provider.getBalance("ethers.eth") +//! async balance + +// Often you will need to format the output for the user +// which prefer to see values in ether (instead of wei) +ethers.utils.formatEther(balance) +//! + +// Or if a user enters a string in an input field, you may need +// to convert it from ether (as a string) to wei (as a BigNumber) +ethers.utils.parseEther("1.0") +//! +``` + +### Writing to the Blockchain + +``` +// Send 1 ether to an ens name. +const tx = signer.sendTransaction({ + to: "ricmoo.firefly.eth", + value: ethers.utils.parseEther("1.0") +}); +``` + +Contracts +--------- + +```javascript +// We can use an ENS name for the contract address +const daiAddress = "dai.tokens.ethers.eth"; + +// The ERC-20 Contract ABI, which is a common contract interface +// for tokens (this is the Human-Readable ABI format) +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", + + // Send some of your tokens to someone else + "function transfer(address to, uint amount)", + + // An event triggered whenever anyone transfers to someone else + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// The Contract object +const daiContract = new ethers.Contract(daiAddress, daiAbi, provider); +``` + +### Read-Only Methods + +```javascript +// +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +// + +// Get the ERC-20 token name +daiContract.name() +//! + +// Get the ERC-20 token synbol (for tickers and UIs) +daiContract.symbol() +//! + +// Get the balance of an address +balance = await daiContract.balanceOf("ricmoo.firefly.eth") +//! async balance + +// Format the DAI for displaying to the user +ethers.utils.formatUnits(balance, 18) +//! +``` + +### State Changing Methods + +``` +// The DAI Contract is currently connected to the Provider, +// which is read-only. We need to connect to a Signer, so +// that we can pay to send state-changing transactions. +const daiWithSigner = contract.connect(signer); + +// Each DAI has 18 decimal places +const dai = ethers.utils.parseUnits("1.0", 18); + +// Send 1 DAI to "ricmoo.firefly.eth" +tx = daiWithSigner.transfer("ricmoo.firefly.eth", dai); +``` + +### Listening to Events + +```javascript +// +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +const formatEther = ethers.utils.formatEther; +// + +// Receive an event when ANY transfer occurs +daiContract.on("Transfer", (from, to, amount, event) => { + console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`); + // The event object contains the verbatim log data, the + // EventFragment and functions to fetch the block, + // transaction and receipt and event functions +}); + +// A filter for when a specific address receives tokens +myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +filter = daiContract.filters.Transfer(null, myAddress) +// +filter +// +//! + +// Receive an event when that filter occurs +daiContract.on(filter, (from, to, amount, event) => { + // The to will always be "address" + console.log(`I got ${ formatEther(amount) } from ${ from }.`); +}); + +// +// Don't want to block the docs from compiling... +daiContract.removeAllListeners(); +// +``` + +### Query Historic Events + +```javascript +// +const signer = new ethers.VoidSigner("0x8ba1f109551bD432803012645Ac136ddd64DBA72"); +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +//! +// + +// Get the address of the Signer +myAddress = await signer.getAddress() +//! async myAddress + +// Filter for all token transfers to me +filterFrom = daiContract.filters.Transfer(myAddress, null); +// +filterFrom +// +//! + +// Filter for all token transfers from me +filterTo = daiContract.filters.Transfer(null, myAddress); +// +filterTo +// +//! + +// List all transfers sent from me a specific block range +daiContract.queryFilter(filterFrom, 9843470, 9843480) +//! + +// +// The following have had the results omitted due to the +// number of entries; but they provide some useful examples +// + +// List all transfers I sent in the last 10,000 blocks +daiContract.queryFilter(filterFrom, -10000) + +// List all transfers ever sent to me +daiContract.queryFilter(filterTo) +``` + +Signing Messages +---------------- + +```javascript +// +const signer = ethers.Wallet.createRandom(); +//! +// + +// To sign a simple string, which can often be used for +// logging into a service, such as CryptoKitties simply +// pass the string in. +signature = await signer.signMessage("Hello World"); +//! async signature + +// +// A common case is also signing a hash, which is 32 +// bytes. It is important to note, that to sign binary +// data it MUST be an Array (or TypedArray) +// + +// This string is 66 chacacters long +message = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" + +// This array representation is 32 bytes long +messageBytes = ethers.utils.arrayify(message); +//! + +// To sign a hash, you most often want to sign the bytes +signature = await signer.signMessage(messageBytes) +//! async signature +``` + diff --git a/docs/getting-started/index.html b/docs/getting-started/index.html index 096da363a..8ea06717a 100644 --- a/docs/getting-started/index.html +++ b/docs/getting-started/index.html @@ -1,16 +1,250 @@ -Getting Started

Getting Started

+ + + + Getting Started + + + + +
+ -

Installing

-

The various Classes and Functions are available to be imported manually from sub-packages under the @ethersproject but for most projects, the umbrella package is the easiest way to get started.

-
/home/ricmoo> npm install --save ethers@next
+

Getting Started

+

Installing

The various Classes and Functions are available to be imported manually from sub-packages under the @ethersproject organization but for most projects, the umbrella package is the easiest way to get started.

-

Importing

+
/home/ricmoo> npm install --save ethers@next

Importing

+

Node.js

+
node.js require
const { ethers } = require("ethers");
ES6 or TypeScript
import { ethers } from "ethers";

Web Browser

It is generally better practice (for security reasons) to copy the ethers library to your own webserver and serve it yourself.

-

Node.js

+

For quick demos or prototyping though, it can be loaded in your Web Applications from our CDN.

-
// CommonJS
const { ethers } = require("ethers");

// ES6 or TypeScript
const { ethers } = require("ethers");
+
ES6 in the Browser
<script src="https://cdn.ethers.io/lib/ethers-5.0.esm.min.js" + type="application/javascipt"></script>
ES3 (UMD) in the Browser
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js" + type="application/javascipt"></script>

Common Terminology

This section needs work...

-

Web Browser

-

It is generally better practice (for security reasons) to copy the ethers library to your own webserver and serve it yourself.

For quick demos or prototyping though, it can be loaded in your Web Applications from our CDN.

-
<script src="https://cdn.ethers.io/lib/ethers-5.0.esm.min.js"
        type="application/javascipt"></script>
-
\ No newline at end of file +
ProviderA Provider (in ethers) is a class which provides an abstraction for a connection to the Ethereum Network. It provides read-only access to the Blockchain and its status. 
SignerA Signer is a class which (usually) in some way directly or indirectly has access to a private key, which can sign messages and transactions to authorize the network to charge your account ether to perform operations. 
ContractA Contract is an abstraction which represents a connection to a specific contract on the Ethereum Network, so that it can be used like a normal JavaScipt object. 
Common Terms 

Connecting to Ethereum: Metamask

The quickest and easiest way to experiment and begin developing on Ethereum is to use 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)

+ +
Connecting to Metamask
// A Web3Provider wraps a standard Web3 provider, which is +// what Metamask injects as window.ethereum into each page +const provider = new ethers.providers.Web3Provider(window.ethereum) + +// The Metamask plugin also allows signing transactions to +// send ether and pay to change state within the blockchain. +// For this, we need the account signer... +const signer = provider.getSigner()

Querying the Blockchain

Once you have a Provider, you have a read-only connection to the blockchain, which can be used to query the current state, fetch historic logs, look up deployed code and so on.

+ +
Basic Queries
// Look up the current block number +provider.getBlockNumber() +//! + +// Get the balance of an account (by address or ENS name) +balance = await provider.getBalance("ethers.eth") +//! async balance + +// Often you will need to format the output for the user +// which prefer to see values in ether (instead of wei) +ethers.utils.formatEther(balance) +//! + +// Or if a user enters a string in an input field, you may need +// to convert it from ether (as a string) to wei (as a BigNumber) +ethers.utils.parseEther("1.0") +//!

Writing to the Blockchain

+
Sending Ether
// Send 1 ether to an ens name. +const tx = signer.sendTransaction({ + to: "ricmoo.firefly.eth", + value: ethers.utils.parseEther("1.0") +});

Contracts

A Contract is an abstraction of program code which lives on the Ethereum blockchain.

+ +

The Contract object makes it easier to use an on-chain Contract as a normal JavaScript object, with the method all mapped to encoding and decoding data for you.

+ +

If you are familiar with Databases, this is similar to ORM.

+ +

In order to communicate with the Contract on-chain, this class needs to know what methods are available and how to encode and decode the data, which is what the Application Binary Interface (API) provides.

+ +

This class is a meta-class, which means its methods are constructed at runtime, when you pass in the ABI to the constructor it uses that to determine which methods to add.

+ +

While a on-chain Contract may have many methods available, you can safely ignore any methods you don't need or use, providing a smaller subset of the ABI to the contract.

+ +

An ABI often comes from the Solidity or Vyper compiler, but may also be placed in the code easily using the Human-Readable ABI, which the following examples use.

+ +
Connecting to the DAI Contract
// We can use an ENS name for the contract address +const daiAddress = "dai.tokens.ethers.eth"; + +// The ERC-20 Contract ABI, which is a common contract interface +// for tokens (this is the Human-Readable ABI format) +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", + + // Send some of your tokens to someone else + "function transfer(address to, uint amount)", + + // An event triggered whenever anyone transfers to someone else + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// The Contract object +const daiContract = new ethers.Contract(daiAddress, daiAbi, provider);

Read-Only Methods

+
Querying the DAI Contract
// <hide> +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +// </hide> + +// Get the ERC-20 token name +daiContract.name() +//! + +// Get the ERC-20 token synbol (for tickers and UIs) +daiContract.symbol() +//! + +// Get the balance of an address +balance = await daiContract.balanceOf("ricmoo.firefly.eth") +//! async balance + +// Format the DAI for displaying to the user +ethers.utils.formatUnits(balance, 18) +//!

State Changing Methods

+
Sending DAI
// The DAI Contract is currently connected to the Provider, +// which is read-only. We need to connect to a Signer, so +// that we can pay to send state-changing transactions. +const daiWithSigner = contract.connect(signer); + +// Each DAI has 18 decimal places +const dai = ethers.utils.parseUnits("1.0", 18); + +// Send 1 DAI to "ricmoo.firefly.eth" +tx = daiWithSigner.transfer("ricmoo.firefly.eth", dai);

Listening to Events

+
Listening to Events
// <hide> +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +const formatEther = ethers.utils.formatEther; +// </hide> + +// Receive an event when ANY transfer occurs +daiContract.on("Transfer", (from, to, amount, event) => { + console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`); + // The event object contains the verbatim log data, the + // EventFragment and functions to fetch the block, + // transaction and receipt and event functions +}); + +// A filter for when a specific address receives tokens +myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +filter = daiContract.filters.Transfer(null, myAddress) +// <hide> +filter +// </hide> +//! + +// Receive an event when that filter occurs +daiContract.on(filter, (from, to, amount, event) => { + // The to will always be "address" + console.log(`I got ${ formatEther(amount) } from ${ from }.`); +}); + +// <hide> +// Don't want to block the docs from compiling... +daiContract.removeAllListeners(); +// </hide>

Query Historic Events

+
Filtering Historic Events
// <hide> +const signer = new ethers.VoidSigner("0x8ba1f109551bD432803012645Ac136ddd64DBA72"); +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +//! +// </hide> + +// Get the address of the Signer +myAddress = await signer.getAddress() +//! async myAddress + +// Filter for all token transfers to me +filterFrom = daiContract.filters.Transfer(myAddress, null); +// <hide> +filterFrom +// </hide> +//! + +// Filter for all token transfers from me +filterTo = daiContract.filters.Transfer(null, myAddress); +// <hide> +filterTo +// </hide> +//! + +// List all transfers sent from me a specific block range +daiContract.queryFilter(filterFrom, 9843470, 9843480) +//! + +// +// The following have had the results omitted due to the +// number of entries; but they provide some useful examples +// + +// List all transfers I sent in the last 10,000 blocks +daiContract.queryFilter(filterFrom, -10000) + +// List all transfers ever sent to me +daiContract.queryFilter(filterTo)

Signing Messages

+
Signing Messages
// <hide> +const signer = ethers.Wallet.createRandom(); +//! +// </hide> + +// To sign a simple string, which can often be used for +// logging into a service, such as CryptoKitties simply +// pass the string in. +signature = await signer.signMessage("Hello World"); +//! async signature + +// +// A common case is also signing a hash, which is 32 +// bytes. It is important to note, that to sign binary +// data it MUST be an Array (or TypedArray) +// + +// This string is 66 chacacters long +message = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" + +// This array representation is 32 bytes long +messageBytes = ethers.utils.arrayify(message); +//! + +// To sign a hash, you most often want to sign the bytes +signature = await signer.signMessage(messageBytes) +//! async signature
+ + + +
+ + + diff --git a/docs/hacking/README.md b/docs/hacking/README.md index 7a54251bd..c84b41d9d 100644 --- a/docs/hacking/README.md +++ b/docs/hacking/README.md @@ -7,63 +7,13 @@ Documentation: [html](https://docs-beta.ethers.io/) Hacking ======= - -Things to keep in mind: - - ### Supported Platforms - -... - - ### Dependencies - -Adding a dependency is non-trivial and will require fairly convincing -arguments. - -Further, **ALL** dependencies for ethers, **must** be MIT licensed or -public domain (CC0). - -All contributions to ethers are then included under the MIT license. - - ### Printable ASCII (7-bit) Characters - -All source and documentation files should ONLY use the printable ASCII -set. - -This is for several reasons, bu... - - - -* Transmission over certain HTTP servers and proxies can mangle UTF-8 data -* Certain editors on some platforms, or in certain terminals cannot handle UTF-8 characters elegantly -* The ability to enter non-ASCII characters on some platforms require special keyboards, input devices or input methods to be installed, which either not be supported, or may require administrative priviledges. - - ### License - -MIT... - - ### Other Considerations - -A common argument to Pull Requests is that they are simple, backwards compatible -and - -It is important to remember that a small change is something that -we are required to support in perpetuity. - -For example, adding support for an obscure platform, such as adding a dot-file -to the root of the package, now carries the implication that we will continue -keeping that dot-file up-to-date as new versions of that platform are released. - - - ------ -**Content Hash:** f57a28af18b23637056db38ed6a6d081daf52dccb227dd23f73e161dd7894517 \ No newline at end of file diff --git a/docs/hacking/index.html b/docs/hacking/index.html index 634ea3588..5cdf9f1bb 100644 --- a/docs/hacking/index.html +++ b/docs/hacking/index.html @@ -1,12 +1,53 @@ -Hacking

Hacking

-

Things to keep in mind:

-

Supported Platforms

-

...

-

Dependencies

-

Adding a dependency is non-trivial and will require fairly convincing arguments.

Further, ALL dependencies for ethers, must be MIT licensed or public domain (CC0).

All contributions to ethers are then included under the MIT license.

-

Printable ASCII (7-bit) Characters

-

All source and documentation files should ONLY use the printable ASCII set.

This is for several reasons, bu...

  • Transmission over certain HTTP servers and proxies can mangle UTF-8 data
  • Certain editors on some platforms, or in certain terminals cannot handle UTF-8 characters elegantly
  • The ability to enter non-ASCII characters on some platforms require special keyboards, input devices or input methods to be installed, which either not be supported, or may require administrative priviledges.
-

License

-

MIT...

-

Other Considerations

-

A common argument to Pull Requests is that they are simple, backwards compatible and

It is important to remember that a small change is something that we are required to support in perpetuity.

For example, adding support for an obscure platform, such as adding a dot-file to the root of the package, now carries the implication that we will continue keeping that dot-file up-to-date as new versions of that platform are released.

\ No newline at end of file + + + + Hacking + + + + +
+ + +

Hacking

Things to keep in mind:

+ +

Supported Platforms

...

+ +

Dependencies

Adding a dependency is non-trivial and will require fairly convincing arguments.

+ +

Further, ALL dependencies for ethers, must be MIT licensed or public domain (CC0).

+ +

All contributions to ethers are then included under the MIT license.

+ +

Printable ASCII (7-bit) Characters

All source and documentation files should ONLY use the printable ASCII set.

+ +

This is for several reasons, bu...

+ +

  • Transmission over certain HTTP servers and proxies can mangle UTF-8 data
  • Certain editors on some platforms, or in certain terminals cannot handle UTF-8 characters elegantly
  • The ability to enter non-ASCII characters on some platforms require special keyboards, input devices or input methods to be installed, which either not be supported, or may require administrative priviledges.

+ +

License

MIT...

+ +

Other Considerations

A common argument to Pull Requests is that they are simple, backwards compatible and

+ +

It is important to remember that a small change is something that we are required to support in perpetuity.

+ +

For example, adding support for an obscure platform, such as adding a dot-file to the root of the package, now carries the implication that we will continue keeping that dot-file up-to-date as new versions of that platform are released.

+ + + + + +
+ + + diff --git a/docs/index.html b/docs/index.html index bce245a3b..9035d3b81 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,11 +1,39 @@ -Documentation

Documentation

+ + + + Documentation + + + + +
+ -

What is Ethers?

-

The ethers.js library aims to be a complete and compact library for interacting with the Ethereum Blockchain and its ecosystem. It was originally designed for use with ethers . io and has since expanded into a much more general-purpose library.

-

Features

-
  • Keep your private keys in your client, safe and sound
  • Import and export JSON wallets (Geth, Parity and crowdsale)
  • Import and export BIP 39 mnemonic phrases (12 word backup phrases) and HD Wallets (English, Italian, Japanese, Korean, Simplified Chinese, Traditional Chinese; more coming soon)
  • Meta-classes create JavaScript objects from any contract ABI, including ABIv2 and Human-Readable ABI
  • Connect to Ethereum nodes over JSON-RPC, INFURA, Etherscan, Alchemy, Cloudflare or MetaMask.
  • ENS names are first-class citizens; they can be used anywhere an Ethereum addresses can be used
  • Tiny (~88kb compressed; 284kb uncompressed)
  • Complete functionality for all your Ethereum needs
  • Extensive documentation
  • Large collection of test cases which are maintained and added to
  • Fully TypeScript ready, with definition files and full TypeScript source
  • MIT License (including ALL dependencies); completely open source to do with as you please
-

Developer Documentation

+

Documentation

+

What is Ethers?

The ethers.js library aims to be a complete and compact library for interacting with the Ethereum Blockchain and its ecosystem. It was originally designed for use with ethers.io and has since expanded into a much more general-purpose library.

-
Gas
Help
Help
Help
Help
CLI
-

Legacy Documentation

-

This section will be kept up to date, linking to documentation of older versions of the library.

\ No newline at end of file +

Features

  • Keep your private keys in your client, safe and sound
  • Import and export JSON wallets (Geth, Parity and crowdsale)
  • Import and export BIP 39 mnemonic phrases (12 word backup phrases) and HD Wallets (English, Italian, Japanese, Korean, Simplified Chinese, Traditional Chinese; more coming soon)
  • Meta-classes create JavaScript objects from any contract ABI, including ABIv2 and Human-Readable ABI
  • Connect to Ethereum nodes over JSON-RPC, INFURA, Etherscan, Alchemy, Cloudflare or MetaMask.
  • ENS names are first-class citizens; they can be used anywhere an Ethereum addresses can be used
  • Tiny (~88kb compressed; 284kb uncompressed)
  • Complete functionality for all your Ethereum needs
  • Extensive documentation
  • Large collection of test cases which are maintained and added to
  • Fully TypeScript ready, with definition files and full TypeScript source
  • MIT License (including ALL dependencies); completely open source to do with as you please

+ +

Developer Documentation

+
Gas
HMAC
Help
Help
Help
Help
CLI
Code

Legacy Documentation

This section will be kept up to date, linking to documentation of older versions of the library.

+ +

+ + + + + +
+ + + diff --git a/docs/license/README.md b/docs/license/README.md index 0d9ce3193..2f340026b 100644 --- a/docs/license/README.md +++ b/docs/license/README.md @@ -7,36 +7,5 @@ Documentation: [html](https://docs-beta.ethers.io/) License and Copyright ===================== - -The ethers library (including all dependencies) are available -under the [MIT License](../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.m.wikipedia.org/wiki/MIT_License), which permits a wide variety -of uses. - - ### MIT License - -*Copyright © 2019 [Richard Moore](mailto:me@ricmoo.com).* - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - - ------ -**Content Hash:** f93ae36efa5d9733ec319cccff24c21e2e991bca11a32fc4773794d1901f8f4e \ No newline at end of file diff --git a/docs/license/index.html b/docs/license/index.html index b7a293e15..a3076f7d7 100644 --- a/docs/license/index.html +++ b/docs/license/index.html @@ -1,4 +1,39 @@ -License and Copyright

License and Copyright

-

The ethers library (including all dependencies) are available under the MIT License, which permits a wide variety of uses.

-

MIT License

-

Copyright © 2019 Richard Moore.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

\ No newline at end of file + + + + License and Copyright + + + + +
+ + +

License and Copyright

The ethers library (including all dependencies) are available under the MIT License, which permits a wide variety of uses.

+ +

MIT License

Copyright © 2019 Richard Moore.

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ + + + + +
+ + + diff --git a/docs/migration/README.md b/docs/migration/README.md index 997309d0c..cef98e9b5 100644 --- a/docs/migration/README.md +++ b/docs/migration/README.md @@ -7,11 +7,6 @@ Documentation: [html](https://docs-beta.ethers.io/) Migration Guide =============== - -Here are some migration guides when upgrading from older versions -of Ethers or other libraries. - - * [Migration: From Web3.js](web3) * [Contracts](web3) * [Providers](web3) @@ -25,7 +20,3 @@ of Ethers or other libraries. * [Utilities](ethers-v4) * [Wallet](ethers-v4) - - ------ -**Content Hash:** 1c08c66f8c8376f30781c83ea1697b5004b361b2d69ec89fd70a4131e1003256 \ No newline at end of file diff --git a/docs/migration/ethers-v4/README.md b/docs/migration/ethers-v4/README.md index c79dc0ea8..4575ce3cd 100644 --- a/docs/migration/ethers-v4/README.md +++ b/docs/migration/ethers-v4/README.md @@ -7,20 +7,11 @@ Documentation: [html](https://docs-beta.ethers.io/) Migration: From Ethers v4 ========================= - - BigNumber --------- - - ### Namespace - -Since [BigNumber](../../api/utils/bignumber) is used quite frequently, it has been moved to -the top level of the umbrella package. - - ``` // v4 ethers.utils.BigNumber @@ -31,17 +22,8 @@ ethers.BigNumber ethers.BigNumberish ``` - - ### Creating Instances - -The `bigNumberify` method was always preferred over the constructor -since it could short-circuit an object instantiation for [[bignumber] -objects (since they are immutable). This has been moved to a static -`from` class method. - - ``` // v4 new ethers.utils.BigNumber(someValue) @@ -53,33 +35,18 @@ ethers.utils.bigNumberify(someValue); ethers.BigNumber.from(someValue) ``` - - Contracts --------- - ``` -TODO +// @TODO ``` - - Errors ------ - - ### Namespace - -All errors now belong to the [Logger](../../api/utils/logger) class and the related functions -have been moved to [Logger](../../api/utils/logger) instances, which can include a per-package -version string. - -Global error fucntions have been moved [Logger](../../api/utils/logger) class methods. - - ``` // v4 ethers.errors.UNKNOWN_ERROR @@ -111,22 +78,11 @@ logger.warn(...) logger.info(...) ``` - - Interface --------- - -The [Interface](../../api/utils/abi/interface) object has undergone the most dramatic changes. - -It is no longer a meta-class and now has methods that simplify handling -contract interface operations without the need for object inspection and -special edge cases. - - ### Functions - ``` // v4 (example: "transfer(address to, uint amount)") interface.functions.transfer.encode(to, amount) @@ -143,11 +99,8 @@ interface.encodeData("transfer(address,uint)", [ to, amount ]) interface.decodeResult("transfer(address to, uint256 amount)", data) ``` - - ### Events - ``` // v4 (example: Transfer(address indexed, address indexed, uint256) interface.events.Transfer.encodeTopics(values) @@ -158,15 +111,8 @@ interface.encodeFilterTopics("Transfer", values) interface.encodeEventLog("Transfer", data, topics) ``` - - ### Inspection - -Interrogating properties about a function or event can now (mostly) be -done directly on the [Fragment](../../api/utils/abi/fragments) object. - - ``` // v4 interface.functions.transfer.name @@ -218,34 +164,20 @@ const eventSig = eventFragment.format() const topic = interface.getTopic(eventFragment) ``` - - Utilities --------- - - ### Renaming - ``` -TODO +// @TODO ``` - - Wallet ------ - - ### Mnemonic Phrases - -The **mnemonic** phrase and related properties have been merged into -a single `mnemonic` object, which also now includes the `locale`. - - ``` // v4 wallet.mnemonic @@ -258,8 +190,3 @@ wallet.mnemonic.phrase wallet.mnemonic.path ``` - - - ------ -**Content Hash:** 27061bfb6d646d514915e15779b869747049a93a7f75eda79a9f92fdb81b41ae \ No newline at end of file diff --git a/docs/migration/ethers-v4/index.html b/docs/migration/ethers-v4/index.html index 95ef29fc7..31f0094f0 100644 --- a/docs/migration/ethers-v4/index.html +++ b/docs/migration/ethers-v4/index.html @@ -1,44 +1,167 @@ -Migration: From Ethers v4

Migration: From Ethers v4

+ + + + Migration: From Ethers v4 + + + + +
+ -

BigNumber

+

Migration: From Ethers v4

+

BigNumber

+

Namespace

Since BigNumber is used quite frequently, it has been moved to the top level of the umbrella package.

-

Namespace

-

Since BigNumber is used quite frequently, it has been moved to the top level of the umbrella package.

-
// v4
ethers.utils.BigNumber
ethers.utils.BigNumberish

// v5
ethers.BigNumber
ethers.BigNumberish
+
// v4 +ethers.utils.BigNumber +ethers.utils.BigNumberish -

Creating Instances

-

The bigNumberify method was always preferred over the constructor since it could short-circuit an object instantiation for [[bignumber] objects (since they are immutable). This has been moved to a static from class method.

-
// v4
new ethers.utils.BigNumber(someValue)
ethers.utils.bigNumberify(someValue);

// v5
// - Constructor is private
// - Removed `bigNumberify`
ethers.BigNumber.from(someValue)
+// v5 +ethers.BigNumber +ethers.BigNumberish

Creating Instances

The bigNumberify method was always preferred over the constructor since it could short-circuit an object instantiation for [[BigNumber] objects (since they are immutable). This has been moved to a static from class method.

-

Contracts

-
TODO
+
// v4 +new ethers.utils.BigNumber(someValue) +ethers.utils.bigNumberify(someValue); -

Errors

+// v5 +// - Constructor is private +// - Removed `bigNumberify` +ethers.BigNumber.from(someValue)

Contracts

+
// @TODO

Errors

+

Namespace

All errors now belong to the Logger class and the related functions have been moved to Logger instances, which can include a per-package version string.

-

Namespace

-

All errors now belong to the Logger class and the related functions have been moved to Logger instances, which can include a per-package version string.

Global error fucntions have been moved Logger class methods.

-
// v4
ethers.errors.UNKNOWN_ERROR
ethers.errors.*

errors.setCensorship(censorship, permanent)
errors.setLogLevel(logLevel)

errors.checkArgumentCount(count, expectedCount, suffix)
errors.checkNew(self, kind)
errors.checkNormalize()
errors.throwError(message, code, params)
errors.warn(...)
errors.info(...)

// v5
ethers.utils.Logger.errors.UNKNOWN_ERROR
ethers.utils.Logger.errors.*

Logger.setCensorship(censorship, permanent)
Logger.setLogLevel(logLevel)

const logger = new ethers.utils.Logger(version);
logger.checkArgumentCount(count, expectedCount, suffix)
logger.checkNew(self, kind)
logger.checkNormalize()
logger.throwError(message, code, params)
logger.warn(...)
logger.info(...)
+

Global error fucntions have been moved Logger class methods.

-

Interface

-

The Interface object has undergone the most dramatic changes.

It is no longer a meta-class and now has methods that simplify handling contract interface operations without the need for object inspection and special edge cases.

-

Functions

-
// v4 (example: "transfer(address to, uint amount)")
interface.functions.transfer.encode(to, amount)
interface.functions.transfer.decode(callData)

// v5
interface.encodeData("transfer", [ to, amount ])
interface.decodeResult("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)
+
// v4 +ethers.errors.UNKNOWN_ERROR +ethers.errors.* -

Events

-
// v4 (example: Transfer(address indexed, address indexed, uint256)
interface.events.Transfer.encodeTopics(values)
interface.events.Transfer.decode(data, topics)

// v5
interface.encodeFilterTopics("Transfer", values)
interface.encodeEventLog("Transfer", data, topics)
+errors.setCensorship(censorship, permanent) +errors.setLogLevel(logLevel) -

Inspection

-

Interrogating properties about a function or event can now (mostly) be done directly on the Fragment object.

-
// v4
interface.functions.transfer.name
interface.functions.transfer.inputs
interface.functions.transfer.outputs
interface.functions.transfer.payable
interface.functions.transfer.gas

// v5
const functionFragment = interface.getFunction("transfer")
functionFragment.name
functionFragment.inputs
functionFragment.outputs
functionFragment.payable
functionFragment.gas


// v4; type is "call" or "transaction"
interface.functions.transfer.type

// v5; constant is true (i.e. "call") or false (i.e. "transaction")
functionFragment.constant


// v4
interface.events.Transfer.anonymous
interface.events.Transfer.inputs
interface.events.Transfer.name

// v5
const eventFragment = interface.getEvent("Transfer");
eventFragment.anonymous
eventFragment.inputs
eventFragment.name


// v4
const functionSig = interface.functions.transfer.signature
const sighash = interface.functions.transfer.sighash

const eventSig = interface.events.Transfer.signature
const topic = interface.events.Transfer.topic

// v5
const functionSig = functionFragment.format()
const sighash = interface.getSighash(functionFragment)

const eventSig = eventFragment.format()
const topic = interface.getTopic(eventFragment)
+errors.checkArgumentCount(count, expectedCount, suffix) +errors.checkNew(self, kind) +errors.checkNormalize() +errors.throwError(message, code, params) +errors.warn(...) +errors.info(...) -

Utilities

+// v5 +ethers.utils.Logger.errors.UNKNOWN_ERROR +ethers.utils.Logger.errors.* -

Renaming

-
TODO
+Logger.setCensorship(censorship, permanent) +Logger.setLogLevel(logLevel) -

Wallet

+const logger = new ethers.utils.Logger(version); +logger.checkArgumentCount(count, expectedCount, suffix) +logger.checkNew(self, kind) +logger.checkNormalize() +logger.throwError(message, code, params) +logger.warn(...) +logger.info(...)

Interface

The Interface object has undergone the most dramatic changes.

-

Mnemonic Phrases

-

The mnemonic phrase and related properties have been merged into a single mnemonic object, which also now includes the locale.

-
// v4
wallet.mnemonic
wallet.path

// v5
// - Mnemonic phrase and path are a Mnemonic object
// - Note: wallet.mnemonic is null if there is no mnemonic
wallet.mnemonic.phrase
wallet.mnemonic.path
-
\ No newline at end of file +

It is no longer a meta-class and now has methods that simplify handling contract interface operations without the need for object inspection and special edge cases.

+ +

Functions

+
// v4 (example: "transfer(address to, uint amount)") +interface.functions.transfer.encode(to, amount) +interface.functions.transfer.decode(callData) + +// v5 +interface.encodeData("transfer", [ to, amount ]) +interface.decodeResult("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)

Events

+
// v4 (example: Transfer(address indexed, address indexed, uint256) +interface.events.Transfer.encodeTopics(values) +interface.events.Transfer.decode(data, topics) + +// v5 +interface.encodeFilterTopics("Transfer", values) +interface.encodeEventLog("Transfer", data, topics)

Inspection

Interrogating properties about a function or event can now (mostly) be done directly on the Fragment object.

+ +
// v4 +interface.functions.transfer.name +interface.functions.transfer.inputs +interface.functions.transfer.outputs +interface.functions.transfer.payable +interface.functions.transfer.gas + +// v5 +const functionFragment = interface.getFunction("transfer") +functionFragment.name +functionFragment.inputs +functionFragment.outputs +functionFragment.payable +functionFragment.gas + + +// v4; type is "call" or "transaction" +interface.functions.transfer.type + +// v5; constant is true (i.e. "call") or false (i.e. "transaction") +functionFragment.constant + + +// v4 +interface.events.Transfer.anonymous +interface.events.Transfer.inputs +interface.events.Transfer.name + +// v5 +const eventFragment = interface.getEvent("Transfer"); +eventFragment.anonymous +eventFragment.inputs +eventFragment.name + + +// v4 +const functionSig = interface.functions.transfer.signature +const sighash = interface.functions.transfer.sighash + +const eventSig = interface.events.Transfer.signature +const topic = interface.events.Transfer.topic + +// v5 +const functionSig = functionFragment.format() +const sighash = interface.getSighash(functionFragment) + +const eventSig = eventFragment.format() +const topic = interface.getTopic(eventFragment)

Utilities

+

Renaming

+
// @TODO

Wallet

+

Mnemonic Phrases

The mnemonic phrase and related properties have been merged into a single mnemonic object, which also now includes the locale.

+ +
// v4 +wallet.mnemonic +wallet.path + +// v5 +// - Mnemonic phrase and path are a Mnemonic object +// - Note: wallet.mnemonic is null if there is no mnemonic +wallet.mnemonic.phrase +wallet.mnemonic.path
+ + + +
+ + + diff --git a/docs/migration/index.html b/docs/migration/index.html index 7be8ffb55..1bede9ec1 100644 --- a/docs/migration/index.html +++ b/docs/migration/index.html @@ -1,3 +1,31 @@ -Migration Guide

Migration Guide

-

Here are some migration guides when upgrading from older versions of Ethers or other libraries.

-
\ No newline at end of file + + + + Migration Guide + + + + +
+ + +

Migration Guide

Here are some migration guides when upgrading from older versions of Ethers or other libraries.

+ + + + + +
+ + + diff --git a/docs/migration/web3/README.md b/docs/migration/web3/README.md index f9df67c14..23c5517f9 100644 --- a/docs/migration/web3/README.md +++ b/docs/migration/web3/README.md @@ -7,30 +7,15 @@ Documentation: [html](https://docs-beta.ethers.io/) Migration: From Web3.js ======================= - -TODO - - Contracts --------- - - Providers --------- - - Numbers ------- - - Utilities --------- - - - ------ -**Content Hash:** 77d9bed6b0199d2a552743da8d57cdbf55032b2178a366b3eaf8587bda168cec \ No newline at end of file diff --git a/docs/migration/web3/index.html b/docs/migration/web3/index.html index 4f43cf499..94024a1be 100644 --- a/docs/migration/web3/index.html +++ b/docs/migration/web3/index.html @@ -1,10 +1,35 @@ -Migration: From Web3.js

Migration: From Web3.js

-

TODO

-

Contracts

+ + + + Migration: From Web3.js + + + + +
+ -

Providers

+

Migration: From Web3.js

TODO

-

Numbers

+

Contracts

+

Providers

+

Numbers

+

Utilities

-

Utilities

-
\ No newline at end of file + + + +
+ + + diff --git a/docs/quick-start/README.md b/docs/quick-start/README.md new file mode 100644 index 000000000..221ef6395 --- /dev/null +++ b/docs/quick-start/README.md @@ -0,0 +1,156 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Quick Start +=========== + +Connecting to Ethereum: Metamask +-------------------------------- + +``` +// A Web3Provider wraps a standard Web3 provider, which is +// what Metamask injects into every page you visit as window.ethereum +const provider = new ethers.providers.Web3Provider(window.ethereum) + +// The Metamask plugin also allows signing transactions to send ether +// and pay to change state within the blockchain. For this, we need +// the account signer... +const signer = provider.getSigner() +``` + +### Querying the Blockchain + +``` +// +const provider = ethers.getDefaultProvider(); +// + +// Look up the current block number +provider.getBlockNumber() + +// Get the balance of an account (by address or ENS name) +provider.getBalance("ethers.eth") +``` + +### Writing to the Blockchain + +``` +// Send 1 ether to an ens name. +const tx = signer.sendTransaction({ + to: "ricmoo.firefly.eth", + value: ethers.utils.parseEther("1.0") +}); +``` + +Contracts +--------- + +### Connecting to a Contract + +``` +// The ERC-20 Contract ABI, which is a common contract interface +// for tokens. +const abi = [ + // Some simple details about the token + "function namd() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", + + // Send some of your tokens to someone else + "function transfer(address to, uint amount")", + + // An event triggered whenever anyone transfers to someone else + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +const contract = new ethers.Contract(address, abi, provider); + +const contract = new ethers.Contract(address, abi, provider); +``` + +### Read-Only Methods + +``` +// +// + +const contract = new Contract("dai.tokens.ethers.eth", abi, provider); + +contract.name() +//! + +contract.symbol() +//! + +contract.balanceOf("ricmoo.firefly.eth") +//! +``` + +### State Changing Methods + +### Listening to Events + +``` +// +const contract = ... +// + +// Receive an event when ANY transfer occurs +contract.on("Transfer", (from, to, amount, event) => { + console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`); +}); + +// Receive an event when a specific address receives a token +const filter = contract.filters.Transfer(null, address) +contract.on(filter, (from, to, amount, event) => { + // The to will always be "address" + console.log(`I got ${ formatEther(amount) } from ${ from }.`); +}); +``` + +### Listing Historic Events + +``` +// List all transfers from anyone to anyone in the first XXX +contract.queryFilter("Transfer", 0, XXX) +//! +``` + +``` +// +const contract = ... +// + +const address = signer.getAddress() + +// Filter for all token transfers we've sent +const filterFrom = contract.filter.Transfer(address, null); +// +filterFrom +// +//! + +// Filter for all token transfers we've received +const filterTo = contract.filter.Transfer(null, address); +// +filterTo +// +//! + +// List all transfers we've sent between ... +contract.queryFilter(filterFrom, 0, 100000) +//! + +// List all transfers we've received in blockhash XXX +contract.queryFilter(filterTo, XXX) +//! +``` + +Signing Messages +---------------- + diff --git a/docs/quick-start/index.html b/docs/quick-start/index.html new file mode 100644 index 000000000..129f0a0b6 --- /dev/null +++ b/docs/quick-start/index.html @@ -0,0 +1,142 @@ + + + + Quick Start + + + + +
+ + +

Quick Start

+

Connecting to Ethereum: Metamask

The quickest and easiest way to experiment and begin developing on Ethereum is to use Metamask, which is a browser extension that provider:

+ +

  • A connection to the Ethereum network
  • Holds your private key and can sign thing

+ +
Connecting to Metamask
// A Web3Provider wraps a standard Web3 provider, which is +// what Metamask injects into every page you visit as window.ethereum +const provider = new ethers.providers.Web3Provider(window.ethereum) + +// The Metamask plugin also allows signing transactions to send ether +// and pay to change state within the blockchain. For this, we need +// the account signer... +const signer = provider.getSigner()

Querying the Blockchain

Once you have a Provider, you have a read-only connection to the blockchain, which can be used to query the current state, fetch historic logs, look up deployed code and so on.

+ +
Basic Queries
// <hide> +const provider = ethers.getDefaultProvider(); +// </hide> + +// Look up the current block number +provider.getBlockNumber() + +// Get the balance of an account (by address or ENS name) +provider.getBalance("ethers.eth")

Writing to the Blockchain

Every write costs ... etc

+ +
Sending Ether
// Send 1 ether to an ens name. +const tx = signer.sendTransaction({ + to: "ricmoo.firefly.eth", + value: ethers.utils.parseEther("1.0") +});

Contracts

+

Connecting to a Contract

To connect to an contract...

+ +

Explain ABI

+ +

Explain meta-class and the aBI

+ +
Connecting to a Contract
// The ERC-20 Contract ABI, which is a common contract interface +// for tokens. +const abi = [ + // Some simple details about the token + "function namd() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", + + // Send some of your tokens to someone else + "function transfer(address to, uint amount")", + + // An event triggered whenever anyone transfers to someone else + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +const contract = new ethers.Contract(address, abi, provider); + +const contract = new ethers.Contract(address, abi, provider);

Read-Only Methods

+
Querying the DAI Contract
// <hide> +// </hide> + +const contract = new Contract("dai.tokens.ethers.eth", abi, provider); + +contract.name() +//! + +contract.symbol() +//! + +contract.balanceOf("ricmoo.firefly.eth") +//!

State Changing Methods

+

Listening to Events

+
Listening to Events
// <hide> +const contract = ... +// </hide> + +// Receive an event when ANY transfer occurs +contract.on("Transfer", (from, to, amount, event) => { + console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`); +}); + +// Receive an event when a specific address receives a token +const filter = contract.filters.Transfer(null, address) +contract.on(filter, (from, to, amount, event) => { + // The to will always be "address" + console.log(`I got ${ formatEther(amount) } from ${ from }.`); +});

Listing Historic Events

+
Historic Events by Name
// List all transfers from anyone to anyone in the first XXX +contract.queryFilter("Transfer", 0, XXX) +//!
Filtering Historic Events
// <hide> +const contract = ... +// </hide> + +const address = signer.getAddress() + +// Filter for all token transfers we've sent +const filterFrom = contract.filter.Transfer(address, null); +// <hide> +filterFrom +// </hide> +//! + +// Filter for all token transfers we've received +const filterTo = contract.filter.Transfer(null, address); +// <hide> +filterTo +// </hide> +//! + +// List all transfers we've sent between ... +contract.queryFilter(filterFrom, 0, 100000) +//! + +// List all transfers we've received in blockhash XXX +contract.queryFilter(filterTo, XXX) +//!

Signing Messages

+ + + + +
+ + + diff --git a/docs/single-page/index.html b/docs/single-page/index.html new file mode 100644 index 000000000..d32811f11 --- /dev/null +++ b/docs/single-page/index.html @@ -0,0 +1,3874 @@ + + + + ethers + + + + +
+ +

Documentation

+

What is Ethers?

The ethers.js library aims to be a complete and compact library for interacting with the Ethereum Blockchain and its ecosystem. It was originally designed for use with ethers.io and has since expanded into a much more general-purpose library.

+ +

Features

  • Keep your private keys in your client, safe and sound
  • Import and export JSON wallets (Geth, Parity and crowdsale)
  • Import and export BIP 39 mnemonic phrases (12 word backup phrases) and HD Wallets (English, Italian, Japanese, Korean, Simplified Chinese, Traditional Chinese; more coming soon)
  • Meta-classes create JavaScript objects from any contract ABI, including ABIv2 and Human-Readable ABI
  • Connect to Ethereum nodes over JSON-RPC, INFURA, Etherscan, Alchemy, Cloudflare or MetaMask.
  • ENS names are first-class citizens; they can be used anywhere an Ethereum addresses can be used
  • Tiny (~88kb compressed; 284kb uncompressed)
  • Complete functionality for all your Ethereum needs
  • Extensive documentation
  • Large collection of test cases which are maintained and added to
  • Fully TypeScript ready, with definition files and full TypeScript source
  • MIT License (including ALL dependencies); completely open source to do with as you please

+ +

Developer Documentation

+

Legacy Documentation

This section will be kept up to date, linking to documentation of older versions of the library.

+ +

+ +

Getting Started

+

Installing

The various Classes and Functions are available to be imported manually from sub-packages under the @ethersproject organization but for most projects, the umbrella package is the easiest way to get started.

+ +
/home/ricmoo> npm install --save ethers@next

Importing

+

Node.js

+
node.js require
const { ethers } = require("ethers");
ES6 or TypeScript
import { ethers } from "ethers";

Web Browser

It is generally better practice (for security reasons) to copy the ethers library to your own webserver and serve it yourself.

+ +

For quick demos or prototyping though, it can be loaded in your Web Applications from our CDN.

+ +
ES6 in the Browser
<script src="https://cdn.ethers.io/lib/ethers-5.0.esm.min.js" + type="application/javascipt"></script>
ES3 (UMD) in the Browser
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js" + type="application/javascipt"></script>

Common Terminology

This section needs work...

+ +
ProviderA Provider (in ethers) is a class which provides an abstraction for a connection to the Ethereum Network. It provides read-only access to the Blockchain and its status. 
SignerA Signer is a class which (usually) in some way directly or indirectly has access to a private key, which can sign messages and transactions to authorize the network to charge your account ether to perform operations. 
ContractA Contract is an abstraction which represents a connection to a specific contract on the Ethereum Network, so that it can be used like a normal JavaScipt object. 
Common Terms 

Connecting to Ethereum: Metamask

The quickest and easiest way to experiment and begin developing on Ethereum is to use 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)

+ +
Connecting to Metamask
// A Web3Provider wraps a standard Web3 provider, which is +// what Metamask injects as window.ethereum into each page +const provider = new ethers.providers.Web3Provider(window.ethereum) + +// The Metamask plugin also allows signing transactions to +// send ether and pay to change state within the blockchain. +// For this, we need the account signer... +const signer = provider.getSigner()

Querying the Blockchain

Once you have a Provider, you have a read-only connection to the blockchain, which can be used to query the current state, fetch historic logs, look up deployed code and so on.

+ +
Basic Queries
// Look up the current block number +provider.getBlockNumber() +//! + +// Get the balance of an account (by address or ENS name) +balance = await provider.getBalance("ethers.eth") +//! async balance + +// Often you will need to format the output for the user +// which prefer to see values in ether (instead of wei) +ethers.utils.formatEther(balance) +//! + +// Or if a user enters a string in an input field, you may need +// to convert it from ether (as a string) to wei (as a BigNumber) +ethers.utils.parseEther("1.0") +//!

Writing to the Blockchain

+
Sending Ether
// Send 1 ether to an ens name. +const tx = signer.sendTransaction({ + to: "ricmoo.firefly.eth", + value: ethers.utils.parseEther("1.0") +});

Contracts

A Contract is an abstraction of program code which lives on the Ethereum blockchain.

+ +

The Contract object makes it easier to use an on-chain Contract as a normal JavaScript object, with the method all mapped to encoding and decoding data for you.

+ +

If you are familiar with Databases, this is similar to ORM.

+ +

In order to communicate with the Contract on-chain, this class needs to know what methods are available and how to encode and decode the data, which is what the Application Binary Interface (API) provides.

+ +

This class is a meta-class, which means its methods are constructed at runtime, when you pass in the ABI to the constructor it uses that to determine which methods to add.

+ +

While a on-chain Contract may have many methods available, you can safely ignore any methods you don't need or use, providing a smaller subset of the ABI to the contract.

+ +

An ABI often comes from the Solidity or Vyper compiler, but may also be placed in the code easily using the Human-Readable ABI, which the following examples use.

+ +
Connecting to the DAI Contract
// We can use an ENS name for the contract address +const daiAddress = "dai.tokens.ethers.eth"; + +// The ERC-20 Contract ABI, which is a common contract interface +// for tokens (this is the Human-Readable ABI format) +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", + + // Send some of your tokens to someone else + "function transfer(address to, uint amount)", + + // An event triggered whenever anyone transfers to someone else + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// The Contract object +const daiContract = new ethers.Contract(daiAddress, daiAbi, provider);

Read-Only Methods

+
Querying the DAI Contract
// <hide> +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +// </hide> + +// Get the ERC-20 token name +daiContract.name() +//! + +// Get the ERC-20 token synbol (for tickers and UIs) +daiContract.symbol() +//! + +// Get the balance of an address +balance = await daiContract.balanceOf("ricmoo.firefly.eth") +//! async balance + +// Format the DAI for displaying to the user +ethers.utils.formatUnits(balance, 18) +//!

State Changing Methods

+
Sending DAI
// The DAI Contract is currently connected to the Provider, +// which is read-only. We need to connect to a Signer, so +// that we can pay to send state-changing transactions. +const daiWithSigner = contract.connect(signer); + +// Each DAI has 18 decimal places +const dai = ethers.utils.parseUnits("1.0", 18); + +// Send 1 DAI to "ricmoo.firefly.eth" +tx = daiWithSigner.transfer("ricmoo.firefly.eth", dai);

Listening to Events

+
Listening to Events
// <hide> +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +const formatEther = ethers.utils.formatEther; +// </hide> + +// Receive an event when ANY transfer occurs +daiContract.on("Transfer", (from, to, amount, event) => { + console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`); + // The event object contains the verbatim log data, the + // EventFragment and functions to fetch the block, + // transaction and receipt and event functions +}); + +// A filter for when a specific address receives tokens +myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +filter = daiContract.filters.Transfer(null, myAddress) +// <hide> +filter +// </hide> +//! + +// Receive an event when that filter occurs +daiContract.on(filter, (from, to, amount, event) => { + // The to will always be "address" + console.log(`I got ${ formatEther(amount) } from ${ from }.`); +}); + +// <hide> +// Don't want to block the docs from compiling... +daiContract.removeAllListeners(); +// </hide>

Query Historic Events

+
Filtering Historic Events
// <hide> +const signer = new ethers.VoidSigner("0x8ba1f109551bD432803012645Ac136ddd64DBA72"); +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +//! +// </hide> + +// Get the address of the Signer +myAddress = await signer.getAddress() +//! async myAddress + +// Filter for all token transfers to me +filterFrom = daiContract.filters.Transfer(myAddress, null); +// <hide> +filterFrom +// </hide> +//! + +// Filter for all token transfers from me +filterTo = daiContract.filters.Transfer(null, myAddress); +// <hide> +filterTo +// </hide> +//! + +// List all transfers sent from me a specific block range +daiContract.queryFilter(filterFrom, 9843470, 9843480) +//! + +// +// The following have had the results omitted due to the +// number of entries; but they provide some useful examples +// + +// List all transfers I sent in the last 10,000 blocks +daiContract.queryFilter(filterFrom, -10000) + +// List all transfers ever sent to me +daiContract.queryFilter(filterTo)

Signing Messages

+
Signing Messages
// <hide> +const signer = ethers.Wallet.createRandom(); +//! +// </hide> + +// To sign a simple string, which can often be used for +// logging into a service, such as CryptoKitties simply +// pass the string in. +signature = await signer.signMessage("Hello World"); +//! async signature + +// +// A common case is also signing a hash, which is 32 +// bytes. It is important to note, that to sign binary +// data it MUST be an Array (or TypedArray) +// + +// This string is 66 chacacters long +message = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" + +// This array representation is 32 bytes long +messageBytes = ethers.utils.arrayify(message); +//! + +// To sign a hash, you most often want to sign the bytes +signature = await signer.signMessage(messageBytes) +//! async signature

Ethereum Basics

This is a very breif overview of some aspects of Ethereum and blockchains which developers can make use of or should be aware of.

+ +

This section is fairly sparse at the moment, but will be expanded as time goes on.

+ +

Events

Explain how topics and such work

+ +

Solidity Topics

How to compute the topic...

+ +

Logs and Filtering

Example hog logs are used.

+ +

Link to provider.getLogs and contract.on

+ +

Filters

Filter are used as a way to query ... efficient, explain bloom filters lightly

+ +

A filter may have up to 4 topic-sets, where each topic-set refers to a condition that must match the log topic in that position (i.e. each condition is AND-ed together).

+ +

If a topic-set is null, a log topic in that position is not filtered at all and any value matches.

+ +

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).

+ +
Topic-SetsMatching Logs 
[ A ]topic[0] = A 
[ A, null ] 
[ null, B ]topic[1] = B 
[ null, [ B ] ] 
[ null, [ B ], null ] 
[ A, B ](topic[0] = A) AND (topic[1] = B) 
[ A, [ B ] ] 
[ A, [ B ], null ] 
[ [ A, B ] ](topic[0] = A) OR (topic[0] = B) 
[ [ A, B ], null ] 
[ [ A, B ], [ C, D ] ][ (topic[0] = A) OR (topic[0] = B) ] AND [ (topic[1] = C) OR (topic[1] = D) ] 
Example Log Matching 
ERC-20 Transfer Filter Examples
// <hide> +const tokenAddress = ethers.constants.AddressZero; +const myAddress = ethers.constants.AddressZero; +const myOtherAddress = ethers.constants.AddressZero; +const id = ethers.utils.id; +const hexZeroPad = ethers.utils.hexZeroPad; +// </hide> + +// Short example of manually creating filters for an ERC-20 +// Transfer event. +// +// Most users should generally use the Contract API to +// compute filters, as it is much simpler, but this is +// provided as an illustration for those curious. See +// below for examples of the equivalent Contract API. + +// ERC-20: +// Transfer(address indexed src, address indexed dst, uint val) +// +// -------------------^ +// ----------------------------------------^ +// +// Notice that only *src* and *dst* are *indexed*, so ONLY they +// qualify for filtering. +// +// Also, note that in Solidity an Event uses the first topic to +// identify the Event name; for Transfer this will be: +// id("Transfer(address,address,uint256)") +// +// Other Notes: +// - A topic must be 32 bytes; so shorter types must be padded + +// List all token transfers *from* myAddress +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress or myOtherAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + [ + hexZeroPad(myAddress, 32), + hexZeroPad(myOtherAddress, 32), + ] + ] +}

To simplify life, ..., explain here, the contract API

+ +
ERC-20 Contract Filter Examples
// <hide> +const tokenAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; // DAI +const myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +const otherAddress = "0xEA517D5a070e6705Cc5467858681Ed953d285Eb9"; +const provider = ethers.getDefaultProvider(); +const Contract = ethers.Contract; +// </hide> + +const abi = [ + "event Transfer(address indexed src, address indexed dst, uint val)" +]; + +const contract = new Contract(tokenAddress, abi, provider); + +// List all token transfers *from* myAddress +contract.filters.Transfer(myAddress) +//! + +// List all token transfers *to* myAddress: +contract.filters.Transfer(null, myAddress) +//! + +// List all token transfers *from* myAddress *to* otherAddress: +contract.filters.Transfer(myAddress, otherAddress) +//! + +// List all token transfers *to* myAddress OR otherAddress: +contract.filters.Transfer(null, [ myAddress, otherAddress ]) +//!

Other Things? TODO

Explain what happens to strings and bytes, how to filter and retain the value

+ +

Gas

Explain attack vectors

+ +

Gas Price

The gas price is used somewhat like a bid, indicating an amount you are willing to pay (per unit of execution) to have your transaction processed.

+ +

Gas Limit

+

Security

+

Key Derivation Functions

This is not specific to Ethereum, but is a useful technique to understand and has some implications on User Experience.

+ +

Many people are concerned that encrypting and decrypting an Ethereum wallet is quite slow and can take quite some time. It is important to understand this is intentional and provides much stronger security.

+ +

The algorithm usually used for this process is scrypt, which is a memory and CPU intensive algorithm which computes a key (fixed-length psudo-random series of bytes) for a given password.

+ +

Why does it take so long?

The goal is to use as much CPU and memory as possible during this algorithm, so that a single computer can only compute a very small number of results for some fixed amount of time. To scale up an attack, the attacker requires additional compuers, increasing the cost to brute-force attack to guess the password.

+ +

For example, if a user knows their correct password, this process may take 10 seconds for them to unlock their own wallet and proceed.

+ +

But since an attacker does not know the password, they must guess; and each guess also requires 10 seconds. So, if they wish to try guessing 1 million passwords, their computer would be completely tied up for 10 million seconds, or around 115 days.

+ +

Without using an algorithm like this, a user would be able to log in instantly, however, 1 million passwords would only take a few seconds to attempt. Even secure passwords would likely be broken within a short period of time. There is no way the algorithm can be faster for a legitimate user without also being faster for an attacker.

+ +

Mitigating the User Experience

Rather than reducing the security (see below), a better practice is to make the user feel better about waiting. The Ethers encryption and decryption API allows the developer to incorporate a progress bar, by passing in a progress callback which will be periodically called with a number between 0 and 1 indication percent completion.

+ +

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 a progress bar makes a user feel like there time is not being needlessly wasted.

+ +

Work-Arounds (not recommended)

There are ways to reduce the time required to decrypt an Ethereum JSON Wallet, but please keep in mind that doing so discards nearly all security on that wallet.

+ +

The scrypt algorithm is designed to be tuned. The main purpose of this is to increase the difficulty as time goes on and computers get faster, but it can also be tuned down in situations where the security is less important.

+ +
// Our wallet object +const wallet = Wallet.createRandom(); + +// The password to encrypt with +const password = "password123"; + +// WARNING: Doing this substantially reduces the security +// of the wallet. This is highly NOT recommended. + +// We override the default scrypt.N value, which is used +// to indicate the difficulty to crack this wallet. +const json = wallet.encrypt(password, { + scrypt: { + // The number must be a power of 2 (default: 131072) + N: 64 + } +});

Application Programming Interface

An Application Programming Interface (API) is the formal specification of the library.

+ +

Contract Interaction

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 deserialize their results and emitted logs.

+ +

A ContractFactory is an abstraction a contract's bytecode and facilitates deploying a contract.

+ +

Contract

Explain contract here...

+ +

Creating Instances

+
new ethers.Contract( address , abi , signerOrProvider )
+
contract.attach( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

+ +
contract.connect( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

+ +

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 will act on behalf of that signer.

+ +

Properties

+
contract.address string< Address >

This is the address (or ENS name) the contract was constructed with.

+ +
contract.resolvedAddress string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

+ +
contract.deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

+ +
contract.interface Interface

This is the ABI as an Interface.

+ +
contract.provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

+ +
contract.signer Signer

If a signer was provided to the constructor, this is that signer.

+ +

Methods

+
contract.deployed( ) Promise< Contract >
+
Contract.isIndexed( value ) boolean
+

Events

+
contract.queryFilter( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

+ +
contract.listenerCount( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

+ +
contract.listeners( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

+ +
contract.off( event , listener ) this

Unsubscribe listener to event.

+ +
contract.on( event , listener ) this

Subscribe to event calling listener when the event occurs.

+ +
contract.once( event , listener ) this

Subscribe once to event calling listener when the event occurs.

+ +
contract.removeAllListeners( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

+ +

Meta-Class

A Meta-Class is a Class which has any of its properties determined at run-time. The Contract object uses a Contract's ABI to determine what methods are available, so the following sections describe the generic ways to interact with the properties added at run-time during the Contract constructor.

+ +

Read-Only Methods (constant)

A constant method is read-only and evaluates a small amount of EVM code against the current blockchain state and can be computed by asking a single node, which can return a result. It is therefore free and does not require any ether, but cannot make changes to the blockchain state..

+ +
contract.METHOD_NAME( ...args [ , overrides ] ) Promise< any >

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 is returned.

+ +

For bytes (both fixed length and dynamic), a DataHexString is returned.

+ +
contract.functions.METHOD_NAME( ...args [ , overrides ] ) Promise< Result >

The result will always be a Result, even if there is only a single return value type.

+ +

This simplifies frameworks which wish to use the Contract object, since they do not need to inspect the return types to unwrap simplified functions.

+ +

Another use for this method is for error recovery. For example, if a function result is an invalid UTF-8 string, the normal call using the above meta-class function will throw an exception. This allows using the Result access error to access the low-level bytes and reason for the error allowing an alternate UTF-8 error strategy to be used.

+ +

Most developers should not require this.

+ +

Write Methods (non-constant)

A non-constant method requires a transaction to be signed and requires payment in the form of a fee to be paid to a miner. This transaction will be verified by every node on the entire network as well by the miner who will compute the new state of the blockchain after executing it against the current state.

+ +

It cannot return a result. If a result is required, it should be logged using a Solidity event (or EVM log), which can then be queried from the transaction receipt.

+ +
contract.METHOD_NAME( ...args [ , overrides ] ) Promise< TransactionResponse >

Returns a TransactionResponse for the transaction after it is sent to the network. This requires the Contract has a signer.

+ +

Write Methods Analysis

There are secveral options to analyze properties and results of a write method without actually executing it.

+ +
contract.estimateGas.METHOD_NAME( ...args [ , overrides ] ) Promise< BigNumber >

Returns the estimate units of gas that would be required to execute the METHOD_NAME with args and overrides.

+ +
contract.populateTransaction.METHOD_NAME( ...args [ , overrides ] ) Promise< UnsignedTx >

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.

+ +
contract.staticCall.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 otherwise functions the same as a Read-Only Method.

+ +

Event Filters

An event filter is made up of topics, which are values logged in a Bloom Filter, allowing efficient searching for entries which match a filter.

+ +
contract.filters.EVENT_NAME( ...args ) Filter

Return a filter for EVENT_NAME, optionally filtering by additional constraints.

+ +

Only indexed event parameters may be filtered. If a parameter is null (or not provided) then any value in that field matches.

+ +

ContractFactory

+

Creating Instances

+
new ethers.ContractFactory( interface , bydecode [ , signer ] )
+
ContractFactory.fromSolidity( compilerOutput [ , signer ] ) ContractFactory
+
contractFactory.connect( signer ) Contract
+

Properties

+
contractFactory.interface Interface
+
contractFactory.bytecode string< DataHexString >
+
contractFactory.signer Signer
+

Methods

+
contractFactory.attach( address ) Contract

Return an instance of a Contract attched to address. This is the same as using the Contract constructor with address and this the the interface and signerOrProvider passed in when creating the ContractFactory.

+ +
contractFactory.getDeployTransaction( ...args ) UnsignedTransaction

Returns the unsigned transaction which would deploy this Contract with args passed to the Contract's constructor.

+ +
contractFactory.deploy( ...args ) Promise< 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.

+ +

The transction can be found at contract.deployTransaction, and no interactions should be made until the transaction is mined.

+ +
Deploying a Contract
// <hide> +const signer = ethers.LocalSigner(); +const ContractFactory = ethers.ContractFactory; +// </hide> + +// If your contract constructor requires parameters, the ABI +// must include the constructor +const abi = [ + "constructor(address owner, uint256 initialValue)" +]; + +const factory = new ContractFactory(abi, bytecode, signer) + +const contract = await factory.deploy("ricmoo.eth", 42); + +// The address is available immediately, but the contract +// is NOT deployed yet +contract.address +//! + +// The transaction that the signer sent to deploy +contract.deployTransaction +//! + +// Wait until the transaction is mined +contract.deployTransaction.wait() +//! + +// Now the contract is safe to ineract with +contract.value() +//!

Example: ERC-20 Contract

+

Connecting to a Contract

+
A simple ERC-20 contract
// A Human-Readable ABI; any supported ABI format could be used +const abi = [ + // Read-Only Functions + "function balanceOf(address owner) view returns (uint256)", + "function decimals() view returns (uint8)", + "function symbol() view returns (string)", + + // Authenticated Functions + "function transfer(address to, uint amount) returns (boolean)", + + // Events + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// This can be an address or an ENS name +const address = "dai.tokens.ethers.eth"; + +// An example Provider +const provider = ethers.getDefaultProvider(); + +// An example Signer +const signer = ethers.Wallet.createRandom().connect(provider); + +// Read-Only; By connecting to a Provider, allows: +// - Any constant function +// - Querying Filters +// - Populating Unsigned Transactions for non-constant methods +// - Estimating Gas for non-constant (as an anonymous sender) +// - Static Calling non-constant methods (as anonymous sender) +const erc20 = new ethers.Contract(address, abi, provider); + +// Read-Write; By connecting to a Signer, allows: +// - Everything from Read-Only (except as Signer, not anonymous) +// - Sending transactions for non-constant functions +const erc20_rw = new ethers.Contract(address, abi, signer)

ERC20Contract inherits Contract

+
new ethers.Contract( address , abi , providerOrSigner )

See the above code example for creating an Instance which will (in addition to the Contact methods and properties) automatically add the additional properties defined in abi to a Contract connected to address using the providerOrSigner.

+ +

Properties(inheritted from Contract)

+
erc20.address string< Address >

This is the address (or ENS name) the contract was constructed with.

+ +
erc20.resolvedAddress string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

+ +
erc20.deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

+ +
erc20.interface Interface

This is the ABI as an Interface.

+ +
erc20.provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

+ +
erc20.signer Signer

If a signer was provided to the constructor, this is that signer.

+ +

Methods(inheritted from Contract)

+
erc20.attach( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

+ +
erc20.connect( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

+ +

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 will act on behalf of that signer.

+ +
erc20.deployed( ) Promise< Contract >
+
Contract.isIndexed( value ) boolean
+

Events(inheritted from Contract)

+
erc20.queryFilter( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

+ +
erc20.listenerCount( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

+ +
erc20.listeners( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

+ +
erc20.off( event , listener ) this

Unsubscribe listener to event.

+ +
erc20.on( event , listener ) this

Subscribe to event calling listener when the event occurs.

+ +
erc20.once( event , listener ) this

Subscribe once to event calling listener when the event occurs.

+ +
erc20.removeAllListeners( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

+ +

Meta-Class Methods(added at Runtime)

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

+ +
erc20.decimals( [ overrides ] ) Promise< number >

Returns the number of decimal places used by this ERC-20 token. This can be used with parseUnits when taking input from the user or [formatUnits](utils-formatunits] when displaying the token amounts in the UI.

+ +
erc20.getBalance( owner [ , overrides ] ) Promise< BigNumber >

Returns the balance of owner for this ERC-20 token.

+ +
erc20.symbol( [ overrides ] ) Promise< string >

Returns the symbol of the token.

+ +
erc20_rw.transfer( target , amount [ , overrides ] ) Promise< TransactionResponse >

Transfers amount tokens to target from the current signer. The return value (a boolean) is inaccessible during a write operation using a transaction. Other techniques (such as events) are required if this value is required. On-chain contracts calling the transfer function have access to this result, which is why it is possible.

+ +
erc20.callStatic.transfer( target , amount [ , overrides ] ) Promise< boolean >

Performs a dry-run of transferring amount tokens to target from the current signer, without actually signing or sending a transaction.

+ +

This can be used to preflight check that a transaction will be successful.

+ +
erc20.estimateGas.transfer( target , amount [ , overrides ] ) Promise< BigNumber >

Returns an estimate for how many units of gas would be required to transfer amount tokens to target.

+ +
erc20.populateTransaction.transfer( target , amount [ , overrides ] ) Promise< UnsignedTx >

Returns an UnsignedTransaction which could be signed and submitted to the network to transaction amount tokens to target.

+ +
Note on Estimating and Static Calling

When you perform a static call, the current state is taken into account as best as Ethereum can determine. There are many cases where this can provide false positives and false negatives. The eventually consistent model of the blockchain also means there are certain consistency modes that cannot be known until an actual transaction is attempted.

+ +

Meta-Class Filters(added at Runtime)

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

+ +
erc20.filters.Transafer( [ fromAddress [ , toAddress ] ] ) Filter

Returns a new Filter which can be used to query or to subscribe/unsubscribe to events.

+ +

If fromAddress is null or not provided, then any from address matches. If toAddress is null or not provided, then any to address matches.

+ +

Signers

A Signer in ethers is an abstraction of an Ethereum Account, which can be used to sign messages and transactions and send signed transactions to the Ethereum Network to execute state changing operations.

+ +

The available operations depends largely on the sub-class used.

+ +

For example, a Signer from MetaMask can send transactions and sign messages but cannot sign a transaction (without broadcasting it).

+ +

The most common Signers you will encounter are:

+ +

+ +

Signer

The Signer class is abstract and cannot be directly instaniated.

+ +

Instead use one of the concreate sub-classes, such as the Wallet, VoidSigner or JsonRpcSigner.

+ +
signer.connect( provider ) Signer

Sub-classes must implement this, however they may simply throw an error if changing providers is not supported.

+ +
signer.getAddress( ) Promise< string< Address > >

Returns a Promise that resolves to the account address.

+ +

This is a Promise so that a Signer can be designed around an asynchronous source, such as hardware wallets.

+ +

Sub-classes must implement this.

+ +
Signer.isSigner( object ) boolean

Returns true if an only if object is a Signer.

+ +

Blockchain Methods

+
signer.getBalance( [ blockTag = "latest" ] ) Promise< BigNumber >

Returns the balance of this wallet at blockTag.

+ +
signer.getChainId( ) Promise< number >

Returns ths chain ID this wallet is connected to.

+ +
signer.getGasPrice( ) Promise< BigNumber >

Returns the current gas price.

+ +
signer.getTransactionCount( [ blockTag = "latest" ] ) Promise< number >

Returns the number of transactions this account has ever sent. This is the value required to be included in transactions as the nonce.

+ +
signer.call( transactionRequest ) Promise< string< DataHexString > >

Returns the result of calling using the transactionRequest, with this account address being used as the from field.

+ +
signer.estimateGas( transactionRequest ) Promise< BigNumber >

Returns the result of estimating the cost to send the transactionRequest, with this account address being used as the from field.

+ +
signer.resolveName( ensName ) Promise< string< Address > >

Returns the address associated with the ensName.

+ +

Signing

+
signer.signMessage( message ) Promise< string< RawSignature > >

This returns a Promise which resolves to the Raw Signature of message.

+ +

Sub-classes must implement this, however they may throw if signing a message is not supported, such as in a Contract-based Wallet or Meta-Transaction-based Wallet.

+ +
Note

If message is a string, it is treated as a string and converted to its representation in UTF8 bytes.

+ +

If and only if a message is a Bytes will it be treated as binary data.

+ +

For example, the string "0x1234" is 6 characters long (and in this case 6 bytes long). This is not equivalent to the array [ 0x12, 0x34 ], which is 2 bytes long.

+ +

A common case is to sign a hash. In this case, if the hash is a string, it must be converted to an array first, using the arrayify utility function.

+ +
+
signer.signTransaction( transactionRequest ) Promise< string< DataHexString > >

Returns a Promise which resolves to the signed transaction of the transactionRequest. This method does not populate any missing fields.

+ +

Sub-classes must implement this, however they may throw if signing a transaction is not supported, which is common for security reasons in many clients.

+ +
signer.sendTransaction( transactionRequest ) Promise< TransactionResponse >

This method populates the transactionRequest with missing fields, using populateTransaction and returns a Promise which resolves to the transaction.

+ +

Sub-classes must implement this, however they may throw if sending a transaction is not supported, such as the VoidSigner or if the Wallet is offline and not connected to a Provider.

+ +

Sub-Classes

It is very important that all important properties of a Signer are immutable. Since Ethereum is very asynchronous and deals with critical data (such as ether and other potentially valuable crypto assets), keeping 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().

+ +
signer.checkTransaction( transactionRequest ) TransactionRequest

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

+ +

This should return a copy of the transactionRequest, with any properties needed by call, estimateGas and populateTransaction (which is used by sendTransaction). It should also throw an error if any unknown key is specified.

+ +

The default implementation checks only valid TransactionRequest properties exist and adds from to the transaction if it does not exist.

+ +

If there is a from field it must be verified to be equal to the Signer's address.

+ +
signer.populateTransaction( transactionRequest ) Promise< TransactionRequest >

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

+ +

This should return a copy of transactionRequest, follow the same procedure as checkTransaction and fill in any properties required for sending a transaction. The result should have all promises resolved; if needed the resolveProperties utility function can be used for this.

+ +

The default implementation calls checkTransaction and resolves to if it is an ENS name, adds gasPrice, nonce, gasLimit and chainId based on the related operations on Signer.

+ +

The Wallet class inherits Signer and can sign transactions and messages using a private key as a standard Externally Owned Account (EOA).

+ +
new ethers.Wallet( privateKey [ , provider ] )

Create a new Wallet instance for privateKey and optionally connected to the provider.

+ +
ethers.Wallet.createRandom( [ options = {} ] ) Wallet

Returns a new Wallet with a random private key, generated from cryptographically secure entropy sources. If the current environment does not have a secure entropy source, an error is thrown.

+ +

Wallets created using this method will have a mnemonic.

+ +
ethers.Wallet.fromEncryptedJson( json , password [ , progress ] ) Promise< Wallet >

Create an instance from an encrypted JSON wallet.

+ +

If progress is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion.

+ +
ethers.Wallet.fromEncryptedJsonSync( json , password ) Wallet

Create an instance from an encrypted JSON wallet.

+ +

This operation will operate synchronously which will lock up the user interface, possibly for a non-trivial duration. Most applications should use the asynchronous fromEncryptedJson instead.

+ +
ethers.Wallet.fromMnemonic( mnemonic [ , path , [ wordlist ] ] ) Wallet

Create an instance from a mnemonic phrase.

+ +

If path is not specified, the Ethereum default path is used (i.e. m/44'/60'/0'/0/0).

+ +

If wordlist is not specified, the English Wordlist is used.

+ +

Properties

+
wallet.address string< Address >

The address for the account this Wallet represents.

+ +
wallet.provider Provider

The provider this wallet is connected to, which will ge used for any Blockchain Methods methods. This can be null.

+ +
Note

A Wallet instance is immuatable, so if you wish to change the Provider, you may use the connect method to create a new instance connected to the desired provider.

+ +
wallet.publicKey string< DataHexString< 65 > >

The uncompressed public key for this Wallet represents.

+ +

Methods

+
wallet.encrypt( password , [ options = {} , [ progress ] ] ) Promise< string >

Encrypt the wallet using password returning a Promise which resolves to a JSON wallet.

+ +

If progress is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion.

+ +
Wallet Examples
// Create a wallet instance from a mnemonic... +mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" +walletMnemonic = Wallet.fromMnemonic(mnemonic) + +// ...or from a private key +walletPrivateKey = new Wallet(walletMnemonic.privateKey) + +walletMnemonic.address === walletPrivateKey.address +//! + +// The address as a Promise per the Signer API +walletMnemonic.getAddress() +//! + +// A Wallet address is also available synchronously +walletMnemonic.address +//! + +// The internal cryptographic components +walletMnemonic.privateKey +//! +walletMnemonic.publicKey +//! + +// The wallet mnemonic +walletMnemonic.mnemonic +//! + +// Note: A wallet created with a private key does not +// have a mnemonic (the derivation prevents it) +walletPrivateKey.mnemonic +//! + +// Signing a message +walletMnemonic.signMessage("Hello World") +//! + +tx = { + to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72", + value: utils.parseEther("1.0") +} + +// Signing a transaction +walletMnemonic.signTransaction(tx) +//! + +// The connect method returns a new instance of the +// Wallet connected to a provider +wallet = walletMnemonic.connect(provider) + +// Querying the network +wallet.getBalance(); +//! +wallet.getTransactionCount(); +//! + +// Sending ether +wallet.sendTransaction(tx) +// <hide> +//! error +// </hide>

VoidSigner inherits Signer

A VoidSigner is a simple Signer which cannot sign.

+ +

It is useful as a read-only signer, when an API requires a Signer as a parameter, but it is known only read-only operations will be carried.

+ +

For example, the call operation will automatically have the provided address passed along during the execution.

+ +
new ethers.VoidSigner( address [ , provider ] ) VoidSigner

Create a new instance of a VoidSigner for address.

+ +
voidSigner.address string< Address >

The address of this VoidSigner.

+ +
VoidSigner Pre-flight Example
address = "0x8ba1f109551bD432803012645Ac136ddd64DBA72" +signer = new ethers.VoidSigner(address, provider) + +// The DAI token contract +abi = [ + "function balanceOf(address) view returns (uint)", + "function transfer(address, uint) returns (bool)" +] +contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer) + +// <hide> +//! +// </hide> +// Get the number of tokens for this account +tokens = await contract.balanceOf(signer.getAddress()) +//! async tokens + +// +// Pre-flight (check for revert) on DAI from the signer +// +// Note: We do not have the private key at this point, this +// simply allows us to check what would happen if we +// did. This can be useful to check before prompting +// a request in the UI +// + +// This will pass since the token balance is available +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

ExternallyOwnedAccount

This is an interface which contains a minimal set of properties required for Externally Owned Accounts which can have certain operations performed, such as encoding as a JSON wallet.

+ +
eoa.address string< Address >

The Address of this EOA.

+ +
eoa.privateKey string< DataHexString< 32 > >

The privateKey of this EOA

+ +
eoa.mnemonic Mnemonic

Optional. The account HD mnemonic, if it has one and can be determined. Some sources do not encode the mnemonic, such as an HD extended keys.

+ +

Providers

A Provider is an abstraction of a connection to the Ethereum network, providing a concise, consistent interface to standard Ethereum node functionality.

+ +

The ethers.js library provides several options which should cover the vast majority of use-cases, but also includes the necessary functions and classes for sub-classing if a more custom configuration is necessary.

+ +

Most users should be able to simply use the Default Provider.

+ +

Default Provider

The default provider is the safest, easiest way to begin developing on Ethereum, and it is also robust enough for use in production.

+ +

It creates a FallbackProvider connected to as many backend services as possible. When a request is made, it is sent to multiple backends simulatenously. As responses from each backend are returned, they are checked that they agree. Once a quorum has been reached (i.e. enough of the backends agree), the response is provided to your application.

+ +

This ensures that if a backend has become out-of-sync, or if it has been compromised that its responses are dropped in favor of responses that match the majority.

+ +
ethers.getDefaultProvider( [ network , [ options ] ] ) Provider

Returns a new Provider, backed by multiple services, connected to network. Is no network is provided, homestead (i.e. mainnet) is used.

+ +

The options is an object, with the following properties:

+ +
PropertyDescription 
alchemyAlchemy API Token 
etherscanEtherscan API Token 
infuraINFURA Project ID or ProjectID and Project Secret 
quorumThe number of backends that must agree (default: 2 for mainnet, 1 for testnets) 
Option Properties 
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, 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.

+ +

Some services also provide additional paid features, whichare only available when specifying an API Key.

+ +

Provider Documentation

+

Provider

Explain what a provider is...

+ +

Accounts Methods

+
provider.getBalance( address [ , blockTag = latest ] ) Promise< BigNumber >

Returns the balance of address as of the blockTag block height.

+ +
provider.getCode( address [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the contract code of address as of the blockTag block height. If there is no contract currently deployed, the result is 0x.

+ +
provider.getStorageAt( addr , pos [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the Bytes32 value of the position pos at address addr, as of the blockTag.

+ +
provider.getTransactionCount( address [ , blockTag = latest ] ) Promise< number >

Returns the number of transactions address has ever sent, as of blockTag. This value is required to be the nonce for the next transaction from address sent to the network.

+ +
Account Examples
// Get the balance for an account... +provider.getBalance("ricmoo.firefly.eth"); +//! + +// Get the code for a contract... +provider.getCode("registrar.firefly.eth"); +//! + +// Get the storage value at position 0... +provider.getStorageAt("registrar.firefly.eth", 0) +//! + +// Get transaction count of an account... +provider.getTransactionCount("ricmoo.firefly.eth"); +//!

Blocks Methods

+
provider.getBlock( block ) Promise< Block >

Get the block from the network, where the result.transactions is a list of transaction hashes.

+ +
provider.getBlockWithTransactions( block ) Promise< BlockWithTransactions >

Get the block from the network, where the result.transactions is an Array of TransactionResponse objects.

+ +
Block Examples
provider.getBlock(100004) +//! + +provider.getBlockWithTransactions(100004) +//!

Ethereum Naming Service (ENS) Methods

The Ethereum Naming Service (ENS) allows a short and easy-to-remember ENS Name to be atached to any set of keys and values.

+ +

One of the most common uses for this is to use a simple name to refer to an Ethereum Address.

+ +

In the ethers API, nearly anywhere that accepts an address, an ENS name may be used instead, which can simplify code and make reading and debugging much simpler.

+ +

The provider offers some basic operations to help resolve and work with ENS names.

+ +
provider.lookupAddress( address ) Promise< string >

Performs a reverse lookup of the address in ENS using the Reverse Registrar. If the name does not exist, or the forward lookup does not match, null is returned.

+ +
provider.resolveName( name ) Promise< string< Address > >

Looks up the address of name. If the name is not owned, or does not have a Resolver configured, or the Resolver does not have an address configured, null is returned.

+ +
ENS Examples
// Reverse lookup of an ENS by address... +provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c"); +//! + +// Lookup an address of an ENS name... +provider.resolveName("ricmoo.firefly.eth"); +//!

Logs Methods

+
provider.getLogs( filter ) Promise< Array< Log > >

Returns the Array of Log matching the filter.

+ +

Keep in mind that many backends will discard old events, and that requests which are too broad may get dropped as they require too many resources to execute the query.

+ +

Network Status Methods

+
provider.getNetwork( ) Promise< Network >

Returns the Network this Provider is connected to.

+ +
provider.getBlockNumber( ) Promise< number >

Returns the block number (or height) of the most recently mined block.

+ +
provider.getGasPrice( ) Promise< BigNumber >

Returns a best guess of the Gas Price to use in a transaction.

+ +
Network Status Examples
// The network information +provider.getNetwork() +// <hide> +//! +network = utils.shallowCopy(_) +delete network._defaultProvider +network +// </hide> +//! + +// The current block number +provider.getBlockNumber() +//! + +// Get the current suggested gas price (in wei)... +gasPrice = await provider.getGasPrice() +//! async gasPrice + +// ...often this gas price is easier to understand or +// display to the user in gwei (giga-wei, or 1e9 wei) +utils.formatUnits(gasPrice, "gwei") +//!

Transactions Methods

+
provider.call( transaction [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the result of executing the transaction, using call. A call does not require any ether, but cannot change any state. This is useful for calling gettings on Contracts.

+ +
provider.estimateGas( transaction ) Promise< BigNumber >

Returns an estimate of the amount of gas that would be required to submit transaction to the network.

+ +

An estimate may not be accurate since there could be another transaction on the network that was not accounted for, but after being mined affected relevant state.

+ +
provider.sendTransaction( transaction ) Promise< TransactionResponse >

Submits transaction to the network to be mined. The transaction must be signed, and be valid (i.e. the nonce is correct and the account has sufficient balance to pay for the transaction).

+ +
provider.waitForTransaction( hash [ , confirms = 1 [ , timeout ] ] ) Promise< TxReceipt >

Returns a Promise which will not resolve until transactionHash is mined.

+ +

Event Emitter Methods

Explain events here...

+ +
provider.on( eventName , listener ) this

Add a listener to be triggered for each eventName.

+ +
provider.once( eventName , listener ) this

Add a listener to be triggered for only the next eventName, at which time it be removed.

+ +
provider.emit( eventName , ...args ) boolean

Notify all listeners of eventName, passing args to each listener. This is generally only used internally.

+ +
provider.off( eventName [ , listener ] ) this

Remove a listener for eventName. If no listener is provided, all listeners for eventName are removed.

+ +
provider.removeAllListeners( [ eventName ] ) this

Remove all the listeners for eventName. If no eventName is provided, all events are removed.

+ +
provider.listenerCount( [ eventName ] ) number

Returns the number of listeners for eventName. If no eventName is provided, the total number of listeners is returned.

+ +
provider.listeners( eventName ) Array< Listener >

Returns the list of Listeners for eventName.

+ +

Events

Any of the following may be used as the eventName in the above methods.

+ +
Log Filter

A filter is an object, representing a contract log Filter, which has the optional properties address (the source contract) and topics (a topic-set to match).

+ +

If address is unspecified, the filter matches any contract address.

+ +

See events for more information on how to specify topic-sets.

+ +
Topic-Set Filter

The value of a Topic-Set Filter is a array of Topic-Sets.

+ +

This event is identical to a Log Filter with the address omitted (i.e. from any contract).

+ +
Transaction Filter

The value of a Transaction Filter is any transaction hash.

+ +

This event is emitted on every block that is part of a chain that includes the given mined transaction. It is much more common that the once method is used than the on method.

+ +

In addition to transaction and filter events, there are several named events.

+ +
Event NameArgumentsDescription 
"block"blockNumberemitted when a new block is mined 
"error"erroremitted on any error 
"pending"pendingTransactionemitted when a new transaction enters the memory pool; only certain providers offer this event and may require running your own node for reliable results 
"willPoll"pollIdemitted prior to a polling loop is about to begin; (very rarely used by most developers) 
"poll"pollId, blockNumberemitted during each poll cycle after `blockNumber` is updated (if changed) and before any other events (if any) are emitted during the poll loop; (very rarely used by most developers) 
"didPoll"pollIdemitted after all events from a polling loop are emitted; (very rarely used by most developers) 
"debug"provider dependenteach Provider may use this to emit useful debugging information and the format is up to the developer; (very rarely used by most developers) 
Named Provider Events 
Events Example
// <hide> +const txHash = utils.id("dummy-data"); +const myAddress = ethers.constants.HashZero; +const myOtherAddress = ethers.constants.HashZero; +// </hide> + +provider.on("block", (blockNumber) => { + // Emitted on every block change +}) + + +provider.once(txHash, (transaction) => { + // Emitted when the transaction has been mined +}) + + +// This filter could also be generated with the Contract or +// Interface API. If address is not specified, any address +// matches and if topics is not specified, any log matches +filter = { + address: "dai.tokens.ethers.eth", + topics: [ + utils.id("Transfer(address,address,uint256") + ] +} +provider.on(filter, (log, event) => { + // Emitted whenever a DAI token transfer occurs +}) + + +// Notice this is an array of topic-sets and is identical to +// using a filter with no address (i.e. match any address) +topicSets = [ + utils.id("Transfer(address,address,uint256"), + null, + [ + myAddress, + myOtherAddress + ] +] +provider.on(topicSets, (log, event) => { + // Emitted any token is sent TO either address +}) + + +provider.on("pending", (tx) => { + // Emitted when any new pending transaction is noticed +}); + + +provider.on("error", (tx) => { + // Emitted when any error occurs +}); + +// <hide> +// Make sure our documentation builds without waiting forever +provider.removeAllListeners() +// </hide>

Inspection Methods

+
Provider.isProvider( object ) boolean

Returns true if and only if object is a Provider.

+ +

JsonRpcProvider inherits Provider

The JSON-RPC API is a very popular method for interacting with Ethereum and is available in all major Ethereum node implementations (e.g. Geth and Parity) as well as many third-party web services (e.g. INFURA)

+ +
new ethers.providers.JsonRpcProvider( [ url [ , aNetworkish ] ] )

Connect to a JSON-RPC API located at url using the aNetworkish network. If url is not specified, the default (i.e. http://localhost:8545) is used and if no network is specified, it will be determined automatically by querying the node.

+ +
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.

+ +
jsonRpcProvider.getSigner( [ addressOrIndex ] ) JsonRpcSigner

Returns a JsonRpcSigner which is managed by this Ethereum node, at addressOrIndex. If no addressOrIndex is provided, the first account (account #0) is used.

+ +
jsonRpcProvider.getUncheckedSigner( [ addressOrIndex ] ) JsonRpcUncheckedSigner
+
jsonRpcProvider.listAccounts( ) Array< string >

Returns a list of all account addresses managed by this provider.

+ +
jsonRpcProvider.send( method , params ) Promise< any >

Allows sending raw messages to the provider.

+ +

This can be used for backend-specific calls, such as for debugging or specific account management.

+ +

JsonRpcSigner inherits Signer

A JsonRpcSigner is a simple Signer which is backed by a connected JsonRpcProvider.

+ +
signer.provider JsonRpcProvider

The provider this signer was established from.

+ +
signer.connectUnchecked( ) JsonRpcUncheckedSigner

Returns a new Signer object which does not perform addtional checks when sending a transaction. See getUncheckedSigner for more details.

+ +
signer.sendUncheckedTransaction( transaction ) Promise< string< DataHexString< 32 > > >

Sends the transaction and returns a Promise which resolves to the opacque transaction hash.

+ +
signer.unlock( password ) Promise< boolean >

Request the node unlock the account (if locked) using password.

+ +

JsonRpcUncheckedSigner inherits Signer

The JSON-RPC API only provides a transaction hash as the response when a transaction is sent, but the ethers Provider requires populating all details 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 the details using the returned transaction hash to populate the TransactionResponse object.

+ +

Some backends do not respond immediately and instead defer releasing the details of a transaction it was responsible for signing until it is mined.

+ +

The UncheckedSigner does not populate any additional information and will immediately return the result as a mock TransactionResponse-like object, with most of the properties set to null, but allows access to the transaction hash quickly, if that is all that is required.

+ +

Node-Specific Methods

Many methods are less common or specific to certain Ethereum Node implementations (e.g. Parity vs Geth. These include account and admin management, debugging, deeper block and transaction exploration and other services (such as Swarm and Whisper).

+ +

The jsonRpcProvider.send method can be used to access these.

+ +

+ +

API Providers

There are many services which offer a web API for accessing the Ethereum Blockchain. These Providers allow connecting to them, which simplifies development, since you do not need to run your own instance or cluster of Ethereum nodes.

+ +

However, this reliance on third-party services can reduce resiliance, security and increase the amount of required trust. To mitigate these issues, it is recommended you use a Default Provider.

+ +

EtherscanProvider inherits Provider

The EtherscanProvider is backed by a combination of the various Etherscan APIs.

+ +
new ethers.providers.EtherscanProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new EtherscanProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a [Network Object]provider-(network).

+ +

If no apiKey is provided, a shared API key will be used, which may result in reduced performance and throttled requests. It is highly recommended for production, you register with Etherscan for your own API key.

+ +
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.

+ +

It is highly recommended for production, you register with Etherscan for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
Etherscan Examples
// <hide> +const EtherscanProvider = ethers.providers.EtherscanProvider; +const apiKey = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new EtherscanProvider(); + +// Connect to rinkeby testnet (these are equivalent) +provider = new EtherscanProvider("rinkeby"); +provider = new EtherscanProvider(4); + +const network = ethers.providers.getNetwork("rinkeby"); +// <hide> +delete network._defaultProvider; +network +// </hide> +//! + +provider = new EtherscanProvider(network); + +// Connect to mainnet (homestead) with an API key +provider = new EtherscanProvider(null, apiKey); +provider = new EtherscanProvider("homestead", apiKey);
provider.getHistory( address ) Array< History >

@TODO... Explain

+ +

InfuraProvider inherits UrlJsonRpcProvider

The InfuraProvider is backed by the popular INFURA Ethereum service.

+ +
new ethers.providers.InfuraProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new InfuraProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a [Network Object]provider-(network).

+ +

The apiKey can be a string Project ID or an object with the properties projectId and projectSecret to specify a Project Secret which can be used on non-public sources (like on a server) to further secure your API access and quotas.

+ +
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.

+ +

It is highly recommended for production, you register with INFURA for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
INFURA Examples
// <hide> +const InfuraProvider = ethers.providers.InfuraProvider; +const projectId = "..."; +const projectSecret = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new InfuraProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new InfuraProvider("ropsten"); + +// Connect to mainnet with a Project ID (these are equivalent) +provider = new InfuraProvider(null, projectId); +provider = new InfuraProvider("homestead", projectId); + +// Connect to mainnet with a Project ID and Project Secret +provider = new InfuraProvider("homestead", { + projectId: projectId, + projectSecret: projectSecret +});

AlchemyProvider inherits UrlJsonRpcProvider

The AlchemyProvider is backed by Alchemy.

+ +
new ethers.providers.AlchemyProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new AlchemyProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a Network Object.

+ +
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.

+ +

It is highly recommended for production, you register with Alchemy for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
Alchemy Examples
// <hide> +const AlchemyProvider = ethers.providers.AlchemyProvider; +const apiKey = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new AlchemyProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new AlchemyProvider("ropsten"); + +// Connect to mainnet with an API key (these are equivalent) +provider = new AlchemyProvider(null, apiKey); +provider = new AlchemyProvider("homestead", apiKey);

CloudflareProvider inherits UrlJsonRpcProvider

The CloudflareProvider is backed by the Cloudflare Ethereum Gateway.

+ +
new ethers.providers.CloudflareProvider( )

Create a new CloudflareProvider connected to mainnet (i.e. "homestead").

+ +
Supported Networks

  • Homestead (Mainnet)

+ +
Cloudflare Examples
// <hide> +const CloudflareProvider = ethers.providers.CloudflareProvider; +// </hide> + +// Connect to mainnet (homestead) +provider = new CloudflareProvider();

Other Providers

Others...

+ +

FallbackProvider inherits Provider

The FallbackProvider is the most advanced Provider available in ethers.

+ +

It uses a quorum and connects to multiple Providers as backends, each configured with a priority and a weight .

+ +

When a request is made, the request is dispatched to multiple backends, randomly choosen (higher prioirty backends are always selected first) and the results from each are compared against the others. Only once the quorum has been reached will that result be accepted and returned to the caller.

+ +

By default the quorum requires 50% (rounded up) of the backends to agree. The weight can be used to give a backend Provider more influence.

+ +
new ethers.providers.FallbackProvider( providers [ , quorum ] )

Creates a new instance of a FallbackProvider connected to providers. If quorum is not specified, half of the total sum of the provider weights is used.

+ +

The providers can be either an array of Provider or FallbackProviderConfig. If a Provider is provided, the defaults are a priority of 1 and a weight of 1.

+ +
provider.providerConfigs Array< FallbackProviderConfig >

The list of Provider Configurations that describe the backends.

+ +
provider.quorum number

The quorum the backend responses must agree upon before a result will be resolved. By default this is half the sum of the weights.

+ +

FallbackProviderConfig

+
fallbackProviderConfig.provider Provider

The provider for this configuration.

+ +
fallbackProviderConfig.priority number

The priority used for the provider. Higher priorities are favoured over lower priorities. If multiple providers share the same prioirty, they are choosen at random.

+ +
fallbackProviderConfig.stallTimeout number

The timeout (in ms) after which another Provider will be attempted. This does not affect the current Provider; if it returns a result it is counted as part of the quorum.

+ +

Lower values will result in more network traffic, but may reduce the response time of requests.

+ +
fallbackProviderConfig.weight number

The weight a response from this provider provides. This can be used if a given Provider is more trusted, for example.

+ +

IpcProvider inherits JsonRpcProvider

The IpcProvider allows the JSON-RPC API to be used over a local filename on the file system, exposed by Geth, Parity and other nodes.

+ +

This is only available in node.js (as it requires file system access, and may have additional complications due to file permissions. See any related notes on the documentation for the actual node implementation websites.

+ +
ipcProvider.path string

The path this Provider is connected to.

+ +

UrlJsonRpcProvider inherits JsonRpcProvider

This class is intended to be sub-classed and not used directly. It simplifies creating a Provider where a normal JsonRpcProvider would suffice, with a little extra effort needed to generate the JSON-RPC URL.

+ +
new ethers.providers.UrlJsonRpcProvider( [ network [ , apiKey ] ] )

Sub-classes do not need to override this. Instead they should override the static method getUrl and optionally getApiKey.

+ +
urlJsonRpcProvider.apiKey any

The value of the apiKey that was returned from InheritedClass.getApiKey.

+ +
InheritingClass.getApiKey( apiKey ) any

This function should examine the apiKey to ensure it is valid and return a (possible modified) value to use in getUrl.

+ +
InheritingClass.getUrl( network , apiKey ) string

The URL to use for the JsonRpcProvider instance.

+ +

Web3Provider inherits JsonRpcProvider

The Web3Provider is meant to ease moving from a web3.js based application to ethers by wraping an existing Web3-compatible (such as a Web3HttpProvider, Web3IpcProvider or Web3WsProvider) and exposing it as an ethers.js Provider which can then be used with the rest of the library.

+ +

This may also be used to wrap a standard [EIP-1193 Provider](link-eip-1193].

+ +
new ethers.providers.Web3Provider( externalProvider [ , network ] )

Create a new Web3Provider, which wraps an EIP-1193 Provider or Web3Provider-compatible Provider.

+ +
web3Provider.provider Web3CompatibleProvider

The provider used to create this instance.

+ +

ExternalProvider

An ExternalProvider can be either one for the above mentioned Web3 Providers (or otherwise compatible) or an EIP-1193 provider.

+ +

An ExternalProvider must offer one of the following signatures, and the first matching is used:

+ +
externalProvider.request( request ) Promise< any >

This follows the EIP-1193 API signature.

+ +

The request should be a standard JSON-RPC payload, which should at a minimum specify the method and params.

+ +

The result should be the actual result, which differs from the Web3.js response, which is a wrapped JSON-RPC response.

+ +
externalProvider.sendAsync( request , callback ) void

This follows the Web3.js Provider Signature.

+ +

The request should be a standard JSON-RPC payload, which should at a minimum specify the method and params.

+ +

The callback should use the error-first calling semantics, so (error, result) where the result is a JSON-RPC wrapped result.

+ +
externalProvider.send( request , callback ) void

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

+ +

Types

+

BlockTag

A BlockTag specifies a specific location in the Blockchain.

+ +

  • "latest" -- The most recently mined block
  • "earliest" -- Block #0
  • "pending" -- The block currently being prepared for mining; not all operations and backends support this BlockTag
  • number -- The block at this height
  • a negative number -- The block this many blocks ago

+ +

EventType

And EventType can be any of the following.

+ +

+ +

Network

A Network represents an Etherem network.

+ +
network.name string

The human-readable name of the network, such as homestead. If the network name is unknown, this will be "unknown".

+ +
network.chainId number

The Chain ID of the network.

+ +
network.ensAddress string< Address >

The address at which the ENS registry is deployed on this network.

+ +

Block

+
block.hash string< DataHexString< 32 > >

The hash of this block.

+ +
block.parentHash string< DataHexString< 32 > >

The hash of the previous block.

+ +
block.number number

The height (number) of this block.

+ +
block.timestamp number

The timestamp of this block.

+ +
block.nonce string< DataHexString >

The nonce used as part of the proof-of-work to mine this block.

+ +

This property is generally of little interest developers.

+ +
block.difficulty number

The difficulty target required to be met by the miner of the block.

+ +

This property is generally of little interest developers.

+ +
block.gasLimit BigNumber

The maximum amount of gas that this block was permitted to use. This is a value that can be voted up or voted down by miners and is used to automatically adjust the bandwidth requirements of the network.

+ +

This property is generally of little interest developers.

+ +
block.gasUsed BigNumber

The total amount of gas used by all transactions in this block.

+ +
block.miner string

The coinbase address of this block, which indicates the address the miner that mined this block would like the subsidy reward to go to.

+ +
block.extraData string

This is extra data a miner may choose to include when mining a block.

+ +

This property is generally of little interest developers.

+ +

Block (with transaction hashes)

Often only the hashes of the transactions included in a block are needed, so by default a block only contains this information, as it is substantially less data.

+ +
block.transactions Array< string< DataHexString< 32 > > >

A list of the transactions hashes for each transaction this block includes.

+ +

BlockWithTransactions inherits Block

If all transactions for a block are needed, this object instead includes the full details on each transaction.

+ +
block.transactions Array< TransactionResponse >

A list of the transactions this block includes.

+ +

Events and Logs

+

EventFilter

+
filter.address string< Address >

The address to filter by, or null to match any address.

+ +
filter.topics Array< string< DataHexString< 32 > > | Array< string< DataHexString< 32 > > > >

The topics to filter by, or null to match any topics. Each entry represents an AND condition that must match, or may be null to match anything. If a given entry is an Array, then that entry is treated as an OR for any value in the entry.

+ +

Filter inherits EventFilter

+
filter.fromBlock BlockTag

The starting block (inclusive) to search for logs matching the filter criteria.

+ +
filter.toBlock BlockTag

The end block (inclusive) to search for logs matching the filter criteria.

+ +

FilterByBlockHash inherits EventFilter

+
filter.blockHash string< DataHexString< 32 > >

The specific block (by its block hash) to search for logs matching the filter criteria.

+ +

Log

+
log.blockNumber number

The block height (number) of the block including the transaction of this log.

+ +
log.blockHash string< DataHexString< 32 > >

The block hash of the block including the transaction of this log.

+ +
log.removed boolean

During a re-org, if a transaction is orphaned, this will be set to true to indicate the Log entry has been removed; it will likely be emitted again in the near future when another block is mined with the transaction that triggered this log, but keep in mind the values may change.

+ +
log.transactionLogIndex number

The index of this log in the transaction.

+ +
log.address string< Address >

The address of the contract that generated this log.

+ +
log.data string< DataHexString >

The data included in this log.

+ +
log.topics Array< string< DataHexString< 32 > > >

The list of topics (indexed properties) for this log.

+ +
log.transactionHash string< DataHexString< 32 > >

The transaction hash of the transaction of this log.

+ +
log.transactionIndex number

The index of the transaction in the block of the transaction of this log.

+ +
log.logIndex number

The index of this log across all logs in the entire block.

+ +

Transactions

+

TransactionRequest

A transaction request describes a transaction that is to be sent to the network or otherwise processed.

+ +

All fields are optional and may be a promise which resolves to the required type.

+ +
transactionRequest.to string | Promise< string >

The address (or ENS name) this transaction it to.

+ +
transactionRequest.from string< Address > | Promise< string< Address > >

The address this transaction is from.

+ +
transactionRequest.nonce number | Promise< number >

The nonce for this transaction. This should be set to the number of transactions ever sent from this address.

+ +
transactionRequest.gasLimit BigNumber | Promise< BigNumber >

The maximum amount of gas this transaction is permitted to use.

+ +
transactionRequest.gasPrice BigNumber | Promise< BigNumber >

The price (in wei) per unit of gas this transaction will pay.

+ +
transactionRequest.data DataHexString | Promise< DataHexString >

The transaction data.

+ +
transactionRequest.value BigNumber | Promise< BigNumber >

The amount (in wei) this transaction is sending.

+ +
transactionRequest.chainId number | Promise< number >

The chain ID this transaction is authorized on, as specified by EIP-155.

+ +

If the chain ID is 0 will disable EIP-155 and the transaction will be valid on any network. This can be dangerous and care should be taken, since it allows transactions to be replayed on networks that were possibly not intended.

+ +

TransactionResponse inherits Transaction

A TransactionResponse includes all properties of a Transaction as well as several properties that are useful once it has been mined.

+ +
transaction.blockNumber number

The number ("height") of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.blockHash string< DataHexString< 32 > >

The hash of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.timestamp number

The timestamp of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.confirmations number

The number of blocks that have been mined (including the initial block) since this transaction was mined.

+ +
transaction.raw string< DataHexString >

The serialized transaction.

+ +
transaction.wait( [ confirmations = 1 ] ) Promise< TransactionReceipt >

Wait for confirmations. If 0, and the transaction has not been mined, null is returned.

+ +

TransactionReceipt

+
receipt.to string< Address >

The address this transaction is to. This is null if the the transaction was an init transaction, used to deploy a contract.

+ +
receipt.from string< Address >

The address this transaction is from.

+ +
receipt.contractAddress string< Address >

If this transaction has a null to address, it is an init transaction used to deploy a contract, in which case this is the address created by that contract.

+ +

To compute a contract address, the getContractAddress utility function can also be used with a TransactionResponse object, which requires the transaction nonce and the address of the sender.

+ +
receipt.transactionIndex number

The index of this transaction in the list of transactions included in the block this transaction was mined in.

+ +
receipt.root string

The intermediate state root of a receipt.

+ +

Only transactions included in blocks before the Byzantium Hard Fork have this property, as it was replaced by the status property.

+ +

The property is generally of little use to developers. At the time it could be used to verify a state transition with a fraud-proof only considering the single transaction; without it the full block must be considered.

+ +
receipt.gasUsed BigNumber

The amount of gas actually used by this transaction.

+ +
receipt.logsBloom string< DataHexString >

A bloom-filter, which incldues all the addresses and topics included in any log in this transaction.

+ +
receipt.blockHash string< DataHexString< 32 > >

The block hash of the block that this transaction was included in.

+ +
receipt.transactionHash string< DataHexString< 32 > >

The transaction hash of this transaction.

+ +
receipt.logs Array< Log >

All the logs emitted by this transaction.

+ +
receipt.blockNumber number

The block height (number) of the block that this transaction was included in.

+ +
receipt.confirmations number

The number of blocks that have been mined since this transaction, including the actual block it was mined in.

+ +
receipt.cumulativeGasUsed BigNumber

For the block this transaction was included in, this is the sum of the gas used used by each transaction in the ordered list of transactions up to (and including) this transaction.

+ +

This is generally of little interest to developers.

+ +
receipt.byzantium boolean

This is true if the block is in a post-Byzantium Hard Fork block.

+ +
receipt.status boolean

The status of a transaction is 1 is successful or 0 if it was reverted. Only transactions included in blocks post-Byzantium Hard Fork have this property.

+ +

Utilities

These utilities are used extensively within the library, but are also quite useful for application developers.

+ +

Application Binary Interface

An Application Binary Interface (ABI) is a collection of Fragments which specify how to interact with various components of a Contract.

+ +

An Interface helps organize Fragments by type as well as provides the functionality required to encode, decode and work with each component.

+ +

Most developers will not require this low-level access to encoding and decoding the binary data on the network and will most likely use a Contract which provides a more convenient interface. Some framework, tool developers or developers using advanced techniques may find these classes and utilities useful.

+ +

Interface

The Interface Class abstracts the encoding and decoding required to interact with contracts on the Ethereum network.

+ +

Many of the standards organically evolved along side the Solidity language, which other languages have adopted to remain compatibile with existing deployed contracts.

+ +

The EVM itself does not understand what the ABI is. It is simply an agreed upon set of formats to encode various types of data which each contract can expect so they can interoperate with each other.

+ +

Creating Instances

+
new ethers.utils.Interface( abi )

Create a new Interface from a JSON string or object representing abi.

+ +

The abi may be a JSON string or the parsed Object (using JSON.parse) which is emitted by the Solidity compiler (or compatible languages).

+ +

The abi may also be a Human-Readable Abi, which is a format the Ethers created to simplify manually typing the ABI into the source and so that a Contract ABI can also be referenced easily within the same source file.

+ +

Properties

+
interface.fragments Array< Fragment >

All the Fragments in the interface.

+ +
interface.events Array< EventFragment >

All the Event Fragments in the interface.

+ +
interface.functions Array< FunctionFragment >

All the Function Fragments in the interface.

+ +
interface.deploy ConstructorFragment

The Constructor Fragments for the interface.

+ +

Formatting

+
interface.format( [ format ] ) string | Array< string >

Return the formatted Interface. If the format type is json a single string is returned, otherwise an Array of the human-readable strings is returned.

+ +

Fragment Access

+
interface.getFunction( fragment ) FunctionFragment

Returns the FunctionFragment for fragment (see Specifying Fragments).

+ +
interface.getEvent( fragment ) EventFragment

Returns the EventFragment for fragment (see Specifying Fragments).

+ +

Signature and Topic Hashes

+
interface.getSighash( fragment ) string< DataHexString< 4 > >

Return the sighash (or Function Selector) for fragment (see Specifying Fragments).

+ +
interface.getEventTopic( fragment ) string< DataHexString< 32 > >

Return the topic hash for fragment (see Specifying Fragments).

+ +

Encoding Data

+
interface.encodeDeploy( [ values ] ) string< DataHexString >

Return the encoded deployment data, which can be concatenated to the deployment bytecode of a contract to pass values into the contract constructor.

+ +
interface.encodeFilterTopics( fragment [ , values ] ) Array< topic | Array< topic > >

Returns the encoded topic filter, which can be passed to getLogs for fragment (see Specifying Fragments) for the given values.

+ +

Each topic is a 32 byte (64 nibble) DataHexString.

+ +
interface.encodeFunctionData( fragment [ , values ] ) string< DataHexString >

Returns the encoded data, which can be used as the data for a transaction for fragment (see Specifying Fragments) for the given values.

+ +
interface.encodeFunctionResult( fragment [ , values ] ) string< DataHexString >

Returns the encoded result, which would normally be the response from a call for fragment (see Specifying Fragments) for the given values.

+ +

Most developers will not need this method, but may be useful for authors of a mock blockchain.

+ +

Decoding Data

+
interface.decodeEventLog( fragment , data [ , topics ] ) Result

Returns the decoded event values from an event log for fragment (see Specifying Fragments) for the given data with the optional topics.

+ +

If topics is not specified, placeholders will be inserted into the result.

+ +
interface.decodeFunctionData( fragment , data ) Result

Returns the decoded values from transaction data for fragment (see Specifying Fragments) for the given data.

+ +

Most developers will not need this method, but may be useful for debugging or inspecting transactions.

+ +
interface.decodeFunctionResult( fragment , data ) Result

Returns the decoded values from the result of a call for fragment (see Specifying Fragments) for the given data.

+ +

Parsing

The functions are generally the most useful for most developers. They will automatically search the ABI for a matching Event or Function and decode the components as a fully specified description.

+ +
interface.parseLog( log ) LogDescription

Search the event that matches the log topic hash and parse the values the log represents.

+ +
interface.parseTransaction( transaction ) TransactionDescription

Search for the function that matches the transaction data sighash and parse the transaction properties.

+ +

Types

+

Result inherits Array<any>

A Result is an array, so each value can be accessed as a positional argument.

+ +

Additionally, if values are named, the identical object as its positional value can be accessed by its name.

+ +

The name length is however reserved as it is part of the Array, so any named value for this key is renamed to _length. If there is a name collision, only the first is available by its key.

+ +

LogDescription

+
logDescription.args Result

The values of the input parameters of the event.

+ +
logDescription.eventFragment EventFragment

The EventFragment which matches the topic in the Log.

+ +
logDescription.name string

The event name. (e.g. Transfer)

+ +
logDescription.signature string

The event signature. (e.g. Transfer(address,address,uint256))

+ +
logDescription.topic string

The topic hash.

+ +

TransactionDescription

+
transactionDescription.args Result

The decoded values from the transaction data which were passed as the input parameters.

+ +
transactionDescription.functionFragment FunctionFragment

The FunctionFragment which matches the sighash in the transaction data.

+ +
transactionDescription.name string

The name of the function. (e.g. transfer)

+ +
transactionDescription.sighash string

The sighash (or function selector) that matched the transaction data.

+ +
transactionDescription.signature string

The signature of the function. (e.g. transfer(address,uint256))

+ +
transactionDescription.value BigNumber

The value from the transaction.

+ +

Specifying Fragments

When specifying a fragment to any of the functions in an Interface, any of the following may be used:

+ +

  • The name of the event or function, if it is unique and non-ambiguous within the ABI (e.g. transfer)
  • The signature of the event or function. The signature is normalized, so, for example, uint and uint256 are equivalent (e.g. transfer(address, uint))
  • The sighash or topichash of the function. The sighash is often referred to the function selector in Solidity (e.g. 0xa9059cbb)
  • A Fragment

+ +

Fragments

Explain an ABI.

+ +

Formats

+

JSON String ABI (Solidity Output JSON)

The JSON ABI Format is the format that is output from the Solidity compiler.

+ +

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 also be passed into any function which accepts a JSON String ABI.

+ +

Humanb-Readable ABI

The Human-Readable ABI was

+ +

article

+ +

Output Formats

Each Fragment and ParamType may be output using its format method.

+ +
ethers.utils.FragmentTypes.full string

This is a full human-readable string, including all parameter names, any optional modifiers (e.g. indexed, public, etc) and white-space to aid in human readabiliy.

+ +
ethers.utils.FragmentTypes.minimal string

This is similar to full, except with no unnecessary whitespace or parameter names. This is useful for storing a minimal string which can still fully reconstruct the original Fragment using Fragment&thinsp;.&thinsp;from.

+ +
ethers.utils.FragmentTypes.json string

This returns a JavaScript Object which is safe to call JSON.stringify on to create a JSON string.

+ +
ethers.utils.FragmentTypes.sighash string

This is a minimal output format, which is used by Solidity when computing a signature hash or an event topic hash.

+ +
Note

The sighash format is insufficient to re-create the original Fragment, since it discards modifiers such as indexed, anonymous, stateMutability, etc.

+ +

Fragment

An ABI is a collection of Fragments, where each fragment specifies:

+ +

+ +

Properties

+
fragment.name string

This is the name of the Event or Function. This will be null for a ConstructorFragment.

+ +
fragment.type string

This is a string which indicates the type of the Fragment. This will be one of:

+ +

  • constructor
  • event
  • function

+ +
fragment.inputs Array< ParamType >

This is an array of of each ParamType for the input parameters to the Constructor, Event of Function.

+ +

Methods

+
ethers.utils.Fragment.from( objectOrString ) Fragment

Returns a

+ +
ethers.utils.Fragment.isFragment( object ) boolean

Tra lal al

+ +

ConstructorFragment inherits Fragment

+

Properties

+
fragment.gas BigNumber

This is the gas limit that should be used during deployment. It may be null.

+ +
fragment.payable boolean

This is whether the constructor may receive ether during deployment as an endowment (i.e. msg.value != 0).

+ +
fragment.stateMutability string

This is the state mutability of the constructor. It can be any of:

+ +

  • nonpayable
  • payable

+ +

Methods

+
ethers.utils.ConstructorFragment.from( objectOrString ) ConstructorFragment

Tra la la...

+ +
ethers.utils.ConstructorFragment.isConstructorFragment( object ) boolean

Tra lal al

+ +

EventFragment inherits Fragment

+

Properties

+
fragment.anonymous boolean

This is whether the event is anonymous. An anonymous Event does not inject its topic hash as topic0 when creating a log.

+ +

Methods

+
ethers.utils.EventFragment.from( objectOrString ) EventFragment

Tra la la...

+ +
ethers.utils.EventFragment.isEventFragment( object ) boolean

Tra lal al

+ +

FunctionFragment inherits ConstructorFragment

+

Properties

+
fragment.constant boolean

This is whether the function is constant (i.e. does not change state). This is true if the state mutability is pure or view.

+ +
fragment.stateMutability string

This is the state mutability of the constructor. It can be any of:

+ +

  • nonpayable
  • payable
  • pure
  • view

+ +
fragment.outputs Array< ParamType >

A list of the Function output parameters.

+ +

Method

+
ethers.utils.FunctionFragment.from( objectOrString ) FunctionFragment

Tra la la...

+ +
ethers.utils.FunctionFragment.isFunctionFragment( object ) boolean

Tra lal al

+ +

ParamType

The following examples will represent the Solidity parameter:

+ +

string foobar

+ +

Properties

+
paramType.name string

The local parameter name. This may be null for unnamed parameters. For example, the parameter definition string foobar would be foobar.

+ +
paramType.type string

The full type of the parameter, including tuple and array symbols. This may be null for unnamed parameters. For the above example, this would be foobar.

+ +
paramType.baseType string

The base type of the parameter. For primitive types (e.g. address, uint256, etc) this is equal to type. For arrays, it will be the string array and for a tuple, it will be the string tuple.

+ +
paramType.indexed boolean

Whether the parameter has been marked as indexed. This only applies to parameters which are part of an EventFragment.

+ +
paramType.arrayChildren ParamType

The type of children of the array. This is null for for any parameter wjhich is not an array.

+ +
paramType.arrayLength number

The length of the array, or -1 for dynamic-length arrays. This is null for parameters which is not arrays.

+ +
paramType.components Array< ParamType >

The components of a tuple. This is null for non-tuple parameters.

+ +

Methods

Tra la la...

+ +
paramType.format( [ outputType = sighash ] )

Tra la la...

+ +
ethers.utils.ParamType.from( objectOrString ) ParamType

Tra la la...

+ +
ethers.utils.ParamType.isParamType( object ) boolean

Tra la la...

+ +

Addresses

Explain addresses,formats and checksumming here.

+ +

Also see: constants.AddressZero

+ +

Address Formats

+

Address

An Address is a DataHexString of 20 bytes (40 nibbles), with optional mixed case.

+ +

If the case is mixed, it is a Checksum Address, which uses a specific pattern of uppercase and lowercase letters within a given address to reduce the risk of errors introduced from typing an address or cut and paste issues.

+ +

All functions that return an Address will return a Checksum Address.

+ +

ICAP Address

The ICAP Address Format was an early attempt to introduce a checksum into Ethereum addresses using the popular banking industry's IBAN format with the country code specified as XE.

+ +

Due to the way IBAN encodes address, only addresses that fit into 30 base-36 characters are actually compatible, so the format was adapted to support 31 base-36 characters which is large enough for a full Ethereum address, however the preferred method was to select a private key whose address has a 0 as the first byte, which allows the address to be formatted as a fully compatibly standard IBAN address with 30 base-36 characters.

+ +

In general this format is no longer widely supported anymore, however any function that accepts an address can receive an ICAP address, and it will be converted internally.

+ +

To convert an address into the ICAP format, see getIcapAddress.

+ +

Converting and Verifying

+
ethers.utils.getAddress( address ) string< Address >

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 value of address may be any supported address format.

+ +
ethers.utils.getIcapAddress( address ) string< IcapAddress >

Returns address as an ICAP address. Supports the same restrictions as utils.getAddress.

+ +
ethers.utils.isAddress( address ) boolean

Returns true if address is valid (in any supported format).

+ +

Derivation

+
ethers.utils.computeAddress( publicOrPrivateKey ) string< Address >

Returns the address for publicOrPrivateKey. A public key may be compressed or uncompressed, and a private key will be converted automatically to a public key for the derivation.

+ +
ethers.utils.recoverAddress( digest , signature ) string< Address >

Use ECDSA Public Key Recovery to determine the address that signed digest to which generated signature.

+ +

Contracts Addresses

+
ethers.utils.getContractAddress( transaction ) string< Address >

Returns the contract address that would result if transaction was used to deploy a contract.

+ +
ethers.utils.getCreate2Address( from , salt , initCodeHash ) string< Address >

Returns the contract address that would result from the given CREATE2 call.

+ +

BigNumber

Many operations in Ethereum operation on numbers which are outside the range of safe values 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.

+ +

Types

+

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:

+ +
string

A HexString or a decimal string, either of which may be negative.

+ +
BytesLike

A BytesLike Object, such as an Array or Uint8Array.

+ +
BigNumber

An existing BigNumber instance.

+ +
number

A number that is within the safe range for JavaScript numbers.

+ +
BigInt

A JavaScript BigInt object, on environments that support BigInt.

+ +

Creating Instances

The constructor of BigNumber cannot be called directly. Instead, Use the static BigNumber.from.

+ +
ethers.BigNumber.from( aBigNumberish ) BigNumber

Returns an instance of a BigNumber for aBigNumberish.

+ +

Examples:

+
// From a decimal string... +BigNumber.from("42") +//! + +// From a HexString... +BigNumber.from("0x2a") +//! + +// From a negative HexString... +BigNumber.from("-0x2a") +//! + +// From an Array (or Uint8Array)... +BigNumber.from([ 42 ]) +//! + +// From an existing BigNumber... +let one1 = constants.One; +let one2 = BigNumber.from(one1) + +one2 +//! + +// ...which returns the same instance +one1 === one2 +//! + +// From a (safe) number... +BigNumber.from(42) +//! + +// From a ES2015 BigInt... (only on platforms with BigInt support) +BigNumber.from(42n) +//! + +// Numbers outside the safe range fail: +BigNumber.from(Number.MAX_SAFE_INTEGER); +//! error

Methods

The BigNumber class is immutable, so no operations can change the value it represents.

+ +

Math Operations

+
BigNumber.add( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber + otherValue.

+ +
BigNumber.sub( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber - otherValue.

+ +
BigNumber.mul( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber × otherValue.

+ +
BigNumber.div( divisor ) BigNumber

Returns a BigNumber with the value of BigNumber ÷ divisor.

+ +
BigNumber.mod( divisor ) BigNumber

Returns a BigNumber with the value of the remainder of BigNumber ÷ divisor.

+ +
BigNumber.pow( exponent ) BigNumber

Returns a BigNumber with the value of BigNumber to the power of exponent.

+ +
BigNumber.abs( ) BigNumber

Returns a BigNumber with the absolute value of BigNumber.

+ +
BigNumber.mask( bitcount ) BigNumber

Returns a BigNumber with the value of BigNumber with bits beyond the bitcount least significant bits set to zero.

+ +

Two's Compliment

Two's Complicment 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.

+ +
BigNumber.fromTwos( bitwidth ) BigNumber

Returns a BigNumber with the value of BigNumber converted from twos-compliment with bitwidth.

+ +
BigNumber.toTwos( bitwidth ) BigNumber

Returns a BigNumber with the value of BigNumber converted to twos-compliment with bitwidth.

+ +

Comparison and Equivalence

+
BigNumber.eq( otherValue ) boolean

Returns true if and only if the value of BigNumber is equal to otherValue.

+ +
BigNumber.lt( otherValue ) boolean

Returns true if and only if the value of BigNumber < otherValue.

+ +
BigNumber.lte( otherValue ) boolean

Returns true if and only if the value of BigNumber otherValue.

+ +
BigNumber.gt( otherValue ) boolean

Returns true if and only if the value of BigNumber > otherValue.

+ +
BigNumber.gte( otherValue ) boolean

Returns true if and only if the value of BigNumber otherValue.

+ +
BigNumber.isZero( ) boolean

Returns true if and only if the value of BigNumber is zero.

+ +

Conversion

+
BigNumber.toNumber( ) number

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.

+ +
BigNumber.toString( ) string

Returns the value of BigNumber as a base-10 string.

+ +
BigNumber.toHexString( ) string< DataHexString >

Returns the value of BigNumber as a base-16, 0x-prefixed DataHexString.

+ +

Inspection

+
ethers.BigNumnber.isBigNumber( object ) boolean

Returns true if and only if the object is a BigNumber object.

+ +

Examples

+
let a = BigNumber.from(42); +let b = BigNumber.from("91"); + +a.mul(b); +//!

Notes

This section is a for a couple of questions that come up frequently.

+ +

Why can't I just use numbers?

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 1018 wei in a single ether.

+ +

JavaScript uses IEEE 754 double-precision binary floating point 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:

+ +
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER) +//!

To remedy this, all numbers (which can be large) are stored and manipulated as Big Numbers.

+ +

The functions parseEther( etherString ) and formatEther( wei ) 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.

+ +

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.

+ +

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 BN.js 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.

+ +

Why BN.js??

The reason why BN.js is used internally as the big number is because that is the library used by 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.

+ +

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.

+ +

Byte Manipulation

Tra la la...

+ +

Types

+

Bytes

A Bytes is any object which is an Array or TypedArray with each value in the valid byte range (i.e. between 0 and 255 inclusive), or is an Object with a length property where each indexed property is in the valid byte range.

+ +

BytesLike

A BytesLike can be either a Bytes or a DataHexString.

+ +

DataHexString

A DataHexstring is identical to a HexString except that it has an even number of nibbles, and therefore is a valid representation of binary data as a string.

+ +

HexString

A Hexstring is a string which has a 0x prefix followed by any number of nibbles (i.e. case-insensitive hexidecumal characters, 0-9 and a-f).

+ +

Signature

  • r and s --- The x co-ordinate of r and the s value of the signature
  • v --- The parity of the y co-ordinate of r
  • _vs --- The compact representation of the s and v
  • recoveryParam --- The normalized (i.e. 0 or 1) value of v

+ +

Raw Signature inherits string<DataHexString<65>>

A Raw Signature is a common Signature format where the r, s and v are concanenated into a 65 byte (130 nibble) DataHexString.

+ +

SignatureLike

A SignatureLike is similar to a Signature, except redundant properties may be omitted or it may be a Raw Signature.

+ +

For example, if _vs is specified, s and v may be omitted. Likewise, if recoveryParam is provided, v may be omitted (as in these cases the missing values can be computed).

+ +

Inspection

+
ethers.utils.isBytes( object ) boolean

Returns true if and only if object is a valid Bytes.

+ +
ethers.utils.isBytesLike( object ) boolean

Returns true if and only if object is a Bytes or DataHexString.

+ +
ethers.utils.isHexString( object , [ length ] ) boolean

Returns true if and only if object is a valid hex string. If length is specified and object is not a valid DataHexString of length bytes, an InvalidArgument error is thrown.

+ +

Converting between Arrays and Hexstrings

+
ethers.utils.arrayify( DataHexStringOrArrayish [ , options ] ) Uint8Array

Converts DataHexStringOrArrayish to a Uint8Array.

+ +
ethers.utils.hexlify( hexstringOrArrayish ) string< DataHexString >

Converts hexstringOrArrayish to a DataHexString.

+ +
ethers.utils.hexValue( aBigNumberish ) string< HexString >

Converts aBigNumberish to a HexString, with no unnecessary leading zeros.

+ +
Examples
// Convert a hexstring to a Uint8Array +arrayify("0x1234") +//! + +// Convert an Array to a hexstring +hexlify([1, 2, 3, 4]) +//! + +// Convert an Object to a hexstring +hexlify({ length: 2, "0": 1, "1": 2 }) +//! + +// Convert an Array to a hexstring +hexlify([ 1 ]) +//! + +// Convert a number to a stripped hex value +hexValue(1) +//! + +// Convert an Array to a stripped hex value +hexValue([ 1, 2 ]) +//!

Array Manipulation

+
ethers.utils.concat( arrayOfBytesLike ) Uint8Array

Concatenates all the BytesLike in arrayOfBytesLike into a single Uint8Array.

+ +
ethers.utils.stripZeros( aBytesLike ) Uint8Array

Returns a Uint8Array with all leading 0 bytes of aBtyesLike removed.

+ +
ethers.utils.zeroPad( aBytesLike , length ) Uint8Array

Retutns a Uint8Array of the data in aBytesLike with 0 bytes prepended to length bytes long.

+ +

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

+ +

Hexstring Manipulation

+
ethers.utils.hexConcat( arrayOfBytesLike ) string< DataHexString >

Concatenates all the BytesLike in arrayOfBytesLike into a single DataHexString

+ +
ethers.utils.hexDataLength( aBytesLike ) string< DataHexString >

Returns the length (in bytes) of aBytesLike.

+ +
ethers.utils.hexDataSlice( aBytesLike , offset [ , endOffset ] ) string< DataHexString >

Returns a DataHexString representation of a slice of aBytesLike, from offset (in bytes) to endOffset (in bytes). If endOffset is omitted, the length of aBytesLike is used.

+ +
ethers.utils.hexStripZeros( aBytesLike ) string< HexString >

Returns a HexString representation of aBytesLike with all leading zeros removed.

+ +
ethers.utils.hexZeroPad( aBytesLike , length ) string< DataHexString >

Returns a DataHexString representation of aBytesLike padded to length bytes.

+ +

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

+ +

Signature Conversion

+
ethers.utils.joinSignature( aSignatureLike ) string< RawSignature >

Return the raw-format of aSignaturelike, which is 65 bytes (130 nibbles) long, concatenating the r, s and (normalized) v of a Signature.

+ +
ethers.utils.splitSignature( aSignatureLikeOrBytesLike ) Signature

Return the full expanded-format of aSignaturelike or a raw-format DataHexString. Any missing properties will be computed.

+ +

Random Bytes

+
ethers.utils.randomBytes( length ) Uint8Array

Return a new Uint8Array of length random bytes.

+ +
ethers.utils.shuffled( array ) Array< any >

Return a copy of array shuffled using Fisher-Yates Shuffle.

+ +
Examples
utils.randomBytes(8) +//! + +const data = [ 1, 2, 3, 4, 5, 6, 7 ]; + +// Returns a new Array +utils.shuffled(data); +//! + +// The Original is unscathed... +data +//!

Constants

The ethers.contants Object contains commonly used values.

+ +

Bytes

+
ethers.constants.AddressZero string< Address >

The Address Zero, which is 20 bytes (40 nibbles) of zero.

+ +
ethers.constants.HashZero string< DataHexString< 32 > >

The Hash Zero, which is 32 bytes (64 nibbles) of zero.

+ +

Strings

+
ethers.constants.EtherSymbol string

The Ether symbol, Ξ.

+ +

BigNumber

+
ethers.constants.NegativeOne BigNumber

The BigNumber value representing "-1".

+ +
ethers.constants.Zero BigNumber

The BigNumber value representing "0".

+ +
ethers.constants.One BigNumber

The BigNumber value representing "1".

+ +
ethers.constants.Two BigNumber

The BigNumber value representing "2".

+ +
ethers.constants.WeiPerEther BigNumber

The BigNumber value representing "1000000000000000000", which is the number of Wei per Ether.

+ +
ethers.constants.MaxUint256 BigNumber

The BigNumber value representing the maximum uint256 value.

+ +

Display Logic and Input

When creating an Application, it is useful to convert between user-friendly strings (usually displaying ether) and the machine-readable values that contracts and maths depend on (usually in wei).

+ +

For example, a Wallet may specify the balance in ether, and gas prices in gwei for the User Interface, but when sending a transaction, both must be specified in wei.

+ +

The parseUnits will parse a string representing ether, such as 1.1 into a BigNumber in wei, and is useful when a user types in a value, such as sending 1.1 ether.

+ +

The formatUnits will format a BigNumberish into a string, which is useful when displaying a balance.

+ +

Units

+

Decimal Count

A Unit can be specified as an number, which indicates the number of decimal places that should be used.

+ +

Examples:

+ +

  • 1 ether in wei, has 18 decimal places (i.e. 1 ether represents 1018 wei)
  • 1 bitcoin in Satoshi, has 8 decimal places (i.e. 1 bitcoin represents 108 satoshi)

+ +

Named Units

There are also several common Named Units, in which case their name (as a string) may be used.

+ +
NameDecimals 
wei0 
kwei3 
mwei6 
gwei9 
szabo12 
finney15 
ether18 

Functions

+

Formatting

+
ethers.utils.commify( value ) string

Returns a string with value grouped by 3 digits, separated by ,.

+ +

Conversion

+
ethers.utils.formatUnits( value [ , unit = "ether" ] ) string

Returns a string representation of value formatted with unit digits (if it is a number) or to the unit specified (if a string).

+ +
ethers.utils.formatEther( value ) string

The equivalent to calling formatUnits(value, "ether").

+ +
ethers.utils.parseUnits( value [ , unit = "ether" ] ) BigNumber

Returns a BigNumber representation of value, parsed with unit digits (if it is a number) or from the unit specified (if a string).

+ +
ethers.utils.parseEther( value ) BigNumber

The equivalent to calling parseUnits(value, "ether").

+ +

Encoding Utilities

+

Base58

+
ethers.utils.base58.decode( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-58 encoding.

+ +
ethers.utils.base58.encode( aBytesLike ) string

Return aBytesLike encoded as a string using the base-58 encoding.

+ +

Base64

+
ethers.utils.base64.decode( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-64 encoding.

+ +
ethers.utils.base64.encode( aBytesLike ) string

Return aBytesLike encoded as a string using the base-64 encoding.

+ +

Recursive-Length Prefix

The Recursive Length Prefix encoding is used throughout Ethereum to serialize nested structures of Arrays and data.

+ +
ethers.utils.RLP.encode( dataObject ) string< DataHexString >

Encode a structured Data Object into its RLP-encoded representation.

+ +

Each Data component may be an valid BytesLike.

+ +
ethers.utils.RLP.decode( aBytesLike ) DataObject

Decode an RLP-encoded aBytesLike into its structured Data Object.

+ +

All Data components will be returned as a DataHexString.

+ +

Data Object

A Data Object is a recursive structure which is used to serialize many internal structures in Ethereum. Each Data Object can either be:

+ +

  • Binary Data
  • An Array of Data Objects (i.e. this recursively includes Nesting)

+ +
Examples

  • "0x1234"
  • [ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]

+ +

FixedNumber

A FixedNumber is a fixed-width (in bits) number with an internal base-10 divisor, which allows it to represent a decimal fractional component.

+ +

Creating Instances

The FixedNumber constructor cannot be called directly. There are several static methods for creating a FixedNumber.

+ +
FixedNumber.from( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

+ +
FixedNumber.fromBytes( aBytesLike [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

+ +
FixedNumber.fromString( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format. The value must not contain more decimals than the format permits.

+ +
FixedNumber.fromValue( value [ , decimals = 0 [ , format = "fixed" ] ] ) FixedNumber

Returns an instance of a FixedNumber for value with decimals as a format.

+ +

Properties

+
fixednumber.format

The FixedFormat of fixednumber.

+ +

Methods

+

Math Operations

+
fixednumber.addUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue + otherValue.

+ +
fixednumber.subUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue - otherValue.

+ +
fixednumber.mulUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue × otherValue.

+ +
fixednumber.divUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue ÷ otherValue.

+ +
fixednumber.round( [ decimals = 0 ] ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue rounded to decimals.

+ +

Conversion

+
fixednumber.toFormat( format ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue with format.

+ +
fixednumber.toHexString( ) string

Returns a HexString representation of fixednumber.

+ +
fixednumber.toString( ) string

Returns a string representation of fixednumber.

+ +
fixednumber.toUnsafeFloat( ) float

Returns a floating-point JavaScript number value of fixednumber. Due to rounding in JavaScript numbers, the value is only approximate.

+ +

Inspection

+
FixedNumber.isFixedNumber( value ) boolean

Returns true if and only if value is a FixedNumber.

+ +

FixedFormat

A FixedFormat is a simple object which represents a decimal (base-10) Fixed-Point data representation. Usually using this class directly is uneccessary, as passing in a Format Strings directly into the FixedNumber will automatically create this.

+ +

Format Strings

A format string is composed of three components, including signed-ness, bit-width and number of decimals.

+ +

A signed format string begins with fixed, which an unsigned format string begins with ufixed, followed by the width (in bits) and the number of decimals.

+ +

The width must be conguent to 0 mod 8 (i.e. (width % 8) == 0) and no larger than 256 bits and the number of decimals must be no larger than 80.

+ +

For example:

+ +

  • fixed128x18 is signed, 128 bits wide and has 18 decimals; this is useful for most purposes
  • fixed32x0 is signed, 32 bits wide and has 0 decimals; this would be the same as a int32_t in C
  • ufixed32x0 is unsigned, 32 bits wide and has 0 decimals; this would be the same as a uint32_t in C
  • fixed is shorthand for fixed128x18
  • ufixed is shorthand for ufixed128x18

+ +

Creating Instances

+
FixedFormat.from( value = "fixed128x18" ) FixedFormat

Returns a new instance of a FixedFormat defined by value. Any valid Format Strings may be passed in as well as any object which has any of signed, width and decimals defined, including a FixedFormat object.

+ +

Properties

+
fixedFormat.signed boolean

The signed-ness of fixedFormat, true if negative values are supported.

+ +
fixedFormat.width number

The width (in bits) of fixedFormat.

+ +
fixedFormat.decimals number

The number of decimal points of fixedFormat.

+ +
fixedFormat.name string

The name of the fixedFormat, which can be used to recreate the format and is the string that the Solidity language uses to represent this format.

+ +
"fixed"

A shorthand for fixed128x80.

+ +

Hashing Algorithms

Explain what hash functions are?

+ +

Cryptographic Hash Functions

The Cryptographic Hash Functions are a specific family of hash functions.

+ +
ethers.utils.id( text ) string< DataHexString< 32 > >

The Ethereum Identity function computs the KECCAK256 hash of the text bytes.

+ +
ethers.utils.keccak256( aBytesLike ) string< DataHexString< 32 > >

Returns the KECCAK256 digest aBytesLike.

+ +
ethers.utils.ripemd160( aBytesLike ) string< DataHexString< 20 > >

Returns the RIPEMD-160 digest of aBytesLike.

+ +
ethers.utils.sha256( aBytesLike ) string< DataHexString< 32 > >

Returns the SHA2-256 digest of aBytesLike.

+ +
ethers.utils.sha512( aBytesLike ) string< DataHexString< 64 > >

Returns the SHA2-512 digest of aBytesLike.

+ +
KECCAK256
utils.keccak256([ 0x12, 0x34 ]) +//! + +utils.keccak256("0x") +//! + +utils.keccak256("0x1234") +//! + +// The value MUST be data, such as: +// - an Array of numbers +// - a data hex string (e.g. "0x1234") +// - a Uint8Array + +// Do NOT use UTF-8 strings that are not a DataHexstring +utils.keccak256("hello world") +//! error + +// If needed, convert strings to bytes first: +utils.keccak256(utils.toUtf8Bytes("hello world")) +//! + +// Or equivalently use the identity function: +utils.id("hello world") +//! + +// Keep in mind that the string "0x1234" represents TWO +// bytes (i.e. [ 0x12, 0x34 ]. If you wish to compute the +// hash of the 6 characters "0x1234", convert it to UTF-8 +// bytes first using utils.toUtf8Bytes. + +// Consider the following examples: + +// Hash of TWO (2) bytes: +utils.keccak256("0x1234") +//! + +// Hash of TWO (2) bytes: (same result) +utils.keccak256([ 0x12, 0x34 ]) +//! + +const bytes = utils.toUtf8Bytes("0x1234"); +// <hide> +bytes +// </hide> +//! + +// Hash of SIX (6) characters (different than above) +utils.keccak256(bytes) +//! + +// Hash of SIX (6) characters (same result) +utils.id("0x1234") +//!
RIPEMD160
utils.ripemd160("0x") +//! + +utils.ripemd160("0x1234") +//!
SHA-2
utils.sha256("0x") +//! + +utils.sha256("0x1234") +//! + +utils.sha512("0x") +//! + +utils.sha512("0x1234") +//!

HMAC

+
ethers.utils.computeHmac( algorithm , key , data ) string< DataHexString >

Returns the HMAC of data with key using the Algorithm algorithm.

+ +

HMAC Supported Algorithms

+
ethers.utils.SupportedAlgorithm.sha256 string

Use the SHA2-256 hash algorithm.

+ +
ethers.utils.SupportedAlgorithm.sha512 string

Use the SHA2-512 hash algorithm.

+ +
HMAC
const key = "0x0102"; +const data = "0x1234"; +utils.computeHmac("sha256", key, data) +//!

Hashing Helpers

+
ethers.utils.hashMessage( message ) string< DataHexString< 32 > >

Computes the EIP-191 personal message digest of message. Personal messages are converted to UTF-8 bytes and prefixed with \x19Ethereum Signed Message: and the length of message.

+ +
ethers.utils.namehash( name ) string< DataHexString< 32 > >

Returns the ENS Namehash of name.

+ +
Hashing Messages
// @TODO: include exampels of hashMessage; it can be complex. :)
Namehash
utils.namehash("") +//! + +utils.namehash("eth") +//! + +utils.namehash("ricmoo.firefly.eth") +//! + +utils.namehash("ricmoo.xyz") +//!

Solidity Hashing Algorithms

When using the Solidity abi.packEncoded(...) function, a non-standard tightly packed version of encoding is used. These functions implement the tightly packing algorithm.

+ +
ethers.utils.solidityPack( types , values ) string< DataHexString >

Returns the non-standard encoded values packed according to their respecive type in types.

+ +
ethers.utils.solidityKeccak256( types , values ) string< DataHexString< 32 > >

Returns the KECCAK256 of the non-standard encoded values packed according to their respective type in types.

+ +
ethers.utils.soliditySha256( types , values ) string< DataHexString< 32 > >

Returns the SHA2-256 of the non-standard encoded values packed according to their respective type in types.

+ +
Solidity Hashing
utils.solidityPack([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.solidityPack([ "string", "uint8" ], [ "Hello", 3 ]) +//! + +utils.solidityKeccak256([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.soliditySha256([ "int16", "uint48" ], [ -1, 12 ]) +//!

HD Wallet

TODO: Explain BIP32 BIP-39 and whatnot here...

+ +

Types

+

Constants

+
ethers.utils.defaultPath "m/44'/60'/0'/0/0"

The default path for Ethereum in an HD Wallet

+ +

Mnemonic

+
mnemonic.phrase string

The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long and separated by the whitespace specified by the locale.

+ +
mnemonic.path string

The HD path for this mnemonic.

+ +
mnemonic.locale string

The language of the wordlist this mnemonic is using.

+ +

HDNode

+

Creating Instances

+
ethers.HDNode.fromMnemonic( phrase [ , password [ , wordlist ] ] ) HDNode

Return the HDNode for phrase with the optional password and wordlist.

+ +
ethers.HDNode.fromSeed( aBytesLike ) HDNode

Return the HDNode for the seed aBytesLike.

+ +
ethers.HDNode.fromExtendedKey( extendedKey ) HDNode

Return the HDNode for the extendedKey. If extendedKey was neutered, the HDNode will only be able to compute addresses and not private keys.

+ +

Properties

+
hdNode.privateKey string< DataHexString< 32 > >

The private key for this HDNode.

+ +
hdNode.publicKey string< DataHexString< 33 > >

The (compresses) public key for this HDNode.

+ +
hdNode.fingerprint string< DataHexString< 4 > >

The fingerprint is meant as an index to quickly match parent and children nodes together, however collisions may occur and software should verify matching nodes.

+ +

Most developers will not need to use this.

+ +
hdNode.parentFingerprint string< DataHexString< 4 > >

The fingerprint of the parent node. See fingerprint for more details.

+ +

Most developers will not need to use this.

+ +
hdNode.address string< Address >

The address of this HDNode.

+ +
hdNode.mnemonic Mnemonic

The mnemonic of this HDNode, if known.

+ +
hdNode.path string

The path of this HDNode, if known. If the mnemonic is also known, this will match mnemonic.path.

+ +
hdNode.chainCode string< DataHexString< 32 > >

The chain code is used as a non-secret private key which is then used with EC-multiply to provide the ability to derive addresses without the private key of child non-hardened nodes.

+ +

Most developers will not need to use this.

+ +
hdNode.index number

The index of this HDNode. This will match the last component of the path.

+ +

Most developers will not need to use this.

+ +
hdNode.depth number

The depth of this HDNode. This will match the number of components (less one, the m/) of the path.

+ +

Most developers will not need to use this.

+ +
hdNode.extendedKey string

A serialized string representation of this HDNode. Not all properties are included in the serialization, such as the mnemonic and path, so serializing and deserializing (using the fromExtendedKey class method) will result in reduced information.

+ +

Methods

+
hdNode.neuter( ) HDNode

Return a new instance of hdNode with its private key removed but all otehr properties preserved. This ensures that the key can not leak the private key of itself or any derived children, but may still be used to compute the addresses of itself and any non-hardened children.

+ +
hdNode.derivePath( path ) HDNode

Return a new HDNode which is the child of hdNode found by deriving path.

+ +

Other Functions

+
ethers.utils.mnemonicToSeed( phrase [ , password ] ) string< DataHexString< 64 > >

Convert a mnemonic phrase to a seed, according to BIP-39.

+ +
ethers.utils.mnemonicToEntropy( phrase [ , wordlist ] ) string< DataHexString >

Convert a mnemonic phrase to its entropy, according to BIP-39.

+ +
ethers.utils.isValidMnemonic( phrase [ , wordlist ] ) boolean

Returns true if phrase is a valid mnemonic phrase, by testing the checksum.

+ +

Logging

These are just a few simple logging utilities provided to simplify and standardize the error facilities across the Ethers library.

+ +

The Logger library has zero dependencies and is intentionally very light so it can be easily included in each library.

+ +

The Censorship functionality relies on one instance of the Ethers library being included. In large bundled packages or when npm link is used, this may not be the case. If you require this functionality, ensure that your bundling is configured properly.

+ +

Logger

+
new ethers.utils.Logger( version )

Create a new logger which will include version in all errors thrown.

+ +
Logger.globalLogger( ) Logger

Returns the singleton global logger.

+ +

Logging Output

+
logger.debug( ...args ) void

Log debugging information.

+ +
logger.info( ...args ) void

Log generic information.

+ +
logger.warn( ...args ) void

Log warnings.

+ +

Errors

These functions honor the current Censorship and help create a standard error model for detecting and processing errors within Ethers.

+ +
logger.makeError( message [ , code = UNKNOWN_ERROR [ , params ] ] ) Error

Create an Error object with message and an optional code and additional params set. This is useful when an error is needed to be rejected instead of thrown.

+ +
logger.throwError( message [ , code = UNKNOWN_ERROR [ , params ] ] ) never

Throw an Error with message and an optional code and additional params set.

+ +
logger.throwArgumentError( message , name , value ) never

Throw an INVALID_ARGUMENT Error with name and value.

+ +

Usage Validation

There can be used to ensure various properties and actions are safe.

+ +
logger.checkAbstract( target , kind ) void

Checks that target is not kind and performs the same operatons as checkNew. This is useful for ensuring abstract classes are not being instantiated.

+ +
logger.checkArgumentCount( count , expectedCound [ , message ) void

If count is not equal to expectedCount, throws a MISSING_ARGUMENT or UNEXPECTED_ARGUMENT error.

+ +
logger.checkNew( target , kind ) void

If target is not a valid this or target value, throw a MISSING_NEW error. This is useful to ensure callers of a Class are using new.

+ +
logger.checkNormalize( message ) void

Check that the environment has a correctly functioning String.normalize. If not, a UNSUPPORTED_OPERATION error is thrown.

+ +
logger.checkSafeUint53( value [ , message ] ) void

If value is not safe as a JavaScript number, throws a NUMERIC_FAULT error.

+ +

Censorship

+
Logger.setCensorship( censor [ , permanent = false ] ) void

Set error censorship, optionally preventing errors from being uncensored.

+ +

In production applications, this prevents any error from leaking information by masking the message and values of errors.

+ +

This can impact debugging, making it substantially more difficult.

+ +
Logger.setLogLevel( logLevel ) void

Set the log level, to suppress logging output below a particular log level.

+ +

Errors

Every error in Ethers has a code value, which is a string that will match one of the following error codes.

+ +

Generic Error Codes

+
Logger.errors.NOT_IMPLEMENTED

The operation is not implemented.

+ +
Logger.errors.SERVER_ERROR

There was an error communicating with a server.

+ +
Logger.errors.TIMEOUT

A timeout occurred.

+ +
Logger.errors.UNKNOWN_ERROR

A generic unknown error.

+ +
Logger.errors.UNSUPPORTED_OPERATION

The operation is not supported.

+ +

Safety Error Codes

+
Logger.errors.BUFFER_OVERRUN

The amount of data needed is more than the amount of data required, which would cause the data buffer to read past its end.

+ +
Logger.errors.NUMERIC_FAULT

There was an invalid operation done on numeric values.

+ +

Common cases of this occur when there is overflow, arithmetic underflow in fixed numeric types or division by zero.

+ +

Usage Error Codes

+
Logger.errors.INVALID_ARGUMENT

The type or value of an argument is invalid. This will generally also include the name and value of the argument. Any function which accepts sensitive data (such as a private key) will include the string [[REDACTED]] instead of the value passed in.

+ +
Logger.errors.MISSING_ARGUMENT

An expected parameter was not specified.

+ +
Logger.errors.MISSING_NEW

An object is a Class, but is now being called with new.

+ +
Logger.errors.UNEXPECTED_ARGUMENT

Too many parameters we passed into a function.

+ +

Ethereum Error Codes

+
Logger.errors.CALL_EXCEPTION

An attempt to call a blockchain contract (getter) resulted in a revert or other error.

+ +
Logger.errors.INSUFFICIENT_FUNDS

The account is attempting to make a transaction which costs more than is available.

+ +

A sending account must have enough ether to pay for the value, the gas limit (at the gas price) as well as the intrinsic cost of data. The intrinsic cost of data is 4 gas for each zero byte and 68 gas for each non-zero byte.

+ +
Logger.errors.NETWORK_ERROR

An Ethereum network validation error, such as an invalid chain ID.

+ +
Logger.errors.NONCE_EXPIRED

The nonce being specified has already been used in a mined transaction.

+ +
Logger.errors.REPLACEMENT_UNDERPRICED

When replacing a transaction, by using a nonce which has already been sent to the network, but which has not been mined yet the new transaction must specify a higher gas price.

+ +

This error occurs when the gas price is insufficient to bribe the transaction pool to prefer the new transaction over the old one. Generally, the new gas price should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the replacement should be 15.000000001 gwei.

+ +
Logger.errors.UNPREDICTABLE_GAS_LIMIT

When estimating the required amount of gas for a transaction, a node is queried for its best guess.

+ +

If a node is unable (or unwilling) to predict the cost, this error occurs.

+ +

The best remedy for this situation is to specify a gas limit in the transaction manually.

+ +

This error can also indicate that the transaction is expected to fail regardless, if for example an account with no tokens is attempting to send a token.

+ +

Log Levels

+
Logger.levels.DEBUG

Log all output, including debugging information.

+ +
Logger.levels.INFO

Only log output for infomational, warnings and errors.

+ +
Logger.levels.WARNING

Only log output for warnings and errors.

+ +
Logger.levels.ERROR

Only log output for errors.

+ +
Logger.levels.OFF

Do not output any logs.

+ +

Property Utilities

+
ethers.utils.checkProperties( ) void
+
ethers.utils.deepCopy( anObject ) any
+
ethers.utils.defineReadOnly( anObject , name , value ) void
+
ethers.utils.getStatic( aConstructor , key ) any
+
ethers.utils.resolveProperties( anObject ) Promise< any >
+
ethers.utils.shallowCopy( anObject ) any
+

Signing Key

+
new ethers.utils.SigningKey( privateKey )

Create a new SigningKey for privateKey.

+ +
signingKey.privateKey string< DataHexString< 32 > >

The private key for this Signing Key.

+ +
signingKey.publicKey string< DataHexString< 65 > >

The uncompressed public key for this Signing Key. It will always be 65 bytes (130 nibbles) and begine with 0x04.

+ +
signingKey.compressedPublicKey string< DataHexString< 33 > >

The compressed public key for this Signing Key. It will always be 33 bytes (66 nibbles) and begine with either 0x02 or 0x03.

+ +
signingKey.signDigest( digest ) Signature

Sign the digest and return the signature.

+ +
signingKey.computeSharedSecret( otherKey ) string< DataHexString< 32 > >

Compute the ECDH shared secret with otherKey. The otherKey may be either a public key or a private key, but generally will be a public key from another party.

+ +

It is best practice that each party computes the hash of this before using it as a symmetric key.

+ +
SigningKey.isSigningKey( anObject ) boolean

Returns true if anObject is a SigningKey.

+ +

Other Functions

+
ethers.utils.verifyMessage( message , signature ) string< Address >

Returns the address that signed message producing signature. The signature may have a non-canonical v (i.e. does not need to be 27 or 28), in which case it will be normalized to compute the `recoveryParam` which will then be used to compute the address; this allows systems which use the v to encode additional data (such as EIP-155) to be used since the v parameter is still completely non-ambiguous.

+ +
ethers.utils.recoverPublicKey( digest , signature ) string< DataHexString< 65 > >
+
ethers.utils.computePublicKey( key [ , compressed = false ] ) string< DataHexString >

Computes the public key of key, optionally compressing it. The key can be any form of public key (compressed or uncompressed) or a private key.

+ +

Strings

Tra la la

+ +

Bytes32String

A string in Solidity is length prefixed with its 256-bit (32 byte) length, which means that even short strings require 2 words (64 bytes) of storage.

+ +

In many cases, we deal with short strings, so instead of prefixing the string with its length, we can null-terminate it and fit it in a single word (32 bytes). Since we need only a single byte for the null termination, we can store strings up to 31 bytes long in a word.

+ +
Note

Strings that are 31 bytes long may contain fewer than 31 characters, since UTF-8 requires multiple bytes to encode international characters.

+ +
ethers.utils.parseBytes32String( aBytesLike ) string

Returns the decoded string represented by the Bytes32 encoded data.

+ +
ethers.utils.formatBytes32String( text ) string< DataHexString< 32 > >

Returns a bytes32 string representation of text. If the length of text exceeds 31 bytes, it will throw an error.

+ +

UTF-8 Strings

+
ethers.utils.toUtf8Bytes( text [ , form = current ] ) Uint8Array

Returns the UTF-8 bytes of text, optionally normalizing it using the UnicodeNormalizationForm form.

+ +
ethers.utils.toUtf8CodePoints( text [ , form = current ] ) Array< number >

Returns the Array of codepoints of text, optionally normalized using the UnicodeNormalizationForm form.

+ +
Note

This function correctly splits each user-perceived character into its codepoint, accounting for surrogate pairs. This should not be confused with string.split(""), which destroys surrogate pairs, spliting between each UTF-16 codeunit instead.

+ +
ethers.utils.toUtf8String( aBytesLike [ , onError = error ] ) string

Returns the string represented by the UTF-8 bytes of aBytesLike.

+ +

The onError is a Custom UTF-8 Error function and if not specified it defaults to the error function, which throws an error on any UTF-8 error.

+ +

UnicodeNormalizationForm

There are several commonly used forms when normalizing UTF-8 data, which allow strings to be compared or hashed in a stable way.

+ +
ethers.utils.UnicodeNormalizationForm.current

Maintain the current normalization form.

+ +
ethers.utils.UnicodeNormalizationForm.NFC

The Composed Normalization Form. This form uses single codepoints which represent the fully composed character.

+ +

For example, the é is a single codepoint, 0x00e9.

+ +
ethers.utils.UnicodeNormalizationForm.NFD

The Decomposed Normalization Form. This form uses multiple codepoints (when necessary) to compose a character.

+ +

For example, the é is made up of two codepoints, "0x0065" (which is the letter "e") and "0x0301" which is a special diacritic UTF-8 codepoint which indicates the previous character should have an acute accent.

+ +
ethers.utils.UnicodeNormalizationForm.NFKC

The Composed Normalization Form with Canonical Equivalence. The Canonical representation folds characters which have the same syntactic representation but different semantic meaning.

+ +

For example, the Roman Numeral I, which has a UTF-8 codepoint "0x2160", is folded into the capital letter I, "0x0049".

+ +
ethers.utils.UnicodeNormalizationForm.NFKD

The Decomposed Normalization Form with Canonical Equivalence. See NFKC for more an example.

+ +
Note

Only certain specified characters are folded in Canonical Equivalence, and thus it should not be considered a method to acheive any level of security from homoglyph attacks.

+ +

Custom UTF-8 Error Handling

When converting a string to its codepoints, there is the possibility of invalid byte sequences. Since certain situations may need specific ways to handle UTF-8 errors, a custom error handling function can be used, which has the signature:

+ +
errorFunction( reason , offset , bytes , output [ , badCodepoint ] ) number

The reason is one of the UTF-8 Error Reasons, offset is the index into bytes where the error was first encountered, output is the list of codepoints already processed (and may be modified) and in certain Error Reasons, the badCodepoint indicates the currently computed codepoint, but which would be rejected because its value is invalid.

+ +

This function should return the number of bytes to skip past keeping in mind the value at offset will already be consumed.

+ +

UTF-8 Error Reasons

+
ethers.utils.Utf8ErrorReason.BAD_PREFIX

A byte was encountered which is invalid to begin a UTF-8 byte sequence with.

+ +
ethers.utils.Utf8ErrorReason.MISSING_CONTINUE

A UTF-8 sequence was begun, but did not have enough continuation bytes for the sequence. For this error the ofset is the index at which a continuation byte was expected.

+ +
ethers.utils.Utf8ErrorReason.OUT_OF_RANGE

The computed codepoint is outside the range for valid UTF-8 codepoints (i.e. the codepoint is greater than 0x10ffff). This reason will pass the computed badCountpoint into the custom error function.

+ +
ethers.utils.Utf8ErrorReason.OVERLONG

Due to the way UTF-8 allows variable length byte sequences to be used, it is possible to have multiple representations of the same character, which means overlong sequences allow for a non-distinguished string to be formed, which can impact security as multiple strings that are otherwise equal can have different hashes.

+ +

Generally, overlong sequences are an attempt to circumvent some part of security, but in rare cases may be produced by lazy libraries or used to encode the null terminating character in a way that is safe to include in a char*.

+ +

This reason will pass the computed badCountpoint into the custom error function, which is actually a valid codepoint, just one that was arrived at through unsafe methods.

+ +
ethers.utils.Utf8ErrorReason.OVERRUN

The string does not have enough characters remaining for the length of this sequence.

+ +
ethers.utils.Utf8ErrorReason.UNEXPECTED_CONTINUE

This error is similar to BAD_PREFIX, since a continuation byte cannot begin a valid sequence, but many may wish to process this differently. However, most developers would want to trap this and perform the same operation as a BAD_PREFIX.

+ +
ethers.utils.Utf8ErrorReason.UTF16_SURROGATE

The computed codepoint represents a value reserved for UTF-16 surrogate pairs. This reason will pass the computed surrogate half badCountpoint into the custom error function.

+ +

Provided UTF-8 Error Handling Functions

There are already several functions available for the most common situations.

+ +
ethers.utils.Utf8ErrorFuncs.error

The will throw an error on any error with a UTF-8 sequence, including invalid prefix bytes, overlong sequences, UTF-16 surrogate pairs.

+ +
ethers.utils.Utf8ErrorFuncs.ignore

This will drop all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) from the final string as well as permit overlong sequences to be converted to their equivalent string.

+ +
ethers.utils.Utf8ErrorFuncs.replace

This will replace all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) with the UTF-8 Replacement Character, (i.e. U+FFFD).

+ +

Transactions

+

Types

+

UnsignedTransaction

An unsigned transaction represents a transaction that has not been signed and its values are flexible as long as they are not ambiguous.

+ +
unsignedTransaction.to string< Address >

The addres this transaction is to.

+ +
unsignedTransaction.nonce number

The nonce of this transaction.

+ +
unsignedTransaction.gasLimit BigNumberish

The gas limit for this transaction.

+ +
unsignedTransaction.gasPrice BigNumberish

The gas price for this transaction.

+ +
unsignedTransaction.data BytesLike

The data for this transaction.

+ +
unsignedTransaction.value BigNumberish

The value (in wei) for this transaction.

+ +
unsignedTransaction.chainId number

The chain ID for this transaction. If the chain ID is 0 or null, then EIP-155 is disabled and legacy signing is used, unless overridden in a signature.

+ +

Transaction

A generic object to represent a transaction.

+ +
transaction.hash string< DataHexString< 32 > >

The transaction hash, which can be used as an identifier for transaction. This is the keccak256 of the serialized RLP encoded representation of transaction.

+ +
unsignedTransaction.to string< Address >

The address transaction is to.

+ +
transaction.from string< Address >

The address transaction is from.

+ +
transaction.nonce number

The nonce for transaction. Each transaction sent to the network from an account includes this, which ensures the order and non-replayability of a transaction. This must be equal to the current number of transactions ever sent to the network by the from address.

+ +
transaction.gasLimit BigNumber

The gas limit for transaction. An account must have enough ether to cover the gas (at the specified gasPrice). Any unused gas is refunded at the end of the transaction, and if there is insufficient gas to complete execution, the effects of the trasaction are reverted, but the gas is fully consumed and an out-of-gas error occurs.

+ +
transaction.gasPrice BigNumber

The price (in wei) per unit of gas for transaction.

+ +
transaction.data BytesLike

The data for transaction. In a contract this is the call data.

+ +
transaction.value BigNumber

The value (in wei) for transaction.

+ +
transaction.chainId number

The chain ID for transaction. This is used as part of EIP-155 to prevent replay attacks on different networks.

+ +

For example, if a transaction was made on ropsten with an account also used on homestead, it would be possible for a transaction signed on ropsten to be executed on homestead, which is likely unintended.

+ +

There are situations where replay may be desired, however these are very rare and it is almost always recommended to specify the chain ID.

+ +
transaction.r string< DataHexString< 32 > >

The r portion of the elliptic curve signatures for transaction. This is more accurately, the x coordinate of the point r (from which the y can be computed, along with v).

+ +
transaction.s string< DataHexString< 32 > >

The s portion of the elliptic curve signatures for transaction.

+ +
transaction.v number

The v portion of the elliptic curve signatures for transaction. This is used to refine which of the two possible points a given x-coordinate can have, and in EIP-155 is additionally used to encode the chain ID into the serialized transaction.

+ +

Functions

+
ethers.utils.parseTransaction( aBytesLike ) Transaction

Parses the transaction properties from a serialized transactions.

+ +
ethers.utils.serializeTransaction( tx [ , signature ] ) string< DataHexString >

Computes the serialized transaction, optionally serialized with the a signature. If signature is not present, the unsigned serialized transaction is returned, which can be used to compute the hash necessary to sign.

+ +

This function uses EIP-155 if a chainId is provided, otherwise legacy serialization is used. It is highly recommended to always specify a chainId.

+ +

If signature includes a chain ID (explicitly or implicitly by using an EIP-155 v or _vs) it will be used to compute the chain ID.

+ +

If there is a mismatch between the chain ID of transaction and signature an error is thrown.

+ +

Web Utilities

+
ethers.utils.fetchJson( urlOrConnectionInfo [ , json [ , processFunc ] ] ) Promise< any >

Fetch and parse the JSON content from urlOrConnectionInfo, with the optiona body json and optionally processing the result with processFun before returning it.

+ +
ethers.utils.poll( pollFunc [ , options ] ) Promise< any >

Repeatedly call pollFunc using the PollOptions until it returns a value other than undefined.

+ +

ConnectionInfo

+
connection.url string

The URL to connect to.

+ +
connection.user string

The username to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

+ +
connection.password string

The password to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

+ +
connection.allowInsecureAuthentication boolean

Allow Basic Authentication over non-secure HTTP. The default is false.

+ +
connection.timeout number

How long to wait before rejecting with a timeout error.

+ +
connection.headers {[key:string]:string}

Additional headers to include in the connection.

+ +

PollOptions

+
options.timeout number

The amount of time allowed to ellapse before triggering a timeout error.

+ +
options.floor number

The minimum time limit to allow for Exponential Backoff.

+ +

The default is 0s.

+ +
options.ceiling number

The maximum time limit to allow for Exponential Backoff.

+ +

The default is 10s.

+ +
options.interval number

The interval used during Exponential Backoff calculation.

+ +

The default is 250ms.

+ +
options.retryLimit number

The number of times to retry in the event of an error or undefined is returned.

+ +
options.onceBlock Provider

If this is specified, the polling will wait on new blocks from provider before attempting the pollFunc again.

+ +
options.oncePoll Provider

If this is specified, the polling will occur on each poll cycle of provider before attempting the pollFunc again.

+ +

Wordlists

+

Wordlist

+
wordlist.locale string

The locale for this wordlist.

+ +
wordlist.getWord( index ) string

Returns the word at index.

+ +
wordlist.getWordIndex( word ) number

Returns the index of word within the wordlist.

+ +
wordlist.split( mnemonic ) Array< string >

Returns the mnemonic split into each individual word, according to a locale's valid whitespace character set.

+ +
wordlist.join( words ) string

Returns the mnemonic by joining words together using the whitespace that is standard for the locale.

+ +
Wordlist.check( wordlists ) string< DataHexString< 32 > >

Checks that all words map both directions correctly and return the hash of the lists. Sub-classes should use this to validate the wordlist is correct against the official wordlist hash.

+ +
Wordlist.register( wordlist [ , name ] ) void

Register a wordlist with the list of wordlists, optionally overriding the registered name.

+ +

Languages

The official wordlists availalbe in at `ethers.wordlists`. In the browser, only the english langauge is available by default; to include the others (which increases the size of the library), see the dist files in the `ethers` package.

+ +
ethers.wordlists.cz Wordlist

The Czech Wordlist.

+ +
ethers.wordlists.en Wordlist

The English Wordlist.

+ +
ethers.wordlists.es Wordlist

The Spanish Wordlist.

+ +
ethers.wordlists.fr Wordlist

The French Wordlist.

+ +
ethers.wordlists.it Wordlist

The Italian Wordlist.

+ +
ethers.wordlists.ja Wordlist

The Japanese Wordlist.

+ +
ethers.wordlists.ko Wordlist

The Korean Wordlist.

+ +
ethers.wordlists.zh_cn Wordlist

The Simplified Chinese Wordlist.

+ +
ethers.wordlists.zh_tw Wordlist

The Traditional Chinese Wordlist.

+ +

Other Libraries

Now that ethers is more modular, it is possible to have additional ancillary packages, which are not part of the core but optionally add functionality only needed in certain situations.

+ +

Assembly

This module should still be considered fairly experimental.

+ +

Ethers ASM Dialect

This provides a quick, high-level overcview of the Ethers ASM Dialect for EVM, which is defined by the Ethers ASM Dialect Grammar

+ +

Once a program is compiled by a higher level langauge into ASM (assembly), or hand-coded directly in ASM, it needs to be assembled into bytecode.

+ +

The assembly process performs a very small set of operations and is intentionally simple and closely related to the underlying EVM bytecode.

+ +

Operations include embedding programs within programs (for example the deployment bootstrap has the runtime embedded in it) and computing the necessary offsets for jump operations.

+ +

The Command-Line Assembler can be used to assemble an Ethers ASM Dialect file or to disassemble bytecode into its human-readable (ish) opcodes and literals.

+ +

Opcodes

An Opcode may be provided in either a functional or instructional syntax. For Opcodes that require parameters, the functional syntax is recommended and the instructional syntax will raise a warning.

+ +

@TODO: Examples

+ +

Labels

A Label is a position in the program which can be jumped to. A JUMPDEST is automatically added to this point in the assembled output.

+ +

@TODO: Exmaples

+ +

Literals

A Literal puts data on the stack when executed using a PUSH operation.

+ +

A Literal can be provided using a DataHexString or a decimal byte value.

+ +

@TODO: exmples

+ +

Comments

To enter a comment in the Ethers ASM Dialect, any text following a semi-colon (i.e. ;) is ignored by the assembler.

+ +

Scopes

A common case in Ethereum is to have one program embedded in another.

+ +

The most common use of this is embedding a Contract runtime bytecode within a deployment bytecode, which can be used as init code.

+ +

When deploying a program to Ethereum, an init transaction is used. An init transaction has a null to address and contains bytecode in the data. This data bytecode is a program, that when executed returns some other bytecode as a result, this restul is the bytecode to be installed.

+ +

Therefore it is important that embedded code uses jumps relative to itself, not the entire program it is embedded in, which also means that a jump can only target its own scope, no parent or child scopes. This is enforced by the assembler.

+ +

A scope may access the offset of any child Data Segment or child Scopes (with respect to itself) and may access the length of any Data Segment or Scopes anywhere in the program.

+ +

Every program in the Ethers ASM Dialect has a top-leve scope named _.

+ +

Data Segment

A Data Segment allows arbitrary data to be embedded into a program, which can be useful for lookup tables or deploy-time constants.

+ +

An emtpty Data Segment can also be used when a labelled location is required, but without the JUMPDEST which a Labels adds.

+ +

@TODO: Example

+ +

Links

A Link allows access to a Scopes, Data Segment or Labels.

+ +

To access the byte offset of a labelled item, use $foobar.

+ +

For a Labels, the target must be directly reachable within this scope. For a Data Segment or a Scopes, it can be inside the same scope or any child scope.

+ +

For a Data Segment or a Labels, there is an additional type of Link, which provides the length of the data or bytecode respectively. A Length Link is accessed by #foobar and is pushed on the stack as a literal.

+ +

Stack Placeholders

@TODO: exampl

+ +

Evaluation and Excution

+

Utilities

+

Assembler

The assembler utilities allow parsing and assembling an Ethers ASM Dialect source file.

+ +
asm.parse( code ) Node

Parse an ethers-format assembly file and return the Abstract Syntax Tree.

+ +
asm.assemble( node ) string< DataHexString >

Performs assembly of the Abstract Syntax Tree node and return the resulting bytecode representation.

+ +

Disassembler

The Disassembler utilities make it easy to convert bytecode into an object which can easily be examined for program structure.

+ +
asm.disassemble( bytecode ) Bytecode

Returns an array of Operations given bytecode.

+ +
asm.formatBytecode( operations ) string

Create a formatted output of an array of Operation.

+ +

Bytecode inherits Array<Operation>

Each arary index represents an operation, collapsing multi-byte operations (i.e. PUSH) into a single operation.

+ +
bytecode.getOperation( offset ) Operation

Get the operation at a given offset into the bytecode. This ensures that the byte at offset is an operation and not data contained within a PUSH, in which case null it returned.

+ +

Operation

An Operation is a single command from a disassembled bytecode stream.

+ +
operation.opcode Opcode

The opcode for this Operation.

+ +
operation.offset number

The offset into the bytecode for this Operation.

+ +
operation.pushValue string< DataHexString >

If the opcode is a PUSH, this is the value of that push

+ +

Opcode

+
asm.Opcode.from( valueOrMnemonic ) Opcode

Create a new instnace of an Opcode for a given numeric value (e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1").

+ +

Properties

+
opcode.value number

The value (bytecode as a number) of this opcode.

+ +
opcode.mnemonic string

The mnemonic string of this opcode.

+ +
opcode.delta number

The number of items this opcode will consume from the stack.

+ +
opcode.alpha number

The number of items this opcode will push onto the stack.

+ +
opcode.doc string

A short description of what this opcode does.

+ +
opcode.isMemory( ) "read" | "write" | "full"

Returns true if the opcode accesses memory.

+ +
opcode.isStatic( ) boolean

Returns true if the opcode cannot change state.

+ +
opcode.isJump( ) boolean

Returns true if the opcode is a jumper operation.

+ +
opcode.isPush( ) number

Returns 0 if the opcode is not a PUSH*, or the number of bytes this opcode will push if it is.

+ +

Abstract Syntax Tree

Parsing a file using the Ethers ASM Dialect will generate an Abstract Syntax Tree. The root node will always be a ScopeNode whose name is _.

+ +

To parse a file into an Abstract Syntax tree, use the parse function.

+ +

Types

+

Location

+
offset number

The offset into the source code to the start of this node.

+ +
length number

The length of characters in the source code to the end of this node.

+ +
source string

The source code of this node.

+ +

Nodes

@TODO: Place a diagram here showing the hierarchy

+ +

Node

+
node.tag string

A unique tag for this node for the lifetime of the process.

+ +
node.location Location

The source code and location within the source code that this node represents.

+ +

ValueNode inherits Node

A ValueNode is a node which may manipulate the stack.

+ +

LiteralNode inherits ValueNode

+
literalNode.value string

The literal value of this node, which may be a DataHexString or string of a decimal number.

+ +
literalNode.verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

+ +

PopNode inherits ValueNode

A PopNode is used to store a place-holder for an implicit pop from the stack. It represents the code for an implicit place-holder (i.e. $$) or an explicit place-holder (e.g. $1), which indicates the expect stack position to consume.

+ +
literalNode.index number

The index this PopNode is representing. For an implicit place-holder this is 0.

+ +

LinkNode inherits ValueNode

A LinkNode represents a link to another Node's data, for example $foo or #bar.

+ +
linkNode.label string

Te name of the target node.

+ +
linkNode.type "offset" | "length"

Whether this node is for an offset or a length value of the target node.

+ +

OpcodeNode inherits ValueNode

+
opcodeNode.opcode Opcode

The opcode for this Node.

+ +
opcodeNode.operands Array< ValueNode >

A list of all operands passed into this Node.

+ +

EvaluationNode inherits ValueNode

An EvaluationNode is used to execute code and insert the results but does not generate any output assembly, using the {{! code here }} syntax.

+ +
literalNode.verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

+ +
evaluationNode.script string

The code to evaluate and produce the result to use as a literal.

+ +

ExecutionNode inherits Node

An ExecutionNode is used to execute code but does not generate any output assembly, using the {{! code here }} syntax.

+ +
evaluationNode.script string

The code to execute. Any result is ignored.

+ +

LabelledNode inherits Node

A LabelledNode is used for any Node that has a name, and can therefore be targetted by a LinkNode.

+ +
labelledNode.name string

The name of this node.

+ +

LabelNode inherits LabelledNode

A LabelNode is used as a place to JUMP to by referencing it name, using @myLabel:. A JUMPDEST is automatically inserted at the bytecode offset.

+ +

DataNode inherits LabelledNode

A DataNode allows for data to be inserted directly into the output assembly, using @myData[ ... ]. The data is padded if needed to ensure values that would otherwise be regarded as a PUSH value does not impact anything past the data.

+ +
dataNode.data Array< ValueNode >

The child nodes, which each represent a verbatim piece of data in insert.

+ +

ScopeNode inherits LabelledNode

A ScopeNode allows a new frame of reference that all LinkNode's will use when resolving offset locations, using @myScope{ ... }.

+ +
scopeNode.statements Array< Node >

The list of child nodes for this scope.

+ +

Hardware Wallets

+

LedgerSigner inherits Signer

The Ledger Hardware Wallets are a fairly popular brand.

+ +
Importing in ES6 or TypeScript
import { LedgerSigner } from "@ethersproject/hardware-wallets";

API

+
new LedgerSigner( [ provider [ , type [ , path ] ] ] ) LedgerSigner

Connects to a Ledger Hardware Wallet. The type if left unspecified is determined by the environment; in node the default is "hid" and in the browser "u2f" is the default. The default Ethereum path is used if path is left unspecified.

+ +

Experimental

The Experimental package is used for features that are not ready to be included in the base library. The API should not be considered stable and does not follow semver versioning, so applications requiring it should specify the exact version needed.

+ +

BrainWallet inherits Wallet

Ethers removed support for BrainWallets in v4, since they are unsafe and many can be easily guessed, allowing attackers to steal the funds. This class is offered to ensure older systems which used brain wallets can still recover their funds and assets.

+ +
BrainWallet.generate( username , password [ , progressCallback ] ) BrainWallet

Generates a brain wallet, with a slightly improved experience, in which the generated wallet has a mnemonic.

+ +
BrainWallet.generateLegacy( username , password [ , progressCallback ] ) BrainWallet

Generate a brain wallet which is compatibile with the ethers v3 and earlier.

+ +

EIP1193Bridge inherits EventEmitter

The EIP1193Bridge allows a normal Ethers Signer and Provider to be exposed in as a standard EIP-1193 Provider, which may be useful when interacting with other libraries.

+ +

NonceManager inherits Signer

The NonceManager is designed to manage the nonce for a Signer, automatically increasing it as it sends transactions.

+ +

Currently the NonceManager does not handle re-broadcast. If you attempt to send a lot of transactions to the network on a node that does not control that account, the transaction pool may drop your transactions.

+ +

In the future, it'd be nice if the NonceManager remembered transactions and watched for them on the network, rebroadcasting transactions that appear to have been dropped.

+ +

Another future feature will be some sort of failure mode. For example, often a transaction is dependent on another transaction being mined first.

+ +
new NonceManager( signer )

Create a new NonceManager.

+ +
nonceManager.signer Signer

The signer whose nonce is being managed.

+ +
nonceManager.provider Provider

The provider associated with the signer.

+ +
nonceManager.setTransactionCount( count ) void

Set the current transaction count (nonce) for the signer.

+ +

This may be useful it interacting with the signer outside of using this class.

+ +
nonceManager.increaseTransactionCount( [ count = 1 ] ) void

Bump the current transaction count (nonce) by count.

+ +

This may be useful it interacting with the signer outside of using this class.

+ +

Command Line Interfaces

+

Sandbox Utility

The sandbox utility provides a simple way to use the most common ethers utilities required during learning, debuging and managing interactions with the Ethereum network.

+ +

If no command is given, it will enter a REPL interface with many of the ethers utilities already exposed.

+ +

Help

+
Usage: + ethers [ COMMAND ] [ ARGS ] [ OPTIONS ] + +COMMANDS (default: sandbox) + sandbox Run a REPL VM environment with ethers + init FILENAME Create a new JSON wallet + [ --force ] Overwrite any existing files + fund TARGET Fund TARGET with testnet ether + info [ TARGET ... ] Dump info for accounts, addresses and ENS names + send TARGET ETHER Send ETHER ether to TARGET form accounts[0] + [ --allow-zero ] Allow sending to the address zero + [ --data DATA ] Include data in the transaction + sweep TARGET Send all ether from accounts[0] to TARGET + sign-message MESSAGE Sign a MESSAGE with accounts[0] + [ --hex ] The message content is hex encoded + eval CODE Run CODE in a VM with ethers + run FILENAME Run FILENAME in a VM with ethers + wait HASH Wait for a transaction HASH to be mined + wrap-ether VALUE Deposit VALUE into Wrapped Ether (WETH) + unwrap-ether VALUE Withdraw VALUE from Wrapped Ether (WETH) + send-token TOKEN ADDRESS VALUE + Send VALUE tokens (at TOKEN) to ADDRESS + compile FILENAME Compiles a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --warnings ] Error on any warning + deploy FILENAME Compile and deploy a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --contract NAME ] Specify the contract to deploy + +ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password + +PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) + +TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending + +OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

+
Creating New Wallets
/home/ethers> ethers init wallet.json +Creating a new JSON Wallet - wallet.json +Keep this password and file SAFE!! If lost or forgotten +it CANNOT be recovered, by ANYone, EVER. +Choose a password: ****** +Confirm password: ****** +Encrypting... 100% +New account address: 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Saved: wallet.json + + +# If you are planning to try out the Ropsten testnet... +/home/ethers> ethers --network ropsten fund 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Transaction Hash: 0x8dc55b8f8dc8076acded97f9e3ed7d6162460c0221e2769806006b6d7d1156e0
Sending Ether and Tokens
# Sending ether +/home/ricmoo> ethers --account wallet.json send ricmoo.firefly.eth 0.123 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.123 ether + Nonce: 96 + Data: 0x + Gas Limit: 21000 + Gas Price: 1.2 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xc4adf8b379033d7ab679d199aa35e6ceee9a802ca5ab0656af067e911c4a589a + + +# Sending a token (SAI) +# NOTE: the contract address could be used instead but +# popular token contract addresses are also managed +# by ethers +/home/ricmoo> ethers --account wallet.json send-token sai.tokens.ethers.eth ricmoo.firefly.eth 1.0 +Sending Tokens: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + Token Contract: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + Value: 1.0 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.0 ether + Nonce: 95 + Data: 0xa9059cbb0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000 + Gas Limit: 37538 + Gas Price: 1.0 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xd609ecb7e3b5e8d36fd781dffceede3975ece6774b6322ea56cf1e4d0a17e3a1
Signing Messages
/home/ethers> ethers --account wallet.json sign-message 'Hello World' +Password (wallet.json): ****** +Decrypting... 100% +Message: + Message: "Hello World" + Message (hex): 0x48656c6c6f20576f726c64 +Sign Message? (y/N/a) y +Signature + Flat: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a161b + r: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb + s: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + vs: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + v: 27 + recid: 0

Scripting

The eval command can be used to execute simple one-line scripts from the command line to be passed into other commands or stored in script environment variables.

+ +
Get the formatted balance of an account
/home/ethers> ethers --network ropsten \ + --account wallet.json \ + eval \ + 'accounts[0].getBalance().then(b => formatEther(b))' +3.141592653589793238
Get the current block number
/home/ethers> ethers --network rinkeby \ + eval "provider.getBlockNumber()" +5761009
Convert a Solidity signature to JSON
/home/ethers> ethers eval 'utils.Fragment.from( + "function balanceOf(address) view returns (uint)" + ).format("json")' | json_pp +{ + "inputs" : [ + { + "type" : "address", + "name" : "owner" + } + ], + "type" : "function", + "payble" : false, + "stateMutability" : "view", + "ouputs" : [ + { + "type" : "uint256" + } + ], + "name" : "balanceOf", + "constant" : true +}
Compute a topic hash
/home/ricmoo> ethers eval 'id("Transfer(address,address,uint256")' +0xd99659a21de82e379975ce8df556f939a4ccb95e92144f38bb0dd35730ffcdd5
Create a random mnemonic
/home/ricmoo> ethers eval 'Wallet.createRandom().mnemonic' +useful pond inch knock ritual matrix giggle attend dilemma convince coach amazing

Using Mnemonics (with a password)

All mnemonic phrases have a password, but the default is to use the empty string (i.e. "") as the password. If you have a password on your mnemonic, the --mnemonic-password will prompt for the password to use to decrypt the account.

+ +
/home/ricmoo> ethers --account mnemonic.txt --mnemonic-password +Password (mnemonic): ****** +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() +<Promise id=0 resolved> +'0x6d3F723EC1B73141AA4aC248c3ab34A5a1DAD776' +homestead>

Using Mnemonics (with experimental memory-hard passwords)

The --xxx-mnemonic-password is similar to the --mnemonic-password options, which uses a password to decrypt the account for a mnemonic, however it passes the password through the scrypt password-based key derivation function first, which is intentionally slow and makes a brute-force attack far more difficult.

+ +
/home/ricmoo> ethers --account mnemonic.txt --xxx-mnemonic-password +Password (mnemonic; experimental - hard): ****** +Decrypting... 100% +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() +<Promise id=0 resolved> +'0x56FC8792cC17971C19bEC4Ced978beEA44711EeD' +homestead>
Note

This is still an experimental feature (hence the xxx).

+ +

Assembler

The assembler Command-Line utility allows you to assemble the Ethers ASM Dialect into deployable EVM bytecode and disassemle EVM bytecode into human-readable mnemonics.

+ +

Help

+
Usage: + ethers-asm [ FILENAME ] [ OPTIONS ] + +OPTIONS + --define KEY=VALUE provide assembler defines + --disassemble Disassemble input bytecode + --ignore-warnings Ignore warnings + --pic generate position independent code + --target LABEL output LABEL bytecode (default: _) + +OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit

Example Input Files

+
SimpleStore.asm
; SimpleStore (uint) + +; Set the inital value of 42 +sstore(0, 42) + +; Init code to deploy myContract +codecopy(0, $myContract, #myContract) +return(0, #myContract) + +@myContract { + ; Non-payable + jumpi($error, callvalue) + + ; Get the Sighash + shr({{= 256 - 32 }}, calldataload(0)) + + ; getValue() + dup1 + {{= sighash("getValue()") }} + jumpi($getValue, eq) + + ; setValue(uint) + dup1 + {{= sighash("setValue(uint)") }} + jumpi($setValue, eq) + + ; No matching signature + @error: + revert(0, 0) + + @getValue: + mstore(0, sload(0)) + return (0, 32) + + @setValue: + ; Make sure we have exactly a uint + jumpi($error, iszero(eq(calldatasize, 36))) + + ; Store the value + sstore(0, calldataload(4)) + return (0, 0) + + ; There is no *need* for the PUSH32, it just makes + ; decompiled code look nicer + @checksum[ + {{= (defines.checksum ? concat([ + Opcode.from("PUSH32"), + id(myContract.source) + ]): "0x") + }} + ] +}
SimpleStore.bin
0x602a6000556044601160003960446000f334601e5760003560e01c8063209652 +0x5514602457806355241077146030575b60006000fd5b60005460005260206000 +0xf35b6024361415601e5760043560005560006000f3
Note: Bytecode File Syntax

A bin file may be made up of multiple blocks of bytecode, each may optionally begin with a 0x prefix, all of which must be of even length (since bytes are required, with 2 nibbles per byte)

+ +

All whitespace is ignored.

+ +

Assembler Examples

The assembler converts an Ethers ASM Dialect into bytecode by running multiple passes of an assemble stage, each pass more closely approximating the final result.

+ +

This allows small portions of the bytecode to be massaged and tweaked until the bytecode stablizes. This allows for more compact jump destinations and for code to be include more advanced meta-programming techniques.

+ +
/home/ethers> ethers-asm SimpleStore.asm +0x602a6000556044601160003960446000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f3 + +# Piping in ASM source code +/home/ethers> cat SimpleStore.asm | ethers-asm +# Same as above + +# Setting a define which the ASM file checks and adds a checksum +/home/ethers> ethers-asm --define checksum SimpleStore.asm +0x602a6000556065601160003960656000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f37f10358310d664c9aeb4bf4ce7a10a6a03176bd23194c8ccbd3160a6dac90774d6

Options

+
--define KEY=VALUE or --define FLAG

This allows key/value pairs (where the value is a string) and flags (which the value is true) to be passed along to the assembler, which can be accessed in Scripting Blocks, such as {{= defined.someKey }}.

+ +
--ignore-warnings

By default any warning will be treated like an error. This enabled by-passing warnings.

+ +
--pic

When a program is assembled, the labels are usually given as an absolute byte position, which can be jumped to for loops and control flow. This means that a program must be installed at a specific location.

+ +

Byt specifying the Position Independent Code flag, code will be generated in a way such that all offsets are relative, allowing the program to be moved without any impact to its logic.

+ +

This does incur an additional gsas cost of 8 gas per offset access though.

+ +
--target LABEL

All programs have a root scope named _ which is by default assembled. This option allows another labelled target (either a Scopes or a Data Segment to be assembled instead. The entire program is still assembled per usual, so this only impacts which part of the program is output.

+ +

Disassembler Examples

A disassembled program shows offsets and mnemonics for the given bytecode. This format may change in the future to be more human-readable.

+ +
/home/ethers> ethers-asm --disassemble SimpleStore.bin +0000 : 0x2a ; #1 +0002 : 0x00 ; #1 +0004 : SSTORE +0005 : 0x44 ; #1 +0007 : 0x11 ; #1 +0009 : 0x00 ; #1 +000b : CODECOPY +000c : 0x44 ; #1 +000e : 0x00 ; #1 +0010 : RETURN +0011 : CALLVALUE +0012 : 0x1e ; #1 +0014 : JUMPI +0015 : 0x00 ; #1 +0017 : CALLDATALOAD +0018 : 0xe0 ; #1 +001a : SHR +001b : DUP1 +001c : 0x20965255 ; #4 +0021 : EQ +0022 : 0x24 ; #1 +0024 : JUMPI +0025 : DUP1 +0026 : 0x55241077 ; #4 +002b : EQ +002c : 0x30 ; #1 +002e : JUMPI +002f*: JUMPDEST +0030 : 0x00 ; #1 +0032 : 0x00 ; #1 +0034 : REVERT +0035*: JUMPDEST +0036 : 0x00 ; #1 +0038 : SLOAD +0039 : 0x00 ; #1 +003b : MSTORE +003c : 0x20 ; #1 +003e : 0x00 ; #1 +0040 : RETURN +0041*: JUMPDEST +0042 : 0x24 ; #1 +0044 : CALLDATASIZE +0045 : EQ +0046 : ISZERO +0047 : 0x1e ; #1 +0049 : JUMPI +004a : 0x04 ; #1 +004c : CALLDATALOAD +004d : 0x00 ; #1 +004f : SSTORE +0050 : 0x00 ; #1 +0052 : 0x00 ; #1 +0054 : RETURN + +/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble +# Same as above

Ethereum Naming Service

+

Help

+
Usage: + ethers-ens COMMAND [ ARGS ] [ OPTIONS ] + +COMMANDS + lookup [ NAME | ADDRESS [ ... ] ] + Lookup a name or address + commit NAME Submit a pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + reveal NAME Reveal a previous pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + set-controller NAME Set the controller (default: current account) + [ --address ADDRESS ] Specify another address + set-subnode NAME Set a subnode owner (default: current account) + [ --address ADDRESS ] Specify another address + set-resolver NAME Set the resolver (default: resolver.eth) + [ --address ADDRESS ] Specify another address + set-addr NAME Set the addr record (default: current account) + [ --address ADDRESS ] Specify another address + set-text NAME KEY VALUE Set a text record + set-email NAME EMAIL Set the email text record + set-website NAME URL Set the website text record + set-content NAME HASH Set the IPFS Content Hash + migrate-registrar NAME Migrate from the Legacy to the Permanent Registrar + transfer NAME NEW_OWNER Transfer registrant ownership + reclaim NAME Reset the controller by the registrant + [ --address ADDRESS ] Specify another address + +ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password + +PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) + +TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending + +OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

TODO examples

+ +

TypeScript

+

Help

+
Usage: + ethers-ts FILENAME [ ... ] [ OPTIONS ] + +OPTIONS + --output FILENAME Write the output to FILENAME (default: stdout) + --force Overwrite files if they already exist + --no-optimize Do not run the solc optimizer + --no-bytecode Do not include bytecode and Factory methods + +OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

TODO

+ +

Making Your Own

The cli library is meant to make it easy to create command line utilities of your own.

+ +

A CLI handles parsing all the command-line flags, options and arguments and instantiates a Plugin to process the command.

+ +

A CLI may support multiple Plugin's in which case the first argument is used to determine which to run (or if no arguments, the default plugin will be selected) or may be designed to be standalone, in which case exactly one Plugin will be used and no command argument is allowed.

+ +
addPlugin( command , pluginClass ) void

Add a plugin class for the command. After all options and flags have been consumed, the first argument will be consumed and the associated plugin class will be instantiated and run.

+ +
setPlugin( pluginClass ) void

Set a dedicated Plugin class which will handle all input. This may not be used in conjuction with addPlugin and will not automatically accept a command from the arguments.

+ +
showUsage( [ message = "" [ , status = 0 ] ] ) never

Shows the usage help screen for the CLI and terminates.

+ +
run( args ) Promise< void >

Usually the value of args passed in will be process.argv.slice(2).

+ +

Plugin

Each Plugin manages each command of a CLI and is executed in phases.

+ +

If the usage (i.e. help) of a CLI is requested, the static methods getHelp and getOptionHelp are used to geneate the help screen.

+ +

Otherwise, a plugin is instantiated and the prepareOptions is called. Each plugin must call super.prepareOptions, otherwise the basic options are not yet processed. During this time a Plugin should consume all the flags and options it understands, since any left over flags or options will cause the CLI to bail and issue an unknown option error. This should throw if a value for a given option is invalid or some combination of options and flags is not allowed.

+ +

Once the prepareOptions is complete (the returned promise is resolved), the prepareArguments is called. This should validate the number of arguments is expected and throw and error if there are too many or too few arguments or if any arguments do not make sense.

+ +

Once the prepareArguments is complete (the returned promise is resolved), the run is called.

+ +
plugin.network Network

The network this plugin is running for.

+ +
plugin.provider Provider

The provider for this plugin is running for.

+ +
plugin.accounts Array< Signer >

The accounts passed into the plugin using --account, --account-rpc and --account-void which this plugin can use.

+ +
plugin.gasLimit BigNumber

The gas limit this plugin should use. This is null if unspecified.

+ +
plugin.gasPrice BigNumber

The gas price this plugin should use. This is null if unspecified.

+ +
plugin.nonce number

The initial nonce for the account this plugin should use.

+ +

Methods

+
plugin.prepareOptions( argParser [ , verifyOnly = false ] ) Promise< void >
+
plugin.prepareArgs( args ) Promise< void >
+
plugin.run( ) Promise< void >
+
plugin.getAddress( addressOrName [ , message = "" , [ allowZero = false ] ] ) Promise< string >

A plugin should use this method to resolve an address. If the resovled address is the zero address and allowZero is not true, an error is raised.

+ +
plugin.dump( header , info ) void

Dumps the contents of info to the console with a header in a nicely formatted style. In the future, plugins may support a JSON output format which will automatically work with this method.

+ +
plugin.throwUsageError( [ message = "" ] ) never

Stops exectuion of the plugin and shows the help screen of the plugin with the optional message.

+ +
plugin.throwError( message ) never

Stops execution of the plugin and shows message.

+ +

Static Methods

+
Plugin.getHelp Help

Each subclass should implement this static method which is used to generate the help screen.

+ +
Plugin.getOptionHelp Array< Help >

Each subclass should implement this static method if it supports additional options which is used to generate the help screen.

+ +

ArgParser

The ArgParser is used to parse a command line into flags, options and arguments.

+ +
/home/ethers> ethers --account wallet.json --yes send ricmoo.eth 1.0 +# An Option ----------^ ^ ^ +# - name = "account" | | +# - value = "wallet.json" | | +# A Flag -----------------------------------+ | +# - name = "yes" | +# - value = true | +# Arguments ------------------------------------+ +# - count = 3 +# - [ "send", "ricmoo.eth", "1.0" ]

Flags are simple binary options (such as the --yes), which are true if present otherwise false.

+ +

Options require a single parameter follow them on the command line (such as --account wallet.json, which nhas the name account and the value wallet.json)

+ +

Arguments are all other values on the command line, and are not accessed through the ArgParser directly.

+ +

When a CLI is run, an ArgParser is used to validate the command line by using prepareOptions, which consumes all flags and options leaving only the arguments behind, which are then passed into prepareArgs.

+ +
argParser.consumeFlag( name ) boolean

Remove the flag name and return true if it is present.

+ +
argParser.consumeMultiOptions( names ) Array< {name:string,value:string} >

Remove all options which match any name in the Array of names with their values returning the list (in order) of values.

+ +
argParser.consumeOption( name ) string

Remove the option with its value for name and return the value. This will throw a UsageError if the option is included multiple times.

+ +
argParser.consumeOptions( name ) Array< string >

Remove all options with their values for name and return the list (in order) of values.

+ +

Cookbook

Cooking...

+ +

Migration Guide

Here are some migration guides when upgrading from older versions of Ethers or other libraries.

+ +

Migration: From Web3.js

TODO

+ +

Contracts

+

Providers

+

Numbers

+

Utilities

+

Migration: From Ethers v4

+

BigNumber

+

Namespace

Since BigNumber is used quite frequently, it has been moved to the top level of the umbrella package.

+ +
// v4 +ethers.utils.BigNumber +ethers.utils.BigNumberish + +// v5 +ethers.BigNumber +ethers.BigNumberish

Creating Instances

The bigNumberify method was always preferred over the constructor since it could short-circuit an object instantiation for [[BigNumber] objects (since they are immutable). This has been moved to a static from class method.

+ +
// v4 +new ethers.utils.BigNumber(someValue) +ethers.utils.bigNumberify(someValue); + +// v5 +// - Constructor is private +// - Removed `bigNumberify` +ethers.BigNumber.from(someValue)

Contracts

+
// @TODO

Errors

+

Namespace

All errors now belong to the Logger class and the related functions have been moved to Logger instances, which can include a per-package version string.

+ +

Global error fucntions have been moved Logger class methods.

+ +
// v4 +ethers.errors.UNKNOWN_ERROR +ethers.errors.* + +errors.setCensorship(censorship, permanent) +errors.setLogLevel(logLevel) + +errors.checkArgumentCount(count, expectedCount, suffix) +errors.checkNew(self, kind) +errors.checkNormalize() +errors.throwError(message, code, params) +errors.warn(...) +errors.info(...) + +// v5 +ethers.utils.Logger.errors.UNKNOWN_ERROR +ethers.utils.Logger.errors.* + +Logger.setCensorship(censorship, permanent) +Logger.setLogLevel(logLevel) + +const logger = new ethers.utils.Logger(version); +logger.checkArgumentCount(count, expectedCount, suffix) +logger.checkNew(self, kind) +logger.checkNormalize() +logger.throwError(message, code, params) +logger.warn(...) +logger.info(...)

Interface

The Interface object has undergone the most dramatic changes.

+ +

It is no longer a meta-class and now has methods that simplify handling contract interface operations without the need for object inspection and special edge cases.

+ +

Functions

+
// v4 (example: "transfer(address to, uint amount)") +interface.functions.transfer.encode(to, amount) +interface.functions.transfer.decode(callData) + +// v5 +interface.encodeData("transfer", [ to, amount ]) +interface.decodeResult("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)

Events

+
// v4 (example: Transfer(address indexed, address indexed, uint256) +interface.events.Transfer.encodeTopics(values) +interface.events.Transfer.decode(data, topics) + +// v5 +interface.encodeFilterTopics("Transfer", values) +interface.encodeEventLog("Transfer", data, topics)

Inspection

Interrogating properties about a function or event can now (mostly) be done directly on the Fragment object.

+ +
// v4 +interface.functions.transfer.name +interface.functions.transfer.inputs +interface.functions.transfer.outputs +interface.functions.transfer.payable +interface.functions.transfer.gas + +// v5 +const functionFragment = interface.getFunction("transfer") +functionFragment.name +functionFragment.inputs +functionFragment.outputs +functionFragment.payable +functionFragment.gas + + +// v4; type is "call" or "transaction" +interface.functions.transfer.type + +// v5; constant is true (i.e. "call") or false (i.e. "transaction") +functionFragment.constant + + +// v4 +interface.events.Transfer.anonymous +interface.events.Transfer.inputs +interface.events.Transfer.name + +// v5 +const eventFragment = interface.getEvent("Transfer"); +eventFragment.anonymous +eventFragment.inputs +eventFragment.name + + +// v4 +const functionSig = interface.functions.transfer.signature +const sighash = interface.functions.transfer.sighash + +const eventSig = interface.events.Transfer.signature +const topic = interface.events.Transfer.topic + +// v5 +const functionSig = functionFragment.format() +const sighash = interface.getSighash(functionFragment) + +const eventSig = eventFragment.format() +const topic = interface.getTopic(eventFragment)

Utilities

+

Renaming

+
// @TODO

Wallet

+

Mnemonic Phrases

The mnemonic phrase and related properties have been merged into a single mnemonic object, which also now includes the locale.

+ +
// v4 +wallet.mnemonic +wallet.path + +// v5 +// - Mnemonic phrase and path are a Mnemonic object +// - Note: wallet.mnemonic is null if there is no mnemonic +wallet.mnemonic.phrase +wallet.mnemonic.path

Testing

Here goes info about testing

+ +

Contributing and Hacking

The ethers.js library is something that I've written out of necessity, and has grown somewhat organically over time.

+ +

Many things are the way they are for good (at the time, at least) reasons, but I always welcome criticism, and am completely willing to have my mind changed on things.

+ +

So, pull requests are always welcome, but please keep a few points in mind:

+ +

  • Backwards-compatibility-breaking changes will not be accepted; they may be considered for the next major version
  • Security is important; adding dependencies require fairly convincing arguments as to why
  • The library aims to be lean, so keep an eye on the dist/ethers.min.js file size before and after your changes
  • Add test cases for both expected and unexpected input
  • Any new features need to be supported by me (future issues, documentation, testing, migration), so anything that is overly complicated or specific may not be accepted

+ +

In general, please start an issue before beginning a pull request, so we can have a public discussion and figure out the best way to address to problem/feature. :)

+ +

Building

If you wish to modify the source code, there are a few steps involved in setting up your environment.

+ +
Preparing the Package
# Clone the REPO +/home/ricmoo> git clone git@github.com:ethers-io/ethers.js.git +/home/ricmoo> cd ethers.js + +# Install the base dependencies +/home/ricmoo/ethers.js> npm install + +# Install each module's dependencies and link the libraries +# internally, so they reference each other +/home/ricmoo/ethers.js> npm run bootstrap
Watching and Building
# Begin watching the files and re-building whenever they change +/home/ricmoo/ethers.js> npm run auto-build + + +# Sometimes the issue only affects the ESM modules +/home/ricmoo/ethers.js> npm run auto-build-esm + + +# Or if you only need to run a single build +/home/ricmoo/ethers.js> npm run _build-cjs +/home/ricmoo/ethers.js> npm run _build-esm
Testing
# Rebuilds all files and bundles testcases up for testing +/home/ricmoo/ethers.js> npm test + +# Often you don't need the full CI experience +/home/ricmoo/ethers.js> npm run _test-node
Preparing the Distribution
/home/ricmoo/ethers.js> npm run update-version

Flatworm Docs

The Flatworm Docs rendering engine is designed to be very simple, but provide enough formatting necessary for documenting JavaScript libraries.

+ +

A lot of its inspiration came from Read the Docs and the Sphinx project.

+ +

Fragments

Each page is made up of fragments. A fragment is a directive, with an value and optional link, extensions and a body.

+ +

Many directives support markdown in their value and body.

+ +

A fragment's body continues until another fragment is encountered.

+ +

Directive Format

+
_DIRECTIVE: VALUE @<LINK> @EXTENSION<PARAMETER> +BODY + +MORE BODY + +DIRECTIVE: The directive name +VALUE: Optional; the value to pass to the directive +LINK: Optional; a name for internal linking +EXTENSION: Optional; extended directive functionality +PARAMETER: Optional; value to pass to extended directive functions +BODY: Optional; the directive body (certain directives only)

Flatworm Directives

+
_section: TITLE

A section has its TITLE in an H1 font. Sections are linked to in Table of Contents and have a dividing line drawn above them.

+ +

The body supports markdown.

+ +

There should only be one _section: per page.

+ +

Extensions: @inherit, @src, @nav, @note

+ +
_subsection: TITLE

A subsection has its TITLE in an H2 font. Subsections are linked to in Table of Contents and have a dividing line drawn above them.

+ +

The title and body support markdown.

+ +

Extensions: @inherit, @src, @note

+ +
_heading: TITLE

A heading has its TITLE in an H3 font.

+ +

The title and body support markdown.

+ +

Extensions: @inherit, @src, @note

+ +
_definition: TERM

A definition has its TERM in normal text and the body is indented.

+ +

The title and body support markdown.

+ +
_property: SIGNATURE

A property has its JavaScript SIGNATURE formatted.

+ +

The body supports markdown and the return portion of the signature support markdown links.

+ +

Extensions: @src

+ +
_note: BANNER

A note is placed in a blue bordered-box to draw attention to it.

+ +

The body supports markdown.

+ +
_warning: BANNER

A warning is placed in an orange bordered-box to draw attention to it.

+ +

The body supports markdown.

+ +
_code: CAPTION

Creates a Code block.

+ +

The body does not support markdown, and will be output exactly as is, with the exception of Code Evaluation.

+ +

If a line begins with a "_", it should be escaped with a "\".

+ +

Extensions: @lang

+ +
_table: FOOTER

Creates a Table structured according to the body.

+ +

Each cell support and variables support markdown.

+ +

Extensions: @style

+ +
_toc:

A toc injects a Table of Contents, loading each line of the body as a filename and recursively loads the toc if present, otherwise all the sections and subsections.

+ +

The body does not support markdown, as it is interpreted as a list of files and directories to process.

+ +
_null:

A null is used to terminated a directive. For example, after a definition, the bodies are indented, so a null can be used to reset the indentation.

+ +

The body supports markdown.

+ +
Example
_section: Hello World @<link-main> +Body for section... + + +_subsection: Some Example @<link-secondary> +Body for subsection... + + +_heading: Large Bold Text @<link-here> +Body for heading... + + +_definition: Flatworm +A phylum of relatively **simple** bilaterian, unsegmented, +soft-bodied invertebrates. + + +_property: String.fromCharCode(code) => string +Returns a string created from //code//, a sequence of +UTF-16 code units. + + +_code: heading + +// Some code goes here +while(1); + + +_table: Table Footer + +| **Name** | **Color** | +| Apple | Red | +| Banana | Yellow | +| Grape | Purple | + + +_toc: + some-file + some-directory + + +_note: Title +This is placed in a blue box. + + +_warning: Title +This is placed in an orange box. + + +_null: +This breaks out of a directive. For example, to end a

Markdown

The markdown is simple and does not have the flexibility of other dialects, but allows for bold, italic, underlined, monospaced, superscript and strike text, supporting links and lists.

+ +

Lists are rendered as blocks of a body, so cannot be used within a title or within another list.

+ +
**bold text** + +//italic text// + +__underlined text__ + +``monospace code`` + +^^superscript text^^ + +~~strikeout text~~ + +- This is a list +- With bullet points +- With a total of three items + +This is a [Link to Ethereum](https://ethereum.org) and this +is an [Internal Link](some-link). + +This is a self-titled link [[https://ethereumorg]] and this +[[some-link]] will use the title from its directives value.

Code

The code directive creates a monospace, contained block useful for displaying code samples.

+ +

JavaScript Evaluation

For JavaScript files, the file is executed with some simple substitution.

+ +

A bare //! on a line is replaced with the result of the last statement. Building will fail if an error is thrown.

+ +

A bare //!error is replaced with the throw error. Building will fail if an error is not thrown.

+ +

Also any code included between the lines // <hide> and // </hide> will be omitted from the output, which can be used to setup variables.

+ +
Code Evaluation Example
_code: Result of Code Example @lang<javascript> + +// <hide> +const url = require("url"); +// </hide> + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// <hide> +foo +// </hide> +//!
Result of Code Example
// <hide> +const url = require("url"); +// </hide> + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// <hide> +foo +// </hide> +//!

Languages

The language can be specified using the @lang extension.

+ +
LanguageNotes 
javascriptSyntax highlights and evaluates the JavaScipt 
scriptSame as javascript, but does not evaluate the results 
shellShell scripts or command-line 
textPlain text with no syntax highlighting 

Tables

The table directive consumes the entire body up until the next directive. To terminate a table early to begin a text block, use a _null: directive.

+ +

Each line of the body should be Row Data or a Variable Declaration (or continuation of a Variable Declaration). Blank lines are ignored.

+ +

Row Data

Each Row Data line must begin and end with a "|", with each gap representing the cell data, alignment with optional column and row spanning.

+ +

Alignment

The alignment for a cell is determined by the whitespace surrounding the cell data.

+ +
AlignmentWhitespace 
Left1 or fewer spaces before the content 
Right1 or fewer spaces after the content 
Center2 or more space both before and after the content 
Alignment Conditions (higher precedence listed first) 
Alignment Example
_table: Result of Alignment Example @style<compact> + +| center | + +| left | +|left | + +| right | +| right|
center 
left 
left 
right 
right 
Result of Alignment Example 

Row and Column Spanning

A column may end its content with any number of "<" which indicates how many additional columns to extend into.

+ +

If the cell content contains only a "^", then the row above is extended into this cell (into the same number of columns).

+ +
Cell Spanning Example
_table: Result of Cell Spanning Example @style<compact> + +| (1x1) | (1x2) <| (2x1) | +| (2x2) <| (2x1) | ^ | +| ^ | ^ | (1x1) |
(1x1)(1x2)(2x1) 
(2x2)(2x1) 
(1x1) 
Result of Cell Spanning Example 

Styles

The @style extension for a table can be used to control its appearance.

+ +
NameWidthColumns 
minimalminimum sizebest fit 
compact40%evenly spaced 
wide67%evenly spaced 
full100%evenly spaced 

Variables

Often the layout of a table is easier to express and maintain without uneven or changing content within it. So the content can be defined separately within a table directive using variables. A varaible name must being with a letter and must only contain letters and numbers.

+ +

Variables are also useful when content is repeated throughout a table.

+ +

A variable is declared by starting a line with "$NAME:", which consumes all lines until the next variable declaration or until the next table row line.

+ +

A variable name must start with a letter and may consist of letters and numbers. (i.e. /[a-z][a-z0-9]*/i)

+ +
Variables Example
_table: Result of Variables Example + +$Yes: This option is supported. +$No: This option is **not** supported +$bottom: This just represents an example of + what is possible. Notice that variable + content can span multiple lines. + +| **Feature** | **Supported** | +| Dancing Monkey | $Yes | +| Singing Turtle | $No | +| Newt Hair | $Yes | +| $bottom <|
FeatureSupported 
Dancing MonkeyThis option is supported. 
Singing TurtleThis option is not supported. 
Newt HairThis option is supported. 
This just represents an example of what is possible. Notice that variable content can span multiple lines. 
Result of Variables Example 

Configuration

Configuration is optional (but highly recommended) and may be either a simple JSON file (config.json) or a JS file (config.js) placed in the top of the source folder.

+ +

TODO: example JSON and example JS

+ +

Extensions

+

@inherit< markdown >

Adds an inherits description to a directive. The markdown may contain links.

+ +

@lang< text >

Set the language a code directive should be syntax-highlighted for. If "javascript", the code will be evaluated.

+ +

@nav< text >

Sets the name in the breadcrumbs when not the current node.

+ +

@note< markdown >

Adds a note to a directive. The markdown may contain links. If the directive already has an @INHERIT extension, that will be used instead and the @NOTE will be ignored.

+ +

@src< key >

Calls the configuration getSourceUrl(key, VALUE) to get a URL which will be linked to by a link next to the directive.

+ +

This extended directive function requires an advanced config.js Configuration file since it requires a JavaScript function.

+ +

@style< text >

The Table Style to use for a table directive.

+ +

License and Copyright

The ethers library (including all dependencies) are available under the MIT License, which permits a wide variety of uses.

+ +

MIT License

Copyright © 2019 Richard Moore.

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ + + + +
+ + + diff --git a/docs/static/lato/OFL.txt b/docs/static/lato/OFL.txt new file mode 100644 index 000000000..6d2c4160b --- /dev/null +++ b/docs/static/lato/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2010-2015, Ɓukasz Dziedzic (dziedzic@typoland.com), +with Reserved Font Name Lato. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/static/lato/README.txt b/docs/static/lato/README.txt new file mode 100644 index 000000000..272db628f --- /dev/null +++ b/docs/static/lato/README.txt @@ -0,0 +1,72 @@ + +Lato font family (Desktop version) + +================================== + +Version 2.015; Latin+Cyrillic+Greek+IPA opensource + +Created by: tyPoland Lukasz Dziedzic +Creation year: 2015 + +Copyright (c) 2010-2015 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1. + +Lato is a trademark of tyPoland Lukasz Dziedzic. + +Source URL: http://www.latofonts.com/ +License URL: http://scripts.sil.org/OFL + +================ + +Lato is a sanserif typeface family designed in the Summer 2010 and extended in the Summer 2013 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in the 2010s, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness. In 2013-2014, the family was greatly extended (with the help of Adam Twardoch and Botio Nikoltchev) to cover 3000+ glyphs over nine weights with italics. It now supports 100+ Latin-based languages, 50+ Cyrillic-based languages as well as Greek and IPA phonetics. The Lato fonts are available free of charge under the SIL Open Font License from http://www.latofonts.com/ + +================ + +CONTENTS: + +This folder contains 18 font files in OpenType TT (.ttf) format. You can install these fonts on your computer and use in any desktop applications (such as Word, InDesign, Illustrator, Photoshop, Keynote or Pages). + +================ + +REVISION LOG: + +# Version 2.015 (2015-08-06) +Initial implementation of mark positioning (should work for most glyphs) +Autohinted using ttfautohint 1.3. + +# Version 2.010 (2014-09-01) +Improved some contour bugs and diacritics positioning. +Improved outline quality. +Revised OTL features so that they work in browsers (ot-sanitise). +Autohinted using ttfautohint 1.1. +Interpolated the Medium weight differently so it provides more visual difference from Regular. + +# Version 2.007 (2014-02-27) +Greatly expanded character set, revised metrics, four additional weights. + +# Version 1.104 (2011-11-08) +Merged the distribution again +Autohinted with updated ttfautohint 0.4 (which no longer causes Adobe and iOS problems) +except the Hai and Lig weights which are hinted in FLS 5.1. + +# Version 1.102 (2011-10-28) +Added OpenType Layout features +Ssplit between desktop and web versions +Desktop version: all weights autohinted with FontLab Studio +Web version autohinted with ttfautohint 0.4 except the Hai and Lig weights + +# Version 1.101 (2011-09-30) +Fixed OS/2 table Unicode and codepage entries + +# Version 1.100 (2011-09-12) +Added Polish diacritics to the character set +Weights Hai and Lig autohinted with FontLab Studio +Other weights autohinted with ttfautohint 0.3 + +# Version 1.011 (2010-12-29) +Added the soft hyphen glyph + +# Version 1.010 (2010-12-13) +Initial version released under SIL Open Font License +Western character set + +================ diff --git a/docs/static/lato/index.html b/docs/static/lato/index.html new file mode 100644 index 000000000..909d30084 --- /dev/null +++ b/docs/static/lato/index.html @@ -0,0 +1,11 @@ + + + Lato Font Family + + + + + diff --git a/docs/static/script.js b/docs/static/script.js new file mode 100644 index 000000000..8c4afa851 --- /dev/null +++ b/docs/static/script.js @@ -0,0 +1,137 @@ +"use strict"; + + +if (document.getElementsByTagName("html")[0].classList.contains("single-page")) { + const title = document.body.querySelector(".sidebar .link.title"); + const content = document.getElementsByClassName("content")[0]; + const toc = document.getElementsByClassName("toc")[0]; + const sidebar = document.getElementsByClassName("sidebar")[0]; + + let height = 0; + + const anchors = Array.prototype.reduce.call(document.body.querySelectorAll(".content a"), function(accum, anchor) { + const name = anchor.getAttribute("name"); + if (name && !accum[name]) { + accum[name] = anchor; + } + return accum; + }, { }); + + const sidebarLinks = Array.prototype.map.call(document.body.querySelectorAll(".sidebar .toc .link a"), function(anchor, index) { + const name = anchor.getAttribute("href").substring(1); + const link = anchor.parentNode; + + // If the click, set the class directly, so it doesn't "jump" + anchor.onclick = function() { + const current = document.body.querySelector(".link.selected"); + if (current) { current.classList.remove("selected"); } + + link.classList.add("selected"); + }; + + height += link.offsetHeight; + + // Get the offset in the content of the target + let offset = 0; + anchor = anchors[name]; + if (anchor) { offset = anchor.offsetTop; } + + return { index, link, name, offset }; + }); + sidebarLinks.forEach(function(link, index) { + const next = sidebarLinks[index + 1]; + link.height = (next ? next.offset: content.offsetHeight) - link.offset; + }); + + function getScrollTop(link) { + const maxScrollY = (toc.offsetHeight + 160 - window.innerHeight); + if (link == null) { return maxScrollY; } + + const percentLinks = link.index / sidebarLinks.length; + return percentLinks * maxScrollY; + } + + function getTime() { return (new Date()).getTime(); } + + let scrollPaused = false; + + function highlightToc(scrollVisible, animate) { + // What percent through the content are we? + let percentContent = window.scrollY / (content.offsetHeight - window.innerHeight); + if (percentContent < 0) { + percentContent = 0; + } else if (percentContent > 1) { + percentContent = 1; + } + + // Map to on-screen w/ a smooth gradient from [ 0, content.offsetHeight ] + let y = window.scrollY + window.innerHeight * percentContent; + if (y < 0) { y = 0; } + + // Find the link that is at before location y + let last = null; + for (let i = 0; i < sidebarLinks.length; i++) { + const link = sidebarLinks[i]; + if (link.offset > y) { break; } + last = link; + } + + // If the link is not already selected... + if (!last.link.classList.contains("selected")) { + // ...unselcted the currently seclected link + const current = document.body.querySelector(".link.selected"); + if (current) { current.classList.remove("selected"); } + + // ...select the new link + last.link.classList.add("selected"); + } + + // ...and scroll it to be visible + if (scrollVisible && !scrollPaused) { + const scrollTarget = getScrollTop(last); + const percentFragment = (last.offset - y) / last.height; + const delta = (getScrollTop(sidebarLinks[last.index + 1]) - scrollTarget) * percentFragment; + const scrollTop = scrollTarget - delta; + + if (animate) { + const pi_2 = Math.PI / 2; + const totalDuration = 200; + const shift = scrollTop - sidebar.scrollTop; + const start = getTime(); + const timer = setInterval(function() { + const duration = getTime() - start; + if (duration > totalDuration) { + clearInterval(timer); + sidebar.scrollTop = scrollTop; + return; + } + // linear: 0 -> 1 + let i = duration / totalDuration; + // ease out: 1 -> 0 + i = 1 - Math.sin(i * pi_2); + sidebar.scrollTop = scrollTop - i * shift; + }, 5); + } else { + sidebar.scrollTop = scrollTop; + } + } + } + + sidebar.onmouseenter = function() { + scrollPaused = true; + } + + sidebar.onmouseleave = function() { + scrollPaused = false; + highlightToc(true, true); + } + + // Wehenver we scroll, highlight the TOC + window.onscroll = function() { highlightToc(true); } + + // Poll occassionally to highlight the TOC (but don't auto-scroll) + setInterval(function() { highlightToc(false); }, 1000); + + // Set up the initial TOC highlight + highlightToc(true); +} diff --git a/docs/static/style.css b/docs/static/style.css index ab9c3e06e..8f811545c 100644 --- a/docs/static/style.css +++ b/docs/static/style.css @@ -82,16 +82,35 @@ ul li { line-height: 30px; } +div.code-title { + ddd-border: 1px solid green; + height: 7px; + margin-left: 30px; + margin-top: 10px; + position: relative; +} + +div.code-title div { + ddd-border: 1px solid red; + box-sizing: border-box; + color: #88a; + font-style: italic; + font-size: 18px; + padding-right: 10px; + position: absolute; + text-align: right; + width: 100%; +} + div.code { background: #f8f8ff; border: 2px solid #88a; color: #000; - margin: 20px 0 0 30px; - dddmargin-left: 30px; + margin: 20px 0 30px 30px; padding: 15px 20px; font-family: monospace; font-size: 18px; - white-space: nowrap; + white-space: pre; overflow: scroll; } @@ -220,7 +239,7 @@ div.breadcrumbs span.current { .sidebar .toc .link.title { font-size: 115%; font-weight: bold; - padding: 5px 10px 15px 20px; + padding: 15px 10px 15px 20px; } .sidebar .toc .link.title a { @@ -372,7 +391,7 @@ div.breadcrumbs span.current { font-style: italic; position: absolute; letter-spacing: 0.1ex; - padding-left: 25px; + padding-left: 18px; } .definition { @@ -439,9 +458,10 @@ div.breadcrumbs span.current { code.inline { - background: #eef; + ddd-background: #eef; padding-left: 5px; padding-right: 5px; + white-space: nowrap; } .property { @@ -477,9 +497,14 @@ code.inline { font-style: italic; } +.property .signature .symbol { + padding-left: 4px; + padding-right: 4px; +} + .property .arrow { color: #888; - padding-left: 15px; + padding-left: 10px; padding-right: 5px; } @@ -488,6 +513,52 @@ code.inline { font-style: italic; } +.content table.table { + border-collapse: collapse; + box-sizing: border-box; + margin-top: 20px; + margin-left: 30px; + margin-bottom: 30px; + margin-right: -4px; /* To compensate for the fix column */ +} + +.content table.table.compact { + width: 300px; +} + +.content table.table.wide { + width: 500px; +} + +.content table.table.full { + width: 774px; /* Accomodate the empty end cell to maintain spacing*/ +} + +/* +.content table.table.full tr:nth-child(even) { + background-color: #f8f8f8; +} +*/ +.content table.table td { + border: 2px solid #88a; + color: #444; + padding: 5px 20px; +} + +.content table.table td.fix { + border: none; + padding-left: 0; + padding-right: 0; + width: 0; +} + +.content table td.table-title { + border: none; + color: #777; + font-style: italic; + text-align: center; +} + .content .toc { margin: 20px 0 0 0px; padding: 0px 0 0 48px; @@ -564,3 +635,85 @@ code.inline { .footer .nav.next span { margin-left: 20px; } + + +/* Format-dependent styles */ + +html.single-page div.breadcrumbs { + padding: 10px 0 0 0; +} + +html.single-page h1 { + border-top: none; +} + +html.single-page .page-separator { + border-top: 3px solid #aaa; + margin: 50px 0 10px 15px; + height: 0; +} + +html.single-page .footer { + padding: 0; +} + +html.single-page .sidebar .toc .link a { + color: #fff; +} + +html.single-page .sidebar .toc .link.selected a { + color: #000; +} + +html.single-page .sidebar .toc .link a:hover { + color: #99a; +} + +html.single-page .sidebar .toc .link.depth-2 { + background-color: #334; + padding-left: 30px; +} + +html.single-page .sidebar .toc .link.depth-3 { + background-color: #334; + padding-left: 40px; +} + +html.single-page .sidebar .toc .link.depth-4 { + background-color: #334; + padding-left: 50px; +} + +html.single-page .sidebar .toc .link.depth-5 { + background-color: #334; + padding-left: 60px; +} + +html.single-page .sidebar .toc .link.selected a:hover { + color: #888; +} + +/* +html.single-page .sidebar .toc .link { + dddtransition: background-color 0.3s linear; +} +*/ + +html.single-page .sidebar .toc .link.selected { + dddbackground-color: #aac; + background-color: #282839; +} + +html.single-page .sidebar .toc .link.title.selected { + background-color: #282839; +} + + +html.single-page .sidebar .toc .link.selected a { + ddd-color: #000; + color: #fff; +} + +html.single-page .sidebar .toc .link.title.selected a { + color: #fff; +} diff --git a/docs/testing/README.md b/docs/testing/README.md index 8e37c1fa5..1c046d1f2 100644 --- a/docs/testing/README.md +++ b/docs/testing/README.md @@ -7,10 +7,3 @@ Documentation: [html](https://docs-beta.ethers.io/) Testing ======= - -Here goes info about testing - - - ------ -**Content Hash:** c1d219536dcaf41b026557cf5efabc7f84dfab1cacb8114e0d64e407e7be9916 \ No newline at end of file diff --git a/docs/testing/index.html b/docs/testing/index.html index 0bfbedb58..93c0c95e3 100644 --- a/docs/testing/index.html +++ b/docs/testing/index.html @@ -1,2 +1,31 @@ -Testing

Testing

-

Here goes info about testing

\ No newline at end of file + + + + Testing + + + + +
+ + +

Testing

Here goes info about testing

+ + + + + +
+ + + diff --git a/docs/v5/README.md b/docs/v5/README.md new file mode 100644 index 000000000..cf5753775 --- /dev/null +++ b/docs/v5/README.md @@ -0,0 +1,243 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Documentation +============= + +What is Ethers? +--------------- + +Features +-------- + +Developer Documentation +----------------------- + +* [Getting Started](getting-started) + * [Installing](getting-started) + * [Importing](getting-started) + * [Common Terminology](getting-started) + * [Connecting to Ethereum: Metamask](getting-started) + * [Contracts](getting-started) + * [Signing Messages](getting-started) +* [Ethereum Basics](concepts) + * [Events](concepts/events) + * [Solidity Topics](concepts/events) + * [Logs and Filtering](concepts/events) + * [Gas](concepts/gas) + * [Gas Price](concepts/gas) + * [Gas Limit](concepts/gas) + * [Security](concepts/security) + * [Key Derivation Functions](concepts/security) +* [Application Programming Interface](api) + * [Contract Interaction](api/contract) + * [Contract](api/contract/contract) + * [Creating Instances](api/contract/contract) + * [Properties](api/contract/contract) + * [Methods](api/contract/contract) + * [Events](api/contract/contract) + * [Meta-Class](api/contract/contract) + * [ContractFactory](api/contract/contract-factory) + * [Creating Instances](api/contract/contract-factory) + * [Properties](api/contract/contract-factory) + * [Methods](api/contract/contract-factory) + * [Example: ERC-20 Contract](api/contract/example) + * [Connecting to a Contract](api/contract/example) + * [Properties](api/contract/example) + * [Methods](api/contract/example) + * [Events](api/contract/example) + * [Meta-Class Methods](api/contract/example) + * [Meta-Class Filters](api/contract/example) + * [Signers](api/signer) + * [Signer](api/signer) + * [Wallet](api/signer) + * [VoidSigner](api/signer) + * [ExternallyOwnedAccount](api/signer) + * [Providers](api/providers) + * [Provider](api/providers/provider) + * [Accounts Methods](api/providers/provider) + * [Blocks Methods](api/providers/provider) + * [Ethereum Naming Service (ENS) Methods](api/providers/provider) + * [Logs Methods](api/providers/provider) + * [Network Status Methods](api/providers/provider) + * [Transactions Methods](api/providers/provider) + * [Event Emitter Methods](api/providers/provider) + * [Inspection Methods](api/providers/provider) + * [JsonRpcProvider](api/providers/jsonrpc-provider) + * [JsonRpcSigner](api/providers/jsonrpc-provider) + * [JsonRpcUncheckedSigner](api/providers/jsonrpc-provider) + * [Node-Specific Methods](api/providers/jsonrpc-provider) + * [API Providers](api/providers/api-providers) + * [EtherscanProvider](api/providers/api-providers) + * [InfuraProvider](api/providers/api-providers) + * [AlchemyProvider](api/providers/api-providers) + * [CloudflareProvider](api/providers/api-providers) + * [Other Providers](api/providers/other) + * [FallbackProvider](api/providers/other) + * [IpcProvider](api/providers/other) + * [UrlJsonRpcProvider](api/providers/other) + * [Web3Provider](api/providers/other) + * [Types](api/providers/types) + * [BlockTag](api/providers/types) + * [Network](api/providers/types) + * [Block](api/providers/types) + * [Events and Logs](api/providers/types) + * [Transactions](api/providers/types) + * [Utilities](api/utils) + * [Application Binary Interface](api/utils/abi) + * [Interface](api/utils/abi/interface) + * [Creating Instances](api/utils/abi/interface) + * [Properties](api/utils/abi/interface) + * [Formatting](api/utils/abi/interface) + * [Fragment Access](api/utils/abi/interface) + * [Signature and Topic Hashes](api/utils/abi/interface) + * [Encoding Data](api/utils/abi/interface) + * [Decoding Data](api/utils/abi/interface) + * [Parsing](api/utils/abi/interface) + * [Types](api/utils/abi/interface) + * [Specifying Fragments](api/utils/abi/interface) + * [Fragments](api/utils/abi/fragments) + * [Formats](api/utils/abi/fragments) + * [Fragment](api/utils/abi/fragments) + * [ConstructorFragment](api/utils/abi/fragments) + * [EventFragment](api/utils/abi/fragments) + * [FunctionFragment](api/utils/abi/fragments) + * [ParamType](api/utils/abi/fragments) + * [Addresses](api/utils/address) + * [Address Formats](api/utils/address) + * [Converting and Verifying](api/utils/address) + * [Derivation](api/utils/address) + * [Contracts Addresses](api/utils/address) + * [BigNumber](api/utils/bignumber) + * [Types](api/utils/bignumber) + * [Creating Instances](api/utils/bignumber) + * [Methods](api/utils/bignumber) + * [Notes](api/utils/bignumber) + * [Byte Manipulation](api/utils/bytes) + * [Types](api/utils/bytes) + * [Inspection](api/utils/bytes) + * [Converting between Arrays and Hexstrings](api/utils/bytes) + * [Array Manipulation](api/utils/bytes) + * [Hexstring Manipulation](api/utils/bytes) + * [Signature Conversion](api/utils/bytes) + * [Random Bytes](api/utils/bytes) + * [Constants](api/utils/constants) + * [Bytes](api/utils/constants) + * [Strings](api/utils/constants) + * [BigNumber](api/utils/constants) + * [Display Logic and Input](api/utils/display-logic) + * [Units](api/utils/display-logic) + * [Functions](api/utils/display-logic) + * [Encoding Utilities](api/utils/encoding) + * [Base58](api/utils/encoding) + * [Base64](api/utils/encoding) + * [Recursive-Length Prefix](api/utils/encoding) + * [FixedNumber](api/utils/fixednumber) + * [Creating Instances](api/utils/fixednumber) + * [Properties](api/utils/fixednumber) + * [Methods](api/utils/fixednumber) + * [FixedFormat](api/utils/fixednumber) + * [Hashing Algorithms](api/utils/hashing) + * [Cryptographic Hash Functions](api/utils/hashing) + * [HMAC](api/utils/hashing) + * [Hashing Helpers](api/utils/hashing) + * [Solidity Hashing Algorithms](api/utils/hashing) + * [HD Wallet](api/utils/hdnode) + * [Types](api/utils/hdnode) + * [HDNode](api/utils/hdnode) + * [Other Functions](api/utils/hdnode) + * [Logging](api/utils/logger) + * [Logger](api/utils/logger) + * [Errors](api/utils/logger) + * [Log Levels](api/utils/logger) + * [Property Utilities](api/utils/properties) + * [Signing Key](api/utils/signing-key) + * [Other Functions](api/utils/signing-key) + * [Strings](api/utils/strings) + * [Bytes32String](api/utils/strings) + * [UTF-8 Strings](api/utils/strings) + * [UnicodeNormalizationForm](api/utils/strings) + * [Custom UTF-8 Error Handling](api/utils/strings) + * [Transactions](api/utils/transactions) + * [Types](api/utils/transactions) + * [Functions](api/utils/transactions) + * [Web Utilities](api/utils/web) + * [Wordlists](api/utils/wordlists) + * [Wordlist](api/utils/wordlists) + * [Languages](api/utils/wordlists) + * [Other Libraries](api/other) + * [Assembly](api/other/assembly) + * [Ethers ASM Dialect](api/other/assembly/dialect) + * [Opcodes](api/other/assembly/dialect) + * [Labels](api/other/assembly/dialect) + * [Literals](api/other/assembly/dialect) + * [Comments](api/other/assembly/dialect) + * [Scopes](api/other/assembly/dialect) + * [Data Segment](api/other/assembly/dialect) + * [Links](api/other/assembly/dialect) + * [Stack Placeholders](api/other/assembly/dialect) + * [Evaluation and Excution](api/other/assembly/dialect) + * [Utilities](api/other/assembly/api) + * [Assembler](api/other/assembly/api) + * [Disassembler](api/other/assembly/api) + * [Opcode](api/other/assembly/api) + * [Abstract Syntax Tree](api/other/assembly/ast) + * [Types](api/other/assembly/ast) + * [Nodes](api/other/assembly/ast) + * [Hardware Wallets](api/other/hardware) + * [LedgerSigner](api/other/hardware) + * [Experimental](api/experimental) + * [BrainWallet](api/experimental) + * [EIP1193Bridge](api/experimental) + * [NonceManager](api/experimental) +* [Command Line Interfaces](cli) + * [Sandbox Utility](cli/ethers) + * [Help](cli/ethers) + * [Examples](cli/ethers) + * [Assembler](cli/asm) + * [Help](cli/asm) + * [Example Input Files](cli/asm) + * [Assembler Examples](cli/asm) + * [Disassembler Examples](cli/asm) + * [Ethereum Naming Service](cli/ens) + * [Help](cli/ens) + * [Examples](cli/ens) + * [TypeScript](cli/typescript) + * [Help](cli/typescript) + * [Examples](cli/typescript) + * [Making Your Own](cli/plugin) + * [CLI](cli/plugin) + * [Plugin](cli/plugin) + * [ArgParser](cli/plugin) +* [Cookbook](cookbook) +* [Migration Guide](migration) + * [Migration: From Web3.js](migration/web3) + * [Contracts](migration/web3) + * [Providers](migration/web3) + * [Numbers](migration/web3) + * [Utilities](migration/web3) + * [Migration: From Ethers v4](migration/ethers-v4) + * [BigNumber](migration/ethers-v4) + * [Contracts](migration/ethers-v4) + * [Errors](migration/ethers-v4) + * [Interface](migration/ethers-v4) + * [Utilities](migration/ethers-v4) + * [Wallet](migration/ethers-v4) +* [Testing](testing) +* [Contributing and Hacking](contributing) + * [Building](contributing) +* [Flatworm Docs](documentation) + * [Fragments](documentation) + * [Markdown](documentation) + * [Code](documentation) + * [Tables](documentation) + * [Configuration](documentation) + * [Extensions](documentation) +* [License and Copyright](license) + +Legacy Documentation +-------------------- + diff --git a/docs/v5/api/README.md b/docs/v5/api/README.md new file mode 100644 index 000000000..40e558f17 --- /dev/null +++ b/docs/v5/api/README.md @@ -0,0 +1,170 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Application Programming Interface +================================= + +* [Contract Interaction](contract) + * [Contract](contract/contract) + * [Creating Instances](contract/contract) + * [Properties](contract/contract) + * [Methods](contract/contract) + * [Events](contract/contract) + * [Meta-Class](contract/contract) + * [ContractFactory](contract/contract-factory) + * [Creating Instances](contract/contract-factory) + * [Properties](contract/contract-factory) + * [Methods](contract/contract-factory) + * [Example: ERC-20 Contract](contract/example) + * [Connecting to a Contract](contract/example) + * [Properties](contract/example) + * [Methods](contract/example) + * [Events](contract/example) + * [Meta-Class Methods](contract/example) + * [Meta-Class Filters](contract/example) +* [Signers](signer) + * [Signer](signer) + * [Wallet](signer) + * [VoidSigner](signer) + * [ExternallyOwnedAccount](signer) +* [Providers](providers) + * [Provider](providers/provider) + * [Accounts Methods](providers/provider) + * [Blocks Methods](providers/provider) + * [Ethereum Naming Service (ENS) Methods](providers/provider) + * [Logs Methods](providers/provider) + * [Network Status Methods](providers/provider) + * [Transactions Methods](providers/provider) + * [Event Emitter Methods](providers/provider) + * [Inspection Methods](providers/provider) + * [JsonRpcProvider](providers/jsonrpc-provider) + * [JsonRpcSigner](providers/jsonrpc-provider) + * [JsonRpcUncheckedSigner](providers/jsonrpc-provider) + * [Node-Specific Methods](providers/jsonrpc-provider) + * [API Providers](providers/api-providers) + * [EtherscanProvider](providers/api-providers) + * [InfuraProvider](providers/api-providers) + * [AlchemyProvider](providers/api-providers) + * [CloudflareProvider](providers/api-providers) + * [Other Providers](providers/other) + * [FallbackProvider](providers/other) + * [IpcProvider](providers/other) + * [UrlJsonRpcProvider](providers/other) + * [Web3Provider](providers/other) + * [Types](providers/types) + * [BlockTag](providers/types) + * [Network](providers/types) + * [Block](providers/types) + * [Events and Logs](providers/types) + * [Transactions](providers/types) +* [Utilities](utils) + * [Application Binary Interface](utils/abi) + * [Interface](utils/abi/interface) + * [Creating Instances](utils/abi/interface) + * [Properties](utils/abi/interface) + * [Formatting](utils/abi/interface) + * [Fragment Access](utils/abi/interface) + * [Signature and Topic Hashes](utils/abi/interface) + * [Encoding Data](utils/abi/interface) + * [Decoding Data](utils/abi/interface) + * [Parsing](utils/abi/interface) + * [Types](utils/abi/interface) + * [Specifying Fragments](utils/abi/interface) + * [Fragments](utils/abi/fragments) + * [Formats](utils/abi/fragments) + * [Fragment](utils/abi/fragments) + * [ConstructorFragment](utils/abi/fragments) + * [EventFragment](utils/abi/fragments) + * [FunctionFragment](utils/abi/fragments) + * [ParamType](utils/abi/fragments) + * [Addresses](utils/address) + * [Address Formats](utils/address) + * [Converting and Verifying](utils/address) + * [Derivation](utils/address) + * [Contracts Addresses](utils/address) + * [BigNumber](utils/bignumber) + * [Types](utils/bignumber) + * [Creating Instances](utils/bignumber) + * [Methods](utils/bignumber) + * [Notes](utils/bignumber) + * [Byte Manipulation](utils/bytes) + * [Types](utils/bytes) + * [Inspection](utils/bytes) + * [Converting between Arrays and Hexstrings](utils/bytes) + * [Array Manipulation](utils/bytes) + * [Hexstring Manipulation](utils/bytes) + * [Signature Conversion](utils/bytes) + * [Random Bytes](utils/bytes) + * [Constants](utils/constants) + * [Bytes](utils/constants) + * [Strings](utils/constants) + * [BigNumber](utils/constants) + * [Display Logic and Input](utils/display-logic) + * [Units](utils/display-logic) + * [Functions](utils/display-logic) + * [Encoding Utilities](utils/encoding) + * [Base58](utils/encoding) + * [Base64](utils/encoding) + * [Recursive-Length Prefix](utils/encoding) + * [FixedNumber](utils/fixednumber) + * [Creating Instances](utils/fixednumber) + * [Properties](utils/fixednumber) + * [Methods](utils/fixednumber) + * [FixedFormat](utils/fixednumber) + * [Hashing Algorithms](utils/hashing) + * [Cryptographic Hash Functions](utils/hashing) + * [HMAC](utils/hashing) + * [Hashing Helpers](utils/hashing) + * [Solidity Hashing Algorithms](utils/hashing) + * [HD Wallet](utils/hdnode) + * [Types](utils/hdnode) + * [HDNode](utils/hdnode) + * [Other Functions](utils/hdnode) + * [Logging](utils/logger) + * [Logger](utils/logger) + * [Errors](utils/logger) + * [Log Levels](utils/logger) + * [Property Utilities](utils/properties) + * [Signing Key](utils/signing-key) + * [Other Functions](utils/signing-key) + * [Strings](utils/strings) + * [Bytes32String](utils/strings) + * [UTF-8 Strings](utils/strings) + * [UnicodeNormalizationForm](utils/strings) + * [Custom UTF-8 Error Handling](utils/strings) + * [Transactions](utils/transactions) + * [Types](utils/transactions) + * [Functions](utils/transactions) + * [Web Utilities](utils/web) + * [Wordlists](utils/wordlists) + * [Wordlist](utils/wordlists) + * [Languages](utils/wordlists) +* [Other Libraries](other) + * [Assembly](other/assembly) + * [Ethers ASM Dialect](other/assembly/dialect) + * [Opcodes](other/assembly/dialect) + * [Labels](other/assembly/dialect) + * [Literals](other/assembly/dialect) + * [Comments](other/assembly/dialect) + * [Scopes](other/assembly/dialect) + * [Data Segment](other/assembly/dialect) + * [Links](other/assembly/dialect) + * [Stack Placeholders](other/assembly/dialect) + * [Evaluation and Excution](other/assembly/dialect) + * [Utilities](other/assembly/api) + * [Assembler](other/assembly/api) + * [Disassembler](other/assembly/api) + * [Opcode](other/assembly/api) + * [Abstract Syntax Tree](other/assembly/ast) + * [Types](other/assembly/ast) + * [Nodes](other/assembly/ast) + * [Hardware Wallets](other/hardware) + * [LedgerSigner](other/hardware) +* [Experimental](experimental) + * [BrainWallet](experimental) + * [EIP1193Bridge](experimental) + * [NonceManager](experimental) + diff --git a/docs/v5/api/contract/README.md b/docs/v5/api/contract/README.md new file mode 100644 index 000000000..a15b57542 --- /dev/null +++ b/docs/v5/api/contract/README.md @@ -0,0 +1,27 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Contract Interaction +==================== + +* [Contract](contract) + * [Creating Instances](contract) + * [Properties](contract) + * [Methods](contract) + * [Events](contract) + * [Meta-Class](contract) +* [ContractFactory](contract-factory) + * [Creating Instances](contract-factory) + * [Properties](contract-factory) + * [Methods](contract-factory) +* [Example: ERC-20 Contract](example) + * [Connecting to a Contract](example) + * [Properties](example) + * [Methods](example) + * [Events](example) + * [Meta-Class Methods](example) + * [Meta-Class Filters](example) + diff --git a/docs/v5/api/contract/contract-factory/README.md b/docs/v5/api/contract/contract-factory/README.md new file mode 100644 index 000000000..a1104535b --- /dev/null +++ b/docs/v5/api/contract/contract-factory/README.md @@ -0,0 +1,93 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +ContractFactory +=============== + +Creating Instances +------------------ + +#### **new ***ethers* . **ContractFactory**( interface , bydecode [ , signer ] ) + + + +#### *ContractFactory* . **fromSolidity**( compilerOutput [ , signer ] ) => *[ContractFactory](/v5/api/contract/contract-factory/)* + + + +#### *contractFactory* . **connect**( signer ) => *[Contract](/v5/api/contract/contract/)* + + + +Properties +---------- + +#### *contractFactory* . **interface** => *[Interface](/v5/api/utils/abi/interface/)* + + + +#### *contractFactory* . **bytecode** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + + + +#### *contractFactory* . **signer** => *[Signer](/v5/api/signer/#Signer)* + + + +Methods +------- + +#### *contractFactory* . **attach**( address ) => *[Contract](/v5/api/contract/contract/)* + +Return an instance of a [Contract](/v5/api/contract/contract/) attched to *address*. This is the same as using the [Contract constructor](/v5/api/contract/contract/#contract--creating) with *address* and this the the *interface* and *signerOrProvider* passed in when creating the ContractFactory. + + +#### *contractFactory* . **getDeployTransaction**( ...args ) => *[UnsignedTransaction](/v5/api/utils/transactions/#UnsignedTransaction)* + +Returns the unsigned transaction which would deploy this Contract with *args* passed to the Contract's constructor. + + +#### *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. + +The transction can be found at `contract.deployTransaction`, and no interactions should be made until the transaction is mined. + + +``` +// +const signer = ethers.LocalSigner(); +const ContractFactory = ethers.ContractFactory; +// + +// If your contract constructor requires parameters, the ABI +// must include the constructor +const abi = [ + "constructor(address owner, uint256 initialValue)" +]; + +const factory = new ContractFactory(abi, bytecode, signer) + +const contract = await factory.deploy("ricmoo.eth", 42); + +// The address is available immediately, but the contract +// is NOT deployed yet +contract.address +//! + +// The transaction that the signer sent to deploy +contract.deployTransaction +//! + +// Wait until the transaction is mined +contract.deployTransaction.wait() +//! + +// Now the contract is safe to ineract with +contract.value() +//! +``` + diff --git a/docs/v5/api/contract/contract-factory/index.html b/docs/v5/api/contract/contract-factory/index.html new file mode 100644 index 000000000..4f25ff14a --- /dev/null +++ b/docs/v5/api/contract/contract-factory/index.html @@ -0,0 +1,77 @@ + + + + ContractFactory + + + + +
+ + +

ContractFactory

+

Creating Instances

+
new ethers.ContractFactory( interface , bydecode [ , signer ] )
+
ContractFactory.fromSolidity( compilerOutput [ , signer ] ) ContractFactory
+
contractFactory.connect( signer ) Contract
+

Properties

+
contractFactory.interface Interface
+
contractFactory.bytecode string< DataHexString >
+
contractFactory.signer Signer
+

Methods

+
contractFactory.attach( address ) Contract

Return an instance of a Contract attched to address. This is the same as using the Contract constructor with address and this the the interface and signerOrProvider passed in when creating the ContractFactory.

+ +
contractFactory.getDeployTransaction( ...args ) UnsignedTransaction

Returns the unsigned transaction which would deploy this Contract with args passed to the Contract's constructor.

+ +
contractFactory.deploy( ...args ) Promise< 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.

+ +

The transction can be found at contract.deployTransaction, and no interactions should be made until the transaction is mined.

+ +
Deploying a Contract
// <hide> +const signer = ethers.LocalSigner(); +const ContractFactory = ethers.ContractFactory; +// </hide> + +// If your contract constructor requires parameters, the ABI +// must include the constructor +const abi = [ + "constructor(address owner, uint256 initialValue)" +]; + +const factory = new ContractFactory(abi, bytecode, signer) + +const contract = await factory.deploy("ricmoo.eth", 42); + +// The address is available immediately, but the contract +// is NOT deployed yet +contract.address +//! + +// The transaction that the signer sent to deploy +contract.deployTransaction +//! + +// Wait until the transaction is mined +contract.deployTransaction.wait() +//! + +// Now the contract is safe to ineract with +contract.value() +//!
+ + + +
+ + + diff --git a/docs/v5/api/contract/contract/README.md b/docs/v5/api/contract/contract/README.md new file mode 100644 index 000000000..073277db7 --- /dev/null +++ b/docs/v5/api/contract/contract/README.md @@ -0,0 +1,176 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Contract +======== + +Creating Instances +------------------ + +#### **new ***ethers* . **Contract**( address , abi , signerOrProvider ) + + + +#### *contract* . **attach**( addressOrName ) => *[Contract](/v5/api/contract/contract/)* + +Returns a new instance of the **Contract** attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them. + + +#### *contract* . **connect**( providerOrSigner ) => *[Contract](/v5/api/contract/contract/)* + +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. + + +Properties +---------- + +#### *contract* . **address** => *string< [Address](/v5/api/utils/address/#address) >* + +This is the address (or ENS name) the contract was constructed with. + + +#### *contract* . **resolvedAddress** => *string< [Address](/v5/api/utils/address/#address) >* + +This is a promise that will resolve to the address the **Contract** object is attached to. If an [Address](/v5/api/utils/address/#address) was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address. + + +#### *contract* . **deployTransaction** => *[TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse)* + +If the **Contract** object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract. + + +#### *contract* . **interface** => *[Interface](/v5/api/utils/abi/interface/)* + +This is the ABI as an [Interface](/v5/api/utils/abi/interface/). + + +#### *contract* . **provider** => *[Provider](/v5/api/providers/provider/)* + +If a provider was provided to the constructor, this is that provider. If a signer was provided that had a [Provider](/v5/api/providers/provider/), this is that provider. + + +#### *contract* . **signer** => *[Signer](/v5/api/signer/#Signer)* + +If a signer was provided to the constructor, this is that signer. + + +Methods +------- + +#### *contract* . **deployed**( ) => *Promise< [Contract](/v5/api/contract/contract/) >* + + + +#### *Contract* . **isIndexed**( value ) => *boolean* + + + +Events +------ + +#### *contract* . **queryFilter**( event [ , fromBlockOrBlockHash [ , toBlock ] ) => *Promise< Array< Event > >* + +Return Events that match the *event*. + + +#### *contract* . **listenerCount**( [ event ] ) => *number* + +Return the number of listeners that are subscribed to *event*. If no event is provided, returns the total count of all events. + + +#### *contract* . **listeners**( event ) => *Array< Listener >* + +Return a list of listeners that are subscribed to *event*. + + +#### *contract* . **off**( event , listener ) => *this* + +Unsubscribe *listener* to *event*. + + +#### *contract* . **on**( event , listener ) => *this* + +Subscribe to *event* calling *listener* when the event occurs. + + +#### *contract* . **once**( event , listener ) => *this* + +Subscribe once to *event* calling *listener* when the event occurs. + + +#### *contract* . **removeAllListeners**( [ event ] ) => *this* + +Unsubscribe all listeners for *event*. If no event is provided, all events are unsubscribed. + + +Meta-Class +---------- + +### Read-Only Methods (constant) + +#### *contract* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< any >* + +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 bytes (both fixed length and dynamic), a [DataHexString](/v5/api/utils/bytes/#DataHexString) is returned. + + +#### *contract* . *functions* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< [Result](/v5/api/utils/abi/interface/#Result) >* + +The result will always be a [Result](/v5/api/utils/abi/interface/#Result), even if there is only a single return value type. + +This simplifies frameworks which wish to use the [Contract](/v5/api/contract/contract/) object, since they do not need to inspect the return types to unwrap simplified functions. + +Another use for this method is for error recovery. For example, if a function result is an invalid UTF-8 string, the normal call using the above meta-class function will throw an exception. This allows using the Result access error to access the low-level bytes and reason for the error allowing an alternate UTF-8 error strategy to be used. + +Most developers should not require this. + + +### Write Methods (non-constant) + +#### *contract* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< [TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse) >* + +Returns a [TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse) for the transaction after it is sent to the network. This requires the **Contract** has a signer. + + +### Write Methods Analysis + +#### *contract* . *estimateGas* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +Returns the estimate units of gas that would be required to execute the *METHOD_NAME* with *args* and *overrides*. + + +#### *contract* . *populateTransaction* . **METHOD_NAME**( ...args [ , overrides ] ) => *Promise< [UnsignedTx](/v5/api/utils/transactions/#UnsignedTransaction) >* + +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 >* + +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 otherwise functions the same as a [Read-Only Method](/v5/api/contract/contract/#contract--readonly). + + +### Event Filters + +#### *contract* . *filters* . **EVENT_NAME**( ...args ) => *Filter* + +Return a filter for *EVENT_NAME*, optionally filtering by additional constraints. + +Only `indexed` event parameters may be filtered. If a parameter is null (or not provided) then any value in that field matches. + + diff --git a/docs/v5/api/contract/contract/index.html b/docs/v5/api/contract/contract/index.html new file mode 100644 index 000000000..86695587d --- /dev/null +++ b/docs/v5/api/contract/contract/index.html @@ -0,0 +1,116 @@ + + + + Contract + + + + +
+ + +

Contract

Explain contract here...

+ +

Creating Instances

+
new ethers.Contract( address , abi , signerOrProvider )
+
contract.attach( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

+ +
contract.connect( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

+ +

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 will act on behalf of that signer.

+ +

Properties

+
contract.address string< Address >

This is the address (or ENS name) the contract was constructed with.

+ +
contract.resolvedAddress string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

+ +
contract.deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

+ +
contract.interface Interface

This is the ABI as an Interface.

+ +
contract.provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

+ +
contract.signer Signer

If a signer was provided to the constructor, this is that signer.

+ +

Methods

+
contract.deployed( ) Promise< Contract >
+
Contract.isIndexed( value ) boolean
+

Events

+
contract.queryFilter( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

+ +
contract.listenerCount( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

+ +
contract.listeners( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

+ +
contract.off( event , listener ) this

Unsubscribe listener to event.

+ +
contract.on( event , listener ) this

Subscribe to event calling listener when the event occurs.

+ +
contract.once( event , listener ) this

Subscribe once to event calling listener when the event occurs.

+ +
contract.removeAllListeners( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

+ +

Meta-Class

A Meta-Class is a Class which has any of its properties determined at run-time. The Contract object uses a Contract's ABI to determine what methods are available, so the following sections describe the generic ways to interact with the properties added at run-time during the Contract constructor.

+ +

Read-Only Methods (constant)

A constant method is read-only and evaluates a small amount of EVM code against the current blockchain state and can be computed by asking a single node, which can return a result. It is therefore free and does not require any ether, but cannot make changes to the blockchain state..

+ +
contract.METHOD_NAME( ...args [ , overrides ] ) Promise< any >

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 is returned.

+ +

For bytes (both fixed length and dynamic), a DataHexString is returned.

+ +
contract.functions.METHOD_NAME( ...args [ , overrides ] ) Promise< Result >

The result will always be a Result, even if there is only a single return value type.

+ +

This simplifies frameworks which wish to use the Contract object, since they do not need to inspect the return types to unwrap simplified functions.

+ +

Another use for this method is for error recovery. For example, if a function result is an invalid UTF-8 string, the normal call using the above meta-class function will throw an exception. This allows using the Result access error to access the low-level bytes and reason for the error allowing an alternate UTF-8 error strategy to be used.

+ +

Most developers should not require this.

+ +

Write Methods (non-constant)

A non-constant method requires a transaction to be signed and requires payment in the form of a fee to be paid to a miner. This transaction will be verified by every node on the entire network as well by the miner who will compute the new state of the blockchain after executing it against the current state.

+ +

It cannot return a result. If a result is required, it should be logged using a Solidity event (or EVM log), which can then be queried from the transaction receipt.

+ +
contract.METHOD_NAME( ...args [ , overrides ] ) Promise< TransactionResponse >

Returns a TransactionResponse for the transaction after it is sent to the network. This requires the Contract has a signer.

+ +

Write Methods Analysis

There are secveral options to analyze properties and results of a write method without actually executing it.

+ +
contract.estimateGas.METHOD_NAME( ...args [ , overrides ] ) Promise< BigNumber >

Returns the estimate units of gas that would be required to execute the METHOD_NAME with args and overrides.

+ +
contract.populateTransaction.METHOD_NAME( ...args [ , overrides ] ) Promise< UnsignedTx >

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.

+ +
contract.staticCall.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 otherwise functions the same as a Read-Only Method.

+ +

Event Filters

An event filter is made up of topics, which are values logged in a Bloom Filter, allowing efficient searching for entries which match a filter.

+ +
contract.filters.EVENT_NAME( ...args ) Filter

Return a filter for EVENT_NAME, optionally filtering by additional constraints.

+ +

Only indexed event parameters may be filtered. If a parameter is null (or not provided) then any value in that field matches.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/contract/example/README.md b/docs/v5/api/contract/example/README.md new file mode 100644 index 000000000..7f9da9086 --- /dev/null +++ b/docs/v5/api/contract/example/README.md @@ -0,0 +1,208 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Example: ERC-20 Contract +======================== + +Connecting to a Contract +------------------------ + +```javascript +// A Human-Readable ABI; any supported ABI format could be used +const abi = [ + // Read-Only Functions + "function balanceOf(address owner) view returns (uint256)", + "function decimals() view returns (uint8)", + "function symbol() view returns (string)", + + // Authenticated Functions + "function transfer(address to, uint amount) returns (boolean)", + + // Events + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// This can be an address or an ENS name +const address = "dai.tokens.ethers.eth"; + +// An example Provider +const provider = ethers.getDefaultProvider(); + +// An example Signer +const signer = ethers.Wallet.createRandom().connect(provider); + +// Read-Only; By connecting to a Provider, allows: +// - Any constant function +// - Querying Filters +// - Populating Unsigned Transactions for non-constant methods +// - Estimating Gas for non-constant (as an anonymous sender) +// - Static Calling non-constant methods (as anonymous sender) +const erc20 = new ethers.Contract(address, abi, provider); + +// Read-Write; By connecting to a Signer, allows: +// - Everything from Read-Only (except as Signer, not anonymous) +// - Sending transactions for non-constant functions +const erc20_rw = new ethers.Contract(address, abi, signer) +``` + +### ERC20Contract + +#### **new ***ethers* . **Contract**( address , abi , providerOrSigner ) + +See the above code example for creating an Instance which will (in addition to the Contact methods and properties) automatically add the additional properties defined in *abi* to a **Contract** connected to *address* using the *providerOrSigner*. + + +Properties +---------- + +#### *erc20* . **address** => *string< [Address](/v5/api/utils/address/#address) >* + +This is the address (or ENS name) the contract was constructed with. + + +#### *erc20* . **resolvedAddress** => *string< [Address](/v5/api/utils/address/#address) >* + +This is a promise that will resolve to the address the **Contract** object is attached to. If an [Address](/v5/api/utils/address/#address) was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address. + + +#### *erc20* . **deployTransaction** => *[TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse)* + +If the **Contract** object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract. + + +#### *erc20* . **interface** => *[Interface](/v5/api/utils/abi/interface/)* + +This is the ABI as an [Interface](/v5/api/utils/abi/interface/). + + +#### *erc20* . **provider** => *[Provider](/v5/api/providers/provider/)* + +If a provider was provided to the constructor, this is that provider. If a signer was provided that had a [Provider](/v5/api/providers/provider/), this is that provider. + + +#### *erc20* . **signer** => *[Signer](/v5/api/signer/#Signer)* + +If a signer was provided to the constructor, this is that signer. + + +Methods +------- + +#### *erc20* . **attach**( addressOrName ) => *[Contract](/v5/api/contract/contract/)* + +Returns a new instance of the **Contract** attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them. + + +#### *erc20* . **connect**( providerOrSigner ) => *[Contract](/v5/api/contract/contract/)* + +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. + + +#### *erc20* . **deployed**( ) => *Promise< Contract >* + + + +#### *Contract* . **isIndexed**( value ) => *boolean* + + + +Events +------ + +#### *erc20* . **queryFilter**( event [ , fromBlockOrBlockHash [ , toBlock ] ) => *Promise< Array< Event > >* + +Return Events that match the *event*. + + +#### *erc20* . **listenerCount**( [ event ] ) => *number* + +Return the number of listeners that are subscribed to *event*. If no event is provided, returns the total count of all events. + + +#### *erc20* . **listeners**( event ) => *Array< Listener >* + +Return a list of listeners that are subscribed to *event*. + + +#### *erc20* . **off**( event , listener ) => *this* + +Unsubscribe *listener* to *event*. + + +#### *erc20* . **on**( event , listener ) => *this* + +Subscribe to *event* calling *listener* when the event occurs. + + +#### *erc20* . **once**( event , listener ) => *this* + +Subscribe once to *event* calling *listener* when the event occurs. + + +#### *erc20* . **removeAllListeners**( [ event ] ) => *this* + +Unsubscribe all listeners for *event*. If no event is provided, all events are unsubscribed. + + +Meta-Class Methods +------------------ + +#### *erc20* . **decimals**( [ overrides ] ) => *Promise< number >* + +Returns the number of decimal places used by this ERC-20 token. This can be used with [parseUnits](/v5/api/utils/display-logic/#utils-parseUnits) when taking input from the user or [formatUnits](utils-formatunits] when displaying the token amounts in the UI. + + +#### *erc20* . **getBalance**( owner [ , overrides ] ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +Returns the balance of *owner* for this ERC-20 token. + + +#### *erc20* . **symbol**( [ overrides ] ) => *Promise< string >* + +Returns the symbol of the token. + + +#### *erc20_rw* . **transfer**( target , amount [ , overrides ] ) => *Promise< [TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse) >* + +Transfers *amount* tokens to *target* from the current signer. The return value (a boolean) is inaccessible during a write operation using a transaction. Other techniques (such as events) are required if this value is required. On-chain contracts calling the `transfer` function have access to this result, which is why it is possible. + + +#### *erc20* . *callStatic* . **transfer**( target , amount [ , overrides ] ) => *Promise< boolean >* + +Performs a dry-run of transferring *amount* tokens to *target* from the current signer, without actually signing or sending a transaction. + +This can be used to preflight check that a transaction will be successful. + + +#### *erc20* . *estimateGas* . **transfer**( target , amount [ , overrides ] ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +Returns an estimate for how many units of gas would be required to transfer *amount* tokens to *target*. + + +#### *erc20* . *populateTransaction* . **transfer**( target , amount [ , overrides ] ) => *Promise< [UnsignedTx](/v5/api/utils/transactions/#UnsignedTransaction) >* + +Returns an [UnsignedTransaction](/v5/api/utils/transactions/#UnsignedTransaction) which could be signed and submitted to the network to transaction *amount* tokens to *target*. + + +#### Note on Estimating and Static Calling + +When you perform a static call, the current state is taken into account as best as Ethereum can determine. There are many cases where this can provide false positives and false negatives. The eventually consistent model of the blockchain also means there are certain consistency modes that cannot be known until an actual transaction is attempted. + + +Meta-Class Filters +------------------ + +#### *erc20* . *filters* . **Transafer**( [ fromAddress [ , toAddress ] ] ) => *Filter* + +Returns a new Filter which can be used to [query](/v5/api/contract/example/#erc20-queryfilter) or to [subscribe/unsubscribe to events](/v5/api/contract/example/#erc20-events). + +If *fromAddress* is null or not provided, then any from address matches. If *toAddress* is null or not provided, then any to address matches. + + diff --git a/docs/v5/api/contract/example/index.html b/docs/v5/api/contract/example/index.html new file mode 100644 index 000000000..946829ce8 --- /dev/null +++ b/docs/v5/api/contract/example/index.html @@ -0,0 +1,133 @@ + + + + Example: ERC-20 Contract + + + + +
+ + +

Example: ERC-20 Contract

+

Connecting to a Contract

+
A simple ERC-20 contract
// A Human-Readable ABI; any supported ABI format could be used +const abi = [ + // Read-Only Functions + "function balanceOf(address owner) view returns (uint256)", + "function decimals() view returns (uint8)", + "function symbol() view returns (string)", + + // Authenticated Functions + "function transfer(address to, uint amount) returns (boolean)", + + // Events + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// This can be an address or an ENS name +const address = "dai.tokens.ethers.eth"; + +// An example Provider +const provider = ethers.getDefaultProvider(); + +// An example Signer +const signer = ethers.Wallet.createRandom().connect(provider); + +// Read-Only; By connecting to a Provider, allows: +// - Any constant function +// - Querying Filters +// - Populating Unsigned Transactions for non-constant methods +// - Estimating Gas for non-constant (as an anonymous sender) +// - Static Calling non-constant methods (as anonymous sender) +const erc20 = new ethers.Contract(address, abi, provider); + +// Read-Write; By connecting to a Signer, allows: +// - Everything from Read-Only (except as Signer, not anonymous) +// - Sending transactions for non-constant functions +const erc20_rw = new ethers.Contract(address, abi, signer)

ERC20Contract inherits Contract

+
new ethers.Contract( address , abi , providerOrSigner )

See the above code example for creating an Instance which will (in addition to the Contact methods and properties) automatically add the additional properties defined in abi to a Contract connected to address using the providerOrSigner.

+ +

Properties(inheritted from Contract)

+
erc20.address string< Address >

This is the address (or ENS name) the contract was constructed with.

+ +
erc20.resolvedAddress string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

+ +
erc20.deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

+ +
erc20.interface Interface

This is the ABI as an Interface.

+ +
erc20.provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

+ +
erc20.signer Signer

If a signer was provided to the constructor, this is that signer.

+ +

Methods(inheritted from Contract)

+
erc20.attach( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

+ +
erc20.connect( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

+ +

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 will act on behalf of that signer.

+ +
erc20.deployed( ) Promise< Contract >
+
Contract.isIndexed( value ) boolean
+

Events(inheritted from Contract)

+
erc20.queryFilter( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

+ +
erc20.listenerCount( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

+ +
erc20.listeners( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

+ +
erc20.off( event , listener ) this

Unsubscribe listener to event.

+ +
erc20.on( event , listener ) this

Subscribe to event calling listener when the event occurs.

+ +
erc20.once( event , listener ) this

Subscribe once to event calling listener when the event occurs.

+ +
erc20.removeAllListeners( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

+ +

Meta-Class Methods(added at Runtime)

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

+ +
erc20.decimals( [ overrides ] ) Promise< number >

Returns the number of decimal places used by this ERC-20 token. This can be used with parseUnits when taking input from the user or [formatUnits](utils-formatunits] when displaying the token amounts in the UI.

+ +
erc20.getBalance( owner [ , overrides ] ) Promise< BigNumber >

Returns the balance of owner for this ERC-20 token.

+ +
erc20.symbol( [ overrides ] ) Promise< string >

Returns the symbol of the token.

+ +
erc20_rw.transfer( target , amount [ , overrides ] ) Promise< TransactionResponse >

Transfers amount tokens to target from the current signer. The return value (a boolean) is inaccessible during a write operation using a transaction. Other techniques (such as events) are required if this value is required. On-chain contracts calling the transfer function have access to this result, which is why it is possible.

+ +
erc20.callStatic.transfer( target , amount [ , overrides ] ) Promise< boolean >

Performs a dry-run of transferring amount tokens to target from the current signer, without actually signing or sending a transaction.

+ +

This can be used to preflight check that a transaction will be successful.

+ +
erc20.estimateGas.transfer( target , amount [ , overrides ] ) Promise< BigNumber >

Returns an estimate for how many units of gas would be required to transfer amount tokens to target.

+ +
erc20.populateTransaction.transfer( target , amount [ , overrides ] ) Promise< UnsignedTx >

Returns an UnsignedTransaction which could be signed and submitted to the network to transaction amount tokens to target.

+ +
Note on Estimating and Static Calling

When you perform a static call, the current state is taken into account as best as Ethereum can determine. There are many cases where this can provide false positives and false negatives. The eventually consistent model of the blockchain also means there are certain consistency modes that cannot be known until an actual transaction is attempted.

+ +

Meta-Class Filters(added at Runtime)

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

+ +
erc20.filters.Transafer( [ fromAddress [ , toAddress ] ] ) Filter

Returns a new Filter which can be used to query or to subscribe/unsubscribe to events.

+ +

If fromAddress is null or not provided, then any from address matches. If toAddress is null or not provided, then any to address matches.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/contract/index.html b/docs/v5/api/contract/index.html new file mode 100644 index 000000000..29d86330c --- /dev/null +++ b/docs/v5/api/contract/index.html @@ -0,0 +1,33 @@ + + + + Contract Interaction + + + + +
+ + +

Contract Interaction

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 deserialize their results and emitted logs.

+ +

A ContractFactory is an abstraction a contract's bytecode and facilitates deploying a contract.

+ + + + + +
+ + + diff --git a/docs/v5/api/experimental/README.md b/docs/v5/api/experimental/README.md new file mode 100644 index 000000000..0eb4ddd94 --- /dev/null +++ b/docs/v5/api/experimental/README.md @@ -0,0 +1,57 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Experimental +============ + +BrainWallet +----------- + +#### *BrainWallet* . **generate**( username , password [ , progressCallback ] ) => *[BrainWallet](/v5/api/experimental/#experimental-brainwallet)* + +Generates a brain wallet, with a slightly improved experience, in which the generated wallet has a mnemonic. + + +#### *BrainWallet* . **generateLegacy**( username , password [ , progressCallback ] ) => *[BrainWallet](/v5/api/experimental/#experimental-brainwallet)* + +Generate a brain wallet which is compatibile with the ethers v3 and earlier. + + +EIP1193Bridge +------------- + +NonceManager +------------ + +#### **new ****NonceManager**( signer ) + +Create a new NonceManager. + + +#### *nonceManager* . **signer** => *[Signer](/v5/api/signer/#Signer)* + +The signer whose nonce is being managed. + + +#### *nonceManager* . **provider** => *[Provider](/v5/api/providers/provider/)* + +The provider associated with the signer. + + +#### *nonceManager* . **setTransactionCount**( count ) => *void* + +Set the current transaction count (nonce) for the signer. + +This may be useful it interacting with the signer outside of using this class. + + +#### *nonceManager* . **increaseTransactionCount**( [ count = 1 ] ) => *void* + +Bump the current transaction count (nonce) by *count*. + +This may be useful it interacting with the signer outside of using this class. + + diff --git a/docs/v5/api/experimental/index.html b/docs/v5/api/experimental/index.html new file mode 100644 index 000000000..591ff857a --- /dev/null +++ b/docs/v5/api/experimental/index.html @@ -0,0 +1,61 @@ + + + + Experimental + + + + +
+ + +

Experimental

The Experimental package is used for features that are not ready to be included in the base library. The API should not be considered stable and does not follow semver versioning, so applications requiring it should specify the exact version needed.

+ +

BrainWallet inherits Wallet

Ethers removed support for BrainWallets in v4, since they are unsafe and many can be easily guessed, allowing attackers to steal the funds. This class is offered to ensure older systems which used brain wallets can still recover their funds and assets.

+ +
BrainWallet.generate( username , password [ , progressCallback ] ) BrainWallet

Generates a brain wallet, with a slightly improved experience, in which the generated wallet has a mnemonic.

+ +
BrainWallet.generateLegacy( username , password [ , progressCallback ] ) BrainWallet

Generate a brain wallet which is compatibile with the ethers v3 and earlier.

+ +

EIP1193Bridge inherits EventEmitter

The EIP1193Bridge allows a normal Ethers Signer and Provider to be exposed in as a standard EIP-1193 Provider, which may be useful when interacting with other libraries.

+ +

NonceManager inherits Signer

The NonceManager is designed to manage the nonce for a Signer, automatically increasing it as it sends transactions.

+ +

Currently the NonceManager does not handle re-broadcast. If you attempt to send a lot of transactions to the network on a node that does not control that account, the transaction pool may drop your transactions.

+ +

In the future, it'd be nice if the NonceManager remembered transactions and watched for them on the network, rebroadcasting transactions that appear to have been dropped.

+ +

Another future feature will be some sort of failure mode. For example, often a transaction is dependent on another transaction being mined first.

+ +
new NonceManager( signer )

Create a new NonceManager.

+ +
nonceManager.signer Signer

The signer whose nonce is being managed.

+ +
nonceManager.provider Provider

The provider associated with the signer.

+ +
nonceManager.setTransactionCount( count ) void

Set the current transaction count (nonce) for the signer.

+ +

This may be useful it interacting with the signer outside of using this class.

+ +
nonceManager.increaseTransactionCount( [ count = 1 ] ) void

Bump the current transaction count (nonce) by count.

+ +

This may be useful it interacting with the signer outside of using this class.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/index.html b/docs/v5/api/index.html new file mode 100644 index 000000000..548bb8694 --- /dev/null +++ b/docs/v5/api/index.html @@ -0,0 +1,31 @@ + + + + Application Programming Interface + + + + +
+ + +

Application Programming Interface

An Application Programming Interface (API) is the formal specification of the library.

+ +
HMAC
+ + + +
+ + + diff --git a/docs/v5/api/other/README.md b/docs/v5/api/other/README.md new file mode 100644 index 000000000..a8932b220 --- /dev/null +++ b/docs/v5/api/other/README.md @@ -0,0 +1,30 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Other Libraries +=============== + +* [Assembly](assembly) + * [Ethers ASM Dialect](assembly/dialect) + * [Opcodes](assembly/dialect) + * [Labels](assembly/dialect) + * [Literals](assembly/dialect) + * [Comments](assembly/dialect) + * [Scopes](assembly/dialect) + * [Data Segment](assembly/dialect) + * [Links](assembly/dialect) + * [Stack Placeholders](assembly/dialect) + * [Evaluation and Excution](assembly/dialect) + * [Utilities](assembly/api) + * [Assembler](assembly/api) + * [Disassembler](assembly/api) + * [Opcode](assembly/api) + * [Abstract Syntax Tree](assembly/ast) + * [Types](assembly/ast) + * [Nodes](assembly/ast) +* [Hardware Wallets](hardware) + * [LedgerSigner](hardware) + diff --git a/docs/v5/api/other/assembly/README.md b/docs/v5/api/other/assembly/README.md new file mode 100644 index 000000000..5e537d3ae --- /dev/null +++ b/docs/v5/api/other/assembly/README.md @@ -0,0 +1,27 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Assembly +======== + +* [Ethers ASM Dialect](dialect) + * [Opcodes](dialect) + * [Labels](dialect) + * [Literals](dialect) + * [Comments](dialect) + * [Scopes](dialect) + * [Data Segment](dialect) + * [Links](dialect) + * [Stack Placeholders](dialect) + * [Evaluation and Excution](dialect) +* [Utilities](api) + * [Assembler](api) + * [Disassembler](api) + * [Opcode](api) +* [Abstract Syntax Tree](ast) + * [Types](ast) + * [Nodes](ast) + diff --git a/docs/v5/api/other/assembly/api/README.md b/docs/v5/api/other/assembly/api/README.md new file mode 100644 index 000000000..4211f36e6 --- /dev/null +++ b/docs/v5/api/other/assembly/api/README.md @@ -0,0 +1,114 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Utilities +========= + +Assembler +--------- + +#### *asm* . **parse**( code ) => *[Node](/v5/api/other/assembly/ast/#asm-node)* + +Parse an ethers-format assembly file and return the [Abstract Syntax Tree](/v5/api/other/assembly/ast/). + + +#### *asm* . **assemble**( node ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Performs assembly of the [Abstract Syntax Tree](/v5/api/other/assembly/ast/) *node* and return the resulting bytecode representation. + + +Disassembler +------------ + +#### *asm* . **disassemble**( bytecode ) => *[Bytecode](/v5/api/other/assembly/api/#asm-bytecode)* + +Returns an array of Operations given *bytecode*. + + +#### *asm* . **formatBytecode**( operations ) => *string* + +Create a formatted output of an array of [Operation](/v5/api/other/assembly/api/#asm-operation). + + +### Bytecode + +#### *bytecode* . **getOperation**( offset ) => *[Operation](/v5/api/other/assembly/api/#asm-operation)* + +Get the operation at a given *offset* into the bytecode. This ensures that the byte at *offset* is an operation and not data contained within a `PUSH`, in which case null it returned. + + +### Operation + +#### *operation* . **opcode** => *[Opcode](/v5/api/other/assembly/api/#asm-opcode)* + +The opcode for this Operation. + + +#### *operation* . **offset** => *number* + +The offset into the bytecode for this Operation. + + +#### *operation* . **pushValue** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +If the opcode is a `PUSH`, this is the value of that push + + +Opcode +------ + +#### *asm* . *Opcode* . **from**( valueOrMnemonic ) => *[Opcode](/v5/api/other/assembly/api/#asm-opcode)* + +Create a new instnace of an Opcode for a given numeric value (e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1"). + + +### Properties + +#### *opcode* . **value** => *number* + +The value (bytecode as a number) of this opcode. + + +#### *opcode* . **mnemonic** => *string* + +The mnemonic string of this opcode. + + +#### *opcode* . **delta** => *number* + +The number of items this opcode will consume from the stack. + + +#### *opcode* . **alpha** => *number* + +The number of items this opcode will push onto the stack. + + +#### *opcode* . **doc** => *string* + +A short description of what this opcode does. + + +#### *opcode* . **isMemory**( ) => *"read" | "write" | "full"* + +Returns true if the opcode accesses memory. + + +#### *opcode* . **isStatic**( ) => *boolean* + +Returns true if the opcode cannot change state. + + +#### *opcode* . **isJump**( ) => *boolean* + +Returns true if the opcode is a jumper operation. + + +#### *opcode* . **isPush**( ) => *number* + +Returns 0 if the opcode is not a `PUSH*`, or the number of bytes this opcode will push if it is. + + diff --git a/docs/v5/api/other/assembly/api/index.html b/docs/v5/api/other/assembly/api/index.html new file mode 100644 index 000000000..a07c16f57 --- /dev/null +++ b/docs/v5/api/other/assembly/api/index.html @@ -0,0 +1,76 @@ + + + + Utilities + + + + +
+ + +

Utilities

+

Assembler

The assembler utilities allow parsing and assembling an Ethers ASM Dialect source file.

+ +
asm.parse( code ) Node

Parse an ethers-format assembly file and return the Abstract Syntax Tree.

+ +
asm.assemble( node ) string< DataHexString >

Performs assembly of the Abstract Syntax Tree node and return the resulting bytecode representation.

+ +

Disassembler

The Disassembler utilities make it easy to convert bytecode into an object which can easily be examined for program structure.

+ +
asm.disassemble( bytecode ) Bytecode

Returns an array of Operations given bytecode.

+ +
asm.formatBytecode( operations ) string

Create a formatted output of an array of Operation.

+ +

Bytecode inherits Array<Operation>

Each arary index represents an operation, collapsing multi-byte operations (i.e. PUSH) into a single operation.

+ +
bytecode.getOperation( offset ) Operation

Get the operation at a given offset into the bytecode. This ensures that the byte at offset is an operation and not data contained within a PUSH, in which case null it returned.

+ +

Operation

An Operation is a single command from a disassembled bytecode stream.

+ +
operation.opcode Opcode

The opcode for this Operation.

+ +
operation.offset number

The offset into the bytecode for this Operation.

+ +
operation.pushValue string< DataHexString >

If the opcode is a PUSH, this is the value of that push

+ +

Opcode

+
asm.Opcode.from( valueOrMnemonic ) Opcode

Create a new instnace of an Opcode for a given numeric value (e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1").

+ +

Properties

+
opcode.value number

The value (bytecode as a number) of this opcode.

+ +
opcode.mnemonic string

The mnemonic string of this opcode.

+ +
opcode.delta number

The number of items this opcode will consume from the stack.

+ +
opcode.alpha number

The number of items this opcode will push onto the stack.

+ +
opcode.doc string

A short description of what this opcode does.

+ +
opcode.isMemory( ) "read" | "write" | "full"

Returns true if the opcode accesses memory.

+ +
opcode.isStatic( ) boolean

Returns true if the opcode cannot change state.

+ +
opcode.isJump( ) boolean

Returns true if the opcode is a jumper operation.

+ +
opcode.isPush( ) number

Returns 0 if the opcode is not a PUSH*, or the number of bytes this opcode will push if it is.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/other/assembly/ast/README.md b/docs/v5/api/other/assembly/ast/README.md new file mode 100644 index 000000000..60652740f --- /dev/null +++ b/docs/v5/api/other/assembly/ast/README.md @@ -0,0 +1,131 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Abstract Syntax Tree +==================== + +Types +----- + +### Location + +#### **offset** => *number* + +The offset into the source code to the start of this node. + + +#### **length** => *number* + +The length of characters in the source code to the end of this node. + + +#### **source** => *string* + +The source code of this node. + + +Nodes +----- + +### Node + +#### *node* . **tag** => *string* + +A unique tag for this node for the lifetime of the process. + + +#### *node* . **location** => *[Location](/v5/api/other/assembly/ast/#asm-location)* + +The source code and location within the source code that this node represents. + + +### ValueNode + +### LiteralNode + +#### *literalNode* . **value** => *string* + +The literal value of this node, which may be a [DataHexString](/v5/api/utils/bytes/#DataHexString) or string of a decimal number. + + +#### *literalNode* . **verbatim** => *boolean* + +This is true in a [DataNode](/v5/api/other/assembly/ast/#asm-datanode) context, since in that case the value should be taken verbatim and no `PUSH` operation shoud be added, otherwise false. + + +### PopNode + +#### *literalNode* . **index** => *number* + +The index this **PopNode** is representing. For an implicit place-holder this is `0`. + + +### LinkNode + +#### *linkNode* . **label** => *string* + +Te name of the target node. + + +#### *linkNode* . **type** => *"offset" | "length"* + +Whether this node is for an offset or a length value of the target node. + + +### OpcodeNode + +#### *opcodeNode* . **opcode** => *[Opcode](/v5/api/other/assembly/api/#asm-opcode)* + +The opcode for this Node. + + +#### *opcodeNode* . **operands** => *Array< [ValueNode](/v5/api/other/assembly/ast/#asm-valuenode) >* + +A list of all operands passed into this Node. + + +### EvaluationNode + +#### *literalNode* . **verbatim** => *boolean* + +This is true in a [DataNode](/v5/api/other/assembly/ast/#asm-datanode) context, since in that case the value should be taken verbatim and no `PUSH` operation shoud be added, otherwise false. + + +#### *evaluationNode* . **script** => *string* + +The code to evaluate and produce the result to use as a literal. + + +### ExecutionNode + +#### *evaluationNode* . **script** => *string* + +The code to execute. Any result is ignored. + + +### LabelledNode + +#### *labelledNode* . **name** => *string* + +The name of this node. + + +### LabelNode + +### DataNode + +#### *dataNode* . **data** => *Array< [ValueNode](/v5/api/other/assembly/ast/#asm-valuenode) >* + +The child nodes, which each represent a verbatim piece of data in insert. + + +### ScopeNode + +#### *scopeNode* . **statements** => *Array< [Node](/v5/api/other/assembly/ast/#asm-node) >* + +The list of child nodes for this scope. + + diff --git a/docs/v5/api/other/assembly/ast/index.html b/docs/v5/api/other/assembly/ast/index.html new file mode 100644 index 000000000..d895b3b55 --- /dev/null +++ b/docs/v5/api/other/assembly/ast/index.html @@ -0,0 +1,94 @@ + + + + Abstract Syntax Tree + + + + +
+ + +

Abstract Syntax Tree

Parsing a file using the Ethers ASM Dialect will generate an Abstract Syntax Tree. The root node will always be a ScopeNode whose name is _.

+ +

To parse a file into an Abstract Syntax tree, use the parse function.

+ +

Types

+

Location

+
offset number

The offset into the source code to the start of this node.

+ +
length number

The length of characters in the source code to the end of this node.

+ +
source string

The source code of this node.

+ +

Nodes

@TODO: Place a diagram here showing the hierarchy

+ +

Node

+
node.tag string

A unique tag for this node for the lifetime of the process.

+ +
node.location Location

The source code and location within the source code that this node represents.

+ +

ValueNode inherits Node

A ValueNode is a node which may manipulate the stack.

+ +

LiteralNode inherits ValueNode

+
literalNode.value string

The literal value of this node, which may be a DataHexString or string of a decimal number.

+ +
literalNode.verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

+ +

PopNode inherits ValueNode

A PopNode is used to store a place-holder for an implicit pop from the stack. It represents the code for an implicit place-holder (i.e. $$) or an explicit place-holder (e.g. $1), which indicates the expect stack position to consume.

+ +
literalNode.index number

The index this PopNode is representing. For an implicit place-holder this is 0.

+ +

LinkNode inherits ValueNode

A LinkNode represents a link to another Node's data, for example $foo or #bar.

+ +
linkNode.label string

Te name of the target node.

+ +
linkNode.type "offset" | "length"

Whether this node is for an offset or a length value of the target node.

+ +

OpcodeNode inherits ValueNode

+
opcodeNode.opcode Opcode

The opcode for this Node.

+ +
opcodeNode.operands Array< ValueNode >

A list of all operands passed into this Node.

+ +

EvaluationNode inherits ValueNode

An EvaluationNode is used to execute code and insert the results but does not generate any output assembly, using the {{! code here }} syntax.

+ +
literalNode.verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

+ +
evaluationNode.script string

The code to evaluate and produce the result to use as a literal.

+ +

ExecutionNode inherits Node

An ExecutionNode is used to execute code but does not generate any output assembly, using the {{! code here }} syntax.

+ +
evaluationNode.script string

The code to execute. Any result is ignored.

+ +

LabelledNode inherits Node

A LabelledNode is used for any Node that has a name, and can therefore be targetted by a LinkNode.

+ +
labelledNode.name string

The name of this node.

+ +

LabelNode inherits LabelledNode

A LabelNode is used as a place to JUMP to by referencing it name, using @myLabel:. A JUMPDEST is automatically inserted at the bytecode offset.

+ +

DataNode inherits LabelledNode

A DataNode allows for data to be inserted directly into the output assembly, using @myData[ ... ]. The data is padded if needed to ensure values that would otherwise be regarded as a PUSH value does not impact anything past the data.

+ +
dataNode.data Array< ValueNode >

The child nodes, which each represent a verbatim piece of data in insert.

+ +

ScopeNode inherits LabelledNode

A ScopeNode allows a new frame of reference that all LinkNode's will use when resolving offset locations, using @myScope{ ... }.

+ +
scopeNode.statements Array< Node >

The list of child nodes for this scope.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/other/assembly/dialect/README.md b/docs/v5/api/other/assembly/dialect/README.md new file mode 100644 index 000000000..7ca00a38a --- /dev/null +++ b/docs/v5/api/other/assembly/dialect/README.md @@ -0,0 +1,36 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Ethers ASM Dialect +================== + +Opcodes +------- + +Labels +------ + +Literals +-------- + +Comments +-------- + +Scopes +------ + +Data Segment +------------ + +Links +----- + +Stack Placeholders +------------------ + +Evaluation and Excution +----------------------- + diff --git a/docs/v5/api/other/assembly/dialect/index.html b/docs/v5/api/other/assembly/dialect/index.html new file mode 100644 index 000000000..175d50ab3 --- /dev/null +++ b/docs/v5/api/other/assembly/dialect/index.html @@ -0,0 +1,84 @@ + + + + Ethers ASM Dialect + + + + +
+ + +

Ethers ASM Dialect

This provides a quick, high-level overcview of the Ethers ASM Dialect for EVM, which is defined by the Ethers ASM Dialect Grammar

+ +

Once a program is compiled by a higher level langauge into ASM (assembly), or hand-coded directly in ASM, it needs to be assembled into bytecode.

+ +

The assembly process performs a very small set of operations and is intentionally simple and closely related to the underlying EVM bytecode.

+ +

Operations include embedding programs within programs (for example the deployment bootstrap has the runtime embedded in it) and computing the necessary offsets for jump operations.

+ +

The Command-Line Assembler can be used to assemble an Ethers ASM Dialect file or to disassemble bytecode into its human-readable (ish) opcodes and literals.

+ +

Opcodes

An Opcode may be provided in either a functional or instructional syntax. For Opcodes that require parameters, the functional syntax is recommended and the instructional syntax will raise a warning.

+ +

@TODO: Examples

+ +

Labels

A Label is a position in the program which can be jumped to. A JUMPDEST is automatically added to this point in the assembled output.

+ +

@TODO: Exmaples

+ +

Literals

A Literal puts data on the stack when executed using a PUSH operation.

+ +

A Literal can be provided using a DataHexString or a decimal byte value.

+ +

@TODO: exmples

+ +

Comments

To enter a comment in the Ethers ASM Dialect, any text following a semi-colon (i.e. ;) is ignored by the assembler.

+ +

Scopes

A common case in Ethereum is to have one program embedded in another.

+ +

The most common use of this is embedding a Contract runtime bytecode within a deployment bytecode, which can be used as init code.

+ +

When deploying a program to Ethereum, an init transaction is used. An init transaction has a null to address and contains bytecode in the data. This data bytecode is a program, that when executed returns some other bytecode as a result, this restul is the bytecode to be installed.

+ +

Therefore it is important that embedded code uses jumps relative to itself, not the entire program it is embedded in, which also means that a jump can only target its own scope, no parent or child scopes. This is enforced by the assembler.

+ +

A scope may access the offset of any child Data Segment or child Scopes (with respect to itself) and may access the length of any Data Segment or Scopes anywhere in the program.

+ +

Every program in the Ethers ASM Dialect has a top-leve scope named _.

+ +

Data Segment

A Data Segment allows arbitrary data to be embedded into a program, which can be useful for lookup tables or deploy-time constants.

+ +

An emtpty Data Segment can also be used when a labelled location is required, but without the JUMPDEST which a Labels adds.

+ +

@TODO: Example

+ +

Links

A Link allows access to a Scopes, Data Segment or Labels.

+ +

To access the byte offset of a labelled item, use $foobar.

+ +

For a Labels, the target must be directly reachable within this scope. For a Data Segment or a Scopes, it can be inside the same scope or any child scope.

+ +

For a Data Segment or a Labels, there is an additional type of Link, which provides the length of the data or bytecode respectively. A Length Link is accessed by #foobar and is pushed on the stack as a literal.

+ +

Stack Placeholders

@TODO: exampl

+ +

Evaluation and Excution

+ + + + +
+ + + diff --git a/docs/v5/api/other/assembly/index.html b/docs/v5/api/other/assembly/index.html new file mode 100644 index 000000000..d61485c66 --- /dev/null +++ b/docs/v5/api/other/assembly/index.html @@ -0,0 +1,31 @@ + + + + Assembly + + + + +
+ + +

Assembly

This module should still be considered fairly experimental.

+ + + + + +
+ + + diff --git a/docs/v5/api/other/hardware/README.md b/docs/v5/api/other/hardware/README.md new file mode 100644 index 000000000..b2e4008ce --- /dev/null +++ b/docs/v5/api/other/hardware/README.md @@ -0,0 +1,23 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Hardware Wallets +================ + +LedgerSigner +------------ + +``` +import { LedgerSigner } from "@ethersproject/hardware-wallets"; +``` + +### API + +#### **new ****LedgerSigner**( [ provider [ , type [ , path ] ] ] ) => *[LedgerSigner](/v5/api/other/hardware/#hw-ledger)* + +Connects to a Ledger Hardware Wallet. The *type* if left unspecified is determined by the environment; in node the default is "hid" and in the browser "u2f" is the default. The default Ethereum path is used if *path* is left unspecified. + + diff --git a/docs/v5/api/other/hardware/index.html b/docs/v5/api/other/hardware/index.html new file mode 100644 index 000000000..e0cac5006 --- /dev/null +++ b/docs/v5/api/other/hardware/index.html @@ -0,0 +1,35 @@ + + + + Hardware Wallets + + + + +
+ + +

Hardware Wallets

+

LedgerSigner inherits Signer

The Ledger Hardware Wallets are a fairly popular brand.

+ +
Importing in ES6 or TypeScript
import { LedgerSigner } from "@ethersproject/hardware-wallets";

API

+
new LedgerSigner( [ provider [ , type [ , path ] ] ] ) LedgerSigner

Connects to a Ledger Hardware Wallet. The type if left unspecified is determined by the environment; in node the default is "hid" and in the browser "u2f" is the default. The default Ethereum path is used if path is left unspecified.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/other/index.html b/docs/v5/api/other/index.html new file mode 100644 index 000000000..adec80929 --- /dev/null +++ b/docs/v5/api/other/index.html @@ -0,0 +1,31 @@ + + + + Other Libraries + + + + +
+ + +

Other Libraries

Now that ethers is more modular, it is possible to have additional ancillary packages, which are not part of the core but optionally add functionality only needed in certain situations.

+ + + + + +
+ + + diff --git a/docs/v5/api/providers/README.md b/docs/v5/api/providers/README.md new file mode 100644 index 000000000..2cd1fbf99 --- /dev/null +++ b/docs/v5/api/providers/README.md @@ -0,0 +1,67 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Providers +========= + +Default Provider +---------------- + +#### *ethers* . **getDefaultProvider**( [ network , [ options ] ] ) => *[Provider](/v5/api/providers/provider/)* + +Returns a new Provider, backed by multiple services, connected to *network*. Is no *network* is provided, **homestead** (i.e. mainnet) is used. + +The *options* is an object, with the following properties: + + +Option Properties + + + +#### 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, 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. + +Some services also provide additional paid features, whichare only available when specifying an API Key. + + +Provider Documentation +---------------------- + +* [Provider](provider) + * [Accounts Methods](provider) + * [Blocks Methods](provider) + * [Ethereum Naming Service (ENS) Methods](provider) + * [Logs Methods](provider) + * [Network Status Methods](provider) + * [Transactions Methods](provider) + * [Event Emitter Methods](provider) + * [Inspection Methods](provider) +* [JsonRpcProvider](jsonrpc-provider) + * [JsonRpcSigner](jsonrpc-provider) + * [JsonRpcUncheckedSigner](jsonrpc-provider) + * [Node-Specific Methods](jsonrpc-provider) +* [API Providers](api-providers) + * [EtherscanProvider](api-providers) + * [InfuraProvider](api-providers) + * [AlchemyProvider](api-providers) + * [CloudflareProvider](api-providers) +* [Other Providers](other) + * [FallbackProvider](other) + * [IpcProvider](other) + * [UrlJsonRpcProvider](other) + * [Web3Provider](other) +* [Types](types) + * [BlockTag](types) + * [Network](types) + * [Block](types) + * [Events and Logs](types) + * [Transactions](types) + diff --git a/docs/v5/api/providers/api-providers/README.md b/docs/v5/api/providers/api-providers/README.md new file mode 100644 index 000000000..488a43bc2 --- /dev/null +++ b/docs/v5/api/providers/api-providers/README.md @@ -0,0 +1,196 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +API Providers +============= + +EtherscanProvider +----------------- + +#### **new ***ethers* . *providers* . **EtherscanProvider**( [ network = "homestead" , [ apiKey ] ] ) + +Create a new **EtherscanProvider** connected to *network* with the optional *apiKey*. + +The *network* may be specified as **string** for a common network name, a **number** for a common chain ID or a [Network Object]provider-(network). + +If no *apiKey* is provided, a shared API key will be used, which may result in reduced performance and throttled requests. It is highly recommended for production, you register with [Etherscan](https://etherscan.io) for your own API key. + + +#### 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. + +It is highly recommended for production, you register with [Etherscan](https://etherscan.io) for your own API key. + + +#### **Supported Networks** + +- Homestead (Mainnet) +- Ropsten (proof-of-work testnet) +- Rinkeby (proof-of-authority testnet) +- Gorli (clique testnet) +- Kovan (proof-of-authority testnet) + + + + +```javascript +// +const EtherscanProvider = ethers.providers.EtherscanProvider; +const apiKey = "..."; +// + +// Connect to mainnet (homestead) +provider = new EtherscanProvider(); + +// Connect to rinkeby testnet (these are equivalent) +provider = new EtherscanProvider("rinkeby"); +provider = new EtherscanProvider(4); + +const network = ethers.providers.getNetwork("rinkeby"); +// +delete network._defaultProvider; +network +// +//! + +provider = new EtherscanProvider(network); + +// Connect to mainnet (homestead) with an API key +provider = new EtherscanProvider(null, apiKey); +provider = new EtherscanProvider("homestead", apiKey); +``` + +#### *provider* . **getHistory**( address ) => *Array< History >* + +@TODO... Explain + + +InfuraProvider +-------------- + +#### **new ***ethers* . *providers* . **InfuraProvider**( [ network = "homestead" , [ apiKey ] ] ) + +Create a new **InfuraProvider** connected to *network* with the optional *apiKey*. + +The *network* may be specified as **string** for a common network name, a **number** for a common chain ID or a [Network Object]provider-(network). + +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. + + +#### 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. + +It is highly recommended for production, you register with [INFURA](https://infura.io) for your own API key. + + +#### **Supported Networks** + +- Homestead (Mainnet) +- Ropsten (proof-of-work testnet) +- Rinkeby (proof-of-authority testnet) +- Gorli (clique testnet) +- Kovan (proof-of-authority testnet) + + + + +```javascript +// +const InfuraProvider = ethers.providers.InfuraProvider; +const projectId = "..."; +const projectSecret = "..."; +// + +// Connect to mainnet (homestead) +provider = new InfuraProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new InfuraProvider("ropsten"); + +// Connect to mainnet with a Project ID (these are equivalent) +provider = new InfuraProvider(null, projectId); +provider = new InfuraProvider("homestead", projectId); + +// Connect to mainnet with a Project ID and Project Secret +provider = new InfuraProvider("homestead", { + projectId: projectId, + projectSecret: projectSecret +}); +``` + +AlchemyProvider +--------------- + +#### **new ***ethers* . *providers* . **AlchemyProvider**( [ network = "homestead" , [ apiKey ] ] ) + +Create a new **AlchemyProvider** connected to *network* with the optional *apiKey*. + +The *network* may be specified as **string** for a common network name, a **number** for a common chain ID or a [Network Object](/v5/api/providers/types/#providers-Network). + + +#### 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. + +It is highly recommended for production, you register with [Alchemy](https://alchemyapi.io) for your own API key. + + +#### **Supported Networks** + +- Homestead (Mainnet) +- Ropsten (proof-of-work testnet) +- Rinkeby (proof-of-authority testnet) +- Gorli (clique testnet) +- Kovan (proof-of-authority testnet) + + + + +```javascript +// +const AlchemyProvider = ethers.providers.AlchemyProvider; +const apiKey = "..."; +// + +// Connect to mainnet (homestead) +provider = new AlchemyProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new AlchemyProvider("ropsten"); + +// Connect to mainnet with an API key (these are equivalent) +provider = new AlchemyProvider(null, apiKey); +provider = new AlchemyProvider("homestead", apiKey); +``` + +CloudflareProvider +------------------ + +#### **new ***ethers* . *providers* . **CloudflareProvider**( ) + +Create a new **CloudflareProvider** connected to mainnet (i.e. "homestead"). + + +#### **Supported Networks** + +- Homestead (Mainnet) + + + + +```javascript +// +const CloudflareProvider = ethers.providers.CloudflareProvider; +// + +// Connect to mainnet (homestead) +provider = new CloudflareProvider(); +``` + diff --git a/docs/v5/api/providers/api-providers/index.html b/docs/v5/api/providers/api-providers/index.html new file mode 100644 index 000000000..7ecc0d4f9 --- /dev/null +++ b/docs/v5/api/providers/api-providers/index.html @@ -0,0 +1,144 @@ + + + + API Providers + + + + +
+ + +

API Providers

There are many services which offer a web API for accessing the Ethereum Blockchain. These Providers allow connecting to them, which simplifies development, since you do not need to run your own instance or cluster of Ethereum nodes.

+ +

However, this reliance on third-party services can reduce resiliance, security and increase the amount of required trust. To mitigate these issues, it is recommended you use a Default Provider.

+ +

EtherscanProvider inherits Provider

The EtherscanProvider is backed by a combination of the various Etherscan APIs.

+ +
new ethers.providers.EtherscanProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new EtherscanProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a [Network Object]provider-(network).

+ +

If no apiKey is provided, a shared API key will be used, which may result in reduced performance and throttled requests. It is highly recommended for production, you register with Etherscan for your own API key.

+ +
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.

+ +

It is highly recommended for production, you register with Etherscan for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
Etherscan Examples
// <hide> +const EtherscanProvider = ethers.providers.EtherscanProvider; +const apiKey = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new EtherscanProvider(); + +// Connect to rinkeby testnet (these are equivalent) +provider = new EtherscanProvider("rinkeby"); +provider = new EtherscanProvider(4); + +const network = ethers.providers.getNetwork("rinkeby"); +// <hide> +delete network._defaultProvider; +network +// </hide> +//! + +provider = new EtherscanProvider(network); + +// Connect to mainnet (homestead) with an API key +provider = new EtherscanProvider(null, apiKey); +provider = new EtherscanProvider("homestead", apiKey);
provider.getHistory( address ) Array< History >

@TODO... Explain

+ +

InfuraProvider inherits UrlJsonRpcProvider

The InfuraProvider is backed by the popular INFURA Ethereum service.

+ +
new ethers.providers.InfuraProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new InfuraProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a [Network Object]provider-(network).

+ +

The apiKey can be a string Project ID or an object with the properties projectId and projectSecret to specify a Project Secret which can be used on non-public sources (like on a server) to further secure your API access and quotas.

+ +
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.

+ +

It is highly recommended for production, you register with INFURA for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
INFURA Examples
// <hide> +const InfuraProvider = ethers.providers.InfuraProvider; +const projectId = "..."; +const projectSecret = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new InfuraProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new InfuraProvider("ropsten"); + +// Connect to mainnet with a Project ID (these are equivalent) +provider = new InfuraProvider(null, projectId); +provider = new InfuraProvider("homestead", projectId); + +// Connect to mainnet with a Project ID and Project Secret +provider = new InfuraProvider("homestead", { + projectId: projectId, + projectSecret: projectSecret +});

AlchemyProvider inherits UrlJsonRpcProvider

The AlchemyProvider is backed by Alchemy.

+ +
new ethers.providers.AlchemyProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new AlchemyProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a Network Object.

+ +
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.

+ +

It is highly recommended for production, you register with Alchemy for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
Alchemy Examples
// <hide> +const AlchemyProvider = ethers.providers.AlchemyProvider; +const apiKey = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new AlchemyProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new AlchemyProvider("ropsten"); + +// Connect to mainnet with an API key (these are equivalent) +provider = new AlchemyProvider(null, apiKey); +provider = new AlchemyProvider("homestead", apiKey);

CloudflareProvider inherits UrlJsonRpcProvider

The CloudflareProvider is backed by the Cloudflare Ethereum Gateway.

+ +
new ethers.providers.CloudflareProvider( )

Create a new CloudflareProvider connected to mainnet (i.e. "homestead").

+ +
Supported Networks

  • Homestead (Mainnet)

+ +
Cloudflare Examples
// <hide> +const CloudflareProvider = ethers.providers.CloudflareProvider; +// </hide> + +// Connect to mainnet (homestead) +provider = new CloudflareProvider();
+ + + +
+ + + diff --git a/docs/v5/api/providers/index.html b/docs/v5/api/providers/index.html new file mode 100644 index 000000000..8b39117b1 --- /dev/null +++ b/docs/v5/api/providers/index.html @@ -0,0 +1,54 @@ + + + + Providers + + + + +
+ + +

Providers

A Provider is an abstraction of a connection to the Ethereum network, providing a concise, consistent interface to standard Ethereum node functionality.

+ +

The ethers.js library provides several options which should cover the vast majority of use-cases, but also includes the necessary functions and classes for sub-classing if a more custom configuration is necessary.

+ +

Most users should be able to simply use the Default Provider.

+ +

Default Provider

The default provider is the safest, easiest way to begin developing on Ethereum, and it is also robust enough for use in production.

+ +

It creates a FallbackProvider connected to as many backend services as possible. When a request is made, it is sent to multiple backends simulatenously. As responses from each backend are returned, they are checked that they agree. Once a quorum has been reached (i.e. enough of the backends agree), the response is provided to your application.

+ +

This ensures that if a backend has become out-of-sync, or if it has been compromised that its responses are dropped in favor of responses that match the majority.

+ +
ethers.getDefaultProvider( [ network , [ options ] ] ) Provider

Returns a new Provider, backed by multiple services, connected to network. Is no network is provided, homestead (i.e. mainnet) is used.

+ +

The options is an object, with the following properties:

+ +
PropertyDescription 
alchemyAlchemy API Token 
etherscanEtherscan API Token 
infuraINFURA Project ID or ProjectID and Project Secret 
quorumThe number of backends that must agree (default: 2 for mainnet, 1 for testnets) 
Option Properties 
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, 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.

+ +

Some services also provide additional paid features, whichare only available when specifying an API Key.

+ +

Provider Documentation

+ + + + +
+ + + diff --git a/docs/v5/api/providers/jsonrpc-provider/README.md b/docs/v5/api/providers/jsonrpc-provider/README.md new file mode 100644 index 000000000..b4b9d8f07 --- /dev/null +++ b/docs/v5/api/providers/jsonrpc-provider/README.md @@ -0,0 +1,69 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +JsonRpcProvider +=============== + +#### **new ***ethers* . *providers* . **JsonRpcProvider**( [ url [ , aNetworkish ] ] ) + +Connect to a JSON-RPC API located at *url* using the *aNetworkish* network. If *url* is not specified, the default (i.e. `http://localhost:8545`) is used and if no network is specified, it will be determined automatically by querying the node. + + +#### 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. + + +#### *jsonRpcProvider* . **getSigner**( [ addressOrIndex ] ) => *[JsonRpcSigner](/v5/api/providers/jsonrpc-provider/#JsonRpcSigner)* + +Returns a [JsonRpcSigner](/v5/api/providers/jsonrpc-provider/#JsonRpcSigner) which is managed by this Ethereum node, at *addressOrIndex*. If no *addressOrIndex* is provided, the first account (account #0) is used. + + +#### *jsonRpcProvider* . **getUncheckedSigner**( [ addressOrIndex ] ) => *[JsonRpcUncheckedSigner](/v5/api/providers/jsonrpc-provider/#UncheckedJsonRpcSigner)* + + + +#### *jsonRpcProvider* . **listAccounts**( ) => *Array< string >* + +Returns a list of all account addresses managed by this provider. + + +#### *jsonRpcProvider* . **send**( method , params ) => *Promise< any >* + +Allows sending raw messages to the provider. + +This can be used for backend-specific calls, such as for debugging or specific account management. + + +JsonRpcSigner +------------- + +#### *signer* . **provider** => *[JsonRpcProvider](/v5/api/providers/jsonrpc-provider/)* + +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. + + +#### *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. + + +#### *signer* . **unlock**( password ) => *Promise< boolean >* + +Request the node unlock the account (if locked) using *password*. + + +JsonRpcUncheckedSigner +---------------------- + +Node-Specific Methods +--------------------- + diff --git a/docs/v5/api/providers/jsonrpc-provider/index.html b/docs/v5/api/providers/jsonrpc-provider/index.html new file mode 100644 index 000000000..09e3367ea --- /dev/null +++ b/docs/v5/api/providers/jsonrpc-provider/index.html @@ -0,0 +1,68 @@ + + + + JsonRpcProvider + + + + +
+ + +

JsonRpcProvider inherits Provider

The JSON-RPC API is a very popular method for interacting with Ethereum and is available in all major Ethereum node implementations (e.g. Geth and Parity) as well as many third-party web services (e.g. INFURA)

+ +
new ethers.providers.JsonRpcProvider( [ url [ , aNetworkish ] ] )

Connect to a JSON-RPC API located at url using the aNetworkish network. If url is not specified, the default (i.e. http://localhost:8545) is used and if no network is specified, it will be determined automatically by querying the node.

+ +
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.

+ +
jsonRpcProvider.getSigner( [ addressOrIndex ] ) JsonRpcSigner

Returns a JsonRpcSigner which is managed by this Ethereum node, at addressOrIndex. If no addressOrIndex is provided, the first account (account #0) is used.

+ +
jsonRpcProvider.getUncheckedSigner( [ addressOrIndex ] ) JsonRpcUncheckedSigner
+
jsonRpcProvider.listAccounts( ) Array< string >

Returns a list of all account addresses managed by this provider.

+ +
jsonRpcProvider.send( method , params ) Promise< any >

Allows sending raw messages to the provider.

+ +

This can be used for backend-specific calls, such as for debugging or specific account management.

+ +

JsonRpcSigner inherits Signer

A JsonRpcSigner is a simple Signer which is backed by a connected JsonRpcProvider.

+ +
signer.provider JsonRpcProvider

The provider this signer was established from.

+ +
signer.connectUnchecked( ) JsonRpcUncheckedSigner

Returns a new Signer object which does not perform addtional checks when sending a transaction. See getUncheckedSigner for more details.

+ +
signer.sendUncheckedTransaction( transaction ) Promise< string< DataHexString< 32 > > >

Sends the transaction and returns a Promise which resolves to the opacque transaction hash.

+ +
signer.unlock( password ) Promise< boolean >

Request the node unlock the account (if locked) using password.

+ +

JsonRpcUncheckedSigner inherits Signer

The JSON-RPC API only provides a transaction hash as the response when a transaction is sent, but the ethers Provider requires populating all details 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 the details using the returned transaction hash to populate the TransactionResponse object.

+ +

Some backends do not respond immediately and instead defer releasing the details of a transaction it was responsible for signing until it is mined.

+ +

The UncheckedSigner does not populate any additional information and will immediately return the result as a mock TransactionResponse-like object, with most of the properties set to null, but allows access to the transaction hash quickly, if that is all that is required.

+ +

Node-Specific Methods

Many methods are less common or specific to certain Ethereum Node implementations (e.g. Parity vs Geth. These include account and admin management, debugging, deeper block and transaction exploration and other services (such as Swarm and Whisper).

+ +

The jsonRpcProvider.send method can be used to access these.

+ +

+ + + + + +
+ + + diff --git a/docs/v5/api/providers/other/README.md b/docs/v5/api/providers/other/README.md new file mode 100644 index 000000000..b6c219901 --- /dev/null +++ b/docs/v5/api/providers/other/README.md @@ -0,0 +1,122 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Other Providers +=============== + +FallbackProvider +---------------- + +#### **new ***ethers* . *providers* . **FallbackProvider**( providers [ , quorum ] ) + +Creates a new instance of a FallbackProvider connected to *providers*. If quorum is not specified, half of the total sum of the provider weights is used. + +The *providers* can be either an array of [Provider](/v5/api/providers/provider/) or [FallbackProviderConfig](/v5/api/providers/other/#FallbackProviderConfig). If a [Provider](/v5/api/providers/provider/) is provided, the defaults are a priority of 1 and a weight of 1. + + +#### *provider* . **providerConfigs** => *Array< [FallbackProviderConfig](/v5/api/providers/other/#FallbackProviderConfig) >* + +The list of Provider Configurations that describe the backends. + + +#### *provider* . **quorum** => *number* + +The quorum the backend responses must agree upon before a result will be resolved. By default this is *half the sum of the weights*. + + +### FallbackProviderConfig + +#### *fallbackProviderConfig* . **provider** => *[Provider](/v5/api/providers/provider/)* + +The provider for this configuration. + + +#### *fallbackProviderConfig* . **priority** => *number* + +The priority used for the provider. Higher priorities are favoured over lower priorities. If multiple providers share the same prioirty, they are choosen at random. + + +#### *fallbackProviderConfig* . **stallTimeout** => *number* + +The timeout (in ms) after which another [Provider](/v5/api/providers/provider/) will be attempted. This does not affect the current Provider; if it returns a result it is counted as part of the quorum. + +Lower values will result in more network traffic, but may reduce the response time of requests. + + +#### *fallbackProviderConfig* . **weight** => *number* + +The weight a response from this provider provides. This can be used if a given [Provider](/v5/api/providers/provider/) is more trusted, for example. + + +IpcProvider +----------- + +#### *ipcProvider* . **path** => *string* + +The path this [Provider](/v5/api/providers/provider/) is connected to. + + +UrlJsonRpcProvider +------------------ + +#### **new ***ethers* . *providers* . **UrlJsonRpcProvider**( [ network [ , apiKey ] ] ) + +Sub-classes do not need to override this. Instead they should override the static method `getUrl` and optionally `getApiKey`. + + +#### *urlJsonRpcProvider* . **apiKey** => *any* + +The value of the apiKey that was returned from `InheritedClass.getApiKey`. + + +#### *InheritingClass* . **getApiKey**( apiKey ) => *any* + +This function should examine the *apiKey* to ensure it is valid and return a (possible modified) value to use in `getUrl`. + + +#### *InheritingClass* . **getUrl**( network , apiKey ) => *string* + +The URL to use for the JsonRpcProvider instance. + + +Web3Provider +------------ + +#### **new ***ethers* . *providers* . **Web3Provider**( externalProvider [ , network ] ) + +Create a new **Web3Provider**, which wraps an [EIP-1193 Provider](https://eips.ethereum.org/EIPS/eip-1193) or Web3Provider-compatible Provider. + + +#### *web3Provider* . **provider** => *Web3CompatibleProvider* + +The provider used to create this instance. + + +### ExternalProvider + +#### *externalProvider* . **request**( request ) => *Promise< any >* + +This follows the [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) API signature. + +The *request* should be a standard JSON-RPC payload, which should at a minimum specify the `method` and `params`. + +The result should be the actual result, which differs from the Web3.js response, which is a wrapped JSON-RPC response. + + +#### *externalProvider* . **sendAsync**( request , callback ) => *void* + +This follows the [Web3.js Provider Signature](https://github.com/ethereum/web3.js/blob/1.x/packages/web3-providers-http/types/index.d.ts#L57). + +The *request* should be a standard JSON-RPC payload, which should at a minimum specify the `method` and `params`. + +The *callback* should use the error-first calling semantics, so `(error, result)` where the result is a JSON-RPC wrapped result. + + +#### *externalProvider* . **send**( request , callback ) => *void* + +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 + + diff --git a/docs/v5/api/providers/other/index.html b/docs/v5/api/providers/other/index.html new file mode 100644 index 000000000..628842d0a --- /dev/null +++ b/docs/v5/api/providers/other/index.html @@ -0,0 +1,100 @@ + + + + Other Providers + + + + +
+ + +

Other Providers

Others...

+ +

FallbackProvider inherits Provider

The FallbackProvider is the most advanced Provider available in ethers.

+ +

It uses a quorum and connects to multiple Providers as backends, each configured with a priority and a weight .

+ +

When a request is made, the request is dispatched to multiple backends, randomly choosen (higher prioirty backends are always selected first) and the results from each are compared against the others. Only once the quorum has been reached will that result be accepted and returned to the caller.

+ +

By default the quorum requires 50% (rounded up) of the backends to agree. The weight can be used to give a backend Provider more influence.

+ +
new ethers.providers.FallbackProvider( providers [ , quorum ] )

Creates a new instance of a FallbackProvider connected to providers. If quorum is not specified, half of the total sum of the provider weights is used.

+ +

The providers can be either an array of Provider or FallbackProviderConfig. If a Provider is provided, the defaults are a priority of 1 and a weight of 1.

+ +
provider.providerConfigs Array< FallbackProviderConfig >

The list of Provider Configurations that describe the backends.

+ +
provider.quorum number

The quorum the backend responses must agree upon before a result will be resolved. By default this is half the sum of the weights.

+ +

FallbackProviderConfig

+
fallbackProviderConfig.provider Provider

The provider for this configuration.

+ +
fallbackProviderConfig.priority number

The priority used for the provider. Higher priorities are favoured over lower priorities. If multiple providers share the same prioirty, they are choosen at random.

+ +
fallbackProviderConfig.stallTimeout number

The timeout (in ms) after which another Provider will be attempted. This does not affect the current Provider; if it returns a result it is counted as part of the quorum.

+ +

Lower values will result in more network traffic, but may reduce the response time of requests.

+ +
fallbackProviderConfig.weight number

The weight a response from this provider provides. This can be used if a given Provider is more trusted, for example.

+ +

IpcProvider inherits JsonRpcProvider

The IpcProvider allows the JSON-RPC API to be used over a local filename on the file system, exposed by Geth, Parity and other nodes.

+ +

This is only available in node.js (as it requires file system access, and may have additional complications due to file permissions. See any related notes on the documentation for the actual node implementation websites.

+ +
ipcProvider.path string

The path this Provider is connected to.

+ +

UrlJsonRpcProvider inherits JsonRpcProvider

This class is intended to be sub-classed and not used directly. It simplifies creating a Provider where a normal JsonRpcProvider would suffice, with a little extra effort needed to generate the JSON-RPC URL.

+ +
new ethers.providers.UrlJsonRpcProvider( [ network [ , apiKey ] ] )

Sub-classes do not need to override this. Instead they should override the static method getUrl and optionally getApiKey.

+ +
urlJsonRpcProvider.apiKey any

The value of the apiKey that was returned from InheritedClass.getApiKey.

+ +
InheritingClass.getApiKey( apiKey ) any

This function should examine the apiKey to ensure it is valid and return a (possible modified) value to use in getUrl.

+ +
InheritingClass.getUrl( network , apiKey ) string

The URL to use for the JsonRpcProvider instance.

+ +

Web3Provider inherits JsonRpcProvider

The Web3Provider is meant to ease moving from a web3.js based application to ethers by wraping an existing Web3-compatible (such as a Web3HttpProvider, Web3IpcProvider or Web3WsProvider) and exposing it as an ethers.js Provider which can then be used with the rest of the library.

+ +

This may also be used to wrap a standard [EIP-1193 Provider](link-eip-1193].

+ +
new ethers.providers.Web3Provider( externalProvider [ , network ] )

Create a new Web3Provider, which wraps an EIP-1193 Provider or Web3Provider-compatible Provider.

+ +
web3Provider.provider Web3CompatibleProvider

The provider used to create this instance.

+ +

ExternalProvider

An ExternalProvider can be either one for the above mentioned Web3 Providers (or otherwise compatible) or an EIP-1193 provider.

+ +

An ExternalProvider must offer one of the following signatures, and the first matching is used:

+ +
externalProvider.request( request ) Promise< any >

This follows the EIP-1193 API signature.

+ +

The request should be a standard JSON-RPC payload, which should at a minimum specify the method and params.

+ +

The result should be the actual result, which differs from the Web3.js response, which is a wrapped JSON-RPC response.

+ +
externalProvider.sendAsync( request , callback ) void

This follows the Web3.js Provider Signature.

+ +

The request should be a standard JSON-RPC payload, which should at a minimum specify the method and params.

+ +

The callback should use the error-first calling semantics, so (error, result) where the result is a JSON-RPC wrapped result.

+ +
externalProvider.send( request , callback ) void

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

+ +
+ + + +
+ + + diff --git a/docs/v5/api/providers/provider/README.md b/docs/v5/api/providers/provider/README.md new file mode 100644 index 000000000..5197733e5 --- /dev/null +++ b/docs/v5/api/providers/provider/README.md @@ -0,0 +1,312 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Provider +======== + +Accounts Methods +---------------- + +#### *provider* . **getBalance**( address [ , blockTag = latest ] ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +Returns the balance of *address* as of the *blockTag* block height. + + +#### *provider* . **getCode**( address [ , blockTag = latest ] ) => *Promise< string< [DataHexString](/v5/api/utils/bytes/#DataHexString) > >* + +Returns the contract code of *address* as of the *blockTag* block height. If there is no contract currently deployed, the result is `0x`. + + +#### *provider* . **getStorageAt**( addr , pos [ , blockTag = latest ] ) => *Promise< string< [DataHexString](/v5/api/utils/bytes/#DataHexString) > >* + +Returns the `Bytes32` value of the position *pos* at address *addr*, as of the *blockTag*. + + +#### *provider* . **getTransactionCount**( address [ , blockTag = latest ] ) => *Promise< number >* + +Returns the number of transactions *address* has ever **sent**, as of *blockTag*. This value is required to be the nonce for the next transaction from *address* sent to the network. + + +```javascript +// Get the balance for an account... +provider.getBalance("ricmoo.firefly.eth"); +//! + +// Get the code for a contract... +provider.getCode("registrar.firefly.eth"); +//! + +// Get the storage value at position 0... +provider.getStorageAt("registrar.firefly.eth", 0) +//! + +// Get transaction count of an account... +provider.getTransactionCount("ricmoo.firefly.eth"); +//! +``` + +Blocks Methods +-------------- + +#### *provider* . **getBlock**( block ) => *Promise< [Block](/v5/api/providers/types/#providers-Block) >* + +Get the *block* from the network, where the `result.transactions` is a list of transaction hashes. + + +#### *provider* . **getBlockWithTransactions**( block ) => *Promise< [BlockWithTransactions](/v5/api/providers/types/#providers-BlockWithTransactions) >* + +Get the *block* from the network, where the `result.transactions` is an Array of [TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse) objects. + + +```javascript +provider.getBlock(100004) +//! + +provider.getBlockWithTransactions(100004) +//! +``` + +Ethereum Naming Service (ENS) Methods +------------------------------------- + +#### *provider* . **lookupAddress**( address ) => *Promise< string >* + +Performs a reverse lookup of the *address* in ENS using the *Reverse Registrar*. If the name does not exist, or the forward lookup does not match, `null` is returned. + + +#### *provider* . **resolveName**( name ) => *Promise< string< [Address](/v5/api/utils/address/#address) > >* + +Looks up the address of *name*. If the name is not owned, or does not have a *Resolver* configured, or the *Resolver* does not have an address configured, `null` is returned. + + +```javascript +// Reverse lookup of an ENS by address... +provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c"); +//! + +// Lookup an address of an ENS name... +provider.resolveName("ricmoo.firefly.eth"); +//! +``` + +Logs Methods +------------ + +#### *provider* . **getLogs**( filter ) => *Promise< Array< [Log](/v5/api/providers/types/#providers-Log) > >* + +Returns the Array of [Log](/v5/api/providers/types/#providers-Log) matching the *filter*. + +Keep in mind that many backends will discard old events, and that requests which are too broad may get dropped as they require too many resources to execute the query. + + +Network Status Methods +---------------------- + +#### *provider* . **getNetwork**( ) => *Promise< [Network](/v5/api/providers/types/#providers-Network) >* + +Returns the [Network](/v5/api/providers/types/#providers-Network) this Provider is connected to. + + +#### *provider* . **getBlockNumber**( ) => *Promise< number >* + +Returns the block number (or height) of the most recently mined block. + + +#### *provider* . **getGasPrice**( ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +Returns a *best guess* of the [Gas Price](/v5/concepts/gas/#gas-price) to use in a transaction. + + +```javascript +// The network information +provider.getNetwork() +// +//! +network = utils.shallowCopy(_) +delete network._defaultProvider +network +// +//! + +// The current block number +provider.getBlockNumber() +//! + +// Get the current suggested gas price (in wei)... +gasPrice = await provider.getGasPrice() +//! async gasPrice + +// ...often this gas price is easier to understand or +// display to the user in gwei (giga-wei, or 1e9 wei) +utils.formatUnits(gasPrice, "gwei") +//! +``` + +Transactions Methods +-------------------- + +#### *provider* . **call**( transaction [ , blockTag = latest ] ) => *Promise< string< [DataHexString](/v5/api/utils/bytes/#DataHexString) > >* + +Returns the result of executing the *transaction*, using *call*. A call does not require any ether, but cannot change any state. This is useful for calling gettings on Contracts. + + +#### *provider* . **estimateGas**( transaction ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +Returns an estimate of the amount of gas that would be required to submit *transaction* to the network. + +An estimate may not be accurate since there could be another transaction on the network that was not accounted for, but after being mined affected relevant state. + + +#### *provider* . **sendTransaction**( transaction ) => *Promise< [TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse) >* + +Submits *transaction* to the network to be mined. The *transaction* **must** be signed, and be valid (i.e. the nonce is correct and the account has sufficient balance to pay for the transaction). + + +#### *provider* . **waitForTransaction**( hash [ , confirms = 1 [ , timeout ] ] ) => *Promise< [TxReceipt](/v5/api/providers/types/#providers-TransactionReceipt) >* + +Returns a Promise which will not resolve until *transactionHash* is mined. + + +Event Emitter Methods +--------------------- + +#### *provider* . **on**( eventName , listener ) => *this* + +Add a *listener* to be triggered for each *eventName*. + + +#### *provider* . **once**( eventName , listener ) => *this* + +Add a *listener* to be triggered for only the next *eventName*, at which time it be removed. + + +#### *provider* . **emit**( eventName , ...args ) => *boolean* + +Notify all listeners of *eventName*, passing *args* to each listener. This is generally only used internally. + + +#### *provider* . **off**( eventName [ , listener ] ) => *this* + +Remove a *listener* for *eventName*. If no *listener* is provided, all listeners for *eventName* are removed. + + +#### *provider* . **removeAllListeners**( [ eventName ] ) => *this* + +Remove all the listeners for *eventName*. If no *eventName* is provided, **all** events are removed. + + +#### *provider* . **listenerCount**( [ eventName ] ) => *number* + +Returns the number of listeners for *eventName*. If no *eventName* is provided, the total number of listeners is returned. + + +#### *provider* . **listeners**( eventName ) => *Array< Listener >* + +Returns the list of Listeners for *eventName*. + + +### Events + +#### **Log Filter** + +A filter is an object, representing a contract log Filter, which has the optional properties `address` (the source contract) and `topics` (a topic-set to match). + +If `address` is unspecified, the filter matches any contract address. + +See events for more information on how to specify topic-sets. + + +#### **Topic-Set Filter** + +The value of a **Topic-Set Filter** is a array of Topic-Sets. + +This event is identical to a *Log Filter* with the address omitted (i.e. from any contract). + + +#### **Transaction Filter** + +The value of a **Transaction Filter** is any transaction hash. + +This event is emitted on every block that is part of a chain that includes the given mined transaction. It is much more common that the [once](/v5/api/providers/provider/#Provider-once) method is used than the [on](/v5/api/providers/provider/#Provider-on) method. + + + +In addition to transaction and filter events, there are several named events. + + +Named Provider Events + + + +```javascript +// +const txHash = utils.id("dummy-data"); +const myAddress = ethers.constants.HashZero; +const myOtherAddress = ethers.constants.HashZero; +// + +provider.on("block", (blockNumber) => { + // Emitted on every block change +}) + + +provider.once(txHash, (transaction) => { + // Emitted when the transaction has been mined +}) + + +// This filter could also be generated with the Contract or +// Interface API. If address is not specified, any address +// matches and if topics is not specified, any log matches +filter = { + address: "dai.tokens.ethers.eth", + topics: [ + utils.id("Transfer(address,address,uint256") + ] +} +provider.on(filter, (log, event) => { + // Emitted whenever a DAI token transfer occurs +}) + + +// Notice this is an array of topic-sets and is identical to +// using a filter with no address (i.e. match any address) +topicSets = [ + utils.id("Transfer(address,address,uint256"), + null, + [ + myAddress, + myOtherAddress + ] +] +provider.on(topicSets, (log, event) => { + // Emitted any token is sent TO either address +}) + + +provider.on("pending", (tx) => { + // Emitted when any new pending transaction is noticed +}); + + +provider.on("error", (tx) => { + // Emitted when any error occurs +}); + +// +// Make sure our documentation builds without waiting forever +provider.removeAllListeners() +// +``` + +Inspection Methods +------------------ + +#### *Provider* . **isProvider**( object ) => *boolean* + +Returns true if and only if *object* is a Provider. + + diff --git a/docs/v5/api/providers/provider/index.html b/docs/v5/api/providers/provider/index.html new file mode 100644 index 000000000..472049677 --- /dev/null +++ b/docs/v5/api/providers/provider/index.html @@ -0,0 +1,219 @@ + + + + Provider + + + + +
+ + +

Provider

Explain what a provider is...

+ +

Accounts Methods

+
provider.getBalance( address [ , blockTag = latest ] ) Promise< BigNumber >

Returns the balance of address as of the blockTag block height.

+ +
provider.getCode( address [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the contract code of address as of the blockTag block height. If there is no contract currently deployed, the result is 0x.

+ +
provider.getStorageAt( addr , pos [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the Bytes32 value of the position pos at address addr, as of the blockTag.

+ +
provider.getTransactionCount( address [ , blockTag = latest ] ) Promise< number >

Returns the number of transactions address has ever sent, as of blockTag. This value is required to be the nonce for the next transaction from address sent to the network.

+ +
Account Examples
// Get the balance for an account... +provider.getBalance("ricmoo.firefly.eth"); +//! + +// Get the code for a contract... +provider.getCode("registrar.firefly.eth"); +//! + +// Get the storage value at position 0... +provider.getStorageAt("registrar.firefly.eth", 0) +//! + +// Get transaction count of an account... +provider.getTransactionCount("ricmoo.firefly.eth"); +//!

Blocks Methods

+
provider.getBlock( block ) Promise< Block >

Get the block from the network, where the result.transactions is a list of transaction hashes.

+ +
provider.getBlockWithTransactions( block ) Promise< BlockWithTransactions >

Get the block from the network, where the result.transactions is an Array of TransactionResponse objects.

+ +
Block Examples
provider.getBlock(100004) +//! + +provider.getBlockWithTransactions(100004) +//!

Ethereum Naming Service (ENS) Methods

The Ethereum Naming Service (ENS) allows a short and easy-to-remember ENS Name to be atached to any set of keys and values.

+ +

One of the most common uses for this is to use a simple name to refer to an Ethereum Address.

+ +

In the ethers API, nearly anywhere that accepts an address, an ENS name may be used instead, which can simplify code and make reading and debugging much simpler.

+ +

The provider offers some basic operations to help resolve and work with ENS names.

+ +
provider.lookupAddress( address ) Promise< string >

Performs a reverse lookup of the address in ENS using the Reverse Registrar. If the name does not exist, or the forward lookup does not match, null is returned.

+ +
provider.resolveName( name ) Promise< string< Address > >

Looks up the address of name. If the name is not owned, or does not have a Resolver configured, or the Resolver does not have an address configured, null is returned.

+ +
ENS Examples
// Reverse lookup of an ENS by address... +provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c"); +//! + +// Lookup an address of an ENS name... +provider.resolveName("ricmoo.firefly.eth"); +//!

Logs Methods

+
provider.getLogs( filter ) Promise< Array< Log > >

Returns the Array of Log matching the filter.

+ +

Keep in mind that many backends will discard old events, and that requests which are too broad may get dropped as they require too many resources to execute the query.

+ +

Network Status Methods

+
provider.getNetwork( ) Promise< Network >

Returns the Network this Provider is connected to.

+ +
provider.getBlockNumber( ) Promise< number >

Returns the block number (or height) of the most recently mined block.

+ +
provider.getGasPrice( ) Promise< BigNumber >

Returns a best guess of the Gas Price to use in a transaction.

+ +
Network Status Examples
// The network information +provider.getNetwork() +// <hide> +//! +network = utils.shallowCopy(_) +delete network._defaultProvider +network +// </hide> +//! + +// The current block number +provider.getBlockNumber() +//! + +// Get the current suggested gas price (in wei)... +gasPrice = await provider.getGasPrice() +//! async gasPrice + +// ...often this gas price is easier to understand or +// display to the user in gwei (giga-wei, or 1e9 wei) +utils.formatUnits(gasPrice, "gwei") +//!

Transactions Methods

+
provider.call( transaction [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the result of executing the transaction, using call. A call does not require any ether, but cannot change any state. This is useful for calling gettings on Contracts.

+ +
provider.estimateGas( transaction ) Promise< BigNumber >

Returns an estimate of the amount of gas that would be required to submit transaction to the network.

+ +

An estimate may not be accurate since there could be another transaction on the network that was not accounted for, but after being mined affected relevant state.

+ +
provider.sendTransaction( transaction ) Promise< TransactionResponse >

Submits transaction to the network to be mined. The transaction must be signed, and be valid (i.e. the nonce is correct and the account has sufficient balance to pay for the transaction).

+ +
provider.waitForTransaction( hash [ , confirms = 1 [ , timeout ] ] ) Promise< TxReceipt >

Returns a Promise which will not resolve until transactionHash is mined.

+ +

Event Emitter Methods

Explain events here...

+ +
provider.on( eventName , listener ) this

Add a listener to be triggered for each eventName.

+ +
provider.once( eventName , listener ) this

Add a listener to be triggered for only the next eventName, at which time it be removed.

+ +
provider.emit( eventName , ...args ) boolean

Notify all listeners of eventName, passing args to each listener. This is generally only used internally.

+ +
provider.off( eventName [ , listener ] ) this

Remove a listener for eventName. If no listener is provided, all listeners for eventName are removed.

+ +
provider.removeAllListeners( [ eventName ] ) this

Remove all the listeners for eventName. If no eventName is provided, all events are removed.

+ +
provider.listenerCount( [ eventName ] ) number

Returns the number of listeners for eventName. If no eventName is provided, the total number of listeners is returned.

+ +
provider.listeners( eventName ) Array< Listener >

Returns the list of Listeners for eventName.

+ +

Events

Any of the following may be used as the eventName in the above methods.

+ +
Log Filter

A filter is an object, representing a contract log Filter, which has the optional properties address (the source contract) and topics (a topic-set to match).

+ +

If address is unspecified, the filter matches any contract address.

+ +

See events for more information on how to specify topic-sets.

+ +
Topic-Set Filter

The value of a Topic-Set Filter is a array of Topic-Sets.

+ +

This event is identical to a Log Filter with the address omitted (i.e. from any contract).

+ +
Transaction Filter

The value of a Transaction Filter is any transaction hash.

+ +

This event is emitted on every block that is part of a chain that includes the given mined transaction. It is much more common that the once method is used than the on method.

+ +

In addition to transaction and filter events, there are several named events.

+ +
Event NameArgumentsDescription 
"block"blockNumberemitted when a new block is mined 
"error"erroremitted on any error 
"pending"pendingTransactionemitted when a new transaction enters the memory pool; only certain providers offer this event and may require running your own node for reliable results 
"willPoll"pollIdemitted prior to a polling loop is about to begin; (very rarely used by most developers) 
"poll"pollId, blockNumberemitted during each poll cycle after `blockNumber` is updated (if changed) and before any other events (if any) are emitted during the poll loop; (very rarely used by most developers) 
"didPoll"pollIdemitted after all events from a polling loop are emitted; (very rarely used by most developers) 
"debug"provider dependenteach Provider may use this to emit useful debugging information and the format is up to the developer; (very rarely used by most developers) 
Named Provider Events 
Events Example
// <hide> +const txHash = utils.id("dummy-data"); +const myAddress = ethers.constants.HashZero; +const myOtherAddress = ethers.constants.HashZero; +// </hide> + +provider.on("block", (blockNumber) => { + // Emitted on every block change +}) + + +provider.once(txHash, (transaction) => { + // Emitted when the transaction has been mined +}) + + +// This filter could also be generated with the Contract or +// Interface API. If address is not specified, any address +// matches and if topics is not specified, any log matches +filter = { + address: "dai.tokens.ethers.eth", + topics: [ + utils.id("Transfer(address,address,uint256") + ] +} +provider.on(filter, (log, event) => { + // Emitted whenever a DAI token transfer occurs +}) + + +// Notice this is an array of topic-sets and is identical to +// using a filter with no address (i.e. match any address) +topicSets = [ + utils.id("Transfer(address,address,uint256"), + null, + [ + myAddress, + myOtherAddress + ] +] +provider.on(topicSets, (log, event) => { + // Emitted any token is sent TO either address +}) + + +provider.on("pending", (tx) => { + // Emitted when any new pending transaction is noticed +}); + + +provider.on("error", (tx) => { + // Emitted when any error occurs +}); + +// <hide> +// Make sure our documentation builds without waiting forever +provider.removeAllListeners() +// </hide>

Inspection Methods

+
Provider.isProvider( object ) boolean

Returns true if and only if object is a Provider.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/providers/types/README.md b/docs/v5/api/providers/types/README.md new file mode 100644 index 000000000..42b075055 --- /dev/null +++ b/docs/v5/api/providers/types/README.md @@ -0,0 +1,357 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Types +===== + +BlockTag +-------- + +### EventType + +Network +------- + +#### *network* . **name** => *string* + +The human-readable name of the network, such as `homestead`. If the network name is unknown, this will be `"unknown"`. + + +#### *network* . **chainId** => *number* + +The Chain ID of the network. + + +#### *network* . **ensAddress** => *string< [Address](/v5/api/utils/address/#address) >* + +The address at which the ENS registry is deployed on this network. + + +Block +----- + +#### *block* . **hash** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The hash of this block. + + +#### *block* . **parentHash** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The hash of the previous block. + + +#### *block* . **number** => *number* + +The height (number) of this block. + + +#### *block* . **timestamp** => *number* + +The timestamp of this block. + + +#### *block* . **nonce** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +The nonce used as part of the proof-of-work to mine this block. + +This property is generally of little interest developers. + + +#### *block* . **difficulty** => *number* + +The difficulty target required to be met by the miner of the block. + +This property is generally of little interest developers. + + +#### *block* . **gasLimit** => *[BigNumber](/v5/api/utils/bignumber/)* + +The maximum amount of gas that this block was permitted to use. This is a value that can be voted up or voted down by miners and is used to automatically adjust the bandwidth requirements of the network. + +This property is generally of little interest developers. + + +#### *block* . **gasUsed** => *[BigNumber](/v5/api/utils/bignumber/)* + +The total amount of gas used by all transactions in this block. + + +#### *block* . **miner** => *string* + +The coinbase address of this block, which indicates the address the miner that mined this block would like the subsidy reward to go to. + + +#### *block* . **extraData** => *string* + +This is extra data a miner may choose to include when mining a block. + +This property is generally of little interest developers. + + +### Block (with transaction hashes) + +#### *block* . **transactions** => *Array< string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > > >* + +A list of the transactions hashes for each transaction this block includes. + + +### BlockWithTransactions + +#### *block* . **transactions** => *Array< [TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse) >* + +A list of the transactions this block includes. + + +Events and Logs +--------------- + +### EventFilter + +#### *filter* . **address** => *string< [Address](/v5/api/utils/address/#address) >* + +The address to filter by, or `null` to match any address. + + +#### *filter* . **topics** => *Array< string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > > | Array< string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > > > >* + +The topics to filter by, or `null` to match any topics. Each entry represents an **AND** condition that must match, or may be `null` to match anything. If a given entry is an Array, then that entry is treated as an **OR** for any value in the entry. + + +### Filter + +#### *filter* . **fromBlock** => *[BlockTag](/v5/api/providers/types/#providers-BlockTag)* + +The starting block (inclusive) to search for logs matching the filter criteria. + + +#### *filter* . **toBlock** => *[BlockTag](/v5/api/providers/types/#providers-BlockTag)* + +The end block (inclusive) to search for logs matching the filter criteria. + + +### FilterByBlockHash + +#### *filter* . **blockHash** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The specific block (by its block hash) to search for logs matching the filter criteria. + + +### Log + +#### *log* . **blockNumber** => *number* + +The block height (number) of the block including the transaction of this log. + + +#### *log* . **blockHash** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The block hash of the block including the transaction of this log. + + +#### *log* . **removed** => *boolean* + +During a re-org, if a transaction is orphaned, this will be set to true to indicate the Log entry has been removed; it will likely be emitted again in the near future when another block is mined with the transaction that triggered this log, but keep in mind the values may change. + + +#### *log* . **transactionLogIndex** => *number* + +The index of this log in the transaction. + + +#### *log* . **address** => *string< [Address](/v5/api/utils/address/#address) >* + +The address of the contract that generated this log. + + +#### *log* . **data** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +The data included in this log. + + +#### *log* . **topics** => *Array< string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > > >* + +The list of topics (indexed properties) for this log. + + +#### *log* . **transactionHash** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The transaction hash of the transaction of this log. + + +#### *log* . **transactionIndex** => *number* + +The index of the transaction in the block of the transaction of this log. + + +#### *log* . **logIndex** => *number* + +The index of this log across all logs in the entire **block**. + + +Transactions +------------ + +### TransactionRequest + +#### *transactionRequest* . **to** => *string | Promise< string >* + +The address (or ENS name) this transaction it to. + + +#### *transactionRequest* . **from** => *string< [Address](/v5/api/utils/address/#address) > | Promise< string< [Address](/v5/api/utils/address/#address) > >* + +The address this transaction is from. + + +#### *transactionRequest* . **nonce** => *number | Promise< number >* + +The nonce for this transaction. This should be set to the number of transactions ever sent **from** this address. + + +#### *transactionRequest* . **gasLimit** => *[BigNumber](/v5/api/utils/bignumber/) | Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +The maximum amount of gas this transaction is permitted to use. + + +#### *transactionRequest* . **gasPrice** => *[BigNumber](/v5/api/utils/bignumber/) | Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +The price (in wei) per unit of gas this transaction will pay. + + +#### *transactionRequest* . **data** => *[DataHexString](/v5/api/utils/bytes/#DataHexString) | Promise< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +The transaction data. + + +#### *transactionRequest* . **value** => *[BigNumber](/v5/api/utils/bignumber/) | Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +The amount (in wei) this transaction is sending. + + +#### *transactionRequest* . **chainId** => *number | Promise< number >* + +The chain ID this transaction is authorized on, as specified by [EIP-155](https://eips.ethereum.org/EIPS/eip-155). + +If the chain ID is 0 will disable EIP-155 and the transaction will be valid on any network. This can be **dangerous** and care should be taken, since it allows transactions to be replayed on networks that were possibly not intended. + + +### TransactionResponse + +#### *transaction* . **blockNumber** => *number* + +The number ("height") of the block this transaction was mined in. If the block has not been mined, this is `null`. + + +#### *transaction* . **blockHash** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The hash of the block this transaction was mined in. If the block has not been mined, this is `null`. + + +#### *transaction* . **timestamp** => *number* + +The timestamp of the block this transaction was mined in. If the block has not been mined, this is `null`. + + +#### *transaction* . **confirmations** => *number* + +The number of blocks that have been mined (including the initial block) since this transaction was mined. + + +#### *transaction* . **raw** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +The serialized transaction. + + +#### *transaction* . **wait**( [ confirmations = 1 ] ) => *Promise< [TransactionReceipt](/v5/api/providers/types/#providers-TransactionReceipt) >* + +Wait for *confirmations*. If 0, and the transaction has not been mined, `null` is returned. + + +### TransactionReceipt + +#### *receipt* . **to** => *string< [Address](/v5/api/utils/address/#address) >* + +The address this transaction is to. This is `null` if the the transaction was an **init transaction**, used to deploy a contract. + + +#### *receipt* . **from** => *string< [Address](/v5/api/utils/address/#address) >* + +The address this transaction is from. + + +#### *receipt* . **contractAddress** => *string< [Address](/v5/api/utils/address/#address) >* + +If this transaction has a `null` to address, it is an **init transaction** used to deploy a contract, in which case this is the address created by that contract. + +To compute a contract address, the [getContractAddress](/v5/api/utils/address/#utils-getContractAddress) utility function can also be used with a [TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse) object, which requires the transaction nonce and the address of the sender. + + +#### *receipt* . **transactionIndex** => *number* + +The index of this transaction in the list of transactions included in the block this transaction was mined in. + + +#### *receipt* . **root** => *string* + +The intermediate state root of a receipt. + +Only transactions included in blocks **before** the [Byzantium Hard Fork](https://eips.ethereum.org/EIPS/eip-609) have this property, as it was replaced by the `status` property. + +The property is generally of little use to developers. At the time it could be used to verify a state transition with a fraud-proof only considering the single transaction; without it the full block must be considered. + + +#### *receipt* . **gasUsed** => *[BigNumber](/v5/api/utils/bignumber/)* + +The amount of gas actually used by this transaction. + + +#### *receipt* . **logsBloom** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +A [bloom-filter](https://en.wikipedia.org/wiki/Bloom_filter), which incldues all the addresses and topics included in any log in this transaction. + + +#### *receipt* . **blockHash** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The block hash of the block that this transaction was included in. + + +#### *receipt* . **transactionHash** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The transaction hash of this transaction. + + +#### *receipt* . **logs** => *Array< [Log](/v5/api/providers/types/#providers-Log) >* + +All the logs emitted by this transaction. + + +#### *receipt* . **blockNumber** => *number* + +The block height (number) of the block that this transaction was included in. + + +#### *receipt* . **confirmations** => *number* + +The number of blocks that have been mined since this transaction, including the actual block it was mined in. + + +#### *receipt* . **cumulativeGasUsed** => *[BigNumber](/v5/api/utils/bignumber/)* + +For the block this transaction was included in, this is the sum of the gas used used by each transaction in the ordered list of transactions up to (and including) this transaction. + +This is generally of little interest to developers. + + +#### *receipt* . **byzantium** => *boolean* + +This is true if the block is in a [post-Byzantium Hard Fork](https://eips.ethereum.org/EIPS/eip-609) block. + + +#### *receipt* . **status** => *boolean* + +The status of a transaction is 1 is successful or 0 if it was reverted. Only transactions included in blocks [post-Byzantium Hard Fork](https://eips.ethereum.org/EIPS/eip-609) have this property. + + diff --git a/docs/v5/api/providers/types/index.html b/docs/v5/api/providers/types/index.html new file mode 100644 index 000000000..d5b3bf318 --- /dev/null +++ b/docs/v5/api/providers/types/index.html @@ -0,0 +1,194 @@ + + + + Types + + + + +
+ + +

Types

+

BlockTag

A BlockTag specifies a specific location in the Blockchain.

+ +

  • "latest" -- The most recently mined block
  • "earliest" -- Block #0
  • "pending" -- The block currently being prepared for mining; not all operations and backends support this BlockTag
  • number -- The block at this height
  • a negative number -- The block this many blocks ago

+ +

EventType

And EventType can be any of the following.

+ +

+ +

Network

A Network represents an Etherem network.

+ +
network.name string

The human-readable name of the network, such as homestead. If the network name is unknown, this will be "unknown".

+ +
network.chainId number

The Chain ID of the network.

+ +
network.ensAddress string< Address >

The address at which the ENS registry is deployed on this network.

+ +

Block

+
block.hash string< DataHexString< 32 > >

The hash of this block.

+ +
block.parentHash string< DataHexString< 32 > >

The hash of the previous block.

+ +
block.number number

The height (number) of this block.

+ +
block.timestamp number

The timestamp of this block.

+ +
block.nonce string< DataHexString >

The nonce used as part of the proof-of-work to mine this block.

+ +

This property is generally of little interest developers.

+ +
block.difficulty number

The difficulty target required to be met by the miner of the block.

+ +

This property is generally of little interest developers.

+ +
block.gasLimit BigNumber

The maximum amount of gas that this block was permitted to use. This is a value that can be voted up or voted down by miners and is used to automatically adjust the bandwidth requirements of the network.

+ +

This property is generally of little interest developers.

+ +
block.gasUsed BigNumber

The total amount of gas used by all transactions in this block.

+ +
block.miner string

The coinbase address of this block, which indicates the address the miner that mined this block would like the subsidy reward to go to.

+ +
block.extraData string

This is extra data a miner may choose to include when mining a block.

+ +

This property is generally of little interest developers.

+ +

Block (with transaction hashes)

Often only the hashes of the transactions included in a block are needed, so by default a block only contains this information, as it is substantially less data.

+ +
block.transactions Array< string< DataHexString< 32 > > >

A list of the transactions hashes for each transaction this block includes.

+ +

BlockWithTransactions inherits Block

If all transactions for a block are needed, this object instead includes the full details on each transaction.

+ +
block.transactions Array< TransactionResponse >

A list of the transactions this block includes.

+ +

Events and Logs

+

EventFilter

+
filter.address string< Address >

The address to filter by, or null to match any address.

+ +
filter.topics Array< string< DataHexString< 32 > > | Array< string< DataHexString< 32 > > > >

The topics to filter by, or null to match any topics. Each entry represents an AND condition that must match, or may be null to match anything. If a given entry is an Array, then that entry is treated as an OR for any value in the entry.

+ +

Filter inherits EventFilter

+
filter.fromBlock BlockTag

The starting block (inclusive) to search for logs matching the filter criteria.

+ +
filter.toBlock BlockTag

The end block (inclusive) to search for logs matching the filter criteria.

+ +

FilterByBlockHash inherits EventFilter

+
filter.blockHash string< DataHexString< 32 > >

The specific block (by its block hash) to search for logs matching the filter criteria.

+ +

Log

+
log.blockNumber number

The block height (number) of the block including the transaction of this log.

+ +
log.blockHash string< DataHexString< 32 > >

The block hash of the block including the transaction of this log.

+ +
log.removed boolean

During a re-org, if a transaction is orphaned, this will be set to true to indicate the Log entry has been removed; it will likely be emitted again in the near future when another block is mined with the transaction that triggered this log, but keep in mind the values may change.

+ +
log.transactionLogIndex number

The index of this log in the transaction.

+ +
log.address string< Address >

The address of the contract that generated this log.

+ +
log.data string< DataHexString >

The data included in this log.

+ +
log.topics Array< string< DataHexString< 32 > > >

The list of topics (indexed properties) for this log.

+ +
log.transactionHash string< DataHexString< 32 > >

The transaction hash of the transaction of this log.

+ +
log.transactionIndex number

The index of the transaction in the block of the transaction of this log.

+ +
log.logIndex number

The index of this log across all logs in the entire block.

+ +

Transactions

+

TransactionRequest

A transaction request describes a transaction that is to be sent to the network or otherwise processed.

+ +

All fields are optional and may be a promise which resolves to the required type.

+ +
transactionRequest.to string | Promise< string >

The address (or ENS name) this transaction it to.

+ +
transactionRequest.from string< Address > | Promise< string< Address > >

The address this transaction is from.

+ +
transactionRequest.nonce number | Promise< number >

The nonce for this transaction. This should be set to the number of transactions ever sent from this address.

+ +
transactionRequest.gasLimit BigNumber | Promise< BigNumber >

The maximum amount of gas this transaction is permitted to use.

+ +
transactionRequest.gasPrice BigNumber | Promise< BigNumber >

The price (in wei) per unit of gas this transaction will pay.

+ +
transactionRequest.data DataHexString | Promise< DataHexString >

The transaction data.

+ +
transactionRequest.value BigNumber | Promise< BigNumber >

The amount (in wei) this transaction is sending.

+ +
transactionRequest.chainId number | Promise< number >

The chain ID this transaction is authorized on, as specified by EIP-155.

+ +

If the chain ID is 0 will disable EIP-155 and the transaction will be valid on any network. This can be dangerous and care should be taken, since it allows transactions to be replayed on networks that were possibly not intended.

+ +

TransactionResponse inherits Transaction

A TransactionResponse includes all properties of a Transaction as well as several properties that are useful once it has been mined.

+ +
transaction.blockNumber number

The number ("height") of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.blockHash string< DataHexString< 32 > >

The hash of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.timestamp number

The timestamp of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.confirmations number

The number of blocks that have been mined (including the initial block) since this transaction was mined.

+ +
transaction.raw string< DataHexString >

The serialized transaction.

+ +
transaction.wait( [ confirmations = 1 ] ) Promise< TransactionReceipt >

Wait for confirmations. If 0, and the transaction has not been mined, null is returned.

+ +

TransactionReceipt

+
receipt.to string< Address >

The address this transaction is to. This is null if the the transaction was an init transaction, used to deploy a contract.

+ +
receipt.from string< Address >

The address this transaction is from.

+ +
receipt.contractAddress string< Address >

If this transaction has a null to address, it is an init transaction used to deploy a contract, in which case this is the address created by that contract.

+ +

To compute a contract address, the getContractAddress utility function can also be used with a TransactionResponse object, which requires the transaction nonce and the address of the sender.

+ +
receipt.transactionIndex number

The index of this transaction in the list of transactions included in the block this transaction was mined in.

+ +
receipt.root string

The intermediate state root of a receipt.

+ +

Only transactions included in blocks before the Byzantium Hard Fork have this property, as it was replaced by the status property.

+ +

The property is generally of little use to developers. At the time it could be used to verify a state transition with a fraud-proof only considering the single transaction; without it the full block must be considered.

+ +
receipt.gasUsed BigNumber

The amount of gas actually used by this transaction.

+ +
receipt.logsBloom string< DataHexString >

A bloom-filter, which incldues all the addresses and topics included in any log in this transaction.

+ +
receipt.blockHash string< DataHexString< 32 > >

The block hash of the block that this transaction was included in.

+ +
receipt.transactionHash string< DataHexString< 32 > >

The transaction hash of this transaction.

+ +
receipt.logs Array< Log >

All the logs emitted by this transaction.

+ +
receipt.blockNumber number

The block height (number) of the block that this transaction was included in.

+ +
receipt.confirmations number

The number of blocks that have been mined since this transaction, including the actual block it was mined in.

+ +
receipt.cumulativeGasUsed BigNumber

For the block this transaction was included in, this is the sum of the gas used used by each transaction in the ordered list of transactions up to (and including) this transaction.

+ +

This is generally of little interest to developers.

+ +
receipt.byzantium boolean

This is true if the block is in a post-Byzantium Hard Fork block.

+ +
receipt.status boolean

The status of a transaction is 1 is successful or 0 if it was reverted. Only transactions included in blocks post-Byzantium Hard Fork have this property.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/signer/README.md b/docs/v5/api/signer/README.md new file mode 100644 index 000000000..7c7bdb3f3 --- /dev/null +++ b/docs/v5/api/signer/README.md @@ -0,0 +1,327 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Signers +======= + +Signer +------ + +#### *signer* . **connect**( provider ) => *[Signer](/v5/api/signer/#Signer)* + +Sub-classes **must** implement this, however they may simply throw an error if changing providers is not supported. + + +#### *signer* . **getAddress**( ) => *Promise< string< [Address](/v5/api/utils/address/#address) > >* + +Returns a Promise that resolves to the account address. + +This is a Promise so that a **Signer** can be designed around an asynchronous source, such as hardware wallets. + +Sub-classes **must** implement this. + + +#### *Signer* . **isSigner**( object ) => *boolean* + +Returns true if an only if *object* is a **Signer**. + + +### Blockchain Methods + +#### *signer* . **getBalance**( [ blockTag = "latest" ] ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +Returns the balance of this wallet at *blockTag*. + + +#### *signer* . **getChainId**( ) => *Promise< number >* + +Returns ths chain ID this wallet is connected to. + + +#### *signer* . **getGasPrice**( ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +Returns the current gas price. + + +#### *signer* . **getTransactionCount**( [ blockTag = "latest" ] ) => *Promise< number >* + +Returns the number of transactions this account has ever sent. This is the value required to be included in transactions as the `nonce`. + + +#### *signer* . **call**( transactionRequest ) => *Promise< string< [DataHexString](/v5/api/utils/bytes/#DataHexString) > >* + +Returns the result of calling using the *transactionRequest*, with this account address being used as the `from` field. + + +#### *signer* . **estimateGas**( transactionRequest ) => *Promise< [BigNumber](/v5/api/utils/bignumber/) >* + +Returns the result of estimating the cost to send the *transactionRequest*, with this account address being used as the `from` field. + + +#### *signer* . **resolveName**( ensName ) => *Promise< string< [Address](/v5/api/utils/address/#address) > >* + +Returns the address associated with the *ensName*. + + +### Signing + +#### *signer* . **signMessage**( message ) => *Promise< string< [RawSignature](/v5/api/utils/bytes/#signature-raw) > >* + +This returns a Promise which resolves to the [Raw Signature](/v5/api/utils/bytes/#signature-raw) of *message*. + +Sub-classes **must** implement this, however they may throw if signing a message is not supported, such as in a Contract-based Wallet or Meta-Transaction-based Wallet. + + +#### Note + +If *message* is a string, it is **treated as a string** and converted to its representation in UTF8 bytes. + +**If and only if** a message is a [Bytes](/v5/api/utils/bytes/#Bytes) will it be treated as binary data. + +For example, the string `"0x1234"` is 6 characters long (and in this case 6 bytes long). This is **not** equivalent to the array `[ 0x12, 0x34 ]`, which is 2 bytes long. + +A common case is to sign a hash. In this case, if the hash is a string, it **must** be converted to an array first, using the [arrayify](/v5/api/utils/bytes/#utils-arrayify) utility function. + + + + + +#### *signer* . **signTransaction**( transactionRequest ) => *Promise< string< [DataHexString](/v5/api/utils/bytes/#DataHexString) > >* + +Returns a Promise which resolves to the signed transaction of the *transactionRequest*. This method does not populate any missing fields. + +Sub-classes **must** implement this, however they may throw if signing a transaction is not supported, which is common for security reasons in many clients. + + +#### *signer* . **sendTransaction**( transactionRequest ) => *Promise< [TransactionResponse](/v5/api/providers/types/#providers-TransactionResponse) >* + +This method populates the transactionRequest with missing fields, using [populateTransaction](/v5/api/signer/#Signer-populateTransaction) and returns a Promise which resolves to the transaction. + +Sub-classes **must** implement this, however they may throw if sending a transaction is not supported, such as the [VoidSigner](/v5/api/signer/#VoidSigner) or if the Wallet is offline and not connected to a [Provider](/v5/api/providers/provider/). + + +### Sub-Classes + +#### *signer* . **checkTransaction**( transactionRequest ) => *[TransactionRequest](/v5/api/providers/types/#providers-TransactionRequest)* + +This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes. + +This should return a **copy** of the *transactionRequest*, with any properties needed by `call`, `estimateGas` and `populateTransaction` (which is used by sendTransaction). It should also throw an error if any unknown key is specified. + +The default implementation checks only valid [TransactionRequest](/v5/api/providers/types/#providers-TransactionRequest) properties exist and adds `from` to the transaction if it does not exist. + +If there is a `from` field it **must** be verified to be equal to the Signer's address. + + +#### *signer* . **populateTransaction**( transactionRequest ) => *Promise< [TransactionRequest](/v5/api/providers/types/#providers-TransactionRequest) >* + +This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes. + +This should return a **copy** of *transactionRequest*, follow the same procedure as `checkTransaction` and fill in any properties required for sending a transaction. The result should have all promises resolved; if needed the [resolveProperties](/v5/api/utils/properties/#utils-resolveproperties) utility function can be used for this. + +The default implementation calls `checkTransaction` and resolves to if it is an ENS name, adds `gasPrice`, `nonce`, `gasLimit` and `chainId` based on the related operations on Signer. + + +Wallet +------ + +#### **new ***ethers* . **Wallet**( privateKey [ , provider ] ) + +Create a new Wallet instance for *privateKey* and optionally connected to the *provider*. + + +#### *ethers* . *Wallet* . **createRandom**( [ options = {} ] ) => *[Wallet](/v5/api/signer/#Wallet)* + +Returns a new Wallet with a random private key, generated from cryptographically secure entropy sources. If the current environment does not have a secure entropy source, an error is thrown. + +Wallets created using this method will have a mnemonic. + + +#### *ethers* . *Wallet* . **fromEncryptedJson**( json , password [ , progress ] ) => *Promise< [Wallet](/v5/api/signer/#Wallet) >* + +Create an instance from an encrypted JSON wallet. + +If *progress* is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion. + + +#### *ethers* . *Wallet* . **fromEncryptedJsonSync**( json , password ) => *[Wallet](/v5/api/signer/#Wallet)* + +Create an instance from an encrypted JSON wallet. + +This operation will operate synchronously which will lock up the user interface, possibly for a non-trivial duration. Most applications should use the asynchronous `fromEncryptedJson` instead. + + +#### *ethers* . *Wallet* . **fromMnemonic**( mnemonic [ , path , [ wordlist ] ] ) => *[Wallet](/v5/api/signer/#Wallet)* + +Create an instance from a mnemonic phrase. + +If path is not specified, the Ethereum default path is used (i.e. `m/44'/60'/0'/0/0`). + +If wordlist is not specified, the English Wordlist is used. + + +### Properties + +#### *wallet* . **address** => *string< [Address](/v5/api/utils/address/#address) >* + +The address for the account this Wallet represents. + + +#### *wallet* . **provider** => *[Provider](/v5/api/providers/provider/)* + +The provider this wallet is connected to, which will ge used for any [Blockchain Methods](/v5/api/signer/#Signer--blockchain-methods) methods. This can be null. + + +#### 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. + + +#### *wallet* . **publicKey** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 65 > >* + +The uncompressed public key for this Wallet represents. + + +### Methods + +#### *wallet* . **encrypt**( password , [ options = {} , [ progress ] ] ) => *Promise< string >* + +Encrypt the wallet using *password* returning a Promise which resolves to a JSON wallet. + +If *progress* is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion. + + +```javascript +// Create a wallet instance from a mnemonic... +mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" +walletMnemonic = Wallet.fromMnemonic(mnemonic) + +// ...or from a private key +walletPrivateKey = new Wallet(walletMnemonic.privateKey) + +walletMnemonic.address === walletPrivateKey.address +//! + +// The address as a Promise per the Signer API +walletMnemonic.getAddress() +//! + +// A Wallet address is also available synchronously +walletMnemonic.address +//! + +// The internal cryptographic components +walletMnemonic.privateKey +//! +walletMnemonic.publicKey +//! + +// The wallet mnemonic +walletMnemonic.mnemonic +//! + +// Note: A wallet created with a private key does not +// have a mnemonic (the derivation prevents it) +walletPrivateKey.mnemonic +//! + +// Signing a message +walletMnemonic.signMessage("Hello World") +//! + +tx = { + to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72", + value: utils.parseEther("1.0") +} + +// Signing a transaction +walletMnemonic.signTransaction(tx) +//! + +// The connect method returns a new instance of the +// Wallet connected to a provider +wallet = walletMnemonic.connect(provider) + +// Querying the network +wallet.getBalance(); +//! +wallet.getTransactionCount(); +//! + +// Sending ether +wallet.sendTransaction(tx) +// +//! error +// +``` + +VoidSigner +---------- + +#### **new ***ethers* . **VoidSigner**( address [ , provider ] ) => *[VoidSigner](/v5/api/signer/#VoidSigner)* + +Create a new instance of a **VoidSigner** for *address*. + + +#### *voidSigner* . **address** => *string< [Address](/v5/api/utils/address/#address) >* + +The address of this **VoidSigner**. + + +```javascript +address = "0x8ba1f109551bD432803012645Ac136ddd64DBA72" +signer = new ethers.VoidSigner(address, provider) + +// The DAI token contract +abi = [ + "function balanceOf(address) view returns (uint)", + "function transfer(address, uint) returns (bool)" +] +contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer) + +// +//! +// +// Get the number of tokens for this account +tokens = await contract.balanceOf(signer.getAddress()) +//! async tokens + +// +// Pre-flight (check for revert) on DAI from the signer +// +// Note: We do not have the private key at this point, this +// simply allows us to check what would happen if we +// did. This can be useful to check before prompting +// a request in the UI +// + +// This will pass since the token balance is available +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 +``` + +ExternallyOwnedAccount +---------------------- + +#### *eoa* . **address** => *string< [Address](/v5/api/utils/address/#address) >* + +The [Address](/v5/api/utils/address/#address) of this EOA. + + +#### *eoa* . **privateKey** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The privateKey of this EOA + + +#### *eoa* . **mnemonic** => *[Mnemonic](/v5/api/utils/hdnode/#Mnemonic)* + +*Optional*. The account HD mnemonic, if it has one and can be determined. Some sources do not encode the mnemonic, such as an HD extended keys. + + diff --git a/docs/v5/api/signer/index.html b/docs/v5/api/signer/index.html new file mode 100644 index 000000000..54f8e4a02 --- /dev/null +++ b/docs/v5/api/signer/index.html @@ -0,0 +1,254 @@ + + + + Signers + + + + +
+ + +

Signers

A Signer in ethers is an abstraction of an Ethereum Account, which can be used to sign messages and transactions and send signed transactions to the Ethereum Network to execute state changing operations.

+ +

The available operations depends largely on the sub-class used.

+ +

For example, a Signer from MetaMask can send transactions and sign messages but cannot sign a transaction (without broadcasting it).

+ +

The most common Signers you will encounter are:

+ +

+ +

Signer

The Signer class is abstract and cannot be directly instaniated.

+ +

Instead use one of the concreate sub-classes, such as the Wallet, VoidSigner or JsonRpcSigner.

+ +
signer.connect( provider ) Signer

Sub-classes must implement this, however they may simply throw an error if changing providers is not supported.

+ +
signer.getAddress( ) Promise< string< Address > >

Returns a Promise that resolves to the account address.

+ +

This is a Promise so that a Signer can be designed around an asynchronous source, such as hardware wallets.

+ +

Sub-classes must implement this.

+ +
Signer.isSigner( object ) boolean

Returns true if an only if object is a Signer.

+ +

Blockchain Methods

+
signer.getBalance( [ blockTag = "latest" ] ) Promise< BigNumber >

Returns the balance of this wallet at blockTag.

+ +
signer.getChainId( ) Promise< number >

Returns ths chain ID this wallet is connected to.

+ +
signer.getGasPrice( ) Promise< BigNumber >

Returns the current gas price.

+ +
signer.getTransactionCount( [ blockTag = "latest" ] ) Promise< number >

Returns the number of transactions this account has ever sent. This is the value required to be included in transactions as the nonce.

+ +
signer.call( transactionRequest ) Promise< string< DataHexString > >

Returns the result of calling using the transactionRequest, with this account address being used as the from field.

+ +
signer.estimateGas( transactionRequest ) Promise< BigNumber >

Returns the result of estimating the cost to send the transactionRequest, with this account address being used as the from field.

+ +
signer.resolveName( ensName ) Promise< string< Address > >

Returns the address associated with the ensName.

+ +

Signing

+
signer.signMessage( message ) Promise< string< RawSignature > >

This returns a Promise which resolves to the Raw Signature of message.

+ +

Sub-classes must implement this, however they may throw if signing a message is not supported, such as in a Contract-based Wallet or Meta-Transaction-based Wallet.

+ +
Note

If message is a string, it is treated as a string and converted to its representation in UTF8 bytes.

+ +

If and only if a message is a Bytes will it be treated as binary data.

+ +

For example, the string "0x1234" is 6 characters long (and in this case 6 bytes long). This is not equivalent to the array [ 0x12, 0x34 ], which is 2 bytes long.

+ +

A common case is to sign a hash. In this case, if the hash is a string, it must be converted to an array first, using the arrayify utility function.

+ +
+
signer.signTransaction( transactionRequest ) Promise< string< DataHexString > >

Returns a Promise which resolves to the signed transaction of the transactionRequest. This method does not populate any missing fields.

+ +

Sub-classes must implement this, however they may throw if signing a transaction is not supported, which is common for security reasons in many clients.

+ +
signer.sendTransaction( transactionRequest ) Promise< TransactionResponse >

This method populates the transactionRequest with missing fields, using populateTransaction and returns a Promise which resolves to the transaction.

+ +

Sub-classes must implement this, however they may throw if sending a transaction is not supported, such as the VoidSigner or if the Wallet is offline and not connected to a Provider.

+ +

Sub-Classes

It is very important that all important properties of a Signer are immutable. Since Ethereum is very asynchronous and deals with critical data (such as ether and other potentially valuable crypto assets), keeping 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().

+ +
signer.checkTransaction( transactionRequest ) TransactionRequest

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

+ +

This should return a copy of the transactionRequest, with any properties needed by call, estimateGas and populateTransaction (which is used by sendTransaction). It should also throw an error if any unknown key is specified.

+ +

The default implementation checks only valid TransactionRequest properties exist and adds from to the transaction if it does not exist.

+ +

If there is a from field it must be verified to be equal to the Signer's address.

+ +
signer.populateTransaction( transactionRequest ) Promise< TransactionRequest >

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

+ +

This should return a copy of transactionRequest, follow the same procedure as checkTransaction and fill in any properties required for sending a transaction. The result should have all promises resolved; if needed the resolveProperties utility function can be used for this.

+ +

The default implementation calls checkTransaction and resolves to if it is an ENS name, adds gasPrice, nonce, gasLimit and chainId based on the related operations on Signer.

+ +

The Wallet class inherits Signer and can sign transactions and messages using a private key as a standard Externally Owned Account (EOA).

+ +
new ethers.Wallet( privateKey [ , provider ] )

Create a new Wallet instance for privateKey and optionally connected to the provider.

+ +
ethers.Wallet.createRandom( [ options = {} ] ) Wallet

Returns a new Wallet with a random private key, generated from cryptographically secure entropy sources. If the current environment does not have a secure entropy source, an error is thrown.

+ +

Wallets created using this method will have a mnemonic.

+ +
ethers.Wallet.fromEncryptedJson( json , password [ , progress ] ) Promise< Wallet >

Create an instance from an encrypted JSON wallet.

+ +

If progress is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion.

+ +
ethers.Wallet.fromEncryptedJsonSync( json , password ) Wallet

Create an instance from an encrypted JSON wallet.

+ +

This operation will operate synchronously which will lock up the user interface, possibly for a non-trivial duration. Most applications should use the asynchronous fromEncryptedJson instead.

+ +
ethers.Wallet.fromMnemonic( mnemonic [ , path , [ wordlist ] ] ) Wallet

Create an instance from a mnemonic phrase.

+ +

If path is not specified, the Ethereum default path is used (i.e. m/44'/60'/0'/0/0).

+ +

If wordlist is not specified, the English Wordlist is used.

+ +

Properties

+
wallet.address string< Address >

The address for the account this Wallet represents.

+ +
wallet.provider Provider

The provider this wallet is connected to, which will ge used for any Blockchain Methods methods. This can be null.

+ +
Note

A Wallet instance is immuatable, so if you wish to change the Provider, you may use the connect method to create a new instance connected to the desired provider.

+ +
wallet.publicKey string< DataHexString< 65 > >

The uncompressed public key for this Wallet represents.

+ +

Methods

+
wallet.encrypt( password , [ options = {} , [ progress ] ] ) Promise< string >

Encrypt the wallet using password returning a Promise which resolves to a JSON wallet.

+ +

If progress is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion.

+ +
Wallet Examples
// Create a wallet instance from a mnemonic... +mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" +walletMnemonic = Wallet.fromMnemonic(mnemonic) + +// ...or from a private key +walletPrivateKey = new Wallet(walletMnemonic.privateKey) + +walletMnemonic.address === walletPrivateKey.address +//! + +// The address as a Promise per the Signer API +walletMnemonic.getAddress() +//! + +// A Wallet address is also available synchronously +walletMnemonic.address +//! + +// The internal cryptographic components +walletMnemonic.privateKey +//! +walletMnemonic.publicKey +//! + +// The wallet mnemonic +walletMnemonic.mnemonic +//! + +// Note: A wallet created with a private key does not +// have a mnemonic (the derivation prevents it) +walletPrivateKey.mnemonic +//! + +// Signing a message +walletMnemonic.signMessage("Hello World") +//! + +tx = { + to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72", + value: utils.parseEther("1.0") +} + +// Signing a transaction +walletMnemonic.signTransaction(tx) +//! + +// The connect method returns a new instance of the +// Wallet connected to a provider +wallet = walletMnemonic.connect(provider) + +// Querying the network +wallet.getBalance(); +//! +wallet.getTransactionCount(); +//! + +// Sending ether +wallet.sendTransaction(tx) +// <hide> +//! error +// </hide>

VoidSigner inherits Signer

A VoidSigner is a simple Signer which cannot sign.

+ +

It is useful as a read-only signer, when an API requires a Signer as a parameter, but it is known only read-only operations will be carried.

+ +

For example, the call operation will automatically have the provided address passed along during the execution.

+ +
new ethers.VoidSigner( address [ , provider ] ) VoidSigner

Create a new instance of a VoidSigner for address.

+ +
voidSigner.address string< Address >

The address of this VoidSigner.

+ +
VoidSigner Pre-flight Example
address = "0x8ba1f109551bD432803012645Ac136ddd64DBA72" +signer = new ethers.VoidSigner(address, provider) + +// The DAI token contract +abi = [ + "function balanceOf(address) view returns (uint)", + "function transfer(address, uint) returns (bool)" +] +contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer) + +// <hide> +//! +// </hide> +// Get the number of tokens for this account +tokens = await contract.balanceOf(signer.getAddress()) +//! async tokens + +// +// Pre-flight (check for revert) on DAI from the signer +// +// Note: We do not have the private key at this point, this +// simply allows us to check what would happen if we +// did. This can be useful to check before prompting +// a request in the UI +// + +// This will pass since the token balance is available +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

ExternallyOwnedAccount

This is an interface which contains a minimal set of properties required for Externally Owned Accounts which can have certain operations performed, such as encoding as a JSON wallet.

+ +
eoa.address string< Address >

The Address of this EOA.

+ +
eoa.privateKey string< DataHexString< 32 > >

The privateKey of this EOA

+ +
eoa.mnemonic Mnemonic

Optional. The account HD mnemonic, if it has one and can be determined. Some sources do not encode the mnemonic, such as an HD extended keys.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/README.md b/docs/v5/api/utils/README.md new file mode 100644 index 000000000..a7d5a6a58 --- /dev/null +++ b/docs/v5/api/utils/README.md @@ -0,0 +1,91 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Utilities +========= + +* [Application Binary Interface](abi) + * [Interface](abi/interface) + * [Creating Instances](abi/interface) + * [Properties](abi/interface) + * [Formatting](abi/interface) + * [Fragment Access](abi/interface) + * [Signature and Topic Hashes](abi/interface) + * [Encoding Data](abi/interface) + * [Decoding Data](abi/interface) + * [Parsing](abi/interface) + * [Types](abi/interface) + * [Specifying Fragments](abi/interface) + * [Fragments](abi/fragments) + * [Formats](abi/fragments) + * [Fragment](abi/fragments) + * [ConstructorFragment](abi/fragments) + * [EventFragment](abi/fragments) + * [FunctionFragment](abi/fragments) + * [ParamType](abi/fragments) +* [Addresses](address) + * [Address Formats](address) + * [Converting and Verifying](address) + * [Derivation](address) + * [Contracts Addresses](address) +* [BigNumber](bignumber) + * [Types](bignumber) + * [Creating Instances](bignumber) + * [Methods](bignumber) + * [Notes](bignumber) +* [Byte Manipulation](bytes) + * [Types](bytes) + * [Inspection](bytes) + * [Converting between Arrays and Hexstrings](bytes) + * [Array Manipulation](bytes) + * [Hexstring Manipulation](bytes) + * [Signature Conversion](bytes) + * [Random Bytes](bytes) +* [Constants](constants) + * [Bytes](constants) + * [Strings](constants) + * [BigNumber](constants) +* [Display Logic and Input](display-logic) + * [Units](display-logic) + * [Functions](display-logic) +* [Encoding Utilities](encoding) + * [Base58](encoding) + * [Base64](encoding) + * [Recursive-Length Prefix](encoding) +* [FixedNumber](fixednumber) + * [Creating Instances](fixednumber) + * [Properties](fixednumber) + * [Methods](fixednumber) + * [FixedFormat](fixednumber) +* [Hashing Algorithms](hashing) + * [Cryptographic Hash Functions](hashing) + * [HMAC](hashing) + * [Hashing Helpers](hashing) + * [Solidity Hashing Algorithms](hashing) +* [HD Wallet](hdnode) + * [Types](hdnode) + * [HDNode](hdnode) + * [Other Functions](hdnode) +* [Logging](logger) + * [Logger](logger) + * [Errors](logger) + * [Log Levels](logger) +* [Property Utilities](properties) +* [Signing Key](signing-key) + * [Other Functions](signing-key) +* [Strings](strings) + * [Bytes32String](strings) + * [UTF-8 Strings](strings) + * [UnicodeNormalizationForm](strings) + * [Custom UTF-8 Error Handling](strings) +* [Transactions](transactions) + * [Types](transactions) + * [Functions](transactions) +* [Web Utilities](web) +* [Wordlists](wordlists) + * [Wordlist](wordlists) + * [Languages](wordlists) + diff --git a/docs/v5/api/utils/abi/README.md b/docs/v5/api/utils/abi/README.md new file mode 100644 index 000000000..cdaf67751 --- /dev/null +++ b/docs/v5/api/utils/abi/README.md @@ -0,0 +1,28 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Application Binary Interface +============================ + +* [Interface](interface) + * [Creating Instances](interface) + * [Properties](interface) + * [Formatting](interface) + * [Fragment Access](interface) + * [Signature and Topic Hashes](interface) + * [Encoding Data](interface) + * [Decoding Data](interface) + * [Parsing](interface) + * [Types](interface) + * [Specifying Fragments](interface) +* [Fragments](fragments) + * [Formats](fragments) + * [Fragment](fragments) + * [ConstructorFragment](fragments) + * [EventFragment](fragments) + * [FunctionFragment](fragments) + * [ParamType](fragments) + diff --git a/docs/v5/api/utils/abi/fragments/README.md b/docs/v5/api/utils/abi/fragments/README.md new file mode 100644 index 000000000..55bc218d5 --- /dev/null +++ b/docs/v5/api/utils/abi/fragments/README.md @@ -0,0 +1,236 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Fragments +========= + +Formats +------- + +### JSON String ABI (Solidity Output JSON) + +### Humanb-Readable ABI + +### Output Formats + +#### *ethers* . *utils* . *FragmentTypes* . **full** => *string* + +This is a full human-readable string, including all parameter names, any optional modifiers (e.g. `indexed`, `public`, etc) and white-space to aid in human readabiliy. + + +#### *ethers* . *utils* . *FragmentTypes* . **minimal** => *string* + +This is similar to `full`, except with no unnecessary whitespace or parameter names. This is useful for storing a minimal string which can still fully reconstruct the original Fragment using [Fragment . from](/v5/api/utils/abi/fragments/#Fragment-from). + + +#### *ethers* . *utils* . *FragmentTypes* . **json** => *string* + +This returns a JavaScript Object which is safe to call `JSON.stringify` on to create a JSON string. + + +#### *ethers* . *utils* . *FragmentTypes* . **sighash** => *string* + +This is a minimal output format, which is used by Solidity when computing a signature hash or an event topic hash. + + +#### Note + +The `sighash` format is **insufficient** to re-create the original [Fragment](/v5/api/utils/abi/fragments/#Fragment), since it discards modifiers such as indexed, anonymous, stateMutability, etc. + + +Fragment +-------- + +### Properties + +#### *fragment* . **name** => *string* + +This is the name of the Event or Function. This will be null for a [ConstructorFragment](/v5/api/utils/abi/fragments/#ConstructorFragment). + + +#### *fragment* . **type** => *string* + +This is a string which indicates the type of the [Fragment](/v5/api/utils/abi/fragments/#Fragment). This will be one of: + +- `constructor` +- `event` +- `function` + + + + +#### *fragment* . **inputs** => *Array< [ParamType](/v5/api/utils/abi/fragments/#ParamType) >* + +This is an array of of each [ParamType](/v5/api/utils/abi/fragments/#ParamType) for the input parameters to the Constructor, Event of Function. + + +### Methods + +#### *ethers* . *utils* . *Fragment* . **from**( objectOrString ) => *[Fragment](/v5/api/utils/abi/fragments/#Fragment)* + +Returns a + + +#### *ethers* . *utils* . *Fragment* . **isFragment**( object ) => *boolean* + +Tra lal al + + +ConstructorFragment +------------------- + +### Properties + +#### *fragment* . **gas** => *[BigNumber](/v5/api/utils/bignumber/)* + +This is the gas limit that should be used during deployment. It may be null. + + +#### *fragment* . **payable** => *boolean* + +This is whether the constructor may receive ether during deployment as an endowment (i.e. msg.value != 0). + + +#### *fragment* . **stateMutability** => *string* + +This is the state mutability of the constructor. It can be any of: + +- `nonpayable` +- `payable` + + + + +### Methods + +#### *ethers* . *utils* . *ConstructorFragment* . **from**( objectOrString ) => *[ConstructorFragment](/v5/api/utils/abi/fragments/#ConstructorFragment)* + +Tra la la... + + +#### *ethers* . *utils* . *ConstructorFragment* . **isConstructorFragment**( object ) => *boolean* + +Tra lal al + + +EventFragment +------------- + +### Properties + +#### *fragment* . **anonymous** => *boolean* + +This is whether the event is anonymous. An anonymous Event does not inject its topic hash as topic0 when creating a log. + + +### Methods + +#### *ethers* . *utils* . *EventFragment* . **from**( objectOrString ) => *[EventFragment](/v5/api/utils/abi/fragments/#EventFragment)* + +Tra la la... + + +#### *ethers* . *utils* . *EventFragment* . **isEventFragment**( object ) => *boolean* + +Tra lal al + + +FunctionFragment +---------------- + +### Properties + +#### *fragment* . **constant** => *boolean* + +This is whether the function is constant (i.e. does not change state). This is true if the state mutability is `pure` or `view`. + + +#### *fragment* . **stateMutability** => *string* + +This is the state mutability of the constructor. It can be any of: + +- `nonpayable` +- `payable` +- `pure` +- `view` + + + + +#### *fragment* . **outputs** => *Array< [ParamType](/v5/api/utils/abi/fragments/#ParamType) >* + +A list of the Function output parameters. + + +### Method + +#### *ethers* . *utils* . *FunctionFragment* . **from**( objectOrString ) => *[FunctionFragment](/v5/api/utils/abi/fragments/#FunctionFragment)* + +Tra la la... + + +#### *ethers* . *utils* . *FunctionFragment* . **isFunctionFragment**( object ) => *boolean* + +Tra lal al + + +ParamType +--------- + +### Properties + +#### *paramType* . **name** => *string* + +The local parameter name. This may be null for unnamed parameters. For example, the parameter definition `string foobar` would be `foobar`. + + +#### *paramType* . **type** => *string* + +The full type of the parameter, including tuple and array symbols. This may be null for unnamed parameters. For the above example, this would be `foobar`. + + +#### *paramType* . **baseType** => *string* + +The base type of the parameter. For primitive types (e.g. `address`, `uint256`, etc) this is equal to [type](/v5/api/utils/abi/fragments/#ParamType-type). For arrays, it will be the string `array` and for a tuple, it will be the string `tuple`. + + +#### *paramType* . **indexed** => *boolean* + +Whether the parameter has been marked as indexed. This **only** applies to parameters which are part of an [EventFragment](/v5/api/utils/abi/fragments/#EventFragment). + + +#### *paramType* . **arrayChildren** => *[ParamType](/v5/api/utils/abi/fragments/#ParamType)* + +The type of children of the array. This is null for for any parameter wjhich is not an array. + + +#### *paramType* . **arrayLength** => *number* + +The length of the array, or `-1` for dynamic-length arrays. This is null for parameters which is not arrays. + + +#### *paramType* . **components** => *Array< [ParamType](/v5/api/utils/abi/fragments/#ParamType) >* + +The components of a tuple. This is null for non-tuple parameters. + + +### Methods + +#### *paramType* . **format**( [ outputType = sighash ] ) + +Tra la la... + + +#### *ethers* . *utils* . *ParamType* . **from**( objectOrString ) => *[ParamType](/v5/api/utils/abi/fragments/#ParamType)* + +Tra la la... + + +#### *ethers* . *utils* . *ParamType* . **isParamType**( object ) => *boolean* + +Tra la la... + + diff --git a/docs/v5/api/utils/abi/fragments/index.html b/docs/v5/api/utils/abi/fragments/index.html new file mode 100644 index 000000000..dbc9ce248 --- /dev/null +++ b/docs/v5/api/utils/abi/fragments/index.html @@ -0,0 +1,138 @@ + + + + Fragments + + + + +
+ + +

Fragments

Explain an ABI.

+ +

Formats

+

JSON String ABI (Solidity Output JSON)

The JSON ABI Format is the format that is output from the Solidity compiler.

+ +

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 also be passed into any function which accepts a JSON String ABI.

+ +

Humanb-Readable ABI

The Human-Readable ABI was

+ +

article

+ +

Output Formats

Each Fragment and ParamType may be output using its format method.

+ +
ethers.utils.FragmentTypes.full string

This is a full human-readable string, including all parameter names, any optional modifiers (e.g. indexed, public, etc) and white-space to aid in human readabiliy.

+ +
ethers.utils.FragmentTypes.minimal string

This is similar to full, except with no unnecessary whitespace or parameter names. This is useful for storing a minimal string which can still fully reconstruct the original Fragment using Fragment&thinsp;.&thinsp;from.

+ +
ethers.utils.FragmentTypes.json string

This returns a JavaScript Object which is safe to call JSON.stringify on to create a JSON string.

+ +
ethers.utils.FragmentTypes.sighash string

This is a minimal output format, which is used by Solidity when computing a signature hash or an event topic hash.

+ +
Note

The sighash format is insufficient to re-create the original Fragment, since it discards modifiers such as indexed, anonymous, stateMutability, etc.

+ +

Fragment

An ABI is a collection of Fragments, where each fragment specifies:

+ +

+ +

Properties

+
fragment.name string

This is the name of the Event or Function. This will be null for a ConstructorFragment.

+ +
fragment.type string

This is a string which indicates the type of the Fragment. This will be one of:

+ +

  • constructor
  • event
  • function

+ +
fragment.inputs Array< ParamType >

This is an array of of each ParamType for the input parameters to the Constructor, Event of Function.

+ +

Methods

+
ethers.utils.Fragment.from( objectOrString ) Fragment

Returns a

+ +
ethers.utils.Fragment.isFragment( object ) boolean

Tra lal al

+ +

ConstructorFragment inherits Fragment

+

Properties

+
fragment.gas BigNumber

This is the gas limit that should be used during deployment. It may be null.

+ +
fragment.payable boolean

This is whether the constructor may receive ether during deployment as an endowment (i.e. msg.value != 0).

+ +
fragment.stateMutability string

This is the state mutability of the constructor. It can be any of:

+ +

  • nonpayable
  • payable

+ +

Methods

+
ethers.utils.ConstructorFragment.from( objectOrString ) ConstructorFragment

Tra la la...

+ +
ethers.utils.ConstructorFragment.isConstructorFragment( object ) boolean

Tra lal al

+ +

EventFragment inherits Fragment

+

Properties

+
fragment.anonymous boolean

This is whether the event is anonymous. An anonymous Event does not inject its topic hash as topic0 when creating a log.

+ +

Methods

+
ethers.utils.EventFragment.from( objectOrString ) EventFragment

Tra la la...

+ +
ethers.utils.EventFragment.isEventFragment( object ) boolean

Tra lal al

+ +

FunctionFragment inherits ConstructorFragment

+

Properties

+
fragment.constant boolean

This is whether the function is constant (i.e. does not change state). This is true if the state mutability is pure or view.

+ +
fragment.stateMutability string

This is the state mutability of the constructor. It can be any of:

+ +

  • nonpayable
  • payable
  • pure
  • view

+ +
fragment.outputs Array< ParamType >

A list of the Function output parameters.

+ +

Method

+
ethers.utils.FunctionFragment.from( objectOrString ) FunctionFragment

Tra la la...

+ +
ethers.utils.FunctionFragment.isFunctionFragment( object ) boolean

Tra lal al

+ +

ParamType

The following examples will represent the Solidity parameter:

+ +

string foobar

+ +

Properties

+
paramType.name string

The local parameter name. This may be null for unnamed parameters. For example, the parameter definition string foobar would be foobar.

+ +
paramType.type string

The full type of the parameter, including tuple and array symbols. This may be null for unnamed parameters. For the above example, this would be foobar.

+ +
paramType.baseType string

The base type of the parameter. For primitive types (e.g. address, uint256, etc) this is equal to type. For arrays, it will be the string array and for a tuple, it will be the string tuple.

+ +
paramType.indexed boolean

Whether the parameter has been marked as indexed. This only applies to parameters which are part of an EventFragment.

+ +
paramType.arrayChildren ParamType

The type of children of the array. This is null for for any parameter wjhich is not an array.

+ +
paramType.arrayLength number

The length of the array, or -1 for dynamic-length arrays. This is null for parameters which is not arrays.

+ +
paramType.components Array< ParamType >

The components of a tuple. This is null for non-tuple parameters.

+ +

Methods

Tra la la...

+ +
paramType.format( [ outputType = sighash ] )

Tra la la...

+ +
ethers.utils.ParamType.from( objectOrString ) ParamType

Tra la la...

+ +
ethers.utils.ParamType.isParamType( object ) boolean

Tra la la...

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/abi/index.html b/docs/v5/api/utils/abi/index.html new file mode 100644 index 000000000..ef34a3fba --- /dev/null +++ b/docs/v5/api/utils/abi/index.html @@ -0,0 +1,35 @@ + + + + Application Binary Interface + + + + +
+ + +

Application Binary Interface

An Application Binary Interface (ABI) is a collection of Fragments which specify how to interact with various components of a Contract.

+ +

An Interface helps organize Fragments by type as well as provides the functionality required to encode, decode and work with each component.

+ +

Most developers will not require this low-level access to encoding and decoding the binary data on the network and will most likely use a Contract which provides a more convenient interface. Some framework, tool developers or developers using advanced techniques may find these classes and utilities useful.

+ + + + + +
+ + + diff --git a/docs/v5/api/utils/abi/interface/README.md b/docs/v5/api/utils/abi/interface/README.md new file mode 100644 index 000000000..9d6055954 --- /dev/null +++ b/docs/v5/api/utils/abi/interface/README.md @@ -0,0 +1,207 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Interface +========= + +Creating Instances +------------------ + +#### **new ***ethers* . *utils* . **Interface**( abi ) + +Create a new **Interface** from a JSON string or object representing *abi*. + +The *abi* may be a JSON string or the parsed Object (using JSON.parse) which is emitted by the [Solidity compiler](https://solidity.readthedocs.io/en/v0.6.0/using-the-compiler.html#output-description) (or compatible languages). + +The *abi* may also be a [Human-Readable Abi](https://blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917), which is a format the Ethers created to simplify manually typing the ABI into the source and so that a Contract ABI can also be referenced easily within the same source file. + + +Properties +---------- + +#### *interface* . **fragments** => *Array< [Fragment](/v5/api/utils/abi/fragments/#Fragment) >* + +All the [Fragments](/v5/api/utils/abi/fragments/#Fragment) in the interface. + + +#### *interface* . **events** => *Array< [EventFragment](/v5/api/utils/abi/fragments/#EventFragment) >* + +All the [Event Fragments](/v5/api/utils/abi/fragments/#EventFragment) in the interface. + + +#### *interface* . **functions** => *Array< [FunctionFragment](/v5/api/utils/abi/fragments/#FunctionFragment) >* + +All the [Function Fragments](/v5/api/utils/abi/fragments/#FunctionFragment) in the interface. + + +#### *interface* . **deploy** => *[ConstructorFragment](/v5/api/utils/abi/fragments/#ConstructorFragment)* + +The [Constructor Fragments](/v5/api/utils/abi/fragments/#ConstructorFragment) for the interface. + + +Formatting +---------- + +#### *interface* . **format**( [ format ] ) => *string | Array< string >* + +Return the formatted **Interface**. If the format type is `json` a single string is returned, otherwise an Array of the human-readable strings is returned. + + +Fragment Access +--------------- + +#### *interface* . **getFunction**( fragment ) => *[FunctionFragment](/v5/api/utils/abi/fragments/#FunctionFragment)* + +Returns the [FunctionFragment](/v5/api/utils/abi/fragments/#FunctionFragment) for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)). + + +#### *interface* . **getEvent**( fragment ) => *[EventFragment](/v5/api/utils/abi/fragments/#EventFragment)* + +Returns the [EventFragment](/v5/api/utils/abi/fragments/#EventFragment) for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)). + + +Signature and Topic Hashes +-------------------------- + +#### *interface* . **getSighash**( fragment ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 4 > >* + +Return the sighash (or Function Selector) for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)). + + +#### *interface* . **getEventTopic**( fragment ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Return the topic hash for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)). + + +Encoding Data +------------- + +#### *interface* . **encodeDeploy**( [ values ] ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Return the encoded deployment data, which can be concatenated to the deployment bytecode of a contract to pass *values* into the contract constructor. + + +#### *interface* . **encodeFilterTopics**( fragment [ , values ] ) => *Array< topic | Array< topic > >* + +Returns the encoded topic filter, which can be passed to getLogs for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *values*. + +Each *topic* is a 32 byte (64 nibble) [DataHexString](/v5/api/utils/bytes/#DataHexString). + + +#### *interface* . **encodeFunctionData**( fragment [ , values ] ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Returns the encoded data, which can be used as the data for a transaction for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *values*. + + +#### *interface* . **encodeFunctionResult**( fragment [ , values ] ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Returns the encoded result, which would normally be the response from a call for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *values*. + +Most developers will not need this method, but may be useful for authors of a mock blockchain. + + +Decoding Data +------------- + +#### *interface* . **decodeEventLog**( fragment , data [ , topics ] ) => *[Result](/v5/api/utils/abi/interface/#Result)* + +Returns the decoded event values from an event log for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *data* with the optional *topics*. + +If *topics* is not specified, placeholders will be inserted into the result. + + +#### *interface* . **decodeFunctionData**( fragment , data ) => *[Result](/v5/api/utils/abi/interface/#Result)* + +Returns the decoded values from transaction data for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *data*. + +Most developers will not need this method, but may be useful for debugging or inspecting transactions. + + +#### *interface* . **decodeFunctionResult**( fragment , data ) => *[Result](/v5/api/utils/abi/interface/#Result)* + +Returns the decoded values from the result of a call for *fragment* (see [Specifying Fragments](/v5/api/utils/abi/interface/#Interface--specifying-fragments)) for the given *data*. + + +Parsing +------- + +#### *interface* . **parseLog**( log ) => *[LogDescription](/v5/api/utils/abi/interface/#LogDescription)* + +Search the event that matches the *log* topic hash and parse the values the log represents. + + +#### *interface* . **parseTransaction**( transaction ) => *[TransactionDescription](/v5/api/utils/abi/interface/#TransactionDescription)* + +Search for the function that matches the *transaction* data sighash and parse the transaction properties. + + +Types +----- + +### Result + +### LogDescription + +#### *logDescription* . **args** => *[Result](/v5/api/utils/abi/interface/#Result)* + +The values of the input parameters of the event. + + +#### *logDescription* . **eventFragment** => *[EventFragment](/v5/api/utils/abi/fragments/#EventFragment)* + +The [EventFragment](/v5/api/utils/abi/fragments/#EventFragment) which matches the topic in the Log. + + +#### *logDescription* . **name** => *string* + +The event name. (e.g. `Transfer`) + + +#### *logDescription* . **signature** => *string* + +The event signature. (e.g. `Transfer(address,address,uint256)`) + + +#### *logDescription* . **topic** => *string* + +The topic hash. + + +### TransactionDescription + +#### *transactionDescription* . **args** => *[Result](/v5/api/utils/abi/interface/#Result)* + +The decoded values from the transaction data which were passed as the input parameters. + + +#### *transactionDescription* . **functionFragment** => *[FunctionFragment](/v5/api/utils/abi/fragments/#FunctionFragment)* + +The [FunctionFragment](/v5/api/utils/abi/fragments/#FunctionFragment) which matches the sighash in the transaction data. + + +#### *transactionDescription* . **name** => *string* + +The name of the function. (e.g. `transfer`) + + +#### *transactionDescription* . **sighash** => *string* + +The sighash (or function selector) that matched the transaction data. + + +#### *transactionDescription* . **signature** => *string* + +The signature of the function. (e.g. `transfer(address,uint256)`) + + +#### *transactionDescription* . **value** => *[BigNumber](/v5/api/utils/bignumber/)* + +The value from the transaction. + + +Specifying Fragments +-------------------- + diff --git a/docs/v5/api/utils/abi/interface/index.html b/docs/v5/api/utils/abi/interface/index.html new file mode 100644 index 000000000..9389a940f --- /dev/null +++ b/docs/v5/api/utils/abi/interface/index.html @@ -0,0 +1,129 @@ + + + + Interface + + + + +
+ + +

Interface

The Interface Class abstracts the encoding and decoding required to interact with contracts on the Ethereum network.

+ +

Many of the standards organically evolved along side the Solidity language, which other languages have adopted to remain compatibile with existing deployed contracts.

+ +

The EVM itself does not understand what the ABI is. It is simply an agreed upon set of formats to encode various types of data which each contract can expect so they can interoperate with each other.

+ +

Creating Instances

+
new ethers.utils.Interface( abi )

Create a new Interface from a JSON string or object representing abi.

+ +

The abi may be a JSON string or the parsed Object (using JSON.parse) which is emitted by the Solidity compiler (or compatible languages).

+ +

The abi may also be a Human-Readable Abi, which is a format the Ethers created to simplify manually typing the ABI into the source and so that a Contract ABI can also be referenced easily within the same source file.

+ +

Properties

+
interface.fragments Array< Fragment >

All the Fragments in the interface.

+ +
interface.events Array< EventFragment >

All the Event Fragments in the interface.

+ +
interface.functions Array< FunctionFragment >

All the Function Fragments in the interface.

+ +
interface.deploy ConstructorFragment

The Constructor Fragments for the interface.

+ +

Formatting

+
interface.format( [ format ] ) string | Array< string >

Return the formatted Interface. If the format type is json a single string is returned, otherwise an Array of the human-readable strings is returned.

+ +

Fragment Access

+
interface.getFunction( fragment ) FunctionFragment

Returns the FunctionFragment for fragment (see Specifying Fragments).

+ +
interface.getEvent( fragment ) EventFragment

Returns the EventFragment for fragment (see Specifying Fragments).

+ +

Signature and Topic Hashes

+
interface.getSighash( fragment ) string< DataHexString< 4 > >

Return the sighash (or Function Selector) for fragment (see Specifying Fragments).

+ +
interface.getEventTopic( fragment ) string< DataHexString< 32 > >

Return the topic hash for fragment (see Specifying Fragments).

+ +

Encoding Data

+
interface.encodeDeploy( [ values ] ) string< DataHexString >

Return the encoded deployment data, which can be concatenated to the deployment bytecode of a contract to pass values into the contract constructor.

+ +
interface.encodeFilterTopics( fragment [ , values ] ) Array< topic | Array< topic > >

Returns the encoded topic filter, which can be passed to getLogs for fragment (see Specifying Fragments) for the given values.

+ +

Each topic is a 32 byte (64 nibble) DataHexString.

+ +
interface.encodeFunctionData( fragment [ , values ] ) string< DataHexString >

Returns the encoded data, which can be used as the data for a transaction for fragment (see Specifying Fragments) for the given values.

+ +
interface.encodeFunctionResult( fragment [ , values ] ) string< DataHexString >

Returns the encoded result, which would normally be the response from a call for fragment (see Specifying Fragments) for the given values.

+ +

Most developers will not need this method, but may be useful for authors of a mock blockchain.

+ +

Decoding Data

+
interface.decodeEventLog( fragment , data [ , topics ] ) Result

Returns the decoded event values from an event log for fragment (see Specifying Fragments) for the given data with the optional topics.

+ +

If topics is not specified, placeholders will be inserted into the result.

+ +
interface.decodeFunctionData( fragment , data ) Result

Returns the decoded values from transaction data for fragment (see Specifying Fragments) for the given data.

+ +

Most developers will not need this method, but may be useful for debugging or inspecting transactions.

+ +
interface.decodeFunctionResult( fragment , data ) Result

Returns the decoded values from the result of a call for fragment (see Specifying Fragments) for the given data.

+ +

Parsing

The functions are generally the most useful for most developers. They will automatically search the ABI for a matching Event or Function and decode the components as a fully specified description.

+ +
interface.parseLog( log ) LogDescription

Search the event that matches the log topic hash and parse the values the log represents.

+ +
interface.parseTransaction( transaction ) TransactionDescription

Search for the function that matches the transaction data sighash and parse the transaction properties.

+ +

Types

+

Result inherits Array<any>

A Result is an array, so each value can be accessed as a positional argument.

+ +

Additionally, if values are named, the identical object as its positional value can be accessed by its name.

+ +

The name length is however reserved as it is part of the Array, so any named value for this key is renamed to _length. If there is a name collision, only the first is available by its key.

+ +

LogDescription

+
logDescription.args Result

The values of the input parameters of the event.

+ +
logDescription.eventFragment EventFragment

The EventFragment which matches the topic in the Log.

+ +
logDescription.name string

The event name. (e.g. Transfer)

+ +
logDescription.signature string

The event signature. (e.g. Transfer(address,address,uint256))

+ +
logDescription.topic string

The topic hash.

+ +

TransactionDescription

+
transactionDescription.args Result

The decoded values from the transaction data which were passed as the input parameters.

+ +
transactionDescription.functionFragment FunctionFragment

The FunctionFragment which matches the sighash in the transaction data.

+ +
transactionDescription.name string

The name of the function. (e.g. transfer)

+ +
transactionDescription.sighash string

The sighash (or function selector) that matched the transaction data.

+ +
transactionDescription.signature string

The signature of the function. (e.g. transfer(address,uint256))

+ +
transactionDescription.value BigNumber

The value from the transaction.

+ +

Specifying Fragments

When specifying a fragment to any of the functions in an Interface, any of the following may be used:

+ +

  • The name of the event or function, if it is unique and non-ambiguous within the ABI (e.g. transfer)
  • The signature of the event or function. The signature is normalized, so, for example, uint and uint256 are equivalent (e.g. transfer(address, uint))
  • The sighash or topichash of the function. The sighash is often referred to the function selector in Solidity (e.g. 0xa9059cbb)
  • A Fragment

+ + + + + +
+ + + diff --git a/docs/v5/api/utils/address/README.md b/docs/v5/api/utils/address/README.md new file mode 100644 index 000000000..738f6fbeb --- /dev/null +++ b/docs/v5/api/utils/address/README.md @@ -0,0 +1,64 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Addresses +========= + +Address Formats +--------------- + +### Address + +### ICAP Address + +Converting and Verifying +------------------------ + +#### *ethers* . *utils* . **getAddress**( address ) => *string< [Address](/v5/api/utils/address/#address) >* + +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. + +The value of *address* may be any supported address format. + + +#### *ethers* . *utils* . **getIcapAddress**( address ) => *string< [IcapAddress](/v5/api/utils/address/#address-icap) >* + +Returns *address* as an [ICAP address](https://github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-%28ICAP%29). Supports the same restrictions as [utils.getAddress](/v5/api/utils/address/#utils-getAddress). + + +#### *ethers* . *utils* . **isAddress**( address ) => *boolean* + +Returns true if *address* is valid (in any supported format). + + +Derivation +---------- + +#### *ethers* . *utils* . **computeAddress**( publicOrPrivateKey ) => *string< [Address](/v5/api/utils/address/#address) >* + +Returns the address for *publicOrPrivateKey*. A public key may be compressed or uncompressed, and a private key will be converted automatically to a public key for the derivation. + + +#### *ethers* . *utils* . **recoverAddress**( digest , signature ) => *string< [Address](/v5/api/utils/address/#address) >* + +Use [ECDSA Public Key Recovery](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Public_key_recovery) to determine the address that signed *digest* to which generated *signature*. + + +Contracts Addresses +------------------- + +#### *ethers* . *utils* . **getContractAddress**( transaction ) => *string< [Address](/v5/api/utils/address/#address) >* + +Returns the contract address that would result if *transaction* was used to deploy a contract. + + +#### *ethers* . *utils* . **getCreate2Address**( from , salt , initCodeHash ) => *string< [Address](/v5/api/utils/address/#address) >* + +Returns the contract address that would result from the given [CREATE2](https://eips.ethereum.org/EIPS/eip-1014) call. + + diff --git a/docs/v5/api/utils/address/index.html b/docs/v5/api/utils/address/index.html new file mode 100644 index 000000000..b14f8f733 --- /dev/null +++ b/docs/v5/api/utils/address/index.html @@ -0,0 +1,69 @@ + + + + Addresses + + + + +
+ + +

Addresses

Explain addresses,formats and checksumming here.

+ +

Also see: constants.AddressZero

+ +

Address Formats

+

Address

An Address is a DataHexString of 20 bytes (40 nibbles), with optional mixed case.

+ +

If the case is mixed, it is a Checksum Address, which uses a specific pattern of uppercase and lowercase letters within a given address to reduce the risk of errors introduced from typing an address or cut and paste issues.

+ +

All functions that return an Address will return a Checksum Address.

+ +

ICAP Address

The ICAP Address Format was an early attempt to introduce a checksum into Ethereum addresses using the popular banking industry's IBAN format with the country code specified as XE.

+ +

Due to the way IBAN encodes address, only addresses that fit into 30 base-36 characters are actually compatible, so the format was adapted to support 31 base-36 characters which is large enough for a full Ethereum address, however the preferred method was to select a private key whose address has a 0 as the first byte, which allows the address to be formatted as a fully compatibly standard IBAN address with 30 base-36 characters.

+ +

In general this format is no longer widely supported anymore, however any function that accepts an address can receive an ICAP address, and it will be converted internally.

+ +

To convert an address into the ICAP format, see getIcapAddress.

+ +

Converting and Verifying

+
ethers.utils.getAddress( address ) string< Address >

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 value of address may be any supported address format.

+ +
ethers.utils.getIcapAddress( address ) string< IcapAddress >

Returns address as an ICAP address. Supports the same restrictions as utils.getAddress.

+ +
ethers.utils.isAddress( address ) boolean

Returns true if address is valid (in any supported format).

+ +

Derivation

+
ethers.utils.computeAddress( publicOrPrivateKey ) string< Address >

Returns the address for publicOrPrivateKey. A public key may be compressed or uncompressed, and a private key will be converted automatically to a public key for the derivation.

+ +
ethers.utils.recoverAddress( digest , signature ) string< Address >

Use ECDSA Public Key Recovery to determine the address that signed digest to which generated signature.

+ +

Contracts Addresses

+
ethers.utils.getContractAddress( transaction ) string< Address >

Returns the contract address that would result if transaction was used to deploy a contract.

+ +
ethers.utils.getCreate2Address( from , salt , initCodeHash ) string< Address >

Returns the contract address that would result from the given CREATE2 call.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/bignumber/README.md b/docs/v5/api/utils/bignumber/README.md new file mode 100644 index 000000000..2fd81f887 --- /dev/null +++ b/docs/v5/api/utils/bignumber/README.md @@ -0,0 +1,237 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +BigNumber +========= + +Types +----- + +### BigNumberish + +#### ***string*** + +A [HexString](/v5/api/utils/bytes/#HexString) or a decimal string, either of which may be negative. + + +#### ***BytesLike*** + +A [BytesLike](/v5/api/utils/bytes/#BytesLike) Object, such as an Array or Uint8Array. + + +#### ***BigNumber*** + +An existing [BigNumber](/v5/api/utils/bignumber/) instance. + + +#### ***number*** + +A number that is within the [safe range](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER#Description) for JavaScript numbers. + + +#### ***BigInt*** + +A JavaScript [BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) object, on environments that support BigInt. + + +Creating Instances +------------------ + +#### *ethers* . *BigNumber* . **from**( aBigNumberish ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns an instance of a **BigNumber** for *aBigNumberish*. + + +### Examples: + +```javascript +// From a decimal string... +BigNumber.from("42") +//! + +// From a HexString... +BigNumber.from("0x2a") +//! + +// From a negative HexString... +BigNumber.from("-0x2a") +//! + +// From an Array (or Uint8Array)... +BigNumber.from([ 42 ]) +//! + +// From an existing BigNumber... +let one1 = constants.One; +let one2 = BigNumber.from(one1) + +one2 +//! + +// ...which returns the same instance +one1 === one2 +//! + +// From a (safe) number... +BigNumber.from(42) +//! + +// From a ES2015 BigInt... (only on platforms with BigInt support) +BigNumber.from(42n) +//! + +// Numbers outside the safe range fail: +BigNumber.from(Number.MAX_SAFE_INTEGER); +//! error +``` + +Methods +------- + +### Math Operations + +#### *BigNumber* . **add**( otherValue ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* **+** *otherValue*. + + +#### *BigNumber* . **sub**( otherValue ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* **-** *otherValue*. + + +#### *BigNumber* . **mul**( otherValue ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* **\*** *otherValue*. + + +#### *BigNumber* . **div**( divisor ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* **/** *divisor*. + + +#### *BigNumber* . **mod**( divisor ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the value of the **remainder** of *BigNumber* / *divisor*. + + +#### *BigNumber* . **pow**( exponent ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* to the power of *exponent*. + + +#### *BigNumber* . **abs**( ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the absolute value of *BigNumber*. + + +#### *BigNumber* . **mask**( bitcount ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* with bits beyond the *bitcount* least significant bits set to zero. + + +### Two's Compliment + +#### *BigNumber* . **fromTwos**( bitwidth ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* converted from twos-compliment with *bitwidth*. + + +#### *BigNumber* . **toTwos**( bitwidth ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a BigNumber with the value of *BigNumber* converted to twos-compliment with *bitwidth*. + + +### Comparison and Equivalence + +#### *BigNumber* . **eq**( otherValue ) => *boolean* + +Returns true if and only if the value of *BigNumber* is equal to *otherValue*. + + +#### *BigNumber* . **lt**( otherValue ) => *boolean* + +Returns true if and only if the value of *BigNumber* **<** *otherValue*. + + +#### *BigNumber* . **lte**( otherValue ) => *boolean* + +Returns true if and only if the value of *BigNumber* **<=** *otherValue*. + + +#### *BigNumber* . **gt**( otherValue ) => *boolean* + +Returns true if and only if the value of *BigNumber* **>** *otherValue*. + + +#### *BigNumber* . **gte**( otherValue ) => *boolean* + +Returns true if and only if the value of *BigNumber* **>=** *otherValue*. + + +#### *BigNumber* . **isZero**( ) => *boolean* + +Returns true if and only if the value of *BigNumber* is zero. + + +### Conversion + +#### *BigNumber* . **toNumber**( ) => *number* + +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*. + + +#### *BigNumber* . **toString**( ) => *string* + +Returns the value of *BigNumber* as a base-10 string. + + +#### *BigNumber* . **toHexString**( ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Returns the value of *BigNumber* as a base-16, `0x`-prefixed [DataHexString](/v5/api/utils/bytes/#DataHexString). + + +### Inspection + +#### *ethers* . *BigNumnber* . **isBigNumber**( object ) => *boolean* + +Returns true if and only if the *object* is a BigNumber object. + + +### Examples + +```javascript +let a = BigNumber.from(42); +let b = BigNumber.from("91"); + +a.mul(b); +//! +``` + +Notes +----- + +### Why can't I just use numbers? + +```javascript +(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER) +//! +``` + + +To remedy this, all numbers (which can be large) are stored and manipulated as [Big Numbers](/v5/api/utils/bignumber/). + +The functions [parseEther( etherString )](/v5/api/utils/display-logic/#utils-parseEther) and [formatEther( wei )](/v5/api/utils/display-logic/#utils-formatEther) 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. + + +### Why not BigNumber.js, BN.js, BigDecimal, etc? + +### Why BN.js?? + +### Allow us to set a global Big Number library? + diff --git a/docs/v5/api/utils/bignumber/index.html b/docs/v5/api/utils/bignumber/index.html new file mode 100644 index 000000000..4921e7127 --- /dev/null +++ b/docs/v5/api/utils/bignumber/index.html @@ -0,0 +1,182 @@ + + + + BigNumber + + + + +
+ + +

BigNumber

Many operations in Ethereum operation on numbers which are outside the range of safe values 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.

+ +

Types

+

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:

+ +
string

A HexString or a decimal string, either of which may be negative.

+ +
BytesLike

A BytesLike Object, such as an Array or Uint8Array.

+ +
BigNumber

An existing BigNumber instance.

+ +
number

A number that is within the safe range for JavaScript numbers.

+ +
BigInt

A JavaScript BigInt object, on environments that support BigInt.

+ +

Creating Instances

The constructor of BigNumber cannot be called directly. Instead, Use the static BigNumber.from.

+ +
ethers.BigNumber.from( aBigNumberish ) BigNumber

Returns an instance of a BigNumber for aBigNumberish.

+ +

Examples:

+
// From a decimal string... +BigNumber.from("42") +//! + +// From a HexString... +BigNumber.from("0x2a") +//! + +// From a negative HexString... +BigNumber.from("-0x2a") +//! + +// From an Array (or Uint8Array)... +BigNumber.from([ 42 ]) +//! + +// From an existing BigNumber... +let one1 = constants.One; +let one2 = BigNumber.from(one1) + +one2 +//! + +// ...which returns the same instance +one1 === one2 +//! + +// From a (safe) number... +BigNumber.from(42) +//! + +// From a ES2015 BigInt... (only on platforms with BigInt support) +BigNumber.from(42n) +//! + +// Numbers outside the safe range fail: +BigNumber.from(Number.MAX_SAFE_INTEGER); +//! error

Methods

The BigNumber class is immutable, so no operations can change the value it represents.

+ +

Math Operations

+
BigNumber.add( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber + otherValue.

+ +
BigNumber.sub( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber - otherValue.

+ +
BigNumber.mul( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber × otherValue.

+ +
BigNumber.div( divisor ) BigNumber

Returns a BigNumber with the value of BigNumber ÷ divisor.

+ +
BigNumber.mod( divisor ) BigNumber

Returns a BigNumber with the value of the remainder of BigNumber ÷ divisor.

+ +
BigNumber.pow( exponent ) BigNumber

Returns a BigNumber with the value of BigNumber to the power of exponent.

+ +
BigNumber.abs( ) BigNumber

Returns a BigNumber with the absolute value of BigNumber.

+ +
BigNumber.mask( bitcount ) BigNumber

Returns a BigNumber with the value of BigNumber with bits beyond the bitcount least significant bits set to zero.

+ +

Two's Compliment

Two's Complicment 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.

+ +
BigNumber.fromTwos( bitwidth ) BigNumber

Returns a BigNumber with the value of BigNumber converted from twos-compliment with bitwidth.

+ +
BigNumber.toTwos( bitwidth ) BigNumber

Returns a BigNumber with the value of BigNumber converted to twos-compliment with bitwidth.

+ +

Comparison and Equivalence

+
BigNumber.eq( otherValue ) boolean

Returns true if and only if the value of BigNumber is equal to otherValue.

+ +
BigNumber.lt( otherValue ) boolean

Returns true if and only if the value of BigNumber < otherValue.

+ +
BigNumber.lte( otherValue ) boolean

Returns true if and only if the value of BigNumber otherValue.

+ +
BigNumber.gt( otherValue ) boolean

Returns true if and only if the value of BigNumber > otherValue.

+ +
BigNumber.gte( otherValue ) boolean

Returns true if and only if the value of BigNumber otherValue.

+ +
BigNumber.isZero( ) boolean

Returns true if and only if the value of BigNumber is zero.

+ +

Conversion

+
BigNumber.toNumber( ) number

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.

+ +
BigNumber.toString( ) string

Returns the value of BigNumber as a base-10 string.

+ +
BigNumber.toHexString( ) string< DataHexString >

Returns the value of BigNumber as a base-16, 0x-prefixed DataHexString.

+ +

Inspection

+
ethers.BigNumnber.isBigNumber( object ) boolean

Returns true if and only if the object is a BigNumber object.

+ +

Examples

+
let a = BigNumber.from(42); +let b = BigNumber.from("91"); + +a.mul(b); +//!

Notes

This section is a for a couple of questions that come up frequently.

+ +

Why can't I just use numbers?

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 1018 wei in a single ether.

+ +

JavaScript uses IEEE 754 double-precision binary floating point 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:

+ +
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER) +//!

To remedy this, all numbers (which can be large) are stored and manipulated as Big Numbers.

+ +

The functions parseEther( etherString ) and formatEther( wei ) 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.

+ +

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.

+ +

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 BN.js 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.

+ +

Why BN.js??

The reason why BN.js is used internally as the big number is because that is the library used by 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.

+ +

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.

+ + + + + +
+ + + diff --git a/docs/v5/api/utils/bytes/README.md b/docs/v5/api/utils/bytes/README.md new file mode 100644 index 000000000..3ab6259ff --- /dev/null +++ b/docs/v5/api/utils/bytes/README.md @@ -0,0 +1,179 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Byte Manipulation +================= + +Types +----- + +### Bytes + +### BytesLike + +### DataHexString + +### HexString + +### Signature + +### Raw Signature + +### SignatureLike + +Inspection +---------- + +#### *ethers* . *utils* . **isBytes**( object ) => *boolean* + +Returns true if and only if *object* is a valid [Bytes](/v5/api/utils/bytes/#Bytes). + + +#### *ethers* . *utils* . **isBytesLike**( object ) => *boolean* + +Returns true if and only if *object* is a [Bytes](/v5/api/utils/bytes/#Bytes) or [DataHexString](/v5/api/utils/bytes/#DataHexString). + + +#### *ethers* . *utils* . **isHexString**( object , [ length ] ) => *boolean* + +Returns true if and only if *object* is a valid hex string. If *length* is specified and *object* is not a valid [DataHexString](/v5/api/utils/bytes/#DataHexString) of *length* bytes, an InvalidArgument error is thrown. + + +Converting between Arrays and Hexstrings +---------------------------------------- + +#### *ethers* . *utils* . **arrayify**( DataHexStringOrArrayish [ , options ] ) => *Uint8Array* + +Converts *DataHexStringOrArrayish* to a Uint8Array. + + +#### *ethers* . *utils* . **hexlify**( hexstringOrArrayish ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Converts *hexstringOrArrayish* to a [DataHexString](/v5/api/utils/bytes/#DataHexString). + + +#### *ethers* . *utils* . **hexValue**( aBigNumberish ) => *string< [HexString](/v5/api/utils/bytes/#HexString) >* + +Converts *aBigNumberish* to a [HexString](/v5/api/utils/bytes/#HexString), with no *unnecessary* leading zeros. + + +```javascript +// Convert a hexstring to a Uint8Array +arrayify("0x1234") +//! + +// Convert an Array to a hexstring +hexlify([1, 2, 3, 4]) +//! + +// Convert an Object to a hexstring +hexlify({ length: 2, "0": 1, "1": 2 }) +//! + +// Convert an Array to a hexstring +hexlify([ 1 ]) +//! + +// Convert a number to a stripped hex value +hexValue(1) +//! + +// Convert an Array to a stripped hex value +hexValue([ 1, 2 ]) +//! +``` + +Array Manipulation +------------------ + +#### *ethers* . *utils* . **concat**( arrayOfBytesLike ) => *Uint8Array* + +Concatenates all the [BytesLike](/v5/api/utils/bytes/#BytesLike) in *arrayOfBytesLike* into a single Uint8Array. + + +#### *ethers* . *utils* . **stripZeros**( aBytesLike ) => *Uint8Array* + +Returns a Uint8Array with all leading `0` bytes of *aBtyesLike* removed. + + +#### *ethers* . *utils* . **zeroPad**( aBytesLike , length ) => *Uint8Array* + +Retutns a Uint8Array of the data in *aBytesLike* with `0` bytes prepended to *length* bytes long. + +If *aBytesLike* is already longer than *length* bytes long, an InvalidArgument error will be thrown. + + +Hexstring Manipulation +---------------------- + +#### *ethers* . *utils* . **hexConcat**( arrayOfBytesLike ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Concatenates all the [BytesLike](/v5/api/utils/bytes/#BytesLike) in *arrayOfBytesLike* into a single [DataHexString](/v5/api/utils/bytes/#DataHexString) + + +#### *ethers* . *utils* . **hexDataLength**( aBytesLike ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Returns the length (in bytes) of *aBytesLike*. + + +#### *ethers* . *utils* . **hexDataSlice**( aBytesLike , offset [ , endOffset ] ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Returns a [DataHexString](/v5/api/utils/bytes/#DataHexString) representation of a slice of *aBytesLike*, from *offset* (in bytes) to *endOffset* (in bytes). If *endOffset* is omitted, the length of *aBytesLike* is used. + + +#### *ethers* . *utils* . **hexStripZeros**( aBytesLike ) => *string< [HexString](/v5/api/utils/bytes/#HexString) >* + +Returns a [HexString](/v5/api/utils/bytes/#HexString) representation of *aBytesLike* with all leading zeros removed. + + +#### *ethers* . *utils* . **hexZeroPad**( aBytesLike , length ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Returns a [DataHexString](/v5/api/utils/bytes/#DataHexString) representation of *aBytesLike* padded to *length* bytes. + +If *aBytesLike* is already longer than *length* bytes long, an InvalidArgument error will be thrown. + + +Signature Conversion +-------------------- + +#### *ethers* . *utils* . **joinSignature**( aSignatureLike ) => *string< [RawSignature](/v5/api/utils/bytes/#signature-raw) >* + +Return the raw-format of *aSignaturelike*, which is 65 bytes (130 nibbles) long, concatenating the **r**, **s** and (normalized) **v** of a Signature. + + +#### *ethers* . *utils* . **splitSignature**( aSignatureLikeOrBytesLike ) => *[Signature](/v5/api/utils/bytes/#Signature)* + +Return the full expanded-format of *aSignaturelike* or a raw-format [DataHexString](/v5/api/utils/bytes/#DataHexString). Any missing properties will be computed. + + +Random Bytes +------------ + +#### *ethers* . *utils* . **randomBytes**( length ) => *Uint8Array* + +Return a new Uint8Array of *length* random bytes. + + +#### *ethers* . *utils* . **shuffled**( array ) => *Array< any >* + +Return a copy of *array* shuffled using [Fisher-Yates Shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + + +```javascript +utils.randomBytes(8) +//! + +const data = [ 1, 2, 3, 4, 5, 6, 7 ]; + +// Returns a new Array +utils.shuffled(data); +//! + +// The Original is unscathed... +data +//! +``` + diff --git a/docs/v5/api/utils/bytes/index.html b/docs/v5/api/utils/bytes/index.html new file mode 100644 index 000000000..b01beb481 --- /dev/null +++ b/docs/v5/api/utils/bytes/index.html @@ -0,0 +1,127 @@ + + + + Byte Manipulation + + + + +
+ + +

Byte Manipulation

Tra la la...

+ +

Types

+

Bytes

A Bytes is any object which is an Array or TypedArray with each value in the valid byte range (i.e. between 0 and 255 inclusive), or is an Object with a length property where each indexed property is in the valid byte range.

+ +

BytesLike

A BytesLike can be either a Bytes or a DataHexString.

+ +

DataHexString

A DataHexstring is identical to a HexString except that it has an even number of nibbles, and therefore is a valid representation of binary data as a string.

+ +

HexString

A Hexstring is a string which has a 0x prefix followed by any number of nibbles (i.e. case-insensitive hexidecumal characters, 0-9 and a-f).

+ +

Signature

  • r and s --- The x co-ordinate of r and the s value of the signature
  • v --- The parity of the y co-ordinate of r
  • _vs --- The compact representation of the s and v
  • recoveryParam --- The normalized (i.e. 0 or 1) value of v

+ +

Raw Signature inherits string<DataHexString<65>>

A Raw Signature is a common Signature format where the r, s and v are concanenated into a 65 byte (130 nibble) DataHexString.

+ +

SignatureLike

A SignatureLike is similar to a Signature, except redundant properties may be omitted or it may be a Raw Signature.

+ +

For example, if _vs is specified, s and v may be omitted. Likewise, if recoveryParam is provided, v may be omitted (as in these cases the missing values can be computed).

+ +

Inspection

+
ethers.utils.isBytes( object ) boolean

Returns true if and only if object is a valid Bytes.

+ +
ethers.utils.isBytesLike( object ) boolean

Returns true if and only if object is a Bytes or DataHexString.

+ +
ethers.utils.isHexString( object , [ length ] ) boolean

Returns true if and only if object is a valid hex string. If length is specified and object is not a valid DataHexString of length bytes, an InvalidArgument error is thrown.

+ +

Converting between Arrays and Hexstrings

+
ethers.utils.arrayify( DataHexStringOrArrayish [ , options ] ) Uint8Array

Converts DataHexStringOrArrayish to a Uint8Array.

+ +
ethers.utils.hexlify( hexstringOrArrayish ) string< DataHexString >

Converts hexstringOrArrayish to a DataHexString.

+ +
ethers.utils.hexValue( aBigNumberish ) string< HexString >

Converts aBigNumberish to a HexString, with no unnecessary leading zeros.

+ +
Examples
// Convert a hexstring to a Uint8Array +arrayify("0x1234") +//! + +// Convert an Array to a hexstring +hexlify([1, 2, 3, 4]) +//! + +// Convert an Object to a hexstring +hexlify({ length: 2, "0": 1, "1": 2 }) +//! + +// Convert an Array to a hexstring +hexlify([ 1 ]) +//! + +// Convert a number to a stripped hex value +hexValue(1) +//! + +// Convert an Array to a stripped hex value +hexValue([ 1, 2 ]) +//!

Array Manipulation

+
ethers.utils.concat( arrayOfBytesLike ) Uint8Array

Concatenates all the BytesLike in arrayOfBytesLike into a single Uint8Array.

+ +
ethers.utils.stripZeros( aBytesLike ) Uint8Array

Returns a Uint8Array with all leading 0 bytes of aBtyesLike removed.

+ +
ethers.utils.zeroPad( aBytesLike , length ) Uint8Array

Retutns a Uint8Array of the data in aBytesLike with 0 bytes prepended to length bytes long.

+ +

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

+ +

Hexstring Manipulation

+
ethers.utils.hexConcat( arrayOfBytesLike ) string< DataHexString >

Concatenates all the BytesLike in arrayOfBytesLike into a single DataHexString

+ +
ethers.utils.hexDataLength( aBytesLike ) string< DataHexString >

Returns the length (in bytes) of aBytesLike.

+ +
ethers.utils.hexDataSlice( aBytesLike , offset [ , endOffset ] ) string< DataHexString >

Returns a DataHexString representation of a slice of aBytesLike, from offset (in bytes) to endOffset (in bytes). If endOffset is omitted, the length of aBytesLike is used.

+ +
ethers.utils.hexStripZeros( aBytesLike ) string< HexString >

Returns a HexString representation of aBytesLike with all leading zeros removed.

+ +
ethers.utils.hexZeroPad( aBytesLike , length ) string< DataHexString >

Returns a DataHexString representation of aBytesLike padded to length bytes.

+ +

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

+ +

Signature Conversion

+
ethers.utils.joinSignature( aSignatureLike ) string< RawSignature >

Return the raw-format of aSignaturelike, which is 65 bytes (130 nibbles) long, concatenating the r, s and (normalized) v of a Signature.

+ +
ethers.utils.splitSignature( aSignatureLikeOrBytesLike ) Signature

Return the full expanded-format of aSignaturelike or a raw-format DataHexString. Any missing properties will be computed.

+ +

Random Bytes

+
ethers.utils.randomBytes( length ) Uint8Array

Return a new Uint8Array of length random bytes.

+ +
ethers.utils.shuffled( array ) Array< any >

Return a copy of array shuffled using Fisher-Yates Shuffle.

+ +
Examples
utils.randomBytes(8) +//! + +const data = [ 1, 2, 3, 4, 5, 6, 7 ]; + +// Returns a new Array +utils.shuffled(data); +//! + +// The Original is unscathed... +data +//!
+ + + +
+ + + diff --git a/docs/v5/api/utils/constants/README.md b/docs/v5/api/utils/constants/README.md new file mode 100644 index 000000000..3aec1fb72 --- /dev/null +++ b/docs/v5/api/utils/constants/README.md @@ -0,0 +1,63 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Constants +========= + +Bytes +----- + +#### *ethers* . *constants* . **AddressZero** => *string< [Address](/v5/api/utils/address/#address) >* + +The Address Zero, which is 20 bytes (40 nibbles) of zero. + + +#### *ethers* . *constants* . **HashZero** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The Hash Zero, which is 32 bytes (64 nibbles) of zero. + + +Strings +------- + +#### *ethers* . *constants* . **EtherSymbol** => *string* + +The Ether symbol, **Xi**. + + +BigNumber +--------- + +#### *ethers* . *constants* . **NegativeOne** => *[BigNumber](/v5/api/utils/bignumber/)* + +The BigNumber value representing `"-1"`. + + +#### *ethers* . *constants* . **Zero** => *[BigNumber](/v5/api/utils/bignumber/)* + +The BigNumber value representing `"0"`. + + +#### *ethers* . *constants* . **One** => *[BigNumber](/v5/api/utils/bignumber/)* + +The BigNumber value representing `"1"`. + + +#### *ethers* . *constants* . **Two** => *[BigNumber](/v5/api/utils/bignumber/)* + +The BigNumber value representing `"2"`. + + +#### *ethers* . *constants* . **WeiPerEther** => *[BigNumber](/v5/api/utils/bignumber/)* + +The BigNumber value representing `"1000000000000000000"`, which is the number of Wei per Ether. + + +#### *ethers* . *constants* . **MaxUint256** => *[BigNumber](/v5/api/utils/bignumber/)* + +The BigNumber value representing the maximum `uint256` value. + + diff --git a/docs/v5/api/utils/constants/index.html b/docs/v5/api/utils/constants/index.html new file mode 100644 index 000000000..f7291e565 --- /dev/null +++ b/docs/v5/api/utils/constants/index.html @@ -0,0 +1,52 @@ + + + + Constants + + + + +
+ + +

Constants

The ethers.contants Object contains commonly used values.

+ +

Bytes

+
ethers.constants.AddressZero string< Address >

The Address Zero, which is 20 bytes (40 nibbles) of zero.

+ +
ethers.constants.HashZero string< DataHexString< 32 > >

The Hash Zero, which is 32 bytes (64 nibbles) of zero.

+ +

Strings

+
ethers.constants.EtherSymbol string

The Ether symbol, Ξ.

+ +

BigNumber

+
ethers.constants.NegativeOne BigNumber

The BigNumber value representing "-1".

+ +
ethers.constants.Zero BigNumber

The BigNumber value representing "0".

+ +
ethers.constants.One BigNumber

The BigNumber value representing "1".

+ +
ethers.constants.Two BigNumber

The BigNumber value representing "2".

+ +
ethers.constants.WeiPerEther BigNumber

The BigNumber value representing "1000000000000000000", which is the number of Wei per Ether.

+ +
ethers.constants.MaxUint256 BigNumber

The BigNumber value representing the maximum uint256 value.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/display-logic/README.md b/docs/v5/api/utils/display-logic/README.md new file mode 100644 index 000000000..4a058341e --- /dev/null +++ b/docs/v5/api/utils/display-logic/README.md @@ -0,0 +1,52 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Display Logic and Input +======================= + +Units +----- + +### Decimal Count + +### Named Units + + + + + +Functions +--------- + +### Formatting + +#### *ethers* . *utils* . **commify**( value ) => *string* + +Returns a string with value grouped by 3 digits, separated by `,`. + + +### Conversion + +#### *ethers* . *utils* . **formatUnits**( value [ , unit = "ether" ] ) => *string* + +Returns a string representation of *value* formatted with *unit* digits (if it is a number) or to the unit specified (if a string). + + +#### *ethers* . *utils* . **formatEther**( value ) => *string* + +The equivalent to calling `formatUnits(value, "ether")`. + + +#### *ethers* . *utils* . **parseUnits**( value [ , unit = "ether" ] ) => *[BigNumber](/v5/api/utils/bignumber/)* + +Returns a [BigNumber](/v5/api/utils/bignumber/) representation of *value*, parsed with *unit* digits (if it is a number) or from the unit specified (if a string). + + +#### *ethers* . *utils* . **parseEther**( value ) => *[BigNumber](/v5/api/utils/bignumber/)* + +The equivalent to calling `parseUnits(value, "ether")`. + + diff --git a/docs/v5/api/utils/display-logic/index.html b/docs/v5/api/utils/display-logic/index.html new file mode 100644 index 000000000..24ca43d70 --- /dev/null +++ b/docs/v5/api/utils/display-logic/index.html @@ -0,0 +1,59 @@ + + + + Display Logic and Input + + + + +
+ + +

Display Logic and Input

When creating an Application, it is useful to convert between user-friendly strings (usually displaying ether) and the machine-readable values that contracts and maths depend on (usually in wei).

+ +

For example, a Wallet may specify the balance in ether, and gas prices in gwei for the User Interface, but when sending a transaction, both must be specified in wei.

+ +

The parseUnits will parse a string representing ether, such as 1.1 into a BigNumber in wei, and is useful when a user types in a value, such as sending 1.1 ether.

+ +

The formatUnits will format a BigNumberish into a string, which is useful when displaying a balance.

+ +

Units

+

Decimal Count

A Unit can be specified as an number, which indicates the number of decimal places that should be used.

+ +

Examples:

+ +

  • 1 ether in wei, has 18 decimal places (i.e. 1 ether represents 1018 wei)
  • 1 bitcoin in Satoshi, has 8 decimal places (i.e. 1 bitcoin represents 108 satoshi)

+ +

Named Units

There are also several common Named Units, in which case their name (as a string) may be used.

+ +
NameDecimals 
wei0 
kwei3 
mwei6 
gwei9 
szabo12 
finney15 
ether18 

Functions

+

Formatting

+
ethers.utils.commify( value ) string

Returns a string with value grouped by 3 digits, separated by ,.

+ +

Conversion

+
ethers.utils.formatUnits( value [ , unit = "ether" ] ) string

Returns a string representation of value formatted with unit digits (if it is a number) or to the unit specified (if a string).

+ +
ethers.utils.formatEther( value ) string

The equivalent to calling formatUnits(value, "ether").

+ +
ethers.utils.parseUnits( value [ , unit = "ether" ] ) BigNumber

Returns a BigNumber representation of value, parsed with unit digits (if it is a number) or from the unit specified (if a string).

+ +
ethers.utils.parseEther( value ) BigNumber

The equivalent to calling parseUnits(value, "ether").

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/encoding/README.md b/docs/v5/api/utils/encoding/README.md new file mode 100644 index 000000000..97ffc75f4 --- /dev/null +++ b/docs/v5/api/utils/encoding/README.md @@ -0,0 +1,62 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Encoding Utilities +================== + +Base58 +------ + +#### *ethers* . *utils* . *base58* . **decode**( textData ) => *Uin8Array* + +Return a typed Uint8Array representation of *textData* decoded using base-58 encoding. + + +#### *ethers* . *utils* . *base58* . **encode**( aBytesLike ) => *string* + +Return *aBytesLike* encoded as a string using the base-58 encoding. + + +Base64 +------ + +#### *ethers* . *utils* . *base64* . **decode**( textData ) => *Uin8Array* + +Return a typed Uint8Array representation of *textData* decoded using base-64 encoding. + + +#### *ethers* . *utils* . *base64* . **encode**( aBytesLike ) => *string* + +Return *aBytesLike* encoded as a string using the base-64 encoding. + + +Recursive-Length Prefix +----------------------- + +#### *ethers* . *utils* . *RLP* . **encode**( dataObject ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Encode a structured Data Object into its RLP-encoded representation. + +Each Data component may be an valid [BytesLike](/v5/api/utils/bytes/#BytesLike). + + +#### *ethers* . *utils* . *RLP* . **decode**( aBytesLike ) => *[DataObject](/v5/api/utils/encoding/#rlp--dataobject)* + +Decode an RLP-encoded *aBytesLike* into its structured Data Object. + +All Data components will be returned as a [DataHexString](/v5/api/utils/bytes/#DataHexString). + + +### Data Object + +#### **Examples** + +- `"0x1234"` +- `[ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]` + + + + diff --git a/docs/v5/api/utils/encoding/index.html b/docs/v5/api/utils/encoding/index.html new file mode 100644 index 000000000..29dec46c6 --- /dev/null +++ b/docs/v5/api/utils/encoding/index.html @@ -0,0 +1,56 @@ + + + + Encoding Utilities + + + + +
+ + +

Encoding Utilities

+

Base58

+
ethers.utils.base58.decode( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-58 encoding.

+ +
ethers.utils.base58.encode( aBytesLike ) string

Return aBytesLike encoded as a string using the base-58 encoding.

+ +

Base64

+
ethers.utils.base64.decode( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-64 encoding.

+ +
ethers.utils.base64.encode( aBytesLike ) string

Return aBytesLike encoded as a string using the base-64 encoding.

+ +

Recursive-Length Prefix

The Recursive Length Prefix encoding is used throughout Ethereum to serialize nested structures of Arrays and data.

+ +
ethers.utils.RLP.encode( dataObject ) string< DataHexString >

Encode a structured Data Object into its RLP-encoded representation.

+ +

Each Data component may be an valid BytesLike.

+ +
ethers.utils.RLP.decode( aBytesLike ) DataObject

Decode an RLP-encoded aBytesLike into its structured Data Object.

+ +

All Data components will be returned as a DataHexString.

+ +

Data Object

A Data Object is a recursive structure which is used to serialize many internal structures in Ethereum. Each Data Object can either be:

+ +

  • Binary Data
  • An Array of Data Objects (i.e. this recursively includes Nesting)

+ +
Examples

  • "0x1234"
  • [ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/fixednumber/README.md b/docs/v5/api/utils/fixednumber/README.md new file mode 100644 index 000000000..d98500ced --- /dev/null +++ b/docs/v5/api/utils/fixednumber/README.md @@ -0,0 +1,138 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +FixedNumber +=========== + +Creating Instances +------------------ + +#### *FixedNumber* . **from**( value [ , format = "fixed" ] ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns an instance of a **FixedNumber** for *value* as a *format*. + + +#### *FixedNumber* . **fromBytes**( aBytesLike [ , format = "fixed" ] ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns an instance of a **FixedNumber** for *value* as a *format*. + + +#### *FixedNumber* . **fromString**( value [ , format = "fixed" ] ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns an instance of a **FixedNumber** for *value* as a *format*. The *value* must not contain more decimals than the *format* permits. + + +#### *FixedNumber* . **fromValue**( value [ , decimals = 0 [ , format = "fixed" ] ] ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns an instance of a **FixedNumber** for *value* with *decimals* as a *format*. + + +Properties +---------- + +#### *fixednumber* . **format** + +The [FixedFormat](/v5/api/utils/fixednumber/#FixedFormat) of *fixednumber*. + + +Methods +------- + +### Math Operations + +#### *fixednumber* . **addUnsafe**( otherValue ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns a new FixedNumber with the value of *fixedvalue* **+** *otherValue*. + + +#### *fixednumber* . **subUnsafe**( otherValue ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns a new FixedNumber with the value of *fixedvalue* **-** *otherValue*. + + +#### *fixednumber* . **mulUnsafe**( otherValue ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns a new FixedNumber with the value of *fixedvalue* **\*** *otherValue*. + + +#### *fixednumber* . **divUnsafe**( otherValue ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns a new FixedNumber with the value of *fixedvalue* **/** *otherValue*. + + +#### *fixednumber* . **round**( [ decimals = 0 ] ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns a new FixedNumber with the value of *fixedvalue* rounded to *decimals*. + + +### Conversion + +#### *fixednumber* . **toFormat**( format ) => *[FixedNumber](/v5/api/utils/fixednumber/)* + +Returns a new FixedNumber with the value of *fixedvalue* with *format*. + + +#### *fixednumber* . **toHexString**( ) => *string* + +Returns a [HexString](/v5/api/utils/bytes/#HexString) representation of *fixednumber*. + + +#### *fixednumber* . **toString**( ) => *string* + +Returns a string representation of *fixednumber*. + + +#### *fixednumber* . **toUnsafeFloat**( ) => *float* + +Returns a floating-point JavaScript number value of *fixednumber*. Due to rounding in JavaScript numbers, the value is only approximate. + + +### Inspection + +#### *FixedNumber* . **isFixedNumber**( value ) => *boolean* + +Returns true if and only if *value* is a **FixedNumber**. + + +FixedFormat +----------- + +### Format Strings + +### Creating Instances + +#### *FixedFormat* . **from**( value = "fixed128x18" ) => *[FixedFormat](/v5/api/utils/fixednumber/#FixedFormat)* + +Returns a new instance of a **FixedFormat** defined by *value*. Any valid [Format Strings](/v5/api/utils/fixednumber/#FixedFormat--strings) may be passed in as well as any object which has any of `signed`, `width` and `decimals` defined, including a [FixedFormat](/v5/api/utils/fixednumber/#FixedFormat) object. + + +### Properties + +#### *fixedFormat* . **signed** => *boolean* + +The signed-ness of *fixedFormat*, true if negative values are supported. + + +#### *fixedFormat* . **width** => *number* + +The width (in bits) of *fixedFormat*. + + +#### *fixedFormat* . **decimals** => *number* + +The number of decimal points of *fixedFormat*. + + +#### *fixedFormat* . **name** => *string* + +The name of the *fixedFormat*, which can be used to recreate the format and is the string that the Solidity language uses to represent this format. + + +#### ***"fixed"*** + +A shorthand for `fixed128x80`. + + diff --git a/docs/v5/api/utils/fixednumber/index.html b/docs/v5/api/utils/fixednumber/index.html new file mode 100644 index 000000000..9deccb699 --- /dev/null +++ b/docs/v5/api/utils/fixednumber/index.html @@ -0,0 +1,94 @@ + + + + FixedNumber + + + + +
+ + +

FixedNumber

A FixedNumber is a fixed-width (in bits) number with an internal base-10 divisor, which allows it to represent a decimal fractional component.

+ +

Creating Instances

The FixedNumber constructor cannot be called directly. There are several static methods for creating a FixedNumber.

+ +
FixedNumber.from( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

+ +
FixedNumber.fromBytes( aBytesLike [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

+ +
FixedNumber.fromString( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format. The value must not contain more decimals than the format permits.

+ +
FixedNumber.fromValue( value [ , decimals = 0 [ , format = "fixed" ] ] ) FixedNumber

Returns an instance of a FixedNumber for value with decimals as a format.

+ +

Properties

+
fixednumber.format

The FixedFormat of fixednumber.

+ +

Methods

+

Math Operations

+
fixednumber.addUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue + otherValue.

+ +
fixednumber.subUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue - otherValue.

+ +
fixednumber.mulUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue × otherValue.

+ +
fixednumber.divUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue ÷ otherValue.

+ +
fixednumber.round( [ decimals = 0 ] ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue rounded to decimals.

+ +

Conversion

+
fixednumber.toFormat( format ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue with format.

+ +
fixednumber.toHexString( ) string

Returns a HexString representation of fixednumber.

+ +
fixednumber.toString( ) string

Returns a string representation of fixednumber.

+ +
fixednumber.toUnsafeFloat( ) float

Returns a floating-point JavaScript number value of fixednumber. Due to rounding in JavaScript numbers, the value is only approximate.

+ +

Inspection

+
FixedNumber.isFixedNumber( value ) boolean

Returns true if and only if value is a FixedNumber.

+ +

FixedFormat

A FixedFormat is a simple object which represents a decimal (base-10) Fixed-Point data representation. Usually using this class directly is uneccessary, as passing in a Format Strings directly into the FixedNumber will automatically create this.

+ +

Format Strings

A format string is composed of three components, including signed-ness, bit-width and number of decimals.

+ +

A signed format string begins with fixed, which an unsigned format string begins with ufixed, followed by the width (in bits) and the number of decimals.

+ +

The width must be conguent to 0 mod 8 (i.e. (width % 8) == 0) and no larger than 256 bits and the number of decimals must be no larger than 80.

+ +

For example:

+ +

  • fixed128x18 is signed, 128 bits wide and has 18 decimals; this is useful for most purposes
  • fixed32x0 is signed, 32 bits wide and has 0 decimals; this would be the same as a int32_t in C
  • ufixed32x0 is unsigned, 32 bits wide and has 0 decimals; this would be the same as a uint32_t in C
  • fixed is shorthand for fixed128x18
  • ufixed is shorthand for ufixed128x18

+ +

Creating Instances

+
FixedFormat.from( value = "fixed128x18" ) FixedFormat

Returns a new instance of a FixedFormat defined by value. Any valid Format Strings may be passed in as well as any object which has any of signed, width and decimals defined, including a FixedFormat object.

+ +

Properties

+
fixedFormat.signed boolean

The signed-ness of fixedFormat, true if negative values are supported.

+ +
fixedFormat.width number

The width (in bits) of fixedFormat.

+ +
fixedFormat.decimals number

The number of decimal points of fixedFormat.

+ +
fixedFormat.name string

The name of the fixedFormat, which can be used to recreate the format and is the string that the Solidity language uses to represent this format.

+ +
"fixed"

A shorthand for fixed128x80.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/hashing/README.md b/docs/v5/api/utils/hashing/README.md new file mode 100644 index 000000000..71c58454d --- /dev/null +++ b/docs/v5/api/utils/hashing/README.md @@ -0,0 +1,206 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Hashing Algorithms +================== + +Cryptographic Hash Functions +---------------------------- + +#### *ethers* . *utils* . **id**( text ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The Ethereum Identity function computs the [KECCAK256](https://en.wikipedia.org/wiki/SHA-3) hash of the *text* bytes. + + +#### *ethers* . *utils* . **keccak256**( aBytesLike ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Returns the [KECCAK256](https://en.wikipedia.org/wiki/SHA-3) digest *aBytesLike*. + + +#### *ethers* . *utils* . **ripemd160**( aBytesLike ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 20 > >* + +Returns the [RIPEMD-160](https://en.m.wikipedia.org/wiki/RIPEMD) digest of *aBytesLike*. + + +#### *ethers* . *utils* . **sha256**( aBytesLike ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Returns the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) digest of *aBytesLike*. + + +#### *ethers* . *utils* . **sha512**( aBytesLike ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 64 > >* + +Returns the [SHA2-512](https://en.wikipedia.org/wiki/SHA-2) digest of *aBytesLike*. + + +```javascript +utils.keccak256([ 0x12, 0x34 ]) +//! + +utils.keccak256("0x") +//! + +utils.keccak256("0x1234") +//! + +// The value MUST be data, such as: +// - an Array of numbers +// - a data hex string (e.g. "0x1234") +// - a Uint8Array + +// Do NOT use UTF-8 strings that are not a DataHexstring +utils.keccak256("hello world") +//! error + +// If needed, convert strings to bytes first: +utils.keccak256(utils.toUtf8Bytes("hello world")) +//! + +// Or equivalently use the identity function: +utils.id("hello world") +//! + +// Keep in mind that the string "0x1234" represents TWO +// bytes (i.e. [ 0x12, 0x34 ]. If you wish to compute the +// hash of the 6 characters "0x1234", convert it to UTF-8 +// bytes first using utils.toUtf8Bytes. + +// Consider the following examples: + +// Hash of TWO (2) bytes: +utils.keccak256("0x1234") +//! + +// Hash of TWO (2) bytes: (same result) +utils.keccak256([ 0x12, 0x34 ]) +//! + +const bytes = utils.toUtf8Bytes("0x1234"); +// +bytes +// +//! + +// Hash of SIX (6) characters (different than above) +utils.keccak256(bytes) +//! + +// Hash of SIX (6) characters (same result) +utils.id("0x1234") +//! +``` + +```javascript +utils.ripemd160("0x") +//! + +utils.ripemd160("0x1234") +//! +``` + +```javascript +utils.sha256("0x") +//! + +utils.sha256("0x1234") +//! + +utils.sha512("0x") +//! + +utils.sha512("0x1234") +//! +``` + +HMAC +---- + +#### *ethers* . *utils* . **computeHmac**( algorithm , key , data ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Returns the [HMAC](https://en.wikipedia.org/wiki/HMAC) of *data* with *key* using the [Algorithm](/v5/api/utils/hashing/#utils--hmac-supported-algorithm) *algorithm*. + + +### HMAC Supported Algorithms + +#### *ethers* . *utils* . *SupportedAlgorithm* . **sha256** => *string* + +Use the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) hash algorithm. + + +#### *ethers* . *utils* . *SupportedAlgorithm* . **sha512** => *string* + +Use the [SHA2-512](https://en.wikipedia.org/wiki/SHA-2) hash algorithm. + + +```javascript +const key = "0x0102"; +const data = "0x1234"; +utils.computeHmac("sha256", key, data) +//! +``` + +Hashing Helpers +--------------- + +#### *ethers* . *utils* . **hashMessage**( message ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Computes the [EIP-191](https://eips.ethereum.org/EIPS/eip-191) personal message digest of *message*. Personal messages are converted to UTF-8 bytes and prefixed with `\x19Ethereum Signed Message:` and the length of *message*. + + +#### *ethers* . *utils* . **namehash**( name ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Returns the [ENS Namehash](https://docs.ens.domains/contract-api-reference/name-processing#hashing-names) of *name*. + + +```javascript +// @TODO: include exampels of hashMessage; it can be complex. :) +``` + +```javascript +utils.namehash("") +//! + +utils.namehash("eth") +//! + +utils.namehash("ricmoo.firefly.eth") +//! + +utils.namehash("ricmoo.xyz") +//! +``` + +Solidity Hashing Algorithms +--------------------------- + +#### *ethers* . *utils* . **solidityPack**( types , values ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Returns the non-standard encoded *values* packed according to their respecive type in *types*. + + +#### *ethers* . *utils* . **solidityKeccak256**( types , values ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Returns the [KECCAK256](https://en.wikipedia.org/wiki/SHA-3) of the non-standard encoded *values* packed according to their respective type in *types*. + + +#### *ethers* . *utils* . **soliditySha256**( types , values ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Returns the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) of the non-standard encoded *values* packed according to their respective type in *types*. + + +```javascript +utils.solidityPack([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.solidityPack([ "string", "uint8" ], [ "Hello", 3 ]) +//! + +utils.solidityKeccak256([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.soliditySha256([ "int16", "uint48" ], [ -1, 12 ]) +//! +``` + diff --git a/docs/v5/api/utils/hashing/index.html b/docs/v5/api/utils/hashing/index.html new file mode 100644 index 000000000..4fefa9acd --- /dev/null +++ b/docs/v5/api/utils/hashing/index.html @@ -0,0 +1,154 @@ + + + + Hashing Algorithms + + + + +
+ + +

Hashing Algorithms

Explain what hash functions are?

+ +

Cryptographic Hash Functions

The Cryptographic Hash Functions are a specific family of hash functions.

+ +
ethers.utils.id( text ) string< DataHexString< 32 > >

The Ethereum Identity function computs the KECCAK256 hash of the text bytes.

+ +
ethers.utils.keccak256( aBytesLike ) string< DataHexString< 32 > >

Returns the KECCAK256 digest aBytesLike.

+ +
ethers.utils.ripemd160( aBytesLike ) string< DataHexString< 20 > >

Returns the RIPEMD-160 digest of aBytesLike.

+ +
ethers.utils.sha256( aBytesLike ) string< DataHexString< 32 > >

Returns the SHA2-256 digest of aBytesLike.

+ +
ethers.utils.sha512( aBytesLike ) string< DataHexString< 64 > >

Returns the SHA2-512 digest of aBytesLike.

+ +
KECCAK256
utils.keccak256([ 0x12, 0x34 ]) +//! + +utils.keccak256("0x") +//! + +utils.keccak256("0x1234") +//! + +// The value MUST be data, such as: +// - an Array of numbers +// - a data hex string (e.g. "0x1234") +// - a Uint8Array + +// Do NOT use UTF-8 strings that are not a DataHexstring +utils.keccak256("hello world") +//! error + +// If needed, convert strings to bytes first: +utils.keccak256(utils.toUtf8Bytes("hello world")) +//! + +// Or equivalently use the identity function: +utils.id("hello world") +//! + +// Keep in mind that the string "0x1234" represents TWO +// bytes (i.e. [ 0x12, 0x34 ]. If you wish to compute the +// hash of the 6 characters "0x1234", convert it to UTF-8 +// bytes first using utils.toUtf8Bytes. + +// Consider the following examples: + +// Hash of TWO (2) bytes: +utils.keccak256("0x1234") +//! + +// Hash of TWO (2) bytes: (same result) +utils.keccak256([ 0x12, 0x34 ]) +//! + +const bytes = utils.toUtf8Bytes("0x1234"); +// <hide> +bytes +// </hide> +//! + +// Hash of SIX (6) characters (different than above) +utils.keccak256(bytes) +//! + +// Hash of SIX (6) characters (same result) +utils.id("0x1234") +//!
RIPEMD160
utils.ripemd160("0x") +//! + +utils.ripemd160("0x1234") +//!
SHA-2
utils.sha256("0x") +//! + +utils.sha256("0x1234") +//! + +utils.sha512("0x") +//! + +utils.sha512("0x1234") +//!

HMAC

+
ethers.utils.computeHmac( algorithm , key , data ) string< DataHexString >

Returns the HMAC of data with key using the Algorithm algorithm.

+ +

HMAC Supported Algorithms

+
ethers.utils.SupportedAlgorithm.sha256 string

Use the SHA2-256 hash algorithm.

+ +
ethers.utils.SupportedAlgorithm.sha512 string

Use the SHA2-512 hash algorithm.

+ +
HMAC
const key = "0x0102"; +const data = "0x1234"; +utils.computeHmac("sha256", key, data) +//!

Hashing Helpers

+
ethers.utils.hashMessage( message ) string< DataHexString< 32 > >

Computes the EIP-191 personal message digest of message. Personal messages are converted to UTF-8 bytes and prefixed with \x19Ethereum Signed Message: and the length of message.

+ +
ethers.utils.namehash( name ) string< DataHexString< 32 > >

Returns the ENS Namehash of name.

+ +
Hashing Messages
// @TODO: include exampels of hashMessage; it can be complex. :)
Namehash
utils.namehash("") +//! + +utils.namehash("eth") +//! + +utils.namehash("ricmoo.firefly.eth") +//! + +utils.namehash("ricmoo.xyz") +//!

Solidity Hashing Algorithms

When using the Solidity abi.packEncoded(...) function, a non-standard tightly packed version of encoding is used. These functions implement the tightly packing algorithm.

+ +
ethers.utils.solidityPack( types , values ) string< DataHexString >

Returns the non-standard encoded values packed according to their respecive type in types.

+ +
ethers.utils.solidityKeccak256( types , values ) string< DataHexString< 32 > >

Returns the KECCAK256 of the non-standard encoded values packed according to their respective type in types.

+ +
ethers.utils.soliditySha256( types , values ) string< DataHexString< 32 > >

Returns the SHA2-256 of the non-standard encoded values packed according to their respective type in types.

+ +
Solidity Hashing
utils.solidityPack([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.solidityPack([ "string", "uint8" ], [ "Hello", 3 ]) +//! + +utils.solidityKeccak256([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.soliditySha256([ "int16", "uint48" ], [ -1, 12 ]) +//!
+ + + +
+ + + diff --git a/docs/v5/api/utils/hdnode/README.md b/docs/v5/api/utils/hdnode/README.md new file mode 100644 index 000000000..5ff40aa98 --- /dev/null +++ b/docs/v5/api/utils/hdnode/README.md @@ -0,0 +1,153 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +HD Wallet +========= + +Types +----- + +### Constants + +#### *ethers* . *utils* . **defaultPath** => *"m/44'/60'/0'/0/0"* + +The default path for Ethereum in an HD Wallet + + +### Mnemonic + +#### *mnemonic* . **phrase** => *string* + +The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long and separated by the whitespace specified by the `locale`. + + +#### *mnemonic* . **path** => *string* + +The HD path for this mnemonic. + + +#### *mnemonic* . **locale** => *string* + +The language of the wordlist this mnemonic is using. + + +HDNode +------ + +### Creating Instances + +#### *ethers* . *HDNode* . **fromMnemonic**( phrase [ , password [ , wordlist ] ] ) => *[HDNode](/v5/api/utils/hdnode/#HDNode)* + +Return the [HDNode](/v5/api/utils/hdnode/#HDNode) for *phrase* with the optional *password* and *wordlist*. + + +#### *ethers* . *HDNode* . **fromSeed**( aBytesLike ) => *[HDNode](/v5/api/utils/hdnode/#HDNode)* + +Return the [HDNode](/v5/api/utils/hdnode/#HDNode) for the seed *aBytesLike*. + + +#### *ethers* . *HDNode* . **fromExtendedKey**( extendedKey ) => *[HDNode](/v5/api/utils/hdnode/#HDNode)* + +Return the [HDNode](/v5/api/utils/hdnode/#HDNode) for the *extendedKey*. If *extendedKey* was neutered, the **HDNode** will only be able to compute addresses and not private keys. + + +### Properties + +#### *hdNode* . **privateKey** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The private key for this HDNode. + + +#### *hdNode* . **publicKey** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 33 > >* + +The (compresses) public key for this HDNode. + + +#### *hdNode* . **fingerprint** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 4 > >* + +The fingerprint is meant as an index to quickly match parent and children nodes together, however collisions may occur and software should verify matching nodes. + +Most developers will not need to use this. + + +#### *hdNode* . **parentFingerprint** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 4 > >* + +The fingerprint of the parent node. See *fingerprint* for more details. + +Most developers will not need to use this. + + +#### *hdNode* . **address** => *string< [Address](/v5/api/utils/address/#address) >* + +The address of this HDNode. + + +#### *hdNode* . **mnemonic** => *[Mnemonic](/v5/api/utils/hdnode/#Mnemonic)* + +The mnemonic of this HDNode, if known. + + +#### *hdNode* . **path** => *string* + +The path of this HDNode, if known. If the *mnemonic* is also known, this will match `mnemonic.path`. + + +#### *hdNode* . **chainCode** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The chain code is used as a non-secret private key which is then used with EC-multiply to provide the ability to derive addresses without the private key of child non-hardened nodes. + +Most developers will not need to use this. + + +#### *hdNode* . **index** => *number* + +The index of this HDNode. This will match the last component of the *path*. + +Most developers will not need to use this. + + +#### *hdNode* . **depth** => *number* + +The depth of this HDNode. This will match the number of components (less one, the `m/`) of the *path*. + +Most developers will not need to use this. + + +#### *hdNode* . **extendedKey** => *string* + +A serialized string representation of this HDNode. Not all properties are included in the serialization, such as the mnemonic and path, so serializing and deserializing (using the `fromExtendedKey` class method) will result in reduced information. + + +### Methods + +#### *hdNode* . **neuter**( ) => *[HDNode](/v5/api/utils/hdnode/#HDNode)* + +Return a new instance of *hdNode* with its private key removed but all otehr properties preserved. This ensures that the key can not leak the private key of itself or any derived children, but may still be used to compute the addresses of itself and any non-hardened children. + + +#### *hdNode* . **derivePath**( path ) => *[HDNode](/v5/api/utils/hdnode/#HDNode)* + +Return a new [HDNode](/v5/api/utils/hdnode/#HDNode) which is the child of *hdNode* found by deriving *path*. + + +Other Functions +--------------- + +#### *ethers* . *utils* . **mnemonicToSeed**( phrase [ , password ] ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 64 > >* + +Convert a mnemonic phrase to a seed, according to [BIP-39](https://en.bitcoin.it/wiki/BIP_0039). + + +#### *ethers* . *utils* . **mnemonicToEntropy**( phrase [ , wordlist ] ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Convert a mnemonic phrase to its entropy, according to [BIP-39](https://en.bitcoin.it/wiki/BIP_0039). + + +#### *ethers* . *utils* . **isValidMnemonic**( phrase [ , wordlist ] ) => *boolean* + +Returns true if *phrase* is a valid mnemonic phrase, by testing the checksum. + + diff --git a/docs/v5/api/utils/hdnode/index.html b/docs/v5/api/utils/hdnode/index.html new file mode 100644 index 000000000..a483a2a6d --- /dev/null +++ b/docs/v5/api/utils/hdnode/index.html @@ -0,0 +1,95 @@ + + + + HD Wallet + + + + +
+ + +

HD Wallet

TODO: Explain BIP32 BIP-39 and whatnot here...

+ +

Types

+

Constants

+
ethers.utils.defaultPath "m/44'/60'/0'/0/0"

The default path for Ethereum in an HD Wallet

+ +

Mnemonic

+
mnemonic.phrase string

The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long and separated by the whitespace specified by the locale.

+ +
mnemonic.path string

The HD path for this mnemonic.

+ +
mnemonic.locale string

The language of the wordlist this mnemonic is using.

+ +

HDNode

+

Creating Instances

+
ethers.HDNode.fromMnemonic( phrase [ , password [ , wordlist ] ] ) HDNode

Return the HDNode for phrase with the optional password and wordlist.

+ +
ethers.HDNode.fromSeed( aBytesLike ) HDNode

Return the HDNode for the seed aBytesLike.

+ +
ethers.HDNode.fromExtendedKey( extendedKey ) HDNode

Return the HDNode for the extendedKey. If extendedKey was neutered, the HDNode will only be able to compute addresses and not private keys.

+ +

Properties

+
hdNode.privateKey string< DataHexString< 32 > >

The private key for this HDNode.

+ +
hdNode.publicKey string< DataHexString< 33 > >

The (compresses) public key for this HDNode.

+ +
hdNode.fingerprint string< DataHexString< 4 > >

The fingerprint is meant as an index to quickly match parent and children nodes together, however collisions may occur and software should verify matching nodes.

+ +

Most developers will not need to use this.

+ +
hdNode.parentFingerprint string< DataHexString< 4 > >

The fingerprint of the parent node. See fingerprint for more details.

+ +

Most developers will not need to use this.

+ +
hdNode.address string< Address >

The address of this HDNode.

+ +
hdNode.mnemonic Mnemonic

The mnemonic of this HDNode, if known.

+ +
hdNode.path string

The path of this HDNode, if known. If the mnemonic is also known, this will match mnemonic.path.

+ +
hdNode.chainCode string< DataHexString< 32 > >

The chain code is used as a non-secret private key which is then used with EC-multiply to provide the ability to derive addresses without the private key of child non-hardened nodes.

+ +

Most developers will not need to use this.

+ +
hdNode.index number

The index of this HDNode. This will match the last component of the path.

+ +

Most developers will not need to use this.

+ +
hdNode.depth number

The depth of this HDNode. This will match the number of components (less one, the m/) of the path.

+ +

Most developers will not need to use this.

+ +
hdNode.extendedKey string

A serialized string representation of this HDNode. Not all properties are included in the serialization, such as the mnemonic and path, so serializing and deserializing (using the fromExtendedKey class method) will result in reduced information.

+ +

Methods

+
hdNode.neuter( ) HDNode

Return a new instance of hdNode with its private key removed but all otehr properties preserved. This ensures that the key can not leak the private key of itself or any derived children, but may still be used to compute the addresses of itself and any non-hardened children.

+ +
hdNode.derivePath( path ) HDNode

Return a new HDNode which is the child of hdNode found by deriving path.

+ +

Other Functions

+
ethers.utils.mnemonicToSeed( phrase [ , password ] ) string< DataHexString< 64 > >

Convert a mnemonic phrase to a seed, according to BIP-39.

+ +
ethers.utils.mnemonicToEntropy( phrase [ , wordlist ] ) string< DataHexString >

Convert a mnemonic phrase to its entropy, according to BIP-39.

+ +
ethers.utils.isValidMnemonic( phrase [ , wordlist ] ) boolean

Returns true if phrase is a valid mnemonic phrase, by testing the checksum.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/index.html b/docs/v5/api/utils/index.html new file mode 100644 index 000000000..4d3ddaf5d --- /dev/null +++ b/docs/v5/api/utils/index.html @@ -0,0 +1,31 @@ + + + + Utilities + + + + +
+ + +

Utilities

These utilities are used extensively within the library, but are also quite useful for application developers.

+ + + + + +
+ + + diff --git a/docs/v5/api/utils/logger/README.md b/docs/v5/api/utils/logger/README.md new file mode 100644 index 000000000..ff6d7f900 --- /dev/null +++ b/docs/v5/api/utils/logger/README.md @@ -0,0 +1,235 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Logging +======= + +Logger +------ + +#### **new ***ethers* . *utils* . **Logger**( version ) + +Create a new logger which will include *version* in all errors thrown. + + +#### *Logger* . **globalLogger**( ) => *[Logger](/v5/api/utils/logger/#Logger)* + +Returns the singleton global logger. + + +### Logging Output + +#### *logger* . **debug**( ...args ) => *void* + +Log debugging information. + + +#### *logger* . **info**( ...args ) => *void* + +Log generic information. + + +#### *logger* . **warn**( ...args ) => *void* + +Log warnings. + + +### Errors + +#### *logger* . **makeError**( message [ , code = UNKNOWN_ERROR [ , params ] ] ) => *Error* + +Create an Error object with *message* and an optional *code* and additional *params* set. This is useful when an error is needed to be rejected instead of thrown. + + +#### *logger* . **throwError**( message [ , code = UNKNOWN_ERROR [ , params ] ] ) => *never* + +Throw an Error with *message* and an optional *code* and additional *params* set. + + +#### *logger* . **throwArgumentError**( message , name , value ) => *never* + +Throw an [INVALID_ARGUMENT](/v5/api/utils/logger/#errors-InvalidArgument) Error with *name* and *value*. + + +### Usage Validation + +#### *logger* . **checkAbstract**( target , kind ) => *void* + +Checks that *target* is not *kind* and performs the same operatons as `checkNew`. This is useful for ensuring abstract classes are not being instantiated. + + +#### *logger* . **checkArgumentCount**( count , expectedCound [ , message ) => *void* + +If *count* is not equal to *expectedCount*, throws a [MISSING_ARGUMENT](/v5/api/utils/logger/#errors-MissingArgument) or [UNEXPECTED_ARGUMENT](/v5/api/utils/logger/#errors-UnexpectedArgument) error. + + +#### *logger* . **checkNew**( target , kind ) => *void* + +If *target* is not a valid `this` or `target` value, throw a [MISSING_NEW](/v5/api/utils/logger/#errors-MissingNew) error. This is useful to ensure callers of a Class are using `new`. + + +#### *logger* . **checkNormalize**( message ) => *void* + +Check that the environment has a correctly functioning [String.normalize](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize). If not, a [UNSUPPORTED_OPERATION](/v5/api/utils/logger/#errors-UnsupportedOperation) error is thrown. + + +#### *logger* . **checkSafeUint53**( value [ , message ] ) => *void* + +If *value* is not safe as a [JavaScript number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format), throws a [NUMERIC_FAULT](/v5/api/utils/logger/#errors-NumericFault) error. + + +### Censorship + +#### *Logger* . **setCensorship**( censor [ , permanent = false ] ) => *void* + +Set error censorship, optionally preventing errors from being uncensored. + +In production applications, this prevents any error from leaking information by masking the message and values of errors. + +This can impact debugging, making it substantially more difficult. + + +#### *Logger* . **setLogLevel**( logLevel ) => *void* + +Set the log level, to suppress logging output below a [particular log level](/v5/api/utils/logger/#Logger-levels). + + +Errors +------ + +### Generic Error Codes + +#### *Logger* . *errors* . **NOT_IMPLEMENTED** + +The operation is not implemented. + + +#### *Logger* . *errors* . **SERVER_ERROR** + +There was an error communicating with a server. + + +#### *Logger* . *errors* . **TIMEOUT** + +A timeout occurred. + + +#### *Logger* . *errors* . **UNKNOWN_ERROR** + +A generic unknown error. + + +#### *Logger* . *errors* . **UNSUPPORTED_OPERATION** + +The operation is not supported. + + +### Safety Error Codes + +#### *Logger* . *errors* . **BUFFER_OVERRUN** + +The amount of data needed is more than the amount of data required, which would cause the data buffer to read past its end. + + +#### *Logger* . *errors* . **NUMERIC_FAULT** + +There was an invalid operation done on numeric values. + +Common cases of this occur when there is [overflow](https://en.wikipedia.org/wiki/Integer_overflow), [arithmetic underflow](https://en.wikipedia.org/wiki/Arithmetic_underflow) in fixed numeric types or division by zero. + + +### Usage Error Codes + +#### *Logger* . *errors* . **INVALID_ARGUMENT** + +The type or value of an argument is invalid. This will generally also include the `name` and `value` of the argument. Any function which accepts sensitive data (such as a private key) will include the string `[[REDACTED]]` instead of the value passed in. + + +#### *Logger* . *errors* . **MISSING_ARGUMENT** + +An expected parameter was not specified. + + +#### *Logger* . *errors* . **MISSING_NEW** + +An object is a Class, but is now being called with `new`. + + +#### *Logger* . *errors* . **UNEXPECTED_ARGUMENT** + +Too many parameters we passed into a function. + + +### Ethereum Error Codes + +#### *Logger* . *errors* . **CALL_EXCEPTION** + +An attempt to call a blockchain contract (getter) resulted in a revert or other error. + + +#### *Logger* . *errors* . **INSUFFICIENT_FUNDS** + +The account is attempting to make a transaction which costs more than is available. + +A sending account must have enough ether to pay for the value, the gas limit (at the gas price) as well as the intrinsic cost of data. The intrinsic cost of data is 4 gas for each zero byte and 68 gas for each non-zero byte. + + +#### *Logger* . *errors* . **NETWORK_ERROR** + +An Ethereum network validation error, such as an invalid chain ID. + + +#### *Logger* . *errors* . **NONCE_EXPIRED** + +The nonce being specified has already been used in a mined transaction. + + +#### *Logger* . *errors* . **REPLACEMENT_UNDERPRICED** + +When replacing a transaction, by using a nonce which has already been sent to the network, but which has not been mined yet the new transaction must specify a higher gas price. + +This error occurs when the gas price is insufficient to *bribe* the transaction pool to prefer the new transaction over the old one. Generally, the new gas price should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the replacement should be 15.000000001 gwei. + + +#### *Logger* . *errors* . **UNPREDICTABLE_GAS_LIMIT** + +When estimating the required amount of gas for a transaction, a node is queried for its best guess. + +If a node is unable (or unwilling) to predict the cost, this error occurs. + +The best remedy for this situation is to specify a gas limit in the transaction manually. + +This error can also indicate that the transaction is expected to fail regardless, if for example an account with no tokens is attempting to send a token. + + +Log Levels +---------- + +#### *Logger* . *levels* . **DEBUG** + +Log all output, including debugging information. + + +#### *Logger* . *levels* . **INFO** + +Only log output for infomational, warnings and errors. + + +#### *Logger* . *levels* . **WARNING** + +Only log output for warnings and errors. + + +#### *Logger* . *levels* . **ERROR** + +Only log output for errors. + + +#### *Logger* . *levels* . **OFF** + +Do not output any logs. + + diff --git a/docs/v5/api/utils/logger/index.html b/docs/v5/api/utils/logger/index.html new file mode 100644 index 000000000..eb2fe8aea --- /dev/null +++ b/docs/v5/api/utils/logger/index.html @@ -0,0 +1,139 @@ + + + + Logging + + + + +
+ + +

Logging

These are just a few simple logging utilities provided to simplify and standardize the error facilities across the Ethers library.

+ +

The Logger library has zero dependencies and is intentionally very light so it can be easily included in each library.

+ +

The Censorship functionality relies on one instance of the Ethers library being included. In large bundled packages or when npm link is used, this may not be the case. If you require this functionality, ensure that your bundling is configured properly.

+ +

Logger

+
new ethers.utils.Logger( version )

Create a new logger which will include version in all errors thrown.

+ +
Logger.globalLogger( ) Logger

Returns the singleton global logger.

+ +

Logging Output

+
logger.debug( ...args ) void

Log debugging information.

+ +
logger.info( ...args ) void

Log generic information.

+ +
logger.warn( ...args ) void

Log warnings.

+ +

Errors

These functions honor the current Censorship and help create a standard error model for detecting and processing errors within Ethers.

+ +
logger.makeError( message [ , code = UNKNOWN_ERROR [ , params ] ] ) Error

Create an Error object with message and an optional code and additional params set. This is useful when an error is needed to be rejected instead of thrown.

+ +
logger.throwError( message [ , code = UNKNOWN_ERROR [ , params ] ] ) never

Throw an Error with message and an optional code and additional params set.

+ +
logger.throwArgumentError( message , name , value ) never

Throw an INVALID_ARGUMENT Error with name and value.

+ +

Usage Validation

There can be used to ensure various properties and actions are safe.

+ +
logger.checkAbstract( target , kind ) void

Checks that target is not kind and performs the same operatons as checkNew. This is useful for ensuring abstract classes are not being instantiated.

+ +
logger.checkArgumentCount( count , expectedCound [ , message ) void

If count is not equal to expectedCount, throws a MISSING_ARGUMENT or UNEXPECTED_ARGUMENT error.

+ +
logger.checkNew( target , kind ) void

If target is not a valid this or target value, throw a MISSING_NEW error. This is useful to ensure callers of a Class are using new.

+ +
logger.checkNormalize( message ) void

Check that the environment has a correctly functioning String.normalize. If not, a UNSUPPORTED_OPERATION error is thrown.

+ +
logger.checkSafeUint53( value [ , message ] ) void

If value is not safe as a JavaScript number, throws a NUMERIC_FAULT error.

+ +

Censorship

+
Logger.setCensorship( censor [ , permanent = false ] ) void

Set error censorship, optionally preventing errors from being uncensored.

+ +

In production applications, this prevents any error from leaking information by masking the message and values of errors.

+ +

This can impact debugging, making it substantially more difficult.

+ +
Logger.setLogLevel( logLevel ) void

Set the log level, to suppress logging output below a particular log level.

+ +

Errors

Every error in Ethers has a code value, which is a string that will match one of the following error codes.

+ +

Generic Error Codes

+
Logger.errors.NOT_IMPLEMENTED

The operation is not implemented.

+ +
Logger.errors.SERVER_ERROR

There was an error communicating with a server.

+ +
Logger.errors.TIMEOUT

A timeout occurred.

+ +
Logger.errors.UNKNOWN_ERROR

A generic unknown error.

+ +
Logger.errors.UNSUPPORTED_OPERATION

The operation is not supported.

+ +

Safety Error Codes

+
Logger.errors.BUFFER_OVERRUN

The amount of data needed is more than the amount of data required, which would cause the data buffer to read past its end.

+ +
Logger.errors.NUMERIC_FAULT

There was an invalid operation done on numeric values.

+ +

Common cases of this occur when there is overflow, arithmetic underflow in fixed numeric types or division by zero.

+ +

Usage Error Codes

+
Logger.errors.INVALID_ARGUMENT

The type or value of an argument is invalid. This will generally also include the name and value of the argument. Any function which accepts sensitive data (such as a private key) will include the string [[REDACTED]] instead of the value passed in.

+ +
Logger.errors.MISSING_ARGUMENT

An expected parameter was not specified.

+ +
Logger.errors.MISSING_NEW

An object is a Class, but is now being called with new.

+ +
Logger.errors.UNEXPECTED_ARGUMENT

Too many parameters we passed into a function.

+ +

Ethereum Error Codes

+
Logger.errors.CALL_EXCEPTION

An attempt to call a blockchain contract (getter) resulted in a revert or other error.

+ +
Logger.errors.INSUFFICIENT_FUNDS

The account is attempting to make a transaction which costs more than is available.

+ +

A sending account must have enough ether to pay for the value, the gas limit (at the gas price) as well as the intrinsic cost of data. The intrinsic cost of data is 4 gas for each zero byte and 68 gas for each non-zero byte.

+ +
Logger.errors.NETWORK_ERROR

An Ethereum network validation error, such as an invalid chain ID.

+ +
Logger.errors.NONCE_EXPIRED

The nonce being specified has already been used in a mined transaction.

+ +
Logger.errors.REPLACEMENT_UNDERPRICED

When replacing a transaction, by using a nonce which has already been sent to the network, but which has not been mined yet the new transaction must specify a higher gas price.

+ +

This error occurs when the gas price is insufficient to bribe the transaction pool to prefer the new transaction over the old one. Generally, the new gas price should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the replacement should be 15.000000001 gwei.

+ +
Logger.errors.UNPREDICTABLE_GAS_LIMIT

When estimating the required amount of gas for a transaction, a node is queried for its best guess.

+ +

If a node is unable (or unwilling) to predict the cost, this error occurs.

+ +

The best remedy for this situation is to specify a gas limit in the transaction manually.

+ +

This error can also indicate that the transaction is expected to fail regardless, if for example an account with no tokens is attempting to send a token.

+ +

Log Levels

+
Logger.levels.DEBUG

Log all output, including debugging information.

+ +
Logger.levels.INFO

Only log output for infomational, warnings and errors.

+ +
Logger.levels.WARNING

Only log output for warnings and errors.

+ +
Logger.levels.ERROR

Only log output for errors.

+ +
Logger.levels.OFF

Do not output any logs.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/properties/README.md b/docs/v5/api/utils/properties/README.md new file mode 100644 index 000000000..cf9377603 --- /dev/null +++ b/docs/v5/api/utils/properties/README.md @@ -0,0 +1,33 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Property Utilities +================== + +#### *ethers* . *utils* . **checkProperties**( ) => *void* + + + +#### *ethers* . *utils* . **deepCopy**( anObject ) => *any* + + + +#### *ethers* . *utils* . **defineReadOnly**( anObject , name , value ) => *void* + + + +#### *ethers* . *utils* . **getStatic**( aConstructor , key ) => *any* + + + +#### *ethers* . *utils* . **resolveProperties**( anObject ) => *Promise< any >* + + + +#### *ethers* . *utils* . **shallowCopy**( anObject ) => *any* + + + diff --git a/docs/v5/api/utils/properties/index.html b/docs/v5/api/utils/properties/index.html new file mode 100644 index 000000000..5829adef3 --- /dev/null +++ b/docs/v5/api/utils/properties/index.html @@ -0,0 +1,36 @@ + + + + Property Utilities + + + + +
+ + +

Property Utilities

+
ethers.utils.checkProperties( ) void
+
ethers.utils.deepCopy( anObject ) any
+
ethers.utils.defineReadOnly( anObject , name , value ) void
+
ethers.utils.getStatic( aConstructor , key ) any
+
ethers.utils.resolveProperties( anObject ) Promise< any >
+
ethers.utils.shallowCopy( anObject ) any
+
+ + + +
+ + + diff --git a/docs/v5/api/utils/signing-key/README.md b/docs/v5/api/utils/signing-key/README.md new file mode 100644 index 000000000..3d0069e5a --- /dev/null +++ b/docs/v5/api/utils/signing-key/README.md @@ -0,0 +1,63 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Signing Key +=========== + +#### **new ***ethers* . *utils* . **SigningKey**( privateKey ) + +Create a new SigningKey for *privateKey*. + + +#### *signingKey* . **privateKey** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The private key for this Signing Key. + + +#### *signingKey* . **publicKey** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 65 > >* + +The uncompressed public key for this Signing Key. It will always be 65 bytes (130 nibbles) and begine with `0x04`. + + +#### *signingKey* . **compressedPublicKey** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 33 > >* + +The compressed public key for this Signing Key. It will always be 33 bytes (66 nibbles) and begine with either `0x02` or `0x03`. + + +#### *signingKey* . **signDigest**( digest ) => *[Signature](/v5/api/utils/bytes/#Signature)* + +Sign the *digest* and return the signature. + + +#### *signingKey* . **computeSharedSecret**( otherKey ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Compute the ECDH shared secret with *otherKey*. The *otherKey* may be either a public key or a private key, but generally will be a public key from another party. + +It is best practice that each party computes the hash of this before using it as a symmetric key. + + +#### *SigningKey* . **isSigningKey**( anObject ) => *boolean* + +Returns true if *anObject* is a SigningKey. + + +Other Functions +--------------- + +#### *ethers* . *utils* . **verifyMessage**( message , signature ) => *string< [Address](/v5/api/utils/address/#address) >* + +Returns the address that signed *message* producing *signature*. The signature may have a non-canonical v (i.e. does not need to be 27 or 28), in which case it will be normalized to compute the `recoveryParam` which will then be used to compute the address; this allows systems which use the v to encode additional data (such as [EIP-155](https://eips.ethereum.org/EIPS/eip-155)) to be used since the v parameter is still completely non-ambiguous. + + +#### *ethers* . *utils* . **recoverPublicKey**( digest , signature ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 65 > >* + + + +#### *ethers* . *utils* . **computePublicKey**( key [ , compressed = false ] ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Computes the public key of *key*, optionally compressing it. The *key* can be any form of public key (compressed or uncompressed) or a private key. + + diff --git a/docs/v5/api/utils/signing-key/index.html b/docs/v5/api/utils/signing-key/index.html new file mode 100644 index 000000000..b841883ea --- /dev/null +++ b/docs/v5/api/utils/signing-key/index.html @@ -0,0 +1,52 @@ + + + + Signing Key + + + + +
+ + +

Signing Key

+
new ethers.utils.SigningKey( privateKey )

Create a new SigningKey for privateKey.

+ +
signingKey.privateKey string< DataHexString< 32 > >

The private key for this Signing Key.

+ +
signingKey.publicKey string< DataHexString< 65 > >

The uncompressed public key for this Signing Key. It will always be 65 bytes (130 nibbles) and begine with 0x04.

+ +
signingKey.compressedPublicKey string< DataHexString< 33 > >

The compressed public key for this Signing Key. It will always be 33 bytes (66 nibbles) and begine with either 0x02 or 0x03.

+ +
signingKey.signDigest( digest ) Signature

Sign the digest and return the signature.

+ +
signingKey.computeSharedSecret( otherKey ) string< DataHexString< 32 > >

Compute the ECDH shared secret with otherKey. The otherKey may be either a public key or a private key, but generally will be a public key from another party.

+ +

It is best practice that each party computes the hash of this before using it as a symmetric key.

+ +
SigningKey.isSigningKey( anObject ) boolean

Returns true if anObject is a SigningKey.

+ +

Other Functions

+
ethers.utils.verifyMessage( message , signature ) string< Address >

Returns the address that signed message producing signature. The signature may have a non-canonical v (i.e. does not need to be 27 or 28), in which case it will be normalized to compute the `recoveryParam` which will then be used to compute the address; this allows systems which use the v to encode additional data (such as EIP-155) to be used since the v parameter is still completely non-ambiguous.

+ +
ethers.utils.recoverPublicKey( digest , signature ) string< DataHexString< 65 > >
+
ethers.utils.computePublicKey( key [ , compressed = false ] ) string< DataHexString >

Computes the public key of key, optionally compressing it. The key can be any form of public key (compressed or uncompressed) or a private key.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/strings/README.md b/docs/v5/api/utils/strings/README.md new file mode 100644 index 000000000..675313dcc --- /dev/null +++ b/docs/v5/api/utils/strings/README.md @@ -0,0 +1,159 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Strings +======= + +Bytes32String +------------- + +#### Note + +Strings that are 31 **bytes** long may contain fewer than 31 **characters**, since UTF-8 requires multiple bytes to encode international characters. + + +#### *ethers* . *utils* . **parseBytes32String**( aBytesLike ) => *string* + +Returns the decoded string represented by the `Bytes32` encoded data. + + +#### *ethers* . *utils* . **formatBytes32String**( text ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Returns a `bytes32` string representation of *text*. If the length of *text* exceeds 31 bytes, it will throw an error. + + +UTF-8 Strings +------------- + +#### *ethers* . *utils* . **toUtf8Bytes**( text [ , form = current ] ) => *Uint8Array* + +Returns the UTF-8 bytes of *text*, optionally normalizing it using the [UnicodeNormalizationForm](/v5/api/utils/strings/#strings--unicode-normalization-form) *form*. + + +#### *ethers* . *utils* . **toUtf8CodePoints**( text [ , form = current ] ) => *Array< number >* + +Returns the Array of codepoints of *text*, optionally normalized using the [UnicodeNormalizationForm](/v5/api/utils/strings/#strings--unicode-normalization-form) *form*. + + +#### Note + +This function correctly splits each **user-perceived character** into its codepoint, accounting for surrogate pairs. This should not be confused with `string.split("")`, which destroys surrogate pairs, spliting between each UTF-16 codeunit instead. + + +#### *ethers* . *utils* . **toUtf8String**( aBytesLike [ , onError = error ] ) => *string* + +Returns the string represented by the UTF-8 bytes of *aBytesLike*. + +The *onError* is a [Custom UTF-8 Error function](/v5/api/utils/strings/#strings--error-handling) and if not specified it defaults to the [error](/v5/api/utils/strings/#strings--Utf8Error) function, which throws an error on **any** UTF-8 error. + + +UnicodeNormalizationForm +------------------------ + +#### *ethers* . *utils* . *UnicodeNormalizationForm* . **current** + +Maintain the current normalization form. + + +#### *ethers* . *utils* . *UnicodeNormalizationForm* . **NFC** + +The Composed Normalization Form. This form uses single codepoints which represent the fully composed character. + +For example, the **e** is a single codepoint, `0x00e9`. + + +#### *ethers* . *utils* . *UnicodeNormalizationForm* . **NFD** + +The Decomposed Normalization Form. This form uses multiple codepoints (when necessary) to compose a character. + +For example, the **e** is made up of two codepoints, `"0x0065"` (which is the letter `"e"`) and `"0x0301"` which is a special diacritic UTF-8 codepoint which indicates the previous character should have an acute accent. + + +#### *ethers* . *utils* . *UnicodeNormalizationForm* . **NFKC** + +The Composed Normalization Form with Canonical Equivalence. The Canonical representation folds characters which have the same syntactic representation but different semantic meaning. + +For example, the Roman Numeral **I**, which has a UTF-8 codepoint `"0x2160"`, is folded into the capital letter I, `"0x0049"`. + + +#### *ethers* . *utils* . *UnicodeNormalizationForm* . **NFKD** + +The Decomposed Normalization Form with Canonical Equivalence. See NFKC for more an example. + + +#### Note + +Only certain specified characters are folded in Canonical Equivalence, and thus it should **not** be considered a method to acheive *any* level of security from [homoglyph attacks](https://en.wikipedia.org/wiki/IDN_homograph_attack). + + +Custom UTF-8 Error Handling +--------------------------- + +#### **errorFunction**( reason , offset , bytes , output [ , badCodepoint ] ) => *number* + +The *reason* is one of the [UTF-8 Error Reasons](/v5/api/utils/strings/#strings--error-reasons), *offset* is the index into *bytes* where the error was first encountered, output is the list of codepoints already processed (and may be modified) and in certain Error Reasons, the *badCodepoint* indicates the currently computed codepoint, but which would be rejected because its value is invalid. + +This function should return the number of bytes to skip past keeping in mind the value at *offset* will already be consumed. + + +### UTF-8 Error Reasons + +#### *ethers* . *utils* . *Utf8ErrorReason* . **BAD_PREFIX** + +A byte was encountered which is invalid to begin a UTF-8 byte sequence with. + + +#### *ethers* . *utils* . *Utf8ErrorReason* . **MISSING_CONTINUE** + +A UTF-8 sequence was begun, but did not have enough continuation bytes for the sequence. For this error the *ofset* is the index at which a continuation byte was expected. + + +#### *ethers* . *utils* . *Utf8ErrorReason* . **OUT_OF_RANGE** + +The computed codepoint is outside the range for valid UTF-8 codepoints (i.e. the codepoint is greater than 0x10ffff). This reason will pass the computed *badCountpoint* into the custom error function. + + +#### *ethers* . *utils* . *Utf8ErrorReason* . **OVERLONG** + +Due to the way UTF-8 allows variable length byte sequences to be used, it is possible to have multiple representations of the same character, which means [overlong sequences](https://en.wikipedia.org/wiki/UTF-8#Overlong_encodings) allow for a non-distinguished string to be formed, which can impact security as multiple strings that are otherwise equal can have different hashes. + +Generally, overlong sequences are an attempt to circumvent some part of security, but in rare cases may be produced by lazy libraries or used to encode the null terminating character in a way that is safe to include in a `char*`. + +This reason will pass the computed *badCountpoint* into the custom error function, which is actually a valid codepoint, just one that was arrived at through unsafe methods. + + +#### *ethers* . *utils* . *Utf8ErrorReason* . **OVERRUN** + +The string does not have enough characters remaining for the length of this sequence. + + +#### *ethers* . *utils* . *Utf8ErrorReason* . **UNEXPECTED_CONTINUE** + +This error is similar to BAD_PREFIX, since a continuation byte cannot begin a valid sequence, but many may wish to process this differently. However, most developers would want to trap this and perform the same operation as a BAD_PREFIX. + + +#### *ethers* . *utils* . *Utf8ErrorReason* . **UTF16_SURROGATE** + +The computed codepoint represents a value reserved for UTF-16 surrogate pairs. This reason will pass the computed surrogate half *badCountpoint* into the custom error function. + + +### Provided UTF-8 Error Handling Functions + +#### *ethers* . *utils* . *Utf8ErrorFuncs* . **error** + +The will throw an error on **any** error with a UTF-8 sequence, including invalid prefix bytes, overlong sequences, UTF-16 surrogate pairs. + + +#### *ethers* . *utils* . *Utf8ErrorFuncs* . **ignore** + +This will drop all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) from the final string as well as permit overlong sequences to be converted to their equivalent string. + + +#### *ethers* . *utils* . *Utf8ErrorFuncs* . **replace** + +This will replace all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) with the [UTF-8 Replacement Character](https://en.wikipedia.org/wiki/Specials_%28Unicode_block%29#Replacement_character), (i.e. U+FFFD). + + diff --git a/docs/v5/api/utils/strings/index.html b/docs/v5/api/utils/strings/index.html new file mode 100644 index 000000000..5a56215a8 --- /dev/null +++ b/docs/v5/api/utils/strings/index.html @@ -0,0 +1,105 @@ + + + + Strings + + + + +
+ + +

Strings

Tra la la

+ +

Bytes32String

A string in Solidity is length prefixed with its 256-bit (32 byte) length, which means that even short strings require 2 words (64 bytes) of storage.

+ +

In many cases, we deal with short strings, so instead of prefixing the string with its length, we can null-terminate it and fit it in a single word (32 bytes). Since we need only a single byte for the null termination, we can store strings up to 31 bytes long in a word.

+ +
Note

Strings that are 31 bytes long may contain fewer than 31 characters, since UTF-8 requires multiple bytes to encode international characters.

+ +
ethers.utils.parseBytes32String( aBytesLike ) string

Returns the decoded string represented by the Bytes32 encoded data.

+ +
ethers.utils.formatBytes32String( text ) string< DataHexString< 32 > >

Returns a bytes32 string representation of text. If the length of text exceeds 31 bytes, it will throw an error.

+ +

UTF-8 Strings

+
ethers.utils.toUtf8Bytes( text [ , form = current ] ) Uint8Array

Returns the UTF-8 bytes of text, optionally normalizing it using the UnicodeNormalizationForm form.

+ +
ethers.utils.toUtf8CodePoints( text [ , form = current ] ) Array< number >

Returns the Array of codepoints of text, optionally normalized using the UnicodeNormalizationForm form.

+ +
Note

This function correctly splits each user-perceived character into its codepoint, accounting for surrogate pairs. This should not be confused with string.split(""), which destroys surrogate pairs, spliting between each UTF-16 codeunit instead.

+ +
ethers.utils.toUtf8String( aBytesLike [ , onError = error ] ) string

Returns the string represented by the UTF-8 bytes of aBytesLike.

+ +

The onError is a Custom UTF-8 Error function and if not specified it defaults to the error function, which throws an error on any UTF-8 error.

+ +

UnicodeNormalizationForm

There are several commonly used forms when normalizing UTF-8 data, which allow strings to be compared or hashed in a stable way.

+ +
ethers.utils.UnicodeNormalizationForm.current

Maintain the current normalization form.

+ +
ethers.utils.UnicodeNormalizationForm.NFC

The Composed Normalization Form. This form uses single codepoints which represent the fully composed character.

+ +

For example, the é is a single codepoint, 0x00e9.

+ +
ethers.utils.UnicodeNormalizationForm.NFD

The Decomposed Normalization Form. This form uses multiple codepoints (when necessary) to compose a character.

+ +

For example, the é is made up of two codepoints, "0x0065" (which is the letter "e") and "0x0301" which is a special diacritic UTF-8 codepoint which indicates the previous character should have an acute accent.

+ +
ethers.utils.UnicodeNormalizationForm.NFKC

The Composed Normalization Form with Canonical Equivalence. The Canonical representation folds characters which have the same syntactic representation but different semantic meaning.

+ +

For example, the Roman Numeral I, which has a UTF-8 codepoint "0x2160", is folded into the capital letter I, "0x0049".

+ +
ethers.utils.UnicodeNormalizationForm.NFKD

The Decomposed Normalization Form with Canonical Equivalence. See NFKC for more an example.

+ +
Note

Only certain specified characters are folded in Canonical Equivalence, and thus it should not be considered a method to acheive any level of security from homoglyph attacks.

+ +

Custom UTF-8 Error Handling

When converting a string to its codepoints, there is the possibility of invalid byte sequences. Since certain situations may need specific ways to handle UTF-8 errors, a custom error handling function can be used, which has the signature:

+ +
errorFunction( reason , offset , bytes , output [ , badCodepoint ] ) number

The reason is one of the UTF-8 Error Reasons, offset is the index into bytes where the error was first encountered, output is the list of codepoints already processed (and may be modified) and in certain Error Reasons, the badCodepoint indicates the currently computed codepoint, but which would be rejected because its value is invalid.

+ +

This function should return the number of bytes to skip past keeping in mind the value at offset will already be consumed.

+ +

UTF-8 Error Reasons

+
ethers.utils.Utf8ErrorReason.BAD_PREFIX

A byte was encountered which is invalid to begin a UTF-8 byte sequence with.

+ +
ethers.utils.Utf8ErrorReason.MISSING_CONTINUE

A UTF-8 sequence was begun, but did not have enough continuation bytes for the sequence. For this error the ofset is the index at which a continuation byte was expected.

+ +
ethers.utils.Utf8ErrorReason.OUT_OF_RANGE

The computed codepoint is outside the range for valid UTF-8 codepoints (i.e. the codepoint is greater than 0x10ffff). This reason will pass the computed badCountpoint into the custom error function.

+ +
ethers.utils.Utf8ErrorReason.OVERLONG

Due to the way UTF-8 allows variable length byte sequences to be used, it is possible to have multiple representations of the same character, which means overlong sequences allow for a non-distinguished string to be formed, which can impact security as multiple strings that are otherwise equal can have different hashes.

+ +

Generally, overlong sequences are an attempt to circumvent some part of security, but in rare cases may be produced by lazy libraries or used to encode the null terminating character in a way that is safe to include in a char*.

+ +

This reason will pass the computed badCountpoint into the custom error function, which is actually a valid codepoint, just one that was arrived at through unsafe methods.

+ +
ethers.utils.Utf8ErrorReason.OVERRUN

The string does not have enough characters remaining for the length of this sequence.

+ +
ethers.utils.Utf8ErrorReason.UNEXPECTED_CONTINUE

This error is similar to BAD_PREFIX, since a continuation byte cannot begin a valid sequence, but many may wish to process this differently. However, most developers would want to trap this and perform the same operation as a BAD_PREFIX.

+ +
ethers.utils.Utf8ErrorReason.UTF16_SURROGATE

The computed codepoint represents a value reserved for UTF-16 surrogate pairs. This reason will pass the computed surrogate half badCountpoint into the custom error function.

+ +

Provided UTF-8 Error Handling Functions

There are already several functions available for the most common situations.

+ +
ethers.utils.Utf8ErrorFuncs.error

The will throw an error on any error with a UTF-8 sequence, including invalid prefix bytes, overlong sequences, UTF-16 surrogate pairs.

+ +
ethers.utils.Utf8ErrorFuncs.ignore

This will drop all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) from the final string as well as permit overlong sequences to be converted to their equivalent string.

+ +
ethers.utils.Utf8ErrorFuncs.replace

This will replace all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) with the UTF-8 Replacement Character, (i.e. U+FFFD).

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/transactions/README.md b/docs/v5/api/utils/transactions/README.md new file mode 100644 index 000000000..4985eea99 --- /dev/null +++ b/docs/v5/api/utils/transactions/README.md @@ -0,0 +1,134 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Transactions +============ + +Types +----- + +### UnsignedTransaction + +#### *unsignedTransaction* . **to** => *string< [Address](/v5/api/utils/address/#address) >* + +The addres this transaction is to. + + +#### *unsignedTransaction* . **nonce** => *number* + +The nonce of this transaction. + + +#### *unsignedTransaction* . **gasLimit** => *[BigNumberish](/v5/api/utils/bignumber/#BigNumberish)* + +The gas limit for this transaction. + + +#### *unsignedTransaction* . **gasPrice** => *[BigNumberish](/v5/api/utils/bignumber/#BigNumberish)* + +The gas price for this transaction. + + +#### *unsignedTransaction* . **data** => *[BytesLike](/v5/api/utils/bytes/#BytesLike)* + +The data for this transaction. + + +#### *unsignedTransaction* . **value** => *[BigNumberish](/v5/api/utils/bignumber/#BigNumberish)* + +The value (in wei) for this transaction. + + +#### *unsignedTransaction* . **chainId** => *number* + +The chain ID for this transaction. If the chain ID is 0 or null, then [EIP-155](https://eips.ethereum.org/EIPS/eip-155) is disabled and legacy signing is used, unless overridden in a signature. + + +### Transaction + +#### *transaction* . **hash** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The transaction hash, which can be used as an identifier for *transaction*. This is the keccak256 of the serialized RLP encoded representation of *transaction*. + + +#### *unsignedTransaction* . **to** => *string< [Address](/v5/api/utils/address/#address) >* + +The address *transaction* is to. + + +#### *transaction* . **from** => *string< [Address](/v5/api/utils/address/#address) >* + +The address *transaction* is from. + + +#### *transaction* . **nonce** => *number* + +The nonce for *transaction*. Each transaction sent to the network from an account includes this, which ensures the order and non-replayability of a transaction. This must be equal to the current number of transactions ever sent to the network by the **from** address. + + +#### *transaction* . **gasLimit** => *[BigNumber](/v5/api/utils/bignumber/)* + +The gas limit for *transaction*. An account must have enough ether to cover the gas (at the specified **gasPrice**). Any unused gas is refunded at the end of the transaction, and if there is insufficient gas to complete execution, the effects of the trasaction are reverted, but the gas is **fully consumed** and an out-of-gas error occurs. + + +#### *transaction* . **gasPrice** => *[BigNumber](/v5/api/utils/bignumber/)* + +The price (in wei) per unit of gas for *transaction*. + + +#### *transaction* . **data** => *[BytesLike](/v5/api/utils/bytes/#BytesLike)* + +The data for *transaction*. In a contract this is the call data. + + +#### *transaction* . **value** => *[BigNumber](/v5/api/utils/bignumber/)* + +The value (in wei) for *transaction*. + + +#### *transaction* . **chainId** => *number* + +The chain ID for *transaction*. This is used as part of [EIP-155](https://eips.ethereum.org/EIPS/eip-155) to prevent replay attacks on different networks. + +For example, if a transaction was made on ropsten with an account also used on homestead, it would be possible for a transaction signed on ropsten to be executed on homestead, which is likely unintended. + +There are situations where replay may be desired, however these are very rare and it is almost always recommended to specify the chain ID. + + +#### *transaction* . **r** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The r portion of the elliptic curve signatures for *transaction*. This is more accurately, the x coordinate of the point r (from which the y can be computed, along with v). + + +#### *transaction* . **s** => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +The s portion of the elliptic curve signatures for *transaction*. + + +#### *transaction* . **v** => *number* + +The v portion of the elliptic curve signatures for *transaction*. This is used to refine which of the two possible points a given x-coordinate can have, and in [EIP-155](https://eips.ethereum.org/EIPS/eip-155) is additionally used to encode the chain ID into the serialized transaction. + + +Functions +--------- + +#### *ethers* . *utils* . **parseTransaction**( aBytesLike ) => *[Transaction](/v5/api/utils/transactions/#Transaction)* + +Parses the transaction properties from a serialized transactions. + + +#### *ethers* . *utils* . **serializeTransaction**( tx [ , signature ] ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString) >* + +Computes the serialized *transaction*, optionally serialized with the a *signature*. If *signature* is not present, the unsigned serialized transaction is returned, which can be used to compute the hash necessary to sign. + +This function uses [EIP-155](https://eips.ethereum.org/EIPS/eip-155) if a chainId is provided, otherwise legacy serialization is used. It is **highly** recommended to always specify a *chainId*. + +If *signature* includes a chain ID (explicitly or implicitly by using an [EIP-155](https://eips.ethereum.org/EIPS/eip-155) `v` or `_vs`) it will be used to compute the chain ID. + +If there is a mismatch between the chain ID of *transaction* and *signature* an error is thrown. + + diff --git a/docs/v5/api/utils/transactions/index.html b/docs/v5/api/utils/transactions/index.html new file mode 100644 index 000000000..3b2e19956 --- /dev/null +++ b/docs/v5/api/utils/transactions/index.html @@ -0,0 +1,88 @@ + + + + Transactions + + + + +
+ + +

Transactions

+

Types

+

UnsignedTransaction

An unsigned transaction represents a transaction that has not been signed and its values are flexible as long as they are not ambiguous.

+ +
unsignedTransaction.to string< Address >

The addres this transaction is to.

+ +
unsignedTransaction.nonce number

The nonce of this transaction.

+ +
unsignedTransaction.gasLimit BigNumberish

The gas limit for this transaction.

+ +
unsignedTransaction.gasPrice BigNumberish

The gas price for this transaction.

+ +
unsignedTransaction.data BytesLike

The data for this transaction.

+ +
unsignedTransaction.value BigNumberish

The value (in wei) for this transaction.

+ +
unsignedTransaction.chainId number

The chain ID for this transaction. If the chain ID is 0 or null, then EIP-155 is disabled and legacy signing is used, unless overridden in a signature.

+ +

Transaction

A generic object to represent a transaction.

+ +
transaction.hash string< DataHexString< 32 > >

The transaction hash, which can be used as an identifier for transaction. This is the keccak256 of the serialized RLP encoded representation of transaction.

+ +
unsignedTransaction.to string< Address >

The address transaction is to.

+ +
transaction.from string< Address >

The address transaction is from.

+ +
transaction.nonce number

The nonce for transaction. Each transaction sent to the network from an account includes this, which ensures the order and non-replayability of a transaction. This must be equal to the current number of transactions ever sent to the network by the from address.

+ +
transaction.gasLimit BigNumber

The gas limit for transaction. An account must have enough ether to cover the gas (at the specified gasPrice). Any unused gas is refunded at the end of the transaction, and if there is insufficient gas to complete execution, the effects of the trasaction are reverted, but the gas is fully consumed and an out-of-gas error occurs.

+ +
transaction.gasPrice BigNumber

The price (in wei) per unit of gas for transaction.

+ +
transaction.data BytesLike

The data for transaction. In a contract this is the call data.

+ +
transaction.value BigNumber

The value (in wei) for transaction.

+ +
transaction.chainId number

The chain ID for transaction. This is used as part of EIP-155 to prevent replay attacks on different networks.

+ +

For example, if a transaction was made on ropsten with an account also used on homestead, it would be possible for a transaction signed on ropsten to be executed on homestead, which is likely unintended.

+ +

There are situations where replay may be desired, however these are very rare and it is almost always recommended to specify the chain ID.

+ +
transaction.r string< DataHexString< 32 > >

The r portion of the elliptic curve signatures for transaction. This is more accurately, the x coordinate of the point r (from which the y can be computed, along with v).

+ +
transaction.s string< DataHexString< 32 > >

The s portion of the elliptic curve signatures for transaction.

+ +
transaction.v number

The v portion of the elliptic curve signatures for transaction. This is used to refine which of the two possible points a given x-coordinate can have, and in EIP-155 is additionally used to encode the chain ID into the serialized transaction.

+ +

Functions

+
ethers.utils.parseTransaction( aBytesLike ) Transaction

Parses the transaction properties from a serialized transactions.

+ +
ethers.utils.serializeTransaction( tx [ , signature ] ) string< DataHexString >

Computes the serialized transaction, optionally serialized with the a signature. If signature is not present, the unsigned serialized transaction is returned, which can be used to compute the hash necessary to sign.

+ +

This function uses EIP-155 if a chainId is provided, otherwise legacy serialization is used. It is highly recommended to always specify a chainId.

+ +

If signature includes a chain ID (explicitly or implicitly by using an EIP-155 v or _vs) it will be used to compute the chain ID.

+ +

If there is a mismatch between the chain ID of transaction and signature an error is thrown.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/web/README.md b/docs/v5/api/utils/web/README.md new file mode 100644 index 000000000..300691bb4 --- /dev/null +++ b/docs/v5/api/utils/web/README.md @@ -0,0 +1,94 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Web Utilities +============= + +#### *ethers* . *utils* . **fetchJson**( urlOrConnectionInfo [ , json [ , processFunc ] ] ) => *Promise< any >* + +Fetch and parse the JSON content from *urlOrConnectionInfo*, with the optiona body *json* and optionally processing the result with *processFun* before returning it. + + +#### *ethers* . *utils* . **poll**( pollFunc [ , options ] ) => *Promise< any >* + +Repeatedly call pollFunc using the [PollOptions](/v5/api/utils/web/#PollOptions) until it returns a value other than undefined. + + +### ConnectionInfo + +#### *connection* . **url** => *string* + +The URL to connect to. + + +#### *connection* . **user** => *string* + +The username to use for [Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). The default is null (i.e. do not use basic authentication) + + +#### *connection* . **password** => *string* + +The password to use for [Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). The default is null (i.e. do not use basic authentication) + + +#### *connection* . **allowInsecureAuthentication** => *boolean* + +Allow [Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) over non-secure HTTP. The default is false. + + +#### *connection* . **timeout** => *number* + +How long to wait before rejecting with a *timeout* error. + + +#### *connection* . **headers** => *{[key:string]:string}* + +Additional headers to include in the connection. + + +### PollOptions + +#### *options* . **timeout** => *number* + +The amount of time allowed to ellapse before triggering a timeout error. + + +#### *options* . **floor** => *number* + +The minimum time limit to allow for [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff). + +The default is 0s. + + +#### *options* . **ceiling** => *number* + +The maximum time limit to allow for [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff). + +The default is 10s. + + +#### *options* . **interval** => *number* + +The interval used during [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff) calculation. + +The default is 250ms. + + +#### *options* . **retryLimit** => *number* + +The number of times to retry in the event of an error or *undefined* is returned. + + +#### *options* . **onceBlock** => *[Provider](/v5/api/providers/provider/)* + +If this is specified, the polling will wait on new blocks from *provider* before attempting the *pollFunc* again. + + +#### *options* . **oncePoll** => *[Provider](/v5/api/providers/provider/)* + +If this is specified, the polling will occur on each poll cycle of *provider* before attempting the *pollFunc* again. + + diff --git a/docs/v5/api/utils/web/index.html b/docs/v5/api/utils/web/index.html new file mode 100644 index 000000000..7dcb41b7b --- /dev/null +++ b/docs/v5/api/utils/web/index.html @@ -0,0 +1,68 @@ + + + + Web Utilities + + + + +
+ + +

Web Utilities

+
ethers.utils.fetchJson( urlOrConnectionInfo [ , json [ , processFunc ] ] ) Promise< any >

Fetch and parse the JSON content from urlOrConnectionInfo, with the optiona body json and optionally processing the result with processFun before returning it.

+ +
ethers.utils.poll( pollFunc [ , options ] ) Promise< any >

Repeatedly call pollFunc using the PollOptions until it returns a value other than undefined.

+ +

ConnectionInfo

+
connection.url string

The URL to connect to.

+ +
connection.user string

The username to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

+ +
connection.password string

The password to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

+ +
connection.allowInsecureAuthentication boolean

Allow Basic Authentication over non-secure HTTP. The default is false.

+ +
connection.timeout number

How long to wait before rejecting with a timeout error.

+ +
connection.headers {[key:string]:string}

Additional headers to include in the connection.

+ +

PollOptions

+
options.timeout number

The amount of time allowed to ellapse before triggering a timeout error.

+ +
options.floor number

The minimum time limit to allow for Exponential Backoff.

+ +

The default is 0s.

+ +
options.ceiling number

The maximum time limit to allow for Exponential Backoff.

+ +

The default is 10s.

+ +
options.interval number

The interval used during Exponential Backoff calculation.

+ +

The default is 250ms.

+ +
options.retryLimit number

The number of times to retry in the event of an error or undefined is returned.

+ +
options.onceBlock Provider

If this is specified, the polling will wait on new blocks from provider before attempting the pollFunc again.

+ +
options.oncePoll Provider

If this is specified, the polling will occur on each poll cycle of provider before attempting the pollFunc again.

+ +
+ + + +
+ + + diff --git a/docs/v5/api/utils/wordlists/README.md b/docs/v5/api/utils/wordlists/README.md new file mode 100644 index 000000000..ee4fede41 --- /dev/null +++ b/docs/v5/api/utils/wordlists/README.md @@ -0,0 +1,95 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Wordlists +========= + +Wordlist +-------- + +#### *wordlist* . **locale** => *string* + +The locale for this wordlist. + + +#### *wordlist* . **getWord**( index ) => *string* + +Returns the word at *index*. + + +#### *wordlist* . **getWordIndex**( word ) => *number* + +Returns the index of *word* within the wordlist. + + +#### *wordlist* . **split**( mnemonic ) => *Array< string >* + +Returns the mnemonic split into each individual word, according to a locale's valid whitespace character set. + + +#### *wordlist* . **join**( words ) => *string* + +Returns the mnemonic by joining *words* together using the whitespace that is standard for the locale. + + +#### *Wordlist* . **check**( wordlists ) => *string< [DataHexString](/v5/api/utils/bytes/#DataHexString)< 32 > >* + +Checks that all words map both directions correctly and return the hash of the lists. Sub-classes should use this to validate the wordlist is correct against the official wordlist hash. + + +#### *Wordlist* . **register**( wordlist [ , name ] ) => *void* + +Register a wordlist with the list of wordlists, optionally overriding the registered *name*. + + +Languages +--------- + +#### *ethers* . *wordlists* . **cz** => *Wordlist* + +The Czech [Wordlist](/v5/api/utils/wordlists/#Wordlist). + + +#### *ethers* . *wordlists* . **en** => *Wordlist* + +The English [Wordlist](/v5/api/utils/wordlists/#Wordlist). + + +#### *ethers* . *wordlists* . **es** => *Wordlist* + +The Spanish [Wordlist](/v5/api/utils/wordlists/#Wordlist). + + +#### *ethers* . *wordlists* . **fr** => *Wordlist* + +The French [Wordlist](/v5/api/utils/wordlists/#Wordlist). + + +#### *ethers* . *wordlists* . **it** => *Wordlist* + +The Italian [Wordlist](/v5/api/utils/wordlists/#Wordlist). + + +#### *ethers* . *wordlists* . **ja** => *Wordlist* + +The Japanese [Wordlist](/v5/api/utils/wordlists/#Wordlist). + + +#### *ethers* . *wordlists* . **ko** => *Wordlist* + +The Korean [Wordlist](/v5/api/utils/wordlists/#Wordlist). + + +#### *ethers* . *wordlists* . **zh_cn** => *Wordlist* + +The Simplified Chinese [Wordlist](/v5/api/utils/wordlists/#Wordlist). + + +#### *ethers* . *wordlists* . **zh_tw** => *Wordlist* + +The Traditional Chinese [Wordlist](/v5/api/utils/wordlists/#Wordlist). + + diff --git a/docs/v5/api/utils/wordlists/index.html b/docs/v5/api/utils/wordlists/index.html new file mode 100644 index 000000000..df079ecbd --- /dev/null +++ b/docs/v5/api/utils/wordlists/index.html @@ -0,0 +1,65 @@ + + + + Wordlists + + + + +
+ + +

Wordlists

+

Wordlist

+
wordlist.locale string

The locale for this wordlist.

+ +
wordlist.getWord( index ) string

Returns the word at index.

+ +
wordlist.getWordIndex( word ) number

Returns the index of word within the wordlist.

+ +
wordlist.split( mnemonic ) Array< string >

Returns the mnemonic split into each individual word, according to a locale's valid whitespace character set.

+ +
wordlist.join( words ) string

Returns the mnemonic by joining words together using the whitespace that is standard for the locale.

+ +
Wordlist.check( wordlists ) string< DataHexString< 32 > >

Checks that all words map both directions correctly and return the hash of the lists. Sub-classes should use this to validate the wordlist is correct against the official wordlist hash.

+ +
Wordlist.register( wordlist [ , name ] ) void

Register a wordlist with the list of wordlists, optionally overriding the registered name.

+ +

Languages

The official wordlists availalbe in at `ethers.wordlists`. In the browser, only the english langauge is available by default; to include the others (which increases the size of the library), see the dist files in the `ethers` package.

+ +
ethers.wordlists.cz Wordlist

The Czech Wordlist.

+ +
ethers.wordlists.en Wordlist

The English Wordlist.

+ +
ethers.wordlists.es Wordlist

The Spanish Wordlist.

+ +
ethers.wordlists.fr Wordlist

The French Wordlist.

+ +
ethers.wordlists.it Wordlist

The Italian Wordlist.

+ +
ethers.wordlists.ja Wordlist

The Japanese Wordlist.

+ +
ethers.wordlists.ko Wordlist

The Korean Wordlist.

+ +
ethers.wordlists.zh_cn Wordlist

The Simplified Chinese Wordlist.

+ +
ethers.wordlists.zh_tw Wordlist

The Traditional Chinese Wordlist.

+ +
+ + + +
+ + + diff --git a/docs/v5/cli/README.md b/docs/v5/cli/README.md new file mode 100644 index 000000000..acfaab94f --- /dev/null +++ b/docs/v5/cli/README.md @@ -0,0 +1,28 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Command Line Interfaces +======================= + +* [Sandbox Utility](ethers) + * [Help](ethers) + * [Examples](ethers) +* [Assembler](asm) + * [Help](asm) + * [Example Input Files](asm) + * [Assembler Examples](asm) + * [Disassembler Examples](asm) +* [Ethereum Naming Service](ens) + * [Help](ens) + * [Examples](ens) +* [TypeScript](typescript) + * [Help](typescript) + * [Examples](typescript) +* [Making Your Own](plugin) + * [CLI](plugin) + * [Plugin](plugin) + * [ArgParser](plugin) + diff --git a/docs/v5/cli/asm/README.md b/docs/v5/cli/asm/README.md new file mode 100644 index 000000000..6b38280b9 --- /dev/null +++ b/docs/v5/cli/asm/README.md @@ -0,0 +1,205 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Assembler +========= + +Help +---- + +``` +Usage: + ethers-asm [ FILENAME ] [ OPTIONS ] + +OPTIONS + --define KEY=VALUE provide assembler defines + --disassemble Disassemble input bytecode + --ignore-warnings Ignore warnings + --pic generate position independent code + --target LABEL output LABEL bytecode (default: _) + +OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit +``` + +Example Input Files +------------------- + +``` +; SimpleStore (uint) + +; Set the inital value of 42 +sstore(0, 42) + +; Init code to deploy myContract +codecopy(0, $myContract, #myContract) +return(0, #myContract) + +@myContract { + ; Non-payable + jumpi($error, callvalue) + + ; Get the Sighash + shr({{= 256 - 32 }}, calldataload(0)) + + ; getValue() + dup1 + {{= sighash("getValue()") }} + jumpi($getValue, eq) + + ; setValue(uint) + dup1 + {{= sighash("setValue(uint)") }} + jumpi($setValue, eq) + + ; No matching signature + @error: + revert(0, 0) + + @getValue: + mstore(0, sload(0)) + return (0, 32) + + @setValue: + ; Make sure we have exactly a uint + jumpi($error, iszero(eq(calldatasize, 36))) + + ; Store the value + sstore(0, calldataload(4)) + return (0, 0) + + ; There is no *need* for the PUSH32, it just makes + ; decompiled code look nicer + @checksum[ + {{= (defines.checksum ? concat([ + Opcode.from("PUSH32"), + id(myContract.source) + ]): "0x") + }} + ] +} +``` + +``` +0x602a6000556044601160003960446000f334601e5760003560e01c8063209652 +0x5514602457806355241077146030575b60006000fd5b60005460005260206000 +0xf35b6024361415601e5760043560005560006000f3 +``` + +#### Note: Bytecode File Syntax + +A bin file may be made up of multiple blocks of bytecode, each may optionally begin with a `0x` prefix, all of which **must** be of even length (since bytes are required, with 2 nibbles per byte) + +All whitespace is ignored. + + +Assembler Examples +------------------ + +``` +/home/ethers> ethers-asm SimpleStore.asm +0x602a6000556044601160003960446000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f3 + +# Piping in ASM source code +/home/ethers> cat SimpleStore.asm | ethers-asm +# Same as above + +# Setting a define which the ASM file checks and adds a checksum +/home/ethers> ethers-asm --define checksum SimpleStore.asm +0x602a6000556065601160003960656000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f37f10358310d664c9aeb4bf4ce7a10a6a03176bd23194c8ccbd3160a6dac90774d6 +``` + +### Options + +#### **--define KEY=VALUE** *or* **--define FLAG** + +This allows key/value pairs (where the value is a string) and flags (which the value is `true`) to be passed along to the assembler, which can be accessed in [Scripting Blocks](/v5/api/other/assembly/dialect/#asm-dialect-scripting), such as `{{= defined.someKey }}`. + + +#### **--ignore-warnings** + +By default any warning will be treated like an error. This enabled by-passing warnings. + + +#### **--pic** + +When a program is assembled, the labels are usually given as an absolute byte position, which can be jumped to for loops and control flow. This means that a program must be installed at a specific location. + +Byt specifying the **Position Independent Code** flag, code will be generated in a way such that all offsets are relative, allowing the program to be moved without any impact to its logic. + +This does incur an additional gsas cost of 8 gas per offset access though. + + +#### **--target LABEL** + +All programs have a root scope named `_` which is by default assembled. This option allows another labelled target (either a [Scopes](/v5/api/other/assembly/dialect/#asm-dialect-scope) or a [Data Segment](/v5/api/other/assembly/dialect/#asm-dialect-datasegment) to be assembled instead. The entire program is still assembled per usual, so this only impacts which part of the program is output. + + +Disassembler Examples +--------------------- + +``` +/home/ethers> ethers-asm --disassemble SimpleStore.bin +0000 : 0x2a ; #1 +0002 : 0x00 ; #1 +0004 : SSTORE +0005 : 0x44 ; #1 +0007 : 0x11 ; #1 +0009 : 0x00 ; #1 +000b : CODECOPY +000c : 0x44 ; #1 +000e : 0x00 ; #1 +0010 : RETURN +0011 : CALLVALUE +0012 : 0x1e ; #1 +0014 : JUMPI +0015 : 0x00 ; #1 +0017 : CALLDATALOAD +0018 : 0xe0 ; #1 +001a : SHR +001b : DUP1 +001c : 0x20965255 ; #4 +0021 : EQ +0022 : 0x24 ; #1 +0024 : JUMPI +0025 : DUP1 +0026 : 0x55241077 ; #4 +002b : EQ +002c : 0x30 ; #1 +002e : JUMPI +002f*: JUMPDEST +0030 : 0x00 ; #1 +0032 : 0x00 ; #1 +0034 : REVERT +0035*: JUMPDEST +0036 : 0x00 ; #1 +0038 : SLOAD +0039 : 0x00 ; #1 +003b : MSTORE +003c : 0x20 ; #1 +003e : 0x00 ; #1 +0040 : RETURN +0041*: JUMPDEST +0042 : 0x24 ; #1 +0044 : CALLDATASIZE +0045 : EQ +0046 : ISZERO +0047 : 0x1e ; #1 +0049 : JUMPI +004a : 0x04 ; #1 +004c : CALLDATALOAD +004d : 0x00 ; #1 +004f : SSTORE +0050 : 0x00 ; #1 +0052 : 0x00 ; #1 +0054 : RETURN + +/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble +# Same as above +``` + diff --git a/docs/v5/cli/asm/index.html b/docs/v5/cli/asm/index.html new file mode 100644 index 000000000..5f2467423 --- /dev/null +++ b/docs/v5/cli/asm/index.html @@ -0,0 +1,187 @@ + + + + Assembler + + + + +
+ + +

Assembler

The assembler Command-Line utility allows you to assemble the Ethers ASM Dialect into deployable EVM bytecode and disassemle EVM bytecode into human-readable mnemonics.

+ +

Help

+
Usage: + ethers-asm [ FILENAME ] [ OPTIONS ] + +OPTIONS + --define KEY=VALUE provide assembler defines + --disassemble Disassemble input bytecode + --ignore-warnings Ignore warnings + --pic generate position independent code + --target LABEL output LABEL bytecode (default: _) + +OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit

Example Input Files

+
SimpleStore.asm
; SimpleStore (uint) + +; Set the inital value of 42 +sstore(0, 42) + +; Init code to deploy myContract +codecopy(0, $myContract, #myContract) +return(0, #myContract) + +@myContract { + ; Non-payable + jumpi($error, callvalue) + + ; Get the Sighash + shr({{= 256 - 32 }}, calldataload(0)) + + ; getValue() + dup1 + {{= sighash("getValue()") }} + jumpi($getValue, eq) + + ; setValue(uint) + dup1 + {{= sighash("setValue(uint)") }} + jumpi($setValue, eq) + + ; No matching signature + @error: + revert(0, 0) + + @getValue: + mstore(0, sload(0)) + return (0, 32) + + @setValue: + ; Make sure we have exactly a uint + jumpi($error, iszero(eq(calldatasize, 36))) + + ; Store the value + sstore(0, calldataload(4)) + return (0, 0) + + ; There is no *need* for the PUSH32, it just makes + ; decompiled code look nicer + @checksum[ + {{= (defines.checksum ? concat([ + Opcode.from("PUSH32"), + id(myContract.source) + ]): "0x") + }} + ] +}
SimpleStore.bin
0x602a6000556044601160003960446000f334601e5760003560e01c8063209652 +0x5514602457806355241077146030575b60006000fd5b60005460005260206000 +0xf35b6024361415601e5760043560005560006000f3
Note: Bytecode File Syntax

A bin file may be made up of multiple blocks of bytecode, each may optionally begin with a 0x prefix, all of which must be of even length (since bytes are required, with 2 nibbles per byte)

+ +

All whitespace is ignored.

+ +

Assembler Examples

The assembler converts an Ethers ASM Dialect into bytecode by running multiple passes of an assemble stage, each pass more closely approximating the final result.

+ +

This allows small portions of the bytecode to be massaged and tweaked until the bytecode stablizes. This allows for more compact jump destinations and for code to be include more advanced meta-programming techniques.

+ +
/home/ethers> ethers-asm SimpleStore.asm +0x602a6000556044601160003960446000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f3 + +# Piping in ASM source code +/home/ethers> cat SimpleStore.asm | ethers-asm +# Same as above + +# Setting a define which the ASM file checks and adds a checksum +/home/ethers> ethers-asm --define checksum SimpleStore.asm +0x602a6000556065601160003960656000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f37f10358310d664c9aeb4bf4ce7a10a6a03176bd23194c8ccbd3160a6dac90774d6

Options

+
--define KEY=VALUE or --define FLAG

This allows key/value pairs (where the value is a string) and flags (which the value is true) to be passed along to the assembler, which can be accessed in Scripting Blocks, such as {{= defined.someKey }}.

+ +
--ignore-warnings

By default any warning will be treated like an error. This enabled by-passing warnings.

+ +
--pic

When a program is assembled, the labels are usually given as an absolute byte position, which can be jumped to for loops and control flow. This means that a program must be installed at a specific location.

+ +

Byt specifying the Position Independent Code flag, code will be generated in a way such that all offsets are relative, allowing the program to be moved without any impact to its logic.

+ +

This does incur an additional gsas cost of 8 gas per offset access though.

+ +
--target LABEL

All programs have a root scope named _ which is by default assembled. This option allows another labelled target (either a Scopes or a Data Segment to be assembled instead. The entire program is still assembled per usual, so this only impacts which part of the program is output.

+ +

Disassembler Examples

A disassembled program shows offsets and mnemonics for the given bytecode. This format may change in the future to be more human-readable.

+ +
/home/ethers> ethers-asm --disassemble SimpleStore.bin +0000 : 0x2a ; #1 +0002 : 0x00 ; #1 +0004 : SSTORE +0005 : 0x44 ; #1 +0007 : 0x11 ; #1 +0009 : 0x00 ; #1 +000b : CODECOPY +000c : 0x44 ; #1 +000e : 0x00 ; #1 +0010 : RETURN +0011 : CALLVALUE +0012 : 0x1e ; #1 +0014 : JUMPI +0015 : 0x00 ; #1 +0017 : CALLDATALOAD +0018 : 0xe0 ; #1 +001a : SHR +001b : DUP1 +001c : 0x20965255 ; #4 +0021 : EQ +0022 : 0x24 ; #1 +0024 : JUMPI +0025 : DUP1 +0026 : 0x55241077 ; #4 +002b : EQ +002c : 0x30 ; #1 +002e : JUMPI +002f*: JUMPDEST +0030 : 0x00 ; #1 +0032 : 0x00 ; #1 +0034 : REVERT +0035*: JUMPDEST +0036 : 0x00 ; #1 +0038 : SLOAD +0039 : 0x00 ; #1 +003b : MSTORE +003c : 0x20 ; #1 +003e : 0x00 ; #1 +0040 : RETURN +0041*: JUMPDEST +0042 : 0x24 ; #1 +0044 : CALLDATASIZE +0045 : EQ +0046 : ISZERO +0047 : 0x1e ; #1 +0049 : JUMPI +004a : 0x04 ; #1 +004c : CALLDATALOAD +004d : 0x00 ; #1 +004f : SSTORE +0050 : 0x00 ; #1 +0052 : 0x00 ; #1 +0054 : RETURN + +/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble +# Same as above
+ + + +
+ + + diff --git a/docs/v5/cli/ens/README.md b/docs/v5/cli/ens/README.md new file mode 100644 index 000000000..6f9eac6da --- /dev/null +++ b/docs/v5/cli/ens/README.md @@ -0,0 +1,87 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Ethereum Naming Service +======================= + +Help +---- + +``` +Usage: + ethers-ens COMMAND [ ARGS ] [ OPTIONS ] + +COMMANDS + lookup [ NAME | ADDRESS [ ... ] ] + Lookup a name or address + commit NAME Submit a pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + reveal NAME Reveal a previous pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + set-controller NAME Set the controller (default: current account) + [ --address ADDRESS ] Specify another address + set-subnode NAME Set a subnode owner (default: current account) + [ --address ADDRESS ] Specify another address + set-resolver NAME Set the resolver (default: resolver.eth) + [ --address ADDRESS ] Specify another address + set-addr NAME Set the addr record (default: current account) + [ --address ADDRESS ] Specify another address + set-text NAME KEY VALUE Set a text record + set-email NAME EMAIL Set the email text record + set-website NAME URL Set the website text record + set-content NAME HASH Set the IPFS Content Hash + migrate-registrar NAME Migrate from the Legacy to the Permanent Registrar + transfer NAME NEW_OWNER Transfer registrant ownership + reclaim NAME Reset the controller by the registrant + [ --address ADDRESS ] Specify another address + +ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password + +PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) + +TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending + +OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended. +``` + +Examples +-------- + diff --git a/docs/v5/cli/ens/index.html b/docs/v5/cli/ens/index.html new file mode 100644 index 000000000..4de78dc9a --- /dev/null +++ b/docs/v5/cli/ens/index.html @@ -0,0 +1,101 @@ + + + + Ethereum Naming Service + + + + +
+ + +

Ethereum Naming Service

+

Help

+
Usage: + ethers-ens COMMAND [ ARGS ] [ OPTIONS ] + +COMMANDS + lookup [ NAME | ADDRESS [ ... ] ] + Lookup a name or address + commit NAME Submit a pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + reveal NAME Reveal a previous pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + set-controller NAME Set the controller (default: current account) + [ --address ADDRESS ] Specify another address + set-subnode NAME Set a subnode owner (default: current account) + [ --address ADDRESS ] Specify another address + set-resolver NAME Set the resolver (default: resolver.eth) + [ --address ADDRESS ] Specify another address + set-addr NAME Set the addr record (default: current account) + [ --address ADDRESS ] Specify another address + set-text NAME KEY VALUE Set a text record + set-email NAME EMAIL Set the email text record + set-website NAME URL Set the website text record + set-content NAME HASH Set the IPFS Content Hash + migrate-registrar NAME Migrate from the Legacy to the Permanent Registrar + transfer NAME NEW_OWNER Transfer registrant ownership + reclaim NAME Reset the controller by the registrant + [ --address ADDRESS ] Specify another address + +ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password + +PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) + +TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending + +OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

TODO examples

+ + + + + +
+ + + diff --git a/docs/v5/cli/ethers/README.md b/docs/v5/cli/ethers/README.md new file mode 100644 index 000000000..b9130d8b4 --- /dev/null +++ b/docs/v5/cli/ethers/README.md @@ -0,0 +1,243 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Sandbox Utility +=============== + +Help +---- + +``` +Usage: + ethers [ COMMAND ] [ ARGS ] [ OPTIONS ] + +COMMANDS (default: sandbox) + sandbox Run a REPL VM environment with ethers + init FILENAME Create a new JSON wallet + [ --force ] Overwrite any existing files + fund TARGET Fund TARGET with testnet ether + info [ TARGET ... ] Dump info for accounts, addresses and ENS names + send TARGET ETHER Send ETHER ether to TARGET form accounts[0] + [ --allow-zero ] Allow sending to the address zero + [ --data DATA ] Include data in the transaction + sweep TARGET Send all ether from accounts[0] to TARGET + sign-message MESSAGE Sign a MESSAGE with accounts[0] + [ --hex ] The message content is hex encoded + eval CODE Run CODE in a VM with ethers + run FILENAME Run FILENAME in a VM with ethers + wait HASH Wait for a transaction HASH to be mined + wrap-ether VALUE Deposit VALUE into Wrapped Ether (WETH) + unwrap-ether VALUE Withdraw VALUE from Wrapped Ether (WETH) + send-token TOKEN ADDRESS VALUE + Send VALUE tokens (at TOKEN) to ADDRESS + compile FILENAME Compiles a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --warnings ] Error on any warning + deploy FILENAME Compile and deploy a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --contract NAME ] Specify the contract to deploy + +ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password + +PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) + +TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending + +OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended. +``` + +Examples +-------- + +``` +/home/ethers> ethers init wallet.json +Creating a new JSON Wallet - wallet.json +Keep this password and file SAFE!! If lost or forgotten +it CANNOT be recovered, by ANYone, EVER. +Choose a password: ****** +Confirm password: ****** +Encrypting... 100% +New account address: 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Saved: wallet.json + + +# If you are planning to try out the Ropsten testnet... +/home/ethers> ethers --network ropsten fund 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Transaction Hash: 0x8dc55b8f8dc8076acded97f9e3ed7d6162460c0221e2769806006b6d7d1156e0 +``` + +``` +# Sending ether +/home/ricmoo> ethers --account wallet.json send ricmoo.firefly.eth 0.123 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.123 ether + Nonce: 96 + Data: 0x + Gas Limit: 21000 + Gas Price: 1.2 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xc4adf8b379033d7ab679d199aa35e6ceee9a802ca5ab0656af067e911c4a589a + + +# Sending a token (SAI) +# NOTE: the contract address could be used instead but +# popular token contract addresses are also managed +# by ethers +/home/ricmoo> ethers --account wallet.json send-token sai.tokens.ethers.eth ricmoo.firefly.eth 1.0 +Sending Tokens: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + Token Contract: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + Value: 1.0 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.0 ether + Nonce: 95 + Data: 0xa9059cbb0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000 + Gas Limit: 37538 + Gas Price: 1.0 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xd609ecb7e3b5e8d36fd781dffceede3975ece6774b6322ea56cf1e4d0a17e3a1 +``` + +``` +/home/ethers> ethers --account wallet.json sign-message 'Hello World' +Password (wallet.json): ****** +Decrypting... 100% +Message: + Message: "Hello World" + Message (hex): 0x48656c6c6f20576f726c64 +Sign Message? (y/N/a) y +Signature + Flat: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a161b + r: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb + s: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + vs: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + v: 27 + recid: 0 +``` + +### Scripting + +``` +/home/ethers> ethers --network ropsten \ + --account wallet.json \ + eval \ + 'accounts[0].getBalance().then(b => formatEther(b))' +3.141592653589793238 +``` + +``` +/home/ethers> ethers --network rinkeby \ + eval "provider.getBlockNumber()" +5761009 +``` + +``` +/home/ethers> ethers eval 'utils.Fragment.from( + "function balanceOf(address) view returns (uint)" + ).format("json")' | json_pp +{ + "inputs" : [ + { + "type" : "address", + "name" : "owner" + } + ], + "type" : "function", + "payble" : false, + "stateMutability" : "view", + "ouputs" : [ + { + "type" : "uint256" + } + ], + "name" : "balanceOf", + "constant" : true +} +``` + +``` +/home/ricmoo> ethers eval 'id("Transfer(address,address,uint256")' +0xd99659a21de82e379975ce8df556f939a4ccb95e92144f38bb0dd35730ffcdd5 +``` + +``` +/home/ricmoo> ethers eval 'Wallet.createRandom().mnemonic' +useful pond inch knock ritual matrix giggle attend dilemma convince coach amazing +``` + +### Using Mnemonics (with a password) + +``` +/home/ricmoo> ethers --account mnemonic.txt --mnemonic-password +Password (mnemonic): ****** +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() + +'0x6d3F723EC1B73141AA4aC248c3ab34A5a1DAD776' +homestead> +``` + +### Using Mnemonics (with experimental memory-hard passwords) + +``` +/home/ricmoo> ethers --account mnemonic.txt --xxx-mnemonic-password +Password (mnemonic; experimental - hard): ****** +Decrypting... 100% +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() + +'0x56FC8792cC17971C19bEC4Ced978beEA44711EeD' +homestead> +``` + +#### Note + +This is still an experimental feature (hence the `xxx`). + + diff --git a/docs/v5/cli/ethers/index.html b/docs/v5/cli/ethers/index.html new file mode 100644 index 000000000..306cb7d76 --- /dev/null +++ b/docs/v5/cli/ethers/index.html @@ -0,0 +1,216 @@ + + + + Sandbox Utility + + + + +
+ + +

Sandbox Utility

The sandbox utility provides a simple way to use the most common ethers utilities required during learning, debuging and managing interactions with the Ethereum network.

+ +

If no command is given, it will enter a REPL interface with many of the ethers utilities already exposed.

+ +

Help

+
Usage: + ethers [ COMMAND ] [ ARGS ] [ OPTIONS ] + +COMMANDS (default: sandbox) + sandbox Run a REPL VM environment with ethers + init FILENAME Create a new JSON wallet + [ --force ] Overwrite any existing files + fund TARGET Fund TARGET with testnet ether + info [ TARGET ... ] Dump info for accounts, addresses and ENS names + send TARGET ETHER Send ETHER ether to TARGET form accounts[0] + [ --allow-zero ] Allow sending to the address zero + [ --data DATA ] Include data in the transaction + sweep TARGET Send all ether from accounts[0] to TARGET + sign-message MESSAGE Sign a MESSAGE with accounts[0] + [ --hex ] The message content is hex encoded + eval CODE Run CODE in a VM with ethers + run FILENAME Run FILENAME in a VM with ethers + wait HASH Wait for a transaction HASH to be mined + wrap-ether VALUE Deposit VALUE into Wrapped Ether (WETH) + unwrap-ether VALUE Withdraw VALUE from Wrapped Ether (WETH) + send-token TOKEN ADDRESS VALUE + Send VALUE tokens (at TOKEN) to ADDRESS + compile FILENAME Compiles a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --warnings ] Error on any warning + deploy FILENAME Compile and deploy a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --contract NAME ] Specify the contract to deploy + +ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password + +PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) + +TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending + +OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

+
Creating New Wallets
/home/ethers> ethers init wallet.json +Creating a new JSON Wallet - wallet.json +Keep this password and file SAFE!! If lost or forgotten +it CANNOT be recovered, by ANYone, EVER. +Choose a password: ****** +Confirm password: ****** +Encrypting... 100% +New account address: 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Saved: wallet.json + + +# If you are planning to try out the Ropsten testnet... +/home/ethers> ethers --network ropsten fund 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Transaction Hash: 0x8dc55b8f8dc8076acded97f9e3ed7d6162460c0221e2769806006b6d7d1156e0
Sending Ether and Tokens
# Sending ether +/home/ricmoo> ethers --account wallet.json send ricmoo.firefly.eth 0.123 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.123 ether + Nonce: 96 + Data: 0x + Gas Limit: 21000 + Gas Price: 1.2 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xc4adf8b379033d7ab679d199aa35e6ceee9a802ca5ab0656af067e911c4a589a + + +# Sending a token (SAI) +# NOTE: the contract address could be used instead but +# popular token contract addresses are also managed +# by ethers +/home/ricmoo> ethers --account wallet.json send-token sai.tokens.ethers.eth ricmoo.firefly.eth 1.0 +Sending Tokens: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + Token Contract: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + Value: 1.0 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.0 ether + Nonce: 95 + Data: 0xa9059cbb0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000 + Gas Limit: 37538 + Gas Price: 1.0 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xd609ecb7e3b5e8d36fd781dffceede3975ece6774b6322ea56cf1e4d0a17e3a1
Signing Messages
/home/ethers> ethers --account wallet.json sign-message 'Hello World' +Password (wallet.json): ****** +Decrypting... 100% +Message: + Message: "Hello World" + Message (hex): 0x48656c6c6f20576f726c64 +Sign Message? (y/N/a) y +Signature + Flat: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a161b + r: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb + s: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + vs: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + v: 27 + recid: 0

Scripting

The eval command can be used to execute simple one-line scripts from the command line to be passed into other commands or stored in script environment variables.

+ +
Get the formatted balance of an account
/home/ethers> ethers --network ropsten \ + --account wallet.json \ + eval \ + 'accounts[0].getBalance().then(b => formatEther(b))' +3.141592653589793238
Get the current block number
/home/ethers> ethers --network rinkeby \ + eval "provider.getBlockNumber()" +5761009
Convert a Solidity signature to JSON
/home/ethers> ethers eval 'utils.Fragment.from( + "function balanceOf(address) view returns (uint)" + ).format("json")' | json_pp +{ + "inputs" : [ + { + "type" : "address", + "name" : "owner" + } + ], + "type" : "function", + "payble" : false, + "stateMutability" : "view", + "ouputs" : [ + { + "type" : "uint256" + } + ], + "name" : "balanceOf", + "constant" : true +}
Compute a topic hash
/home/ricmoo> ethers eval 'id("Transfer(address,address,uint256")' +0xd99659a21de82e379975ce8df556f939a4ccb95e92144f38bb0dd35730ffcdd5
Create a random mnemonic
/home/ricmoo> ethers eval 'Wallet.createRandom().mnemonic' +useful pond inch knock ritual matrix giggle attend dilemma convince coach amazing

Using Mnemonics (with a password)

All mnemonic phrases have a password, but the default is to use the empty string (i.e. "") as the password. If you have a password on your mnemonic, the --mnemonic-password will prompt for the password to use to decrypt the account.

+ +
/home/ricmoo> ethers --account mnemonic.txt --mnemonic-password +Password (mnemonic): ****** +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() +<Promise id=0 resolved> +'0x6d3F723EC1B73141AA4aC248c3ab34A5a1DAD776' +homestead>

Using Mnemonics (with experimental memory-hard passwords)

The --xxx-mnemonic-password is similar to the --mnemonic-password options, which uses a password to decrypt the account for a mnemonic, however it passes the password through the scrypt password-based key derivation function first, which is intentionally slow and makes a brute-force attack far more difficult.

+ +
/home/ricmoo> ethers --account mnemonic.txt --xxx-mnemonic-password +Password (mnemonic; experimental - hard): ****** +Decrypting... 100% +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() +<Promise id=0 resolved> +'0x56FC8792cC17971C19bEC4Ced978beEA44711EeD' +homestead>
Note

This is still an experimental feature (hence the xxx).

+ +
+ + + +
+ + + diff --git a/docs/v5/cli/index.html b/docs/v5/cli/index.html new file mode 100644 index 000000000..cffd9a952 --- /dev/null +++ b/docs/v5/cli/index.html @@ -0,0 +1,30 @@ + + + + Command Line Interfaces + + + + +
+ + +

Command Line Interfaces

+ + + + +
+ + + diff --git a/docs/v5/cli/plugin/README.md b/docs/v5/cli/plugin/README.md new file mode 100644 index 000000000..d14d22fb8 --- /dev/null +++ b/docs/v5/cli/plugin/README.md @@ -0,0 +1,157 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Making Your Own +=============== + +CLI +--- + +#### **addPlugin**( command , pluginClass ) => *void* + +Add a *plugin* class for the *command*. After all options and flags have been consumed, the first argument will be consumed and the associated plugin class will be instantiated and run. + + +#### **setPlugin**( pluginClass ) => *void* + +Set a dedicated [Plugin](/v5/cli/plugin/#cli-plugin) class which will handle all input. This may not be used in conjuction with addPlugin and will not automatically accept a command from the arguments. + + +#### **showUsage**( [ message = "" [ , status = 0 ] ] ) => *never* + +Shows the usage help screen for the CLI and terminates. + + +#### **run**( args ) => *Promise< void >* + +Usually the value of *args* passed in will be `process.argv.slice(2)`. + + +Plugin +------ + +#### *plugin* . **network** => *[Network](/v5/api/providers/types/#providers-Network)* + +The network this plugin is running for. + + +#### *plugin* . **provider** => *[Provider](/v5/api/providers/provider/)* + +The provider for this plugin is running for. + + +#### *plugin* . **accounts** => *Array< [Signer](/v5/api/signer/#Signer) >* + +The accounts passed into the plugin using `--account`, `--account-rpc` and `--account-void` which this plugin can use. + + +#### *plugin* . **gasLimit** => *[BigNumber](/v5/api/utils/bignumber/)* + +The gas limit this plugin should use. This is null if unspecified. + + +#### *plugin* . **gasPrice** => *[BigNumber](/v5/api/utils/bignumber/)* + +The gas price this plugin should use. This is null if unspecified. + + +#### *plugin* . **nonce** => *number* + +The initial nonce for the account this plugin should use. + + +### Methods + +#### *plugin* . **prepareOptions**( argParser [ , verifyOnly = false ] ) => *Promise< void >* + + + +#### *plugin* . **prepareArgs**( args ) => *Promise< void >* + + + +#### *plugin* . **run**( ) => *Promise< void >* + + + +#### *plugin* . **getAddress**( addressOrName [ , message = "" , [ allowZero = false ] ] ) => *Promise< string >* + +A plugin should use this method to resolve an address. If the resovled address is the zero address and *allowZero* is not true, an error is raised. + + +#### *plugin* . **dump**( header , info ) => *void* + +Dumps the contents of *info* to the console with a *header* in a nicely formatted style. In the future, plugins may support a JSON output format which will automatically work with this method. + + +#### *plugin* . **throwUsageError**( [ message = "" ] ) => *never* + +Stops exectuion of the plugin and shows the help screen of the plugin with the optional *message*. + + +#### *plugin* . **throwError**( message ) => *never* + +Stops execution of the plugin and shows *message*. + + +### Static Methods + +#### *Plugin* . **getHelp** => *Help* + +Each subclass should implement this static method which is used to generate the help screen. + + +#### *Plugin* . **getOptionHelp** => *Array< Help >* + +Each subclass should implement this static method if it supports additional options which is used to generate the help screen. + + +ArgParser +--------- + +``` +/home/ethers> ethers --account wallet.json --yes send ricmoo.eth 1.0 +# An Option ----------^ ^ ^ +# - name = "account" | | +# - value = "wallet.json" | | +# A Flag -----------------------------------+ | +# - name = "yes" | +# - value = true | +# Arguments ------------------------------------+ +# - count = 3 +# - [ "send", "ricmoo.eth", "1.0" ] +``` + + +Flags are simple binary options (such as the `--yes`), which are true if present otherwise false. + +Options require a single parameter follow them on the command line (such as `--account wallet.json`, which nhas the name `account` and the value `wallet.json`) + +Arguments are all other values on the command line, and are not accessed through the **ArgParser** directly. + +When a CLI is run, an **ArgParser** is used to validate the command line by using prepareOptions, which consumes all flags and options leaving only the arguments behind, which are then passed into prepareArgs. + + +#### *argParser* . **consumeFlag**( name ) => *boolean* + +Remove the flag *name* and return true if it is present. + + +#### *argParser* . **consumeMultiOptions**( names ) => *Array< {name:string,value:string} >* + +Remove all options which match any name in the Array of *names* with their values returning the list (in order) of values. + + +#### *argParser* . **consumeOption**( name ) => *string* + +Remove the option with its value for *name* and return the value. This will throw a UsageError if the option is included multiple times. + + +#### *argParser* . **consumeOptions**( name ) => *Array< string >* + +Remove all options with their values for *name* and return the list (in order) of values. + + diff --git a/docs/v5/cli/plugin/index.html b/docs/v5/cli/plugin/index.html new file mode 100644 index 000000000..1cde1c715 --- /dev/null +++ b/docs/v5/cli/plugin/index.html @@ -0,0 +1,109 @@ + + + + Making Your Own + + + + +
+ + +

Making Your Own

The cli library is meant to make it easy to create command line utilities of your own.

+ +

A CLI handles parsing all the command-line flags, options and arguments and instantiates a Plugin to process the command.

+ +

A CLI may support multiple Plugin's in which case the first argument is used to determine which to run (or if no arguments, the default plugin will be selected) or may be designed to be standalone, in which case exactly one Plugin will be used and no command argument is allowed.

+ +
addPlugin( command , pluginClass ) void

Add a plugin class for the command. After all options and flags have been consumed, the first argument will be consumed and the associated plugin class will be instantiated and run.

+ +
setPlugin( pluginClass ) void

Set a dedicated Plugin class which will handle all input. This may not be used in conjuction with addPlugin and will not automatically accept a command from the arguments.

+ +
showUsage( [ message = "" [ , status = 0 ] ] ) never

Shows the usage help screen for the CLI and terminates.

+ +
run( args ) Promise< void >

Usually the value of args passed in will be process.argv.slice(2).

+ +

Plugin

Each Plugin manages each command of a CLI and is executed in phases.

+ +

If the usage (i.e. help) of a CLI is requested, the static methods getHelp and getOptionHelp are used to geneate the help screen.

+ +

Otherwise, a plugin is instantiated and the prepareOptions is called. Each plugin must call super.prepareOptions, otherwise the basic options are not yet processed. During this time a Plugin should consume all the flags and options it understands, since any left over flags or options will cause the CLI to bail and issue an unknown option error. This should throw if a value for a given option is invalid or some combination of options and flags is not allowed.

+ +

Once the prepareOptions is complete (the returned promise is resolved), the prepareArguments is called. This should validate the number of arguments is expected and throw and error if there are too many or too few arguments or if any arguments do not make sense.

+ +

Once the prepareArguments is complete (the returned promise is resolved), the run is called.

+ +
plugin.network Network

The network this plugin is running for.

+ +
plugin.provider Provider

The provider for this plugin is running for.

+ +
plugin.accounts Array< Signer >

The accounts passed into the plugin using --account, --account-rpc and --account-void which this plugin can use.

+ +
plugin.gasLimit BigNumber

The gas limit this plugin should use. This is null if unspecified.

+ +
plugin.gasPrice BigNumber

The gas price this plugin should use. This is null if unspecified.

+ +
plugin.nonce number

The initial nonce for the account this plugin should use.

+ +

Methods

+
plugin.prepareOptions( argParser [ , verifyOnly = false ] ) Promise< void >
+
plugin.prepareArgs( args ) Promise< void >
+
plugin.run( ) Promise< void >
+
plugin.getAddress( addressOrName [ , message = "" , [ allowZero = false ] ] ) Promise< string >

A plugin should use this method to resolve an address. If the resovled address is the zero address and allowZero is not true, an error is raised.

+ +
plugin.dump( header , info ) void

Dumps the contents of info to the console with a header in a nicely formatted style. In the future, plugins may support a JSON output format which will automatically work with this method.

+ +
plugin.throwUsageError( [ message = "" ] ) never

Stops exectuion of the plugin and shows the help screen of the plugin with the optional message.

+ +
plugin.throwError( message ) never

Stops execution of the plugin and shows message.

+ +

Static Methods

+
Plugin.getHelp Help

Each subclass should implement this static method which is used to generate the help screen.

+ +
Plugin.getOptionHelp Array< Help >

Each subclass should implement this static method if it supports additional options which is used to generate the help screen.

+ +

ArgParser

The ArgParser is used to parse a command line into flags, options and arguments.

+ +
/home/ethers> ethers --account wallet.json --yes send ricmoo.eth 1.0 +# An Option ----------^ ^ ^ +# - name = "account" | | +# - value = "wallet.json" | | +# A Flag -----------------------------------+ | +# - name = "yes" | +# - value = true | +# Arguments ------------------------------------+ +# - count = 3 +# - [ "send", "ricmoo.eth", "1.0" ]

Flags are simple binary options (such as the --yes), which are true if present otherwise false.

+ +

Options require a single parameter follow them on the command line (such as --account wallet.json, which nhas the name account and the value wallet.json)

+ +

Arguments are all other values on the command line, and are not accessed through the ArgParser directly.

+ +

When a CLI is run, an ArgParser is used to validate the command line by using prepareOptions, which consumes all flags and options leaving only the arguments behind, which are then passed into prepareArgs.

+ +
argParser.consumeFlag( name ) boolean

Remove the flag name and return true if it is present.

+ +
argParser.consumeMultiOptions( names ) Array< {name:string,value:string} >

Remove all options which match any name in the Array of names with their values returning the list (in order) of values.

+ +
argParser.consumeOption( name ) string

Remove the option with its value for name and return the value. This will throw a UsageError if the option is included multiple times.

+ +
argParser.consumeOptions( name ) Array< string >

Remove all options with their values for name and return the list (in order) of values.

+ +
+ + + +
+ + + diff --git a/docs/v5/cli/typescript/README.md b/docs/v5/cli/typescript/README.md new file mode 100644 index 000000000..ebe401adc --- /dev/null +++ b/docs/v5/cli/typescript/README.md @@ -0,0 +1,35 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +TypeScript +========== + +Help +---- + +``` +Usage: + ethers-ts FILENAME [ ... ] [ OPTIONS ] + +OPTIONS + --output FILENAME Write the output to FILENAME (default: stdout) + --force Overwrite files if they already exist + --no-optimize Do not run the solc optimizer + --no-bytecode Do not include bytecode and Factory methods + +OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended. +``` + +Examples +-------- + diff --git a/docs/v5/cli/typescript/index.html b/docs/v5/cli/typescript/index.html new file mode 100644 index 000000000..dffa7885e --- /dev/null +++ b/docs/v5/cli/typescript/index.html @@ -0,0 +1,49 @@ + + + + TypeScript + + + + +
+ + +

TypeScript

+

Help

+
Usage: + ethers-ts FILENAME [ ... ] [ OPTIONS ] + +OPTIONS + --output FILENAME Write the output to FILENAME (default: stdout) + --force Overwrite files if they already exist + --no-optimize Do not run the solc optimizer + --no-bytecode Do not include bytecode and Factory methods + +OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

TODO

+ + + + + +
+ + + diff --git a/docs/v5/concepts/README.md b/docs/v5/concepts/README.md new file mode 100644 index 000000000..2d797cffe --- /dev/null +++ b/docs/v5/concepts/README.md @@ -0,0 +1,18 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Ethereum Basics +=============== + +* [Events](events) + * [Solidity Topics](events) + * [Logs and Filtering](events) +* [Gas](gas) + * [Gas Price](gas) + * [Gas Limit](gas) +* [Security](security) + * [Key Derivation Functions](security) + diff --git a/docs/v5/concepts/best-practices/README.md b/docs/v5/concepts/best-practices/README.md new file mode 100644 index 000000000..7710397cd --- /dev/null +++ b/docs/v5/concepts/best-practices/README.md @@ -0,0 +1,28 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Best Practices +============== + +Network Changes +--------------- + +``` +// Force page refreshes on network changes +{ + // The "any" network will allow spontaneous network changes + const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); + provider.on("network", (newNetwork, oldNetwork) => { + // When a Provider makes its initial connection, it emits a "network" + // event with a null oldNetwork along with the newNetwork. So, if the + // oldNetwork exists, it represents a changing network + if (oldNetwork) { + window.location.reload(); + } + }); +} +``` + diff --git a/docs/v5/concepts/best-practices/index.html b/docs/v5/concepts/best-practices/index.html new file mode 100644 index 000000000..53615a580 --- /dev/null +++ b/docs/v5/concepts/best-practices/index.html @@ -0,0 +1,52 @@ + + + + Best Practices + + + + +
+ + +

Best Practices

+

Network Changes

Handling a change in the network (e.g. Ropsten vs Mainnet) is incredibly complex and a slight failure can at best make your application seem confusing and at worst cause the loss of funds, leak private data or misrepresent what an action performed.

+ +

Luckily, standard users should likely never change their networks unless tricked to do so or they make a mistake.

+ +

This is a problem you mainly need to worry about for developers, and most developers should understand the vast array of issues surrounding a network change during application operation and will understand the page reloading (which is already the default behaviour in many clients).

+ +

So, the best practice when a network change occurs is to simply refresh the page. This should cause all your UI components to reset to a known-safe state, including any banners and warnings to your users if they are on an unsupported network.

+ +

This can be acomplished by using the following function:

+ +
Automatically Refresh on Network Change
// Force page refreshes on network changes +{ + // The "any" network will allow spontaneous network changes + const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); + provider.on("network", (newNetwork, oldNetwork) => { + // When a Provider makes its initial connection, it emits a "network" + // event with a null oldNetwork along with the newNetwork. So, if the + // oldNetwork exists, it represents a changing network + if (oldNetwork) { + window.location.reload(); + } + }); +}
+ + + +
+ + + diff --git a/docs/v5/concepts/events/README.md b/docs/v5/concepts/events/README.md new file mode 100644 index 000000000..182cf014b --- /dev/null +++ b/docs/v5/concepts/events/README.md @@ -0,0 +1,125 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Events +====== + +Solidity Topics +--------------- + +Logs and Filtering +------------------ + +### Filters + +Example Log Matching + + + +```javascript +// +const tokenAddress = ethers.constants.AddressZero; +const myAddress = ethers.constants.AddressZero; +const myOtherAddress = ethers.constants.AddressZero; +const id = ethers.utils.id; +const hexZeroPad = ethers.utils.hexZeroPad; +// + +// Short example of manually creating filters for an ERC-20 +// Transfer event. +// +// Most users should generally use the Contract API to +// compute filters, as it is much simpler, but this is +// provided as an illustration for those curious. See +// below for examples of the equivalent Contract API. + +// ERC-20: +// Transfer(address indexed src, address indexed dst, uint val) +// +// -------------------^ +// ----------------------------------------^ +// +// Notice that only *src* and *dst* are *indexed*, so ONLY they +// qualify for filtering. +// +// Also, note that in Solidity an Event uses the first topic to +// identify the Event name; for Transfer this will be: +// id("Transfer(address,address,uint256)") +// +// Other Notes: +// - A topic must be 32 bytes; so shorter types must be padded + +// List all token transfers *from* myAddress +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress or myOtherAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + [ + hexZeroPad(myAddress, 32), + hexZeroPad(myOtherAddress, 32), + ] + ] +} +``` + + +To simplify life, ..., explain here, the contract API + + +```javascript +// +const tokenAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; // DAI +const myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +const otherAddress = "0xEA517D5a070e6705Cc5467858681Ed953d285Eb9"; +const provider = ethers.getDefaultProvider(); +const Contract = ethers.Contract; +// + +const abi = [ + "event Transfer(address indexed src, address indexed dst, uint val)" +]; + +const contract = new Contract(tokenAddress, abi, provider); + +// List all token transfers *from* myAddress +contract.filters.Transfer(myAddress) +//! + +// List all token transfers *to* myAddress: +contract.filters.Transfer(null, myAddress) +//! + +// List all token transfers *from* myAddress *to* otherAddress: +contract.filters.Transfer(myAddress, otherAddress) +//! + +// List all token transfers *to* myAddress OR otherAddress: +contract.filters.Transfer(null, [ myAddress, otherAddress ]) +//! +``` + +### Other Things? TODO + diff --git a/docs/v5/concepts/events/index.html b/docs/v5/concepts/events/index.html new file mode 100644 index 000000000..714ff6209 --- /dev/null +++ b/docs/v5/concepts/events/index.html @@ -0,0 +1,141 @@ + + + + Events + + + + +
+ + +

Events

Explain how topics and such work

+ +

Solidity Topics

How to compute the topic...

+ +

Logs and Filtering

Example hog logs are used.

+ +

Link to provider.getLogs and contract.on

+ +

Filters

Filter are used as a way to query ... efficient, explain bloom filters lightly

+ +

A filter may have up to 4 topic-sets, where each topic-set refers to a condition that must match the log topic in that position (i.e. each condition is AND-ed together).

+ +

If a topic-set is null, a log topic in that position is not filtered at all and any value matches.

+ +

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).

+ +
Topic-SetsMatching Logs 
[ A ]topic[0] = A 
[ A, null ] 
[ null, B ]topic[1] = B 
[ null, [ B ] ] 
[ null, [ B ], null ] 
[ A, B ](topic[0] = A) AND (topic[1] = B) 
[ A, [ B ] ] 
[ A, [ B ], null ] 
[ [ A, B ] ](topic[0] = A) OR (topic[0] = B) 
[ [ A, B ], null ] 
[ [ A, B ], [ C, D ] ][ (topic[0] = A) OR (topic[0] = B) ] AND [ (topic[1] = C) OR (topic[1] = D) ] 
Example Log Matching 
ERC-20 Transfer Filter Examples
// <hide> +const tokenAddress = ethers.constants.AddressZero; +const myAddress = ethers.constants.AddressZero; +const myOtherAddress = ethers.constants.AddressZero; +const id = ethers.utils.id; +const hexZeroPad = ethers.utils.hexZeroPad; +// </hide> + +// Short example of manually creating filters for an ERC-20 +// Transfer event. +// +// Most users should generally use the Contract API to +// compute filters, as it is much simpler, but this is +// provided as an illustration for those curious. See +// below for examples of the equivalent Contract API. + +// ERC-20: +// Transfer(address indexed src, address indexed dst, uint val) +// +// -------------------^ +// ----------------------------------------^ +// +// Notice that only *src* and *dst* are *indexed*, so ONLY they +// qualify for filtering. +// +// Also, note that in Solidity an Event uses the first topic to +// identify the Event name; for Transfer this will be: +// id("Transfer(address,address,uint256)") +// +// Other Notes: +// - A topic must be 32 bytes; so shorter types must be padded + +// List all token transfers *from* myAddress +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress or myOtherAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + [ + hexZeroPad(myAddress, 32), + hexZeroPad(myOtherAddress, 32), + ] + ] +}

To simplify life, ..., explain here, the contract API

+ +
ERC-20 Contract Filter Examples
// <hide> +const tokenAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; // DAI +const myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +const otherAddress = "0xEA517D5a070e6705Cc5467858681Ed953d285Eb9"; +const provider = ethers.getDefaultProvider(); +const Contract = ethers.Contract; +// </hide> + +const abi = [ + "event Transfer(address indexed src, address indexed dst, uint val)" +]; + +const contract = new Contract(tokenAddress, abi, provider); + +// List all token transfers *from* myAddress +contract.filters.Transfer(myAddress) +//! + +// List all token transfers *to* myAddress: +contract.filters.Transfer(null, myAddress) +//! + +// List all token transfers *from* myAddress *to* otherAddress: +contract.filters.Transfer(myAddress, otherAddress) +//! + +// List all token transfers *to* myAddress OR otherAddress: +contract.filters.Transfer(null, [ myAddress, otherAddress ]) +//!

Other Things? TODO

Explain what happens to strings and bytes, how to filter and retain the value

+ + + + + +
+ + + diff --git a/docs/v5/concepts/gas/README.md b/docs/v5/concepts/gas/README.md new file mode 100644 index 000000000..40a688b3d --- /dev/null +++ b/docs/v5/concepts/gas/README.md @@ -0,0 +1,15 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Gas +=== + +Gas Price +--------- + +Gas Limit +--------- + diff --git a/docs/v5/concepts/gas/index.html b/docs/v5/concepts/gas/index.html new file mode 100644 index 000000000..7f88dc5e8 --- /dev/null +++ b/docs/v5/concepts/gas/index.html @@ -0,0 +1,34 @@ + + + + Gas + + + + +
+ + +

Gas

Explain attack vectors

+ +

Gas Price

The gas price is used somewhat like a bid, indicating an amount you are willing to pay (per unit of execution) to have your transaction processed.

+ +

Gas Limit

+ + + + +
+ + + diff --git a/docs/v5/concepts/index.html b/docs/v5/concepts/index.html new file mode 100644 index 000000000..0da018589 --- /dev/null +++ b/docs/v5/concepts/index.html @@ -0,0 +1,33 @@ + + + + Ethereum Basics + + + + +
+ + +

Ethereum Basics

This is a very breif overview of some aspects of Ethereum and blockchains which developers can make use of or should be aware of.

+ +

This section is fairly sparse at the moment, but will be expanded as time goes on.

+ + + + + +
+ + + diff --git a/docs/v5/concepts/security/README.md b/docs/v5/concepts/security/README.md new file mode 100644 index 000000000..4bfe8e21d --- /dev/null +++ b/docs/v5/concepts/security/README.md @@ -0,0 +1,38 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Security +======== + +Key Derivation Functions +------------------------ + +### Why does it take so long? + +### Mitigating the User Experience + +### Work-Arounds (not recommended) + +```javascript +// Our wallet object +const wallet = Wallet.createRandom(); + +// The password to encrypt with +const password = "password123"; + +// WARNING: Doing this substantially reduces the security +// of the wallet. This is highly NOT recommended. + +// We override the default scrypt.N value, which is used +// to indicate the difficulty to crack this wallet. +const json = wallet.encrypt(password, { + scrypt: { + // The number must be a power of 2 (default: 131072) + N: 64 + } +}); +``` + diff --git a/docs/v5/concepts/security/index.html b/docs/v5/concepts/security/index.html new file mode 100644 index 000000000..86a03c44e --- /dev/null +++ b/docs/v5/concepts/security/index.html @@ -0,0 +1,68 @@ + + + + Security + + + + +
+ + +

Security

+

Key Derivation Functions

This is not specific to Ethereum, but is a useful technique to understand and has some implications on User Experience.

+ +

Many people are concerned that encrypting and decrypting an Ethereum wallet is quite slow and can take quite some time. It is important to understand this is intentional and provides much stronger security.

+ +

The algorithm usually used for this process is scrypt, which is a memory and CPU intensive algorithm which computes a key (fixed-length psudo-random series of bytes) for a given password.

+ +

Why does it take so long?

The goal is to use as much CPU and memory as possible during this algorithm, so that a single computer can only compute a very small number of results for some fixed amount of time. To scale up an attack, the attacker requires additional compuers, increasing the cost to brute-force attack to guess the password.

+ +

For example, if a user knows their correct password, this process may take 10 seconds for them to unlock their own wallet and proceed.

+ +

But since an attacker does not know the password, they must guess; and each guess also requires 10 seconds. So, if they wish to try guessing 1 million passwords, their computer would be completely tied up for 10 million seconds, or around 115 days.

+ +

Without using an algorithm like this, a user would be able to log in instantly, however, 1 million passwords would only take a few seconds to attempt. Even secure passwords would likely be broken within a short period of time. There is no way the algorithm can be faster for a legitimate user without also being faster for an attacker.

+ +

Mitigating the User Experience

Rather than reducing the security (see below), a better practice is to make the user feel better about waiting. The Ethers encryption and decryption API allows the developer to incorporate a progress bar, by passing in a progress callback which will be periodically called with a number between 0 and 1 indication percent completion.

+ +

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 a progress bar makes a user feel like there time is not being needlessly wasted.

+ +

Work-Arounds (not recommended)

There are ways to reduce the time required to decrypt an Ethereum JSON Wallet, but please keep in mind that doing so discards nearly all security on that wallet.

+ +

The scrypt algorithm is designed to be tuned. The main purpose of this is to increase the difficulty as time goes on and computers get faster, but it can also be tuned down in situations where the security is less important.

+ +
// Our wallet object +const wallet = Wallet.createRandom(); + +// The password to encrypt with +const password = "password123"; + +// WARNING: Doing this substantially reduces the security +// of the wallet. This is highly NOT recommended. + +// We override the default scrypt.N value, which is used +// to indicate the difficulty to crack this wallet. +const json = wallet.encrypt(password, { + scrypt: { + // The number must be a power of 2 (default: 131072) + N: 64 + } +});
+ + + +
+ + + diff --git a/docs/v5/contributing/README.md b/docs/v5/contributing/README.md new file mode 100644 index 000000000..fc72c2216 --- /dev/null +++ b/docs/v5/contributing/README.md @@ -0,0 +1,51 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Contributing and Hacking +======================== + +Building +-------- + +``` +# Clone the REPO +/home/ricmoo> git clone git@github.com:ethers-io/ethers.js.git +/home/ricmoo> cd ethers.js + +# Install the base dependencies +/home/ricmoo/ethers.js> npm install + +# Install each module's dependencies and link the libraries +# internally, so they reference each other +/home/ricmoo/ethers.js> npm run bootstrap +``` + +``` +# Begin watching the files and re-building whenever they change +/home/ricmoo/ethers.js> npm run auto-build + + +# Sometimes the issue only affects the ESM modules +/home/ricmoo/ethers.js> npm run auto-build-esm + + +# Or if you only need to run a single build +/home/ricmoo/ethers.js> npm run _build-cjs +/home/ricmoo/ethers.js> npm run _build-esm +``` + +``` +# Rebuilds all files and bundles testcases up for testing +/home/ricmoo/ethers.js> npm test + +# Often you don't need the full CI experience +/home/ricmoo/ethers.js> npm run _test-node +``` + +``` +/home/ricmoo/ethers.js> npm run update-version +``` + diff --git a/docs/v5/contributing/index.html b/docs/v5/contributing/index.html new file mode 100644 index 000000000..556af2b3c --- /dev/null +++ b/docs/v5/contributing/index.html @@ -0,0 +1,64 @@ + + + + Contributing and Hacking + + + + +
+ + +

Contributing and Hacking

The ethers.js library is something that I've written out of necessity, and has grown somewhat organically over time.

+ +

Many things are the way they are for good (at the time, at least) reasons, but I always welcome criticism, and am completely willing to have my mind changed on things.

+ +

So, pull requests are always welcome, but please keep a few points in mind:

+ +

  • Backwards-compatibility-breaking changes will not be accepted; they may be considered for the next major version
  • Security is important; adding dependencies require fairly convincing arguments as to why
  • The library aims to be lean, so keep an eye on the dist/ethers.min.js file size before and after your changes
  • Add test cases for both expected and unexpected input
  • Any new features need to be supported by me (future issues, documentation, testing, migration), so anything that is overly complicated or specific may not be accepted

+ +

In general, please start an issue before beginning a pull request, so we can have a public discussion and figure out the best way to address to problem/feature. :)

+ +

Building

If you wish to modify the source code, there are a few steps involved in setting up your environment.

+ +
Preparing the Package
# Clone the REPO +/home/ricmoo> git clone git@github.com:ethers-io/ethers.js.git +/home/ricmoo> cd ethers.js + +# Install the base dependencies +/home/ricmoo/ethers.js> npm install + +# Install each module's dependencies and link the libraries +# internally, so they reference each other +/home/ricmoo/ethers.js> npm run bootstrap
Watching and Building
# Begin watching the files and re-building whenever they change +/home/ricmoo/ethers.js> npm run auto-build + + +# Sometimes the issue only affects the ESM modules +/home/ricmoo/ethers.js> npm run auto-build-esm + + +# Or if you only need to run a single build +/home/ricmoo/ethers.js> npm run _build-cjs +/home/ricmoo/ethers.js> npm run _build-esm
Testing
# Rebuilds all files and bundles testcases up for testing +/home/ricmoo/ethers.js> npm test + +# Often you don't need the full CI experience +/home/ricmoo/ethers.js> npm run _test-node
Preparing the Distribution
/home/ricmoo/ethers.js> npm run update-version
+ + + +
+ + + diff --git a/docs/v5/cookbook/README.md b/docs/v5/cookbook/README.md new file mode 100644 index 000000000..68cfe9598 --- /dev/null +++ b/docs/v5/cookbook/README.md @@ -0,0 +1,9 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Cookbook +======== + diff --git a/docs/v5/cookbook/index.html b/docs/v5/cookbook/index.html new file mode 100644 index 000000000..ba0f036ed --- /dev/null +++ b/docs/v5/cookbook/index.html @@ -0,0 +1,31 @@ + + + + Cookbook + + + + +
+ + +

Cookbook

Cooking...

+ + + + + +
+ + + diff --git a/docs/v5/documentation/README.md b/docs/v5/documentation/README.md new file mode 100644 index 000000000..fcae97f34 --- /dev/null +++ b/docs/v5/documentation/README.md @@ -0,0 +1,342 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Flatworm Docs +============= + +Fragments +--------- + +### Directive Format + +``` +_DIRECTIVE: VALUE @ @EXTENSION +BODY + +MORE BODY + +DIRECTIVE: The directive name +VALUE: Optional; the value to pass to the directive +LINK: Optional; a name for internal linking +EXTENSION: Optional; extended directive functionality +PARAMETER: Optional; value to pass to extended directive functions +BODY: Optional; the directive body (certain directives only) +``` + +### Flatworm Directives + +#### **_section:** *TITLE* + +A *section* has its **TITLE** in an H1 font. Sections are linked to in *Table of Contents* and have a dividing line drawn above them. + +The body supports markdown. + +There should only be one `_section:` per page. + +**Extensions:** [@inherit](/v5/documentation/#flatworm--ext-inherit), [@src](/v5/documentation/#flatworm--ext-src), [@nav](/v5/documentation/#flatworm--ext-nav), [@note](/v5/documentation/#flatworm--ext-note) + + +#### **_subsection:** *TITLE* + +A *subsection* has its **TITLE** in an H2 font. Subsections are linked to in *Table of Contents* and have a dividing line drawn above them. + +The title and body support markdown. + +**Extensions:** [@inherit](/v5/documentation/#flatworm--ext-inherit), [@src](/v5/documentation/#flatworm--ext-src), [@note](/v5/documentation/#flatworm--ext-note) + + +#### **_heading:** *TITLE* + +A *heading* has its **TITLE** in an H3 font. + +The title and body support markdown. + +**Extensions:** [@inherit](/v5/documentation/#flatworm--ext-inherit), [@src](/v5/documentation/#flatworm--ext-src), [@note](/v5/documentation/#flatworm--ext-note) + + +#### **_definition:** *TERM* + +A *definition* has its **TERM** in normal text and the body is indented. + +The title and body support markdown. + + +#### **_property:** *SIGNATURE* + +A *property* has its JavaScript **SIGNATURE** formatted. + +The body supports markdown and the return portion of the signature support markdown links. + +**Extensions:** [@src](/v5/documentation/#flatworm--ext-src) + + +#### **_note:** *BANNER* + +A *note* is placed in a blue bordered-box to draw attention to it. + +The body supports markdown. + + +#### **_warning:** *BANNER* + +A *warning* is placed in an orange bordered-box to draw attention to it. + +The body supports markdown. + + +#### **_code:** *CAPTION* + +Creates a [Code](/v5/documentation/#flatworm--code) block. + +The body does **not** support markdown, and will be output exactly as is, with the exception of [Code Evaluation](/v5/documentation/#flatworm--code-eval). + +If a line begins with a `"_"`, it should be escaped with a `"\"`. + +**Extensions:** [@lang](/v5/documentation/#flatworm--ext-lang) + + +#### **_table:** *FOOTER* + +Creates a [Table](/v5/documentation/#flatworm--table) structured according to the body. + +Each cell support and variables support markdown. + +**Extensions:** [@style](/v5/documentation/#flatworm--ext-style) + + +#### **_toc:** + +A *toc* injects a Table of Contents, loading each line of the body as a filename and recursively loads the *toc* if present, otherwise all the *sections* and *subsections*. + +The body does **not** support markdown, as it is interpreted as a list of files and directories to process. + + +#### **_null:** + +A *null* is used to terminated a directive. For example, after a *definition*, the bodies are indented, so a *null* can be used to reset the indentation. + +The body supports markdown. + + +``` +_section: Hello World @ +Body for section... + + +_subsection: Some Example @ +Body for subsection... + + +_heading: Large Bold Text @ +Body for heading... + + +_definition: Flatworm +A phylum of relatively **simple** bilaterian, unsegmented, +soft-bodied invertebrates. + + +_property: String.fromCharCode(code) => string +Returns a string created from //code//, a sequence of +UTF-16 code units. + + +_code: heading + +// Some code goes here +while(1); + + +_table: Table Footer + +| **Name** | **Color** | +| Apple | Red | +| Banana | Yellow | +| Grape | Purple | + + +_toc: + some-file + some-directory + + +_note: Title +This is placed in a blue box. + + +_warning: Title +This is placed in an orange box. + + +_null: +This breaks out of a directive. For example, to end a +``` + +Markdown +-------- + +``` +**bold text** + +//italic text// + +__underlined text__ + +``monospace code`` + +^^superscript text^^ + +~~strikeout text~~ + +- This is a list +- With bullet points +- With a total of three items + +This is a [Link to Ethereum](https://ethereum.org) and this +is an [Internal Link](some-link). + +This is a self-titled link [[https://ethereumorg]] and this +[[some-link]] will use the title from its directives value. +``` + +Code +---- + +### JavaScript Evaluation + +``` +_code: Result of Code Example @lang + +// +const url = require("url"); +// + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// +foo +// +//! +``` + +```javascript +// +const url = require("url"); +// + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// +foo +// +//! +``` + +### Languages + + + + + +Tables +------ + +### Row Data + +### Alignment + +Alignment Conditions (higher precedence listed first) + + + +``` +_table: Result of Alignment Example @style + +| center | + +| left | +|left | + +| right | +| right| +``` + +Result of Alignment Example + + + +### Row and Column Spanning + +``` +_table: Result of Cell Spanning Example @style + +| (1x1) | (1x2) <| (2x1) | +| (2x2) <| (2x1) | ^ | +| ^ | ^ | (1x1) | +``` + +Result of Cell Spanning Example + + + +### Styles + + + + + +### Variables + +``` +_table: Result of Variables Example + +$Yes: This option is supported. +$No: This option is **not** supported +$bottom: This just represents an example of + what is possible. Notice that variable + content can span multiple lines. + +| **Feature** | **Supported** | +| Dancing Monkey | $Yes | +| Singing Turtle | $No | +| Newt Hair | $Yes | +| $bottom <| +``` + +Result of Variables Example + + + +Configuration +------------- + +Extensions +---------- + +### @inherit< markdown > + +### @lang< text > + +### @nav< text > + +### @note< markdown > + +### @src< key > + +### @style< text > + diff --git a/docs/v5/documentation/index.html b/docs/v5/documentation/index.html new file mode 100644 index 000000000..795f0d4e4 --- /dev/null +++ b/docs/v5/documentation/index.html @@ -0,0 +1,294 @@ + + + + Flatworm Docs + + + + +
+ + +

Flatworm Docs

The Flatworm Docs rendering engine is designed to be very simple, but provide enough formatting necessary for documenting JavaScript libraries.

+ +

A lot of its inspiration came from Read the Docs and the Sphinx project.

+ +

Fragments

Each page is made up of fragments. A fragment is a directive, with an value and optional link, extensions and a body.

+ +

Many directives support markdown in their value and body.

+ +

A fragment's body continues until another fragment is encountered.

+ +

Directive Format

+
_DIRECTIVE: VALUE @<LINK> @EXTENSION<PARAMETER> +BODY + +MORE BODY + +DIRECTIVE: The directive name +VALUE: Optional; the value to pass to the directive +LINK: Optional; a name for internal linking +EXTENSION: Optional; extended directive functionality +PARAMETER: Optional; value to pass to extended directive functions +BODY: Optional; the directive body (certain directives only)

Flatworm Directives

+
_section: TITLE

A section has its TITLE in an H1 font. Sections are linked to in Table of Contents and have a dividing line drawn above them.

+ +

The body supports markdown.

+ +

There should only be one _section: per page.

+ +

Extensions: @inherit, @src, @nav, @note

+ +
_subsection: TITLE

A subsection has its TITLE in an H2 font. Subsections are linked to in Table of Contents and have a dividing line drawn above them.

+ +

The title and body support markdown.

+ +

Extensions: @inherit, @src, @note

+ +
_heading: TITLE

A heading has its TITLE in an H3 font.

+ +

The title and body support markdown.

+ +

Extensions: @inherit, @src, @note

+ +
_definition: TERM

A definition has its TERM in normal text and the body is indented.

+ +

The title and body support markdown.

+ +
_property: SIGNATURE

A property has its JavaScript SIGNATURE formatted.

+ +

The body supports markdown and the return portion of the signature support markdown links.

+ +

Extensions: @src

+ +
_note: BANNER

A note is placed in a blue bordered-box to draw attention to it.

+ +

The body supports markdown.

+ +
_warning: BANNER

A warning is placed in an orange bordered-box to draw attention to it.

+ +

The body supports markdown.

+ +
_code: CAPTION

Creates a Code block.

+ +

The body does not support markdown, and will be output exactly as is, with the exception of Code Evaluation.

+ +

If a line begins with a "_", it should be escaped with a "\".

+ +

Extensions: @lang

+ +
_table: FOOTER

Creates a Table structured according to the body.

+ +

Each cell support and variables support markdown.

+ +

Extensions: @style

+ +
_toc:

A toc injects a Table of Contents, loading each line of the body as a filename and recursively loads the toc if present, otherwise all the sections and subsections.

+ +

The body does not support markdown, as it is interpreted as a list of files and directories to process.

+ +
_null:

A null is used to terminated a directive. For example, after a definition, the bodies are indented, so a null can be used to reset the indentation.

+ +

The body supports markdown.

+ +
Example
_section: Hello World @<link-main> +Body for section... + + +_subsection: Some Example @<link-secondary> +Body for subsection... + + +_heading: Large Bold Text @<link-here> +Body for heading... + + +_definition: Flatworm +A phylum of relatively **simple** bilaterian, unsegmented, +soft-bodied invertebrates. + + +_property: String.fromCharCode(code) => string +Returns a string created from //code//, a sequence of +UTF-16 code units. + + +_code: heading + +// Some code goes here +while(1); + + +_table: Table Footer + +| **Name** | **Color** | +| Apple | Red | +| Banana | Yellow | +| Grape | Purple | + + +_toc: + some-file + some-directory + + +_note: Title +This is placed in a blue box. + + +_warning: Title +This is placed in an orange box. + + +_null: +This breaks out of a directive. For example, to end a

Markdown

The markdown is simple and does not have the flexibility of other dialects, but allows for bold, italic, underlined, monospaced, superscript and strike text, supporting links and lists.

+ +

Lists are rendered as blocks of a body, so cannot be used within a title or within another list.

+ +
**bold text** + +//italic text// + +__underlined text__ + +``monospace code`` + +^^superscript text^^ + +~~strikeout text~~ + +- This is a list +- With bullet points +- With a total of three items + +This is a [Link to Ethereum](https://ethereum.org) and this +is an [Internal Link](some-link). + +This is a self-titled link [[https://ethereumorg]] and this +[[some-link]] will use the title from its directives value.

Code

The code directive creates a monospace, contained block useful for displaying code samples.

+ +

JavaScript Evaluation

For JavaScript files, the file is executed with some simple substitution.

+ +

A bare //! on a line is replaced with the result of the last statement. Building will fail if an error is thrown.

+ +

A bare //!error is replaced with the throw error. Building will fail if an error is not thrown.

+ +

Also any code included between the lines // <hide> and // </hide> will be omitted from the output, which can be used to setup variables.

+ +
Code Evaluation Example
_code: Result of Code Example @lang<javascript> + +// <hide> +const url = require("url"); +// </hide> + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// <hide> +foo +// </hide> +//!
Result of Code Example
// <hide> +const url = require("url"); +// </hide> + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// <hide> +foo +// </hide> +//!

Languages

The language can be specified using the @lang extension.

+ +
LanguageNotes 
javascriptSyntax highlights and evaluates the JavaScipt 
scriptSame as javascript, but does not evaluate the results 
shellShell scripts or command-line 
textPlain text with no syntax highlighting 

Tables

The table directive consumes the entire body up until the next directive. To terminate a table early to begin a text block, use a _null: directive.

+ +

Each line of the body should be Row Data or a Variable Declaration (or continuation of a Variable Declaration). Blank lines are ignored.

+ +

Row Data

Each Row Data line must begin and end with a "|", with each gap representing the cell data, alignment with optional column and row spanning.

+ +

Alignment

The alignment for a cell is determined by the whitespace surrounding the cell data.

+ +
AlignmentWhitespace 
Left1 or fewer spaces before the content 
Right1 or fewer spaces after the content 
Center2 or more space both before and after the content 
Alignment Conditions (higher precedence listed first) 
Alignment Example
_table: Result of Alignment Example @style<compact> + +| center | + +| left | +|left | + +| right | +| right|
center 
left 
left 
right 
right 
Result of Alignment Example 

Row and Column Spanning

A column may end its content with any number of "<" which indicates how many additional columns to extend into.

+ +

If the cell content contains only a "^", then the row above is extended into this cell (into the same number of columns).

+ +
Cell Spanning Example
_table: Result of Cell Spanning Example @style<compact> + +| (1x1) | (1x2) <| (2x1) | +| (2x2) <| (2x1) | ^ | +| ^ | ^ | (1x1) |
(1x1)(1x2)(2x1) 
(2x2)(2x1) 
(1x1) 
Result of Cell Spanning Example 

Styles

The @style extension for a table can be used to control its appearance.

+ +
NameWidthColumns 
minimalminimum sizebest fit 
compact40%evenly spaced 
wide67%evenly spaced 
full100%evenly spaced 

Variables

Often the layout of a table is easier to express and maintain without uneven or changing content within it. So the content can be defined separately within a table directive using variables. A varaible name must being with a letter and must only contain letters and numbers.

+ +

Variables are also useful when content is repeated throughout a table.

+ +

A variable is declared by starting a line with "$NAME:", which consumes all lines until the next variable declaration or until the next table row line.

+ +

A variable name must start with a letter and may consist of letters and numbers. (i.e. /[a-z][a-z0-9]*/i)

+ +
Variables Example
_table: Result of Variables Example + +$Yes: This option is supported. +$No: This option is **not** supported +$bottom: This just represents an example of + what is possible. Notice that variable + content can span multiple lines. + +| **Feature** | **Supported** | +| Dancing Monkey | $Yes | +| Singing Turtle | $No | +| Newt Hair | $Yes | +| $bottom <|
FeatureSupported 
Dancing MonkeyThis option is supported. 
Singing TurtleThis option is not supported. 
Newt HairThis option is supported. 
This just represents an example of what is possible. Notice that variable content can span multiple lines. 
Result of Variables Example 

Configuration

Configuration is optional (but highly recommended) and may be either a simple JSON file (config.json) or a JS file (config.js) placed in the top of the source folder.

+ +

TODO: example JSON and example JS

+ +

Extensions

+

@inherit< markdown >

Adds an inherits description to a directive. The markdown may contain links.

+ +

@lang< text >

Set the language a code directive should be syntax-highlighted for. If "javascript", the code will be evaluated.

+ +

@nav< text >

Sets the name in the breadcrumbs when not the current node.

+ +

@note< markdown >

Adds a note to a directive. The markdown may contain links. If the directive already has an @INHERIT extension, that will be used instead and the @NOTE will be ignored.

+ +

@src< key >

Calls the configuration getSourceUrl(key, VALUE) to get a URL which will be linked to by a link next to the directive.

+ +

This extended directive function requires an advanced config.js Configuration file since it requires a JavaScript function.

+ +

@style< text >

The Table Style to use for a table directive.

+ + + + + +
+ + + diff --git a/docs/v5/getting-started/README.md b/docs/v5/getting-started/README.md new file mode 100644 index 000000000..9133779e8 --- /dev/null +++ b/docs/v5/getting-started/README.md @@ -0,0 +1,287 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Getting Started +=============== + +Installing +---------- + +``` +/home/ricmoo> npm install --save ethers@next +``` + +Importing +--------- + +### Node.js + +``` +const { ethers } = require("ethers"); +``` + +``` +import { ethers } from "ethers"; +``` + +### Web Browser + +``` + +``` + +``` + +``` + +Common Terminology +------------------ + +Common Terms + + + +Connecting to Ethereum: Metamask +-------------------------------- + +``` +// A Web3Provider wraps a standard Web3 provider, which is +// what Metamask injects as window.ethereum into each page +const provider = new ethers.providers.Web3Provider(window.ethereum) + +// The Metamask plugin also allows signing transactions to +// send ether and pay to change state within the blockchain. +// For this, we need the account signer... +const signer = provider.getSigner() +``` + +### Querying the Blockchain + +```javascript +// Look up the current block number +provider.getBlockNumber() +//! + +// Get the balance of an account (by address or ENS name) +balance = await provider.getBalance("ethers.eth") +//! async balance + +// Often you will need to format the output for the user +// which prefer to see values in ether (instead of wei) +ethers.utils.formatEther(balance) +//! + +// Or if a user enters a string in an input field, you may need +// to convert it from ether (as a string) to wei (as a BigNumber) +ethers.utils.parseEther("1.0") +//! +``` + +### Writing to the Blockchain + +``` +// Send 1 ether to an ens name. +const tx = signer.sendTransaction({ + to: "ricmoo.firefly.eth", + value: ethers.utils.parseEther("1.0") +}); +``` + +Contracts +--------- + +```javascript +// We can use an ENS name for the contract address +const daiAddress = "dai.tokens.ethers.eth"; + +// The ERC-20 Contract ABI, which is a common contract interface +// for tokens (this is the Human-Readable ABI format) +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", + + // Send some of your tokens to someone else + "function transfer(address to, uint amount)", + + // An event triggered whenever anyone transfers to someone else + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// The Contract object +const daiContract = new ethers.Contract(daiAddress, daiAbi, provider); +``` + +### Read-Only Methods + +```javascript +// +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +// + +// Get the ERC-20 token name +daiContract.name() +//! + +// Get the ERC-20 token synbol (for tickers and UIs) +daiContract.symbol() +//! + +// Get the balance of an address +balance = await daiContract.balanceOf("ricmoo.firefly.eth") +//! async balance + +// Format the DAI for displaying to the user +ethers.utils.formatUnits(balance, 18) +//! +``` + +### State Changing Methods + +``` +// The DAI Contract is currently connected to the Provider, +// which is read-only. We need to connect to a Signer, so +// that we can pay to send state-changing transactions. +const daiWithSigner = contract.connect(signer); + +// Each DAI has 18 decimal places +const dai = ethers.utils.parseUnits("1.0", 18); + +// Send 1 DAI to "ricmoo.firefly.eth" +tx = daiWithSigner.transfer("ricmoo.firefly.eth", dai); +``` + +### Listening to Events + +```javascript +// +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +const formatEther = ethers.utils.formatEther; +// + +// Receive an event when ANY transfer occurs +daiContract.on("Transfer", (from, to, amount, event) => { + console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`); + // The event object contains the verbatim log data, the + // EventFragment and functions to fetch the block, + // transaction and receipt and event functions +}); + +// A filter for when a specific address receives tokens +myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +filter = daiContract.filters.Transfer(null, myAddress) +// +filter +// +//! + +// Receive an event when that filter occurs +daiContract.on(filter, (from, to, amount, event) => { + // The to will always be "address" + console.log(`I got ${ formatEther(amount) } from ${ from }.`); +}); + +// +// Don't want to block the docs from compiling... +daiContract.removeAllListeners(); +// +``` + +### Query Historic Events + +```javascript +// +const signer = new ethers.VoidSigner("0x8ba1f109551bD432803012645Ac136ddd64DBA72"); +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +//! +// + +// Get the address of the Signer +myAddress = await signer.getAddress() +//! async myAddress + +// Filter for all token transfers to me +filterFrom = daiContract.filters.Transfer(myAddress, null); +// +filterFrom +// +//! + +// Filter for all token transfers from me +filterTo = daiContract.filters.Transfer(null, myAddress); +// +filterTo +// +//! + +// List all transfers sent from me a specific block range +daiContract.queryFilter(filterFrom, 9843470, 9843480) +//! + +// +// The following have had the results omitted due to the +// number of entries; but they provide some useful examples +// + +// List all transfers I sent in the last 10,000 blocks +daiContract.queryFilter(filterFrom, -10000) + +// List all transfers ever sent to me +daiContract.queryFilter(filterTo) +``` + +Signing Messages +---------------- + +```javascript +// +const signer = ethers.Wallet.createRandom(); +//! +// + +// To sign a simple string, which can often be used for +// logging into a service, such as CryptoKitties simply +// pass the string in. +signature = await signer.signMessage("Hello World"); +//! async signature + +// +// A common case is also signing a hash, which is 32 +// bytes. It is important to note, that to sign binary +// data it MUST be an Array (or TypedArray) +// + +// This string is 66 chacacters long +message = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" + +// This array representation is 32 bytes long +messageBytes = ethers.utils.arrayify(message); +//! + +// To sign a hash, you most often want to sign the bytes +signature = await signer.signMessage(messageBytes) +//! async signature +``` + diff --git a/docs/v5/getting-started/index.html b/docs/v5/getting-started/index.html new file mode 100644 index 000000000..c8ef5ebfc --- /dev/null +++ b/docs/v5/getting-started/index.html @@ -0,0 +1,250 @@ + + + + Getting Started + + + + +
+ + +

Getting Started

+

Installing

The various Classes and Functions are available to be imported manually from sub-packages under the @ethersproject organization but for most projects, the umbrella package is the easiest way to get started.

+ +
/home/ricmoo> npm install --save ethers@next

Importing

+

Node.js

+
node.js require
const { ethers } = require("ethers");
ES6 or TypeScript
import { ethers } from "ethers";

Web Browser

It is generally better practice (for security reasons) to copy the ethers library to your own webserver and serve it yourself.

+ +

For quick demos or prototyping though, it can be loaded in your Web Applications from our CDN.

+ +
ES6 in the Browser
<script src="https://cdn.ethers.io/lib/ethers-5.0.esm.min.js" + type="application/javascipt"></script>
ES3 (UMD) in the Browser
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js" + type="application/javascipt"></script>

Common Terminology

This section needs work...

+ +
ProviderA Provider (in ethers) is a class which provides an abstraction for a connection to the Ethereum Network. It provides read-only access to the Blockchain and its status. 
SignerA Signer is a class which (usually) in some way directly or indirectly has access to a private key, which can sign messages and transactions to authorize the network to charge your account ether to perform operations. 
ContractA Contract is an abstraction which represents a connection to a specific contract on the Ethereum Network, so that it can be used like a normal JavaScipt object. 
Common Terms 

Connecting to Ethereum: Metamask

The quickest and easiest way to experiment and begin developing on Ethereum is to use 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)

+ +
Connecting to Metamask
// A Web3Provider wraps a standard Web3 provider, which is +// what Metamask injects as window.ethereum into each page +const provider = new ethers.providers.Web3Provider(window.ethereum) + +// The Metamask plugin also allows signing transactions to +// send ether and pay to change state within the blockchain. +// For this, we need the account signer... +const signer = provider.getSigner()

Querying the Blockchain

Once you have a Provider, you have a read-only connection to the blockchain, which can be used to query the current state, fetch historic logs, look up deployed code and so on.

+ +
Basic Queries
// Look up the current block number +provider.getBlockNumber() +//! + +// Get the balance of an account (by address or ENS name) +balance = await provider.getBalance("ethers.eth") +//! async balance + +// Often you will need to format the output for the user +// which prefer to see values in ether (instead of wei) +ethers.utils.formatEther(balance) +//! + +// Or if a user enters a string in an input field, you may need +// to convert it from ether (as a string) to wei (as a BigNumber) +ethers.utils.parseEther("1.0") +//!

Writing to the Blockchain

+
Sending Ether
// Send 1 ether to an ens name. +const tx = signer.sendTransaction({ + to: "ricmoo.firefly.eth", + value: ethers.utils.parseEther("1.0") +});

Contracts

A Contract is an abstraction of program code which lives on the Ethereum blockchain.

+ +

The Contract object makes it easier to use an on-chain Contract as a normal JavaScript object, with the method all mapped to encoding and decoding data for you.

+ +

If you are familiar with Databases, this is similar to ORM.

+ +

In order to communicate with the Contract on-chain, this class needs to know what methods are available and how to encode and decode the data, which is what the Application Binary Interface (API) provides.

+ +

This class is a meta-class, which means its methods are constructed at runtime, when you pass in the ABI to the constructor it uses that to determine which methods to add.

+ +

While a on-chain Contract may have many methods available, you can safely ignore any methods you don't need or use, providing a smaller subset of the ABI to the contract.

+ +

An ABI often comes from the Solidity or Vyper compiler, but may also be placed in the code easily using the Human-Readable ABI, which the following examples use.

+ +
Connecting to the DAI Contract
// We can use an ENS name for the contract address +const daiAddress = "dai.tokens.ethers.eth"; + +// The ERC-20 Contract ABI, which is a common contract interface +// for tokens (this is the Human-Readable ABI format) +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", + + // Send some of your tokens to someone else + "function transfer(address to, uint amount)", + + // An event triggered whenever anyone transfers to someone else + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// The Contract object +const daiContract = new ethers.Contract(daiAddress, daiAbi, provider);

Read-Only Methods

+
Querying the DAI Contract
// <hide> +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +// </hide> + +// Get the ERC-20 token name +daiContract.name() +//! + +// Get the ERC-20 token synbol (for tickers and UIs) +daiContract.symbol() +//! + +// Get the balance of an address +balance = await daiContract.balanceOf("ricmoo.firefly.eth") +//! async balance + +// Format the DAI for displaying to the user +ethers.utils.formatUnits(balance, 18) +//!

State Changing Methods

+
Sending DAI
// The DAI Contract is currently connected to the Provider, +// which is read-only. We need to connect to a Signer, so +// that we can pay to send state-changing transactions. +const daiWithSigner = contract.connect(signer); + +// Each DAI has 18 decimal places +const dai = ethers.utils.parseUnits("1.0", 18); + +// Send 1 DAI to "ricmoo.firefly.eth" +tx = daiWithSigner.transfer("ricmoo.firefly.eth", dai);

Listening to Events

+
Listening to Events
// <hide> +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +const formatEther = ethers.utils.formatEther; +// </hide> + +// Receive an event when ANY transfer occurs +daiContract.on("Transfer", (from, to, amount, event) => { + console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`); + // The event object contains the verbatim log data, the + // EventFragment and functions to fetch the block, + // transaction and receipt and event functions +}); + +// A filter for when a specific address receives tokens +myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +filter = daiContract.filters.Transfer(null, myAddress) +// <hide> +filter +// </hide> +//! + +// Receive an event when that filter occurs +daiContract.on(filter, (from, to, amount, event) => { + // The to will always be "address" + console.log(`I got ${ formatEther(amount) } from ${ from }.`); +}); + +// <hide> +// Don't want to block the docs from compiling... +daiContract.removeAllListeners(); +// </hide>

Query Historic Events

+
Filtering Historic Events
// <hide> +const signer = new ethers.VoidSigner("0x8ba1f109551bD432803012645Ac136ddd64DBA72"); +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +//! +// </hide> + +// Get the address of the Signer +myAddress = await signer.getAddress() +//! async myAddress + +// Filter for all token transfers to me +filterFrom = daiContract.filters.Transfer(myAddress, null); +// <hide> +filterFrom +// </hide> +//! + +// Filter for all token transfers from me +filterTo = daiContract.filters.Transfer(null, myAddress); +// <hide> +filterTo +// </hide> +//! + +// List all transfers sent from me a specific block range +daiContract.queryFilter(filterFrom, 9843470, 9843480) +//! + +// +// The following have had the results omitted due to the +// number of entries; but they provide some useful examples +// + +// List all transfers I sent in the last 10,000 blocks +daiContract.queryFilter(filterFrom, -10000) + +// List all transfers ever sent to me +daiContract.queryFilter(filterTo)

Signing Messages

+
Signing Messages
// <hide> +const signer = ethers.Wallet.createRandom(); +//! +// </hide> + +// To sign a simple string, which can often be used for +// logging into a service, such as CryptoKitties simply +// pass the string in. +signature = await signer.signMessage("Hello World"); +//! async signature + +// +// A common case is also signing a hash, which is 32 +// bytes. It is important to note, that to sign binary +// data it MUST be an Array (or TypedArray) +// + +// This string is 66 chacacters long +message = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" + +// This array representation is 32 bytes long +messageBytes = ethers.utils.arrayify(message); +//! + +// To sign a hash, you most often want to sign the bytes +signature = await signer.signMessage(messageBytes) +//! async signature
+ + + +
+ + + diff --git a/docs/v5/hacking/README.md b/docs/v5/hacking/README.md new file mode 100644 index 000000000..c84b41d9d --- /dev/null +++ b/docs/v5/hacking/README.md @@ -0,0 +1,19 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Hacking +======= + +### Supported Platforms + +### Dependencies + +### Printable ASCII (7-bit) Characters + +### License + +### Other Considerations + diff --git a/docs/v5/hacking/index.html b/docs/v5/hacking/index.html new file mode 100644 index 000000000..f200bfcbb --- /dev/null +++ b/docs/v5/hacking/index.html @@ -0,0 +1,53 @@ + + + + Hacking + + + + +
+ + +

Hacking

Things to keep in mind:

+ +

Supported Platforms

...

+ +

Dependencies

Adding a dependency is non-trivial and will require fairly convincing arguments.

+ +

Further, ALL dependencies for ethers, must be MIT licensed or public domain (CC0).

+ +

All contributions to ethers are then included under the MIT license.

+ +

Printable ASCII (7-bit) Characters

All source and documentation files should ONLY use the printable ASCII set.

+ +

This is for several reasons, bu...

+ +

  • Transmission over certain HTTP servers and proxies can mangle UTF-8 data
  • Certain editors on some platforms, or in certain terminals cannot handle UTF-8 characters elegantly
  • The ability to enter non-ASCII characters on some platforms require special keyboards, input devices or input methods to be installed, which either not be supported, or may require administrative priviledges.

+ +

License

MIT...

+ +

Other Considerations

A common argument to Pull Requests is that they are simple, backwards compatible and

+ +

It is important to remember that a small change is something that we are required to support in perpetuity.

+ +

For example, adding support for an obscure platform, such as adding a dot-file to the root of the package, now carries the implication that we will continue keeping that dot-file up-to-date as new versions of that platform are released.

+ + + + + +
+ + + diff --git a/docs/v5/index.html b/docs/v5/index.html new file mode 100644 index 000000000..a81a9aa06 --- /dev/null +++ b/docs/v5/index.html @@ -0,0 +1,39 @@ + + + + Documentation + + + + +
+ + +

Documentation

+

What is Ethers?

The ethers.js library aims to be a complete and compact library for interacting with the Ethereum Blockchain and its ecosystem. It was originally designed for use with ethers.io and has since expanded into a much more general-purpose library.

+ +

Features

  • Keep your private keys in your client, safe and sound
  • Import and export JSON wallets (Geth, Parity and crowdsale)
  • Import and export BIP 39 mnemonic phrases (12 word backup phrases) and HD Wallets (English, Italian, Japanese, Korean, Simplified Chinese, Traditional Chinese; more coming soon)
  • Meta-classes create JavaScript objects from any contract ABI, including ABIv2 and Human-Readable ABI
  • Connect to Ethereum nodes over JSON-RPC, INFURA, Etherscan, Alchemy, Cloudflare or MetaMask.
  • ENS names are first-class citizens; they can be used anywhere an Ethereum addresses can be used
  • Tiny (~88kb compressed; 284kb uncompressed)
  • Complete functionality for all your Ethereum needs
  • Extensive documentation
  • Large collection of test cases which are maintained and added to
  • Fully TypeScript ready, with definition files and full TypeScript source
  • MIT License (including ALL dependencies); completely open source to do with as you please

+ +

Developer Documentation

+
Gas
HMAC
Help
Help
Help
Help
CLI
Code

Legacy Documentation

This section will be kept up to date, linking to documentation of older versions of the library.

+ +

+ + + + + +
+ + + diff --git a/docs/v5/license/README.md b/docs/v5/license/README.md new file mode 100644 index 000000000..2f340026b --- /dev/null +++ b/docs/v5/license/README.md @@ -0,0 +1,11 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +License and Copyright +===================== + +### MIT License + diff --git a/docs/v5/license/index.html b/docs/v5/license/index.html new file mode 100644 index 000000000..01f262758 --- /dev/null +++ b/docs/v5/license/index.html @@ -0,0 +1,39 @@ + + + + License and Copyright + + + + +
+ + +

License and Copyright

The ethers library (including all dependencies) are available under the MIT License, which permits a wide variety of uses.

+ +

MIT License

Copyright © 2019 Richard Moore.

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ + + + + +
+ + + diff --git a/docs/v5/migration/README.md b/docs/v5/migration/README.md new file mode 100644 index 000000000..cef98e9b5 --- /dev/null +++ b/docs/v5/migration/README.md @@ -0,0 +1,22 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Migration Guide +=============== + +* [Migration: From Web3.js](web3) + * [Contracts](web3) + * [Providers](web3) + * [Numbers](web3) + * [Utilities](web3) +* [Migration: From Ethers v4](ethers-v4) + * [BigNumber](ethers-v4) + * [Contracts](ethers-v4) + * [Errors](ethers-v4) + * [Interface](ethers-v4) + * [Utilities](ethers-v4) + * [Wallet](ethers-v4) + diff --git a/docs/v5/migration/ethers-v4/README.md b/docs/v5/migration/ethers-v4/README.md new file mode 100644 index 000000000..4575ce3cd --- /dev/null +++ b/docs/v5/migration/ethers-v4/README.md @@ -0,0 +1,192 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Migration: From Ethers v4 +========================= + +BigNumber +--------- + +### Namespace + +``` +// v4 +ethers.utils.BigNumber +ethers.utils.BigNumberish + +// v5 +ethers.BigNumber +ethers.BigNumberish +``` + +### Creating Instances + +``` +// v4 +new ethers.utils.BigNumber(someValue) +ethers.utils.bigNumberify(someValue); + +// v5 +// - Constructor is private +// - Removed `bigNumberify` +ethers.BigNumber.from(someValue) +``` + +Contracts +--------- + +``` +// @TODO +``` + +Errors +------ + +### Namespace + +``` +// v4 +ethers.errors.UNKNOWN_ERROR +ethers.errors.* + +errors.setCensorship(censorship, permanent) +errors.setLogLevel(logLevel) + +errors.checkArgumentCount(count, expectedCount, suffix) +errors.checkNew(self, kind) +errors.checkNormalize() +errors.throwError(message, code, params) +errors.warn(...) +errors.info(...) + +// v5 +ethers.utils.Logger.errors.UNKNOWN_ERROR +ethers.utils.Logger.errors.* + +Logger.setCensorship(censorship, permanent) +Logger.setLogLevel(logLevel) + +const logger = new ethers.utils.Logger(version); +logger.checkArgumentCount(count, expectedCount, suffix) +logger.checkNew(self, kind) +logger.checkNormalize() +logger.throwError(message, code, params) +logger.warn(...) +logger.info(...) +``` + +Interface +--------- + +### Functions + +``` +// v4 (example: "transfer(address to, uint amount)") +interface.functions.transfer.encode(to, amount) +interface.functions.transfer.decode(callData) + +// v5 +interface.encodeData("transfer", [ to, amount ]) +interface.decodeResult("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) +``` + +### Events + +``` +// v4 (example: Transfer(address indexed, address indexed, uint256) +interface.events.Transfer.encodeTopics(values) +interface.events.Transfer.decode(data, topics) + +// v5 +interface.encodeFilterTopics("Transfer", values) +interface.encodeEventLog("Transfer", data, topics) +``` + +### Inspection + +``` +// v4 +interface.functions.transfer.name +interface.functions.transfer.inputs +interface.functions.transfer.outputs +interface.functions.transfer.payable +interface.functions.transfer.gas + +// v5 +const functionFragment = interface.getFunction("transfer") +functionFragment.name +functionFragment.inputs +functionFragment.outputs +functionFragment.payable +functionFragment.gas + + +// v4; type is "call" or "transaction" +interface.functions.transfer.type + +// v5; constant is true (i.e. "call") or false (i.e. "transaction") +functionFragment.constant + + +// v4 +interface.events.Transfer.anonymous +interface.events.Transfer.inputs +interface.events.Transfer.name + +// v5 +const eventFragment = interface.getEvent("Transfer"); +eventFragment.anonymous +eventFragment.inputs +eventFragment.name + + +// v4 +const functionSig = interface.functions.transfer.signature +const sighash = interface.functions.transfer.sighash + +const eventSig = interface.events.Transfer.signature +const topic = interface.events.Transfer.topic + +// v5 +const functionSig = functionFragment.format() +const sighash = interface.getSighash(functionFragment) + +const eventSig = eventFragment.format() +const topic = interface.getTopic(eventFragment) +``` + +Utilities +--------- + +### Renaming + +``` +// @TODO +``` + +Wallet +------ + +### Mnemonic Phrases + +``` +// v4 +wallet.mnemonic +wallet.path + +// v5 +// - Mnemonic phrase and path are a Mnemonic object +// - Note: wallet.mnemonic is null if there is no mnemonic +wallet.mnemonic.phrase +wallet.mnemonic.path +``` + diff --git a/docs/v5/migration/ethers-v4/index.html b/docs/v5/migration/ethers-v4/index.html new file mode 100644 index 000000000..7a8335868 --- /dev/null +++ b/docs/v5/migration/ethers-v4/index.html @@ -0,0 +1,167 @@ + + + + Migration: From Ethers v4 + + + + +
+ + +

Migration: From Ethers v4

+

BigNumber

+

Namespace

Since BigNumber is used quite frequently, it has been moved to the top level of the umbrella package.

+ +
// v4 +ethers.utils.BigNumber +ethers.utils.BigNumberish + +// v5 +ethers.BigNumber +ethers.BigNumberish

Creating Instances

The bigNumberify method was always preferred over the constructor since it could short-circuit an object instantiation for [[BigNumber] objects (since they are immutable). This has been moved to a static from class method.

+ +
// v4 +new ethers.utils.BigNumber(someValue) +ethers.utils.bigNumberify(someValue); + +// v5 +// - Constructor is private +// - Removed `bigNumberify` +ethers.BigNumber.from(someValue)

Contracts

+
// @TODO

Errors

+

Namespace

All errors now belong to the Logger class and the related functions have been moved to Logger instances, which can include a per-package version string.

+ +

Global error fucntions have been moved Logger class methods.

+ +
// v4 +ethers.errors.UNKNOWN_ERROR +ethers.errors.* + +errors.setCensorship(censorship, permanent) +errors.setLogLevel(logLevel) + +errors.checkArgumentCount(count, expectedCount, suffix) +errors.checkNew(self, kind) +errors.checkNormalize() +errors.throwError(message, code, params) +errors.warn(...) +errors.info(...) + +// v5 +ethers.utils.Logger.errors.UNKNOWN_ERROR +ethers.utils.Logger.errors.* + +Logger.setCensorship(censorship, permanent) +Logger.setLogLevel(logLevel) + +const logger = new ethers.utils.Logger(version); +logger.checkArgumentCount(count, expectedCount, suffix) +logger.checkNew(self, kind) +logger.checkNormalize() +logger.throwError(message, code, params) +logger.warn(...) +logger.info(...)

Interface

The Interface object has undergone the most dramatic changes.

+ +

It is no longer a meta-class and now has methods that simplify handling contract interface operations without the need for object inspection and special edge cases.

+ +

Functions

+
// v4 (example: "transfer(address to, uint amount)") +interface.functions.transfer.encode(to, amount) +interface.functions.transfer.decode(callData) + +// v5 +interface.encodeData("transfer", [ to, amount ]) +interface.decodeResult("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)

Events

+
// v4 (example: Transfer(address indexed, address indexed, uint256) +interface.events.Transfer.encodeTopics(values) +interface.events.Transfer.decode(data, topics) + +// v5 +interface.encodeFilterTopics("Transfer", values) +interface.encodeEventLog("Transfer", data, topics)

Inspection

Interrogating properties about a function or event can now (mostly) be done directly on the Fragment object.

+ +
// v4 +interface.functions.transfer.name +interface.functions.transfer.inputs +interface.functions.transfer.outputs +interface.functions.transfer.payable +interface.functions.transfer.gas + +// v5 +const functionFragment = interface.getFunction("transfer") +functionFragment.name +functionFragment.inputs +functionFragment.outputs +functionFragment.payable +functionFragment.gas + + +// v4; type is "call" or "transaction" +interface.functions.transfer.type + +// v5; constant is true (i.e. "call") or false (i.e. "transaction") +functionFragment.constant + + +// v4 +interface.events.Transfer.anonymous +interface.events.Transfer.inputs +interface.events.Transfer.name + +// v5 +const eventFragment = interface.getEvent("Transfer"); +eventFragment.anonymous +eventFragment.inputs +eventFragment.name + + +// v4 +const functionSig = interface.functions.transfer.signature +const sighash = interface.functions.transfer.sighash + +const eventSig = interface.events.Transfer.signature +const topic = interface.events.Transfer.topic + +// v5 +const functionSig = functionFragment.format() +const sighash = interface.getSighash(functionFragment) + +const eventSig = eventFragment.format() +const topic = interface.getTopic(eventFragment)

Utilities

+

Renaming

+
// @TODO

Wallet

+

Mnemonic Phrases

The mnemonic phrase and related properties have been merged into a single mnemonic object, which also now includes the locale.

+ +
// v4 +wallet.mnemonic +wallet.path + +// v5 +// - Mnemonic phrase and path are a Mnemonic object +// - Note: wallet.mnemonic is null if there is no mnemonic +wallet.mnemonic.phrase +wallet.mnemonic.path
+ + + +
+ + + diff --git a/docs/v5/migration/index.html b/docs/v5/migration/index.html new file mode 100644 index 000000000..2b5713c87 --- /dev/null +++ b/docs/v5/migration/index.html @@ -0,0 +1,31 @@ + + + + Migration Guide + + + + +
+ + +

Migration Guide

Here are some migration guides when upgrading from older versions of Ethers or other libraries.

+ + + + + +
+ + + diff --git a/docs/v5/migration/web3/README.md b/docs/v5/migration/web3/README.md new file mode 100644 index 000000000..23c5517f9 --- /dev/null +++ b/docs/v5/migration/web3/README.md @@ -0,0 +1,21 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Migration: From Web3.js +======================= + +Contracts +--------- + +Providers +--------- + +Numbers +------- + +Utilities +--------- + diff --git a/docs/v5/migration/web3/index.html b/docs/v5/migration/web3/index.html new file mode 100644 index 000000000..09e7ebdfd --- /dev/null +++ b/docs/v5/migration/web3/index.html @@ -0,0 +1,35 @@ + + + + Migration: From Web3.js + + + + +
+ + +

Migration: From Web3.js

TODO

+ +

Contracts

+

Providers

+

Numbers

+

Utilities

+ + + + +
+ + + diff --git a/docs/v5/single-page/index.html b/docs/v5/single-page/index.html new file mode 100644 index 000000000..1dc770062 --- /dev/null +++ b/docs/v5/single-page/index.html @@ -0,0 +1,3874 @@ + + + + ethers + + + + +
+ +

Documentation

+

What is Ethers?

The ethers.js library aims to be a complete and compact library for interacting with the Ethereum Blockchain and its ecosystem. It was originally designed for use with ethers.io and has since expanded into a much more general-purpose library.

+ +

Features

  • Keep your private keys in your client, safe and sound
  • Import and export JSON wallets (Geth, Parity and crowdsale)
  • Import and export BIP 39 mnemonic phrases (12 word backup phrases) and HD Wallets (English, Italian, Japanese, Korean, Simplified Chinese, Traditional Chinese; more coming soon)
  • Meta-classes create JavaScript objects from any contract ABI, including ABIv2 and Human-Readable ABI
  • Connect to Ethereum nodes over JSON-RPC, INFURA, Etherscan, Alchemy, Cloudflare or MetaMask.
  • ENS names are first-class citizens; they can be used anywhere an Ethereum addresses can be used
  • Tiny (~88kb compressed; 284kb uncompressed)
  • Complete functionality for all your Ethereum needs
  • Extensive documentation
  • Large collection of test cases which are maintained and added to
  • Fully TypeScript ready, with definition files and full TypeScript source
  • MIT License (including ALL dependencies); completely open source to do with as you please

+ +

Developer Documentation

+

Legacy Documentation

This section will be kept up to date, linking to documentation of older versions of the library.

+ +

+ +

Getting Started

+

Installing

The various Classes and Functions are available to be imported manually from sub-packages under the @ethersproject organization but for most projects, the umbrella package is the easiest way to get started.

+ +
/home/ricmoo> npm install --save ethers@next

Importing

+

Node.js

+
node.js require
const { ethers } = require("ethers");
ES6 or TypeScript
import { ethers } from "ethers";

Web Browser

It is generally better practice (for security reasons) to copy the ethers library to your own webserver and serve it yourself.

+ +

For quick demos or prototyping though, it can be loaded in your Web Applications from our CDN.

+ +
ES6 in the Browser
<script src="https://cdn.ethers.io/lib/ethers-5.0.esm.min.js" + type="application/javascipt"></script>
ES3 (UMD) in the Browser
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js" + type="application/javascipt"></script>

Common Terminology

This section needs work...

+ +
ProviderA Provider (in ethers) is a class which provides an abstraction for a connection to the Ethereum Network. It provides read-only access to the Blockchain and its status. 
SignerA Signer is a class which (usually) in some way directly or indirectly has access to a private key, which can sign messages and transactions to authorize the network to charge your account ether to perform operations. 
ContractA Contract is an abstraction which represents a connection to a specific contract on the Ethereum Network, so that it can be used like a normal JavaScipt object. 
Common Terms 

Connecting to Ethereum: Metamask

The quickest and easiest way to experiment and begin developing on Ethereum is to use 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)

+ +
Connecting to Metamask
// A Web3Provider wraps a standard Web3 provider, which is +// what Metamask injects as window.ethereum into each page +const provider = new ethers.providers.Web3Provider(window.ethereum) + +// The Metamask plugin also allows signing transactions to +// send ether and pay to change state within the blockchain. +// For this, we need the account signer... +const signer = provider.getSigner()

Querying the Blockchain

Once you have a Provider, you have a read-only connection to the blockchain, which can be used to query the current state, fetch historic logs, look up deployed code and so on.

+ +
Basic Queries
// Look up the current block number +provider.getBlockNumber() +//! + +// Get the balance of an account (by address or ENS name) +balance = await provider.getBalance("ethers.eth") +//! async balance + +// Often you will need to format the output for the user +// which prefer to see values in ether (instead of wei) +ethers.utils.formatEther(balance) +//! + +// Or if a user enters a string in an input field, you may need +// to convert it from ether (as a string) to wei (as a BigNumber) +ethers.utils.parseEther("1.0") +//!

Writing to the Blockchain

+
Sending Ether
// Send 1 ether to an ens name. +const tx = signer.sendTransaction({ + to: "ricmoo.firefly.eth", + value: ethers.utils.parseEther("1.0") +});

Contracts

A Contract is an abstraction of program code which lives on the Ethereum blockchain.

+ +

The Contract object makes it easier to use an on-chain Contract as a normal JavaScript object, with the method all mapped to encoding and decoding data for you.

+ +

If you are familiar with Databases, this is similar to ORM.

+ +

In order to communicate with the Contract on-chain, this class needs to know what methods are available and how to encode and decode the data, which is what the Application Binary Interface (API) provides.

+ +

This class is a meta-class, which means its methods are constructed at runtime, when you pass in the ABI to the constructor it uses that to determine which methods to add.

+ +

While a on-chain Contract may have many methods available, you can safely ignore any methods you don't need or use, providing a smaller subset of the ABI to the contract.

+ +

An ABI often comes from the Solidity or Vyper compiler, but may also be placed in the code easily using the Human-Readable ABI, which the following examples use.

+ +
Connecting to the DAI Contract
// We can use an ENS name for the contract address +const daiAddress = "dai.tokens.ethers.eth"; + +// The ERC-20 Contract ABI, which is a common contract interface +// for tokens (this is the Human-Readable ABI format) +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", + + // Send some of your tokens to someone else + "function transfer(address to, uint amount)", + + // An event triggered whenever anyone transfers to someone else + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// The Contract object +const daiContract = new ethers.Contract(daiAddress, daiAbi, provider);

Read-Only Methods

+
Querying the DAI Contract
// <hide> +const daiAbi = [ + // Some simple details about the token + "function name() view returns (string)", + "function symbol() view returns (string)", + + // Get the account balance + "function balanceOf(address) view returns (uint)", +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +// </hide> + +// Get the ERC-20 token name +daiContract.name() +//! + +// Get the ERC-20 token synbol (for tickers and UIs) +daiContract.symbol() +//! + +// Get the balance of an address +balance = await daiContract.balanceOf("ricmoo.firefly.eth") +//! async balance + +// Format the DAI for displaying to the user +ethers.utils.formatUnits(balance, 18) +//!

State Changing Methods

+
Sending DAI
// The DAI Contract is currently connected to the Provider, +// which is read-only. We need to connect to a Signer, so +// that we can pay to send state-changing transactions. +const daiWithSigner = contract.connect(signer); + +// Each DAI has 18 decimal places +const dai = ethers.utils.parseUnits("1.0", 18); + +// Send 1 DAI to "ricmoo.firefly.eth" +tx = daiWithSigner.transfer("ricmoo.firefly.eth", dai);

Listening to Events

+
Listening to Events
// <hide> +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +const formatEther = ethers.utils.formatEther; +// </hide> + +// Receive an event when ANY transfer occurs +daiContract.on("Transfer", (from, to, amount, event) => { + console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`); + // The event object contains the verbatim log data, the + // EventFragment and functions to fetch the block, + // transaction and receipt and event functions +}); + +// A filter for when a specific address receives tokens +myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +filter = daiContract.filters.Transfer(null, myAddress) +// <hide> +filter +// </hide> +//! + +// Receive an event when that filter occurs +daiContract.on(filter, (from, to, amount, event) => { + // The to will always be "address" + console.log(`I got ${ formatEther(amount) } from ${ from }.`); +}); + +// <hide> +// Don't want to block the docs from compiling... +daiContract.removeAllListeners(); +// </hide>

Query Historic Events

+
Filtering Historic Events
// <hide> +const signer = new ethers.VoidSigner("0x8ba1f109551bD432803012645Ac136ddd64DBA72"); +const daiAbi = [ + "event Transfer(address indexed, address indexed, uint256)" +]; +const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider); +//! +// </hide> + +// Get the address of the Signer +myAddress = await signer.getAddress() +//! async myAddress + +// Filter for all token transfers to me +filterFrom = daiContract.filters.Transfer(myAddress, null); +// <hide> +filterFrom +// </hide> +//! + +// Filter for all token transfers from me +filterTo = daiContract.filters.Transfer(null, myAddress); +// <hide> +filterTo +// </hide> +//! + +// List all transfers sent from me a specific block range +daiContract.queryFilter(filterFrom, 9843470, 9843480) +//! + +// +// The following have had the results omitted due to the +// number of entries; but they provide some useful examples +// + +// List all transfers I sent in the last 10,000 blocks +daiContract.queryFilter(filterFrom, -10000) + +// List all transfers ever sent to me +daiContract.queryFilter(filterTo)

Signing Messages

+
Signing Messages
// <hide> +const signer = ethers.Wallet.createRandom(); +//! +// </hide> + +// To sign a simple string, which can often be used for +// logging into a service, such as CryptoKitties simply +// pass the string in. +signature = await signer.signMessage("Hello World"); +//! async signature + +// +// A common case is also signing a hash, which is 32 +// bytes. It is important to note, that to sign binary +// data it MUST be an Array (or TypedArray) +// + +// This string is 66 chacacters long +message = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" + +// This array representation is 32 bytes long +messageBytes = ethers.utils.arrayify(message); +//! + +// To sign a hash, you most often want to sign the bytes +signature = await signer.signMessage(messageBytes) +//! async signature

Ethereum Basics

This is a very breif overview of some aspects of Ethereum and blockchains which developers can make use of or should be aware of.

+ +

This section is fairly sparse at the moment, but will be expanded as time goes on.

+ +

Events

Explain how topics and such work

+ +

Solidity Topics

How to compute the topic...

+ +

Logs and Filtering

Example hog logs are used.

+ +

Link to provider.getLogs and contract.on

+ +

Filters

Filter are used as a way to query ... efficient, explain bloom filters lightly

+ +

A filter may have up to 4 topic-sets, where each topic-set refers to a condition that must match the log topic in that position (i.e. each condition is AND-ed together).

+ +

If a topic-set is null, a log topic in that position is not filtered at all and any value matches.

+ +

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).

+ +
Topic-SetsMatching Logs 
[ A ]topic[0] = A 
[ A, null ] 
[ null, B ]topic[1] = B 
[ null, [ B ] ] 
[ null, [ B ], null ] 
[ A, B ](topic[0] = A) AND (topic[1] = B) 
[ A, [ B ] ] 
[ A, [ B ], null ] 
[ [ A, B ] ](topic[0] = A) OR (topic[0] = B) 
[ [ A, B ], null ] 
[ [ A, B ], [ C, D ] ][ (topic[0] = A) OR (topic[0] = B) ] AND [ (topic[1] = C) OR (topic[1] = D) ] 
Example Log Matching 
ERC-20 Transfer Filter Examples
// <hide> +const tokenAddress = ethers.constants.AddressZero; +const myAddress = ethers.constants.AddressZero; +const myOtherAddress = ethers.constants.AddressZero; +const id = ethers.utils.id; +const hexZeroPad = ethers.utils.hexZeroPad; +// </hide> + +// Short example of manually creating filters for an ERC-20 +// Transfer event. +// +// Most users should generally use the Contract API to +// compute filters, as it is much simpler, but this is +// provided as an illustration for those curious. See +// below for examples of the equivalent Contract API. + +// ERC-20: +// Transfer(address indexed src, address indexed dst, uint val) +// +// -------------------^ +// ----------------------------------------^ +// +// Notice that only *src* and *dst* are *indexed*, so ONLY they +// qualify for filtering. +// +// Also, note that in Solidity an Event uses the first topic to +// identify the Event name; for Transfer this will be: +// id("Transfer(address,address,uint256)") +// +// Other Notes: +// - A topic must be 32 bytes; so shorter types must be padded + +// List all token transfers *from* myAddress +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + hexZeroPad(myAddress, 32) + ] +} + +// List all token transfers *to* myAddress or myOtherAddress: +filter = { + address: tokenAddress, + topics: [ + id("Transfer(address,address,uint256)"), + null, + [ + hexZeroPad(myAddress, 32), + hexZeroPad(myOtherAddress, 32), + ] + ] +}

To simplify life, ..., explain here, the contract API

+ +
ERC-20 Contract Filter Examples
// <hide> +const tokenAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; // DAI +const myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; +const otherAddress = "0xEA517D5a070e6705Cc5467858681Ed953d285Eb9"; +const provider = ethers.getDefaultProvider(); +const Contract = ethers.Contract; +// </hide> + +const abi = [ + "event Transfer(address indexed src, address indexed dst, uint val)" +]; + +const contract = new Contract(tokenAddress, abi, provider); + +// List all token transfers *from* myAddress +contract.filters.Transfer(myAddress) +//! + +// List all token transfers *to* myAddress: +contract.filters.Transfer(null, myAddress) +//! + +// List all token transfers *from* myAddress *to* otherAddress: +contract.filters.Transfer(myAddress, otherAddress) +//! + +// List all token transfers *to* myAddress OR otherAddress: +contract.filters.Transfer(null, [ myAddress, otherAddress ]) +//!

Other Things? TODO

Explain what happens to strings and bytes, how to filter and retain the value

+ +

Gas

Explain attack vectors

+ +

Gas Price

The gas price is used somewhat like a bid, indicating an amount you are willing to pay (per unit of execution) to have your transaction processed.

+ +

Gas Limit

+

Security

+

Key Derivation Functions

This is not specific to Ethereum, but is a useful technique to understand and has some implications on User Experience.

+ +

Many people are concerned that encrypting and decrypting an Ethereum wallet is quite slow and can take quite some time. It is important to understand this is intentional and provides much stronger security.

+ +

The algorithm usually used for this process is scrypt, which is a memory and CPU intensive algorithm which computes a key (fixed-length psudo-random series of bytes) for a given password.

+ +

Why does it take so long?

The goal is to use as much CPU and memory as possible during this algorithm, so that a single computer can only compute a very small number of results for some fixed amount of time. To scale up an attack, the attacker requires additional compuers, increasing the cost to brute-force attack to guess the password.

+ +

For example, if a user knows their correct password, this process may take 10 seconds for them to unlock their own wallet and proceed.

+ +

But since an attacker does not know the password, they must guess; and each guess also requires 10 seconds. So, if they wish to try guessing 1 million passwords, their computer would be completely tied up for 10 million seconds, or around 115 days.

+ +

Without using an algorithm like this, a user would be able to log in instantly, however, 1 million passwords would only take a few seconds to attempt. Even secure passwords would likely be broken within a short period of time. There is no way the algorithm can be faster for a legitimate user without also being faster for an attacker.

+ +

Mitigating the User Experience

Rather than reducing the security (see below), a better practice is to make the user feel better about waiting. The Ethers encryption and decryption API allows the developer to incorporate a progress bar, by passing in a progress callback which will be periodically called with a number between 0 and 1 indication percent completion.

+ +

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 a progress bar makes a user feel like there time is not being needlessly wasted.

+ +

Work-Arounds (not recommended)

There are ways to reduce the time required to decrypt an Ethereum JSON Wallet, but please keep in mind that doing so discards nearly all security on that wallet.

+ +

The scrypt algorithm is designed to be tuned. The main purpose of this is to increase the difficulty as time goes on and computers get faster, but it can also be tuned down in situations where the security is less important.

+ +
// Our wallet object +const wallet = Wallet.createRandom(); + +// The password to encrypt with +const password = "password123"; + +// WARNING: Doing this substantially reduces the security +// of the wallet. This is highly NOT recommended. + +// We override the default scrypt.N value, which is used +// to indicate the difficulty to crack this wallet. +const json = wallet.encrypt(password, { + scrypt: { + // The number must be a power of 2 (default: 131072) + N: 64 + } +});

Application Programming Interface

An Application Programming Interface (API) is the formal specification of the library.

+ +

Contract Interaction

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 deserialize their results and emitted logs.

+ +

A ContractFactory is an abstraction a contract's bytecode and facilitates deploying a contract.

+ +

Contract

Explain contract here...

+ +

Creating Instances

+
new ethers.Contract( address , abi , signerOrProvider )
+
contract.attach( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

+ +
contract.connect( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

+ +

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 will act on behalf of that signer.

+ +

Properties

+
contract.address string< Address >

This is the address (or ENS name) the contract was constructed with.

+ +
contract.resolvedAddress string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

+ +
contract.deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

+ +
contract.interface Interface

This is the ABI as an Interface.

+ +
contract.provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

+ +
contract.signer Signer

If a signer was provided to the constructor, this is that signer.

+ +

Methods

+
contract.deployed( ) Promise< Contract >
+
Contract.isIndexed( value ) boolean
+

Events

+
contract.queryFilter( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

+ +
contract.listenerCount( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

+ +
contract.listeners( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

+ +
contract.off( event , listener ) this

Unsubscribe listener to event.

+ +
contract.on( event , listener ) this

Subscribe to event calling listener when the event occurs.

+ +
contract.once( event , listener ) this

Subscribe once to event calling listener when the event occurs.

+ +
contract.removeAllListeners( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

+ +

Meta-Class

A Meta-Class is a Class which has any of its properties determined at run-time. The Contract object uses a Contract's ABI to determine what methods are available, so the following sections describe the generic ways to interact with the properties added at run-time during the Contract constructor.

+ +

Read-Only Methods (constant)

A constant method is read-only and evaluates a small amount of EVM code against the current blockchain state and can be computed by asking a single node, which can return a result. It is therefore free and does not require any ether, but cannot make changes to the blockchain state..

+ +
contract.METHOD_NAME( ...args [ , overrides ] ) Promise< any >

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 is returned.

+ +

For bytes (both fixed length and dynamic), a DataHexString is returned.

+ +
contract.functions.METHOD_NAME( ...args [ , overrides ] ) Promise< Result >

The result will always be a Result, even if there is only a single return value type.

+ +

This simplifies frameworks which wish to use the Contract object, since they do not need to inspect the return types to unwrap simplified functions.

+ +

Another use for this method is for error recovery. For example, if a function result is an invalid UTF-8 string, the normal call using the above meta-class function will throw an exception. This allows using the Result access error to access the low-level bytes and reason for the error allowing an alternate UTF-8 error strategy to be used.

+ +

Most developers should not require this.

+ +

Write Methods (non-constant)

A non-constant method requires a transaction to be signed and requires payment in the form of a fee to be paid to a miner. This transaction will be verified by every node on the entire network as well by the miner who will compute the new state of the blockchain after executing it against the current state.

+ +

It cannot return a result. If a result is required, it should be logged using a Solidity event (or EVM log), which can then be queried from the transaction receipt.

+ +
contract.METHOD_NAME( ...args [ , overrides ] ) Promise< TransactionResponse >

Returns a TransactionResponse for the transaction after it is sent to the network. This requires the Contract has a signer.

+ +

Write Methods Analysis

There are secveral options to analyze properties and results of a write method without actually executing it.

+ +
contract.estimateGas.METHOD_NAME( ...args [ , overrides ] ) Promise< BigNumber >

Returns the estimate units of gas that would be required to execute the METHOD_NAME with args and overrides.

+ +
contract.populateTransaction.METHOD_NAME( ...args [ , overrides ] ) Promise< UnsignedTx >

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.

+ +
contract.staticCall.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 otherwise functions the same as a Read-Only Method.

+ +

Event Filters

An event filter is made up of topics, which are values logged in a Bloom Filter, allowing efficient searching for entries which match a filter.

+ +
contract.filters.EVENT_NAME( ...args ) Filter

Return a filter for EVENT_NAME, optionally filtering by additional constraints.

+ +

Only indexed event parameters may be filtered. If a parameter is null (or not provided) then any value in that field matches.

+ +

ContractFactory

+

Creating Instances

+
new ethers.ContractFactory( interface , bydecode [ , signer ] )
+
ContractFactory.fromSolidity( compilerOutput [ , signer ] ) ContractFactory
+
contractFactory.connect( signer ) Contract
+

Properties

+
contractFactory.interface Interface
+
contractFactory.bytecode string< DataHexString >
+
contractFactory.signer Signer
+

Methods

+
contractFactory.attach( address ) Contract

Return an instance of a Contract attched to address. This is the same as using the Contract constructor with address and this the the interface and signerOrProvider passed in when creating the ContractFactory.

+ +
contractFactory.getDeployTransaction( ...args ) UnsignedTransaction

Returns the unsigned transaction which would deploy this Contract with args passed to the Contract's constructor.

+ +
contractFactory.deploy( ...args ) Promise< 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.

+ +

The transction can be found at contract.deployTransaction, and no interactions should be made until the transaction is mined.

+ +
Deploying a Contract
// <hide> +const signer = ethers.LocalSigner(); +const ContractFactory = ethers.ContractFactory; +// </hide> + +// If your contract constructor requires parameters, the ABI +// must include the constructor +const abi = [ + "constructor(address owner, uint256 initialValue)" +]; + +const factory = new ContractFactory(abi, bytecode, signer) + +const contract = await factory.deploy("ricmoo.eth", 42); + +// The address is available immediately, but the contract +// is NOT deployed yet +contract.address +//! + +// The transaction that the signer sent to deploy +contract.deployTransaction +//! + +// Wait until the transaction is mined +contract.deployTransaction.wait() +//! + +// Now the contract is safe to ineract with +contract.value() +//!

Example: ERC-20 Contract

+

Connecting to a Contract

+
A simple ERC-20 contract
// A Human-Readable ABI; any supported ABI format could be used +const abi = [ + // Read-Only Functions + "function balanceOf(address owner) view returns (uint256)", + "function decimals() view returns (uint8)", + "function symbol() view returns (string)", + + // Authenticated Functions + "function transfer(address to, uint amount) returns (boolean)", + + // Events + "event Transfer(address indexed from, address indexed to, uint amount)" +]; + +// This can be an address or an ENS name +const address = "dai.tokens.ethers.eth"; + +// An example Provider +const provider = ethers.getDefaultProvider(); + +// An example Signer +const signer = ethers.Wallet.createRandom().connect(provider); + +// Read-Only; By connecting to a Provider, allows: +// - Any constant function +// - Querying Filters +// - Populating Unsigned Transactions for non-constant methods +// - Estimating Gas for non-constant (as an anonymous sender) +// - Static Calling non-constant methods (as anonymous sender) +const erc20 = new ethers.Contract(address, abi, provider); + +// Read-Write; By connecting to a Signer, allows: +// - Everything from Read-Only (except as Signer, not anonymous) +// - Sending transactions for non-constant functions +const erc20_rw = new ethers.Contract(address, abi, signer)

ERC20Contract inherits Contract

+
new ethers.Contract( address , abi , providerOrSigner )

See the above code example for creating an Instance which will (in addition to the Contact methods and properties) automatically add the additional properties defined in abi to a Contract connected to address using the providerOrSigner.

+ +

Properties(inheritted from Contract)

+
erc20.address string< Address >

This is the address (or ENS name) the contract was constructed with.

+ +
erc20.resolvedAddress string< Address >

This is a promise that will resolve to the address the Contract object is attached to. If an Address was provided to the constructor, it will be equal to this; if an ENS name was provided, this will be the resolved address.

+ +
erc20.deployTransaction TransactionResponse

If the Contract object is the result of a ContractFactory deployment, this is the transaction which was used to deploy the contract.

+ +
erc20.interface Interface

This is the ABI as an Interface.

+ +
erc20.provider Provider

If a provider was provided to the constructor, this is that provider. If a signer was provided that had a Provider, this is that provider.

+ +
erc20.signer Signer

If a signer was provided to the constructor, this is that signer.

+ +

Methods(inheritted from Contract)

+
erc20.attach( addressOrName ) Contract

Returns a new instance of the Contract attached to a new address. This is useful if there are multiple similar or identical copies of a Contract on the network and you wish to interact with each of them.

+ +
erc20.connect( providerOrSigner ) Contract

Returns a new instance of the Contract, but connected to providerOrSigner.

+ +

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 will act on behalf of that signer.

+ +
erc20.deployed( ) Promise< Contract >
+
Contract.isIndexed( value ) boolean
+

Events(inheritted from Contract)

+
erc20.queryFilter( event [ , fromBlockOrBlockHash [ , toBlock ] ) Promise< Array< Event > >

Return Events that match the event.

+ +
erc20.listenerCount( [ event ] ) number

Return the number of listeners that are subscribed to event. If no event is provided, returns the total count of all events.

+ +
erc20.listeners( event ) Array< Listener >

Return a list of listeners that are subscribed to event.

+ +
erc20.off( event , listener ) this

Unsubscribe listener to event.

+ +
erc20.on( event , listener ) this

Subscribe to event calling listener when the event occurs.

+ +
erc20.once( event , listener ) this

Subscribe once to event calling listener when the event occurs.

+ +
erc20.removeAllListeners( [ event ] ) this

Unsubscribe all listeners for event. If no event is provided, all events are unsubscribed.

+ +

Meta-Class Methods(added at Runtime)

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

+ +
erc20.decimals( [ overrides ] ) Promise< number >

Returns the number of decimal places used by this ERC-20 token. This can be used with parseUnits when taking input from the user or [formatUnits](utils-formatunits] when displaying the token amounts in the UI.

+ +
erc20.getBalance( owner [ , overrides ] ) Promise< BigNumber >

Returns the balance of owner for this ERC-20 token.

+ +
erc20.symbol( [ overrides ] ) Promise< string >

Returns the symbol of the token.

+ +
erc20_rw.transfer( target , amount [ , overrides ] ) Promise< TransactionResponse >

Transfers amount tokens to target from the current signer. The return value (a boolean) is inaccessible during a write operation using a transaction. Other techniques (such as events) are required if this value is required. On-chain contracts calling the transfer function have access to this result, which is why it is possible.

+ +
erc20.callStatic.transfer( target , amount [ , overrides ] ) Promise< boolean >

Performs a dry-run of transferring amount tokens to target from the current signer, without actually signing or sending a transaction.

+ +

This can be used to preflight check that a transaction will be successful.

+ +
erc20.estimateGas.transfer( target , amount [ , overrides ] ) Promise< BigNumber >

Returns an estimate for how many units of gas would be required to transfer amount tokens to target.

+ +
erc20.populateTransaction.transfer( target , amount [ , overrides ] ) Promise< UnsignedTx >

Returns an UnsignedTransaction which could be signed and submitted to the network to transaction amount tokens to target.

+ +
Note on Estimating and Static Calling

When you perform a static call, the current state is taken into account as best as Ethereum can determine. There are many cases where this can provide false positives and false negatives. The eventually consistent model of the blockchain also means there are certain consistency modes that cannot be known until an actual transaction is attempted.

+ +

Meta-Class Filters(added at Runtime)

Since the Contract is a Meta-Class, the methods available here depend on the ABI which was passed into the Contract.

+ +
erc20.filters.Transafer( [ fromAddress [ , toAddress ] ] ) Filter

Returns a new Filter which can be used to query or to subscribe/unsubscribe to events.

+ +

If fromAddress is null or not provided, then any from address matches. If toAddress is null or not provided, then any to address matches.

+ +

Signers

A Signer in ethers is an abstraction of an Ethereum Account, which can be used to sign messages and transactions and send signed transactions to the Ethereum Network to execute state changing operations.

+ +

The available operations depends largely on the sub-class used.

+ +

For example, a Signer from MetaMask can send transactions and sign messages but cannot sign a transaction (without broadcasting it).

+ +

The most common Signers you will encounter are:

+ +

+ +

Signer

The Signer class is abstract and cannot be directly instaniated.

+ +

Instead use one of the concreate sub-classes, such as the Wallet, VoidSigner or JsonRpcSigner.

+ +
signer.connect( provider ) Signer

Sub-classes must implement this, however they may simply throw an error if changing providers is not supported.

+ +
signer.getAddress( ) Promise< string< Address > >

Returns a Promise that resolves to the account address.

+ +

This is a Promise so that a Signer can be designed around an asynchronous source, such as hardware wallets.

+ +

Sub-classes must implement this.

+ +
Signer.isSigner( object ) boolean

Returns true if an only if object is a Signer.

+ +

Blockchain Methods

+
signer.getBalance( [ blockTag = "latest" ] ) Promise< BigNumber >

Returns the balance of this wallet at blockTag.

+ +
signer.getChainId( ) Promise< number >

Returns ths chain ID this wallet is connected to.

+ +
signer.getGasPrice( ) Promise< BigNumber >

Returns the current gas price.

+ +
signer.getTransactionCount( [ blockTag = "latest" ] ) Promise< number >

Returns the number of transactions this account has ever sent. This is the value required to be included in transactions as the nonce.

+ +
signer.call( transactionRequest ) Promise< string< DataHexString > >

Returns the result of calling using the transactionRequest, with this account address being used as the from field.

+ +
signer.estimateGas( transactionRequest ) Promise< BigNumber >

Returns the result of estimating the cost to send the transactionRequest, with this account address being used as the from field.

+ +
signer.resolveName( ensName ) Promise< string< Address > >

Returns the address associated with the ensName.

+ +

Signing

+
signer.signMessage( message ) Promise< string< RawSignature > >

This returns a Promise which resolves to the Raw Signature of message.

+ +

Sub-classes must implement this, however they may throw if signing a message is not supported, such as in a Contract-based Wallet or Meta-Transaction-based Wallet.

+ +
Note

If message is a string, it is treated as a string and converted to its representation in UTF8 bytes.

+ +

If and only if a message is a Bytes will it be treated as binary data.

+ +

For example, the string "0x1234" is 6 characters long (and in this case 6 bytes long). This is not equivalent to the array [ 0x12, 0x34 ], which is 2 bytes long.

+ +

A common case is to sign a hash. In this case, if the hash is a string, it must be converted to an array first, using the arrayify utility function.

+ +
+
signer.signTransaction( transactionRequest ) Promise< string< DataHexString > >

Returns a Promise which resolves to the signed transaction of the transactionRequest. This method does not populate any missing fields.

+ +

Sub-classes must implement this, however they may throw if signing a transaction is not supported, which is common for security reasons in many clients.

+ +
signer.sendTransaction( transactionRequest ) Promise< TransactionResponse >

This method populates the transactionRequest with missing fields, using populateTransaction and returns a Promise which resolves to the transaction.

+ +

Sub-classes must implement this, however they may throw if sending a transaction is not supported, such as the VoidSigner or if the Wallet is offline and not connected to a Provider.

+ +

Sub-Classes

It is very important that all important properties of a Signer are immutable. Since Ethereum is very asynchronous and deals with critical data (such as ether and other potentially valuable crypto assets), keeping 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().

+ +
signer.checkTransaction( transactionRequest ) TransactionRequest

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

+ +

This should return a copy of the transactionRequest, with any properties needed by call, estimateGas and populateTransaction (which is used by sendTransaction). It should also throw an error if any unknown key is specified.

+ +

The default implementation checks only valid TransactionRequest properties exist and adds from to the transaction if it does not exist.

+ +

If there is a from field it must be verified to be equal to the Signer's address.

+ +
signer.populateTransaction( transactionRequest ) Promise< TransactionRequest >

This is generally not required to be overridden, but may needed to provide custom behaviour in sub-classes.

+ +

This should return a copy of transactionRequest, follow the same procedure as checkTransaction and fill in any properties required for sending a transaction. The result should have all promises resolved; if needed the resolveProperties utility function can be used for this.

+ +

The default implementation calls checkTransaction and resolves to if it is an ENS name, adds gasPrice, nonce, gasLimit and chainId based on the related operations on Signer.

+ +

The Wallet class inherits Signer and can sign transactions and messages using a private key as a standard Externally Owned Account (EOA).

+ +
new ethers.Wallet( privateKey [ , provider ] )

Create a new Wallet instance for privateKey and optionally connected to the provider.

+ +
ethers.Wallet.createRandom( [ options = {} ] ) Wallet

Returns a new Wallet with a random private key, generated from cryptographically secure entropy sources. If the current environment does not have a secure entropy source, an error is thrown.

+ +

Wallets created using this method will have a mnemonic.

+ +
ethers.Wallet.fromEncryptedJson( json , password [ , progress ] ) Promise< Wallet >

Create an instance from an encrypted JSON wallet.

+ +

If progress is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion.

+ +
ethers.Wallet.fromEncryptedJsonSync( json , password ) Wallet

Create an instance from an encrypted JSON wallet.

+ +

This operation will operate synchronously which will lock up the user interface, possibly for a non-trivial duration. Most applications should use the asynchronous fromEncryptedJson instead.

+ +
ethers.Wallet.fromMnemonic( mnemonic [ , path , [ wordlist ] ] ) Wallet

Create an instance from a mnemonic phrase.

+ +

If path is not specified, the Ethereum default path is used (i.e. m/44'/60'/0'/0/0).

+ +

If wordlist is not specified, the English Wordlist is used.

+ +

Properties

+
wallet.address string< Address >

The address for the account this Wallet represents.

+ +
wallet.provider Provider

The provider this wallet is connected to, which will ge used for any Blockchain Methods methods. This can be null.

+ +
Note

A Wallet instance is immuatable, so if you wish to change the Provider, you may use the connect method to create a new instance connected to the desired provider.

+ +
wallet.publicKey string< DataHexString< 65 > >

The uncompressed public key for this Wallet represents.

+ +

Methods

+
wallet.encrypt( password , [ options = {} , [ progress ] ] ) Promise< string >

Encrypt the wallet using password returning a Promise which resolves to a JSON wallet.

+ +

If progress is provided it will be called during decryption with a value between 0 and 1 indicating the progress towards completion.

+ +
Wallet Examples
// Create a wallet instance from a mnemonic... +mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" +walletMnemonic = Wallet.fromMnemonic(mnemonic) + +// ...or from a private key +walletPrivateKey = new Wallet(walletMnemonic.privateKey) + +walletMnemonic.address === walletPrivateKey.address +//! + +// The address as a Promise per the Signer API +walletMnemonic.getAddress() +//! + +// A Wallet address is also available synchronously +walletMnemonic.address +//! + +// The internal cryptographic components +walletMnemonic.privateKey +//! +walletMnemonic.publicKey +//! + +// The wallet mnemonic +walletMnemonic.mnemonic +//! + +// Note: A wallet created with a private key does not +// have a mnemonic (the derivation prevents it) +walletPrivateKey.mnemonic +//! + +// Signing a message +walletMnemonic.signMessage("Hello World") +//! + +tx = { + to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72", + value: utils.parseEther("1.0") +} + +// Signing a transaction +walletMnemonic.signTransaction(tx) +//! + +// The connect method returns a new instance of the +// Wallet connected to a provider +wallet = walletMnemonic.connect(provider) + +// Querying the network +wallet.getBalance(); +//! +wallet.getTransactionCount(); +//! + +// Sending ether +wallet.sendTransaction(tx) +// <hide> +//! error +// </hide>

VoidSigner inherits Signer

A VoidSigner is a simple Signer which cannot sign.

+ +

It is useful as a read-only signer, when an API requires a Signer as a parameter, but it is known only read-only operations will be carried.

+ +

For example, the call operation will automatically have the provided address passed along during the execution.

+ +
new ethers.VoidSigner( address [ , provider ] ) VoidSigner

Create a new instance of a VoidSigner for address.

+ +
voidSigner.address string< Address >

The address of this VoidSigner.

+ +
VoidSigner Pre-flight Example
address = "0x8ba1f109551bD432803012645Ac136ddd64DBA72" +signer = new ethers.VoidSigner(address, provider) + +// The DAI token contract +abi = [ + "function balanceOf(address) view returns (uint)", + "function transfer(address, uint) returns (bool)" +] +contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer) + +// <hide> +//! +// </hide> +// Get the number of tokens for this account +tokens = await contract.balanceOf(signer.getAddress()) +//! async tokens + +// +// Pre-flight (check for revert) on DAI from the signer +// +// Note: We do not have the private key at this point, this +// simply allows us to check what would happen if we +// did. This can be useful to check before prompting +// a request in the UI +// + +// This will pass since the token balance is available +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

ExternallyOwnedAccount

This is an interface which contains a minimal set of properties required for Externally Owned Accounts which can have certain operations performed, such as encoding as a JSON wallet.

+ +
eoa.address string< Address >

The Address of this EOA.

+ +
eoa.privateKey string< DataHexString< 32 > >

The privateKey of this EOA

+ +
eoa.mnemonic Mnemonic

Optional. The account HD mnemonic, if it has one and can be determined. Some sources do not encode the mnemonic, such as an HD extended keys.

+ +

Providers

A Provider is an abstraction of a connection to the Ethereum network, providing a concise, consistent interface to standard Ethereum node functionality.

+ +

The ethers.js library provides several options which should cover the vast majority of use-cases, but also includes the necessary functions and classes for sub-classing if a more custom configuration is necessary.

+ +

Most users should be able to simply use the Default Provider.

+ +

Default Provider

The default provider is the safest, easiest way to begin developing on Ethereum, and it is also robust enough for use in production.

+ +

It creates a FallbackProvider connected to as many backend services as possible. When a request is made, it is sent to multiple backends simulatenously. As responses from each backend are returned, they are checked that they agree. Once a quorum has been reached (i.e. enough of the backends agree), the response is provided to your application.

+ +

This ensures that if a backend has become out-of-sync, or if it has been compromised that its responses are dropped in favor of responses that match the majority.

+ +
ethers.getDefaultProvider( [ network , [ options ] ] ) Provider

Returns a new Provider, backed by multiple services, connected to network. Is no network is provided, homestead (i.e. mainnet) is used.

+ +

The options is an object, with the following properties:

+ +
PropertyDescription 
alchemyAlchemy API Token 
etherscanEtherscan API Token 
infuraINFURA Project ID or ProjectID and Project Secret 
quorumThe number of backends that must agree (default: 2 for mainnet, 1 for testnets) 
Option Properties 
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, 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.

+ +

Some services also provide additional paid features, whichare only available when specifying an API Key.

+ +

Provider Documentation

+

Provider

Explain what a provider is...

+ +

Accounts Methods

+
provider.getBalance( address [ , blockTag = latest ] ) Promise< BigNumber >

Returns the balance of address as of the blockTag block height.

+ +
provider.getCode( address [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the contract code of address as of the blockTag block height. If there is no contract currently deployed, the result is 0x.

+ +
provider.getStorageAt( addr , pos [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the Bytes32 value of the position pos at address addr, as of the blockTag.

+ +
provider.getTransactionCount( address [ , blockTag = latest ] ) Promise< number >

Returns the number of transactions address has ever sent, as of blockTag. This value is required to be the nonce for the next transaction from address sent to the network.

+ +
Account Examples
// Get the balance for an account... +provider.getBalance("ricmoo.firefly.eth"); +//! + +// Get the code for a contract... +provider.getCode("registrar.firefly.eth"); +//! + +// Get the storage value at position 0... +provider.getStorageAt("registrar.firefly.eth", 0) +//! + +// Get transaction count of an account... +provider.getTransactionCount("ricmoo.firefly.eth"); +//!

Blocks Methods

+
provider.getBlock( block ) Promise< Block >

Get the block from the network, where the result.transactions is a list of transaction hashes.

+ +
provider.getBlockWithTransactions( block ) Promise< BlockWithTransactions >

Get the block from the network, where the result.transactions is an Array of TransactionResponse objects.

+ +
Block Examples
provider.getBlock(100004) +//! + +provider.getBlockWithTransactions(100004) +//!

Ethereum Naming Service (ENS) Methods

The Ethereum Naming Service (ENS) allows a short and easy-to-remember ENS Name to be atached to any set of keys and values.

+ +

One of the most common uses for this is to use a simple name to refer to an Ethereum Address.

+ +

In the ethers API, nearly anywhere that accepts an address, an ENS name may be used instead, which can simplify code and make reading and debugging much simpler.

+ +

The provider offers some basic operations to help resolve and work with ENS names.

+ +
provider.lookupAddress( address ) Promise< string >

Performs a reverse lookup of the address in ENS using the Reverse Registrar. If the name does not exist, or the forward lookup does not match, null is returned.

+ +
provider.resolveName( name ) Promise< string< Address > >

Looks up the address of name. If the name is not owned, or does not have a Resolver configured, or the Resolver does not have an address configured, null is returned.

+ +
ENS Examples
// Reverse lookup of an ENS by address... +provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c"); +//! + +// Lookup an address of an ENS name... +provider.resolveName("ricmoo.firefly.eth"); +//!

Logs Methods

+
provider.getLogs( filter ) Promise< Array< Log > >

Returns the Array of Log matching the filter.

+ +

Keep in mind that many backends will discard old events, and that requests which are too broad may get dropped as they require too many resources to execute the query.

+ +

Network Status Methods

+
provider.getNetwork( ) Promise< Network >

Returns the Network this Provider is connected to.

+ +
provider.getBlockNumber( ) Promise< number >

Returns the block number (or height) of the most recently mined block.

+ +
provider.getGasPrice( ) Promise< BigNumber >

Returns a best guess of the Gas Price to use in a transaction.

+ +
Network Status Examples
// The network information +provider.getNetwork() +// <hide> +//! +network = utils.shallowCopy(_) +delete network._defaultProvider +network +// </hide> +//! + +// The current block number +provider.getBlockNumber() +//! + +// Get the current suggested gas price (in wei)... +gasPrice = await provider.getGasPrice() +//! async gasPrice + +// ...often this gas price is easier to understand or +// display to the user in gwei (giga-wei, or 1e9 wei) +utils.formatUnits(gasPrice, "gwei") +//!

Transactions Methods

+
provider.call( transaction [ , blockTag = latest ] ) Promise< string< DataHexString > >

Returns the result of executing the transaction, using call. A call does not require any ether, but cannot change any state. This is useful for calling gettings on Contracts.

+ +
provider.estimateGas( transaction ) Promise< BigNumber >

Returns an estimate of the amount of gas that would be required to submit transaction to the network.

+ +

An estimate may not be accurate since there could be another transaction on the network that was not accounted for, but after being mined affected relevant state.

+ +
provider.sendTransaction( transaction ) Promise< TransactionResponse >

Submits transaction to the network to be mined. The transaction must be signed, and be valid (i.e. the nonce is correct and the account has sufficient balance to pay for the transaction).

+ +
provider.waitForTransaction( hash [ , confirms = 1 [ , timeout ] ] ) Promise< TxReceipt >

Returns a Promise which will not resolve until transactionHash is mined.

+ +

Event Emitter Methods

Explain events here...

+ +
provider.on( eventName , listener ) this

Add a listener to be triggered for each eventName.

+ +
provider.once( eventName , listener ) this

Add a listener to be triggered for only the next eventName, at which time it be removed.

+ +
provider.emit( eventName , ...args ) boolean

Notify all listeners of eventName, passing args to each listener. This is generally only used internally.

+ +
provider.off( eventName [ , listener ] ) this

Remove a listener for eventName. If no listener is provided, all listeners for eventName are removed.

+ +
provider.removeAllListeners( [ eventName ] ) this

Remove all the listeners for eventName. If no eventName is provided, all events are removed.

+ +
provider.listenerCount( [ eventName ] ) number

Returns the number of listeners for eventName. If no eventName is provided, the total number of listeners is returned.

+ +
provider.listeners( eventName ) Array< Listener >

Returns the list of Listeners for eventName.

+ +

Events

Any of the following may be used as the eventName in the above methods.

+ +
Log Filter

A filter is an object, representing a contract log Filter, which has the optional properties address (the source contract) and topics (a topic-set to match).

+ +

If address is unspecified, the filter matches any contract address.

+ +

See events for more information on how to specify topic-sets.

+ +
Topic-Set Filter

The value of a Topic-Set Filter is a array of Topic-Sets.

+ +

This event is identical to a Log Filter with the address omitted (i.e. from any contract).

+ +
Transaction Filter

The value of a Transaction Filter is any transaction hash.

+ +

This event is emitted on every block that is part of a chain that includes the given mined transaction. It is much more common that the once method is used than the on method.

+ +

In addition to transaction and filter events, there are several named events.

+ +
Event NameArgumentsDescription 
"block"blockNumberemitted when a new block is mined 
"error"erroremitted on any error 
"pending"pendingTransactionemitted when a new transaction enters the memory pool; only certain providers offer this event and may require running your own node for reliable results 
"willPoll"pollIdemitted prior to a polling loop is about to begin; (very rarely used by most developers) 
"poll"pollId, blockNumberemitted during each poll cycle after `blockNumber` is updated (if changed) and before any other events (if any) are emitted during the poll loop; (very rarely used by most developers) 
"didPoll"pollIdemitted after all events from a polling loop are emitted; (very rarely used by most developers) 
"debug"provider dependenteach Provider may use this to emit useful debugging information and the format is up to the developer; (very rarely used by most developers) 
Named Provider Events 
Events Example
// <hide> +const txHash = utils.id("dummy-data"); +const myAddress = ethers.constants.HashZero; +const myOtherAddress = ethers.constants.HashZero; +// </hide> + +provider.on("block", (blockNumber) => { + // Emitted on every block change +}) + + +provider.once(txHash, (transaction) => { + // Emitted when the transaction has been mined +}) + + +// This filter could also be generated with the Contract or +// Interface API. If address is not specified, any address +// matches and if topics is not specified, any log matches +filter = { + address: "dai.tokens.ethers.eth", + topics: [ + utils.id("Transfer(address,address,uint256") + ] +} +provider.on(filter, (log, event) => { + // Emitted whenever a DAI token transfer occurs +}) + + +// Notice this is an array of topic-sets and is identical to +// using a filter with no address (i.e. match any address) +topicSets = [ + utils.id("Transfer(address,address,uint256"), + null, + [ + myAddress, + myOtherAddress + ] +] +provider.on(topicSets, (log, event) => { + // Emitted any token is sent TO either address +}) + + +provider.on("pending", (tx) => { + // Emitted when any new pending transaction is noticed +}); + + +provider.on("error", (tx) => { + // Emitted when any error occurs +}); + +// <hide> +// Make sure our documentation builds without waiting forever +provider.removeAllListeners() +// </hide>

Inspection Methods

+
Provider.isProvider( object ) boolean

Returns true if and only if object is a Provider.

+ +

JsonRpcProvider inherits Provider

The JSON-RPC API is a very popular method for interacting with Ethereum and is available in all major Ethereum node implementations (e.g. Geth and Parity) as well as many third-party web services (e.g. INFURA)

+ +
new ethers.providers.JsonRpcProvider( [ url [ , aNetworkish ] ] )

Connect to a JSON-RPC API located at url using the aNetworkish network. If url is not specified, the default (i.e. http://localhost:8545) is used and if no network is specified, it will be determined automatically by querying the node.

+ +
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.

+ +
jsonRpcProvider.getSigner( [ addressOrIndex ] ) JsonRpcSigner

Returns a JsonRpcSigner which is managed by this Ethereum node, at addressOrIndex. If no addressOrIndex is provided, the first account (account #0) is used.

+ +
jsonRpcProvider.getUncheckedSigner( [ addressOrIndex ] ) JsonRpcUncheckedSigner
+
jsonRpcProvider.listAccounts( ) Array< string >

Returns a list of all account addresses managed by this provider.

+ +
jsonRpcProvider.send( method , params ) Promise< any >

Allows sending raw messages to the provider.

+ +

This can be used for backend-specific calls, such as for debugging or specific account management.

+ +

JsonRpcSigner inherits Signer

A JsonRpcSigner is a simple Signer which is backed by a connected JsonRpcProvider.

+ +
signer.provider JsonRpcProvider

The provider this signer was established from.

+ +
signer.connectUnchecked( ) JsonRpcUncheckedSigner

Returns a new Signer object which does not perform addtional checks when sending a transaction. See getUncheckedSigner for more details.

+ +
signer.sendUncheckedTransaction( transaction ) Promise< string< DataHexString< 32 > > >

Sends the transaction and returns a Promise which resolves to the opacque transaction hash.

+ +
signer.unlock( password ) Promise< boolean >

Request the node unlock the account (if locked) using password.

+ +

JsonRpcUncheckedSigner inherits Signer

The JSON-RPC API only provides a transaction hash as the response when a transaction is sent, but the ethers Provider requires populating all details 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 the details using the returned transaction hash to populate the TransactionResponse object.

+ +

Some backends do not respond immediately and instead defer releasing the details of a transaction it was responsible for signing until it is mined.

+ +

The UncheckedSigner does not populate any additional information and will immediately return the result as a mock TransactionResponse-like object, with most of the properties set to null, but allows access to the transaction hash quickly, if that is all that is required.

+ +

Node-Specific Methods

Many methods are less common or specific to certain Ethereum Node implementations (e.g. Parity vs Geth. These include account and admin management, debugging, deeper block and transaction exploration and other services (such as Swarm and Whisper).

+ +

The jsonRpcProvider.send method can be used to access these.

+ +

+ +

API Providers

There are many services which offer a web API for accessing the Ethereum Blockchain. These Providers allow connecting to them, which simplifies development, since you do not need to run your own instance or cluster of Ethereum nodes.

+ +

However, this reliance on third-party services can reduce resiliance, security and increase the amount of required trust. To mitigate these issues, it is recommended you use a Default Provider.

+ +

EtherscanProvider inherits Provider

The EtherscanProvider is backed by a combination of the various Etherscan APIs.

+ +
new ethers.providers.EtherscanProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new EtherscanProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a [Network Object]provider-(network).

+ +

If no apiKey is provided, a shared API key will be used, which may result in reduced performance and throttled requests. It is highly recommended for production, you register with Etherscan for your own API key.

+ +
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.

+ +

It is highly recommended for production, you register with Etherscan for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
Etherscan Examples
// <hide> +const EtherscanProvider = ethers.providers.EtherscanProvider; +const apiKey = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new EtherscanProvider(); + +// Connect to rinkeby testnet (these are equivalent) +provider = new EtherscanProvider("rinkeby"); +provider = new EtherscanProvider(4); + +const network = ethers.providers.getNetwork("rinkeby"); +// <hide> +delete network._defaultProvider; +network +// </hide> +//! + +provider = new EtherscanProvider(network); + +// Connect to mainnet (homestead) with an API key +provider = new EtherscanProvider(null, apiKey); +provider = new EtherscanProvider("homestead", apiKey);
provider.getHistory( address ) Array< History >

@TODO... Explain

+ +

InfuraProvider inherits UrlJsonRpcProvider

The InfuraProvider is backed by the popular INFURA Ethereum service.

+ +
new ethers.providers.InfuraProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new InfuraProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a [Network Object]provider-(network).

+ +

The apiKey can be a string Project ID or an object with the properties projectId and projectSecret to specify a Project Secret which can be used on non-public sources (like on a server) to further secure your API access and quotas.

+ +
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.

+ +

It is highly recommended for production, you register with INFURA for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
INFURA Examples
// <hide> +const InfuraProvider = ethers.providers.InfuraProvider; +const projectId = "..."; +const projectSecret = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new InfuraProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new InfuraProvider("ropsten"); + +// Connect to mainnet with a Project ID (these are equivalent) +provider = new InfuraProvider(null, projectId); +provider = new InfuraProvider("homestead", projectId); + +// Connect to mainnet with a Project ID and Project Secret +provider = new InfuraProvider("homestead", { + projectId: projectId, + projectSecret: projectSecret +});

AlchemyProvider inherits UrlJsonRpcProvider

The AlchemyProvider is backed by Alchemy.

+ +
new ethers.providers.AlchemyProvider( [ network = "homestead" , [ apiKey ] ] )

Create a new AlchemyProvider connected to network with the optional apiKey.

+ +

The network may be specified as string for a common network name, a number for a common chain ID or a Network Object.

+ +
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.

+ +

It is highly recommended for production, you register with Alchemy for your own API key.

+ +
Supported Networks

  • Homestead (Mainnet)
  • Ropsten (proof-of-work testnet)
  • Rinkeby (proof-of-authority testnet)
  • Görli (clique testnet)
  • Kovan (proof-of-authority testnet)

+ +
Alchemy Examples
// <hide> +const AlchemyProvider = ethers.providers.AlchemyProvider; +const apiKey = "..."; +// </hide> + +// Connect to mainnet (homestead) +provider = new AlchemyProvider(); + +// Connect to the ropsten testnet +// (see EtherscanProvider above for other network examples) +provider = new AlchemyProvider("ropsten"); + +// Connect to mainnet with an API key (these are equivalent) +provider = new AlchemyProvider(null, apiKey); +provider = new AlchemyProvider("homestead", apiKey);

CloudflareProvider inherits UrlJsonRpcProvider

The CloudflareProvider is backed by the Cloudflare Ethereum Gateway.

+ +
new ethers.providers.CloudflareProvider( )

Create a new CloudflareProvider connected to mainnet (i.e. "homestead").

+ +
Supported Networks

  • Homestead (Mainnet)

+ +
Cloudflare Examples
// <hide> +const CloudflareProvider = ethers.providers.CloudflareProvider; +// </hide> + +// Connect to mainnet (homestead) +provider = new CloudflareProvider();

Other Providers

Others...

+ +

FallbackProvider inherits Provider

The FallbackProvider is the most advanced Provider available in ethers.

+ +

It uses a quorum and connects to multiple Providers as backends, each configured with a priority and a weight .

+ +

When a request is made, the request is dispatched to multiple backends, randomly choosen (higher prioirty backends are always selected first) and the results from each are compared against the others. Only once the quorum has been reached will that result be accepted and returned to the caller.

+ +

By default the quorum requires 50% (rounded up) of the backends to agree. The weight can be used to give a backend Provider more influence.

+ +
new ethers.providers.FallbackProvider( providers [ , quorum ] )

Creates a new instance of a FallbackProvider connected to providers. If quorum is not specified, half of the total sum of the provider weights is used.

+ +

The providers can be either an array of Provider or FallbackProviderConfig. If a Provider is provided, the defaults are a priority of 1 and a weight of 1.

+ +
provider.providerConfigs Array< FallbackProviderConfig >

The list of Provider Configurations that describe the backends.

+ +
provider.quorum number

The quorum the backend responses must agree upon before a result will be resolved. By default this is half the sum of the weights.

+ +

FallbackProviderConfig

+
fallbackProviderConfig.provider Provider

The provider for this configuration.

+ +
fallbackProviderConfig.priority number

The priority used for the provider. Higher priorities are favoured over lower priorities. If multiple providers share the same prioirty, they are choosen at random.

+ +
fallbackProviderConfig.stallTimeout number

The timeout (in ms) after which another Provider will be attempted. This does not affect the current Provider; if it returns a result it is counted as part of the quorum.

+ +

Lower values will result in more network traffic, but may reduce the response time of requests.

+ +
fallbackProviderConfig.weight number

The weight a response from this provider provides. This can be used if a given Provider is more trusted, for example.

+ +

IpcProvider inherits JsonRpcProvider

The IpcProvider allows the JSON-RPC API to be used over a local filename on the file system, exposed by Geth, Parity and other nodes.

+ +

This is only available in node.js (as it requires file system access, and may have additional complications due to file permissions. See any related notes on the documentation for the actual node implementation websites.

+ +
ipcProvider.path string

The path this Provider is connected to.

+ +

UrlJsonRpcProvider inherits JsonRpcProvider

This class is intended to be sub-classed and not used directly. It simplifies creating a Provider where a normal JsonRpcProvider would suffice, with a little extra effort needed to generate the JSON-RPC URL.

+ +
new ethers.providers.UrlJsonRpcProvider( [ network [ , apiKey ] ] )

Sub-classes do not need to override this. Instead they should override the static method getUrl and optionally getApiKey.

+ +
urlJsonRpcProvider.apiKey any

The value of the apiKey that was returned from InheritedClass.getApiKey.

+ +
InheritingClass.getApiKey( apiKey ) any

This function should examine the apiKey to ensure it is valid and return a (possible modified) value to use in getUrl.

+ +
InheritingClass.getUrl( network , apiKey ) string

The URL to use for the JsonRpcProvider instance.

+ +

Web3Provider inherits JsonRpcProvider

The Web3Provider is meant to ease moving from a web3.js based application to ethers by wraping an existing Web3-compatible (such as a Web3HttpProvider, Web3IpcProvider or Web3WsProvider) and exposing it as an ethers.js Provider which can then be used with the rest of the library.

+ +

This may also be used to wrap a standard [EIP-1193 Provider](link-eip-1193].

+ +
new ethers.providers.Web3Provider( externalProvider [ , network ] )

Create a new Web3Provider, which wraps an EIP-1193 Provider or Web3Provider-compatible Provider.

+ +
web3Provider.provider Web3CompatibleProvider

The provider used to create this instance.

+ +

ExternalProvider

An ExternalProvider can be either one for the above mentioned Web3 Providers (or otherwise compatible) or an EIP-1193 provider.

+ +

An ExternalProvider must offer one of the following signatures, and the first matching is used:

+ +
externalProvider.request( request ) Promise< any >

This follows the EIP-1193 API signature.

+ +

The request should be a standard JSON-RPC payload, which should at a minimum specify the method and params.

+ +

The result should be the actual result, which differs from the Web3.js response, which is a wrapped JSON-RPC response.

+ +
externalProvider.sendAsync( request , callback ) void

This follows the Web3.js Provider Signature.

+ +

The request should be a standard JSON-RPC payload, which should at a minimum specify the method and params.

+ +

The callback should use the error-first calling semantics, so (error, result) where the result is a JSON-RPC wrapped result.

+ +
externalProvider.send( request , callback ) void

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

+ +

Types

+

BlockTag

A BlockTag specifies a specific location in the Blockchain.

+ +

  • "latest" -- The most recently mined block
  • "earliest" -- Block #0
  • "pending" -- The block currently being prepared for mining; not all operations and backends support this BlockTag
  • number -- The block at this height
  • a negative number -- The block this many blocks ago

+ +

EventType

And EventType can be any of the following.

+ +

+ +

Network

A Network represents an Etherem network.

+ +
network.name string

The human-readable name of the network, such as homestead. If the network name is unknown, this will be "unknown".

+ +
network.chainId number

The Chain ID of the network.

+ +
network.ensAddress string< Address >

The address at which the ENS registry is deployed on this network.

+ +

Block

+
block.hash string< DataHexString< 32 > >

The hash of this block.

+ +
block.parentHash string< DataHexString< 32 > >

The hash of the previous block.

+ +
block.number number

The height (number) of this block.

+ +
block.timestamp number

The timestamp of this block.

+ +
block.nonce string< DataHexString >

The nonce used as part of the proof-of-work to mine this block.

+ +

This property is generally of little interest developers.

+ +
block.difficulty number

The difficulty target required to be met by the miner of the block.

+ +

This property is generally of little interest developers.

+ +
block.gasLimit BigNumber

The maximum amount of gas that this block was permitted to use. This is a value that can be voted up or voted down by miners and is used to automatically adjust the bandwidth requirements of the network.

+ +

This property is generally of little interest developers.

+ +
block.gasUsed BigNumber

The total amount of gas used by all transactions in this block.

+ +
block.miner string

The coinbase address of this block, which indicates the address the miner that mined this block would like the subsidy reward to go to.

+ +
block.extraData string

This is extra data a miner may choose to include when mining a block.

+ +

This property is generally of little interest developers.

+ +

Block (with transaction hashes)

Often only the hashes of the transactions included in a block are needed, so by default a block only contains this information, as it is substantially less data.

+ +
block.transactions Array< string< DataHexString< 32 > > >

A list of the transactions hashes for each transaction this block includes.

+ +

BlockWithTransactions inherits Block

If all transactions for a block are needed, this object instead includes the full details on each transaction.

+ +
block.transactions Array< TransactionResponse >

A list of the transactions this block includes.

+ +

Events and Logs

+

EventFilter

+
filter.address string< Address >

The address to filter by, or null to match any address.

+ +
filter.topics Array< string< DataHexString< 32 > > | Array< string< DataHexString< 32 > > > >

The topics to filter by, or null to match any topics. Each entry represents an AND condition that must match, or may be null to match anything. If a given entry is an Array, then that entry is treated as an OR for any value in the entry.

+ +

Filter inherits EventFilter

+
filter.fromBlock BlockTag

The starting block (inclusive) to search for logs matching the filter criteria.

+ +
filter.toBlock BlockTag

The end block (inclusive) to search for logs matching the filter criteria.

+ +

FilterByBlockHash inherits EventFilter

+
filter.blockHash string< DataHexString< 32 > >

The specific block (by its block hash) to search for logs matching the filter criteria.

+ +

Log

+
log.blockNumber number

The block height (number) of the block including the transaction of this log.

+ +
log.blockHash string< DataHexString< 32 > >

The block hash of the block including the transaction of this log.

+ +
log.removed boolean

During a re-org, if a transaction is orphaned, this will be set to true to indicate the Log entry has been removed; it will likely be emitted again in the near future when another block is mined with the transaction that triggered this log, but keep in mind the values may change.

+ +
log.transactionLogIndex number

The index of this log in the transaction.

+ +
log.address string< Address >

The address of the contract that generated this log.

+ +
log.data string< DataHexString >

The data included in this log.

+ +
log.topics Array< string< DataHexString< 32 > > >

The list of topics (indexed properties) for this log.

+ +
log.transactionHash string< DataHexString< 32 > >

The transaction hash of the transaction of this log.

+ +
log.transactionIndex number

The index of the transaction in the block of the transaction of this log.

+ +
log.logIndex number

The index of this log across all logs in the entire block.

+ +

Transactions

+

TransactionRequest

A transaction request describes a transaction that is to be sent to the network or otherwise processed.

+ +

All fields are optional and may be a promise which resolves to the required type.

+ +
transactionRequest.to string | Promise< string >

The address (or ENS name) this transaction it to.

+ +
transactionRequest.from string< Address > | Promise< string< Address > >

The address this transaction is from.

+ +
transactionRequest.nonce number | Promise< number >

The nonce for this transaction. This should be set to the number of transactions ever sent from this address.

+ +
transactionRequest.gasLimit BigNumber | Promise< BigNumber >

The maximum amount of gas this transaction is permitted to use.

+ +
transactionRequest.gasPrice BigNumber | Promise< BigNumber >

The price (in wei) per unit of gas this transaction will pay.

+ +
transactionRequest.data DataHexString | Promise< DataHexString >

The transaction data.

+ +
transactionRequest.value BigNumber | Promise< BigNumber >

The amount (in wei) this transaction is sending.

+ +
transactionRequest.chainId number | Promise< number >

The chain ID this transaction is authorized on, as specified by EIP-155.

+ +

If the chain ID is 0 will disable EIP-155 and the transaction will be valid on any network. This can be dangerous and care should be taken, since it allows transactions to be replayed on networks that were possibly not intended.

+ +

TransactionResponse inherits Transaction

A TransactionResponse includes all properties of a Transaction as well as several properties that are useful once it has been mined.

+ +
transaction.blockNumber number

The number ("height") of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.blockHash string< DataHexString< 32 > >

The hash of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.timestamp number

The timestamp of the block this transaction was mined in. If the block has not been mined, this is null.

+ +
transaction.confirmations number

The number of blocks that have been mined (including the initial block) since this transaction was mined.

+ +
transaction.raw string< DataHexString >

The serialized transaction.

+ +
transaction.wait( [ confirmations = 1 ] ) Promise< TransactionReceipt >

Wait for confirmations. If 0, and the transaction has not been mined, null is returned.

+ +

TransactionReceipt

+
receipt.to string< Address >

The address this transaction is to. This is null if the the transaction was an init transaction, used to deploy a contract.

+ +
receipt.from string< Address >

The address this transaction is from.

+ +
receipt.contractAddress string< Address >

If this transaction has a null to address, it is an init transaction used to deploy a contract, in which case this is the address created by that contract.

+ +

To compute a contract address, the getContractAddress utility function can also be used with a TransactionResponse object, which requires the transaction nonce and the address of the sender.

+ +
receipt.transactionIndex number

The index of this transaction in the list of transactions included in the block this transaction was mined in.

+ +
receipt.root string

The intermediate state root of a receipt.

+ +

Only transactions included in blocks before the Byzantium Hard Fork have this property, as it was replaced by the status property.

+ +

The property is generally of little use to developers. At the time it could be used to verify a state transition with a fraud-proof only considering the single transaction; without it the full block must be considered.

+ +
receipt.gasUsed BigNumber

The amount of gas actually used by this transaction.

+ +
receipt.logsBloom string< DataHexString >

A bloom-filter, which incldues all the addresses and topics included in any log in this transaction.

+ +
receipt.blockHash string< DataHexString< 32 > >

The block hash of the block that this transaction was included in.

+ +
receipt.transactionHash string< DataHexString< 32 > >

The transaction hash of this transaction.

+ +
receipt.logs Array< Log >

All the logs emitted by this transaction.

+ +
receipt.blockNumber number

The block height (number) of the block that this transaction was included in.

+ +
receipt.confirmations number

The number of blocks that have been mined since this transaction, including the actual block it was mined in.

+ +
receipt.cumulativeGasUsed BigNumber

For the block this transaction was included in, this is the sum of the gas used used by each transaction in the ordered list of transactions up to (and including) this transaction.

+ +

This is generally of little interest to developers.

+ +
receipt.byzantium boolean

This is true if the block is in a post-Byzantium Hard Fork block.

+ +
receipt.status boolean

The status of a transaction is 1 is successful or 0 if it was reverted. Only transactions included in blocks post-Byzantium Hard Fork have this property.

+ +

Utilities

These utilities are used extensively within the library, but are also quite useful for application developers.

+ +

Application Binary Interface

An Application Binary Interface (ABI) is a collection of Fragments which specify how to interact with various components of a Contract.

+ +

An Interface helps organize Fragments by type as well as provides the functionality required to encode, decode and work with each component.

+ +

Most developers will not require this low-level access to encoding and decoding the binary data on the network and will most likely use a Contract which provides a more convenient interface. Some framework, tool developers or developers using advanced techniques may find these classes and utilities useful.

+ +

Interface

The Interface Class abstracts the encoding and decoding required to interact with contracts on the Ethereum network.

+ +

Many of the standards organically evolved along side the Solidity language, which other languages have adopted to remain compatibile with existing deployed contracts.

+ +

The EVM itself does not understand what the ABI is. It is simply an agreed upon set of formats to encode various types of data which each contract can expect so they can interoperate with each other.

+ +

Creating Instances

+
new ethers.utils.Interface( abi )

Create a new Interface from a JSON string or object representing abi.

+ +

The abi may be a JSON string or the parsed Object (using JSON.parse) which is emitted by the Solidity compiler (or compatible languages).

+ +

The abi may also be a Human-Readable Abi, which is a format the Ethers created to simplify manually typing the ABI into the source and so that a Contract ABI can also be referenced easily within the same source file.

+ +

Properties

+
interface.fragments Array< Fragment >

All the Fragments in the interface.

+ +
interface.events Array< EventFragment >

All the Event Fragments in the interface.

+ +
interface.functions Array< FunctionFragment >

All the Function Fragments in the interface.

+ +
interface.deploy ConstructorFragment

The Constructor Fragments for the interface.

+ +

Formatting

+
interface.format( [ format ] ) string | Array< string >

Return the formatted Interface. If the format type is json a single string is returned, otherwise an Array of the human-readable strings is returned.

+ +

Fragment Access

+
interface.getFunction( fragment ) FunctionFragment

Returns the FunctionFragment for fragment (see Specifying Fragments).

+ +
interface.getEvent( fragment ) EventFragment

Returns the EventFragment for fragment (see Specifying Fragments).

+ +

Signature and Topic Hashes

+
interface.getSighash( fragment ) string< DataHexString< 4 > >

Return the sighash (or Function Selector) for fragment (see Specifying Fragments).

+ +
interface.getEventTopic( fragment ) string< DataHexString< 32 > >

Return the topic hash for fragment (see Specifying Fragments).

+ +

Encoding Data

+
interface.encodeDeploy( [ values ] ) string< DataHexString >

Return the encoded deployment data, which can be concatenated to the deployment bytecode of a contract to pass values into the contract constructor.

+ +
interface.encodeFilterTopics( fragment [ , values ] ) Array< topic | Array< topic > >

Returns the encoded topic filter, which can be passed to getLogs for fragment (see Specifying Fragments) for the given values.

+ +

Each topic is a 32 byte (64 nibble) DataHexString.

+ +
interface.encodeFunctionData( fragment [ , values ] ) string< DataHexString >

Returns the encoded data, which can be used as the data for a transaction for fragment (see Specifying Fragments) for the given values.

+ +
interface.encodeFunctionResult( fragment [ , values ] ) string< DataHexString >

Returns the encoded result, which would normally be the response from a call for fragment (see Specifying Fragments) for the given values.

+ +

Most developers will not need this method, but may be useful for authors of a mock blockchain.

+ +

Decoding Data

+
interface.decodeEventLog( fragment , data [ , topics ] ) Result

Returns the decoded event values from an event log for fragment (see Specifying Fragments) for the given data with the optional topics.

+ +

If topics is not specified, placeholders will be inserted into the result.

+ +
interface.decodeFunctionData( fragment , data ) Result

Returns the decoded values from transaction data for fragment (see Specifying Fragments) for the given data.

+ +

Most developers will not need this method, but may be useful for debugging or inspecting transactions.

+ +
interface.decodeFunctionResult( fragment , data ) Result

Returns the decoded values from the result of a call for fragment (see Specifying Fragments) for the given data.

+ +

Parsing

The functions are generally the most useful for most developers. They will automatically search the ABI for a matching Event or Function and decode the components as a fully specified description.

+ +
interface.parseLog( log ) LogDescription

Search the event that matches the log topic hash and parse the values the log represents.

+ +
interface.parseTransaction( transaction ) TransactionDescription

Search for the function that matches the transaction data sighash and parse the transaction properties.

+ +

Types

+

Result inherits Array<any>

A Result is an array, so each value can be accessed as a positional argument.

+ +

Additionally, if values are named, the identical object as its positional value can be accessed by its name.

+ +

The name length is however reserved as it is part of the Array, so any named value for this key is renamed to _length. If there is a name collision, only the first is available by its key.

+ +

LogDescription

+
logDescription.args Result

The values of the input parameters of the event.

+ +
logDescription.eventFragment EventFragment

The EventFragment which matches the topic in the Log.

+ +
logDescription.name string

The event name. (e.g. Transfer)

+ +
logDescription.signature string

The event signature. (e.g. Transfer(address,address,uint256))

+ +
logDescription.topic string

The topic hash.

+ +

TransactionDescription

+
transactionDescription.args Result

The decoded values from the transaction data which were passed as the input parameters.

+ +
transactionDescription.functionFragment FunctionFragment

The FunctionFragment which matches the sighash in the transaction data.

+ +
transactionDescription.name string

The name of the function. (e.g. transfer)

+ +
transactionDescription.sighash string

The sighash (or function selector) that matched the transaction data.

+ +
transactionDescription.signature string

The signature of the function. (e.g. transfer(address,uint256))

+ +
transactionDescription.value BigNumber

The value from the transaction.

+ +

Specifying Fragments

When specifying a fragment to any of the functions in an Interface, any of the following may be used:

+ +

  • The name of the event or function, if it is unique and non-ambiguous within the ABI (e.g. transfer)
  • The signature of the event or function. The signature is normalized, so, for example, uint and uint256 are equivalent (e.g. transfer(address, uint))
  • The sighash or topichash of the function. The sighash is often referred to the function selector in Solidity (e.g. 0xa9059cbb)
  • A Fragment

+ +

Fragments

Explain an ABI.

+ +

Formats

+

JSON String ABI (Solidity Output JSON)

The JSON ABI Format is the format that is output from the Solidity compiler.

+ +

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 also be passed into any function which accepts a JSON String ABI.

+ +

Humanb-Readable ABI

The Human-Readable ABI was

+ +

article

+ +

Output Formats

Each Fragment and ParamType may be output using its format method.

+ +
ethers.utils.FragmentTypes.full string

This is a full human-readable string, including all parameter names, any optional modifiers (e.g. indexed, public, etc) and white-space to aid in human readabiliy.

+ +
ethers.utils.FragmentTypes.minimal string

This is similar to full, except with no unnecessary whitespace or parameter names. This is useful for storing a minimal string which can still fully reconstruct the original Fragment using Fragment&thinsp;.&thinsp;from.

+ +
ethers.utils.FragmentTypes.json string

This returns a JavaScript Object which is safe to call JSON.stringify on to create a JSON string.

+ +
ethers.utils.FragmentTypes.sighash string

This is a minimal output format, which is used by Solidity when computing a signature hash or an event topic hash.

+ +
Note

The sighash format is insufficient to re-create the original Fragment, since it discards modifiers such as indexed, anonymous, stateMutability, etc.

+ +

Fragment

An ABI is a collection of Fragments, where each fragment specifies:

+ +

+ +

Properties

+
fragment.name string

This is the name of the Event or Function. This will be null for a ConstructorFragment.

+ +
fragment.type string

This is a string which indicates the type of the Fragment. This will be one of:

+ +

  • constructor
  • event
  • function

+ +
fragment.inputs Array< ParamType >

This is an array of of each ParamType for the input parameters to the Constructor, Event of Function.

+ +

Methods

+
ethers.utils.Fragment.from( objectOrString ) Fragment

Returns a

+ +
ethers.utils.Fragment.isFragment( object ) boolean

Tra lal al

+ +

ConstructorFragment inherits Fragment

+

Properties

+
fragment.gas BigNumber

This is the gas limit that should be used during deployment. It may be null.

+ +
fragment.payable boolean

This is whether the constructor may receive ether during deployment as an endowment (i.e. msg.value != 0).

+ +
fragment.stateMutability string

This is the state mutability of the constructor. It can be any of:

+ +

  • nonpayable
  • payable

+ +

Methods

+
ethers.utils.ConstructorFragment.from( objectOrString ) ConstructorFragment

Tra la la...

+ +
ethers.utils.ConstructorFragment.isConstructorFragment( object ) boolean

Tra lal al

+ +

EventFragment inherits Fragment

+

Properties

+
fragment.anonymous boolean

This is whether the event is anonymous. An anonymous Event does not inject its topic hash as topic0 when creating a log.

+ +

Methods

+
ethers.utils.EventFragment.from( objectOrString ) EventFragment

Tra la la...

+ +
ethers.utils.EventFragment.isEventFragment( object ) boolean

Tra lal al

+ +

FunctionFragment inherits ConstructorFragment

+

Properties

+
fragment.constant boolean

This is whether the function is constant (i.e. does not change state). This is true if the state mutability is pure or view.

+ +
fragment.stateMutability string

This is the state mutability of the constructor. It can be any of:

+ +

  • nonpayable
  • payable
  • pure
  • view

+ +
fragment.outputs Array< ParamType >

A list of the Function output parameters.

+ +

Method

+
ethers.utils.FunctionFragment.from( objectOrString ) FunctionFragment

Tra la la...

+ +
ethers.utils.FunctionFragment.isFunctionFragment( object ) boolean

Tra lal al

+ +

ParamType

The following examples will represent the Solidity parameter:

+ +

string foobar

+ +

Properties

+
paramType.name string

The local parameter name. This may be null for unnamed parameters. For example, the parameter definition string foobar would be foobar.

+ +
paramType.type string

The full type of the parameter, including tuple and array symbols. This may be null for unnamed parameters. For the above example, this would be foobar.

+ +
paramType.baseType string

The base type of the parameter. For primitive types (e.g. address, uint256, etc) this is equal to type. For arrays, it will be the string array and for a tuple, it will be the string tuple.

+ +
paramType.indexed boolean

Whether the parameter has been marked as indexed. This only applies to parameters which are part of an EventFragment.

+ +
paramType.arrayChildren ParamType

The type of children of the array. This is null for for any parameter wjhich is not an array.

+ +
paramType.arrayLength number

The length of the array, or -1 for dynamic-length arrays. This is null for parameters which is not arrays.

+ +
paramType.components Array< ParamType >

The components of a tuple. This is null for non-tuple parameters.

+ +

Methods

Tra la la...

+ +
paramType.format( [ outputType = sighash ] )

Tra la la...

+ +
ethers.utils.ParamType.from( objectOrString ) ParamType

Tra la la...

+ +
ethers.utils.ParamType.isParamType( object ) boolean

Tra la la...

+ +

Addresses

Explain addresses,formats and checksumming here.

+ +

Also see: constants.AddressZero

+ +

Address Formats

+

Address

An Address is a DataHexString of 20 bytes (40 nibbles), with optional mixed case.

+ +

If the case is mixed, it is a Checksum Address, which uses a specific pattern of uppercase and lowercase letters within a given address to reduce the risk of errors introduced from typing an address or cut and paste issues.

+ +

All functions that return an Address will return a Checksum Address.

+ +

ICAP Address

The ICAP Address Format was an early attempt to introduce a checksum into Ethereum addresses using the popular banking industry's IBAN format with the country code specified as XE.

+ +

Due to the way IBAN encodes address, only addresses that fit into 30 base-36 characters are actually compatible, so the format was adapted to support 31 base-36 characters which is large enough for a full Ethereum address, however the preferred method was to select a private key whose address has a 0 as the first byte, which allows the address to be formatted as a fully compatibly standard IBAN address with 30 base-36 characters.

+ +

In general this format is no longer widely supported anymore, however any function that accepts an address can receive an ICAP address, and it will be converted internally.

+ +

To convert an address into the ICAP format, see getIcapAddress.

+ +

Converting and Verifying

+
ethers.utils.getAddress( address ) string< Address >

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 value of address may be any supported address format.

+ +
ethers.utils.getIcapAddress( address ) string< IcapAddress >

Returns address as an ICAP address. Supports the same restrictions as utils.getAddress.

+ +
ethers.utils.isAddress( address ) boolean

Returns true if address is valid (in any supported format).

+ +

Derivation

+
ethers.utils.computeAddress( publicOrPrivateKey ) string< Address >

Returns the address for publicOrPrivateKey. A public key may be compressed or uncompressed, and a private key will be converted automatically to a public key for the derivation.

+ +
ethers.utils.recoverAddress( digest , signature ) string< Address >

Use ECDSA Public Key Recovery to determine the address that signed digest to which generated signature.

+ +

Contracts Addresses

+
ethers.utils.getContractAddress( transaction ) string< Address >

Returns the contract address that would result if transaction was used to deploy a contract.

+ +
ethers.utils.getCreate2Address( from , salt , initCodeHash ) string< Address >

Returns the contract address that would result from the given CREATE2 call.

+ +

BigNumber

Many operations in Ethereum operation on numbers which are outside the range of safe values 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.

+ +

Types

+

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:

+ +
string

A HexString or a decimal string, either of which may be negative.

+ +
BytesLike

A BytesLike Object, such as an Array or Uint8Array.

+ +
BigNumber

An existing BigNumber instance.

+ +
number

A number that is within the safe range for JavaScript numbers.

+ +
BigInt

A JavaScript BigInt object, on environments that support BigInt.

+ +

Creating Instances

The constructor of BigNumber cannot be called directly. Instead, Use the static BigNumber.from.

+ +
ethers.BigNumber.from( aBigNumberish ) BigNumber

Returns an instance of a BigNumber for aBigNumberish.

+ +

Examples:

+
// From a decimal string... +BigNumber.from("42") +//! + +// From a HexString... +BigNumber.from("0x2a") +//! + +// From a negative HexString... +BigNumber.from("-0x2a") +//! + +// From an Array (or Uint8Array)... +BigNumber.from([ 42 ]) +//! + +// From an existing BigNumber... +let one1 = constants.One; +let one2 = BigNumber.from(one1) + +one2 +//! + +// ...which returns the same instance +one1 === one2 +//! + +// From a (safe) number... +BigNumber.from(42) +//! + +// From a ES2015 BigInt... (only on platforms with BigInt support) +BigNumber.from(42n) +//! + +// Numbers outside the safe range fail: +BigNumber.from(Number.MAX_SAFE_INTEGER); +//! error

Methods

The BigNumber class is immutable, so no operations can change the value it represents.

+ +

Math Operations

+
BigNumber.add( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber + otherValue.

+ +
BigNumber.sub( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber - otherValue.

+ +
BigNumber.mul( otherValue ) BigNumber

Returns a BigNumber with the value of BigNumber × otherValue.

+ +
BigNumber.div( divisor ) BigNumber

Returns a BigNumber with the value of BigNumber ÷ divisor.

+ +
BigNumber.mod( divisor ) BigNumber

Returns a BigNumber with the value of the remainder of BigNumber ÷ divisor.

+ +
BigNumber.pow( exponent ) BigNumber

Returns a BigNumber with the value of BigNumber to the power of exponent.

+ +
BigNumber.abs( ) BigNumber

Returns a BigNumber with the absolute value of BigNumber.

+ +
BigNumber.mask( bitcount ) BigNumber

Returns a BigNumber with the value of BigNumber with bits beyond the bitcount least significant bits set to zero.

+ +

Two's Compliment

Two's Complicment 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.

+ +
BigNumber.fromTwos( bitwidth ) BigNumber

Returns a BigNumber with the value of BigNumber converted from twos-compliment with bitwidth.

+ +
BigNumber.toTwos( bitwidth ) BigNumber

Returns a BigNumber with the value of BigNumber converted to twos-compliment with bitwidth.

+ +

Comparison and Equivalence

+
BigNumber.eq( otherValue ) boolean

Returns true if and only if the value of BigNumber is equal to otherValue.

+ +
BigNumber.lt( otherValue ) boolean

Returns true if and only if the value of BigNumber < otherValue.

+ +
BigNumber.lte( otherValue ) boolean

Returns true if and only if the value of BigNumber otherValue.

+ +
BigNumber.gt( otherValue ) boolean

Returns true if and only if the value of BigNumber > otherValue.

+ +
BigNumber.gte( otherValue ) boolean

Returns true if and only if the value of BigNumber otherValue.

+ +
BigNumber.isZero( ) boolean

Returns true if and only if the value of BigNumber is zero.

+ +

Conversion

+
BigNumber.toNumber( ) number

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.

+ +
BigNumber.toString( ) string

Returns the value of BigNumber as a base-10 string.

+ +
BigNumber.toHexString( ) string< DataHexString >

Returns the value of BigNumber as a base-16, 0x-prefixed DataHexString.

+ +

Inspection

+
ethers.BigNumnber.isBigNumber( object ) boolean

Returns true if and only if the object is a BigNumber object.

+ +

Examples

+
let a = BigNumber.from(42); +let b = BigNumber.from("91"); + +a.mul(b); +//!

Notes

This section is a for a couple of questions that come up frequently.

+ +

Why can't I just use numbers?

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 1018 wei in a single ether.

+ +

JavaScript uses IEEE 754 double-precision binary floating point 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:

+ +
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER) +//!

To remedy this, all numbers (which can be large) are stored and manipulated as Big Numbers.

+ +

The functions parseEther( etherString ) and formatEther( wei ) 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.

+ +

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.

+ +

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 BN.js 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.

+ +

Why BN.js??

The reason why BN.js is used internally as the big number is because that is the library used by 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.

+ +

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.

+ +

Byte Manipulation

Tra la la...

+ +

Types

+

Bytes

A Bytes is any object which is an Array or TypedArray with each value in the valid byte range (i.e. between 0 and 255 inclusive), or is an Object with a length property where each indexed property is in the valid byte range.

+ +

BytesLike

A BytesLike can be either a Bytes or a DataHexString.

+ +

DataHexString

A DataHexstring is identical to a HexString except that it has an even number of nibbles, and therefore is a valid representation of binary data as a string.

+ +

HexString

A Hexstring is a string which has a 0x prefix followed by any number of nibbles (i.e. case-insensitive hexidecumal characters, 0-9 and a-f).

+ +

Signature

  • r and s --- The x co-ordinate of r and the s value of the signature
  • v --- The parity of the y co-ordinate of r
  • _vs --- The compact representation of the s and v
  • recoveryParam --- The normalized (i.e. 0 or 1) value of v

+ +

Raw Signature inherits string<DataHexString<65>>

A Raw Signature is a common Signature format where the r, s and v are concanenated into a 65 byte (130 nibble) DataHexString.

+ +

SignatureLike

A SignatureLike is similar to a Signature, except redundant properties may be omitted or it may be a Raw Signature.

+ +

For example, if _vs is specified, s and v may be omitted. Likewise, if recoveryParam is provided, v may be omitted (as in these cases the missing values can be computed).

+ +

Inspection

+
ethers.utils.isBytes( object ) boolean

Returns true if and only if object is a valid Bytes.

+ +
ethers.utils.isBytesLike( object ) boolean

Returns true if and only if object is a Bytes or DataHexString.

+ +
ethers.utils.isHexString( object , [ length ] ) boolean

Returns true if and only if object is a valid hex string. If length is specified and object is not a valid DataHexString of length bytes, an InvalidArgument error is thrown.

+ +

Converting between Arrays and Hexstrings

+
ethers.utils.arrayify( DataHexStringOrArrayish [ , options ] ) Uint8Array

Converts DataHexStringOrArrayish to a Uint8Array.

+ +
ethers.utils.hexlify( hexstringOrArrayish ) string< DataHexString >

Converts hexstringOrArrayish to a DataHexString.

+ +
ethers.utils.hexValue( aBigNumberish ) string< HexString >

Converts aBigNumberish to a HexString, with no unnecessary leading zeros.

+ +
Examples
// Convert a hexstring to a Uint8Array +arrayify("0x1234") +//! + +// Convert an Array to a hexstring +hexlify([1, 2, 3, 4]) +//! + +// Convert an Object to a hexstring +hexlify({ length: 2, "0": 1, "1": 2 }) +//! + +// Convert an Array to a hexstring +hexlify([ 1 ]) +//! + +// Convert a number to a stripped hex value +hexValue(1) +//! + +// Convert an Array to a stripped hex value +hexValue([ 1, 2 ]) +//!

Array Manipulation

+
ethers.utils.concat( arrayOfBytesLike ) Uint8Array

Concatenates all the BytesLike in arrayOfBytesLike into a single Uint8Array.

+ +
ethers.utils.stripZeros( aBytesLike ) Uint8Array

Returns a Uint8Array with all leading 0 bytes of aBtyesLike removed.

+ +
ethers.utils.zeroPad( aBytesLike , length ) Uint8Array

Retutns a Uint8Array of the data in aBytesLike with 0 bytes prepended to length bytes long.

+ +

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

+ +

Hexstring Manipulation

+
ethers.utils.hexConcat( arrayOfBytesLike ) string< DataHexString >

Concatenates all the BytesLike in arrayOfBytesLike into a single DataHexString

+ +
ethers.utils.hexDataLength( aBytesLike ) string< DataHexString >

Returns the length (in bytes) of aBytesLike.

+ +
ethers.utils.hexDataSlice( aBytesLike , offset [ , endOffset ] ) string< DataHexString >

Returns a DataHexString representation of a slice of aBytesLike, from offset (in bytes) to endOffset (in bytes). If endOffset is omitted, the length of aBytesLike is used.

+ +
ethers.utils.hexStripZeros( aBytesLike ) string< HexString >

Returns a HexString representation of aBytesLike with all leading zeros removed.

+ +
ethers.utils.hexZeroPad( aBytesLike , length ) string< DataHexString >

Returns a DataHexString representation of aBytesLike padded to length bytes.

+ +

If aBytesLike is already longer than length bytes long, an InvalidArgument error will be thrown.

+ +

Signature Conversion

+
ethers.utils.joinSignature( aSignatureLike ) string< RawSignature >

Return the raw-format of aSignaturelike, which is 65 bytes (130 nibbles) long, concatenating the r, s and (normalized) v of a Signature.

+ +
ethers.utils.splitSignature( aSignatureLikeOrBytesLike ) Signature

Return the full expanded-format of aSignaturelike or a raw-format DataHexString. Any missing properties will be computed.

+ +

Random Bytes

+
ethers.utils.randomBytes( length ) Uint8Array

Return a new Uint8Array of length random bytes.

+ +
ethers.utils.shuffled( array ) Array< any >

Return a copy of array shuffled using Fisher-Yates Shuffle.

+ +
Examples
utils.randomBytes(8) +//! + +const data = [ 1, 2, 3, 4, 5, 6, 7 ]; + +// Returns a new Array +utils.shuffled(data); +//! + +// The Original is unscathed... +data +//!

Constants

The ethers.contants Object contains commonly used values.

+ +

Bytes

+
ethers.constants.AddressZero string< Address >

The Address Zero, which is 20 bytes (40 nibbles) of zero.

+ +
ethers.constants.HashZero string< DataHexString< 32 > >

The Hash Zero, which is 32 bytes (64 nibbles) of zero.

+ +

Strings

+
ethers.constants.EtherSymbol string

The Ether symbol, Ξ.

+ +

BigNumber

+
ethers.constants.NegativeOne BigNumber

The BigNumber value representing "-1".

+ +
ethers.constants.Zero BigNumber

The BigNumber value representing "0".

+ +
ethers.constants.One BigNumber

The BigNumber value representing "1".

+ +
ethers.constants.Two BigNumber

The BigNumber value representing "2".

+ +
ethers.constants.WeiPerEther BigNumber

The BigNumber value representing "1000000000000000000", which is the number of Wei per Ether.

+ +
ethers.constants.MaxUint256 BigNumber

The BigNumber value representing the maximum uint256 value.

+ +

Display Logic and Input

When creating an Application, it is useful to convert between user-friendly strings (usually displaying ether) and the machine-readable values that contracts and maths depend on (usually in wei).

+ +

For example, a Wallet may specify the balance in ether, and gas prices in gwei for the User Interface, but when sending a transaction, both must be specified in wei.

+ +

The parseUnits will parse a string representing ether, such as 1.1 into a BigNumber in wei, and is useful when a user types in a value, such as sending 1.1 ether.

+ +

The formatUnits will format a BigNumberish into a string, which is useful when displaying a balance.

+ +

Units

+

Decimal Count

A Unit can be specified as an number, which indicates the number of decimal places that should be used.

+ +

Examples:

+ +

  • 1 ether in wei, has 18 decimal places (i.e. 1 ether represents 1018 wei)
  • 1 bitcoin in Satoshi, has 8 decimal places (i.e. 1 bitcoin represents 108 satoshi)

+ +

Named Units

There are also several common Named Units, in which case their name (as a string) may be used.

+ +
NameDecimals 
wei0 
kwei3 
mwei6 
gwei9 
szabo12 
finney15 
ether18 

Functions

+

Formatting

+
ethers.utils.commify( value ) string

Returns a string with value grouped by 3 digits, separated by ,.

+ +

Conversion

+
ethers.utils.formatUnits( value [ , unit = "ether" ] ) string

Returns a string representation of value formatted with unit digits (if it is a number) or to the unit specified (if a string).

+ +
ethers.utils.formatEther( value ) string

The equivalent to calling formatUnits(value, "ether").

+ +
ethers.utils.parseUnits( value [ , unit = "ether" ] ) BigNumber

Returns a BigNumber representation of value, parsed with unit digits (if it is a number) or from the unit specified (if a string).

+ +
ethers.utils.parseEther( value ) BigNumber

The equivalent to calling parseUnits(value, "ether").

+ +

Encoding Utilities

+

Base58

+
ethers.utils.base58.decode( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-58 encoding.

+ +
ethers.utils.base58.encode( aBytesLike ) string

Return aBytesLike encoded as a string using the base-58 encoding.

+ +

Base64

+
ethers.utils.base64.decode( textData ) Uin8Array

Return a typed Uint8Array representation of textData decoded using base-64 encoding.

+ +
ethers.utils.base64.encode( aBytesLike ) string

Return aBytesLike encoded as a string using the base-64 encoding.

+ +

Recursive-Length Prefix

The Recursive Length Prefix encoding is used throughout Ethereum to serialize nested structures of Arrays and data.

+ +
ethers.utils.RLP.encode( dataObject ) string< DataHexString >

Encode a structured Data Object into its RLP-encoded representation.

+ +

Each Data component may be an valid BytesLike.

+ +
ethers.utils.RLP.decode( aBytesLike ) DataObject

Decode an RLP-encoded aBytesLike into its structured Data Object.

+ +

All Data components will be returned as a DataHexString.

+ +

Data Object

A Data Object is a recursive structure which is used to serialize many internal structures in Ethereum. Each Data Object can either be:

+ +

  • Binary Data
  • An Array of Data Objects (i.e. this recursively includes Nesting)

+ +
Examples

  • "0x1234"
  • [ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]

+ +

FixedNumber

A FixedNumber is a fixed-width (in bits) number with an internal base-10 divisor, which allows it to represent a decimal fractional component.

+ +

Creating Instances

The FixedNumber constructor cannot be called directly. There are several static methods for creating a FixedNumber.

+ +
FixedNumber.from( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

+ +
FixedNumber.fromBytes( aBytesLike [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format.

+ +
FixedNumber.fromString( value [ , format = "fixed" ] ) FixedNumber

Returns an instance of a FixedNumber for value as a format. The value must not contain more decimals than the format permits.

+ +
FixedNumber.fromValue( value [ , decimals = 0 [ , format = "fixed" ] ] ) FixedNumber

Returns an instance of a FixedNumber for value with decimals as a format.

+ +

Properties

+
fixednumber.format

The FixedFormat of fixednumber.

+ +

Methods

+

Math Operations

+
fixednumber.addUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue + otherValue.

+ +
fixednumber.subUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue - otherValue.

+ +
fixednumber.mulUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue × otherValue.

+ +
fixednumber.divUnsafe( otherValue ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue ÷ otherValue.

+ +
fixednumber.round( [ decimals = 0 ] ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue rounded to decimals.

+ +

Conversion

+
fixednumber.toFormat( format ) FixedNumber

Returns a new FixedNumber with the value of fixedvalue with format.

+ +
fixednumber.toHexString( ) string

Returns a HexString representation of fixednumber.

+ +
fixednumber.toString( ) string

Returns a string representation of fixednumber.

+ +
fixednumber.toUnsafeFloat( ) float

Returns a floating-point JavaScript number value of fixednumber. Due to rounding in JavaScript numbers, the value is only approximate.

+ +

Inspection

+
FixedNumber.isFixedNumber( value ) boolean

Returns true if and only if value is a FixedNumber.

+ +

FixedFormat

A FixedFormat is a simple object which represents a decimal (base-10) Fixed-Point data representation. Usually using this class directly is uneccessary, as passing in a Format Strings directly into the FixedNumber will automatically create this.

+ +

Format Strings

A format string is composed of three components, including signed-ness, bit-width and number of decimals.

+ +

A signed format string begins with fixed, which an unsigned format string begins with ufixed, followed by the width (in bits) and the number of decimals.

+ +

The width must be conguent to 0 mod 8 (i.e. (width % 8) == 0) and no larger than 256 bits and the number of decimals must be no larger than 80.

+ +

For example:

+ +

  • fixed128x18 is signed, 128 bits wide and has 18 decimals; this is useful for most purposes
  • fixed32x0 is signed, 32 bits wide and has 0 decimals; this would be the same as a int32_t in C
  • ufixed32x0 is unsigned, 32 bits wide and has 0 decimals; this would be the same as a uint32_t in C
  • fixed is shorthand for fixed128x18
  • ufixed is shorthand for ufixed128x18

+ +

Creating Instances

+
FixedFormat.from( value = "fixed128x18" ) FixedFormat

Returns a new instance of a FixedFormat defined by value. Any valid Format Strings may be passed in as well as any object which has any of signed, width and decimals defined, including a FixedFormat object.

+ +

Properties

+
fixedFormat.signed boolean

The signed-ness of fixedFormat, true if negative values are supported.

+ +
fixedFormat.width number

The width (in bits) of fixedFormat.

+ +
fixedFormat.decimals number

The number of decimal points of fixedFormat.

+ +
fixedFormat.name string

The name of the fixedFormat, which can be used to recreate the format and is the string that the Solidity language uses to represent this format.

+ +
"fixed"

A shorthand for fixed128x80.

+ +

Hashing Algorithms

Explain what hash functions are?

+ +

Cryptographic Hash Functions

The Cryptographic Hash Functions are a specific family of hash functions.

+ +
ethers.utils.id( text ) string< DataHexString< 32 > >

The Ethereum Identity function computs the KECCAK256 hash of the text bytes.

+ +
ethers.utils.keccak256( aBytesLike ) string< DataHexString< 32 > >

Returns the KECCAK256 digest aBytesLike.

+ +
ethers.utils.ripemd160( aBytesLike ) string< DataHexString< 20 > >

Returns the RIPEMD-160 digest of aBytesLike.

+ +
ethers.utils.sha256( aBytesLike ) string< DataHexString< 32 > >

Returns the SHA2-256 digest of aBytesLike.

+ +
ethers.utils.sha512( aBytesLike ) string< DataHexString< 64 > >

Returns the SHA2-512 digest of aBytesLike.

+ +
KECCAK256
utils.keccak256([ 0x12, 0x34 ]) +//! + +utils.keccak256("0x") +//! + +utils.keccak256("0x1234") +//! + +// The value MUST be data, such as: +// - an Array of numbers +// - a data hex string (e.g. "0x1234") +// - a Uint8Array + +// Do NOT use UTF-8 strings that are not a DataHexstring +utils.keccak256("hello world") +//! error + +// If needed, convert strings to bytes first: +utils.keccak256(utils.toUtf8Bytes("hello world")) +//! + +// Or equivalently use the identity function: +utils.id("hello world") +//! + +// Keep in mind that the string "0x1234" represents TWO +// bytes (i.e. [ 0x12, 0x34 ]. If you wish to compute the +// hash of the 6 characters "0x1234", convert it to UTF-8 +// bytes first using utils.toUtf8Bytes. + +// Consider the following examples: + +// Hash of TWO (2) bytes: +utils.keccak256("0x1234") +//! + +// Hash of TWO (2) bytes: (same result) +utils.keccak256([ 0x12, 0x34 ]) +//! + +const bytes = utils.toUtf8Bytes("0x1234"); +// <hide> +bytes +// </hide> +//! + +// Hash of SIX (6) characters (different than above) +utils.keccak256(bytes) +//! + +// Hash of SIX (6) characters (same result) +utils.id("0x1234") +//!
RIPEMD160
utils.ripemd160("0x") +//! + +utils.ripemd160("0x1234") +//!
SHA-2
utils.sha256("0x") +//! + +utils.sha256("0x1234") +//! + +utils.sha512("0x") +//! + +utils.sha512("0x1234") +//!

HMAC

+
ethers.utils.computeHmac( algorithm , key , data ) string< DataHexString >

Returns the HMAC of data with key using the Algorithm algorithm.

+ +

HMAC Supported Algorithms

+
ethers.utils.SupportedAlgorithm.sha256 string

Use the SHA2-256 hash algorithm.

+ +
ethers.utils.SupportedAlgorithm.sha512 string

Use the SHA2-512 hash algorithm.

+ +
HMAC
const key = "0x0102"; +const data = "0x1234"; +utils.computeHmac("sha256", key, data) +//!

Hashing Helpers

+
ethers.utils.hashMessage( message ) string< DataHexString< 32 > >

Computes the EIP-191 personal message digest of message. Personal messages are converted to UTF-8 bytes and prefixed with \x19Ethereum Signed Message: and the length of message.

+ +
ethers.utils.namehash( name ) string< DataHexString< 32 > >

Returns the ENS Namehash of name.

+ +
Hashing Messages
// @TODO: include exampels of hashMessage; it can be complex. :)
Namehash
utils.namehash("") +//! + +utils.namehash("eth") +//! + +utils.namehash("ricmoo.firefly.eth") +//! + +utils.namehash("ricmoo.xyz") +//!

Solidity Hashing Algorithms

When using the Solidity abi.packEncoded(...) function, a non-standard tightly packed version of encoding is used. These functions implement the tightly packing algorithm.

+ +
ethers.utils.solidityPack( types , values ) string< DataHexString >

Returns the non-standard encoded values packed according to their respecive type in types.

+ +
ethers.utils.solidityKeccak256( types , values ) string< DataHexString< 32 > >

Returns the KECCAK256 of the non-standard encoded values packed according to their respective type in types.

+ +
ethers.utils.soliditySha256( types , values ) string< DataHexString< 32 > >

Returns the SHA2-256 of the non-standard encoded values packed according to their respective type in types.

+ +
Solidity Hashing
utils.solidityPack([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.solidityPack([ "string", "uint8" ], [ "Hello", 3 ]) +//! + +utils.solidityKeccak256([ "int16", "uint48" ], [ -1, 12 ]) +//! + +utils.soliditySha256([ "int16", "uint48" ], [ -1, 12 ]) +//!

HD Wallet

TODO: Explain BIP32 BIP-39 and whatnot here...

+ +

Types

+

Constants

+
ethers.utils.defaultPath "m/44'/60'/0'/0/0"

The default path for Ethereum in an HD Wallet

+ +

Mnemonic

+
mnemonic.phrase string

The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long and separated by the whitespace specified by the locale.

+ +
mnemonic.path string

The HD path for this mnemonic.

+ +
mnemonic.locale string

The language of the wordlist this mnemonic is using.

+ +

HDNode

+

Creating Instances

+
ethers.HDNode.fromMnemonic( phrase [ , password [ , wordlist ] ] ) HDNode

Return the HDNode for phrase with the optional password and wordlist.

+ +
ethers.HDNode.fromSeed( aBytesLike ) HDNode

Return the HDNode for the seed aBytesLike.

+ +
ethers.HDNode.fromExtendedKey( extendedKey ) HDNode

Return the HDNode for the extendedKey. If extendedKey was neutered, the HDNode will only be able to compute addresses and not private keys.

+ +

Properties

+
hdNode.privateKey string< DataHexString< 32 > >

The private key for this HDNode.

+ +
hdNode.publicKey string< DataHexString< 33 > >

The (compresses) public key for this HDNode.

+ +
hdNode.fingerprint string< DataHexString< 4 > >

The fingerprint is meant as an index to quickly match parent and children nodes together, however collisions may occur and software should verify matching nodes.

+ +

Most developers will not need to use this.

+ +
hdNode.parentFingerprint string< DataHexString< 4 > >

The fingerprint of the parent node. See fingerprint for more details.

+ +

Most developers will not need to use this.

+ +
hdNode.address string< Address >

The address of this HDNode.

+ +
hdNode.mnemonic Mnemonic

The mnemonic of this HDNode, if known.

+ +
hdNode.path string

The path of this HDNode, if known. If the mnemonic is also known, this will match mnemonic.path.

+ +
hdNode.chainCode string< DataHexString< 32 > >

The chain code is used as a non-secret private key which is then used with EC-multiply to provide the ability to derive addresses without the private key of child non-hardened nodes.

+ +

Most developers will not need to use this.

+ +
hdNode.index number

The index of this HDNode. This will match the last component of the path.

+ +

Most developers will not need to use this.

+ +
hdNode.depth number

The depth of this HDNode. This will match the number of components (less one, the m/) of the path.

+ +

Most developers will not need to use this.

+ +
hdNode.extendedKey string

A serialized string representation of this HDNode. Not all properties are included in the serialization, such as the mnemonic and path, so serializing and deserializing (using the fromExtendedKey class method) will result in reduced information.

+ +

Methods

+
hdNode.neuter( ) HDNode

Return a new instance of hdNode with its private key removed but all otehr properties preserved. This ensures that the key can not leak the private key of itself or any derived children, but may still be used to compute the addresses of itself and any non-hardened children.

+ +
hdNode.derivePath( path ) HDNode

Return a new HDNode which is the child of hdNode found by deriving path.

+ +

Other Functions

+
ethers.utils.mnemonicToSeed( phrase [ , password ] ) string< DataHexString< 64 > >

Convert a mnemonic phrase to a seed, according to BIP-39.

+ +
ethers.utils.mnemonicToEntropy( phrase [ , wordlist ] ) string< DataHexString >

Convert a mnemonic phrase to its entropy, according to BIP-39.

+ +
ethers.utils.isValidMnemonic( phrase [ , wordlist ] ) boolean

Returns true if phrase is a valid mnemonic phrase, by testing the checksum.

+ +

Logging

These are just a few simple logging utilities provided to simplify and standardize the error facilities across the Ethers library.

+ +

The Logger library has zero dependencies and is intentionally very light so it can be easily included in each library.

+ +

The Censorship functionality relies on one instance of the Ethers library being included. In large bundled packages or when npm link is used, this may not be the case. If you require this functionality, ensure that your bundling is configured properly.

+ +

Logger

+
new ethers.utils.Logger( version )

Create a new logger which will include version in all errors thrown.

+ +
Logger.globalLogger( ) Logger

Returns the singleton global logger.

+ +

Logging Output

+
logger.debug( ...args ) void

Log debugging information.

+ +
logger.info( ...args ) void

Log generic information.

+ +
logger.warn( ...args ) void

Log warnings.

+ +

Errors

These functions honor the current Censorship and help create a standard error model for detecting and processing errors within Ethers.

+ +
logger.makeError( message [ , code = UNKNOWN_ERROR [ , params ] ] ) Error

Create an Error object with message and an optional code and additional params set. This is useful when an error is needed to be rejected instead of thrown.

+ +
logger.throwError( message [ , code = UNKNOWN_ERROR [ , params ] ] ) never

Throw an Error with message and an optional code and additional params set.

+ +
logger.throwArgumentError( message , name , value ) never

Throw an INVALID_ARGUMENT Error with name and value.

+ +

Usage Validation

There can be used to ensure various properties and actions are safe.

+ +
logger.checkAbstract( target , kind ) void

Checks that target is not kind and performs the same operatons as checkNew. This is useful for ensuring abstract classes are not being instantiated.

+ +
logger.checkArgumentCount( count , expectedCound [ , message ) void

If count is not equal to expectedCount, throws a MISSING_ARGUMENT or UNEXPECTED_ARGUMENT error.

+ +
logger.checkNew( target , kind ) void

If target is not a valid this or target value, throw a MISSING_NEW error. This is useful to ensure callers of a Class are using new.

+ +
logger.checkNormalize( message ) void

Check that the environment has a correctly functioning String.normalize. If not, a UNSUPPORTED_OPERATION error is thrown.

+ +
logger.checkSafeUint53( value [ , message ] ) void

If value is not safe as a JavaScript number, throws a NUMERIC_FAULT error.

+ +

Censorship

+
Logger.setCensorship( censor [ , permanent = false ] ) void

Set error censorship, optionally preventing errors from being uncensored.

+ +

In production applications, this prevents any error from leaking information by masking the message and values of errors.

+ +

This can impact debugging, making it substantially more difficult.

+ +
Logger.setLogLevel( logLevel ) void

Set the log level, to suppress logging output below a particular log level.

+ +

Errors

Every error in Ethers has a code value, which is a string that will match one of the following error codes.

+ +

Generic Error Codes

+
Logger.errors.NOT_IMPLEMENTED

The operation is not implemented.

+ +
Logger.errors.SERVER_ERROR

There was an error communicating with a server.

+ +
Logger.errors.TIMEOUT

A timeout occurred.

+ +
Logger.errors.UNKNOWN_ERROR

A generic unknown error.

+ +
Logger.errors.UNSUPPORTED_OPERATION

The operation is not supported.

+ +

Safety Error Codes

+
Logger.errors.BUFFER_OVERRUN

The amount of data needed is more than the amount of data required, which would cause the data buffer to read past its end.

+ +
Logger.errors.NUMERIC_FAULT

There was an invalid operation done on numeric values.

+ +

Common cases of this occur when there is overflow, arithmetic underflow in fixed numeric types or division by zero.

+ +

Usage Error Codes

+
Logger.errors.INVALID_ARGUMENT

The type or value of an argument is invalid. This will generally also include the name and value of the argument. Any function which accepts sensitive data (such as a private key) will include the string [[REDACTED]] instead of the value passed in.

+ +
Logger.errors.MISSING_ARGUMENT

An expected parameter was not specified.

+ +
Logger.errors.MISSING_NEW

An object is a Class, but is now being called with new.

+ +
Logger.errors.UNEXPECTED_ARGUMENT

Too many parameters we passed into a function.

+ +

Ethereum Error Codes

+
Logger.errors.CALL_EXCEPTION

An attempt to call a blockchain contract (getter) resulted in a revert or other error.

+ +
Logger.errors.INSUFFICIENT_FUNDS

The account is attempting to make a transaction which costs more than is available.

+ +

A sending account must have enough ether to pay for the value, the gas limit (at the gas price) as well as the intrinsic cost of data. The intrinsic cost of data is 4 gas for each zero byte and 68 gas for each non-zero byte.

+ +
Logger.errors.NETWORK_ERROR

An Ethereum network validation error, such as an invalid chain ID.

+ +
Logger.errors.NONCE_EXPIRED

The nonce being specified has already been used in a mined transaction.

+ +
Logger.errors.REPLACEMENT_UNDERPRICED

When replacing a transaction, by using a nonce which has already been sent to the network, but which has not been mined yet the new transaction must specify a higher gas price.

+ +

This error occurs when the gas price is insufficient to bribe the transaction pool to prefer the new transaction over the old one. Generally, the new gas price should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the replacement should be 15.000000001 gwei.

+ +
Logger.errors.UNPREDICTABLE_GAS_LIMIT

When estimating the required amount of gas for a transaction, a node is queried for its best guess.

+ +

If a node is unable (or unwilling) to predict the cost, this error occurs.

+ +

The best remedy for this situation is to specify a gas limit in the transaction manually.

+ +

This error can also indicate that the transaction is expected to fail regardless, if for example an account with no tokens is attempting to send a token.

+ +

Log Levels

+
Logger.levels.DEBUG

Log all output, including debugging information.

+ +
Logger.levels.INFO

Only log output for infomational, warnings and errors.

+ +
Logger.levels.WARNING

Only log output for warnings and errors.

+ +
Logger.levels.ERROR

Only log output for errors.

+ +
Logger.levels.OFF

Do not output any logs.

+ +

Property Utilities

+
ethers.utils.checkProperties( ) void
+
ethers.utils.deepCopy( anObject ) any
+
ethers.utils.defineReadOnly( anObject , name , value ) void
+
ethers.utils.getStatic( aConstructor , key ) any
+
ethers.utils.resolveProperties( anObject ) Promise< any >
+
ethers.utils.shallowCopy( anObject ) any
+

Signing Key

+
new ethers.utils.SigningKey( privateKey )

Create a new SigningKey for privateKey.

+ +
signingKey.privateKey string< DataHexString< 32 > >

The private key for this Signing Key.

+ +
signingKey.publicKey string< DataHexString< 65 > >

The uncompressed public key for this Signing Key. It will always be 65 bytes (130 nibbles) and begine with 0x04.

+ +
signingKey.compressedPublicKey string< DataHexString< 33 > >

The compressed public key for this Signing Key. It will always be 33 bytes (66 nibbles) and begine with either 0x02 or 0x03.

+ +
signingKey.signDigest( digest ) Signature

Sign the digest and return the signature.

+ +
signingKey.computeSharedSecret( otherKey ) string< DataHexString< 32 > >

Compute the ECDH shared secret with otherKey. The otherKey may be either a public key or a private key, but generally will be a public key from another party.

+ +

It is best practice that each party computes the hash of this before using it as a symmetric key.

+ +
SigningKey.isSigningKey( anObject ) boolean

Returns true if anObject is a SigningKey.

+ +

Other Functions

+
ethers.utils.verifyMessage( message , signature ) string< Address >

Returns the address that signed message producing signature. The signature may have a non-canonical v (i.e. does not need to be 27 or 28), in which case it will be normalized to compute the `recoveryParam` which will then be used to compute the address; this allows systems which use the v to encode additional data (such as EIP-155) to be used since the v parameter is still completely non-ambiguous.

+ +
ethers.utils.recoverPublicKey( digest , signature ) string< DataHexString< 65 > >
+
ethers.utils.computePublicKey( key [ , compressed = false ] ) string< DataHexString >

Computes the public key of key, optionally compressing it. The key can be any form of public key (compressed or uncompressed) or a private key.

+ +

Strings

Tra la la

+ +

Bytes32String

A string in Solidity is length prefixed with its 256-bit (32 byte) length, which means that even short strings require 2 words (64 bytes) of storage.

+ +

In many cases, we deal with short strings, so instead of prefixing the string with its length, we can null-terminate it and fit it in a single word (32 bytes). Since we need only a single byte for the null termination, we can store strings up to 31 bytes long in a word.

+ +
Note

Strings that are 31 bytes long may contain fewer than 31 characters, since UTF-8 requires multiple bytes to encode international characters.

+ +
ethers.utils.parseBytes32String( aBytesLike ) string

Returns the decoded string represented by the Bytes32 encoded data.

+ +
ethers.utils.formatBytes32String( text ) string< DataHexString< 32 > >

Returns a bytes32 string representation of text. If the length of text exceeds 31 bytes, it will throw an error.

+ +

UTF-8 Strings

+
ethers.utils.toUtf8Bytes( text [ , form = current ] ) Uint8Array

Returns the UTF-8 bytes of text, optionally normalizing it using the UnicodeNormalizationForm form.

+ +
ethers.utils.toUtf8CodePoints( text [ , form = current ] ) Array< number >

Returns the Array of codepoints of text, optionally normalized using the UnicodeNormalizationForm form.

+ +
Note

This function correctly splits each user-perceived character into its codepoint, accounting for surrogate pairs. This should not be confused with string.split(""), which destroys surrogate pairs, spliting between each UTF-16 codeunit instead.

+ +
ethers.utils.toUtf8String( aBytesLike [ , onError = error ] ) string

Returns the string represented by the UTF-8 bytes of aBytesLike.

+ +

The onError is a Custom UTF-8 Error function and if not specified it defaults to the error function, which throws an error on any UTF-8 error.

+ +

UnicodeNormalizationForm

There are several commonly used forms when normalizing UTF-8 data, which allow strings to be compared or hashed in a stable way.

+ +
ethers.utils.UnicodeNormalizationForm.current

Maintain the current normalization form.

+ +
ethers.utils.UnicodeNormalizationForm.NFC

The Composed Normalization Form. This form uses single codepoints which represent the fully composed character.

+ +

For example, the é is a single codepoint, 0x00e9.

+ +
ethers.utils.UnicodeNormalizationForm.NFD

The Decomposed Normalization Form. This form uses multiple codepoints (when necessary) to compose a character.

+ +

For example, the é is made up of two codepoints, "0x0065" (which is the letter "e") and "0x0301" which is a special diacritic UTF-8 codepoint which indicates the previous character should have an acute accent.

+ +
ethers.utils.UnicodeNormalizationForm.NFKC

The Composed Normalization Form with Canonical Equivalence. The Canonical representation folds characters which have the same syntactic representation but different semantic meaning.

+ +

For example, the Roman Numeral I, which has a UTF-8 codepoint "0x2160", is folded into the capital letter I, "0x0049".

+ +
ethers.utils.UnicodeNormalizationForm.NFKD

The Decomposed Normalization Form with Canonical Equivalence. See NFKC for more an example.

+ +
Note

Only certain specified characters are folded in Canonical Equivalence, and thus it should not be considered a method to acheive any level of security from homoglyph attacks.

+ +

Custom UTF-8 Error Handling

When converting a string to its codepoints, there is the possibility of invalid byte sequences. Since certain situations may need specific ways to handle UTF-8 errors, a custom error handling function can be used, which has the signature:

+ +
errorFunction( reason , offset , bytes , output [ , badCodepoint ] ) number

The reason is one of the UTF-8 Error Reasons, offset is the index into bytes where the error was first encountered, output is the list of codepoints already processed (and may be modified) and in certain Error Reasons, the badCodepoint indicates the currently computed codepoint, but which would be rejected because its value is invalid.

+ +

This function should return the number of bytes to skip past keeping in mind the value at offset will already be consumed.

+ +

UTF-8 Error Reasons

+
ethers.utils.Utf8ErrorReason.BAD_PREFIX

A byte was encountered which is invalid to begin a UTF-8 byte sequence with.

+ +
ethers.utils.Utf8ErrorReason.MISSING_CONTINUE

A UTF-8 sequence was begun, but did not have enough continuation bytes for the sequence. For this error the ofset is the index at which a continuation byte was expected.

+ +
ethers.utils.Utf8ErrorReason.OUT_OF_RANGE

The computed codepoint is outside the range for valid UTF-8 codepoints (i.e. the codepoint is greater than 0x10ffff). This reason will pass the computed badCountpoint into the custom error function.

+ +
ethers.utils.Utf8ErrorReason.OVERLONG

Due to the way UTF-8 allows variable length byte sequences to be used, it is possible to have multiple representations of the same character, which means overlong sequences allow for a non-distinguished string to be formed, which can impact security as multiple strings that are otherwise equal can have different hashes.

+ +

Generally, overlong sequences are an attempt to circumvent some part of security, but in rare cases may be produced by lazy libraries or used to encode the null terminating character in a way that is safe to include in a char*.

+ +

This reason will pass the computed badCountpoint into the custom error function, which is actually a valid codepoint, just one that was arrived at through unsafe methods.

+ +
ethers.utils.Utf8ErrorReason.OVERRUN

The string does not have enough characters remaining for the length of this sequence.

+ +
ethers.utils.Utf8ErrorReason.UNEXPECTED_CONTINUE

This error is similar to BAD_PREFIX, since a continuation byte cannot begin a valid sequence, but many may wish to process this differently. However, most developers would want to trap this and perform the same operation as a BAD_PREFIX.

+ +
ethers.utils.Utf8ErrorReason.UTF16_SURROGATE

The computed codepoint represents a value reserved for UTF-16 surrogate pairs. This reason will pass the computed surrogate half badCountpoint into the custom error function.

+ +

Provided UTF-8 Error Handling Functions

There are already several functions available for the most common situations.

+ +
ethers.utils.Utf8ErrorFuncs.error

The will throw an error on any error with a UTF-8 sequence, including invalid prefix bytes, overlong sequences, UTF-16 surrogate pairs.

+ +
ethers.utils.Utf8ErrorFuncs.ignore

This will drop all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) from the final string as well as permit overlong sequences to be converted to their equivalent string.

+ +
ethers.utils.Utf8ErrorFuncs.replace

This will replace all invalid sequences (by consuming invalid prefix bytes and any following continuation bytes) with the UTF-8 Replacement Character, (i.e. U+FFFD).

+ +

Transactions

+

Types

+

UnsignedTransaction

An unsigned transaction represents a transaction that has not been signed and its values are flexible as long as they are not ambiguous.

+ +
unsignedTransaction.to string< Address >

The addres this transaction is to.

+ +
unsignedTransaction.nonce number

The nonce of this transaction.

+ +
unsignedTransaction.gasLimit BigNumberish

The gas limit for this transaction.

+ +
unsignedTransaction.gasPrice BigNumberish

The gas price for this transaction.

+ +
unsignedTransaction.data BytesLike

The data for this transaction.

+ +
unsignedTransaction.value BigNumberish

The value (in wei) for this transaction.

+ +
unsignedTransaction.chainId number

The chain ID for this transaction. If the chain ID is 0 or null, then EIP-155 is disabled and legacy signing is used, unless overridden in a signature.

+ +

Transaction

A generic object to represent a transaction.

+ +
transaction.hash string< DataHexString< 32 > >

The transaction hash, which can be used as an identifier for transaction. This is the keccak256 of the serialized RLP encoded representation of transaction.

+ +
unsignedTransaction.to string< Address >

The address transaction is to.

+ +
transaction.from string< Address >

The address transaction is from.

+ +
transaction.nonce number

The nonce for transaction. Each transaction sent to the network from an account includes this, which ensures the order and non-replayability of a transaction. This must be equal to the current number of transactions ever sent to the network by the from address.

+ +
transaction.gasLimit BigNumber

The gas limit for transaction. An account must have enough ether to cover the gas (at the specified gasPrice). Any unused gas is refunded at the end of the transaction, and if there is insufficient gas to complete execution, the effects of the trasaction are reverted, but the gas is fully consumed and an out-of-gas error occurs.

+ +
transaction.gasPrice BigNumber

The price (in wei) per unit of gas for transaction.

+ +
transaction.data BytesLike

The data for transaction. In a contract this is the call data.

+ +
transaction.value BigNumber

The value (in wei) for transaction.

+ +
transaction.chainId number

The chain ID for transaction. This is used as part of EIP-155 to prevent replay attacks on different networks.

+ +

For example, if a transaction was made on ropsten with an account also used on homestead, it would be possible for a transaction signed on ropsten to be executed on homestead, which is likely unintended.

+ +

There are situations where replay may be desired, however these are very rare and it is almost always recommended to specify the chain ID.

+ +
transaction.r string< DataHexString< 32 > >

The r portion of the elliptic curve signatures for transaction. This is more accurately, the x coordinate of the point r (from which the y can be computed, along with v).

+ +
transaction.s string< DataHexString< 32 > >

The s portion of the elliptic curve signatures for transaction.

+ +
transaction.v number

The v portion of the elliptic curve signatures for transaction. This is used to refine which of the two possible points a given x-coordinate can have, and in EIP-155 is additionally used to encode the chain ID into the serialized transaction.

+ +

Functions

+
ethers.utils.parseTransaction( aBytesLike ) Transaction

Parses the transaction properties from a serialized transactions.

+ +
ethers.utils.serializeTransaction( tx [ , signature ] ) string< DataHexString >

Computes the serialized transaction, optionally serialized with the a signature. If signature is not present, the unsigned serialized transaction is returned, which can be used to compute the hash necessary to sign.

+ +

This function uses EIP-155 if a chainId is provided, otherwise legacy serialization is used. It is highly recommended to always specify a chainId.

+ +

If signature includes a chain ID (explicitly or implicitly by using an EIP-155 v or _vs) it will be used to compute the chain ID.

+ +

If there is a mismatch between the chain ID of transaction and signature an error is thrown.

+ +

Web Utilities

+
ethers.utils.fetchJson( urlOrConnectionInfo [ , json [ , processFunc ] ] ) Promise< any >

Fetch and parse the JSON content from urlOrConnectionInfo, with the optiona body json and optionally processing the result with processFun before returning it.

+ +
ethers.utils.poll( pollFunc [ , options ] ) Promise< any >

Repeatedly call pollFunc using the PollOptions until it returns a value other than undefined.

+ +

ConnectionInfo

+
connection.url string

The URL to connect to.

+ +
connection.user string

The username to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

+ +
connection.password string

The password to use for Basic Authentication. The default is null (i.e. do not use basic authentication)

+ +
connection.allowInsecureAuthentication boolean

Allow Basic Authentication over non-secure HTTP. The default is false.

+ +
connection.timeout number

How long to wait before rejecting with a timeout error.

+ +
connection.headers {[key:string]:string}

Additional headers to include in the connection.

+ +

PollOptions

+
options.timeout number

The amount of time allowed to ellapse before triggering a timeout error.

+ +
options.floor number

The minimum time limit to allow for Exponential Backoff.

+ +

The default is 0s.

+ +
options.ceiling number

The maximum time limit to allow for Exponential Backoff.

+ +

The default is 10s.

+ +
options.interval number

The interval used during Exponential Backoff calculation.

+ +

The default is 250ms.

+ +
options.retryLimit number

The number of times to retry in the event of an error or undefined is returned.

+ +
options.onceBlock Provider

If this is specified, the polling will wait on new blocks from provider before attempting the pollFunc again.

+ +
options.oncePoll Provider

If this is specified, the polling will occur on each poll cycle of provider before attempting the pollFunc again.

+ +

Wordlists

+

Wordlist

+
wordlist.locale string

The locale for this wordlist.

+ +
wordlist.getWord( index ) string

Returns the word at index.

+ +
wordlist.getWordIndex( word ) number

Returns the index of word within the wordlist.

+ +
wordlist.split( mnemonic ) Array< string >

Returns the mnemonic split into each individual word, according to a locale's valid whitespace character set.

+ +
wordlist.join( words ) string

Returns the mnemonic by joining words together using the whitespace that is standard for the locale.

+ +
Wordlist.check( wordlists ) string< DataHexString< 32 > >

Checks that all words map both directions correctly and return the hash of the lists. Sub-classes should use this to validate the wordlist is correct against the official wordlist hash.

+ +
Wordlist.register( wordlist [ , name ] ) void

Register a wordlist with the list of wordlists, optionally overriding the registered name.

+ +

Languages

The official wordlists availalbe in at `ethers.wordlists`. In the browser, only the english langauge is available by default; to include the others (which increases the size of the library), see the dist files in the `ethers` package.

+ +
ethers.wordlists.cz Wordlist

The Czech Wordlist.

+ +
ethers.wordlists.en Wordlist

The English Wordlist.

+ +
ethers.wordlists.es Wordlist

The Spanish Wordlist.

+ +
ethers.wordlists.fr Wordlist

The French Wordlist.

+ +
ethers.wordlists.it Wordlist

The Italian Wordlist.

+ +
ethers.wordlists.ja Wordlist

The Japanese Wordlist.

+ +
ethers.wordlists.ko Wordlist

The Korean Wordlist.

+ +
ethers.wordlists.zh_cn Wordlist

The Simplified Chinese Wordlist.

+ +
ethers.wordlists.zh_tw Wordlist

The Traditional Chinese Wordlist.

+ +

Other Libraries

Now that ethers is more modular, it is possible to have additional ancillary packages, which are not part of the core but optionally add functionality only needed in certain situations.

+ +

Assembly

This module should still be considered fairly experimental.

+ +

Ethers ASM Dialect

This provides a quick, high-level overcview of the Ethers ASM Dialect for EVM, which is defined by the Ethers ASM Dialect Grammar

+ +

Once a program is compiled by a higher level langauge into ASM (assembly), or hand-coded directly in ASM, it needs to be assembled into bytecode.

+ +

The assembly process performs a very small set of operations and is intentionally simple and closely related to the underlying EVM bytecode.

+ +

Operations include embedding programs within programs (for example the deployment bootstrap has the runtime embedded in it) and computing the necessary offsets for jump operations.

+ +

The Command-Line Assembler can be used to assemble an Ethers ASM Dialect file or to disassemble bytecode into its human-readable (ish) opcodes and literals.

+ +

Opcodes

An Opcode may be provided in either a functional or instructional syntax. For Opcodes that require parameters, the functional syntax is recommended and the instructional syntax will raise a warning.

+ +

@TODO: Examples

+ +

Labels

A Label is a position in the program which can be jumped to. A JUMPDEST is automatically added to this point in the assembled output.

+ +

@TODO: Exmaples

+ +

Literals

A Literal puts data on the stack when executed using a PUSH operation.

+ +

A Literal can be provided using a DataHexString or a decimal byte value.

+ +

@TODO: exmples

+ +

Comments

To enter a comment in the Ethers ASM Dialect, any text following a semi-colon (i.e. ;) is ignored by the assembler.

+ +

Scopes

A common case in Ethereum is to have one program embedded in another.

+ +

The most common use of this is embedding a Contract runtime bytecode within a deployment bytecode, which can be used as init code.

+ +

When deploying a program to Ethereum, an init transaction is used. An init transaction has a null to address and contains bytecode in the data. This data bytecode is a program, that when executed returns some other bytecode as a result, this restul is the bytecode to be installed.

+ +

Therefore it is important that embedded code uses jumps relative to itself, not the entire program it is embedded in, which also means that a jump can only target its own scope, no parent or child scopes. This is enforced by the assembler.

+ +

A scope may access the offset of any child Data Segment or child Scopes (with respect to itself) and may access the length of any Data Segment or Scopes anywhere in the program.

+ +

Every program in the Ethers ASM Dialect has a top-leve scope named _.

+ +

Data Segment

A Data Segment allows arbitrary data to be embedded into a program, which can be useful for lookup tables or deploy-time constants.

+ +

An emtpty Data Segment can also be used when a labelled location is required, but without the JUMPDEST which a Labels adds.

+ +

@TODO: Example

+ +

Links

A Link allows access to a Scopes, Data Segment or Labels.

+ +

To access the byte offset of a labelled item, use $foobar.

+ +

For a Labels, the target must be directly reachable within this scope. For a Data Segment or a Scopes, it can be inside the same scope or any child scope.

+ +

For a Data Segment or a Labels, there is an additional type of Link, which provides the length of the data or bytecode respectively. A Length Link is accessed by #foobar and is pushed on the stack as a literal.

+ +

Stack Placeholders

@TODO: exampl

+ +

Evaluation and Excution

+

Utilities

+

Assembler

The assembler utilities allow parsing and assembling an Ethers ASM Dialect source file.

+ +
asm.parse( code ) Node

Parse an ethers-format assembly file and return the Abstract Syntax Tree.

+ +
asm.assemble( node ) string< DataHexString >

Performs assembly of the Abstract Syntax Tree node and return the resulting bytecode representation.

+ +

Disassembler

The Disassembler utilities make it easy to convert bytecode into an object which can easily be examined for program structure.

+ +
asm.disassemble( bytecode ) Bytecode

Returns an array of Operations given bytecode.

+ +
asm.formatBytecode( operations ) string

Create a formatted output of an array of Operation.

+ +

Bytecode inherits Array<Operation>

Each arary index represents an operation, collapsing multi-byte operations (i.e. PUSH) into a single operation.

+ +
bytecode.getOperation( offset ) Operation

Get the operation at a given offset into the bytecode. This ensures that the byte at offset is an operation and not data contained within a PUSH, in which case null it returned.

+ +

Operation

An Operation is a single command from a disassembled bytecode stream.

+ +
operation.opcode Opcode

The opcode for this Operation.

+ +
operation.offset number

The offset into the bytecode for this Operation.

+ +
operation.pushValue string< DataHexString >

If the opcode is a PUSH, this is the value of that push

+ +

Opcode

+
asm.Opcode.from( valueOrMnemonic ) Opcode

Create a new instnace of an Opcode for a given numeric value (e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1").

+ +

Properties

+
opcode.value number

The value (bytecode as a number) of this opcode.

+ +
opcode.mnemonic string

The mnemonic string of this opcode.

+ +
opcode.delta number

The number of items this opcode will consume from the stack.

+ +
opcode.alpha number

The number of items this opcode will push onto the stack.

+ +
opcode.doc string

A short description of what this opcode does.

+ +
opcode.isMemory( ) "read" | "write" | "full"

Returns true if the opcode accesses memory.

+ +
opcode.isStatic( ) boolean

Returns true if the opcode cannot change state.

+ +
opcode.isJump( ) boolean

Returns true if the opcode is a jumper operation.

+ +
opcode.isPush( ) number

Returns 0 if the opcode is not a PUSH*, or the number of bytes this opcode will push if it is.

+ +

Abstract Syntax Tree

Parsing a file using the Ethers ASM Dialect will generate an Abstract Syntax Tree. The root node will always be a ScopeNode whose name is _.

+ +

To parse a file into an Abstract Syntax tree, use the parse function.

+ +

Types

+

Location

+
offset number

The offset into the source code to the start of this node.

+ +
length number

The length of characters in the source code to the end of this node.

+ +
source string

The source code of this node.

+ +

Nodes

@TODO: Place a diagram here showing the hierarchy

+ +

Node

+
node.tag string

A unique tag for this node for the lifetime of the process.

+ +
node.location Location

The source code and location within the source code that this node represents.

+ +

ValueNode inherits Node

A ValueNode is a node which may manipulate the stack.

+ +

LiteralNode inherits ValueNode

+
literalNode.value string

The literal value of this node, which may be a DataHexString or string of a decimal number.

+ +
literalNode.verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

+ +

PopNode inherits ValueNode

A PopNode is used to store a place-holder for an implicit pop from the stack. It represents the code for an implicit place-holder (i.e. $$) or an explicit place-holder (e.g. $1), which indicates the expect stack position to consume.

+ +
literalNode.index number

The index this PopNode is representing. For an implicit place-holder this is 0.

+ +

LinkNode inherits ValueNode

A LinkNode represents a link to another Node's data, for example $foo or #bar.

+ +
linkNode.label string

Te name of the target node.

+ +
linkNode.type "offset" | "length"

Whether this node is for an offset or a length value of the target node.

+ +

OpcodeNode inherits ValueNode

+
opcodeNode.opcode Opcode

The opcode for this Node.

+ +
opcodeNode.operands Array< ValueNode >

A list of all operands passed into this Node.

+ +

EvaluationNode inherits ValueNode

An EvaluationNode is used to execute code and insert the results but does not generate any output assembly, using the {{! code here }} syntax.

+ +
literalNode.verbatim boolean

This is true in a DataNode context, since in that case the value should be taken verbatim and no PUSH operation shoud be added, otherwise false.

+ +
evaluationNode.script string

The code to evaluate and produce the result to use as a literal.

+ +

ExecutionNode inherits Node

An ExecutionNode is used to execute code but does not generate any output assembly, using the {{! code here }} syntax.

+ +
evaluationNode.script string

The code to execute. Any result is ignored.

+ +

LabelledNode inherits Node

A LabelledNode is used for any Node that has a name, and can therefore be targetted by a LinkNode.

+ +
labelledNode.name string

The name of this node.

+ +

LabelNode inherits LabelledNode

A LabelNode is used as a place to JUMP to by referencing it name, using @myLabel:. A JUMPDEST is automatically inserted at the bytecode offset.

+ +

DataNode inherits LabelledNode

A DataNode allows for data to be inserted directly into the output assembly, using @myData[ ... ]. The data is padded if needed to ensure values that would otherwise be regarded as a PUSH value does not impact anything past the data.

+ +
dataNode.data Array< ValueNode >

The child nodes, which each represent a verbatim piece of data in insert.

+ +

ScopeNode inherits LabelledNode

A ScopeNode allows a new frame of reference that all LinkNode's will use when resolving offset locations, using @myScope{ ... }.

+ +
scopeNode.statements Array< Node >

The list of child nodes for this scope.

+ +

Hardware Wallets

+

LedgerSigner inherits Signer

The Ledger Hardware Wallets are a fairly popular brand.

+ +
Importing in ES6 or TypeScript
import { LedgerSigner } from "@ethersproject/hardware-wallets";

API

+
new LedgerSigner( [ provider [ , type [ , path ] ] ] ) LedgerSigner

Connects to a Ledger Hardware Wallet. The type if left unspecified is determined by the environment; in node the default is "hid" and in the browser "u2f" is the default. The default Ethereum path is used if path is left unspecified.

+ +

Experimental

The Experimental package is used for features that are not ready to be included in the base library. The API should not be considered stable and does not follow semver versioning, so applications requiring it should specify the exact version needed.

+ +

BrainWallet inherits Wallet

Ethers removed support for BrainWallets in v4, since they are unsafe and many can be easily guessed, allowing attackers to steal the funds. This class is offered to ensure older systems which used brain wallets can still recover their funds and assets.

+ +
BrainWallet.generate( username , password [ , progressCallback ] ) BrainWallet

Generates a brain wallet, with a slightly improved experience, in which the generated wallet has a mnemonic.

+ +
BrainWallet.generateLegacy( username , password [ , progressCallback ] ) BrainWallet

Generate a brain wallet which is compatibile with the ethers v3 and earlier.

+ +

EIP1193Bridge inherits EventEmitter

The EIP1193Bridge allows a normal Ethers Signer and Provider to be exposed in as a standard EIP-1193 Provider, which may be useful when interacting with other libraries.

+ +

NonceManager inherits Signer

The NonceManager is designed to manage the nonce for a Signer, automatically increasing it as it sends transactions.

+ +

Currently the NonceManager does not handle re-broadcast. If you attempt to send a lot of transactions to the network on a node that does not control that account, the transaction pool may drop your transactions.

+ +

In the future, it'd be nice if the NonceManager remembered transactions and watched for them on the network, rebroadcasting transactions that appear to have been dropped.

+ +

Another future feature will be some sort of failure mode. For example, often a transaction is dependent on another transaction being mined first.

+ +
new NonceManager( signer )

Create a new NonceManager.

+ +
nonceManager.signer Signer

The signer whose nonce is being managed.

+ +
nonceManager.provider Provider

The provider associated with the signer.

+ +
nonceManager.setTransactionCount( count ) void

Set the current transaction count (nonce) for the signer.

+ +

This may be useful it interacting with the signer outside of using this class.

+ +
nonceManager.increaseTransactionCount( [ count = 1 ] ) void

Bump the current transaction count (nonce) by count.

+ +

This may be useful it interacting with the signer outside of using this class.

+ +

Command Line Interfaces

+

Sandbox Utility

The sandbox utility provides a simple way to use the most common ethers utilities required during learning, debuging and managing interactions with the Ethereum network.

+ +

If no command is given, it will enter a REPL interface with many of the ethers utilities already exposed.

+ +

Help

+
Usage: + ethers [ COMMAND ] [ ARGS ] [ OPTIONS ] + +COMMANDS (default: sandbox) + sandbox Run a REPL VM environment with ethers + init FILENAME Create a new JSON wallet + [ --force ] Overwrite any existing files + fund TARGET Fund TARGET with testnet ether + info [ TARGET ... ] Dump info for accounts, addresses and ENS names + send TARGET ETHER Send ETHER ether to TARGET form accounts[0] + [ --allow-zero ] Allow sending to the address zero + [ --data DATA ] Include data in the transaction + sweep TARGET Send all ether from accounts[0] to TARGET + sign-message MESSAGE Sign a MESSAGE with accounts[0] + [ --hex ] The message content is hex encoded + eval CODE Run CODE in a VM with ethers + run FILENAME Run FILENAME in a VM with ethers + wait HASH Wait for a transaction HASH to be mined + wrap-ether VALUE Deposit VALUE into Wrapped Ether (WETH) + unwrap-ether VALUE Withdraw VALUE from Wrapped Ether (WETH) + send-token TOKEN ADDRESS VALUE + Send VALUE tokens (at TOKEN) to ADDRESS + compile FILENAME Compiles a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --warnings ] Error on any warning + deploy FILENAME Compile and deploy a Solidity contract + [ --no-optimize ] Do not optimize the compiled output + [ --contract NAME ] Specify the contract to deploy + +ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password + +PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) + +TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending + +OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

+
Creating New Wallets
/home/ethers> ethers init wallet.json +Creating a new JSON Wallet - wallet.json +Keep this password and file SAFE!! If lost or forgotten +it CANNOT be recovered, by ANYone, EVER. +Choose a password: ****** +Confirm password: ****** +Encrypting... 100% +New account address: 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Saved: wallet.json + + +# If you are planning to try out the Ropsten testnet... +/home/ethers> ethers --network ropsten fund 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003 +Transaction Hash: 0x8dc55b8f8dc8076acded97f9e3ed7d6162460c0221e2769806006b6d7d1156e0
Sending Ether and Tokens
# Sending ether +/home/ricmoo> ethers --account wallet.json send ricmoo.firefly.eth 0.123 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.123 ether + Nonce: 96 + Data: 0x + Gas Limit: 21000 + Gas Price: 1.2 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xc4adf8b379033d7ab679d199aa35e6ceee9a802ca5ab0656af067e911c4a589a + + +# Sending a token (SAI) +# NOTE: the contract address could be used instead but +# popular token contract addresses are also managed +# by ethers +/home/ricmoo> ethers --account wallet.json send-token sai.tokens.ethers.eth ricmoo.firefly.eth 1.0 +Sending Tokens: + To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72 + Token Contract: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + Value: 1.0 +Password (wallet.json): ****** +Decrypting... 100% +Transaction: + To: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 + From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C + Value: 0.0 ether + Nonce: 95 + Data: 0xa9059cbb0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000 + Gas Limit: 37538 + Gas Price: 1.0 gwei + Chain ID: 1 + Network: homestead +Send Transaction? (y/N/a) y +Response: + Hash: 0xd609ecb7e3b5e8d36fd781dffceede3975ece6774b6322ea56cf1e4d0a17e3a1
Signing Messages
/home/ethers> ethers --account wallet.json sign-message 'Hello World' +Password (wallet.json): ****** +Decrypting... 100% +Message: + Message: "Hello World" + Message (hex): 0x48656c6c6f20576f726c64 +Sign Message? (y/N/a) y +Signature + Flat: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a161b + r: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb + s: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + vs: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16 + v: 27 + recid: 0

Scripting

The eval command can be used to execute simple one-line scripts from the command line to be passed into other commands or stored in script environment variables.

+ +
Get the formatted balance of an account
/home/ethers> ethers --network ropsten \ + --account wallet.json \ + eval \ + 'accounts[0].getBalance().then(b => formatEther(b))' +3.141592653589793238
Get the current block number
/home/ethers> ethers --network rinkeby \ + eval "provider.getBlockNumber()" +5761009
Convert a Solidity signature to JSON
/home/ethers> ethers eval 'utils.Fragment.from( + "function balanceOf(address) view returns (uint)" + ).format("json")' | json_pp +{ + "inputs" : [ + { + "type" : "address", + "name" : "owner" + } + ], + "type" : "function", + "payble" : false, + "stateMutability" : "view", + "ouputs" : [ + { + "type" : "uint256" + } + ], + "name" : "balanceOf", + "constant" : true +}
Compute a topic hash
/home/ricmoo> ethers eval 'id("Transfer(address,address,uint256")' +0xd99659a21de82e379975ce8df556f939a4ccb95e92144f38bb0dd35730ffcdd5
Create a random mnemonic
/home/ricmoo> ethers eval 'Wallet.createRandom().mnemonic' +useful pond inch knock ritual matrix giggle attend dilemma convince coach amazing

Using Mnemonics (with a password)

All mnemonic phrases have a password, but the default is to use the empty string (i.e. "") as the password. If you have a password on your mnemonic, the --mnemonic-password will prompt for the password to use to decrypt the account.

+ +
/home/ricmoo> ethers --account mnemonic.txt --mnemonic-password +Password (mnemonic): ****** +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() +<Promise id=0 resolved> +'0x6d3F723EC1B73141AA4aC248c3ab34A5a1DAD776' +homestead>

Using Mnemonics (with experimental memory-hard passwords)

The --xxx-mnemonic-password is similar to the --mnemonic-password options, which uses a password to decrypt the account for a mnemonic, however it passes the password through the scrypt password-based key derivation function first, which is intentionally slow and makes a brute-force attack far more difficult.

+ +
/home/ricmoo> ethers --account mnemonic.txt --xxx-mnemonic-password +Password (mnemonic; experimental - hard): ****** +Decrypting... 100% +network: homestead (chainId: 1) +homestead> accounts[0].getAddress() +<Promise id=0 resolved> +'0x56FC8792cC17971C19bEC4Ced978beEA44711EeD' +homestead>
Note

This is still an experimental feature (hence the xxx).

+ +

Assembler

The assembler Command-Line utility allows you to assemble the Ethers ASM Dialect into deployable EVM bytecode and disassemle EVM bytecode into human-readable mnemonics.

+ +

Help

+
Usage: + ethers-asm [ FILENAME ] [ OPTIONS ] + +OPTIONS + --define KEY=VALUE provide assembler defines + --disassemble Disassemble input bytecode + --ignore-warnings Ignore warnings + --pic generate position independent code + --target LABEL output LABEL bytecode (default: _) + +OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit

Example Input Files

+
SimpleStore.asm
; SimpleStore (uint) + +; Set the inital value of 42 +sstore(0, 42) + +; Init code to deploy myContract +codecopy(0, $myContract, #myContract) +return(0, #myContract) + +@myContract { + ; Non-payable + jumpi($error, callvalue) + + ; Get the Sighash + shr({{= 256 - 32 }}, calldataload(0)) + + ; getValue() + dup1 + {{= sighash("getValue()") }} + jumpi($getValue, eq) + + ; setValue(uint) + dup1 + {{= sighash("setValue(uint)") }} + jumpi($setValue, eq) + + ; No matching signature + @error: + revert(0, 0) + + @getValue: + mstore(0, sload(0)) + return (0, 32) + + @setValue: + ; Make sure we have exactly a uint + jumpi($error, iszero(eq(calldatasize, 36))) + + ; Store the value + sstore(0, calldataload(4)) + return (0, 0) + + ; There is no *need* for the PUSH32, it just makes + ; decompiled code look nicer + @checksum[ + {{= (defines.checksum ? concat([ + Opcode.from("PUSH32"), + id(myContract.source) + ]): "0x") + }} + ] +}
SimpleStore.bin
0x602a6000556044601160003960446000f334601e5760003560e01c8063209652 +0x5514602457806355241077146030575b60006000fd5b60005460005260206000 +0xf35b6024361415601e5760043560005560006000f3
Note: Bytecode File Syntax

A bin file may be made up of multiple blocks of bytecode, each may optionally begin with a 0x prefix, all of which must be of even length (since bytes are required, with 2 nibbles per byte)

+ +

All whitespace is ignored.

+ +

Assembler Examples

The assembler converts an Ethers ASM Dialect into bytecode by running multiple passes of an assemble stage, each pass more closely approximating the final result.

+ +

This allows small portions of the bytecode to be massaged and tweaked until the bytecode stablizes. This allows for more compact jump destinations and for code to be include more advanced meta-programming techniques.

+ +
/home/ethers> ethers-asm SimpleStore.asm +0x602a6000556044601160003960446000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f3 + +# Piping in ASM source code +/home/ethers> cat SimpleStore.asm | ethers-asm +# Same as above + +# Setting a define which the ASM file checks and adds a checksum +/home/ethers> ethers-asm --define checksum SimpleStore.asm +0x602a6000556065601160003960656000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f37f10358310d664c9aeb4bf4ce7a10a6a03176bd23194c8ccbd3160a6dac90774d6

Options

+
--define KEY=VALUE or --define FLAG

This allows key/value pairs (where the value is a string) and flags (which the value is true) to be passed along to the assembler, which can be accessed in Scripting Blocks, such as {{= defined.someKey }}.

+ +
--ignore-warnings

By default any warning will be treated like an error. This enabled by-passing warnings.

+ +
--pic

When a program is assembled, the labels are usually given as an absolute byte position, which can be jumped to for loops and control flow. This means that a program must be installed at a specific location.

+ +

Byt specifying the Position Independent Code flag, code will be generated in a way such that all offsets are relative, allowing the program to be moved without any impact to its logic.

+ +

This does incur an additional gsas cost of 8 gas per offset access though.

+ +
--target LABEL

All programs have a root scope named _ which is by default assembled. This option allows another labelled target (either a Scopes or a Data Segment to be assembled instead. The entire program is still assembled per usual, so this only impacts which part of the program is output.

+ +

Disassembler Examples

A disassembled program shows offsets and mnemonics for the given bytecode. This format may change in the future to be more human-readable.

+ +
/home/ethers> ethers-asm --disassemble SimpleStore.bin +0000 : 0x2a ; #1 +0002 : 0x00 ; #1 +0004 : SSTORE +0005 : 0x44 ; #1 +0007 : 0x11 ; #1 +0009 : 0x00 ; #1 +000b : CODECOPY +000c : 0x44 ; #1 +000e : 0x00 ; #1 +0010 : RETURN +0011 : CALLVALUE +0012 : 0x1e ; #1 +0014 : JUMPI +0015 : 0x00 ; #1 +0017 : CALLDATALOAD +0018 : 0xe0 ; #1 +001a : SHR +001b : DUP1 +001c : 0x20965255 ; #4 +0021 : EQ +0022 : 0x24 ; #1 +0024 : JUMPI +0025 : DUP1 +0026 : 0x55241077 ; #4 +002b : EQ +002c : 0x30 ; #1 +002e : JUMPI +002f*: JUMPDEST +0030 : 0x00 ; #1 +0032 : 0x00 ; #1 +0034 : REVERT +0035*: JUMPDEST +0036 : 0x00 ; #1 +0038 : SLOAD +0039 : 0x00 ; #1 +003b : MSTORE +003c : 0x20 ; #1 +003e : 0x00 ; #1 +0040 : RETURN +0041*: JUMPDEST +0042 : 0x24 ; #1 +0044 : CALLDATASIZE +0045 : EQ +0046 : ISZERO +0047 : 0x1e ; #1 +0049 : JUMPI +004a : 0x04 ; #1 +004c : CALLDATALOAD +004d : 0x00 ; #1 +004f : SSTORE +0050 : 0x00 ; #1 +0052 : 0x00 ; #1 +0054 : RETURN + +/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble +# Same as above

Ethereum Naming Service

+

Help

+
Usage: + ethers-ens COMMAND [ ARGS ] [ OPTIONS ] + +COMMANDS + lookup [ NAME | ADDRESS [ ... ] ] + Lookup a name or address + commit NAME Submit a pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + reveal NAME Reveal a previous pre-commitment + [ --duration DAYS ] Register duration (default: 365 days) + [ --salt SALT ] SALT to blind the commit with + [ --secret SECRET ] Use id(SECRET) as the salt + [ --owner OWNER ] The target owner (default: current account) + set-controller NAME Set the controller (default: current account) + [ --address ADDRESS ] Specify another address + set-subnode NAME Set a subnode owner (default: current account) + [ --address ADDRESS ] Specify another address + set-resolver NAME Set the resolver (default: resolver.eth) + [ --address ADDRESS ] Specify another address + set-addr NAME Set the addr record (default: current account) + [ --address ADDRESS ] Specify another address + set-text NAME KEY VALUE Set a text record + set-email NAME EMAIL Set the email text record + set-website NAME URL Set the website text record + set-content NAME HASH Set the IPFS Content Hash + migrate-registrar NAME Migrate from the Legacy to the Permanent Registrar + transfer NAME NEW_OWNER Transfer registrant ownership + reclaim NAME Reset the controller by the registrant + [ --address ADDRESS ] Specify another address + +ACCOUNT OPTIONS + --account FILENAME Load from a file (JSON, RAW or mnemonic) + --account RAW_KEY Use a private key (insecure *) + --account 'MNEMONIC' Use a mnemonic (insecure *) + --account - Use secure entry for a raw key or mnemonic + --account-void ADDRESS Use an address as a void signer + --account-void ENS_NAME Add the resolved address as a void signer + --account-rpc ADDRESS Add the address from a JSON-RPC provider + --account-rpc INDEX Add the index from a JSON-RPC provider + --mnemonic-password Prompt for a password for mnemonics + --xxx-mnemonic-password Prompt for a (experimental) hard password + +PROVIDER OPTIONS (default: all + homestead) + --alchemy Include Alchemy + --etherscan Include Etherscan + --infura Include INFURA + --nodesmith Include nodesmith + --rpc URL Include a custom JSON-RPC + --offline Dump signed transactions (no send) + --network NETWORK Network to connect to (default: homestead) + +TRANSACTION OPTIONS (default: query network) + --gasPrice GWEI Default gas price for transactions(in wei) + --gasLimit GAS Default gas limit for transactions + --nonce NONCE Initial nonce for the first transaction + --yes Always accept Siging and Sending + +OTHER OPTIONS + --wait Wait until transactions are mined + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

TODO examples

+ +

TypeScript

+

Help

+
Usage: + ethers-ts FILENAME [ ... ] [ OPTIONS ] + +OPTIONS + --output FILENAME Write the output to FILENAME (default: stdout) + --force Overwrite files if they already exist + --no-optimize Do not run the solc optimizer + --no-bytecode Do not include bytecode and Factory methods + +OTHER OPTIONS + --debug Show stack traces for errors + --help Show this usage and exit + --version Show this version and exit + +(*) By including mnemonics or private keys on the command line they are + possibly readable by other users on your system and may get stored in + your bash history file. This is NOT recommended.

Examples

TODO

+ +

Making Your Own

The cli library is meant to make it easy to create command line utilities of your own.

+ +

A CLI handles parsing all the command-line flags, options and arguments and instantiates a Plugin to process the command.

+ +

A CLI may support multiple Plugin's in which case the first argument is used to determine which to run (or if no arguments, the default plugin will be selected) or may be designed to be standalone, in which case exactly one Plugin will be used and no command argument is allowed.

+ +
addPlugin( command , pluginClass ) void

Add a plugin class for the command. After all options and flags have been consumed, the first argument will be consumed and the associated plugin class will be instantiated and run.

+ +
setPlugin( pluginClass ) void

Set a dedicated Plugin class which will handle all input. This may not be used in conjuction with addPlugin and will not automatically accept a command from the arguments.

+ +
showUsage( [ message = "" [ , status = 0 ] ] ) never

Shows the usage help screen for the CLI and terminates.

+ +
run( args ) Promise< void >

Usually the value of args passed in will be process.argv.slice(2).

+ +

Plugin

Each Plugin manages each command of a CLI and is executed in phases.

+ +

If the usage (i.e. help) of a CLI is requested, the static methods getHelp and getOptionHelp are used to geneate the help screen.

+ +

Otherwise, a plugin is instantiated and the prepareOptions is called. Each plugin must call super.prepareOptions, otherwise the basic options are not yet processed. During this time a Plugin should consume all the flags and options it understands, since any left over flags or options will cause the CLI to bail and issue an unknown option error. This should throw if a value for a given option is invalid or some combination of options and flags is not allowed.

+ +

Once the prepareOptions is complete (the returned promise is resolved), the prepareArguments is called. This should validate the number of arguments is expected and throw and error if there are too many or too few arguments or if any arguments do not make sense.

+ +

Once the prepareArguments is complete (the returned promise is resolved), the run is called.

+ +
plugin.network Network

The network this plugin is running for.

+ +
plugin.provider Provider

The provider for this plugin is running for.

+ +
plugin.accounts Array< Signer >

The accounts passed into the plugin using --account, --account-rpc and --account-void which this plugin can use.

+ +
plugin.gasLimit BigNumber

The gas limit this plugin should use. This is null if unspecified.

+ +
plugin.gasPrice BigNumber

The gas price this plugin should use. This is null if unspecified.

+ +
plugin.nonce number

The initial nonce for the account this plugin should use.

+ +

Methods

+
plugin.prepareOptions( argParser [ , verifyOnly = false ] ) Promise< void >
+
plugin.prepareArgs( args ) Promise< void >
+
plugin.run( ) Promise< void >
+
plugin.getAddress( addressOrName [ , message = "" , [ allowZero = false ] ] ) Promise< string >

A plugin should use this method to resolve an address. If the resovled address is the zero address and allowZero is not true, an error is raised.

+ +
plugin.dump( header , info ) void

Dumps the contents of info to the console with a header in a nicely formatted style. In the future, plugins may support a JSON output format which will automatically work with this method.

+ +
plugin.throwUsageError( [ message = "" ] ) never

Stops exectuion of the plugin and shows the help screen of the plugin with the optional message.

+ +
plugin.throwError( message ) never

Stops execution of the plugin and shows message.

+ +

Static Methods

+
Plugin.getHelp Help

Each subclass should implement this static method which is used to generate the help screen.

+ +
Plugin.getOptionHelp Array< Help >

Each subclass should implement this static method if it supports additional options which is used to generate the help screen.

+ +

ArgParser

The ArgParser is used to parse a command line into flags, options and arguments.

+ +
/home/ethers> ethers --account wallet.json --yes send ricmoo.eth 1.0 +# An Option ----------^ ^ ^ +# - name = "account" | | +# - value = "wallet.json" | | +# A Flag -----------------------------------+ | +# - name = "yes" | +# - value = true | +# Arguments ------------------------------------+ +# - count = 3 +# - [ "send", "ricmoo.eth", "1.0" ]

Flags are simple binary options (such as the --yes), which are true if present otherwise false.

+ +

Options require a single parameter follow them on the command line (such as --account wallet.json, which nhas the name account and the value wallet.json)

+ +

Arguments are all other values on the command line, and are not accessed through the ArgParser directly.

+ +

When a CLI is run, an ArgParser is used to validate the command line by using prepareOptions, which consumes all flags and options leaving only the arguments behind, which are then passed into prepareArgs.

+ +
argParser.consumeFlag( name ) boolean

Remove the flag name and return true if it is present.

+ +
argParser.consumeMultiOptions( names ) Array< {name:string,value:string} >

Remove all options which match any name in the Array of names with their values returning the list (in order) of values.

+ +
argParser.consumeOption( name ) string

Remove the option with its value for name and return the value. This will throw a UsageError if the option is included multiple times.

+ +
argParser.consumeOptions( name ) Array< string >

Remove all options with their values for name and return the list (in order) of values.

+ +

Cookbook

Cooking...

+ +

Migration Guide

Here are some migration guides when upgrading from older versions of Ethers or other libraries.

+ +

Migration: From Web3.js

TODO

+ +

Contracts

+

Providers

+

Numbers

+

Utilities

+

Migration: From Ethers v4

+

BigNumber

+

Namespace

Since BigNumber is used quite frequently, it has been moved to the top level of the umbrella package.

+ +
// v4 +ethers.utils.BigNumber +ethers.utils.BigNumberish + +// v5 +ethers.BigNumber +ethers.BigNumberish

Creating Instances

The bigNumberify method was always preferred over the constructor since it could short-circuit an object instantiation for [[BigNumber] objects (since they are immutable). This has been moved to a static from class method.

+ +
// v4 +new ethers.utils.BigNumber(someValue) +ethers.utils.bigNumberify(someValue); + +// v5 +// - Constructor is private +// - Removed `bigNumberify` +ethers.BigNumber.from(someValue)

Contracts

+
// @TODO

Errors

+

Namespace

All errors now belong to the Logger class and the related functions have been moved to Logger instances, which can include a per-package version string.

+ +

Global error fucntions have been moved Logger class methods.

+ +
// v4 +ethers.errors.UNKNOWN_ERROR +ethers.errors.* + +errors.setCensorship(censorship, permanent) +errors.setLogLevel(logLevel) + +errors.checkArgumentCount(count, expectedCount, suffix) +errors.checkNew(self, kind) +errors.checkNormalize() +errors.throwError(message, code, params) +errors.warn(...) +errors.info(...) + +// v5 +ethers.utils.Logger.errors.UNKNOWN_ERROR +ethers.utils.Logger.errors.* + +Logger.setCensorship(censorship, permanent) +Logger.setLogLevel(logLevel) + +const logger = new ethers.utils.Logger(version); +logger.checkArgumentCount(count, expectedCount, suffix) +logger.checkNew(self, kind) +logger.checkNormalize() +logger.throwError(message, code, params) +logger.warn(...) +logger.info(...)

Interface

The Interface object has undergone the most dramatic changes.

+ +

It is no longer a meta-class and now has methods that simplify handling contract interface operations without the need for object inspection and special edge cases.

+ +

Functions

+
// v4 (example: "transfer(address to, uint amount)") +interface.functions.transfer.encode(to, amount) +interface.functions.transfer.decode(callData) + +// v5 +interface.encodeData("transfer", [ to, amount ]) +interface.decodeResult("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)

Events

+
// v4 (example: Transfer(address indexed, address indexed, uint256) +interface.events.Transfer.encodeTopics(values) +interface.events.Transfer.decode(data, topics) + +// v5 +interface.encodeFilterTopics("Transfer", values) +interface.encodeEventLog("Transfer", data, topics)

Inspection

Interrogating properties about a function or event can now (mostly) be done directly on the Fragment object.

+ +
// v4 +interface.functions.transfer.name +interface.functions.transfer.inputs +interface.functions.transfer.outputs +interface.functions.transfer.payable +interface.functions.transfer.gas + +// v5 +const functionFragment = interface.getFunction("transfer") +functionFragment.name +functionFragment.inputs +functionFragment.outputs +functionFragment.payable +functionFragment.gas + + +// v4; type is "call" or "transaction" +interface.functions.transfer.type + +// v5; constant is true (i.e. "call") or false (i.e. "transaction") +functionFragment.constant + + +// v4 +interface.events.Transfer.anonymous +interface.events.Transfer.inputs +interface.events.Transfer.name + +// v5 +const eventFragment = interface.getEvent("Transfer"); +eventFragment.anonymous +eventFragment.inputs +eventFragment.name + + +// v4 +const functionSig = interface.functions.transfer.signature +const sighash = interface.functions.transfer.sighash + +const eventSig = interface.events.Transfer.signature +const topic = interface.events.Transfer.topic + +// v5 +const functionSig = functionFragment.format() +const sighash = interface.getSighash(functionFragment) + +const eventSig = eventFragment.format() +const topic = interface.getTopic(eventFragment)

Utilities

+

Renaming

+
// @TODO

Wallet

+

Mnemonic Phrases

The mnemonic phrase and related properties have been merged into a single mnemonic object, which also now includes the locale.

+ +
// v4 +wallet.mnemonic +wallet.path + +// v5 +// - Mnemonic phrase and path are a Mnemonic object +// - Note: wallet.mnemonic is null if there is no mnemonic +wallet.mnemonic.phrase +wallet.mnemonic.path

Testing

Here goes info about testing

+ +

Contributing and Hacking

The ethers.js library is something that I've written out of necessity, and has grown somewhat organically over time.

+ +

Many things are the way they are for good (at the time, at least) reasons, but I always welcome criticism, and am completely willing to have my mind changed on things.

+ +

So, pull requests are always welcome, but please keep a few points in mind:

+ +

  • Backwards-compatibility-breaking changes will not be accepted; they may be considered for the next major version
  • Security is important; adding dependencies require fairly convincing arguments as to why
  • The library aims to be lean, so keep an eye on the dist/ethers.min.js file size before and after your changes
  • Add test cases for both expected and unexpected input
  • Any new features need to be supported by me (future issues, documentation, testing, migration), so anything that is overly complicated or specific may not be accepted

+ +

In general, please start an issue before beginning a pull request, so we can have a public discussion and figure out the best way to address to problem/feature. :)

+ +

Building

If you wish to modify the source code, there are a few steps involved in setting up your environment.

+ +
Preparing the Package
# Clone the REPO +/home/ricmoo> git clone git@github.com:ethers-io/ethers.js.git +/home/ricmoo> cd ethers.js + +# Install the base dependencies +/home/ricmoo/ethers.js> npm install + +# Install each module's dependencies and link the libraries +# internally, so they reference each other +/home/ricmoo/ethers.js> npm run bootstrap
Watching and Building
# Begin watching the files and re-building whenever they change +/home/ricmoo/ethers.js> npm run auto-build + + +# Sometimes the issue only affects the ESM modules +/home/ricmoo/ethers.js> npm run auto-build-esm + + +# Or if you only need to run a single build +/home/ricmoo/ethers.js> npm run _build-cjs +/home/ricmoo/ethers.js> npm run _build-esm
Testing
# Rebuilds all files and bundles testcases up for testing +/home/ricmoo/ethers.js> npm test + +# Often you don't need the full CI experience +/home/ricmoo/ethers.js> npm run _test-node
Preparing the Distribution
/home/ricmoo/ethers.js> npm run update-version

Flatworm Docs

The Flatworm Docs rendering engine is designed to be very simple, but provide enough formatting necessary for documenting JavaScript libraries.

+ +

A lot of its inspiration came from Read the Docs and the Sphinx project.

+ +

Fragments

Each page is made up of fragments. A fragment is a directive, with an value and optional link, extensions and a body.

+ +

Many directives support markdown in their value and body.

+ +

A fragment's body continues until another fragment is encountered.

+ +

Directive Format

+
_DIRECTIVE: VALUE @<LINK> @EXTENSION<PARAMETER> +BODY + +MORE BODY + +DIRECTIVE: The directive name +VALUE: Optional; the value to pass to the directive +LINK: Optional; a name for internal linking +EXTENSION: Optional; extended directive functionality +PARAMETER: Optional; value to pass to extended directive functions +BODY: Optional; the directive body (certain directives only)

Flatworm Directives

+
_section: TITLE

A section has its TITLE in an H1 font. Sections are linked to in Table of Contents and have a dividing line drawn above them.

+ +

The body supports markdown.

+ +

There should only be one _section: per page.

+ +

Extensions: @inherit, @src, @nav, @note

+ +
_subsection: TITLE

A subsection has its TITLE in an H2 font. Subsections are linked to in Table of Contents and have a dividing line drawn above them.

+ +

The title and body support markdown.

+ +

Extensions: @inherit, @src, @note

+ +
_heading: TITLE

A heading has its TITLE in an H3 font.

+ +

The title and body support markdown.

+ +

Extensions: @inherit, @src, @note

+ +
_definition: TERM

A definition has its TERM in normal text and the body is indented.

+ +

The title and body support markdown.

+ +
_property: SIGNATURE

A property has its JavaScript SIGNATURE formatted.

+ +

The body supports markdown and the return portion of the signature support markdown links.

+ +

Extensions: @src

+ +
_note: BANNER

A note is placed in a blue bordered-box to draw attention to it.

+ +

The body supports markdown.

+ +
_warning: BANNER

A warning is placed in an orange bordered-box to draw attention to it.

+ +

The body supports markdown.

+ +
_code: CAPTION

Creates a Code block.

+ +

The body does not support markdown, and will be output exactly as is, with the exception of Code Evaluation.

+ +

If a line begins with a "_", it should be escaped with a "\".

+ +

Extensions: @lang

+ +
_table: FOOTER

Creates a Table structured according to the body.

+ +

Each cell support and variables support markdown.

+ +

Extensions: @style

+ +
_toc:

A toc injects a Table of Contents, loading each line of the body as a filename and recursively loads the toc if present, otherwise all the sections and subsections.

+ +

The body does not support markdown, as it is interpreted as a list of files and directories to process.

+ +
_null:

A null is used to terminated a directive. For example, after a definition, the bodies are indented, so a null can be used to reset the indentation.

+ +

The body supports markdown.

+ +
Example
_section: Hello World @<link-main> +Body for section... + + +_subsection: Some Example @<link-secondary> +Body for subsection... + + +_heading: Large Bold Text @<link-here> +Body for heading... + + +_definition: Flatworm +A phylum of relatively **simple** bilaterian, unsegmented, +soft-bodied invertebrates. + + +_property: String.fromCharCode(code) => string +Returns a string created from //code//, a sequence of +UTF-16 code units. + + +_code: heading + +// Some code goes here +while(1); + + +_table: Table Footer + +| **Name** | **Color** | +| Apple | Red | +| Banana | Yellow | +| Grape | Purple | + + +_toc: + some-file + some-directory + + +_note: Title +This is placed in a blue box. + + +_warning: Title +This is placed in an orange box. + + +_null: +This breaks out of a directive. For example, to end a

Markdown

The markdown is simple and does not have the flexibility of other dialects, but allows for bold, italic, underlined, monospaced, superscript and strike text, supporting links and lists.

+ +

Lists are rendered as blocks of a body, so cannot be used within a title or within another list.

+ +
**bold text** + +//italic text// + +__underlined text__ + +``monospace code`` + +^^superscript text^^ + +~~strikeout text~~ + +- This is a list +- With bullet points +- With a total of three items + +This is a [Link to Ethereum](https://ethereum.org) and this +is an [Internal Link](some-link). + +This is a self-titled link [[https://ethereumorg]] and this +[[some-link]] will use the title from its directives value.

Code

The code directive creates a monospace, contained block useful for displaying code samples.

+ +

JavaScript Evaluation

For JavaScript files, the file is executed with some simple substitution.

+ +

A bare //! on a line is replaced with the result of the last statement. Building will fail if an error is thrown.

+ +

A bare //!error is replaced with the throw error. Building will fail if an error is not thrown.

+ +

Also any code included between the lines // <hide> and // </hide> will be omitted from the output, which can be used to setup variables.

+ +
Code Evaluation Example
_code: Result of Code Example @lang<javascript> + +// <hide> +const url = require("url"); +// </hide> + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// <hide> +foo +// </hide> +//!
Result of Code Example
// <hide> +const url = require("url"); +// </hide> + +url.parse("https://www.ricmoo.com/").protocol +//! + +url.parse(45) +//! error + +// You want to assign (doesn't emit eval) AND display the value +const foo = 4 + 5; +// <hide> +foo +// </hide> +//!

Languages

The language can be specified using the @lang extension.

+ +
LanguageNotes 
javascriptSyntax highlights and evaluates the JavaScipt 
scriptSame as javascript, but does not evaluate the results 
shellShell scripts or command-line 
textPlain text with no syntax highlighting 

Tables

The table directive consumes the entire body up until the next directive. To terminate a table early to begin a text block, use a _null: directive.

+ +

Each line of the body should be Row Data or a Variable Declaration (or continuation of a Variable Declaration). Blank lines are ignored.

+ +

Row Data

Each Row Data line must begin and end with a "|", with each gap representing the cell data, alignment with optional column and row spanning.

+ +

Alignment

The alignment for a cell is determined by the whitespace surrounding the cell data.

+ +
AlignmentWhitespace 
Left1 or fewer spaces before the content 
Right1 or fewer spaces after the content 
Center2 or more space both before and after the content 
Alignment Conditions (higher precedence listed first) 
Alignment Example
_table: Result of Alignment Example @style<compact> + +| center | + +| left | +|left | + +| right | +| right|
center 
left 
left 
right 
right 
Result of Alignment Example 

Row and Column Spanning

A column may end its content with any number of "<" which indicates how many additional columns to extend into.

+ +

If the cell content contains only a "^", then the row above is extended into this cell (into the same number of columns).

+ +
Cell Spanning Example
_table: Result of Cell Spanning Example @style<compact> + +| (1x1) | (1x2) <| (2x1) | +| (2x2) <| (2x1) | ^ | +| ^ | ^ | (1x1) |
(1x1)(1x2)(2x1) 
(2x2)(2x1) 
(1x1) 
Result of Cell Spanning Example 

Styles

The @style extension for a table can be used to control its appearance.

+ +
NameWidthColumns 
minimalminimum sizebest fit 
compact40%evenly spaced 
wide67%evenly spaced 
full100%evenly spaced 

Variables

Often the layout of a table is easier to express and maintain without uneven or changing content within it. So the content can be defined separately within a table directive using variables. A varaible name must being with a letter and must only contain letters and numbers.

+ +

Variables are also useful when content is repeated throughout a table.

+ +

A variable is declared by starting a line with "$NAME:", which consumes all lines until the next variable declaration or until the next table row line.

+ +

A variable name must start with a letter and may consist of letters and numbers. (i.e. /[a-z][a-z0-9]*/i)

+ +
Variables Example
_table: Result of Variables Example + +$Yes: This option is supported. +$No: This option is **not** supported +$bottom: This just represents an example of + what is possible. Notice that variable + content can span multiple lines. + +| **Feature** | **Supported** | +| Dancing Monkey | $Yes | +| Singing Turtle | $No | +| Newt Hair | $Yes | +| $bottom <|
FeatureSupported 
Dancing MonkeyThis option is supported. 
Singing TurtleThis option is not supported. 
Newt HairThis option is supported. 
This just represents an example of what is possible. Notice that variable content can span multiple lines. 
Result of Variables Example 

Configuration

Configuration is optional (but highly recommended) and may be either a simple JSON file (config.json) or a JS file (config.js) placed in the top of the source folder.

+ +

TODO: example JSON and example JS

+ +

Extensions

+

@inherit< markdown >

Adds an inherits description to a directive. The markdown may contain links.

+ +

@lang< text >

Set the language a code directive should be syntax-highlighted for. If "javascript", the code will be evaluated.

+ +

@nav< text >

Sets the name in the breadcrumbs when not the current node.

+ +

@note< markdown >

Adds a note to a directive. The markdown may contain links. If the directive already has an @INHERIT extension, that will be used instead and the @NOTE will be ignored.

+ +

@src< key >

Calls the configuration getSourceUrl(key, VALUE) to get a URL which will be linked to by a link next to the directive.

+ +

This extended directive function requires an advanced config.js Configuration file since it requires a JavaScript function.

+ +

@style< text >

The Table Style to use for a table directive.

+ +

License and Copyright

The ethers library (including all dependencies) are available under the MIT License, which permits a wide variety of uses.

+ +

MIT License

Copyright © 2019 Richard Moore.

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ + + + +
+ + + diff --git a/docs/v5/static/lato/Lato-Black.ttf b/docs/v5/static/lato/Lato-Black.ttf new file mode 100644 index 000000000..e2aeb6cc3 Binary files /dev/null and b/docs/v5/static/lato/Lato-Black.ttf differ diff --git a/docs/v5/static/lato/Lato-BlackItalic.ttf b/docs/v5/static/lato/Lato-BlackItalic.ttf new file mode 100644 index 000000000..816738866 Binary files /dev/null and b/docs/v5/static/lato/Lato-BlackItalic.ttf differ diff --git a/docs/v5/static/lato/Lato-Italic.ttf b/docs/v5/static/lato/Lato-Italic.ttf new file mode 100644 index 000000000..b23256ff5 Binary files /dev/null and b/docs/v5/static/lato/Lato-Italic.ttf differ diff --git a/docs/v5/static/lato/Lato-Regular.ttf b/docs/v5/static/lato/Lato-Regular.ttf new file mode 100644 index 000000000..adbfc467d Binary files /dev/null and b/docs/v5/static/lato/Lato-Regular.ttf differ diff --git a/docs/v5/static/lato/OFL.txt b/docs/v5/static/lato/OFL.txt new file mode 100644 index 000000000..6d2c4160b --- /dev/null +++ b/docs/v5/static/lato/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2010-2015, Ɓukasz Dziedzic (dziedzic@typoland.com), +with Reserved Font Name Lato. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/v5/static/lato/README.txt b/docs/v5/static/lato/README.txt new file mode 100644 index 000000000..272db628f --- /dev/null +++ b/docs/v5/static/lato/README.txt @@ -0,0 +1,72 @@ + +Lato font family (Desktop version) + +================================== + +Version 2.015; Latin+Cyrillic+Greek+IPA opensource + +Created by: tyPoland Lukasz Dziedzic +Creation year: 2015 + +Copyright (c) 2010-2015 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1. + +Lato is a trademark of tyPoland Lukasz Dziedzic. + +Source URL: http://www.latofonts.com/ +License URL: http://scripts.sil.org/OFL + +================ + +Lato is a sanserif typeface family designed in the Summer 2010 and extended in the Summer 2013 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in the 2010s, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness. In 2013-2014, the family was greatly extended (with the help of Adam Twardoch and Botio Nikoltchev) to cover 3000+ glyphs over nine weights with italics. It now supports 100+ Latin-based languages, 50+ Cyrillic-based languages as well as Greek and IPA phonetics. The Lato fonts are available free of charge under the SIL Open Font License from http://www.latofonts.com/ + +================ + +CONTENTS: + +This folder contains 18 font files in OpenType TT (.ttf) format. You can install these fonts on your computer and use in any desktop applications (such as Word, InDesign, Illustrator, Photoshop, Keynote or Pages). + +================ + +REVISION LOG: + +# Version 2.015 (2015-08-06) +Initial implementation of mark positioning (should work for most glyphs) +Autohinted using ttfautohint 1.3. + +# Version 2.010 (2014-09-01) +Improved some contour bugs and diacritics positioning. +Improved outline quality. +Revised OTL features so that they work in browsers (ot-sanitise). +Autohinted using ttfautohint 1.1. +Interpolated the Medium weight differently so it provides more visual difference from Regular. + +# Version 2.007 (2014-02-27) +Greatly expanded character set, revised metrics, four additional weights. + +# Version 1.104 (2011-11-08) +Merged the distribution again +Autohinted with updated ttfautohint 0.4 (which no longer causes Adobe and iOS problems) +except the Hai and Lig weights which are hinted in FLS 5.1. + +# Version 1.102 (2011-10-28) +Added OpenType Layout features +Ssplit between desktop and web versions +Desktop version: all weights autohinted with FontLab Studio +Web version autohinted with ttfautohint 0.4 except the Hai and Lig weights + +# Version 1.101 (2011-09-30) +Fixed OS/2 table Unicode and codepage entries + +# Version 1.100 (2011-09-12) +Added Polish diacritics to the character set +Weights Hai and Lig autohinted with FontLab Studio +Other weights autohinted with ttfautohint 0.3 + +# Version 1.011 (2010-12-29) +Added the soft hyphen glyph + +# Version 1.010 (2010-12-13) +Initial version released under SIL Open Font License +Western character set + +================ diff --git a/docs/v5/static/lato/index.html b/docs/v5/static/lato/index.html new file mode 100644 index 000000000..909d30084 --- /dev/null +++ b/docs/v5/static/lato/index.html @@ -0,0 +1,11 @@ + + + Lato Font Family + + + + + diff --git a/docs/v5/static/link.svg b/docs/v5/static/link.svg new file mode 100644 index 000000000..692a38d1d --- /dev/null +++ b/docs/v5/static/link.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/docs/v5/static/logo.svg b/docs/v5/static/logo.svg new file mode 100644 index 000000000..bac18e568 --- /dev/null +++ b/docs/v5/static/logo.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/docs/v5/static/script.js b/docs/v5/static/script.js new file mode 100644 index 000000000..8c4afa851 --- /dev/null +++ b/docs/v5/static/script.js @@ -0,0 +1,137 @@ +"use strict"; + + +if (document.getElementsByTagName("html")[0].classList.contains("single-page")) { + const title = document.body.querySelector(".sidebar .link.title"); + const content = document.getElementsByClassName("content")[0]; + const toc = document.getElementsByClassName("toc")[0]; + const sidebar = document.getElementsByClassName("sidebar")[0]; + + let height = 0; + + const anchors = Array.prototype.reduce.call(document.body.querySelectorAll(".content a"), function(accum, anchor) { + const name = anchor.getAttribute("name"); + if (name && !accum[name]) { + accum[name] = anchor; + } + return accum; + }, { }); + + const sidebarLinks = Array.prototype.map.call(document.body.querySelectorAll(".sidebar .toc .link a"), function(anchor, index) { + const name = anchor.getAttribute("href").substring(1); + const link = anchor.parentNode; + + // If the click, set the class directly, so it doesn't "jump" + anchor.onclick = function() { + const current = document.body.querySelector(".link.selected"); + if (current) { current.classList.remove("selected"); } + + link.classList.add("selected"); + }; + + height += link.offsetHeight; + + // Get the offset in the content of the target + let offset = 0; + anchor = anchors[name]; + if (anchor) { offset = anchor.offsetTop; } + + return { index, link, name, offset }; + }); + sidebarLinks.forEach(function(link, index) { + const next = sidebarLinks[index + 1]; + link.height = (next ? next.offset: content.offsetHeight) - link.offset; + }); + + function getScrollTop(link) { + const maxScrollY = (toc.offsetHeight + 160 - window.innerHeight); + if (link == null) { return maxScrollY; } + + const percentLinks = link.index / sidebarLinks.length; + return percentLinks * maxScrollY; + } + + function getTime() { return (new Date()).getTime(); } + + let scrollPaused = false; + + function highlightToc(scrollVisible, animate) { + // What percent through the content are we? + let percentContent = window.scrollY / (content.offsetHeight - window.innerHeight); + if (percentContent < 0) { + percentContent = 0; + } else if (percentContent > 1) { + percentContent = 1; + } + + // Map to on-screen w/ a smooth gradient from [ 0, content.offsetHeight ] + let y = window.scrollY + window.innerHeight * percentContent; + if (y < 0) { y = 0; } + + // Find the link that is at before location y + let last = null; + for (let i = 0; i < sidebarLinks.length; i++) { + const link = sidebarLinks[i]; + if (link.offset > y) { break; } + last = link; + } + + // If the link is not already selected... + if (!last.link.classList.contains("selected")) { + // ...unselcted the currently seclected link + const current = document.body.querySelector(".link.selected"); + if (current) { current.classList.remove("selected"); } + + // ...select the new link + last.link.classList.add("selected"); + } + + // ...and scroll it to be visible + if (scrollVisible && !scrollPaused) { + const scrollTarget = getScrollTop(last); + const percentFragment = (last.offset - y) / last.height; + const delta = (getScrollTop(sidebarLinks[last.index + 1]) - scrollTarget) * percentFragment; + const scrollTop = scrollTarget - delta; + + if (animate) { + const pi_2 = Math.PI / 2; + const totalDuration = 200; + const shift = scrollTop - sidebar.scrollTop; + const start = getTime(); + const timer = setInterval(function() { + const duration = getTime() - start; + if (duration > totalDuration) { + clearInterval(timer); + sidebar.scrollTop = scrollTop; + return; + } + // linear: 0 -> 1 + let i = duration / totalDuration; + // ease out: 1 -> 0 + i = 1 - Math.sin(i * pi_2); + sidebar.scrollTop = scrollTop - i * shift; + }, 5); + } else { + sidebar.scrollTop = scrollTop; + } + } + } + + sidebar.onmouseenter = function() { + scrollPaused = true; + } + + sidebar.onmouseleave = function() { + scrollPaused = false; + highlightToc(true, true); + } + + // Wehenver we scroll, highlight the TOC + window.onscroll = function() { highlightToc(true); } + + // Poll occassionally to highlight the TOC (but don't auto-scroll) + setInterval(function() { highlightToc(false); }, 1000); + + // Set up the initial TOC highlight + highlightToc(true); +} diff --git a/docs/v5/static/style.css b/docs/v5/static/style.css new file mode 100644 index 000000000..8f811545c --- /dev/null +++ b/docs/v5/static/style.css @@ -0,0 +1,719 @@ +@font-face { + font-family: 'LatoLight'; + src: url('/static/lato/Lato-Regular.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'LatoLight'; + src: url('/static/lato/Lato-Black.ttf') format('truetype'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'LatoLight'; + src: url('/static/lato/Lato-Italic.ttf') format('truetype'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'LatoLight'; + src: url('/static/lato/Lato-BlackItalic.ttf') format('truetype'); + font-weight: bold; + font-style: italic; +} + +html { + margin: 0; +} + +body { + background-color: #eee; + color: #333; + font-family: "LatoLight", sans-serif; + margin: 0; +} + +/* Since we use the Black font, back off the color a bit (from #333) */ +b { + color: #484848; +} + +h1 { + color: #444; + font-size: 175%; + margin: 0 0 0 15px; + padding: 30px 30px 0 15px; + border-top: 1px solid #ddd; +} + +h2 { + color: #444; + font-size: 150%; + border-top: 1px solid #ddd; + margin: 30px 0 0 15px; + padding: 30px 0 0 15px; +} + +h3 { + color: #333; + font-size: 125%; + margin: 10px 0 0 15px; + padding: 10px 0 0 15px; +} + +p { + font-size: 18px; + line-height: 28px; + padding-left: 30px; +} + +ul { + line-height: 28px; + margin: 10px 0 0 30px; + width: 600px; +} + +ul li { + font-size: 18px; + line-height: 30px; +} + +div.code-title { + ddd-border: 1px solid green; + height: 7px; + margin-left: 30px; + margin-top: 10px; + position: relative; +} + +div.code-title div { + ddd-border: 1px solid red; + box-sizing: border-box; + color: #88a; + font-style: italic; + font-size: 18px; + padding-right: 10px; + position: absolute; + text-align: right; + width: 100%; +} + +div.code { + background: #f8f8ff; + border: 2px solid #88a; + color: #000; + margin: 20px 0 30px 30px; + padding: 15px 20px; + font-family: monospace; + font-size: 18px; + white-space: pre; + overflow: scroll; +} + +div.code .comment { + color: #000; + opacity: 0.5; +} + +div.code .result.ok { + color: #00a; + font-style: italic; + opacity: 0.7; +} + +div.code .result.error { + color: #a00; + font-style: italic; + opacity: 0.7; +} + +.content a { + text-decoration: none; + color: #66e; +} + +.content a:hover { + color: #22a; +} + +div.breadcrumbs { + padding: 40px 30px 30px 30px; +} + +div.breadcrumbs span.current { + font-style: italic; +} + +.sidebar { + background: #334; + box-shadow: 5px 0px 10px 0px #aaa; + position: fixed; + top: 0; + bottom: 0; + left: 0; + padding-top: 160px; + overflow: auto; + width: 260px; +} + +.sidebar .header { + background: #2535a0; + box-shadow: 0px 5px 15px 0px #115; + height: 160px; + position: fixed; + left: 0; + top: 0; + width: 260px; + height: 160px; +} + +.sidebar .logo { + color: #fff; + opacity: 0.5; + position: absolute; + top: 30px; + left: 50%; + text-align: center; + transform: translate(-50%, 0); + transition: opacity 0.4s linear; + width: 100; +} + +.sidebar .logo .image { + background: url(/static/logo.svg) center no-repeat; + height: 40px; + margin-bottom: 5px; + width: 100%; +} + +.sidebar .logo:hover { + opacity: 1; + transition: opacity 0.1s linear; +} + +.sidebar a { + color: #fff; + text-decoration: none; +} + +.sidebar .toc .link.hide { + display: none; +} + +.sidebar .toc .link a { + color: #222; +} + +.sidebar .toc .link a:hover { + color: #668; +} + +.sidebar .toc .link.base a { + color: #fff; +} + +.sidebar .toc .link.base a:hover { + color: #aac; +} + + +.sidebar .logo .name { + font-size: 125%; + font-weight: bold; +} + +.sidebar .logo .version { +} + +.sidebar .hr { +} + +.sidebar .toc { + padding: 20px 0 40px; +} + +.sidebar .toc .link.title { + font-size: 115%; + font-weight: bold; + padding: 15px 10px 15px 20px; +} + +.sidebar .toc .link.title a { + color: #666; +} + +.sidebar .toc .link.title a:hover { + color: #779; +} + +.sidebar .toc .link { + font-size: 90%; + line-height: 20px; + padding: 5px 10px 5px 20px; +} + +.sidebar .toc .link { + font-size: 90%; + padding: 5px 10px 5px 20px; +} + +.sidebar .toc .link.depth-2 { + background-color: #d8d8d8; + padding-left: 30px; +} + +.sidebar .toc .link.ancestor.depth-2 { + background-color: #c0c0c0; + border-top: 2px solid #b0b0b0; +} + +.sidebar .toc .link.depth-3 { + background-color: #c0c0c0; + padding-left: 40px; +} + +.sidebar .toc .link.ancestor.depth-3 { + background-color: #a8a8a8; + border-top: 2px solid #989898; +} + +.sidebar .toc .link.depth-4 { + background-color: #a8a8a8; + padding-left: 50px; +} + +.sidebar .toc .link.ancestor.depth-4 { + background-color: #909090; + border-top: 2px solid #808080; +} + +.sidebar .toc .link.depth-5 { + background-color: #909090; + padding-left: 60px; +} + +.sidebar .toc .link.ancestor.base { + background: #fff; +} + +.sidebar .toc .link.ancestor { + font-weight: bold; +} + +.sidebar .toc .link.ancestor.base a { + color: #444; +} + +.sidebar .toc .link.ancestor.base a:hover { + color: #779; +} + +.sidebar .toc .link.ancestor.base { + background: #fff; + dddfont-weight: bold; +} + +.sidebar .toc .link.ancestor.base a { + color: #444; +} + + +.content { + background: #fff; + box-shadow: 5px 0px 10px 0px #888; + margin: 0; + padding: 0px 90px 30px 210px; + padding-left: 270px; + width: 800px; +} + +.show-anchors > div { + position: relative; +} + +.show-anchors > div > .anchors { + display: block; + height: 100%; + position: absolute; + pointer-events: none; + top: 0; + width: 100%; +} + +.anchors a { + height: 50px; + position: absolute; + line-height: 50px; + pointer-events: auto; + transition: opacity 0.3s linear; + top: 50%; +} + +.anchors a.self { + background: url(./link.svg) center no-repeat; + left: -8px; + opacity: 0; + transform: translate(-100%, -50%); + width: 20px; +} + +.show-anchors:hover > div > .anchors a.self { + opacity: 0.3; +} + +.show-anchors > div > .anchors a.self:hover { + opacity: 1; +} + +.anchors a.source { + font-size: 14px; + font-weight: normal; + right: 0; + opacity: 0.3; + transform: translate(100%, -50%); +} + +.show-anchors:hover > div > .anchors a.source { + opacity: 1; +} + +.anchors a.source:hover { + opacity: 1; +} + +.inherits { + font-weight: normal; + font-size: 16px; + font-style: italic; + position: absolute; + letter-spacing: 0.1ex; + padding-left: 18px; +} + +.definition { + margin: 10px 0 0 15px; + padding: 10px 0 0 15px; +} + +.definition p { + margin-top: 4px; +} + +.definition .term { + font-size: 110%; +} + +.definition.container-box { + border-radius: 5px; + left: 48px; + margin-bottom: 30px; + margin-top: 30px; + overflow: hidden; + padding: 0; + position: relative; + width: 80%; +} + +.definition.container-box .term { + color: #fff; + font-size: 16px; + font-weight: bold; + padding: 5px 15px; +} + +.definition.container-box p { + font-size: 16px; + padding: 0px 30px; +} + +.definition.container-box p:first-child { + padding-top: 15px; +} + +.definition.container-box p:last-child { + padding-bottom: 10px; +} + +.definition.container-box.note { + border: 2px solid #184e80; +} + +.definition.container-box.note .term { + background-color: #65a9e9; + ddd-border: 2px solid #184e80; +} + + +.definition.container-box.warning { + border: 2px solid #804e18; +} + +.definition.container-box.warning .term { + background-color: #cf7a00; +} + + +code.inline { + ddd-background: #eef; + padding-left: 5px; + padding-right: 5px; + white-space: nowrap; +} + +.property { + margin: 10px 0 0 15px; + padding: 10px 0 0 15px; +} + +.property p { + margin-top: 4px; +} + +.property .signature { + font-size: 115%; +} + +.property .signature .modifier { + color: #555; + font-weight: bold; + font-style: italic; + padding-right: 8px; +} + +.property .signature .path { + font-style: italic; +} + +.property .signature .method { + color: #555; + font-weight: bold; +} + +.property .signature .param { + font-style: italic; +} + +.property .signature .symbol { + padding-left: 4px; + padding-right: 4px; +} + +.property .arrow { + color: #888; + padding-left: 10px; + padding-right: 5px; +} + +.property .returns { + color: #888; + font-style: italic; +} + +.content table.table { + border-collapse: collapse; + box-sizing: border-box; + margin-top: 20px; + margin-left: 30px; + margin-bottom: 30px; + margin-right: -4px; /* To compensate for the fix column */ +} + +.content table.table.compact { + width: 300px; +} + +.content table.table.wide { + width: 500px; +} + +.content table.table.full { + width: 774px; /* Accomodate the empty end cell to maintain spacing*/ +} + +/* +.content table.table.full tr:nth-child(even) { + background-color: #f8f8f8; +} +*/ +.content table.table td { + border: 2px solid #88a; + color: #444; + padding: 5px 20px; +} + +.content table.table td.fix { + border: none; + padding-left: 0; + padding-right: 0; + width: 0; +} + +.content table td.table-title { + border: none; + color: #777; + font-style: italic; + text-align: center; +} + +.content .toc { + margin: 20px 0 0 0px; + padding: 0px 0 0 48px; +} + +.content .toc div { + font-size: 18px; + line-height: 28px; +} + +.content .toc div span.bullet { + position: absolute; + transform: translate(-16px, 0); +} + +.content .copyright { + font-size: 80%; + padding: 10px 0 20px 30px; + text-align: center; +} + +.footer { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + color: #333; + padding: 30px 30px 30px 15px; + position: relative; + margin: 50px 0 10px 15px; +} + +.footer .nav { + line-height: 30px; + height: 30px; + padding: 0; + position: absolute; + top: 50%; + transform: translate(0, -50%); + width: 300px; +} + +.footer .nav span { + background: #449; + border-radius: 15px; + color: #fff; + display: inline-block; + font-weight: bold; + font-size: 14px; + line-height: 30px; + opacity: 0.5; + text-align: center; + transition: opacity 0.4s linear; + height: 30px; + width: 30px; +} + +.footer .nav:hover span { + opacity: 1; + transition: opacity 0.1s linear; +} + +.footer .nav.previous { + left: 0; +} + +.footer .nav.previous span { + margin-right: 20px; +} + +.footer .nav.next { + right: 0; + text-align: right; +} + +.footer .nav.next span { + margin-left: 20px; +} + + +/* Format-dependent styles */ + +html.single-page div.breadcrumbs { + padding: 10px 0 0 0; +} + +html.single-page h1 { + border-top: none; +} + +html.single-page .page-separator { + border-top: 3px solid #aaa; + margin: 50px 0 10px 15px; + height: 0; +} + +html.single-page .footer { + padding: 0; +} + +html.single-page .sidebar .toc .link a { + color: #fff; +} + +html.single-page .sidebar .toc .link.selected a { + color: #000; +} + +html.single-page .sidebar .toc .link a:hover { + color: #99a; +} + +html.single-page .sidebar .toc .link.depth-2 { + background-color: #334; + padding-left: 30px; +} + +html.single-page .sidebar .toc .link.depth-3 { + background-color: #334; + padding-left: 40px; +} + +html.single-page .sidebar .toc .link.depth-4 { + background-color: #334; + padding-left: 50px; +} + +html.single-page .sidebar .toc .link.depth-5 { + background-color: #334; + padding-left: 60px; +} + +html.single-page .sidebar .toc .link.selected a:hover { + color: #888; +} + +/* +html.single-page .sidebar .toc .link { + dddtransition: background-color 0.3s linear; +} +*/ + +html.single-page .sidebar .toc .link.selected { + dddbackground-color: #aac; + background-color: #282839; +} + +html.single-page .sidebar .toc .link.title.selected { + background-color: #282839; +} + + +html.single-page .sidebar .toc .link.selected a { + ddd-color: #000; + color: #fff; +} + +html.single-page .sidebar .toc .link.title.selected a { + color: #fff; +} diff --git a/docs/v5/testing/README.md b/docs/v5/testing/README.md new file mode 100644 index 000000000..1c046d1f2 --- /dev/null +++ b/docs/v5/testing/README.md @@ -0,0 +1,9 @@ +----- + +Documentation: [html](https://docs-beta.ethers.io/) + +----- + +Testing +======= + diff --git a/docs/v5/testing/index.html b/docs/v5/testing/index.html new file mode 100644 index 000000000..fd7ab4703 --- /dev/null +++ b/docs/v5/testing/index.html @@ -0,0 +1,31 @@ + + + + Testing + + + + +
+ + +

Testing

Here goes info about testing

+ + + + + +
+ + +