Moved all flatworm docs to inline code.

This commit is contained in:
Richard Moore 2020-04-19 02:18:20 -04:00
parent 9712592090
commit 2aeb4e9a9c
No known key found for this signature in database
GPG Key ID: 665176BE8E9DC651
18 changed files with 979 additions and 80 deletions

@ -2,7 +2,43 @@ _section: Example: ERC-20 Contract
_subsection: Connecting to a Contract _subsection: Connecting to a Contract
_code: token.txt _code: A simple ERC-20 contract @lang<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)
_heading: ERC20Contract @INHERIT<[[contract]]> _heading: ERC20Contract @INHERIT<[[contract]]>

@ -22,7 +22,27 @@ sent to the network.
_heading: Examples _heading: Examples
_code: example-account.js _code: @lang<javascript>
// <hide>
const provider = ethers.getDefaultProvider()
// </hide>
// 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");
//!
_subsection: Blocks Methods _subsection: Blocks Methods
@ -52,7 +72,20 @@ not have an address configured, ``null`` is returned.
_heading: Examples _heading: Examples
_code: example-ens.js _code: @lang<javascript>
// <hide>
const provider = ethers.getDefaultProvider()
// </hide>
// Reverse lookup of an ENS by address...
provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c");
//!
// Lookup an address of an ENS name...
provider.resolveName("ricmoo.firefly.eth");
//!
_subsection: Logs Methods _subsection: Logs Methods

@ -240,7 +240,7 @@ 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 used to deploy a contract, in which case this is the address created by that
contract. contract.
To compute a contract address, the [getContractAddress](utils-getcontractaddress) To compute a contract address, the [getContractAddress](utils-getContractAddress)
utility function can also be used with a [[provider-transactionresponse]] utility function can also be used with a [[provider-transactionresponse]]
object, which requires the transaction nonce and the address of the sender. object, which requires the transaction nonce and the address of the sender.

@ -39,7 +39,7 @@ accepts an address can receive an ICAP address, and it will be converted interna
To convert an address into the ICAP format, see [getIcapAddress](utils-getIcapAddress). To convert an address into the ICAP format, see [getIcapAddress](utils-getIcapAddress).
_subsection: Functions _subsection: Converting and Verifying @<urils--address-basic>
_property: ethers.utils.getAddress(address) => string<[[address]]> @<utils-getAddress> @SRC<address> _property: ethers.utils.getAddress(address) => string<[[address]]> @<utils-getAddress> @SRC<address>
Returns //address// as a Checksum Address. Returns //address// as a Checksum Address.
@ -49,18 +49,35 @@ the checksum is invalid, an InvalidArgument Error is throw.
The value of //address// may be any supported address format. The value of //address// may be any supported address format.
_property: ethers.utils.isAddress(address) => boolean @<utils-isAddress> @SRC<address>
Returns true if //address// is valid (in any supported format).
_property: ethers.utils.getIcapAddress(address) => string<[IcapAddress](address-icap)> @<utils-getIcapAddress> @SRC<address> _property: ethers.utils.getIcapAddress(address) => string<[IcapAddress](address-icap)> @<utils-getIcapAddress> @SRC<address>
Returns //address// as an [ICAP address](link-icap). Returns //address// as an [ICAP address](link-icap).
Supports the same restrictions as [utils.getAddress](utils-getAddress). Supports the same restrictions as [utils.getAddress](utils-getAddress).
_property: ethers.utils.getContractAddress(transaction) => string<[[address]]> @<utils-getcontractaddress> @SRC<address> _property: ethers.utils.isAddress(address) => boolean @<utils-isAddress> @SRC<address>
Returns true if //address// is valid (in any supported format).
_subsection: Derivation @<utils--address-computation>
_property: ethers.utils.computeAddress(publicOrPrivateKey) => string<[[address]]> @<utils-computeAddress> @SRC<transactions>
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.
_property: ethers.utils.recoverAddress(digest, signature) => string<[[address]]> @<utils-recoverAddress> @SRC<transactions>
Use [[link-wiki-ecrecover]] to determine the address that signed //digest// to
which generated //signature//.
_subsection: Contracts Addresses @<utils--contract-addresses>
_property: ethers.utils.getContractAddress(transaction) => string<[[address]]> @<utils-getContractAddress> @SRC<address>
Returns the contract address that would result if //transaction// was Returns the contract address that would result if //transaction// was
used to deploy a contract. used to deploy a contract.
_property: ethers.utils.getCreate2Address(from, salt, initCodeHash) => string<[[address]]> @<utils-getCreate2Address> @SRC<address> _property: ethers.utils.getCreate2Address(from, salt, initCodeHash) => string<[[address]]> @<utils-getCreate2Address> @SRC<address>
Returns the contract address that would result from the given Returns the contract address that would result from the given
[CREATE2](link-eip-1014) call. [CREATE2](link-eip-1014) call.

@ -13,7 +13,23 @@ and parameters which accept values will generally accept them.
_heading: Importing _heading: Importing
_code: bignumber-import.source _code: CommonJS @lang<script>
// From the Umbrella ethers package...
const { BigNumber } = require("ethers");
// From the bignumber pacakge...
const { BigNumber } = require("@ethersproject/bignumber");
_code: ES6 and TypeScript CommonJS @lang<script>
// From the Umbrella ethers package...
import { BigNumber } from "ethers";
// From the bignumber pacakge...
import { BigNumber } from "@ethersproject/bignumber";
_subsection: Types _subsection: Types
@ -50,7 +66,46 @@ Returns an instance of a **BigNumber** for //aBigNumberish//.
_heading: Examples: @<> _heading: Examples: @<>
_code: bignumber-create.js _code: @lang<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
_subsection: Methods _subsection: Methods
@ -65,7 +120,7 @@ _property: bignumber.add(otherValue) => [[bignumber]] @SRC<bignumber>
Returns a BigNumber with the value of //bignumber// **+** //otherValue//. Returns a BigNumber with the value of //bignumber// **+** //otherValue//.
_property: bignumber.sub(otherValue) => [[bignumber]] @SRC<bignumber> _property: bignumber.sub(otherValue) => [[bignumber]] @SRC<bignumber>
Returns a BigNumber with the value of //bignumber// **&ndash;** //otherValue//. Returns a BigNumber with the value of //bignumber// **-** //otherValue//.
_property: bignumber.mul(otherValue) => [[bignumber]] @SRC<bignumber> _property: bignumber.mul(otherValue) => [[bignumber]] @SRC<bignumber>
Returns a BigNumber with the value of //bignumber// **&times;** //otherValue//. Returns a BigNumber with the value of //bignumber// **&times;** //otherValue//.
@ -146,7 +201,13 @@ Returns true if and only if the //object// is a BigNumber object.
_heading: Examples _heading: Examples
_code: bignumber-examples.js _code: @lang<javascript>
let a = BigNumber.from(42);
let b = BigNumber.from("91");
a.mul(b);
//!
_subsection: Notes _subsection: Notes
@ -171,7 +232,12 @@ experience rounding errors.
To demonstrate how this may be an issue in your code, consider: To demonstrate how this may be an issue in your code, consider:
_code: bignumber-ieee754.js _code: @lang<javascript>
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER)
//!
_null:
To remedy this, all numbers (which can be large) are stored To remedy this, all numbers (which can be large) are stored
and manipulated as [Big Numbers](bignumber). and manipulated as [Big Numbers](bignumber).

@ -79,7 +79,31 @@ zeros.
_heading: Examples _heading: Examples
_code: bytes-conversion.js _code: @lang<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 ])
//!
_subsection: Array Manipulation _subsection: Array Manipulation
@ -139,3 +163,16 @@ Return a new Uint8Array of //length// random bytes.
_property: ethers.utils.shuffled(array) => Array<any> @<utils.shuffled> @SRC<random> _property: ethers.utils.shuffled(array) => Array<any> @<utils.shuffled> @SRC<random>
Return a copy of //array// shuffled using [[link-wiki-shuffle]]. Return a copy of //array// shuffled using [[link-wiki-shuffle]].
_code: Examples @lang<javascript>
utils.randomBytes(8)
//!
const foo = [ 1, 2, 3, 4, 5, 6, 7 ];
utils.shuffled(foo);
//!
// The original array is unscathed...
foo
//!

@ -4,7 +4,10 @@ The **ethers.contants** Object contains commonly used values.
_heading: Importing _heading: Importing
_code: constants-import.js _code: @lang<script>
const { constants } = require("ethers");
const { constants } = require("@ethersproject/constants");
_subsection: Bytes _subsection: Bytes

@ -21,23 +21,29 @@ _subsection: Units
_heading: Decimal Count _heading: Decimal Count
The //unit// specified may be an integer, which indicates how A **Unit** can be specified as an number, which indicates the
many decimal place the unit has. For example, 1 ether has 18 decimal number of decimal places that should be used.
places for wei, and if this library were used with Bitcoin, 1 BTC
has 8 decimal places for satoshis. **Examples:**
- 1 ether in wei, has **18** decimal places (i.e. 1 ether represents 10^^18^^ wei)
- 1 bitcoin in Satoshi, has **8** decimal places (i.e. 1 bitcoin represents 10^^8^^ satoshi)
_heading: Named Units _heading: Named Units
In addition to specifying //unit// as a number of decimals, there There are also several common **Named Units**, in which case their name (as
are several common units, which can be passed in as a string: a string) may be used.
- **wei** --- 0 _table: @STYLE<compact>
- **kwei** --- 3
- **mwei** --- 6 | **Name** | **Decimals** |
- **gwei** --- 9 | //wei// | 0 |
- **szabo** --- 12 | //kwei// | 3 |
- **finney** --- 15 | //mwei// | 6 |
- **ether** --- 18 | //gwei// | 9 |
| //szabo// | 12 |
| //finney// | 15 |
| //ether// | 18 |
_subsection: Functions _subsection: Functions

@ -7,18 +7,88 @@ and disassemle EVM bytecode into human-readable mnemonics.
_subsection: Help _subsection: Help
_code: asm-help.txt _code: @lang<text>
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
_subsection: Example Input Files _subsection: Example Input Files
_definition: **SimpleStore.asm** _definition: **SimpleStore.asm**
_code: asm-simplestore-asm.txt _code: @lang<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") }}
]
}
_definition: **SimpleStore.bin** _definition: **SimpleStore.bin**
_code: asm-simplestore-bin.txt _code: @lang<text>
0x602a6000556044601160003960446000f334601e5760003560e01c8063209652
0x5514602457806355241077146030575b60006000fd5b60005460005260206000
0xf35b6024361415601e5760043560005560006000f3
_note: Note: Bytecode File Syntax _note: Note: Bytecode File Syntax
A bin file may be made up of multiple blocks of bytecode, each may A bin file may be made up of multiple blocks of bytecode, each may
@ -38,7 +108,19 @@ until the bytecode stablizes. This allows for more compact jump
destinations and for code to be include more advanced meta-programming destinations and for code to be include more advanced meta-programming
techniques. techniques.
_code: asm-examples-assemble.txt _code: @lang<shell>
/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
_heading: Options _heading: Options
@ -77,5 +159,62 @@ A disassembled program shows offsets and mnemonics for the given
bytecode. This format may change in the future to be more bytecode. This format may change in the future to be more
human-readable. human-readable.
_code: asm-examples-disassemble.txt _code: @lang<shell>
/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

@ -2,7 +2,78 @@ _section: Ethereum Naming Service @NAV<ENS>
_subsection: Help _subsection: Help
_code: ens-help.txt _code: @lang<text>
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.
_subsection: Examples _subsection: Examples

@ -9,21 +9,163 @@ of the ethers utilities already exposed.
_subsection: Help _subsection: Help
_code: ethers-help.txt _code: @lang<text>
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.
_subsection: Examples _subsection: Examples
_heading: Creating Wallets @<cliex-init> _heading: Creating Wallets @<cliex-init>
_code: ethers-init.txt _code: @lang<shell>
/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
_heading: Sending Ether and Tokens @<cliex-send> _heading: Sending Ether and Tokens @<cliex-send>
_code: ethers-send.txt _code: @lang<shell>
# 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
_heading: Signing Messages @<cliex-signing> _heading: Signing Messages @<cliex-signing>
_code: ethers-sign.txt _code: @lang<shell>
/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
_heading: Scripting @<cliex-scripting> _heading: Scripting @<cliex-scripting>
@ -31,7 +173,28 @@ 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 the command line to be passed into other commands or stored in script
environment variables. environment variables.
_code: ethers-script.txt _code: @lang<shell>
# 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
_heading: Using Mnemonics (with a password) @<cliex-mnemonicpassword> _heading: Using Mnemonics (with a password) @<cliex-mnemonicpassword>
@ -40,7 +203,16 @@ string (i.e. ``""``) as the password. If you have a password on your
mnemonic, the ``-\-mnemonic-password`` will prompt for the password to mnemonic, the ``-\-mnemonic-password`` will prompt for the password to
use to decrypt the account. use to decrypt the account.
_code: ethers-mnemonic.txt _code: @lang<shell>
/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>
_heading: Using Mnemonics (with experimental memory-hard passwords) @<cliex-mnemonicpassword-xxx> _heading: Using Mnemonics (with experimental memory-hard passwords) @<cliex-mnemonicpassword-xxx>
@ -50,7 +222,16 @@ the password through the [scrypt](link-wiki-scrypt)
//password-based key derivation function// first, which is intentionally slow and makes //password-based key derivation function// first, which is intentionally slow and makes
a brute-force attack far more difficult. a brute-force attack far more difficult.
_code: ethers-mnemonic-hard.txt _code: @lang<shell>
/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>
_warning: Note _warning: Note
This is still an experimental feature (hence the ``xxx``). This is still an experimental feature (hence the ``xxx``).

@ -114,7 +114,20 @@ _subsection: ArgParser @<cli-argparser> @SRC<cli:class.ArgParser>
The **ArgParser** is used to parse a command line into flags, options The **ArgParser** is used to parse a command line into flags, options
and arguments. and arguments.
_code: plugin.txt _code: @lang<shell>
/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" ]
_null:
Flags are simple binary options (such as the ``--yes``), which are true if present Flags are simple binary options (such as the ``--yes``), which are true if present
otherwise false. otherwise false.

@ -2,7 +2,26 @@ _section: TypeScript
_subsection: Help _subsection: Help
_code: typescript-help.txt _code: @lang<text>
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.
_subsection: Examples _subsection: Examples

@ -64,5 +64,22 @@ 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 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. it can also be tuned down in situations where the security is less important.
_code: lightkdf.js _code: @LANG<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
}
});

@ -115,6 +115,31 @@ const getSourceUrl = (function(path, include, exclude) {
} }
})("../packages/", new RegExp("packages/.*/src.ts/.*\.ts$"), new RegExp("/node_modules/|src.ts/.*browser.*")); })("../packages/", new RegExp("packages/.*/src.ts/.*\.ts$"), new RegExp("/node_modules/|src.ts/.*browser.*"));
function codeContextify(context) {
const ethers = context.require("./packages/ethers");
context.ethers = ethers;
context.BigNumber = ethers.BigNumber;
context.constants = ethers.constants;
context.utils = ethers.utils;
context.arrayify = ethers.utils.arrayify;
context.hexlify = ethers.utils.hexlify;
context.hexValue = ethers.utils.hexValue;
context.Wallet = ethers.Wallet;
context._inspect = function(value) {
if (context.BigNumber.isBigNumber(value)) {
return `{ BigNumber: ${ JSON.stringify(value.toString()) } }`;
}
if (value && typeof(value.length) === "number" && typeof(value) !== "string") {
return "[ " + Array.prototype.map.call(value, (i) => context._inspect(i)).join(", ") + " ]";
}
return JSON.stringify(value);
}
}
module.exports = { module.exports = {
title: "ethers", title: "ethers",
subtitle: "v5.0-beta", subtitle: "v5.0-beta",
@ -127,6 +152,8 @@ module.exports = {
"banner": "-----\n\nDocumentation: [html](https://docs-beta.ethers.io/)\n\n-----\n\n" "banner": "-----\n\nDocumentation: [html](https://docs-beta.ethers.io/)\n\n-----\n\n"
}, },
codeContextify: codeContextify,
getSourceUrl: getSourceUrl, getSourceUrl: getSourceUrl,
codeRoot: "../", codeRoot: "../",
@ -197,6 +224,7 @@ module.exports = {
"link-wiki-bloomfilter": { name: "Bloom Filter", url: "https:/\/en.wikipedia.org/wiki/Bloom_filter" }, "link-wiki-bloomfilter": { name: "Bloom Filter", url: "https:/\/en.wikipedia.org/wiki/Bloom_filter" },
"link-wiki-bruteforce": "https:/\/en.wikipedia.org/wiki/Brute-force_attack", "link-wiki-bruteforce": "https:/\/en.wikipedia.org/wiki/Brute-force_attack",
"link-wiki-cryptographichash": "https:/\/en.wikipedia.org/wiki/Cryptographic_hash_function", "link-wiki-cryptographichash": "https:/\/en.wikipedia.org/wiki/Cryptographic_hash_function",
"link-wiki-ecrecover": { name: "ECDSA Public Key Recovery", url: "https:/\/en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Public_key_recovery" },
"link-wiki-homoglyph": "https:/\/en.wikipedia.org/wiki/IDN_homograph_attack", "link-wiki-homoglyph": "https:/\/en.wikipedia.org/wiki/IDN_homograph_attack",
"link-wiki-hmac": "https:/\/en.wikipedia.org/wiki/HMAC", "link-wiki-hmac": "https:/\/en.wikipedia.org/wiki/HMAC",
"link-wiki-iban": "https:/\/en.wikipedia.org/wiki/International_Bank_Account_Number", "link-wiki-iban": "https:/\/en.wikipedia.org/wiki/International_Bank_Account_Number",

@ -18,7 +18,17 @@ itself have body.
_heading: Directive Format _heading: Directive Format
_code: fragment.txt _code: @lang<text>
\_DIRECTIVE: VALUE @<LINK> @EXTENSION<PARAMETER>
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)
_heading: Flatworm Directives @<flatworm-directive> _heading: Flatworm Directives @<flatworm-directive>
@ -29,16 +39,22 @@ 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 them. If an option is specified, it is avaialble as a name for
intern linking. There should only be one ``_section:`` per page. intern linking. There should only be one ``_section:`` per page.
**Extensions:** @INHERIT, @SRC, @NAV, @NOTE
_definition: **_subsection:** //TITLE// _definition: **_subsection:** //TITLE//
A //subsection// has its **TITLE** in an H2 font. Subsections are linked A //subsection// has its **TITLE** in an H2 font. Subsections are linked
to in //Table of Contents// and have a dividing line drawn above 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 them. If an option is specified, it is avaialble as a name for
internal linking. internal linking.
**Extensions:** @INHERIT, @SRC, @NOTE
_definition: **_heading:** //TITLE// _definition: **_heading:** //TITLE//
A //heading// has its **TITLE** in an H3 font. If an option is specified, A //heading// has its **TITLE** in an H3 font. If an option is specified,
it is available as a name for internal linking. it is available as a name for internal linking.
**Extensions:** @INHERIT, @SRC, @NOTE
_definition: **_definition:** //TERM// _definition: **_definition:** //TERM//
A //definition// has its **TERM** bolded and the markdown body is A //definition// has its **TERM** bolded and the markdown body is
indented. indented.
@ -47,15 +63,18 @@ _definition: **_property:** //SIGNATURE//
A //property// has its JavaScript **SIGNATURE** formatted and the A //property// has its JavaScript **SIGNATURE** formatted and the
markdown body is indented. markdown body is indented.
**Extensions:** @SRC
_definition: **_note:** //TITLE// _definition: **_note:** //TITLE//
A //note// is placed in a blue bordered-box to draw attention to it. A //note// is placed in a blue bordered-box to draw attention to it.
_definition: **_warning:** //TITLE// _definition: **_warning:** //TITLE//
A //warning// is placed in an orange bordered-box to draw attention to it. A //warning// is placed in an orange bordered-box to draw attention to it.
_definition: **_code:** //FILENAME// _definition: **_code:** //TITLE//
A //code// reads the **FILENAME** and depending on the extension A //code// creates a code block.
adjusts it.
**Extensions:** @LANG
For JavaScript files, the file is executed, with ``\/\/!`` replaced For JavaScript files, the file is executed, with ``\/\/!`` replaced
with the result of the last statement and ``\/\/!error`` is replaced with the result of the last statement and ``\/\/!error`` is replaced
@ -75,16 +94,73 @@ used to reset the indentation.
_heading: Examples @<> _heading: Examples @<>
_code: examples.txt _code: @lang<text>
\_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: heading
// Some code goes here
while(1);
\_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
_subsection: Markdown @<flatworm-markdown> _subsection: Markdown @<flatworm-markdown>
The markdown is simple and does not have the flexibility of The markdown is simple and does not have the flexibility of
other dialects, but allows for **bold**, //italic//, other dialects, but allows for **bold**, //italic//,
__underlined__, ``monospaced``, ^^super-scripted^^ text, __underlined__, ``monospaced``, super^^script^^ and ~~strike~~
supporting [links](flatworm-markdown) and lists. text, supporting [links](flatworm-markdown) and lists.
_code: markdown.txt _code: @lang<text>
**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.
_subsection: Configuration @<flatworm-config> _subsection: Configuration @<flatworm-config>
@ -96,26 +172,34 @@ the top of the source folder.
TODO: example JSON and example JS TODO: example JSON and example JS
_subsection: Extended Directive Functions @<flatworm-extended-directive-functions> _subsection: Extensions @<flatworm-extensions>
_heading: @INHERIT\<markdown> _heading: @INHERIT\<markdown>
Adds an inherits description to a directive. The //markdown// may contain links. Adds an inherits description to a directive. The //markdown// may contain links.
This extended directive function is available for:
- _section _heading: @LANG\<text>
- _subsetion
- _heading Set the language the code should be syntax-highlighted for. If "javascript", the
code will be evaluated.
- javascript (will be evaluated)
- script (useful for JavaScript but that should not be evaluated)
- shell
- text
_heading: @NAV\<text> _heading: @NAV\<text>
Sets the name in the breadcrumbs when not the current node. Sets the name in the breadcrumbs when not the current node.
This extended directive function is available for:
- _section _heading: @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.
_heading: @SRC\<text> _heading: @SRC\<text>
@ -125,10 +209,3 @@ will be linked to by a link next to the //directive//.
This extended directive function requires an advanced ``config.js`` [[flatworm-config]] This extended directive function requires an advanced ``config.js`` [[flatworm-config]]
file since it requires a JavaScript function. file since it requires a JavaScript function.
This extended directive function is available for:
- _section
- _subsetion
- _heading
- _property

@ -8,14 +8,23 @@ manually from sub-packages under the [@ethersproject](link-ethers-npm)
but for most projects, the umbrella package is the easiest way to but for most projects, the umbrella package is the easiest way to
get started. get started.
_code: installing.txt _code: @lang<shell>
/home/ricmoo> npm install --save ethers@next
_subsection: Importing _subsection: Importing
_heading: Node.js _heading: Node.js
_code: importing-node.source _code: @lang<script>
// CommonJS
const { ethers } = require("ethers");
// ES6 or TypeScript
import { ethers } from "ethers";
_heading: Web Browser _heading: Web Browser
@ -26,4 +35,7 @@ yourself.
For quick demos or prototyping though, it can be loaded in your For quick demos or prototyping though, it can be loaded in your
Web Applications from our CDN. Web Applications from our CDN.
_code: importing-browser.txt _code: @lang<html>
<script src="https://cdn.ethers.io/lib/ethers-5.0.esm.min.js"
type="application/javascipt"></script>

@ -5,18 +5,42 @@ _subsection: BigNumber
_heading: Namespace _heading: Namespace
Since [[bignumber]] is used quite frequently, it has been moved to Since [[bignumber]] is used quite frequently, it has been moved to
the top level of the umbrella package. the top level of the umbrella package.
_code: bignumber-namespace.txt
_code: @lang<script>
// v4
ethers.utils.BigNumber
ethers.utils.BigNumberish
// v5
ethers.BigNumber
ethers.BigNumberish
_heading: Creating Instances _heading: Creating Instances
The ``bigNumberify`` method was always preferred over the constructor The ``bigNumberify`` method was always preferred over the constructor
since it could short-circuit an object instantiation for [[bignumber] since it could short-circuit an object instantiation for [[bignumber]
objects (since they are immutable). This has been moved to a static objects (since they are immutable). This has been moved to a static
``from`` class method. ``from`` class method.
_code: bignumber-creating.txt
_code: @lang<script>
// v4
new ethers.utils.BigNumber(someValue)
ethers.utils.bigNumberify(someValue);
// v5
// - Constructor is private
// - Removed `bigNumberify`
ethers.BigNumber.from(someValue)
_subsection: Contracts _subsection: Contracts
_code: contracts.txt
_code: @lang<script>
// @TODO
_subsection: Errors _subsection: Errors
@ -26,7 +50,37 @@ have been moved to [[logger]] instances, which can include a per-package
version string. version string.
Global error fucntions have been moved [[logger]] class methods. Global error fucntions have been moved [[logger]] class methods.
_code: errors.txt
_code: @lang<script>
// 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(...)
_subsection: Interface _subsection: Interface
@ -37,26 +91,116 @@ contract interface operations without the need for object inspection and
special edge cases. special edge cases.
_heading: Functions _heading: Functions
_code: interface-functions.txt
_code: @lang<script>
// 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)
_heading: Events _heading: Events
_code: interface-events.txt
_code: @lang<script>
// 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)
_heading: Inspection _heading: Inspection
Interrogating properties about a function or event can now (mostly) be Interrogating properties about a function or event can now (mostly) be
done directly on the [[abi-fragment]] object. done directly on the [[abi-fragment]] object.
_code: interface-inspection.txt
_code:
// 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)
_subsection: Utilities _subsection: Utilities
_heading: Renaming _heading: Renaming
_code: utils.txt
_code: @lang<script>
// @TODO
_subsection: Wallet _subsection: Wallet
_heading: Mnemonic Phrases _heading: Mnemonic Phrases
The **mnemonic** phrase and related properties have been merged into The **mnemonic** phrase and related properties have been merged into
a single ``mnemonic`` object, which also now includes the ``locale``. a single ``mnemonic`` object, which also now includes the ``locale``.
_code: wallet.txt
_code: @lang<script>
// 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