Compare commits
No commits in common. "v5.0.0-beta.174" and "main" have entirely different histories.
v5.0.0-bet
...
main
@ -1,147 +0,0 @@
|
|||||||
version: 2.1
|
|
||||||
|
|
||||||
executors:
|
|
||||||
machine_executor:
|
|
||||||
machine: true
|
|
||||||
working_directory: ~/repo
|
|
||||||
|
|
||||||
commands:
|
|
||||||
build-and-test:
|
|
||||||
parameters:
|
|
||||||
node-version:
|
|
||||||
type: string
|
|
||||||
default: "10.16.3"
|
|
||||||
test-script:
|
|
||||||
type: string
|
|
||||||
default: "test-node"
|
|
||||||
upgrade-chrome:
|
|
||||||
type: string
|
|
||||||
default: ""
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
|
|
||||||
- when:
|
|
||||||
condition: << parameters.upgrade-chrome >>
|
|
||||||
steps:
|
|
||||||
- run:
|
|
||||||
name: Upgrade chrome
|
|
||||||
command: |
|
|
||||||
sudo apt-get purge chromium-browser
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libappindicator1 fonts-liberation
|
|
||||||
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
|
|
||||||
sudo dpkg -i google-chrome*.deb
|
|
||||||
google-chrome --version
|
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Update C build environment
|
|
||||||
command: |
|
|
||||||
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install gcc-6 g++-6 libusb-1.0-0-dev libudev-dev
|
|
||||||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6
|
|
||||||
|
|
||||||
# - run:
|
|
||||||
# name: Prepare to run parity
|
|
||||||
# command: |
|
|
||||||
# mkdir -p /tmp/parity/keys
|
|
||||||
# cp -r admin/test-parity/parity-keys /tmp/parity/keys/DevelopmentChain
|
|
||||||
# cp admin/test-parity/parity-dev.* /tmp/parity
|
|
||||||
# chmod -R 777 /tmp/parity
|
|
||||||
# ls -la /tmp/parity
|
|
||||||
|
|
||||||
# - run:
|
|
||||||
# name: Starting Parity
|
|
||||||
# command: |
|
|
||||||
# docker run -d \
|
|
||||||
# -p 8545:8545 \
|
|
||||||
# -p 8546:8546 \
|
|
||||||
# -p 30303:30303 \
|
|
||||||
# -p 30303:30303/udp \
|
|
||||||
# --name parity \
|
|
||||||
# -v /tmp/parity:/home/parity/.local/share/io.parity.ethereum parity/parity:v2.4.8-stable \
|
|
||||||
# --chain /home/parity/.local/share/io.parity.ethereum/parity-dev.json \
|
|
||||||
# --unlock=0x7454a8F5a7c7555d79B172C89D20E1f4e4CC226C \
|
|
||||||
# --password /home/parity/.local/share/io.parity.ethereum/parity-dev.pwds \
|
|
||||||
# --min-gas-price 1000000000 \
|
|
||||||
# --jsonrpc-interface all
|
|
||||||
|
|
||||||
# - run:
|
|
||||||
# name: Waiting for Parity to be ready
|
|
||||||
# command: |
|
|
||||||
# for i in `seq 1 20`;
|
|
||||||
# do
|
|
||||||
# nc -z localhost 8545 && echo Success && exit 0
|
|
||||||
# echo -n .
|
|
||||||
# sleep 2
|
|
||||||
# done
|
|
||||||
# docker ps -a
|
|
||||||
# docker logs parity
|
|
||||||
# echo Failed waiting for Parity && exit 1
|
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Run << parameters.test-script >> with node version << parameters.node-version >>
|
|
||||||
command: |
|
|
||||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
|
|
||||||
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
|
|
||||||
nvm install << parameters.node-version >>
|
|
||||||
node -v
|
|
||||||
npm -v
|
|
||||||
gcc --version
|
|
||||||
npm ci
|
|
||||||
npm run bootstrap
|
|
||||||
npm run << parameters.test-script >>
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
node-v8:
|
|
||||||
description: "test with node version 8"
|
|
||||||
executor: machine_executor
|
|
||||||
steps:
|
|
||||||
- build-and-test:
|
|
||||||
node-version: "8.16.1"
|
|
||||||
test-script: "test-node"
|
|
||||||
|
|
||||||
node-v10:
|
|
||||||
description: "test with node version 10"
|
|
||||||
executor: machine_executor
|
|
||||||
steps:
|
|
||||||
- build-and-test:
|
|
||||||
node-version: "10.16.3"
|
|
||||||
test-script: "test-node"
|
|
||||||
|
|
||||||
node-v12:
|
|
||||||
description: "test with node version 12"
|
|
||||||
executor: machine_executor
|
|
||||||
steps:
|
|
||||||
- build-and-test:
|
|
||||||
node-version: "12.13.1"
|
|
||||||
test-script: "test-node"
|
|
||||||
|
|
||||||
browser-esm:
|
|
||||||
description: "test browser with es6 module"
|
|
||||||
executor: machine_executor
|
|
||||||
steps:
|
|
||||||
- build-and-test:
|
|
||||||
node-version: "12.13.1"
|
|
||||||
test-script: "test-browser-esm"
|
|
||||||
upgrade-chrome: "true"
|
|
||||||
|
|
||||||
browser-umd:
|
|
||||||
description: "test browser with es3 module"
|
|
||||||
executor: machine_executor
|
|
||||||
steps:
|
|
||||||
- build-and-test:
|
|
||||||
node-version: "12.13.1"
|
|
||||||
test-script: "test-browser-umd"
|
|
||||||
|
|
||||||
|
|
||||||
workflows:
|
|
||||||
version: 2
|
|
||||||
all:
|
|
||||||
jobs:
|
|
||||||
- node-v8
|
|
||||||
- node-v10
|
|
||||||
- node-v12
|
|
||||||
- browser-esm
|
|
||||||
- browser-umd
|
|
||||||
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
github: ethers-io
|
||||||
|
custom: [ 'https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2', 'https://www.buymeacoffee.com/ricmoo' ]
|
||||||
81
.github/ISSUE_TEMPLATE/bug-report-legacy.yml
vendored
Normal file
81
.github/ISSUE_TEMPLATE/bug-report-legacy.yml
vendored
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
name: "Bug Report v5 (legacy)"
|
||||||
|
description: "Open an issue for a bug in Ethers v5 (legacy)"
|
||||||
|
title: "Add Bug Title Here"
|
||||||
|
labels: [ "investigate", "v5" ]
|
||||||
|
assignees:
|
||||||
|
- ricmoo
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
**READ THIS FIRST** and follow all instructions, please. `:)`
|
||||||
|
|
||||||
|
Thank you for taking the time to report an issue. This form is for reporting **bugs within ethers**, specifically for the legacy v5 branch.
|
||||||
|
|
||||||
|
If you are **new to ethers** or *uncertain* whether this is a bug in ethers, a bug in another framework or a bug in your own code, please [start a discussion](https://github.com/ethers-io/ethers.js/discussions) first.
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Ethers Version
|
||||||
|
description: What version of ethers are you using? Before opening an issue, please make sure you are up to date.
|
||||||
|
placeholder: 5.y.z
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: search-terms
|
||||||
|
attributes:
|
||||||
|
label: Search Terms
|
||||||
|
description: Have you searched for answers [in the documentation](https://docs.ethers.org), through [the issues](https://github.com/ethers-io/ethers.js/issues) and [on the discusions](https://github.com/ethers-io/ethers.js/discussions)? Please include the search terms you have tried. This helps us add more keywords where needed.
|
||||||
|
placeholder: e.g. abi, network, utf8
|
||||||
|
- type: textarea
|
||||||
|
id: about-the-bug
|
||||||
|
attributes:
|
||||||
|
label: Describe the Problem
|
||||||
|
description: Please describe what you expected to happen vs what did happen?
|
||||||
|
placeholder: What happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: code-snippet
|
||||||
|
attributes:
|
||||||
|
label: Code Snippet
|
||||||
|
description: If possible, please include a **short and concise** code snippets that can reproduce this issue. Ideally code that can be pasted into the [Ethers Playground](https://playground.ethers.org).
|
||||||
|
placeholder: e.g. provider.getBlockNumber()
|
||||||
|
render: shell
|
||||||
|
- type: textarea
|
||||||
|
id: contract-abi
|
||||||
|
attributes:
|
||||||
|
label: Contract ABI
|
||||||
|
description: If this involves a contract, please include any **concise and relevant** ABI fragments.
|
||||||
|
placeholder: e.g. [ 'function balanceOf(address owner) view returns (uint)' ]
|
||||||
|
render: shell
|
||||||
|
- type: textarea
|
||||||
|
id: errors
|
||||||
|
attributes:
|
||||||
|
label: Errors
|
||||||
|
description: If there is an error, please include the **entire error** (redacting any sensitive information).
|
||||||
|
placeholder: "e.g. Error: invalid name (code='INVALID_ARGUMENT, ...)"
|
||||||
|
render: shell
|
||||||
|
- type: dropdown
|
||||||
|
id: environment
|
||||||
|
attributes:
|
||||||
|
label: Environment
|
||||||
|
description: What environment, platforms or frameworks are you using? Select all that apply.
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Ethereum (mainnet/ropsten/rinkeby/goerli)
|
||||||
|
- Altcoin - Please specify (e.g. Polygon)
|
||||||
|
- node.js (v12 or newer)
|
||||||
|
- node.js (older than v12)
|
||||||
|
- Browser (Chrome, Safari, etc)
|
||||||
|
- React Native/Expo/JavaScriptCore
|
||||||
|
- Hardhat
|
||||||
|
- Geth
|
||||||
|
- Parity
|
||||||
|
- Ganache
|
||||||
|
- Other (please specify)
|
||||||
|
- type: input
|
||||||
|
id: other-envrionment
|
||||||
|
attributes:
|
||||||
|
label: Environment (Other)
|
||||||
|
placeholder: anything else?
|
||||||
81
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
Normal file
81
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
name: "Bug Report v6 (latest)"
|
||||||
|
description: "Open an issue for a bug in Ethers v6 (latest)"
|
||||||
|
title: "Add Bug Title Here"
|
||||||
|
labels: [ "investigate", "v6" ]
|
||||||
|
assignees:
|
||||||
|
- ricmoo
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
**READ THIS FIRST** and follow all instructions, please. `:)`
|
||||||
|
|
||||||
|
Thank you for taking the time to report an issue. This form is for reporting **bugs within ethers**.
|
||||||
|
|
||||||
|
If you are **new to ethers** or *uncertain* whether this is a bug in ethers, a bug in another framework or a bug in your own code, please [start a discussion](https://github.com/ethers-io/ethers.js/discussions) first.
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Ethers Version
|
||||||
|
description: What version of ethers are you using? Before opening an issue, please make sure you are up to date.
|
||||||
|
placeholder: 6.y.z
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: search-terms
|
||||||
|
attributes:
|
||||||
|
label: Search Terms
|
||||||
|
description: Have you searched for answers [in the documentation](https://docs.ethers.org), through [the issues](https://github.com/ethers-io/ethers.js/issues) and [on the discusions](https://github.com/ethers-io/ethers.js/discussions)? Please include the search terms you have tried. This helps us add more keywords where needed.
|
||||||
|
placeholder: e.g. abi, network, utf8
|
||||||
|
- type: textarea
|
||||||
|
id: about-the-bug
|
||||||
|
attributes:
|
||||||
|
label: Describe the Problem
|
||||||
|
description: Please describe what you expected to happen vs what did happen?
|
||||||
|
placeholder: What happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: code-snippet
|
||||||
|
attributes:
|
||||||
|
label: Code Snippet
|
||||||
|
description: If possible, please include a **short and concise** code snippets that can reproduce this issue. Ideally code that can be pasted into the [Ethers Playground](https://playground.ethers.org).
|
||||||
|
placeholder: e.g. provider.getBlockNumber()
|
||||||
|
render: shell
|
||||||
|
- type: textarea
|
||||||
|
id: contract-abi
|
||||||
|
attributes:
|
||||||
|
label: Contract ABI
|
||||||
|
description: If this involves a contract, please include any **concise and relevant** ABI fragments.
|
||||||
|
placeholder: e.g. [ 'function balanceOf(address owner) view returns (uint)' ]
|
||||||
|
render: shell
|
||||||
|
- type: textarea
|
||||||
|
id: errors
|
||||||
|
attributes:
|
||||||
|
label: Errors
|
||||||
|
description: If there is an error, please include the **entire error** (redacting any sensitive information).
|
||||||
|
placeholder: "e.g. Error: invalid name (code='INVALID_ARGUMENT, ...)"
|
||||||
|
render: shell
|
||||||
|
- type: dropdown
|
||||||
|
id: environment
|
||||||
|
attributes:
|
||||||
|
label: Environment
|
||||||
|
description: What environment, platforms or frameworks are you using? Select all that apply.
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Ethereum (mainnet/ropsten/rinkeby/goerli)
|
||||||
|
- Altcoin - Please specify (e.g. Polygon)
|
||||||
|
- node.js (v12 or newer)
|
||||||
|
- node.js (older than v12)
|
||||||
|
- Browser (Chrome, Safari, etc)
|
||||||
|
- React Native/Expo/JavaScriptCore
|
||||||
|
- Hardhat
|
||||||
|
- Geth
|
||||||
|
- Parity
|
||||||
|
- Ganache
|
||||||
|
- Other (please specify)
|
||||||
|
- type: input
|
||||||
|
id: other-envrionment
|
||||||
|
attributes:
|
||||||
|
label: Environment (Other)
|
||||||
|
placeholder: anything else?
|
||||||
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
23
.github/ISSUE_TEMPLATE/documentation.yml
vendored
Normal file
23
.github/ISSUE_TEMPLATE/documentation.yml
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
name: Documentation
|
||||||
|
description: Documentation update, change or suggestion
|
||||||
|
title: "Documentation Title"
|
||||||
|
labels: ["documentation"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Please include anything about the [documentation](https://docs.ethers.org) you would like to see improved.
|
||||||
|
|
||||||
|
- Missing information or details?
|
||||||
|
- Spelling or Grammar mistakes?
|
||||||
|
- Wrong Information?
|
||||||
|
- Dead or wrong links?
|
||||||
|
- Something needs code examples?
|
||||||
|
- General feedback or anything else?
|
||||||
|
- type: textarea
|
||||||
|
id: suggestion
|
||||||
|
attributes:
|
||||||
|
label: Suggestion
|
||||||
|
placeholder: e.g. please add an example for ropsten
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
26
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
Normal file
26
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
name: Feature Request
|
||||||
|
description: Suggest a new feature or addition to Ethers
|
||||||
|
title: "Feature Request Title"
|
||||||
|
labels: [ "enhancement" ]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
The best place to start a new feature request is by starting an [Idea discussion](https://github.com/ethers-io/ethers.js/discussions), to mull over the feature, discuss current options and think through the impact on the overall library.
|
||||||
|
|
||||||
|
Keep in mind that features increase the library size, and may require additional dependencies. Ethers strives to remain lean and the number of dependencies low, so many features may make more sense as ancillary packages.
|
||||||
|
- type: textarea
|
||||||
|
id: about-the-feature
|
||||||
|
attributes:
|
||||||
|
label: Describe the Feature
|
||||||
|
description: Please describe the feature, the problem it is solving, your solution and alternatives you've considered.
|
||||||
|
placeholder: e.g. I want Ethers to be more/less magical.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: code-example
|
||||||
|
attributes:
|
||||||
|
label: Code Example
|
||||||
|
description: Optionally, provide an example of how the feature would be used in code.
|
||||||
|
placeholder: e.g. provider.doMagic()
|
||||||
|
render: shell
|
||||||
48
.github/workflows/generate-docs.yml
vendored
Normal file
48
.github/workflows/generate-docs.yml
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
name: Generate Documentation
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- "src.ts/**"
|
||||||
|
- "docs.wrm/**"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docs:
|
||||||
|
name: Generate Documentation
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
environment: ethers-tests
|
||||||
|
env:
|
||||||
|
FAUCET_PRIVATEKEY: ${{ secrets.FAUCET_PRIVATEKEY }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 20.x
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: "0"
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Install Flatworm
|
||||||
|
run: npm install --no-save 'https://github.com/ricmoo/flatworm.git#tsdocs'
|
||||||
|
|
||||||
|
- name: Build Documentation
|
||||||
|
run: node node_modules/flatworm/lib/cli-test ./docs.wrm/config.mjs
|
||||||
|
|
||||||
|
- name: Upload documentation to to docs.ethers.org
|
||||||
|
uses: ethers-io/sync-s3-action@main
|
||||||
|
with:
|
||||||
|
aws_access_key_id: ${{ secrets.DOCS_AWS_ACCESS_KEY_ID }}
|
||||||
|
aws_secret_access_key: ${{ secrets.DOCS_AWS_SECRET_ACCESS_KEY}}
|
||||||
|
aws_s3_bucket: ethers.org
|
||||||
|
source_folder: 'output/docs/'
|
||||||
|
destination_prefix: 'docs/'
|
||||||
|
aws_cloudfront_id: ${{ secrets.DOCS_AWS_CLOUDFRONT_ID }}
|
||||||
46
.github/workflows/test-browser.yml
vendored
Normal file
46
.github/workflows/test-browser.yml
vendored
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
name: Browser Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- "src.ts/**"
|
||||||
|
- "lib.esm/**"
|
||||||
|
- "lib.commonjs/**"
|
||||||
|
- "misc/test-browser/**"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-browser:
|
||||||
|
name: Run Browser Tests
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
environment: ethers-tests
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install Node.js
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 20.x
|
||||||
|
|
||||||
|
- name: Install and run Geth
|
||||||
|
uses: ethers-io/run-geth-action@main
|
||||||
|
|
||||||
|
- name: Insall Chrome
|
||||||
|
run: wget -q 'https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb' && sudo dpkg --install google-chrome-stable_current_amd64.deb
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Build browser bundles (from TypeScript)
|
||||||
|
run: npm run build-dist
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: npm run test-browser
|
||||||
109
.github/workflows/test-ci.yml
vendored
Normal file
109
.github/workflows/test-ci.yml
vendored
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
name: CI Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- "src.ts/**"
|
||||||
|
- "lib.esm/**"
|
||||||
|
- "lib.commonjs/**"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
test-node:
|
||||||
|
#if: ${{ false }} # disable for now
|
||||||
|
|
||||||
|
name: Run Node.js Tests
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
environment: ethers-tests
|
||||||
|
env:
|
||||||
|
FAUCET_PRIVATEKEY: ${{ secrets.FAUCET_PRIVATEKEY }}
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
node-version: [ 18.x, 20.x ]
|
||||||
|
test-type: [ esm, commonjs ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
|
- name: Install and run Geth
|
||||||
|
uses: ethers-io/run-geth-action@main
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Build ESM and CommonJS (from TypeScript)
|
||||||
|
run: npm run build-all
|
||||||
|
|
||||||
|
- name: Run tests (${{ matrix.test-type }})
|
||||||
|
run: npm run test-${{ matrix.test-type }}
|
||||||
|
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
#if: ${{ false }} # disable for now
|
||||||
|
|
||||||
|
name: Generate Coverage Report
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
environment: ethers-tests
|
||||||
|
env:
|
||||||
|
FAUCET_PRIVATEKEY: ${{ secrets.FAUCET_PRIVATEKEY }}
|
||||||
|
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 20.x
|
||||||
|
|
||||||
|
- name: Install and run Geth
|
||||||
|
uses: ethers-io/run-geth-action@main
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Build ESM (from TypeScript)
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
|
- name: Run coverage tests
|
||||||
|
run: npm run test-coverage
|
||||||
|
|
||||||
|
- name: Store coverage summary artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: coverage-summary
|
||||||
|
path: ./output/summary.txt
|
||||||
|
|
||||||
|
- name: Tar coverage files
|
||||||
|
run: tar -cvf ./output/coverage.tar ./output/lcov-report/
|
||||||
|
|
||||||
|
- name: Store full coverage artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: coverage-complete
|
||||||
|
path: ./output/coverage.tar
|
||||||
|
|
||||||
|
- name: Upload coverage to build.ethers.org
|
||||||
|
uses: ethers-io/sync-s3-action@main
|
||||||
|
with:
|
||||||
|
aws_access_key_id: ${{ secrets.BUILD_AWS_ACCESS_KEY_ID }}
|
||||||
|
aws_secret_access_key: ${{ secrets.BUILD_AWS_SECRET_ACCESS_KEY}}
|
||||||
|
aws_s3_bucket: ethers.org
|
||||||
|
source_folder: 'output/'
|
||||||
|
destination_prefix: 'build/output/'
|
||||||
|
aws_cloudfront_id: ${{ secrets.BUILD_AWS_CLOUDFRONT_ID }}
|
||||||
86
.github/workflows/test-env.yml
vendored
Normal file
86
.github/workflows/test-env.yml
vendored
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
name: Environment Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
test-tsc-env:
|
||||||
|
name: Test TypeScript Environments
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
env:
|
||||||
|
npm_config_registry: http://localhost:8043
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
tsModuleResolution: [ "node", "node16", "nodenext" ]
|
||||||
|
tsModule: [ "commonjs", "es2020" ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Use Node.js
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 20.x
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
path: "faux_modules/ethers"
|
||||||
|
|
||||||
|
- name: Copy tests to working directory
|
||||||
|
run: cp -r faux_modules/ethers/testcases/test-env/test-tsc/* .
|
||||||
|
|
||||||
|
- name: Prepare setup moduleResolution=${{ matrix.tsModuleResolution }} module=${{ matrix.tsModule }}
|
||||||
|
run: node prepare.cjs ${{ matrix.tsModuleResolution }} ${{ matrix.tsModule }}
|
||||||
|
|
||||||
|
- name: Dump Config
|
||||||
|
run: cat package.json tsconfig.json
|
||||||
|
|
||||||
|
- name: Install and run Faux Registry
|
||||||
|
uses: ethers-io/hijack-npm-action@main
|
||||||
|
|
||||||
|
- name: Install packages
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Dump Faux Logs
|
||||||
|
run: cat .fauxNpm.log
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: npm test
|
||||||
|
|
||||||
|
test-angular:
|
||||||
|
name: Test Angular Environment
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
env:
|
||||||
|
npm_config_registry: http://localhost:8043
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Use Node.js
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 20.x
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
path: "faux_modules/ethers"
|
||||||
|
|
||||||
|
- name: Copy tests to working directory
|
||||||
|
run: cp -r faux_modules/ethers/testcases/test-env/angular/* .
|
||||||
|
|
||||||
|
- name: Install and run Faux Registry
|
||||||
|
uses: ethers-io/hijack-npm-action@main
|
||||||
|
|
||||||
|
- name: Install packages
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Build project
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
25
.gitignore
vendored
25
.gitignore
vendored
@ -1,20 +1,7 @@
|
|||||||
node_modules/
|
node_modules/**
|
||||||
obsolete/
|
output/**
|
||||||
.DS_Store
|
|
||||||
.tmp/
|
**/*.save
|
||||||
dist/types/shims/
|
|
||||||
shims/*.d.ts
|
|
||||||
**/*.swp
|
**/*.swp
|
||||||
*~
|
**/*.tgz
|
||||||
|
dist/*.gz
|
||||||
# Weird intermediate files tsc generates for references
|
|
||||||
**/src.ts/*.js
|
|
||||||
|
|
||||||
# Weird file Browserify sometimes leaves lying around.
|
|
||||||
**/*.tmp-browserify-*
|
|
||||||
|
|
||||||
lerna-debug.log
|
|
||||||
|
|
||||||
packages/*/tsconfig.tsbuildinfo
|
|
||||||
|
|
||||||
packages/testcases/input/nameprep/**
|
|
||||||
|
|||||||
31
.npmignore
Normal file
31
.npmignore
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
# Ignore TypeScript config and caches
|
||||||
|
tsconfig.*.json
|
||||||
|
tsconfig.tsbuildinfo
|
||||||
|
rollup.config.js
|
||||||
|
output/**
|
||||||
|
docs.wrm/**
|
||||||
|
.github/**
|
||||||
|
|
||||||
|
# Ignore admin scripts and files
|
||||||
|
src.ts/_admin/**
|
||||||
|
lib.commonjs/_admin/**
|
||||||
|
lib.esm/_admin/**
|
||||||
|
types/_admin/**
|
||||||
|
reporter.cjs
|
||||||
|
package-commonjs.json
|
||||||
|
.github/workflows/test-ci.yml
|
||||||
|
|
||||||
|
# Ignore test cases
|
||||||
|
src.ts/_tests/**
|
||||||
|
lib.commonjs/_tests/**
|
||||||
|
lib.esm/_tests/**
|
||||||
|
types/_tests/**
|
||||||
|
testcases/**
|
||||||
|
|
||||||
|
# Ignore random junk
|
||||||
|
.DS_Store
|
||||||
|
node_modules/**
|
||||||
|
misc/**
|
||||||
|
**/*.tgz
|
||||||
|
dist/*.gz
|
||||||
1
.npmrc
Normal file
1
.npmrc
Normal file
@ -0,0 +1 @@
|
|||||||
|
@tornado:registry=https://git.tornado.ws/api/packages/tornado-packages/npm/
|
||||||
647
CHANGELOG.md
647
CHANGELOG.md
@ -1,358 +1,339 @@
|
|||||||
Changelog
|
Change Log
|
||||||
=========
|
==========
|
||||||
|
|
||||||
This change log is managed by `scripts/cmds/update-versions` but may be manually updated.
|
This change log is maintained by `src.ts/_admin/update-changelog.ts` but may also be manually updated.
|
||||||
|
|
||||||
ethers/v5.0.0-beta.174 (2020-02-25 14:57)
|
ethers/v6.12.0 (2024-04-17 01:09)
|
||||||
-----------------------------------------
|
---------------------------------
|
||||||
|
|
||||||
- Reduced default Provider quorum for testnets. ([1cfab31](https://github.com/ethers-io/ethers.js/commit/1cfab3173c3d0519beffc054efe73f70b7d28501))
|
- Added Linea Sepolia network and Infura endpoint ([#4655](https://github.com/ethers-io/ethers.js/issues/4655); [b4aaab8](https://github.com/ethers-io/ethers.js/commit/b4aaab8d39fe47f8a1a296fa442f0856f84faf03)).
|
||||||
- Added JSON-RPC debugging on error responses. ([ad27600](https://github.com/ethers-io/ethers.js/commit/ad27600c699827858e7343adff2d4fa622248e42))
|
- Do not send unsubscribe messages to destroyed Providers ([#4678](https://github.com/ethers-io/ethers.js/issues/4678); [c45935e](https://github.com/ethers-io/ethers.js/commit/c45935e29ca0dd1ecdf1277fa1107246041be580)).
|
||||||
- Fixed setLogLevel to affect global logging. ([ac51a88](https://github.com/ethers-io/ethers.js/commit/ac51a88c2913d7055e050c91d7d96bb42abf6656))
|
- Get definitive network from InfuraProvider when using InfuraWebSocketProvider ([38e32d8](https://github.com/ethers-io/ethers.js/commit/38e32d82145eb289e5179f9b6b11f4a9225a7022)).
|
||||||
- Renamed interface getTopic to getEventTopic. ([f61f34b](https://github.com/ethers-io/ethers.js/commit/f61f34bfb295bafee3b7ee426efa696aaa9bbafe))
|
- Better error messages for transaction field mismatch ([#4659](https://github.com/ethers-io/ethers.js/issues/4659); [9230aa0](https://github.com/ethers-io/ethers.js/commit/9230aa0b9a88b5241915a8d6afa8a522d35abd5d)).
|
||||||
- Fix log parsing when no matching topic hash is found. ([#733](https://github.com/ethers-io/ethers.js/issues/733); [a5d2ec5](https://github.com/ethers-io/ethers.js/commit/a5d2ec534f75b21eebe69a789a3c43c33014a825), [4b8e198](https://github.com/ethers-io/ethers.js/commit/4b8e198bf209fcf0aea55018d8940355ea4345de), [89ac9f4](https://github.com/ethers-io/ethers.js/commit/89ac9f4f298ac340c4429e8ebdacd29962eba7f4))
|
- Added prevRandao to block ([#3372](https://github.com/ethers-io/ethers.js/issues/3372); [ec6a754](https://github.com/ethers-io/ethers.js/commit/ec6a754f0c8647dae59c73b2589225cb200d83dd)).
|
||||||
|
- Added Polygon Amoy testnet ([#4645](https://github.com/ethers-io/ethers.js/issues/4645); [1717abb](https://github.com/ethers-io/ethers.js/commit/1717abbf29a14a6f6b106e479fe9a5b1f8768dc4)).
|
||||||
ethers/v5.0.0-beta.173 (2020-02-12 17:09)
|
- Added Chainstack provider ([#2741](https://github.com/ethers-io/ethers.js/issues/2741); [014004d](https://github.com/ethers-io/ethers.js/commit/014004d9402d7fd8c15553792cfb7a8a84ed327a)).
|
||||||
-----------------------------------------
|
- Added deep convertion to Result for toObject and toArray ([#4681](https://github.com/ethers-io/ethers.js/issues/4681); [03bfe2a](https://github.com/ethers-io/ethers.js/commit/03bfe2a4f7b29b15cd90127974b7fc1d8b03edf9)).
|
||||||
|
- Added EIP-4844 broadcast support ([92bad88](https://github.com/ethers-io/ethers.js/commit/92bad88261a5d8a538535a7d5528162fe5010527)).
|
||||||
- Added experimental EipWrappedProvider. ([944600d](https://github.com/ethers-io/ethers.js/commit/944600d779564c500ab98d3265286a0717642614))
|
- Fix ignored throttle parameters ([#4663](https://github.com/ethers-io/ethers.js/issues/4663); [12772e9](https://github.com/ethers-io/ethers.js/commit/12772e9498b70f8538838f30e16f3792ea90e173)).
|
||||||
- Updated signature for JsonRpcProvider.send to match EIP-1193. ([b962b59](https://github.com/ethers-io/ethers.js/commit/b962b59ab72e67bc4566a361964e42cf1b791025))
|
|
||||||
- Added binary literal support to ASM grammar. ([375bd15](https://github.com/ethers-io/ethers.js/commit/375bd15594a3179432e8452d819d91ea72b4bdd8))
|
ethers/v6.11.1 (2024-02-14 13:13)
|
||||||
- Added explicit pop placeholders to ASM dialect. ([a6b696d](https://github.com/ethers-io/ethers.js/commit/a6b696d8bd03c4027b52fe23745f066d158f1420))
|
---------------------------------
|
||||||
- Added position independent code option for asm. ([89615c5](https://github.com/ethers-io/ethers.js/commit/89615c59d385a58fa79b6bbd8eae53c30e45fe96))
|
|
||||||
- Added ASM semantic checking and the Pop placeholder. ([a33bf0e](https://github.com/ethers-io/ethers.js/commit/a33bf0e37f4f969cc03b85ebf0dbadcf3e9b068a))
|
- Throw an error when attempting to derive from a master path from a non-master node ([#4551](https://github.com/ethers-io/ethers.js/issues/4551); [556fdd9](https://github.com/ethers-io/ethers.js/commit/556fdd91d9b6bf7db4041bb099e66b2080e1a985)).
|
||||||
- Better type safety for defineReadOnly. ([e7adc84](https://github.com/ethers-io/ethers.js/commit/e7adc84a972968f39a983efb6f21b6ceaacd6cc5))
|
- Allow ENS wildcards with labels up to 255 bytes wide; discussed with ENS and deemed safe ([#4543](https://github.com/ethers-io/ethers.js/issues/4543); [7f14bde](https://github.com/ethers-io/ethers.js/commit/7f14bdebf1aef6760462a1c2437c31f002b984fe)).
|
||||||
- Fixed CLI sandbox quiting after prompt entry. ([ff9bc2a](https://github.com/ethers-io/ethers.js/commit/ff9bc2a282e617125bbca76702dec85149661390))
|
- Enforce string is passed to toUtf8Bytes ([#4583](https://github.com/ethers-io/ethers.js/issues/4583); [f45bb87](https://github.com/ethers-io/ethers.js/commit/f45bb87aefaf2c6c3a4991f6e30a81c227ae83c0)).
|
||||||
|
- Fix transaction.index not being populated on some backends ([#4591](https://github.com/ethers-io/ethers.js/issues/4591); [7f0e140](https://github.com/ethers-io/ethers.js/commit/7f0e140d5e3925a42e8bb2ac9eb1ba3fbd939864)).
|
||||||
ethers/v5.0.0-beta.172 (2020-02-04 00:59)
|
|
||||||
-----------------------------------------
|
ethers/v6.11.0 (2024-02-08 20:26)
|
||||||
|
---------------------------------
|
||||||
- Synced GitHub issue cache. ([13dbf1f](https://github.com/ethers-io/ethers.js/commit/13dbf1f965eab344d2a304f7612d19ea96391261))
|
|
||||||
- Better typing for Timers. ([5622f70](https://github.com/ethers-io/ethers.js/commit/5622f703d962993442623ef1450a595825c4efa8))
|
- Allow transaction encoding for inferred type transactions ([f02211d](https://github.com/ethers-io/ethers.js/commit/f02211d055567b51373b5faa2c3dc6efe0523618)).
|
||||||
- Safer transaction serialization, matching signature.v with chainId. ([#708](https://github.com/ethers-io/ethers.js/issues/708); [edb7c5d](https://github.com/ethers-io/ethers.js/commit/edb7c5da91ce271688561364d867998b0f0675e3))
|
- Added EIP-4788, receipts root and state root fields to Block ([#4570](https://github.com/ethers-io/ethers.js/issues/4570); [c5f126f](https://github.com/ethers-io/ethers.js/commit/c5f126faf7d826b6a99df0ee578ff3d0ef409381)).
|
||||||
- Fixed Opcode typo and added check to prevent future typos. ([15bb840](https://github.com/ethers-io/ethers.js/commit/15bb8409077f96b22e8bd60c426cddd015454e6b))
|
- Added EIP-4844 fields to Provider classes and formatter ([#4570](https://github.com/ethers-io/ethers.js/issues/4570); [7b4f2c1](https://github.com/ethers-io/ethers.js/commit/7b4f2c1a74db411829b5e8ef758bfa2ee21e5890)).
|
||||||
- Renamed AST nodes for teh assembler. ([f02c7db](https://github.com/ethers-io/ethers.js/commit/f02c7db4109d1785b4528757aa50f24948e896ae))
|
- Assert BrowserProvider receives an EIP-1193 provider to fail early when passing undefined ethereum object ([b69f43b](https://github.com/ethers-io/ethers.js/commit/b69f43bc6f35da881ca7a0c8ccc5fda92edd076d)).
|
||||||
- Added timeout to waitForTransaction. ([#477](https://github.com/ethers-io/ethers.js/issues/477); [bacc440](https://github.com/ethers-io/ethers.js/commit/bacc4403979fa423890e269e7a5c7d11c6891a9f))
|
- Add timeout to ContractTransactionResponse wait ([#4497](https://github.com/ethers-io/ethers.js/issues/4497); [095de51](https://github.com/ethers-io/ethers.js/commit/095de51e605a9b88576e5e34fd55a6e32befa4eb)).
|
||||||
- Added CLI for asm package. ([aafa42a](https://github.com/ethers-io/ethers.js/commit/aafa42a32b2a5c7481a409ad048dfc06112c6599))
|
- Allow override keyword in human-readable ABI and improve error messages ([#4514](https://github.com/ethers-io/ethers.js/issues/4514), [#4548](https://github.com/ethers-io/ethers.js/issues/4548); [be5ec2d](https://github.com/ethers-io/ethers.js/commit/be5ec2d327a503b2e5fc0f37c47eee9e828f8e23)).
|
||||||
- Prevent Signer.checkTransaction from creating conflicting from properties. ([1decb13](https://github.com/ethers-io/ethers.js/commit/1decb1379902b60a15925b9b1de39633393db825))
|
- Expand Contract sub-class to accept BaseContract super-class constructor arguments ([#4538](https://github.com/ethers-io/ethers.js/issues/4538); [98496bc](https://github.com/ethers-io/ethers.js/commit/98496bc48ec23ce0d9c21d3c6c87e5b1b796a610)).
|
||||||
- Include asm in generated TypeScript dependencies. ([ba29618](https://github.com/ethers-io/ethers.js/commit/ba296188960fb345dfdab12f2bb3ed3dc5eab51a))
|
- Allow network for default provider to be null to select mainnet ([#4501](https://github.com/ethers-io/ethers.js/issues/4501); [b6bf7ab](https://github.com/ethers-io/ethers.js/commit/b6bf7aba62fb38839cd01858432b801cc5c28a11)).
|
||||||
- Clean up some asm checks and dead code. ([fa317eb](https://github.com/ethers-io/ethers.js/commit/fa317ebc032f8a5f9fb2dd10e23496252ae744e1))
|
- Allow long dnsEncode names with optional length parameter ([#4543](https://github.com/ethers-io/ethers.js/issues/4543); [a136348](https://github.com/ethers-io/ethers.js/commit/a1363483a56b0dee342595c8f44ed8fcce7ecca9)).
|
||||||
- More contained Opcode API. ([da8153c](https://github.com/ethers-io/ethers.js/commit/da8153c87753b79e5e4cd34d484b8e0e717426d9))
|
- Fix parseLog signature when receiving read-only array for topics ([#4029](https://github.com/ethers-io/ethers.js/issues/4029), [#4459](https://github.com/ethers-io/ethers.js/issues/4459); [20cd8a2](https://github.com/ethers-io/ethers.js/commit/20cd8a23eaf8e8a14e2b51f7f64da4cb3e32fccb)).
|
||||||
- Added initial codedrop for the asm package. ([0296594](https://github.com/ethers-io/ethers.js/commit/0296594aba8d1e90e9ef7a18d2324f6cac815953))
|
- Use Secure endpoints for BNB on Etherscan ([#4525](https://github.com/ethers-io/ethers.js/issues/4525); [1f6e188](https://github.com/ethers-io/ethers.js/commit/1f6e1882515195bd67f0bce9fe347ec05107324b)).
|
||||||
|
- Added holesky network and related end-points for supporting providers ([c6e6c43](https://github.com/ethers-io/ethers.js/commit/c6e6c432574a0b7e55c300ab3e470aafdace28b3)).
|
||||||
ethers/v5.0.0-beta.171 (2020-02-01 05:05)
|
- Added EIP-4844 BLOb transactions ([#4554](https://github.com/ethers-io/ethers.js/issues/4554); [9c1e82e](https://github.com/ethers-io/ethers.js/commit/9c1e82e1230526ebcd62902890c4f24b1f7f7d79)).
|
||||||
-----------------------------------------
|
- Normalize EIP-712 types before computing the payload ([#4541](https://github.com/ethers-io/ethers.js/issues/4541); [56c1361](https://github.com/ethers-io/ethers.js/commit/56c1361ee83db8b68859caf0850c95ff70e7e306)).
|
||||||
|
- Updated thrid-part provider URLs for QuickNode ([2b4891d](https://github.com/ethers-io/ethers.js/commit/2b4891d86e72e849079cb1dc98b18e158b0c0620)).
|
||||||
- Added CLI for asm package. ([aafa42a](https://github.com/ethers-io/ethers.js/commit/aafa42a32b2a5c7481a409ad048dfc06112c6599))
|
- Fixed normalization and abstracted EIP-712 Array parsing ([#4541](https://github.com/ethers-io/ethers.js/issues/4541); [8f99601](https://github.com/ethers-io/ethers.js/commit/8f99601df1f26a8ba4d6d9dea5e033e7f688107e)).
|
||||||
- Added more flatworm documentation. ([1c85fe9](https://github.com/ethers-io/ethers.js/commit/1c85fe95b2b536828e83087676becba85c9a90bb))
|
- Updated third-party provider network URLs ([#4542](https://github.com/ethers-io/ethers.js/issues/4542); [84ca14f](https://github.com/ethers-io/ethers.js/commit/84ca14f1ffc5afbdd7f4c26a9b734ec5951eee3c)).
|
||||||
- Prevent Signer.checkTransaction from creating conflicting from properties. ([1decb13](https://github.com/ethers-io/ethers.js/commit/1decb1379902b60a15925b9b1de39633393db825))
|
- Added additional sepolia testnets ([4efef76](https://github.com/ethers-io/ethers.js/commit/4efef76e8cab0acaf1b2ba231a0148f9381bb1ee)).
|
||||||
- Include asm in generated TypeScript dependencies. ([ba29618](https://github.com/ethers-io/ethers.js/commit/ba296188960fb345dfdab12f2bb3ed3dc5eab51a))
|
- Fix EIP-712 type aliases for uint and int ([#4541](https://github.com/ethers-io/ethers.js/issues/4541); [43fb9c2](https://github.com/ethers-io/ethers.js/commit/43fb9c233696aeaa80b1c2b0e5fafce90e0ad508)).
|
||||||
- Clean up some asm checks and dead code. ([fa317eb](https://github.com/ethers-io/ethers.js/commit/fa317ebc032f8a5f9fb2dd10e23496252ae744e1))
|
- Fixed typo in Error string ([#4539](https://github.com/ethers-io/ethers.js/issues/4539); [7882905](https://github.com/ethers-io/ethers.js/commit/78829050853093bc5291ae78fc5a904044759aa0)).
|
||||||
- More contained Opcode API. ([da8153c](https://github.com/ethers-io/ethers.js/commit/da8153c87753b79e5e4cd34d484b8e0e717426d9))
|
- Better debugging output on fetch errors ([bee07a0](https://github.com/ethers-io/ethers.js/commit/bee07a0750b448a9d13c2d57014bcf27f43e2ed7)).
|
||||||
- Added initial codedrop for the asm package. ([0296594](https://github.com/ethers-io/ethers.js/commit/0296594aba8d1e90e9ef7a18d2324f6cac815953))
|
|
||||||
|
ethers/v6.10.0 (2024-01-12 19:46)
|
||||||
ethers/v5.0.0-beta.171 (2020-01-29 21:41)
|
---------------------------------
|
||||||
-----------------------------------------
|
|
||||||
|
- Limit decoded result imflation ratio from ABI-encoded data ([#4537](https://github.com/ethers-io/ethers.js/issues/4537); [1b4debd](https://github.com/ethers-io/ethers.js/commit/1b4debd4a9e61d171bfc60590116facb8bdbd2da)).
|
||||||
- Better solc support in CLI; it will search the local pacakge for an existing solc version. ([7428776](https://github.com/ethers-io/ethers.js/commit/7428776f75222d5c07282bc29c3dd8ed99f5d2cc))
|
|
||||||
- Update ENS registry address and lower default quorum for testnets. ([edb49da](https://github.com/ethers-io/ethers.js/commit/edb49da15518f25b3d60813ebb84f54171e308f3))
|
ethers/v6.9.2 (2024-01-02 19:12)
|
||||||
- Exposed isBytes and isBytesLike in ethers.utils. ([99329b0](https://github.com/ethers-io/ethers.js/commit/99329b013ce7f3af301d40c41f7eb35bff288910))
|
--------------------------------
|
||||||
|
|
||||||
ethers/v5.0.0-beta.170 (2020-01-21 20:37)
|
- Fix Base58 padding for string representation of binary data ([#4527](https://github.com/ethers-io/ethers.js/issues/4527); [ccac24a](https://github.com/ethers-io/ethers.js/commit/ccac24a5b0a4d07a4b639c1c4d0a44703e32d418)).
|
||||||
-----------------------------------------
|
|
||||||
|
ethers/v6.9.1 (2023-12-19 04:53)
|
||||||
- Better, easier and more provider testing. ([e0d1d38](https://github.com/ethers-io/ethers.js/commit/e0d1d3866d2559f39627254873a0a1d4c0fcaf3d))
|
--------------------------------
|
||||||
- Fixed out-of-bounds difficulty in getBlock, which can affect PoA networks. ([#711](https://github.com/ethers-io/ethers.js/issues/711); [251882c](https://github.com/ethers-io/ethers.js/commit/251882ced4379931ec82ba28a4db10bc7dbf3580))
|
|
||||||
|
- Fix uncatchable issue when sending transactions over JSON-RPC and provide some retry-recovery for missing v ([#4513](https://github.com/ethers-io/ethers.js/issues/4513); [1802215](https://github.com/ethers-io/ethers.js/commit/180221574c5d2af9ad85404af4fab8752d3d5029)).
|
||||||
ethers/v5.0.0-beta.169 (2020-01-20 19:42)
|
|
||||||
-----------------------------------------
|
ethers/v6.9.0 (2023-11-27 06:15)
|
||||||
|
--------------------------------
|
||||||
- Fixed imports after refactor. ([adf5622](https://github.com/ethers-io/ethers.js/commit/adf56229c6cc83003d319ea9a004677e2555d478))
|
|
||||||
- Refactor some enum names and add UTF-8 error support to the umbrella package. ([931da2f](https://github.com/ethers-io/ethers.js/commit/931da2f77446fc9266cf07f0d7d78d4376625005))
|
- Use provider-specified suggested priority fee when available, otherwise fallback onto existing logic of 1 gwei ([#4463](https://github.com/ethers-io/ethers.js/issues/4463); [f8f11c7](https://github.com/ethers-io/ethers.js/commit/f8f11c754aa2c9b541db73d3bde66a8ffa5146f0)).
|
||||||
- Allow arbitrary apiKey for UrlJsonRpcProvider. ([5878b54](https://github.com/ethers-io/ethers.js/commit/5878b54d6eded1329a6dc3b4023f876a87f72b6e))
|
- Add auto-detected static network support to providers and allow customizing socket provider options ([#4199](https://github.com/ethers-io/ethers.js/issues/4199), [#4418](https://github.com/ethers-io/ethers.js/issues/4418), [#4441](https://github.com/ethers-io/ethers.js/issues/4441); [4681b83](https://github.com/ethers-io/ethers.js/commit/4681b83d516ab2eb41ddb68b5021c97e14c6f2cf)).
|
||||||
- Added more general error handling (e.g. error, ignore, replace) for calling toUtf8String. ([a055edb](https://github.com/ethers-io/ethers.js/commit/a055edb5855b96fdf179403458c1694b96fd906c))
|
- Added Base network to AlchemyProvider ([#4384](https://github.com/ethers-io/ethers.js/issues/4384); [9e74d14](https://github.com/ethers-io/ethers.js/commit/9e74d14432e6efebdff21b9a7d2e6143af55e143)).
|
||||||
|
- Fixed ParamType formatting causing bad tuple full and minimal ABI output ([#4329](https://github.com/ethers-io/ethers.js/issues/4329), [#4479](https://github.com/ethers-io/ethers.js/issues/4479); [2b67488](https://github.com/ethers-io/ethers.js/commit/2b6748815169abf2c99a647131875c13b8b6a787)).
|
||||||
ethers/v5.0.0-beta.168 (2020-01-18 21:46)
|
- Adjust for provider config weight when kicking off a request in FallbackProvider ([#4298](https://github.com/ethers-io/ethers.js/issues/4298); [da34e35](https://github.com/ethers-io/ethers.js/commit/da34e3569e95357d9469209d926cb645f0750bfa)).
|
||||||
-----------------------------------------
|
- More robust FallbackProvider broadcast ([#4186](https://github.com/ethers-io/ethers.js/issues/4186), [#4297](https://github.com/ethers-io/ethers.js/issues/4297), [#4442](https://github.com/ethers-io/ethers.js/issues/4442); [e2485b8](https://github.com/ethers-io/ethers.js/commit/e2485b8ef927d18c7a15d2d29b3b0feffec9991a)).
|
||||||
|
- Added safe and finalized provider events ([#3921](https://github.com/ethers-io/ethers.js/issues/3921); [a92766e](https://github.com/ethers-io/ethers.js/commit/a92766e56ad04185625037d84fc28adaac7fae8c)).
|
||||||
- Much more resiliant FallbackProvider which can ignore properties that are only approximate and supports per-provider priorities. ([#635](https://github.com/ethers-io/ethers.js/issues/635), [#588](https://github.com/ethers-io/ethers.js/issues/588); [f4bcf24](https://github.com/ethers-io/ethers.js/commit/f4bcf24a257a17ec9beb98f3d0b3682de543534c))
|
|
||||||
- Fixed some typing for receipts and logs. ([#497](https://github.com/ethers-io/ethers.js/issues/497); [ea102ef](https://github.com/ethers-io/ethers.js/commit/ea102ef7c4fa5df7b9389fbc8a2947bbbd4c471e))
|
ethers/v6.8.1 (2023-11-01 16:08)
|
||||||
- Abstracting mnemonic phrases. ([#685](https://github.com/ethers-io/ethers.js/issues/685); [92a383f](https://github.com/ethers-io/ethers.js/commit/92a383ff0dad4587e44953efca3c6ab795a1b1bd))
|
--------------------------------
|
||||||
- Sync GitHub issues. ([75e1a37](https://github.com/ethers-io/ethers.js/commit/75e1a37bb5935d5d538ffcfce5b0073e1334d457))
|
|
||||||
- Fixed 304 status for fetchJson. ([c66d81e](https://github.com/ethers-io/ethers.js/commit/c66d81e96f7c9b0808f181085ffe1c92f6219d46))
|
- Fixed typo in error description when converting values to arrays ([#4427](https://github.com/ethers-io/ethers.js/issues/4427), [#4446](https://github.com/ethers-io/ethers.js/issues/4446); [8fed2f8](https://github.com/ethers-io/ethers.js/commit/8fed2f84768ace4bf3e5742c931a74841da7c637)).
|
||||||
|
- Fix invalid token nonpayable being included in formatted constructor ([#4412](https://github.com/ethers-io/ethers.js/issues/4412); [2e0bd90](https://github.com/ethers-io/ethers.js/commit/2e0bd90744b8e76fcf03f75a66cb0061d50f7bd9)).
|
||||||
ethers/v5.0.0-beta.167 (2020-01-11 04:16)
|
- Add ENS support for Sepolia ([#4422](https://github.com/ethers-io/ethers.js/issues/4422); [1da50ae](https://github.com/ethers-io/ethers.js/commit/1da50ae286da01e58a70bb8df8aa5cc5d260e33e)).
|
||||||
-----------------------------------------
|
|
||||||
|
ethers/v6.8.0 (2023-10-10 22:42)
|
||||||
- Fixed testcases for provider changes. ([90ed07c](https://github.com/ethers-io/ethers.js/commit/90ed07c74e7230ea0f02288b140d497d8b9779e0))
|
--------------------------------
|
||||||
- Add support for legacy flat signatures with recid instead of normalized v. ([245cd0e](https://github.com/ethers-io/ethers.js/commit/245cd0e48e07eef35f5bf45ee7fe5ed5ef31338a))
|
|
||||||
- Fix TransactionResponse to have chainId instead of legacy networkId. ([#700](https://github.com/ethers-io/ethers.js/issues/700); [72b3bc9](https://github.com/ethers-io/ethers.js/commit/72b3bc9909074893038c768f3da1564ed96a6a20))
|
- Replicated former ENS normalize behaviour for empty strings and update namehash testcases ([125ff11](https://github.com/ethers-io/ethers.js/commit/125ff1189b9cefb8abfd7da9c104c75e382a50cc)).
|
||||||
- Fixed splitSignature computing wrong v for BytesLike. ([#700](https://github.com/ethers-io/ethers.js/issues/700); [4151c0e](https://github.com/ethers-io/ethers.js/commit/4151c0eacd22287e2369a8656ffa00359db6f84b))
|
- Initial shortMessage support for errors ([#4241](https://github.com/ethers-io/ethers.js/issues/4241); [d6a8c14](https://github.com/ethers-io/ethers.js/commit/d6a8c14d907cf8b90347444c0186b83a5db2e293)).
|
||||||
- Added dist files for hardware-wallets. ([c846649](https://github.com/ethers-io/ethers.js/commit/c84664953d2f50ee0d704a8aa18fe6c08668dabb))
|
- Fixed resolving ENS addresses used as from parameters ([#3961](https://github.com/ethers-io/ethers.js/issues/3961); [2616f4c](https://github.com/ethers-io/ethers.js/commit/2616f4c30c82bd45449b73fa37ef269d60a07d80)).
|
||||||
- Browser support (with dist files) for Ledger. ([6f7fbf3](https://github.com/ethers-io/ethers.js/commit/6f7fbf3858c82417933a5e5595a919c0ec0487c7))
|
- Merge: 9a4b7534 0c9c23b0 Merge branch 'v5.8-progress' ([cd5f0fe](https://github.com/ethers-io/ethers.js/commit/cd5f0fe03f2137fbc47e295f8db38a5151111e72)).
|
||||||
|
- Allow more loose input format for RLP encoder ([#4402](https://github.com/ethers-io/ethers.js/issues/4402); [9a4b753](https://github.com/ethers-io/ethers.js/commit/9a4b7534458fc79a0654b0eb57fc956bffa02a2f)).
|
||||||
ethers/v5.0.0-beta.166 (2020-01-10 03:09)
|
- Update to latest noble crypto libraries ([#3975](https://github.com/ethers-io/ethers.js/issues/3975); [b27faa0](https://github.com/ethers-io/ethers.js/commit/b27faa02ac8f90e2e54b188e8139c59d98c469e3)).
|
||||||
-----------------------------------------
|
- More robust configuration options for FetchRequest getUrl functions ([#4353](https://github.com/ethers-io/ethers.js/issues/4353); [9541f2f](https://github.com/ethers-io/ethers.js/commit/9541f2f70cd7f5c6f3caf93f5a3d5e34eae5281a)).
|
||||||
|
- Ignore blockTag when calling Etherscan if it is the default block tag ([dcea9b3](https://github.com/ethers-io/ethers.js/commit/dcea9b353619d85878ad2ba340ae17e5c285d558)).
|
||||||
- Relaxed joinSignature API to allow SignauteLike. ([602e6a8](https://github.com/ethers-io/ethers.js/commit/602e6a8973480299843a0158f75451a2c6aac749))
|
|
||||||
- Initial code drop of new hardware wallet package. ([2e8f5ca](https://github.com/ethers-io/ethers.js/commit/2e8f5ca7ed498261079da75713b18f3370dfd236))
|
ethers/v6.7.1 (2023-08-15 03:08)
|
||||||
- Added more docs. ([381a72d](https://github.com/ethers-io/ethers.js/commit/381a72ddaa7fb59ef2ded84d228296d693df05c3))
|
--------------------------------
|
||||||
|
|
||||||
ethers/v5.0.0-beta.165 (2020-01-09 03:31)
|
- Prevent destroyed providers from emitting network detection errors ([7d41730](https://github.com/ethers-io/ethers.js/commit/7d4173049edc3b4ff2de1971c3ecca3b08588651)).
|
||||||
-----------------------------------------
|
- Fix VSCode reported lint issues ([#4153](https://github.com/ethers-io/ethers.js/issues/4153), [#4156](https://github.com/ethers-io/ethers.js/issues/4156), [#4158](https://github.com/ethers-io/ethers.js/issues/4158), [#4159](https://github.com/ethers-io/ethers.js/issues/4159); [4eb84da](https://github.com/ethers-io/ethers.js/commit/4eb84da865a82a27c5113c38102b6b710096958e), [203dfc3](https://github.com/ethers-io/ethers.js/commit/203dfc33b9c8e72c9cdfe0a349ac763ef17a4484)).
|
||||||
|
- Add gasPrice to Polygon feeData for type 0 and type 1 legacy transactions ([#4315](https://github.com/ethers-io/ethers.js/issues/4315); [0df3ab9](https://github.com/ethers-io/ethers.js/commit/0df3ab93137039de1e1986bbfe9a5b32ceffa8a4)).
|
||||||
- Fixed require resolution for CLI scripts. ([c04f9a7](https://github.com/ethers-io/ethers.js/commit/c04f9a7fff727bb04a4aa3a0fa05fd5cd8e795a6))
|
|
||||||
- Added new URLs for default ETC (and ETC testnets) providers. ([#351](https://github.com/ethers-io/ethers.js/issues/351); [3c184ac](https://github.com/ethers-io/ethers.js/commit/3c184ace21aafbb27f4d44cce1bb738af899d59f))
|
ethers/v6.7.0 (2023-08-02 23:52)
|
||||||
|
--------------------------------
|
||||||
ethers/v5.0.0-beta.164 (2020-01-07 19:57)
|
|
||||||
-----------------------------------------
|
- Fixed receipt wait not throwing on reverted transactions ([25fef4f](https://github.com/ethers-io/ethers.js/commit/25fef4f8d756f5bbf5a2a05e38233248a8eb43ac)).
|
||||||
|
- Added custom priority fee to Optimism chain (via telegram) ([ff80b04](https://github.com/ethers-io/ethers.js/commit/ff80b04f31da21496e72d3687cecd1c01efaecc5)).
|
||||||
- Use better Description typing. ([2d5492c](https://github.com/ethers-io/ethers.js/commit/2d5492cd2ee722c818c249244af7b5bea05d67b0))
|
- Add context to Logs that fail decoding due to ABI issues to help debugging ([f3c46f2](https://github.com/ethers-io/ethers.js/commit/f3c46f22994d194ff78b3b176407b2ecb7af1c77)).
|
||||||
- Better property access on ABI decoded results. ([#698](https://github.com/ethers-io/ethers.js/issues/698); [13f50ab](https://github.com/ethers-io/ethers.js/commit/13f50abd847f7ddcc7e54c102da54e2d23b86fae))
|
- Added new exports for FallbackProviderOptions and FetchUrlFeeDataNetworkPlugin ([#2828](https://github.com/ethers-io/ethers.js/issues/2828), [#4160](https://github.com/ethers-io/ethers.js/issues/4160); [b1dbbb0](https://github.com/ethers-io/ethers.js/commit/b1dbbb0de3f10a3d9e12d6a84ad5c52bea25c7f6)).
|
||||||
- Better typing support for Description. ([d0f4642](https://github.com/ethers-io/ethers.js/commit/d0f4642f6d2c9f5119f1910a0082894c60e81191))
|
- Allow overriding pollingInterval in JsonRpcProvider constructor (via discord) ([f42f258](https://github.com/ethers-io/ethers.js/commit/f42f258beb305a06e563ad16522f095a72da32eb)).
|
||||||
- Fixed resolveName when name is an address with an invalid checksum. ([#694](https://github.com/ethers-io/ethers.js/issues/694); [1e72fc7](https://github.com/ethers-io/ethers.js/commit/1e72fc7d6f7c3be4410dbdcfbab9a0463ceb52bd))
|
- Fixed FallbackProvider priority sorting ([#4150](https://github.com/ethers-io/ethers.js/issues/4150); [78538eb](https://github.com/ethers-io/ethers.js/commit/78538eb100addd135d29e60c9fa4fed3946278fa)).
|
||||||
|
- Added linea network to InfuraProvider and Network ([#4184](https://github.com/ethers-io/ethers.js/issues/4184), [#4190](https://github.com/ethers-io/ethers.js/issues/4190); [d3e5e2c](https://github.com/ethers-io/ethers.js/commit/d3e5e2c45b28c377f306091acfc024e30c49ef20)).
|
||||||
ethers/v5.0.0-beta.163 (2020-01-06 18:57)
|
- Added whitelist support to getDefaultProvider ([82bb936](https://github.com/ethers-io/ethers.js/commit/82bb936542e29c6441ac8dc2d3ebbdd4edb708ee)).
|
||||||
-----------------------------------------
|
- Add Polygon RPC endpoints to the default provider ([#3689](https://github.com/ethers-io/ethers.js/issues/3689); [23704a9](https://github.com/ethers-io/ethers.js/commit/23704a9c44d5857817e138fb19d44ce2103ca005)).
|
||||||
|
- Added customizable quorum to FallbackProvider ([#4160](https://github.com/ethers-io/ethers.js/issues/4160); [8f0a509](https://github.com/ethers-io/ethers.js/commit/8f0a50921a12a866addcf5b0fabc576bfc287689)).
|
||||||
- Added function to generate CREATE2 addresses. ([#697](https://github.com/ethers-io/ethers.js/issues/697); [eb26a6d](https://github.com/ethers-io/ethers.js/commit/eb26a6d95022a241c44f859e7b2f29646afb4914))
|
- Added basic Gas Station support via a NetworkPlugin ([#2828](https://github.com/ethers-io/ethers.js/issues/2828); [229145d](https://github.com/ethers-io/ethers.js/commit/229145ddf566a962517588eaeed155734c7d4598)).
|
||||||
- Force constructor name to be null (instead of undefined). ([a648f2b](https://github.com/ethers-io/ethers.js/commit/a648f2bd1e5e52a3662896f04fe7025884866972))
|
- Add BNB URLs to EtherscanProvider networks ([ec39abe](https://github.com/ethers-io/ethers.js/commit/ec39abe067259fad4ea8607a6c5aece61890eb41)).
|
||||||
- Added documentation uploading script. ([e593aba](https://github.com/ethers-io/ethers.js/commit/e593aba2946c98820b0c2edf9c5dab6cb30c7402))
|
- Added tests for JSON format ([#4248](https://github.com/ethers-io/ethers.js/issues/4248); [ba36079](https://github.com/ethers-io/ethers.js/commit/ba36079a285706694532ce726568c4c447acad47)).
|
||||||
- Added Czech wordlist to default wordlists export. ([#691](https://github.com/ethers-io/ethers.js/issues/691); [5724fa5](https://github.com/ethers-io/ethers.js/commit/5724fa5d9c6fe73f14ec8bdea1f7226a222537ef))
|
- Use empty string for unnamed parameters in JSON output instead of undefined ([#4248](https://github.com/ethers-io/ethers.js/issues/4248); [8c2652c](https://github.com/ethers-io/ethers.js/commit/8c2652c8cb4d054207d89688d30930869d9d3f8b)).
|
||||||
- Added Czech BIP-39 wordlist. ([#691](https://github.com/ethers-io/ethers.js/issues/691); [f54f06b](https://github.com/ethers-io/ethers.js/commit/f54f06b5c8092997fd3c9055d69a3e0796ce44f3))
|
- Return undefined for Contract properties that do not exist instead of throwing an error ([#4266](https://github.com/ethers-io/ethers.js/issues/4266); [5bf7b34](https://github.com/ethers-io/ethers.js/commit/5bf7b3494ed62952fc387b4368a0bdc86dfe163e)).
|
||||||
- Updated README. ([e809ead](https://github.com/ethers-io/ethers.js/commit/e809eadf8d608cd8c8a78c08a2e3547dd09156cf))
|
|
||||||
- Updating docs. ([184c459](https://github.com/ethers-io/ethers.js/commit/184c459fab0d089a8a879584b72e5eb3560b33ce))
|
ethers/v6.6.7 (2023-07-28 14:50)
|
||||||
- Merge branch 'yuetloo-ethers-v5-beta' into ethers-v5-beta ([06cafe3](https://github.com/ethers-io/ethers.js/commit/06cafe3437ef129b47f5f9c02f4759f2c4854d3c))
|
--------------------------------
|
||||||
- Add circleci and parity test files ([fdf0980](https://github.com/ethers-io/ethers.js/commit/fdf0980663ffead0faf3e9b7b233b22ca1574e21))
|
|
||||||
- Fixed typo in package test dist scripts. ([9c78c7f](https://github.com/ethers-io/ethers.js/commit/9c78c7fee69d07733048d898d58205ae7f5c82d7))
|
- Prevent malformed logs from preventing other logs being decoded ([#4275](https://github.com/ethers-io/ethers.js/issues/4275); [0dca645](https://github.com/ethers-io/ethers.js/commit/0dca645632d73488bf6ad460e0d779361a537bbe)).
|
||||||
|
- Allow visibility on human-readable constructors ([#4278](https://github.com/ethers-io/ethers.js/issues/4278); [3a52201](https://github.com/ethers-io/ethers.js/commit/3a52201fe2ba68a00105cca2c0901da5ffa18d6b)).
|
||||||
ethers/v5.0.0-beta.162 (2019-11-25 0:02)
|
|
||||||
----------------------------------------
|
ethers/v6.6.6 (2023-07-28 01:14)
|
||||||
|
--------------------------------
|
||||||
- Update elliptic package to protect from Minerva timing attack. ([#666](https://github.com/ethers-io/ethers.js/issues/666); [cf036e1](https://github.com/ethers-io/ethers.js/commit/cf036e1ffad3340fcf1c7559d0032493ccc08e6e))
|
|
||||||
- Browser and node testing works again. ([4470477](https://github.com/ethers-io/ethers.js/commit/4470477d7fd3031f2f3a1fbd9c538468c33c7350))
|
- Better error message when passing invalid overrides object into a contract deployment ([#4182](https://github.com/ethers-io/ethers.js/issues/4182); [aa2ea3d](https://github.com/ethers-io/ethers.js/commit/aa2ea3d5296956fd0d40b83888e1ca053bb250ee)).
|
||||||
|
|
||||||
ethers/v5.0.0-beta.161 (2019-11-23 21:43)
|
ethers/v6.6.5 (2023-07-24 00:04)
|
||||||
-----------------------------------------
|
--------------------------------
|
||||||
|
|
||||||
- Updated dist files (sorted package.json to reduce package version change chatter). ([f308ba3](https://github.com/ethers-io/ethers.js/commit/f308ba3540ed0d282d099456d0369873ad9596b0))
|
- Reflect symbols in the Contract Proxy to target ([#4084](https://github.com/ethers-io/ethers.js/issues/4048); [ac2f5e5](https://github.com/ethers-io/ethers.js/commit/ac2f5e563b8ec0e91a931470eb6ea58b0c01fb3d)).
|
||||||
- Stubs for adding throttle support. ([2f0e679](https://github.com/ethers-io/ethers.js/commit/2f0e679f0bc81bf901cf60a79e50f9715cddec5a))
|
- Allow arrays of address for indexed filter topics ([#4259](https://github.com/ethers-io/ethers.js/issues/4259); [93af87c](https://github.com/ethers-io/ethers.js/commit/93af87c447eeb77090e29bd940612603b3f74026)).
|
||||||
- Refactor wordlists. ([abab9f6](https://github.com/ethers-io/ethers.js/commit/abab9f6aa27d1870d1053e7caa951408b86c454d))
|
- Fixed filter encoding for bytesX ([#4244](https://github.com/ethers-io/ethers.js/issues/4244); [fa3a883](https://github.com/ethers-io/ethers.js/commit/fa3a883ff7c88611ce766f58bdd4b8ac90814470)).
|
||||||
- Browser testcases work again. ([c11c2e2](https://github.com/ethers-io/ethers.js/commit/c11c2e2e3376a6764f07ed443245823f2792b8cc))
|
- Fix JSON formatting for tuple arrays ([#4237](https://github.com/ethers-io/ethers.js/issues/4237); [a8bc49b](https://github.com/ethers-io/ethers.js/commit/a8bc49bdcf07a51b35f38cf209db27e116cc1a59)).
|
||||||
- Added dist files for non-English wordlists. ([3d75c52](https://github.com/ethers-io/ethers.js/commit/3d75c52dac668af5eeede3e7764dadd3055a0707))
|
- Better error messages when parsing fragment strings ([#4246](https://github.com/ethers-io/ethers.js/issues/4246); [e36b6c3](https://github.com/ethers-io/ethers.js/commit/e36b6c35b7bc777c9adbe0055b32b31a13185240)).
|
||||||
- Sync GitHub issue cache. ([29f0e9d](https://github.com/ethers-io/ethers.js/commit/29f0e9dd627a7b4b7f772300497f27718c9ecc7b))
|
- Include the missing fragment key and args when no matching Contract method or event is present ([#3809](https://github.com/ethers-io/ethers.js/issues/3809); [450a176](https://github.com/ethers-io/ethers.js/commit/450a176ee25f88a2ddb9ff23b153ef70bf1dc546)).
|
||||||
|
- Prevent a single malformed event from preventing other Contract logs; reported on Discord ([b1375f4](https://github.com/ethers-io/ethers.js/commit/b1375f4e4463b856855ebc684b45945455ac082e)).
|
||||||
ethers/v5.0.0-beta.160 (2019-11-20 18:36)
|
|
||||||
-----------------------------------------
|
ethers/v6.6.4 (2023-07-16 00:35)
|
||||||
|
--------------------------------
|
||||||
- Updated API in testcases. ([3ab3733](https://github.com/ethers-io/ethers.js/commit/3ab373334c75800f2b20b6639ed8eb1b11e453ef))
|
|
||||||
- Fixed scrypt import in ESM build. ([b72ef27](https://github.com/ethers-io/ethers.js/commit/b72ef27b2a8f9941fb9d79122ec449fed9d2464d))
|
|
||||||
- Fixed null apiKey problem for InfuraProvider. ([e518151](https://github.com/ethers-io/ethers.js/commit/e51815150912d10e2734707986b10b37c87d6d12))
|
|
||||||
- Added support for sighash-style tuple parsing. ([19aaade](https://github.com/ethers-io/ethers.js/commit/19aaade9c62510012cfd50ae487ebd1705a28678))
|
|
||||||
- Fixed solc imports for cli. ([c35ddaf](https://github.com/ethers-io/ethers.js/commit/c35ddaf646efa25e738fee604585a0a7af45b206))
|
|
||||||
- Added nonce manager to experimental index. ([8316406](https://github.com/ethers-io/ethers.js/commit/8316406977ea26ca2044d16f7b3bb6ba21ef5b43))
|
|
||||||
- Removing NodesmithProvider from default provider as it is being discontinued. ([01ca350](https://github.com/ethers-io/ethers.js/commit/01ca35036ca11a47f60890e5cae62e46a00f3da8))
|
|
||||||
- Moved bare ABI named functions and events from Interface into Contracts to simplify other consumers of Interface. ([da8ca2e](https://github.com/ethers-io/ethers.js/commit/da8ca2e8bc982fc3ea0343bb3c593a485ca1fef0))
|
|
||||||
- Added support for complex API keys including support for INFURA project secrets. ([#464](https://github.com/ethers-io/ethers.js/issues/464), [#651](https://github.com/ethers-io/ethers.js/issues/651), [#652](https://github.com/ethers-io/ethers.js/issues/652); [1ec5804](https://github.com/ethers-io/ethers.js/commit/1ec5804bd460f6948d4813469fdc7bf739baa6a6))
|
|
||||||
- Migrated to scrypt-js v3. ([75895fa](https://github.com/ethers-io/ethers.js/commit/75895fa1491e7542c755a102f4e4c190685fd2b6))
|
|
||||||
- Moved getDefaultProvider to providers package. ([51e4ef2](https://github.com/ethers-io/ethers.js/commit/51e4ef2b45b83a8d82923600a2fac544d70b0807))
|
|
||||||
- Migrating providers to modern syntax and scoping. ([#634](https://github.com/ethers-io/ethers.js/issues/634); [e1509a6](https://github.com/ethers-io/ethers.js/commit/e1509a6326dd2cb8bf7ed64b82dd3947b768a314))
|
|
||||||
- Migrating to modern syntax and scoping. ([#634](https://github.com/ethers-io/ethers.js/issues/634); [394c36c](https://github.com/ethers-io/ethers.js/commit/394c36cad43f229a94c72d21f94d1c7982a887a1))
|
|
||||||
- Added provider property to Web3Provider. ([#641](https://github.com/ethers-io/ethers.js/issues/641); [1d4f90a](https://github.com/ethers-io/ethers.js/commit/1d4f90a958da6364117353850d62535c9702abd2))
|
|
||||||
- Updated GitHub issue cache. ([494381a](https://github.com/ethers-io/ethers.js/commit/494381a6284cc8ed90bd8002d42a6b6d94dc1200))
|
|
||||||
- Force deploy receipt to address to be null. ([#573](https://github.com/ethers-io/ethers.js/issues/573); [d9d438a](https://github.com/ethers-io/ethers.js/commit/d9d438a119bb11f8516fc9cf02c534ab3816fcb3))
|
|
||||||
- Updated experimental NonceManager. ([3d514c8](https://github.com/ethers-io/ethers.js/commit/3d514c8dbb94e1c4ce5754463e683dd9dbe7c0aa))
|
|
||||||
- Fixed typo in error message. ([28339a9](https://github.com/ethers-io/ethers.js/commit/28339a9c8585392086da159a46df4afb8958915c))
|
|
||||||
- Added GitHub issue caching. ([fea867a](https://github.com/ethers-io/ethers.js/commit/fea867a206f007a17718396e486883a5e718aa29))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.159 (2019-10-17 01:08)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Removing TypeScript build files from npm to fix excessive package diffs.
|
|
||||||
- Fixed getBlock for blockhashes with a leading 0. ([#629](https://github.com/ethers-io/ethers.js/issues/629); [12cfc59](https://github.com/ethers-io/ethers.js/commit/12cfc599656d7e3a6d3d9aa4e468592865a711cc))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.158 (2019-09-28 01:56)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Added less-common, but useful, coding functions to Interface. ([778eb3b](https://github.com/ethers-io/ethers.js/commit/778eb3b425b5ab5b23d28e75be92feccd0fc56bc))
|
|
||||||
- Add response handling and 304 support to fetchJson. ([3d25882](https://github.com/ethers-io/ethers.js/commit/3d25882d6bf689740506b9c569f6e0d30da6f6a5))
|
|
||||||
- Allow numeric values in a transaction to be odd-lengthed hexstrings. ([#614](https://github.com/ethers-io/ethers.js/issues/614); [a12030a](https://github.com/ethers-io/ethers.js/commit/a12030ad29aa13c02aa75d9e0860f4986a0043b4))
|
|
||||||
- Simpler crypt for admin tools. ([828c8cf](https://github.com/ethers-io/ethers.js/commit/828c8cfd419ac4f8d11d978c2e2ff83eba5ae909))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.157 (2019-09-08 02:43)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Fixed getContractAddress for odd-length hex values. ([#572](https://github.com/ethers-io/ethers.js/issues/572); [751793e](https://github.com/ethers-io/ethers.js/commit/751793ea25183d54d7fc4c610a789608f91c062e))
|
|
||||||
- Fixed typo in error message. ([#592](https://github.com/ethers-io/ethers.js/issues/592); [6f4291f](https://github.com/ethers-io/ethers.js/commit/6f4291f65f0ea20c65fef7fd7b09b4d5bf5f0dcd))
|
|
||||||
- Fixed typo in error message. ([#580](https://github.com/ethers-io/ethers.js/issues/580); [9c63b4a](https://github.com/ethers-io/ethers.js/commit/9c63b4a7535f423a802bb1c17c325ce968987349))
|
|
||||||
- Fixed typo in error message. ([#574](https://github.com/ethers-io/ethers.js/issues/574); [22a2673](https://github.com/ethers-io/ethers.js/commit/22a26736cc332fe6e896c9d2707cc99ceee2fb10))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.156 (2019-09-06 17:56)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Removed export star to fix UMD dist file. ([4c17c4d](https://github.com/ethers-io/ethers.js/commit/4c17c4db0455e1b89fd597c4c929cdc36aa3d90d))
|
|
||||||
- Updated TypeScript version. ([e8028d0](https://github.com/ethers-io/ethers.js/commit/e8028d0e73368257b76b394bb8e2bf63f8aecd71))
|
|
||||||
- Fixed test suites and reporter. ([1e0ed4e](https://github.com/ethers-io/ethers.js/commit/1e0ed4e99a22a27fe5057336f8cb320809768f3e))
|
|
||||||
- Added lock-versions admin tool. ([2187604](https://github.com/ethers-io/ethers.js/commit/21876049137644af2b3afa31120ee95d032843a8))
|
|
||||||
- Updated packages with version lock and moved types. ([85b4db7](https://github.com/ethers-io/ethers.js/commit/85b4db7d6db37b853f11a90cf4648c34404edcf9))
|
|
||||||
- Fixed typo in error message. ([#592](https://github.com/ethers-io/ethers.js/issues/592); [019c1fc](https://github.com/ethers-io/ethers.js/commit/019c1fc7089b3da2d7bd41c933b6c6bc35c8dade))
|
|
||||||
- Fixed build process to re-target browser field to ES version. ([3a91e91](https://github.com/ethers-io/ethers.js/commit/3a91e91df56c1ef6cf096c0322f74fd5060891e0))
|
|
||||||
- Major overhaul in compilation to enable ES6 module generation. ([73a0077](https://github.com/ethers-io/ethers.js/commit/73a0077fd38c6ae79f33a9d4d3cc128a904b4a6c))
|
|
||||||
- Updated some of the flatworm docs. ([81fd942](https://github.com/ethers-io/ethers.js/commit/81fd9428cab4be7eee7ddeb564bf91f282cae475))
|
|
||||||
- Fixed package descriptions. ([#561](https://github.com/ethers-io/ethers.js/issues/561); [ebfca98](https://github.com/ethers-io/ethers.js/commit/ebfca98dc276d6f6ca6961632635e8203bb17645))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.155 (2019-08-22 17:11)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Added Wrapped Ether and Token transfers to CLI. ([c031a13](https://github.com/ethers-io/ethers.js/commit/c031a1336815923bae85d9982dba0985a79cfaed))
|
|
||||||
- Fixed sendTransaction and use median gas price in FallbackProvider. ([07e1599](https://github.com/ethers-io/ethers.js/commit/07e15993ba181cfbff987778d158dbde6bb84de2))
|
|
||||||
- Port optional Secret Storage wallet address to v5. ([#582](https://github.com/ethers-io/ethers.js/issues/582); [a12d60d](https://github.com/ethers-io/ethers.js/commit/a12d60d722dfcf998a2e06eba5e46390d7d442e5))
|
|
||||||
- Updated flatworm docs output. ([8745a81](https://github.com/ethers-io/ethers.js/commit/8745a81b11b710036ddb546308c13958be1affb9))
|
|
||||||
- Added initial flatworm documentation stubs. ([0333a76](https://github.com/ethers-io/ethers.js/commit/0333a76f4ff382b5b59b24c672b702721e7a386a))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.154 (2019-08-21 01:51)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Use safe transfer for ENS in CLI. ([b7494d8](https://github.com/ethers-io/ethers.js/commit/b7494d8618001797a4e856f3d1886273897e6ba4))
|
|
||||||
- Fixed quorum-matching logic for FallbackProvider. ([b304ec1](https://github.com/ethers-io/ethers.js/commit/b304ec1f008ec5301c0dbd1a493d790fe3528512))
|
|
||||||
- Added CloudflareProvider. ([#587](https://github.com/ethers-io/ethers.js/issues/587); [621313d](https://github.com/ethers-io/ethers.js/commit/621313d2a697bc6e1dd25eb5b08d67e832a28d05))
|
|
||||||
- Added receipt to CALL_EXCEPTION errors. ([724c32e](https://github.com/ethers-io/ethers.js/commit/724c32e8c08b55404594f263e52babb0550a15b8))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.153 (2019-08-06 19:15)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Updated gas estimate failure messaging to include that the tx may simple be causing a revert. ([edb26b1](https://github.com/ethers-io/ethers.js/commit/edb26b16354afd707e5d03e174c4cc809b951c4f))
|
|
||||||
- Additional sanity checks in ethers-ens. ([de4b2a4](https://github.com/ethers-io/ethers.js/commit/de4b2a449ca3a49807c8bedb3e21e8e8d71e63fc))
|
|
||||||
- Fix bug in --wait for CLI. ([9977c9f](https://github.com/ethers-io/ethers.js/commit/9977c9f66a7007dcc1963128c88c584b6b6c064b))
|
|
||||||
- Added content-hash support to ENS CLI. ([7dfef46](https://github.com/ethers-io/ethers.js/commit/7dfef463f83a9190d1b89cf81e0fb692da3dd813))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.152 (2019-08-05 14:37)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Using CLI --wait instead of custom Plugin flag for ethers-ens. ([19ee2b5](https://github.com/ethers-io/ethers.js/commit/19ee2b516005b2c35b846f19457ec9bbfa0c283b))
|
|
||||||
- Added --wait as a general flag to CLI. ([7640292](https://github.com/ethers-io/ethers.js/commit/7640292ac8b7b9e6de3ad6699d23e2debf26cc1b))
|
|
||||||
- Added migrate-registrar and transfer to ENS CLI. ([31e8e1b](https://github.com/ethers-io/ethers.js/commit/31e8e1b0520bc8be390fbf7e2b473c36a8649eb3))
|
|
||||||
- Include data in the CLI transaction dump. ([53bd96a](https://github.com/ethers-io/ethers.js/commit/53bd96a9f675233906033290f1e0c71ca4e9d389))
|
|
||||||
- Better errors on gas estimation failure. ([0e6b810](https://github.com/ethers-io/ethers.js/commit/0e6b810def390309240508a99b2cf0736848dedd))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.151 (2019-08-05 14:29)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Added package name prefix to all _version for Logger. ([692589d](https://github.com/ethers-io/ethers.js/commit/692589db54cbca10a2a453e9a1801a8612056559))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.150 (2019-08-03 01:07)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Fixed old references to errors package. ([1cabce7](https://github.com/ethers-io/ethers.js/commit/1cabce7e1c23b15cc2b630c0b403dd72d815a5ba))
|
|
||||||
- Added generation scripts for Table A.1 for stringprep. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [b21681a](https://github.com/ethers-io/ethers.js/commit/b21681a7f4292b0e77315caad3a59fe814e9292b))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.149 (2019-08-03 00:45)
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Fixed some case-folding and added Table A.1 for IDNA. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [f955dca](https://github.com/ethers-io/ethers.js/commit/f955dca417a6f86690cf33a81b08baa99e1b1a5c))
|
|
||||||
- Removed references to legacy errors pacakge and updated umbrella pacakge. ([c09de16](https://github.com/ethers-io/ethers.js/commit/c09de163473c361cac11ddef9ec852f4cbb7d8e3))
|
|
||||||
- Updated admin module to use new fetchJson. ([226c100](https://github.com/ethers-io/ethers.js/commit/226c100c72c3fcb0c0e3b62be5f579fd9cc4c904))
|
|
||||||
- Updated dist files. ([8354c3f](https://github.com/ethers-io/ethers.js/commit/8354c3f9fe5487f21acaaeccd4450d9a5d495bc1))
|
|
||||||
- Full case-folding for IDNA in namehash. ([0af95f4](https://github.com/ethers-io/ethers.js/commit/0af95f4a655106e67c2ba8f445af88c9e9e24339))
|
|
||||||
- Deprecating errors for logger. ([0b224e8](https://github.com/ethers-io/ethers.js/commit/0b224e8fb5811cd06727063c909ca1e1e5cde57e))
|
|
||||||
- More consistent debug events for Providers. ([e8f28b5](https://github.com/ethers-io/ethers.js/commit/e8f28b55d7dd62e29f03628232ffe7c75dc811b5))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.148 (2019-07-27 18:56)
|
- More robust support for Signatures with less standard parameter values ([#3835](https://github.com/ethers-io/ethers.js/issues/3835), [#4228](https://github.com/ethers-io/ethers.js/issues/4228); [a7e4048](https://github.com/ethers-io/ethers.js/commit/a7e4048fe3b75a743cec8c8ef2a5fad4bdc8b14c)).
|
||||||
-----------------------------------------
|
- Fixed CCIP-read in the EnsResolver ([#4221](https://github.com/ethers-io/ethers.js/issues/4221); [57f1e1c](https://github.com/ethers-io/ethers.js/commit/57f1e1c47148921148e35c10c83539531942923e)).
|
||||||
|
- Skip checking confirmation count if confirms is 0 ([#4229](https://github.com/ethers-io/ethers.js/issues/4229), [#4242](https://github.com/ethers-io/ethers.js/issues/4242); [492919d](https://github.com/ethers-io/ethers.js/commit/492919d14f646c630f29e1596e5564df1e51f309)).
|
||||||
|
- Fixed waiting for confirmations in deployment transactions ([#4212](https://github.com/ethers-io/ethers.js/issues/4212), [#4230](https://github.com/ethers-io/ethers.js/issues/4230); [43c253a](https://github.com/ethers-io/ethers.js/commit/43c253a402f52a08353c424f6c4e236836cfaf36)).
|
||||||
|
|
||||||
- Initial drop of new ENS CLI tool. ([c3c65b2](https://github.com/ethers-io/ethers.js/commit/c3c65b2fa19e117d6433c2e0b3d20decfe506c74))
|
ethers/v6.6.3 (2023-07-11 20:55)
|
||||||
- Added TypeScript tool support for functions with multiple outputs. ([6de4a5d](https://github.com/ethers-io/ethers.js/commit/6de4a5d8a9d114c4c33c58f8a304b60e7370eeff))
|
--------------------------------
|
||||||
- Added CLI support for stand-alone (no sub-command) tools. ([b67b121](https://github.com/ethers-io/ethers.js/commit/b67b12123996f1aaf7cbe3c8648fd85a22d6674e))
|
|
||||||
- Make utils.resolveProperties preserve object parameter order. ([74dbc28](https://github.com/ethers-io/ethers.js/commit/74dbc281ede042c5eeaa7b45150b215dea860a88))
|
|
||||||
- Added initial IDNA support for full UTF-8 support in namehash. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [28eb38e](https://github.com/ethers-io/ethers.js/commit/28eb38ee703288aaad9f730b2d93fe3aeea7ada6))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.147 (2019-07-23 01:04)
|
- Throw more desscriptive error for unconfigured ENS name contract targets ([#4213](https://github.com/ethers-io/ethers.js/issues/4213); [80f62ef](https://github.com/ethers-io/ethers.js/commit/80f62efc41c3a29e690af40a1976928b7f886a0e)).
|
||||||
-----------------------------------------
|
- Fixed contract once not running stop callback ([7d061b7](https://github.com/ethers-io/ethers.js/commit/7d061b786f72cbfc461bf80d139d10aeff533a6e)).
|
||||||
|
|
||||||
|
ethers/v6.6.2 (2023-06-27 23:30)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Wider error detection for call exceptions on certain backends ([#4154](https://github.com/ethers-io/ethers.js/issues/4154), [#4155](https://github.com/ethers-io/ethers.js/issues/4155); [9197f9f](https://github.com/ethers-io/ethers.js/commit/9197f9f938b5f3b5f97c043f2dab06854656c932)).
|
||||||
|
- Added wider error deetection for JSON-RPC unsupported operation ([#4162](https://github.com/ethers-io/ethers.js/issues/4162); [1dc8986](https://github.com/ethers-io/ethers.js/commit/1dc8986a33be9dce536b24189326cbfaabf1342e)).
|
||||||
|
- Fixed formatUnits and parseUnits for values over 128 bits ([#4037](https://github.com/ethers-io/ethers.js/issues/4037), [#4133](https://github.com/ethers-io/ethers.js/issues/4133); [3d141b4](https://github.com/ethers-io/ethers.js/commit/3d141b44b528f52b3c9205125b64ce342f91643c)).
|
||||||
|
|
||||||
|
ethers/v6.6.1 (2023-06-23 00:35)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Fixed CCIP read in contract calls ([#4043](https://github.com/ethers-io/ethers.js/issues/4043); [d51e3fb](https://github.com/ethers-io/ethers.js/commit/d51e3fbff43c31d88353ac71151626312d22c0b9), [857aa8c](https://github.com/ethers-io/ethers.js/commit/857aa8ccc30f25eda8e83dcac3e0ad2c1a5ce2b3)).
|
||||||
|
|
||||||
|
ethers/v6.6.0 (2023-06-13 21:42)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Add exports for AbstractProviderOptions and for MulticoinProviderPlugin ([203a759](https://github.com/ethers-io/ethers.js/commit/203a759efc65bf6901d3e574a601525ea3936238)).
|
||||||
|
- Add option to adjust perform cache timeout in AbstractProvider ([de0f518](https://github.com/ethers-io/ethers.js/commit/de0f5189f695c181a5fa09100af96a691a338e2b)).
|
||||||
|
- Add full support for MultiCoin plugins and automatic detection for EVM-compatible coin types ([#3888](https://github.com/ethers-io/ethers.js/issues/3888), [#4081](https://github.com/ethers-io/ethers.js/issues/4081); [84375be](https://github.com/ethers-io/ethers.js/commit/84375be92d32a2939cf4a2f713e4c554b5b54a32)).
|
||||||
|
- Allow Interface instances where InterfaceAbi are allowed ([#4142](https://github.com/ethers-io/ethers.js/issues/4142); [2318005](https://github.com/ethers-io/ethers.js/commit/2318005dfd996c8a7c51603d0264ceabe9bb6141)).
|
||||||
|
- Allow Numeric type for decimals in FixedNumber ([#4141](https://github.com/ethers-io/ethers.js/issues/4141); [9055ef6](https://github.com/ethers-io/ethers.js/commit/9055ef6c69291f1a44ea23a2e7b5aaf3140a5577)).
|
||||||
|
|
||||||
|
ethers/v6.5.1 (2023-06-07 20:19)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Fix lost promise fulfillment when a batch has an error response ([#4126](https://github.com/ethers-io/ethers.js/issues/4126); [8dd21f0](https://github.com/ethers-io/ethers.js/commit/8dd21f03334ffd3cdb7ac532376d51fd4130c7ab)).
|
||||||
|
|
||||||
|
ethers/v6.5.0 (2023-06-06 22:41)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Fix CJS browser bundling ([#4033](https://github.com/ethers-io/ethers.js/issues/4033); [38ee319](https://github.com/ethers-io/ethers.js/commit/38ee3195b0192d8180899fd61308e03fa3a0eb32)).
|
||||||
|
- Fixed type guard for non-Typed instances ([#4087](https://github.com/ethers-io/ethers.js/issues/4087); [20c3d1b](https://github.com/ethers-io/ethers.js/commit/20c3d1b109743e33ab60a75d69bf7ede73b15ce2)).
|
||||||
|
- Add confirmations to TransactionResponse ([#4094](https://github.com/ethers-io/ethers.js/issues/4094); [bb8685b](https://github.com/ethers-io/ethers.js/commit/bb8685b112ce1c689c740d4dbcb358c16fb9b22d)).
|
||||||
|
- Fix stray promises when a node returns invalid results ([#4118](https://github.com/ethers-io/ethers.js/issues/4118); [3c1bad2](https://github.com/ethers-io/ethers.js/commit/3c1bad2fb7ad4a6ff90ff11f3e382fd18e41c800)).
|
||||||
|
- Added support to detect and stop providers spinning on intitial network detection ([#4015](https://github.com/ethers-io/ethers.js/issues/4015); [f37a52d](https://github.com/ethers-io/ethers.js/commit/f37a52da28ac130b7f4de52901618320994ea87a)).
|
||||||
|
|
||||||
|
ethers/v6.4.2 (2023-06-05 22:41)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Bump ens-normalize version ([#4071](https://github.com/ethers-io/ethers.js/issues/4071), [#4077](https://github.com/ethers-io/ethers.js/issues/4077), [#4080](https://github.com/ethers-io/ethers.js/issues/4080), [#4102](https://github.com/ethers-io/ethers.js/issues/4102); [c135784](https://github.com/ethers-io/ethers.js/commit/c1357847dcdec93d72f28d890f9271d0289ccefd)).
|
||||||
|
- Fix for networks with polling with non-consistent block and filter events ([#4119](https://github.com/ethers-io/ethers.js/issues/4119); [9b0e992](https://github.com/ethers-io/ethers.js/commit/9b0e9920c09577296ec0e2abb3acc3f3299d96c7)).
|
||||||
|
|
||||||
|
ethers/v6.4.1 (2023-06-01 17:52)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Fixed AbstractProvider lookupAddress bug ([#4086](https://github.com/ethers-io/ethers.js/issues/4086); [15ed2f5](https://github.com/ethers-io/ethers.js/commit/15ed2f5b32084527961332481c9442a313036a01)).
|
||||||
|
- Fix FixedNumber comparison bug ([#4112](https://github.com/ethers-io/ethers.js/issues/4112); [d8e9586](https://github.com/ethers-io/ethers.js/commit/d8e9586044e888e424b5ead0f6e01f88140dba8a)).
|
||||||
|
|
||||||
|
ethers/v6.4.0 (2023-05-18 17:28)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Coerce value into BigInt when checking for value ([83d7f43](https://github.com/ethers-io/ethers.js/commit/83d7f43b9ca4b9868a3952510e56b41ea8610baa)).
|
||||||
|
- Better errors when junk passed as Contract target ([#3947](https://github.com/ethers-io/ethers.js/issues/3947), [#4053](https://github.com/ethers-io/ethers.js/issues/4053); [219b16d](https://github.com/ethers-io/ethers.js/commit/219b16dc284b0c6a532c8c49e824d8234f94222b)).
|
||||||
|
- More robust message checking in socket providers ([#4051](https://github.com/ethers-io/ethers.js/issues/4051); [f58990b](https://github.com/ethers-io/ethers.js/commit/f58990b80cfd83579014339315e58663c0aa6ae3)).
|
||||||
|
- More robust defaultProvider start-up when a backend fails on bootstrap ([#3979](https://github.com/ethers-io/ethers.js/issues/3979); [984f6fa](https://github.com/ethers-io/ethers.js/commit/984f6fa155fca08ebec2353c75ee0a0b974e8568)).
|
||||||
|
- Fix Result.map when Array contains zero elements ([#4036](https://github.com/ethers-io/ethers.js/issues/4036), [#4048](https://github.com/ethers-io/ethers.js/issues/4048); [2e5935b](https://github.com/ethers-io/ethers.js/commit/2e5935b91cff462165a054b33c8b8413f51e3f39)).
|
||||||
|
- Fixed error handling for contracts with receive and non-payable fallback ([6db7458](https://github.com/ethers-io/ethers.js/commit/6db7458cf0a09e8e8a2abb712239972ab81dc9df)).
|
||||||
|
- Remove superfluous logging in defaultProvider ([f87f6ef](https://github.com/ethers-io/ethers.js/commit/f87f6ef9a01ca399664f9fe106b0a677dba0c8e8)).
|
||||||
|
- Removed superfluous logging ([1bc8b55](https://github.com/ethers-io/ethers.js/commit/1bc8b55d502a95c4ae58352bdcfce9e5f9ea72d3)).
|
||||||
|
- Fix receipt gas price when effectiveGasPrice is 0 on testnets ([#4014](https://github.com/ethers-io/ethers.js/issues/4014); [2b0fe61](https://github.com/ethers-io/ethers.js/commit/2b0fe611335432aee334d777a64d8c7827881618)).
|
||||||
|
- Added error event to provider ([#3970](https://github.com/ethers-io/ethers.js/issues/3970), [#3982](https://github.com/ethers-io/ethers.js/issues/3982); [af0291c](https://github.com/ethers-io/ethers.js/commit/af0291c01639674658f5049343da88a84da763a1)).
|
||||||
|
- Removed superfluous parameters for internal transaction functions ([e848978](https://github.com/ethers-io/ethers.js/commit/e8489787585c2e69a23f6cdec6901f22b096aebe)).
|
||||||
|
- More aggresive tree-shaking ([076edad](https://github.com/ethers-io/ethers.js/commit/076edad81ef62474f48f2b4c8af0edc6e4fd64f2)).
|
||||||
|
- More flexible static network checking ([#3834](https://github.com/ethers-io/ethers.js/issues/3834); [7c0465c](https://github.com/ethers-io/ethers.js/commit/7c0465c5fb834eba18d4e5535072685bdc1029f0)).
|
||||||
|
- Support transitive dependants that use non-node16 moduleResolution ([#3920](https://github.com/ethers-io/ethers.js/issues/3920); [df685b1](https://github.com/ethers-io/ethers.js/commit/df685b1bd9ad346ee7863beb6c3ca3f4e94932a2)).
|
||||||
|
- Populate any missing log.removed with false ([#3959](https://github.com/ethers-io/ethers.js/issues/3959); [4e478e6](https://github.com/ethers-io/ethers.js/commit/4e478e625d5648f2172631eef5fda5776ee776b0)).
|
||||||
|
|
||||||
- Use the CLI solc instead of solc directly for ABI testcase generation. ([99c7b1c](https://github.com/ethers-io/ethers.js/commit/99c7b1ca94382490b9757fd51375a7ad4259b831))
|
ethers/v6.3.0 (2023-04-06 04:35)
|
||||||
- Added experimental UTF-8 functions for escaping non-ascii strings. ([b132e32](https://github.com/ethers-io/ethers.js/commit/b132e32172c9d63e59209628dadd5796dd6291c8))
|
--------------------------------
|
||||||
- Bump Solidity version in CLI to 0.5.10. ([6005248](https://github.com/ethers-io/ethers.js/commit/600524842e1a4b857e8428a45c0c7d1baa0624ee))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.146 (2019-07-20 21:06)
|
- Added support for legacy ABI JSON fragments ([#3932](https://github.com/ethers-io/ethers.js/issues/3932); [8c5973e](https://github.com/ethers-io/ethers.js/commit/8c5973e3a9b8d4d4ed80bdf209d8a0b6cc6b8d6d)).
|
||||||
-----------------------------------------
|
- Add _in_ operator support for contract and contract.filters ([#3901](https://github.com/ethers-io/ethers.js/issues/3901); [c58ab3a](https://github.com/ethers-io/ethers.js/commit/c58ab3a97687e15a3ffe30b038089c5f4b570bb9)).
|
||||||
|
- Fixed TypedData unsigned value range ([#3873](https://github.com/ethers-io/ethers.js/issues/3873); [a851b24](https://github.com/ethers-io/ethers.js/commit/a851b24d0af009ecf277766d2a5f81f9b3e7f9f8)).
|
||||||
|
- Added missing export for getIndexedAccountPath ([#3875](https://github.com/ethers-io/ethers.js/issues/3875); [356ff2b](https://github.com/ethers-io/ethers.js/commit/356ff2becb4f4d3622b281d3825770af5caf71ca)).
|
||||||
|
- Fixed TypedData payloads for JSON-restricted chainId field ([#3836](https://github.com/ethers-io/ethers.js/issues/3836); [50b74b8](https://github.com/ethers-io/ethers.js/commit/50b74b8806ef2064f2764b09f89c7ac75fda3a3c)).
|
||||||
|
|
||||||
- Keep extra filter topics when using Frgment filters in Contracts. ([efaafb2](https://github.com/ethers-io/ethers.js/commit/efaafb203feaf703de803df7e346652372e9fb75))
|
ethers/v6.2.3 (2023-03-27 21:22)
|
||||||
- Updated package.json description for Contract package. ([#561](https://github.com/ethers-io/ethers.js/issues/561); [d88ee45](https://github.com/ethers-io/ethers.js/commit/d88ee45937b3484b68f72e3f72ad6c29556c984b))
|
--------------------------------
|
||||||
|
|
||||||
ethers/v5.0.0-beta.145 (2019-07-20 20:12)
|
- Fixed events when emitted in WebSocketProvider ([#3767](https://github.com/ethers-io/ethers.js/issues/3767), [#3922](https://github.com/ethers-io/ethers.js/issues/3922); [ffaafc0](https://github.com/ethers-io/ethers.js/commit/ffaafc0ce1cf40d1d76d8d814c9c445057bf6989)).
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Export provider.Formatter. ([#562](https://github.com/ethers-io/ethers.js/issues/562); [083fd76](https://github.com/ethers-io/ethers.js/commit/083fd76a3a638ec16d5f9bf652101e5a150c7347))
|
ethers/v6.2.2 (2023-03-24 00:49)
|
||||||
- Update CLI to use new Fragment.format style. ([9a41199](https://github.com/ethers-io/ethers.js/commit/9a4119910b07d1ad61bafafb38ac18a9dae1d9ed))
|
--------------------------------
|
||||||
- Added FormatTypes to utils. ([a05027c](https://github.com/ethers-io/ethers.js/commit/a05027c744102bbe1be5e13dd89b9c1e64b3b526))
|
|
||||||
- Added experimental memory-hard password scheme for password-protected mnemonics to the CLI. ([5877418](https://github.com/ethers-io/ethers.js/commit/5877418de94256a69fdf2ad466ba579309b9dee8))
|
|
||||||
- Added more flexible output options to fragment.format (JSON and minimal) and better JSON object parsing. ([e9558c8](https://github.com/ethers-io/ethers.js/commit/e9558c8d4fe6df889f4d7ba6ac6448aa543ef99d))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.144 (2019-07-09 17:28)
|
- Fixed FetchRequest when using credentials ([#3897](https://github.com/ethers-io/ethers.js/issues/3897); [88e8124](https://github.com/ethers-io/ethers.js/commit/88e8124c37d377628f9b8abdf140fc07ad06259f)).
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Make mnemonic phrases case agnostic. ([#557](https://github.com/ethers-io/ethers.js/issues/557); [e4423b7](https://github.com/ethers-io/ethers.js/commit/e4423b7a277e7e1be1c02d345d4ab1eab484c9b8))
|
ethers/v6.2.1 (2023-03-23 17:33)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
ethers/v5.0.0-beta.143 (2019-07-02 16:12)
|
- Stall block polling bootstrap when the network is down ([#3924](https://github.com/ethers-io/ethers.js/issues/3924); [603d474](https://github.com/ethers-io/ethers.js/commit/603d47496e2b667c15b72f315261d6e299381848)).
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Adding more support for offline signing in the CLI. ([9cc269c](https://github.com/ethers-io/ethers.js/commit/9cc269ceb5d33b2d88542d4bc6771279f729e733))
|
ethers/v6.2.0 (2023-03-20 15:53)
|
||||||
- Allow providers to prepare their Network object. ([6484908](https://github.com/ethers-io/ethers.js/commit/6484908cb25dd35e5d98b2672dca72ed3f30cbe1))
|
--------------------------------
|
||||||
- Export BIP-44 default path in ethers.utils. ([04bdf45](https://github.com/ethers-io/ethers.js/commit/04bdf456eb07aa72872265e0ee01e3231d2b6cf1))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.142 (2019-06-28 16:13)
|
- Added extra details in the error info field for RPC errors ([30ffa78](https://github.com/ethers-io/ethers.js/commit/30ffa78d1441fa033677fa09237fc135a314f373)).
|
||||||
-----------------------------------------
|
- Remove Ankr as a deafult for now as the provided API key is failing ([6e01e54](https://github.com/ethers-io/ethers.js/commit/6e01e5448f4a3e2d30288d4c8447db295c3a2e7a)).
|
||||||
|
- Fixed deferred filters after unsafe-eval changes ([#3749](https://github.com/ethers-io/ethers.js/issues/3749), [#3763](https://github.com/ethers-io/ethers.js/issues/3763); [2e3802a](https://github.com/ethers-io/ethers.js/commit/2e3802a83b8ad2f5a6269d79fbd1c83c9f2d1047)).
|
||||||
|
- Remove use of Function sub-class to address unsafe-eval issues ([#3749](https://github.com/ethers-io/ethers.js/issues/3749), [#3763](https://github.com/ethers-io/ethers.js/issues/3763); [7d3af51](https://github.com/ethers-io/ethers.js/commit/7d3af512c75b4c24027ec2daef1e9f4c1064194a)).
|
||||||
|
- Added verifyTypedData utility (reported on Farcaster) ([f06a445](https://github.com/ethers-io/ethers.js/commit/f06a445247f3b294f9fc805cc8fe0752accb8edc)).
|
||||||
|
- Removed stray logging in IpcProvider ([#3908](https://github.com/ethers-io/ethers.js/issues/3908), [#3909](https://github.com/ethers-io/ethers.js/issues/3909); [e11d4c1](https://github.com/ethers-io/ethers.js/commit/e11d4c1c20cc5b6fd5803cf9636c4f5bc082dab7)).
|
||||||
|
- Fixed legacy serialization for implicit chainId transactions ([#3898](https://github.com/ethers-io/ethers.js/issues/3898), [#3899](https://github.com/ethers-io/ethers.js/issues/3899); [fcf6c8f](https://github.com/ethers-io/ethers.js/commit/fcf6c8fcee95ec412aaafba8ec84d5049b077a4e)).
|
||||||
|
- Fix Webpack issue (reported on discord) ([3ad4273](https://github.com/ethers-io/ethers.js/commit/3ad4273b8b714bff344ccbfb1eb71ed8a8b7cfa4)).
|
||||||
|
- Fix some bundlers which cannot handle recursive pkg.exports ([#3848](https://github.com/ethers-io/ethers.js/issues/3848); [6315e78](https://github.com/ethers-io/ethers.js/commit/6315e78ea32147653b72ca06f6800f3e2df6ffbf)).
|
||||||
|
- Fixed typo in signature.s error ([#3891](https://github.com/ethers-io/ethers.js/issues/3891); [47ef3eb](https://github.com/ethers-io/ethers.js/commit/47ef3ebde37bfa0c015c258c3d8a6800d751e147)).
|
||||||
|
- Fixed stray unreachable code ([#3890](https://github.com/ethers-io/ethers.js/issues/3890); [c220fe2](https://github.com/ethers-io/ethers.js/commit/c220fe2ea747ccc80cd3c4020e0278e3daf3c4fc)).
|
||||||
|
- Move all wrapping to proper _wrap functions ([#3818](https://github.com/ethers-io/ethers.js/issues/3818); [02a0aad](https://github.com/ethers-io/ethers.js/commit/02a0aad61212c35e8d2723a8ae589989b97dae3e)).
|
||||||
|
|
||||||
- Do not require a Signer for contract.populateTransaction. ([0e78386](https://github.com/ethers-io/ethers.js/commit/0e78386a08d3d3a0a98c8d03cd665b8992ab3ea2))
|
ethers/v6.1.0 (2023-03-07 02:10)
|
||||||
- Bumping version of solc to 0.5.9. ([e2da447](https://github.com/ethers-io/ethers.js/commit/e2da447c7bc05937966bc4909c47291e4819d2a9))
|
--------------------------------
|
||||||
|
|
||||||
ethers/v5.0.0-beta.141 (2019-06-24 21:25)
|
- Fixed ethers imported in web workers ([#3856](https://github.com/ethers-io/ethers.js/issues/3856); [5f2678f](https://github.com/ethers-io/ethers.js/commit/5f2678fb059d643638b9cc1dc59cbfc61ce7a7b8)).
|
||||||
-----------------------------------------
|
- Added Sepolia support ([#3863](https://github.com/ethers-io/ethers.js/issues/3863); [abeaa74](https://github.com/ethers-io/ethers.js/commit/abeaa74da04fbe25e837a2ffa7d1e9c1257a5da5)).
|
||||||
|
- Added missing exports ([#3734](https://github.com/ethers-io/ethers.js/issues/3734); [06aa303](https://github.com/ethers-io/ethers.js/commit/06aa30363f88144db672376d39012d7fe3f86c33)).
|
||||||
|
- Allow null values for TypedData domain ([#3623](https://github.com/ethers-io/ethers.js/issues/3623); [a32af3a](https://github.com/ethers-io/ethers.js/commit/a32af3adc104c4b07a45097a4a3725a4ce9e0be6)).
|
||||||
|
- Added listAccounts to JsonRpcProvider ([#3778](https://github.com/ethers-io/ethers.js/issues/3778); [287d94f](https://github.com/ethers-io/ethers.js/commit/287d94fc454d03f1b3086ea98745131cdf40129a)).
|
||||||
|
- Allow BigInt for blockTag ([#3780](https://github.com/ethers-io/ethers.js/issues/3780); [fe1f04c](https://github.com/ethers-io/ethers.js/commit/fe1f04c6e5fb4254a100f492d7dcbdc3cf19a446)).
|
||||||
|
- Fixed typo in error messages ([#3822](https://github.com/ethers-io/ethers.js/issues/3822), [#3824](https://github.com/ethers-io/ethers.js/issues/3824); [f1a810d](https://github.com/ethers-io/ethers.js/commit/f1a810dcb56df54b1e1567f2a59c73500619472f)).
|
||||||
|
- Re-adding definition files to require exports ([#3703](https://github.com/ethers-io/ethers.js/issues/3703); [76fab92](https://github.com/ethers-io/ethers.js/commit/76fab923da33e71e6bb751bb0b5e3ba3faa27ab2)).
|
||||||
|
|
||||||
- Fix non-ES6 import in keccak256. ([5eb393d](https://github.com/ethers-io/ethers.js/commit/5eb393d828328b34567566d3c0d622b4aef1e202))
|
ethers/v6.0.8 (2023-02-23 06:30)
|
||||||
- Refactored wordlist exports to export Wordlist directly. ([746d255](https://github.com/ethers-io/ethers.js/commit/746d255b741844b615583b2de3ffd07631b4e872))
|
--------------------------------
|
||||||
|
|
||||||
ethers/v5.0.0-beta.140 (2019-06-12 01:25)
|
- Fix matic-mumbai network and include aliases to legacy names ([#3811](https://github.com/ethers-io/ethers.js/issues/3811); [20bbd12](https://github.com/ethers-io/ethers.js/commit/20bbd1281911d31b360f6f5032251c9257943541)).
|
||||||
-----------------------------------------
|
- Fixed getSigner bug ([#3821](https://github.com/ethers-io/ethers.js/issues/3821); [388edf6](https://github.com/ethers-io/ethers.js/commit/388edf6abc168f89f1ca609e9e5b025dc9205add)).
|
||||||
|
|
||||||
- Move from node-fetch to cross-fetch; better browser fallback implementation. ([826ffbc](https://github.com/ethers-io/ethers.js/commit/826ffbc7c4ed1c301f30e6f264eedeaf3c243ca8))
|
ethers/v6.0.7 (2023-02-23 01:41)
|
||||||
- Added getStatic with support for inheritance of static methods. ([5e4535e](https://github.com/ethers-io/ethers.js/commit/5e4535e939fdb9d9d23bd14b3e2590873d3eb508))
|
--------------------------------
|
||||||
- Fixed node-fetch for Safari (todo: push this fix upstream to node-fetch). ([7164e51](https://github.com/ethers-io/ethers.js/commit/7164e51131215ae3201b49f8c7f5ade8cbd8a420))
|
|
||||||
- Migrated XMLHttpRequest to fetch API. ([#506](https://github.com/ethers-io/ethers.js/issues/506); [62201c5](https://github.com/ethers-io/ethers.js/commit/62201c5eebc52e9723dbbb2cc64823155ce1e0f9))
|
- Fixed getContentHash ([#3819](https://github.com/ethers-io/ethers.js/issues/3819); [b993f7c](https://github.com/ethers-io/ethers.js/commit/b993f7c3b6c0e135c460c8b8dc5943215628231a)).
|
||||||
|
|
||||||
|
ethers/v6.0.6 (2023-02-22 21:53)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Added chain parameters for Arbitrum and Optimism ([#3811](https://github.com/ethers-io/ethers.js/issues/3811); [77a7323](https://github.com/ethers-io/ethers.js/commit/77a7323119923e596f4def4f1bc90beae5447320)).
|
||||||
|
- Fix NonceManager race condition ([#3812](https://github.com/ethers-io/ethers.js/issues/3812), [#3813](https://github.com/ethers-io/ethers.js/issues/3813); [5a3c10a](https://github.com/ethers-io/ethers.js/commit/5a3c10a29c047609a50828adb620d88aa8cf0014)).
|
||||||
|
- Add UMD output to dist builds ([#3814](https://github.com/ethers-io/ethers.js/issues/3814); [f9eed4c](https://github.com/ethers-io/ethers.js/commit/f9eed4cdb190b06dd4ddaa2382c1de42e8e98de6)).
|
||||||
|
|
||||||
|
ethers/v6.0.5 (2023-02-18 22:36)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Fixed Result to behave correctly like an array using slice and toArray ([#3787](https://github.com/ethers-io/ethers.js/issues/3787); [399356b](https://github.com/ethers-io/ethers.js/commit/399356b91227db04e496628af60c4b8e38207760)).
|
||||||
|
- Replaced substring from 0 index with startsWith ([#3691](https://github.com/ethers-io/ethers.js/issues/3691); [4512e97](https://github.com/ethers-io/ethers.js/commit/4512e97f9b55607ce388aa6eb63a37fc196a5d9d)).
|
||||||
|
- Fixed inverted assert in duplicate name detection for ABI encoding ([#3792](https://github.com/ethers-io/ethers.js/issues/3792); [762c2f3](https://github.com/ethers-io/ethers.js/commit/762c2f34eac848c5464389f11d1697dcd8ebcbb5)).
|
||||||
|
- Fixed missing property during transaction copy ([#3793](https://github.com/ethers-io/ethers.js/issues/3793); [48bbef7](https://github.com/ethers-io/ethers.js/commit/48bbef7ade69bcfe86542f752f15049cc62f4141)).
|
||||||
|
- Add support for Wallet private keys without 0x prefix ([#3768](https://github.com/ethers-io/ethers.js/issues/3768); [4665fb4](https://github.com/ethers-io/ethers.js/commit/4665fb4c6886c8b344dee316ba9f4fde57ce7557)).
|
||||||
|
- Fixed quicknode property for defaultProvider ([#3741](https://github.com/ethers-io/ethers.js/issues/3741); [a8afb72](https://github.com/ethers-io/ethers.js/commit/a8afb72fbbceb6a5024c1edb85badb72099787ea)).
|
||||||
|
- Fixed exports field order ([#3703](https://github.com/ethers-io/ethers.js/issues/3703), [#3755](https://github.com/ethers-io/ethers.js/issues/3755); [085a905](https://github.com/ethers-io/ethers.js/commit/085a9054f349afb816ca1a123737293ec9bd2532)).
|
||||||
|
|
||||||
|
ethers/v6.0.4 (2023-02-16 08:55)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
- Fixed custom error decoding ([#3785](https://github.com/ethers-io/ethers.js/issues/3785); [4d9b29d](https://github.com/ethers-io/ethers.js/commit/4d9b29de751e2387c143e474bb96d271da892ea6)).
|
||||||
|
- Removed stray debug logging ([e1e0929](https://github.com/ethers-io/ethers.js/commit/e1e09293483a9d07fd8e8f96552aa958b5ec45ed)).
|
||||||
|
- Fixed lookupAddress when bad resolver is present ([#3782](https://github.com/ethers-io/ethers.js/issues/3782); [92def9c](https://github.com/ethers-io/ethers.js/commit/92def9c1489bb35ad13fe58a1cd107ee3a05a112)).
|
||||||
|
- Fixed FallbackProvider median calculation ([#3746](https://github.com/ethers-io/ethers.js/issues/3746); [83957dc](https://github.com/ethers-io/ethers.js/commit/83957dc283043b9af8f6e89920faac3e09ca69fc)).
|
||||||
|
- Move the xnf normalize variant to pkg.browser instead of import ([#3724](https://github.com/ethers-io/ethers.js/issues/3724); [179e6ca](https://github.com/ethers-io/ethers.js/commit/179e6ca520392177c7dea5e477b29930952ed637)).
|
||||||
|
|
||||||
|
ethers/v6.0.3 (2023-02-12 22:45)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
ethers/v5.0.0-beta.139 (2019-06-11 17:55)
|
- Allow null type in transaction receipt for legacy type 0 networks ([#3459](https://github.com/ethers-io/ethers.js/issues/3459); [6372a46](https://github.com/ethers-io/ethers.js/commit/6372a46b1b273db3e4c1189daebb4b888bd588bc)).
|
||||||
-----------------------------------------
|
- Fixed events when slicing immutable Result ([#3765](https://github.com/ethers-io/ethers.js/issues/3765); [2ba4a17](https://github.com/ethers-io/ethers.js/commit/2ba4a172555b7e17ac01fedfc944549defab61bc)).
|
||||||
|
- More robust support on networks which throw when filters are not supported ([#3767](https://github.com/ethers-io/ethers.js/issues/3767); [37bf4fb](https://github.com/ethers-io/ethers.js/commit/37bf4fb55563d7ff66edee15c7515c8a0d6a2266)).
|
||||||
|
- Fixed ignored polling override for JsonRpcApiProvider ([400d576](https://github.com/ethers-io/ethers.js/commit/400d57621b3e9a33679a528b5072449699f0a068)).
|
||||||
|
|
||||||
- Removed freeze option from deepCopy; all properties are read-only and only objects may have new properties added. ([1bc792d](https://github.com/ethers-io/ethers.js/commit/1bc792d9dcc6a06a1be4fc5e5b9a538a3f6b7ada))
|
ethers/v6.0.2 (2023-02-04 08:50)
|
||||||
- Moved away from isNamedInstance which breaks after Browserify name mangling. ([257d67c](https://github.com/ethers-io/ethers.js/commit/257d67c9625fa237bcfb3d651c49aa3b79175cae))
|
--------------------------------
|
||||||
- Expose poll function in utils. ([#512](https://github.com/ethers-io/ethers.js/issues/512); [e6f6383](https://github.com/ethers-io/ethers.js/commit/e6f6383346818fa67423f1f20450e011242eb554))
|
|
||||||
- Make TransactionResponse hash required. ([#537](https://github.com/ethers-io/ethers.js/issues/537); [095c1fe](https://github.com/ethers-io/ethers.js/commit/095c1fe579068a3204ea0d1bc1893f293f61e719))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.138 (2019-06-04 16:05)
|
- Fixed crossed assert in Fetch ([#3733](https://github.com/ethers-io/ethers.js/issues/3733); [6c338c1](https://github.com/ethers-io/ethers.js/commit/6c338c1c5b4013db9754c9d1a33dcbf54330e5c7)).
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
- Fixed INFURA project ID checking. ([#534](https://github.com/ethers-io/ethers.js/issues/534); [5bf763f](https://github.com/ethers-io/ethers.js/commit/5bf763fe2307e8570ab5e91e30c43e2e5731fc39))
|
ethers/v6.0.1 (2023-02-04 04:06)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
ethers/v5.0.0-beta.137 (2019-06-01 14:06)
|
- Fix Subscriber model when removed within emit callback ([d0ed918](https://github.com/ethers-io/ethers.js/commit/d0ed91840c9f51c7ce9061ebb1d36727dbdd51a4)).
|
||||||
-----------------------------------------
|
- Fixed human-readable parser when identifier begins with valid type prefix ([#3728](https://github.com/ethers-io/ethers.js/issues/3728); [522fd16](https://github.com/ethers-io/ethers.js/commit/522fd16f68aabc53e4dc8745d4128e0d61260ed5)).
|
||||||
|
- Update to latest secp256k1 library ([#3719](https://github.com/ethers-io/ethers.js/issues/3719); [803e8f9](https://github.com/ethers-io/ethers.js/commit/803e8f9821950b83efa876d64b1cfb35f6bccc38)).
|
||||||
|
|
||||||
- Fixed invalid arrayify value in browser for SHA2-HMAC. ([#530](https://github.com/ethers-io/ethers.js/issues/530); [c4a494b](https://github.com/ethers-io/ethers.js/commit/c4a494b528f2e5f706c159d916d8ff0ffd96a211))
|
ethers/v6.0.0 (2023-02-02 22:48)
|
||||||
- Fix event and function fragment formatting. ([a2d4b29](https://github.com/ethers-io/ethers.js/commit/a2d4b2907184d9480a72fe6f67652489074af86e))
|
--------------------------------
|
||||||
- Fixed default JsonRpcSigner. ([#532](https://github.com/ethers-io/ethers.js/issues/532); [5ba6a61](https://github.com/ethers-io/ethers.js/commit/5ba6a616a6f969b1f28f8c6367c21488f497a7ae))
|
|
||||||
- Added changelog management to update-versions. ([4a3f719](https://github.com/ethers-io/ethers.js/commit/4a3f7190dc04275030d313289e1ba6a2b31407ec))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.136
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
- Added queryFilter to Contracts. ([#463](https://github.com/ethers-io/ethers.js/issues/463); [eea53bb](https://github.com/ethers-io/ethers.js/commit/eea53bb1be29ad2bd1b229a13c85b12be264b019))
|
|
||||||
- Allow storage class in Human-Readable ABI. ([#476](https://github.com/ethers-io/ethers.js/issues/476); [cf39adb](https://github.com/ethers-io/ethers.js/commit/cf39adb09020ca0393e028b330bfd07fb4869236))
|
|
||||||
- Track per-provider JSON-RPC ID in JsonRpcProvider. ([#337](https://github.com/ethers-io/ethers.js/issues/337), [#489](https://github.com/ethers-io/ethers.js/issues/489); [044554b](https://github.com/ethers-io/ethers.js/commit/044554b58525d1677646a74119f86ea867a06d1e))
|
|
||||||
- Fixed typo in error message. ([#470](https://github.com/ethers-io/ethers.js/issues/470); [47d92ae](https://github.com/ethers-io/ethers.js/commit/47d92aeff02cacfb26793850c7faef7cb21ce4cf))
|
|
||||||
|
|
||||||
ethers/v5.0.0-beta.135
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
- Better error message for unconfigured ENS names. ([#504](https://github.com/ethers-io/ethers.js/issues/504); [3cbc4b4](https://github.com/ethers-io/ethers.js/commit/3cbc4b462262ba61fa7d99a7a12e7bbf8049afb1))
|
|
||||||
- Fixed contract events. ([#404](https://github.com/ethers-io/ethers.js/issues/404); [8cdda37](https://github.com/ethers-io/ethers.js/commit/8cdda37095df28f828ccd2ac5437ccb6541b16cc))
|
|
||||||
- Updated license for BaseX to include original authors; was only included in the source. ([03c9725](https://github.com/ethers-io/ethers.js/commit/03c97259c46de10dbe6ce62921de2f32ffff0522))
|
|
||||||
|
|
||||||
|
- Initial release ([90afd9b](https://github.com/ethers-io/ethers.js/commit/90afd9bd81ed1408421a0247fa0845a74c9eb319)).
|
||||||
|
|||||||
7
FUNDING.json
Normal file
7
FUNDING.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"drips": {
|
||||||
|
"ethereum": {
|
||||||
|
"ownedBy": "0x89EdE5cBE53473A64d6C8DF14176a0d658dAAeDC"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2019 Richard Moore
|
Copyright (c) 2016-2023 Richard Moore
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
173
README.md
173
README.md
@ -1,95 +1,136 @@
|
|||||||
The Ethers Project
|
The Ethers Project
|
||||||
==================
|
==================
|
||||||
|
|
||||||
**EXPERIMENTAL**
|
[](https://www.npmjs.com/package/ethers)
|
||||||
|
[](https://github.com/ethers-io/ethers.js/actions/workflows/test-ci.yml)
|
||||||
|

|
||||||
|

|
||||||
|
[](https://www.gitpoap.io/gh/ethers-io/ethers.js)
|
||||||
|
[](https://twitter.com/ricmoo)
|
||||||
|
|
||||||
This branch is the next release of ethers.js, which should
|
-----
|
||||||
be promoted to the official release shortly.
|
|
||||||
|
|
||||||
I would recommend it for most new projects and personally use
|
A complete, compact and simple library for Ethereum and ilk, written
|
||||||
it for my own projects.
|
in [TypeScript](https://www.typescriptlang.org).
|
||||||
|
|
||||||
|
**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 as well as Czech, French, Italian, Japanese, Korean, Simplified Chinese, Spanish, Traditional Chinese)
|
||||||
|
- Meta-classes create JavaScript objects from any contract ABI, including **ABIv2** and **Human-Readable ABI**
|
||||||
|
- Connect to Ethereum nodes over [JSON-RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC), [INFURA](https://infura.io), [Etherscan](https://etherscan.io), [Alchemy](https://alchemyapi.io), [Ankr](https://ankr.com) or [MetaMask](https://metamask.io)
|
||||||
|
- **ENS names** are first-class citizens; they can be used anywhere an Ethereum addresses can be used
|
||||||
|
- **Small** (~144kb compressed; 460kb uncompressed)
|
||||||
|
- **Tree-shaking** focused; include only what you need during bundling
|
||||||
|
- **Complete** functionality for all your Ethereum desires
|
||||||
|
- Extensive [documentation](https://docs.ethers.org/v6/)
|
||||||
|
- Large collection of **test cases** which are maintained and added to
|
||||||
|
- Fully written in **TypeScript**, with strict types for security and safety
|
||||||
|
- **MIT License** (including ALL dependencies); completely open source to do with as you please
|
||||||
|
|
||||||
|
|
||||||
|
Keep Updated
|
||||||
|
------------
|
||||||
|
|
||||||
|
For advisories and important notices, follow [@ethersproject](https://twitter.com/ethersproject)
|
||||||
|
on Twitter (low-traffic, non-marketing, important information only) as well as watch this GitHub project.
|
||||||
|
|
||||||
|
For more general news, discussions, and feedback, follow or DM me,
|
||||||
|
[@ricmoo](https://twitter.com/ricmoo) on Twitter or on the
|
||||||
|
[Ethers Discord](https://discord.gg/qYtSscGYYc).
|
||||||
|
|
||||||
|
|
||||||
|
For the latest changes, see the
|
||||||
|
[CHANGELOG](https://github.com/ethers-io/ethers.js/blob/main/CHANGELOG.md).
|
||||||
|
|
||||||
|
|
||||||
|
**Summaries**
|
||||||
|
|
||||||
|
- [August 2023](https://blog.ricmoo.com/highlights-ethers-js-august-2023-fb68354c576c)
|
||||||
|
- [September 2022](https://blog.ricmoo.com/highlights-ethers-js-september-2022-d7bda0fc37ed)
|
||||||
|
- [June 2022](https://blog.ricmoo.com/highlights-ethers-js-june-2022-f5328932e35d)
|
||||||
|
- [March 2022](https://blog.ricmoo.com/highlights-ethers-js-march-2022-f511fe1e88a1)
|
||||||
|
- [December 2021](https://blog.ricmoo.com/highlights-ethers-js-december-2021-dc1adb779d1a)
|
||||||
|
- [September 2021](https://blog.ricmoo.com/highlights-ethers-js-september-2021-1bf7cb47d348)
|
||||||
|
- [May 2021](https://blog.ricmoo.com/highlights-ethers-js-may-2021-2826e858277d)
|
||||||
|
- [March 2021](https://blog.ricmoo.com/highlights-ethers-js-march-2021-173d3a545b8d)
|
||||||
|
- [December 2020](https://blog.ricmoo.com/highlights-ethers-js-december-2020-2e2db8bc800a)
|
||||||
|
|
||||||
The [new documentation](https://docs-beta.ethers.io) is still a
|
|
||||||
bit sparse, but is coming along as well and will be complete
|
|
||||||
before the promotion to master.
|
|
||||||
|
|
||||||
|
|
||||||
Installing
|
Installing
|
||||||
----------
|
----------
|
||||||
|
|
||||||
**node.js**
|
**NodeJS**
|
||||||
|
|
||||||
```
|
```
|
||||||
/home/ricmoo/some_project> npm install --save ethers@next
|
/home/ricmoo/some_project> npm install ethers
|
||||||
```
|
```
|
||||||
|
|
||||||
**browser (UMD)**
|
**Browser (ESM)**
|
||||||
|
|
||||||
```
|
The bundled library is available in the `./dist/` folder in this repo.
|
||||||
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js" type="text/javasctipt">
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
**browser (ESM)**
|
|
||||||
|
|
||||||
```
|
```
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.0.umd.min.js";
|
import { ethers } from "./dist/ethers.min.js";
|
||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Ancillary Packages
|
Documentation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Browse the [documentation](https://docs.ethers.org) online:
|
||||||
|
|
||||||
|
- [Getting Started](https://docs.ethers.org/v6/getting-started/)
|
||||||
|
- [Full API Documentation](https://docs.ethers.org/v6/api/)
|
||||||
|
- [Various Ethereum Articles](https://blog.ricmoo.com/)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Providers
|
||||||
|
---------
|
||||||
|
|
||||||
|
Ethers works closely with an ever-growing list of third-party providers
|
||||||
|
to ensure getting started is quick and easy, by providing default keys
|
||||||
|
to each service.
|
||||||
|
|
||||||
|
These built-in keys mean you can use `ethers.getDefaultProvider()` and
|
||||||
|
start developing right away.
|
||||||
|
|
||||||
|
However, the API keys provided to ethers are also shared and are
|
||||||
|
intentionally throttled to encourage developers to eventually get
|
||||||
|
their own keys, which unlock many other features, such as faster
|
||||||
|
responses, more capacity, analytics and other features like archival
|
||||||
|
data.
|
||||||
|
|
||||||
|
When you are ready to sign up and start using for your own keys, please
|
||||||
|
check out the [Provider API Keys](https://docs.ethers.org/v5/api-keys/) in
|
||||||
|
the documentation.
|
||||||
|
|
||||||
|
A special thanks to these services for providing community resources:
|
||||||
|
|
||||||
|
- [Ankr](https://www.ankr.com/)
|
||||||
|
- [QuickNode](https://www.quicknode.com/)
|
||||||
|
- [Etherscan](https://etherscan.io/)
|
||||||
|
- [INFURA](https://infura.io/)
|
||||||
|
- [Alchemy](https://dashboard.alchemyapi.io/signup?referral=55a35117-028e-4b7c-9e47-e275ad0acc6d)
|
||||||
|
|
||||||
|
|
||||||
|
Extension Packages
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
These are a number of packages not included in the umbrella `ethers ` npm package, and
|
The `ethers` package only includes the most common and most core
|
||||||
additional packages are always being added. Often these packages are for specific
|
functionality to interact with Ethereum. There are many other
|
||||||
use-cases, so rather than adding them to the umbrella package, they are added as
|
packages designed to further enhance the functionality and experience.
|
||||||
ancillary packaged, which can be included by those who need them, while not bloating
|
|
||||||
everyone else with packages they do not need.
|
|
||||||
|
|
||||||
We will keep a list of useful pacakges here.
|
- [MulticallProvider](https://github.com/ethers-io/ext-provider-multicall) - A Provider which bundles multiple call requests into a single `call` to reduce latency and backend request capacity
|
||||||
|
- [MulticoinPlugin](https://github.com/ethers-io/ext-provider-plugin-multicoin) - A Provider plugin to expand the support of ENS coin types
|
||||||
- `@ethersproject/experimental`
|
- [GanaceProvider](https://github.com/ethers-io/ext-provider-ganache) - A Provider for in-memory node instances, for fast debugging, testing and simulating blockchain operations
|
||||||
- `@ethersproject/cli`
|
- [Optimism Utilities](https://github.com/ethers-io/ext-utils-optimism) - A collection of Optimism utilities
|
||||||
- `@ethersproject/ens`
|
- [LedgerSigner](https://github.com/ethers-io/ext-signer-ledger) - A Signer to interact directly with Ledger Hardware Wallets
|
||||||
- `@ethersproject/ledger`
|
|
||||||
- `@ethersproject/trezor`
|
|
||||||
|
|
||||||
|
|
||||||
Hacking
|
|
||||||
-------
|
|
||||||
|
|
||||||
This project uses a combination of Lerna and the ./admin scripts to manage
|
|
||||||
itself as a package of packages.
|
|
||||||
|
|
||||||
The umbrella package can be found in `packages/ethers`, and all packages in general
|
|
||||||
can be found in the `packages/` folder.
|
|
||||||
|
|
||||||
If you add new dependencies to any package (incuding internal dependencies), you will
|
|
||||||
need to re-create the internal links and re-build teh dependency graph::
|
|
||||||
|
|
||||||
```
|
|
||||||
/home/ethers> npm run bootstrap
|
|
||||||
```
|
|
||||||
|
|
||||||
To run a continuous build (with incremental TypeScript compilation):
|
|
||||||
|
|
||||||
```
|
|
||||||
/home/ethers> npm run auto-build
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, once you have made all your changes, you will need to bump the version
|
|
||||||
of packages that changed their NPM tarballs, as well as update the _version.*
|
|
||||||
and distribution builds (which is what we host on the CDN for browser-based
|
|
||||||
apps). To do this, run:
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
/home/ethers> npm run update-versions
|
|
||||||
```
|
|
||||||
|
|
||||||
Which will also list all packages that have changed along with the specifc files.
|
|
||||||
|
|
||||||
|
|
||||||
License
|
License
|
||||||
|
|||||||
34
SECURITY.md
Normal file
34
SECURITY.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Maintaining multiple versions of the library is quite time consuming, so
|
||||||
|
the majority of the effort is focused on the latest major release.
|
||||||
|
|
||||||
|
If you do require a version outside of this chart updated with patch fix,
|
||||||
|
please [contact me](mailto:github@ricmoo.com).
|
||||||
|
|
||||||
|
| Version | Supported | Initial Release |
|
||||||
|
| ------- | ------------------------------------------ | ----------------- |
|
||||||
|
| 6.0.x | :white_check_mark: | 2023-02-02 |
|
||||||
|
| 5.0.x | :white_check_mark: (security updates) | 2020-06-12 |
|
||||||
|
| 4.0.x | :x: | 2018-10-01 |
|
||||||
|
| 3.0.x | :x: | 2018-03-05 |
|
||||||
|
| 2.2.x | :x: | 2018-01-11 |
|
||||||
|
| 2.1.x | :x: | 2017-05-22 |
|
||||||
|
| 2.0.x | :x: | 2017-04-05 |
|
||||||
|
| 1.0.x | :x: | 2016-08-23 |
|
||||||
|
| 0.0.x | :x: | 2016-07-14 |
|
||||||
|
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
If you identify a security vulnerability with this library (or any dependency),
|
||||||
|
please do not hesitate to contact [github@ricmoo.com](mailto:github@ricmoo.com)
|
||||||
|
immediately.
|
||||||
|
|
||||||
|
I try to respond within the same day and will address any concern as quickly
|
||||||
|
as possible (including code fixes and publishing to NPM).
|
||||||
|
|
||||||
|
Any vulnerability will also be published to this file, along with credits,
|
||||||
|
pertinent information and links to fixes.
|
||||||
@ -1,59 +0,0 @@
|
|||||||
Admin Tool
|
|
||||||
==========
|
|
||||||
|
|
||||||
This tool is meant for admin tasks related to ethers.js.
|
|
||||||
|
|
||||||
|
|
||||||
Workflow
|
|
||||||
--------
|
|
||||||
|
|
||||||
After a new series of changes have been made and tested:
|
|
||||||
|
|
||||||
1. Run `npm run update-versions` to update and build all packages
|
|
||||||
2. Make any human-necessary changes to the automatically updated `CHANGELOG.md`
|
|
||||||
3. Run `git add .`
|
|
||||||
4. Run `git commit -S -m "Updated dist files."`
|
|
||||||
5. Run `git push`
|
|
||||||
6. Wait for TravisCI to complete running test cases
|
|
||||||
7. Run `npm run publish-all` to publish changed packages to NPM and tag GitHub
|
|
||||||
|
|
||||||
|
|
||||||
Update Dependency Graph: admin/cmds/update-depgraph
|
|
||||||
---------------------------------------------------
|
|
||||||
|
|
||||||
This is run as part of `npm run bootstrap` before running lerna bootstrap.
|
|
||||||
It recomputes the dependency graph and writes out the ordered
|
|
||||||
**tsconfig.project.json**
|
|
||||||
|
|
||||||
|
|
||||||
Update Versions: admin/cmds/update-versions
|
|
||||||
-------------------------------------------
|
|
||||||
|
|
||||||
Run using the `npm run update-versions`, which also cleans, bootstraps and
|
|
||||||
rebuilds the project before running the script.
|
|
||||||
|
|
||||||
For each package that has changed from the version in NPM (the published
|
|
||||||
tarballs are compared):
|
|
||||||
|
|
||||||
- Update the `version` in the **package.json**
|
|
||||||
- Update the `src.ts/_version.ts` (matches the **package.json**)
|
|
||||||
- Updates the `tarballHash` in the **package.json**
|
|
||||||
- Compiles the TypeScript (which updates the `_version.js` and `_version.d.js`)
|
|
||||||
- Lists all changed files (highlighting src.ts files)
|
|
||||||
|
|
||||||
Then:
|
|
||||||
|
|
||||||
- Generate the distribution files
|
|
||||||
- Update the `CHANGELOG.md`
|
|
||||||
|
|
||||||
|
|
||||||
Publish: admin/cmds/publish
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
Run using `npm run publish-all`. This requires a password for the secure
|
|
||||||
local config and the OTP for NPM.
|
|
||||||
|
|
||||||
- Publish (in dependency order) changed files to NPM
|
|
||||||
- The `gitHead` is updated in **only** the NPM **package.json**
|
|
||||||
- @TODO: Cut a release on GitHub including the relevant CHANGELOG entry
|
|
||||||
|
|
||||||
116
admin/build.js
116
admin/build.js
@ -1,116 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
const resolve = require("path").resolve;
|
|
||||||
const spawn = require("child_process").spawn;
|
|
||||||
|
|
||||||
const { dirnames } = require("./local");
|
|
||||||
const { loadPackage, savePackage } = require("./local");
|
|
||||||
const { loadJson, saveJson } = require("./utils");
|
|
||||||
|
|
||||||
function run(progname, args, ignoreErrorStream) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const proc = spawn(progname, args);
|
|
||||||
|
|
||||||
let stdout = Buffer.from([]);
|
|
||||||
let stderr = Buffer.from([]);
|
|
||||||
|
|
||||||
proc.stdout.on("data", (data) => {
|
|
||||||
stdout = Buffer.concat([ stdout, data ]);
|
|
||||||
});
|
|
||||||
|
|
||||||
proc.stderr.on("data", (data) => {
|
|
||||||
stderr = Buffer.concat([ stdout, data ]);
|
|
||||||
});
|
|
||||||
|
|
||||||
proc.on("error", (error) => {
|
|
||||||
console.log("ERROR");
|
|
||||||
console.log(stderr.toString());
|
|
||||||
error.stderr = stderr.toString();
|
|
||||||
error.stdout = stdout.toString();
|
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
|
|
||||||
proc.on("close", (code) => {
|
|
||||||
if ((stderr.length && !ignoreErrorStream) || code !== 0) {
|
|
||||||
console.log("ERROR");
|
|
||||||
console.log(stderr.toString());
|
|
||||||
|
|
||||||
let error = new Error(`stderr not empty: ${ progname } ${ JSON.stringify(args) }`);
|
|
||||||
error.stderr = stderr.toString();
|
|
||||||
error.stdout = stdout.toString();
|
|
||||||
error.statusCode = code;
|
|
||||||
reject(error);
|
|
||||||
} else {
|
|
||||||
resolve(stdout.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function setupConfig(outDir, moduleType, targetType) {
|
|
||||||
function update(value) {
|
|
||||||
let comps = value.split("/");
|
|
||||||
if (comps.length >= 3 && comps[0] === "." && comps[1].match(/^lib(\.esm)?$/)) {
|
|
||||||
return outDir + comps.slice(2).join("/");
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure the tsconfit.package.json...
|
|
||||||
const path = resolve(__dirname, "../tsconfig.package.json");
|
|
||||||
const content = loadJson(path);
|
|
||||||
content.compilerOptions.module = moduleType;
|
|
||||||
content.compilerOptions.target = targetType;
|
|
||||||
saveJson(path, content);
|
|
||||||
|
|
||||||
dirnames.forEach((dirname) => {
|
|
||||||
let info = loadPackage(dirname);
|
|
||||||
|
|
||||||
if (info._ethers_nobuild) { return; }
|
|
||||||
|
|
||||||
[ "browser", "_browser" ].forEach((key) => {
|
|
||||||
if (info[key]) {
|
|
||||||
if (typeof(info[key]) === "string") {
|
|
||||||
info[key] = update(info[key]);
|
|
||||||
} else {
|
|
||||||
for (let k in info[key]) {
|
|
||||||
info[key][k] = update(info[key][k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
savePackage(dirname, info);
|
|
||||||
|
|
||||||
let path = resolve(__dirname, "../packages", dirname, "tsconfig.json");
|
|
||||||
let content = loadJson(path);
|
|
||||||
content.compilerOptions.outDir = outDir;
|
|
||||||
saveJson(path, content);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function setupBuild(buildModule) {
|
|
||||||
if (buildModule) {
|
|
||||||
setupConfig("./lib.esm/", "es2015", "es2015");
|
|
||||||
} else {
|
|
||||||
setupConfig("./lib/", "commonjs", "es5");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function runBuild(buildModule) {
|
|
||||||
setupBuild(buildModule);
|
|
||||||
|
|
||||||
// Compile
|
|
||||||
return run("npx", [ "tsc", "--build", resolve(__dirname, "../tsconfig.project.json"), "--force" ]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function runDist() {
|
|
||||||
return run("npm", [ "run", "_dist" ], true);
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
run: run,
|
|
||||||
runDist: runDist,
|
|
||||||
runBuild: runBuild,
|
|
||||||
setupBuild: setupBuild
|
|
||||||
};
|
|
||||||
@ -1,145 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
const resolve = require("path").resolve;
|
|
||||||
|
|
||||||
const git = require("./git");
|
|
||||||
const local = require("./local");
|
|
||||||
const npm = require("./npm");
|
|
||||||
const utils = require("./utils");
|
|
||||||
|
|
||||||
const ChangelogPath = resolve(__dirname, "../CHANGELOG.md");
|
|
||||||
|
|
||||||
async function generate() {
|
|
||||||
|
|
||||||
// Get each section of the Changelog
|
|
||||||
let existing = fs.readFileSync(ChangelogPath).toString().split("\n");
|
|
||||||
let sections = [ ];
|
|
||||||
let lastLine = existing[0];
|
|
||||||
existing.slice(1).forEach((line) => {
|
|
||||||
if (line.substring(0, 5) === "=====" || line.substring(0, 5) === "-----") {
|
|
||||||
sections.push({
|
|
||||||
title: lastLine,
|
|
||||||
underline: line.substring(0, 1),
|
|
||||||
body: [ ]
|
|
||||||
});
|
|
||||||
lastLine = null;
|
|
||||||
return;
|
|
||||||
} else if (lastLine) {
|
|
||||||
sections[sections.length - 1].body.push(lastLine);
|
|
||||||
}
|
|
||||||
lastLine = line;
|
|
||||||
});
|
|
||||||
sections[sections.length - 1].body.push(lastLine);
|
|
||||||
|
|
||||||
let lastVersion = await npm.getPackageVersion("ethers");
|
|
||||||
|
|
||||||
let logs = await git.run([ "log", (lastVersion.gitHead + "..") ]);
|
|
||||||
|
|
||||||
let changes = [ ];
|
|
||||||
logs.split("\n").forEach((line) => {
|
|
||||||
if (line.toLowerCase().substring(0, 6) === "commit") {
|
|
||||||
changes.push({
|
|
||||||
commit: line.substring(6).trim(),
|
|
||||||
body: [ ]
|
|
||||||
});
|
|
||||||
} else if (line.toLowerCase().substring(0, 5) === "date:") {
|
|
||||||
changes[changes.length - 1].date = utils.getDateTime(new Date(line.substring(5).trim()));
|
|
||||||
} else if (line.substring(0, 1) === " ") {
|
|
||||||
line = line.trim();
|
|
||||||
if (line === "") { return; }
|
|
||||||
changes[changes.length - 1].body += line + " ";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// @TODO:
|
|
||||||
// ethers/version ([date](tag))
|
|
||||||
let newSection = {
|
|
||||||
title: `ethers/v${ local.loadPackage("ethers").version } (${utils.getDateTime(new Date())})`,
|
|
||||||
underline: "-",
|
|
||||||
body: [ ]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete duplicate sections for the same version (ran update multiple times)
|
|
||||||
while (sections[1].title === newSection.title) {
|
|
||||||
sections.splice(1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
changes.forEach((change) => {
|
|
||||||
let body = change.body.trim();
|
|
||||||
let link = body.match(/(\((.*#.*)\))/)
|
|
||||||
let commit = `[${ change.commit.substring(0, 7) }](https://github.com/ethers-io/ethers.js/commit/${ change.commit })`;
|
|
||||||
if (link) {
|
|
||||||
body = body.replace(/ *(\(.*#.*)\) */, "");
|
|
||||||
link = link[2].replace(/#([0-9]+)/g, (all, issue) => {
|
|
||||||
return `[#${ issue }](https://github.com/ethers-io/ethers.js/issues/${ issue })`;
|
|
||||||
}) + "; " + commit;
|
|
||||||
} else {
|
|
||||||
link = commit;
|
|
||||||
}
|
|
||||||
newSection.body.push(` - ${ body } (${ link })`);
|
|
||||||
});
|
|
||||||
|
|
||||||
sections.splice(1, 0, newSection);
|
|
||||||
|
|
||||||
|
|
||||||
let formatted = [ ];
|
|
||||||
sections.forEach((section) => {
|
|
||||||
formatted.push(section.title);
|
|
||||||
formatted.push(utils.repeat(section.underline, section.title.length));
|
|
||||||
formatted.push("");
|
|
||||||
section.body.forEach((line) => {
|
|
||||||
line = line.trim();
|
|
||||||
if (line === "") { return; }
|
|
||||||
if (line.substring(0, 1) === "-") {
|
|
||||||
line = "- " + line.substring(1).trim();
|
|
||||||
}
|
|
||||||
if (section.underline === "-") {
|
|
||||||
line = " " + line;
|
|
||||||
}
|
|
||||||
formatted.push(line);
|
|
||||||
});
|
|
||||||
formatted.push("");
|
|
||||||
});
|
|
||||||
|
|
||||||
return formatted.join("\n") + "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
function getChanges() {
|
|
||||||
const changes = [ ];
|
|
||||||
|
|
||||||
let lastLine = null;
|
|
||||||
fs.readFileSync(ChangelogPath).toString().split("\n").forEach((line) => {
|
|
||||||
line = line.trim();
|
|
||||||
if (line === "") { return; }
|
|
||||||
|
|
||||||
if (line.substring(0, 5) === "-----") {
|
|
||||||
changes.push({ title: lastLine, lines: [ ] });
|
|
||||||
} else if (line.substring(0, 1) === "-" && changes.length) {
|
|
||||||
changes[changes.length - 1].lines.push(line);
|
|
||||||
}
|
|
||||||
lastLine = line;
|
|
||||||
});
|
|
||||||
|
|
||||||
return changes;
|
|
||||||
}
|
|
||||||
|
|
||||||
function latestChange() {
|
|
||||||
const recent = getChanges()[0];
|
|
||||||
|
|
||||||
const match = recent.title.match(/ethers\/([^\(]*)\(([^\)]*)\)/);
|
|
||||||
|
|
||||||
return {
|
|
||||||
title: recent.title,
|
|
||||||
version: match[1].trim(),
|
|
||||||
data: match[2].trim(),
|
|
||||||
content: recent.lines.join("\n")
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
generate: generate,
|
|
||||||
latestChange: latestChange,
|
|
||||||
ChangelogPath: ChangelogPath,
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const config = require("../config");
|
|
||||||
const { syncIssues } = require("../github");
|
|
||||||
|
|
||||||
(async function() {
|
|
||||||
const user = await config.get("github-user");
|
|
||||||
const password = await config.get("github-readonly");
|
|
||||||
await syncIssues(user, password);
|
|
||||||
})();
|
|
||||||
@ -1,142 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const { colorify } = require("../log");
|
|
||||||
const { getIssues } = require("../github");
|
|
||||||
const { repeat } = require("../utils");
|
|
||||||
|
|
||||||
const Options = {
|
|
||||||
"body": 1,
|
|
||||||
"end": 1,
|
|
||||||
"issue": 1,
|
|
||||||
"start": 1,
|
|
||||||
"title": 1,
|
|
||||||
"user": 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
const Flags = {
|
|
||||||
"open": 1,
|
|
||||||
"match-case": 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
(async function() {
|
|
||||||
const options = { };
|
|
||||||
for (let i = 2; i < process.argv.length; i++) {
|
|
||||||
const option = process.argv[i];
|
|
||||||
if (option.substring(0, 2) === "--") {
|
|
||||||
const comps = option.substring(2).split(/=/);
|
|
||||||
if (Flags[comps[0]]) {
|
|
||||||
if (comps[1] != null) { throw new Error("Invalid flag: " + option); }
|
|
||||||
options[comps[0]] = true;
|
|
||||||
} else if (Options[comps[0]]) {
|
|
||||||
if (comps[1] == null) {
|
|
||||||
options[comps[0]] = process.argv[++i];
|
|
||||||
if (options[comps[0]] == null) {
|
|
||||||
throw new Error("Missing option value: " + option);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
options[comps[0]] = comps[1];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new Error("Unexpected option: " + option);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new Error("Unexpected argument: " + option);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options["title"]) { options.title = new RegExp(options.title, (options["match-case"] ? "": "i")); }
|
|
||||||
if (options["body"]) { options.body = new RegExp(options.title, (options["match-case"] ? "": "i")); }
|
|
||||||
if (options["start"]) {
|
|
||||||
if (options["start"].match(/^[0-9]{4}-[0-9]{2}-[0-9{2}]$/)) {
|
|
||||||
throw new Error("Expected YYYY-MM-DD");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (options["end"]) {
|
|
||||||
if (options["end"].match(/^[0-9]{4}-[0-9]{2}-[0-9{2}]$/)) {
|
|
||||||
throw new Error("Expected YYYY-MM-DD");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const count = { issues: 0, comments: 0, code: 0, responses: 0 };
|
|
||||||
|
|
||||||
const issues = await getIssues();
|
|
||||||
issues.forEach((issue) => {
|
|
||||||
const info = issue.issue;
|
|
||||||
const comments = issue.comments;
|
|
||||||
|
|
||||||
if (options.issue && parseInt(options.issue) != info.number) { return; }
|
|
||||||
if (options.open && info.state !== "open") { return; }
|
|
||||||
if (options.title && !info.title.match(options.title)) { return; }
|
|
||||||
if (options.body) {
|
|
||||||
const body = info.body + "\n" + comments.map((c) => (c.body)).join("\n");
|
|
||||||
if (!body.match(options.body)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (options.user) {
|
|
||||||
const users = comments.map((c) => (c.user.login));
|
|
||||||
users.push(info.user.login);
|
|
||||||
if (users.indexOf(options.user) === -1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const dates = comments.map((c) => (c.created_at.split("T")[0]));
|
|
||||||
dates.push(info.created_at.split("T")[0]);
|
|
||||||
|
|
||||||
if (options.start) {
|
|
||||||
if (dates.filter((d) => (d >= options.start)).length === 0) { return; }
|
|
||||||
}
|
|
||||||
if (options.end) {
|
|
||||||
if (dates.filter((d) => (d <= options.start)).length === 0) { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
count.issues++;
|
|
||||||
|
|
||||||
console.log(colorify(repeat("=", 70), "bold"))
|
|
||||||
console.log(colorify("Issue:", "bold"), info.title, ` (#${ info.number })`);
|
|
||||||
console.log(colorify("User:","bold"), colorify(info.user.login, "blue"));
|
|
||||||
console.log(colorify("State:", "bold"), info.state);
|
|
||||||
if (info.created_at === info.updated_at) {
|
|
||||||
console.log(colorify("Created:", "bold"), info.created_at);
|
|
||||||
} else {
|
|
||||||
console.log(colorify("Created:", "bold"), info.created_at, ` (updated: ${ info.updated_at })`);
|
|
||||||
}
|
|
||||||
info.body.trim().split("\n").forEach((line) => {
|
|
||||||
console.log(" " + line);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (comments.length) {
|
|
||||||
comments.forEach((info) => {
|
|
||||||
if (options.start && info.created_at < options.start) { return ; }
|
|
||||||
if (options.end && info.created_at > options.end) { return; }
|
|
||||||
count.comments++;
|
|
||||||
if (options.user && info.user.login !== options.user) { return; }
|
|
||||||
count.responses++;
|
|
||||||
if (info.body.indexOf("`") >= 0) { count.code++; }
|
|
||||||
console.log(colorify(repeat("-", 70), "bold"));
|
|
||||||
console.log(colorify("User:", "bold"), colorify(info.user.login, "green"));
|
|
||||||
if (info.created_at === info.updated_at) {
|
|
||||||
console.log(colorify("Created:", "bold"), info.created_at);
|
|
||||||
} else {
|
|
||||||
console.log(colorify("Created:", "bold"), info.created_at, ` (updated: ${ info.updated_at })`);
|
|
||||||
}
|
|
||||||
info.body.trim().split("\n").forEach((line) => {
|
|
||||||
console.log(" " + line);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(colorify(repeat("=", 70), "bold"))
|
|
||||||
|
|
||||||
// @TODO: Add stats on new/closed issues
|
|
||||||
//if (options.user) {
|
|
||||||
// console.log(`${ count.responses } responses (${ count.code } w/ code) on ${ count.comments } comments across ${ count.issues } issues.`);
|
|
||||||
//} else {
|
|
||||||
console.log(`${ count.comments } comment${ (count.comments !== 1) ? "s": "" } across ${ count.issues } issue${ (count.issues !== 1) ? "s": ""}.`);
|
|
||||||
//}
|
|
||||||
|
|
||||||
})().catch((error) => {
|
|
||||||
console.log("Error: " + error.message);
|
|
||||||
});
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const { getOrdered, loadPackage } = require("../depgraph");
|
|
||||||
const { savePackage } = require("../local");
|
|
||||||
const { log } = require("../log");
|
|
||||||
|
|
||||||
(async function() {
|
|
||||||
let versions = { };
|
|
||||||
|
|
||||||
const dirnames = getOrdered();
|
|
||||||
|
|
||||||
dirnames.forEach((dirname) => {
|
|
||||||
let info = loadPackage(dirname);
|
|
||||||
if (info.name.split("/")[0] === "@ethersproject" || info.name === "ethers") {
|
|
||||||
versions[info.name] = info.version;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
dirnames.forEach((dirname) => {
|
|
||||||
const info = loadPackage(dirname);
|
|
||||||
let shown = false;
|
|
||||||
["dependencies", "devDependencies"].forEach((key) => {
|
|
||||||
const deps = info[key];
|
|
||||||
if (!deps) { return; }
|
|
||||||
Object.keys(deps).forEach((name) => {
|
|
||||||
if (versions[name] == null) { return; }
|
|
||||||
const value = ">=" + versions[name];
|
|
||||||
if (value !== deps[name])
|
|
||||||
if (!deps[name]) { return; }
|
|
||||||
if (!shown) {
|
|
||||||
log(`<bold:Locking ${ info.name }:>`);
|
|
||||||
shown = true;
|
|
||||||
}
|
|
||||||
log(` <green:${ name }>: ${ deps[name] } => <bold:${ value.substring(2) }>`);
|
|
||||||
deps[name] = value;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
savePackage(dirname, info);
|
|
||||||
});
|
|
||||||
|
|
||||||
})();
|
|
||||||
@ -1,114 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const config = require("../config");
|
|
||||||
|
|
||||||
const { latestChange } = require("../changelog");
|
|
||||||
const { getOrdered, loadPackage } = require("../depgraph");
|
|
||||||
const { createRelease } = require("../github");
|
|
||||||
const { getPackageVersion, publish } = require("../npm");
|
|
||||||
const { log } = require("../log");
|
|
||||||
|
|
||||||
const USER_AGENT = "ethers-dist@0.0.0";
|
|
||||||
const TAG = "next";
|
|
||||||
|
|
||||||
|
|
||||||
let dirnames = getOrdered();
|
|
||||||
|
|
||||||
// Only publish specific packages
|
|
||||||
if (process.argv.length > 2) {
|
|
||||||
let filter = process.argv.slice(2);
|
|
||||||
|
|
||||||
// Verify all named packages exist
|
|
||||||
filter.forEach((dirname) => {
|
|
||||||
try {
|
|
||||||
loadPackage(dirname);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Package not found: " + dirname);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Filter out pacakges we don't care about
|
|
||||||
dirnames = dirnames.filter((dirname) => (filter.indexOf(dirname) >= 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
(async function() {
|
|
||||||
let token = null;
|
|
||||||
|
|
||||||
let includeEthers = false;
|
|
||||||
|
|
||||||
// @TODO: Fail if there are any untracked files or unchecked in files
|
|
||||||
|
|
||||||
// Load the token from the encrypted store
|
|
||||||
try {
|
|
||||||
token = await config.get("npm-token");
|
|
||||||
} catch (error) {
|
|
||||||
switch (error.message) {
|
|
||||||
case "wrong password":
|
|
||||||
log("<bold:Wrong password>");
|
|
||||||
break;
|
|
||||||
case "cancelled":
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
console.log(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
log("<red:Aborting.>");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
token = token.trim().split("=");
|
|
||||||
|
|
||||||
let options = {
|
|
||||||
npmVersion: USER_AGENT,
|
|
||||||
tag: TAG
|
|
||||||
};
|
|
||||||
|
|
||||||
// Set the authentication token
|
|
||||||
options[token[0]] = token[1];
|
|
||||||
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
let dirname = dirnames[i];
|
|
||||||
|
|
||||||
if (dirname === "ethers") {
|
|
||||||
options.tag = "next";
|
|
||||||
includeEthers = true;
|
|
||||||
} else {
|
|
||||||
options.tag = "latest";
|
|
||||||
}
|
|
||||||
|
|
||||||
let info = loadPackage(dirname);
|
|
||||||
let npmInfo = await getPackageVersion(info.name);
|
|
||||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
|
||||||
|
|
||||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
|
||||||
|
|
||||||
log(`<bold:Publishing:> ${info.name}...`);
|
|
||||||
log(` <blue:Version:> ${npmInfo.version} <bold:=\\>> ${info.version}`);
|
|
||||||
|
|
||||||
let success = await publish(dirname, options);
|
|
||||||
if (!success) {
|
|
||||||
log(" <red:FAILED! Aborting.>");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
log(" <green:Done.>");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Publish the GitHub release (currently beta)
|
|
||||||
const beta = true;
|
|
||||||
if (includeEthers) {
|
|
||||||
|
|
||||||
// The password above already succeeded
|
|
||||||
const username = await config.get("github-user");
|
|
||||||
const password = await config.get("github-release");
|
|
||||||
|
|
||||||
// Get the latest change from the changelog
|
|
||||||
const change = latestChange();
|
|
||||||
|
|
||||||
// Publish the release
|
|
||||||
const link = await createRelease(username, password, change.version, change.title, change.content, beta);
|
|
||||||
log(`<bold:Published Release:> ${ link }...`);
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const { setupBuild } = require("../build");
|
|
||||||
|
|
||||||
setupBuild(false);
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const { prompt } = require("../../packages/cli");
|
|
||||||
const config = require("../config");
|
|
||||||
|
|
||||||
if (process.argv.length !== 3) {
|
|
||||||
console.log("Usage: set-config KEY");
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const key = process.argv[2];
|
|
||||||
|
|
||||||
(async function() {
|
|
||||||
const value = await prompt.getPassword("Value: ");
|
|
||||||
await config.set(key, value);
|
|
||||||
})();
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
const { setupBuild } = require("../build");
|
|
||||||
const { loadPackage, savePackage } = require("../local");
|
|
||||||
|
|
||||||
const arg = process.argv[2];
|
|
||||||
|
|
||||||
(async function() {
|
|
||||||
switch(arg) {
|
|
||||||
case "esm":
|
|
||||||
setupBuild(true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "cjs":
|
|
||||||
setupBuild(false);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "browser-lang-en": {
|
|
||||||
const info = loadPackage("wordlists");
|
|
||||||
if (info._browser) {
|
|
||||||
info.browser = info._browser;
|
|
||||||
delete info._browser;
|
|
||||||
savePackage("wordlists", info);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "browser-lang-all": {
|
|
||||||
const info = loadPackage("wordlists");
|
|
||||||
if (info.browser) {
|
|
||||||
info._browser = info.browser;
|
|
||||||
delete info.browser;
|
|
||||||
savePackage("wordlists", info);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
console.log("unknown option");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
})().then((result) => {
|
|
||||||
process.exit(result);
|
|
||||||
});
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
"use stricT";
|
|
||||||
|
|
||||||
const depgraph = require("../depgraph");
|
|
||||||
const { log } = require("../log");
|
|
||||||
const { loadJson, resolve, saveJson } = require("../utils");
|
|
||||||
|
|
||||||
(async function() {
|
|
||||||
log(`<bold:Updating dependency-graph build order (tsconfig.project.json)...>`);
|
|
||||||
let ordered = depgraph.getOrdered(true);
|
|
||||||
|
|
||||||
let path = resolve("tsconfig.project.json")
|
|
||||||
|
|
||||||
let projectConfig = loadJson(path);
|
|
||||||
projectConfig.references = ordered.map((name) => ({ path: ("./packages/" + name) }));
|
|
||||||
saveJson(path, projectConfig);
|
|
||||||
})();
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
const { resolve } = require("path");
|
|
||||||
|
|
||||||
const sourceEthers = fs.readFileSync(resolve(__dirname, "../../packages/ethers/src.ts/ethers.ts")).toString();
|
|
||||||
const targets = sourceEthers.match(/export\s*{\s*((.|\s)*)}/)[1].trim();
|
|
||||||
|
|
||||||
const output = `"use strict";
|
|
||||||
|
|
||||||
// To modify this file, you must update ./admin/cmds/update-exports.js
|
|
||||||
|
|
||||||
import * as ethers from "./ethers";
|
|
||||||
|
|
||||||
try {
|
|
||||||
const anyGlobal = (window as any);
|
|
||||||
|
|
||||||
if (anyGlobal._ethers == null) {
|
|
||||||
anyGlobal._ethers = ethers;
|
|
||||||
}
|
|
||||||
} catch (error) { }
|
|
||||||
|
|
||||||
export { ethers };
|
|
||||||
|
|
||||||
export {
|
|
||||||
${ targets }
|
|
||||||
} from "./ethers";
|
|
||||||
`;
|
|
||||||
|
|
||||||
fs.writeFileSync(resolve(__dirname, "../../packages/ethers/src.ts/index.ts"), output);
|
|
||||||
@ -1,146 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
// Expected this to be run after
|
|
||||||
// - npm run clean
|
|
||||||
// - npm run bootstrap
|
|
||||||
// - npm run build
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
|
|
||||||
const semver = require("semver");
|
|
||||||
|
|
||||||
const { runBuild, runDist } = require("../build");
|
|
||||||
const { ChangelogPath, generate } = require("../changelog");
|
|
||||||
const { getOrdered, loadPackage } = require("../depgraph");
|
|
||||||
const { getDiff, getStatus, getGitTag } = require("../git");
|
|
||||||
const { updatePackage } = require("../local");
|
|
||||||
const { getPackageVersion } = require("../npm");
|
|
||||||
const { resolve } = require("../utils");
|
|
||||||
const { colorify, log } = require("../log");
|
|
||||||
|
|
||||||
const { prompt } = require("../../packages/cli");
|
|
||||||
|
|
||||||
let dirnames = getOrdered();
|
|
||||||
|
|
||||||
// Only publish specific packages
|
|
||||||
if (process.argv.length > 2) {
|
|
||||||
let filter = process.argv.slice(2);
|
|
||||||
|
|
||||||
// Verify all named packages exist
|
|
||||||
filter.forEach((dirname) => {
|
|
||||||
try {
|
|
||||||
loadPackage(dirname);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Package not found: " + dirname);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Filter out pacakges we don't care about
|
|
||||||
dirnames = dirnames.filter((dirname) => (filter.indexOf(dirname) >= 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
(async function() {
|
|
||||||
let progress = prompt.getProgressBar(colorify("Updating versions", "bold"));
|
|
||||||
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
progress(i / dirnames.length);
|
|
||||||
|
|
||||||
let dirname = dirnames[i];
|
|
||||||
let path = resolve("packages", dirname);
|
|
||||||
|
|
||||||
// Get local package.json (update the tarballHash)
|
|
||||||
let info = await updatePackage(dirname);
|
|
||||||
|
|
||||||
// Get the remote package.json (or sub in a placeholder for new pacakges)
|
|
||||||
let npmInfo = await getPackageVersion(info.name);
|
|
||||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
|
||||||
|
|
||||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
|
||||||
|
|
||||||
// Bump the version if necessary
|
|
||||||
if (info.version === npmInfo.version) {
|
|
||||||
let newVersion = semver.inc(info.version, "prerelease", "beta");
|
|
||||||
|
|
||||||
// Write out the _version.ts
|
|
||||||
if (!info._ethers_nobuild) {
|
|
||||||
let code = "export const version = " + JSON.stringify(dirname + "/" + newVersion) + ";\n";
|
|
||||||
fs.writeFileSync(resolve(path, "src.ts/_version.ts"), code);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the package.json (we do this after _version, so if we fail,
|
|
||||||
// this remains old; which is what triggers the version bump)
|
|
||||||
info = await updatePackage(dirname, { version: newVersion });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
progress(1);
|
|
||||||
|
|
||||||
try {
|
|
||||||
log("<bold:Building TypeScript source (es6)...>");
|
|
||||||
await runBuild(true);
|
|
||||||
log("<bold:Building TypeScript source (commonjs)...>");
|
|
||||||
await runBuild(false);
|
|
||||||
log("<bold:Building distribution files...>");
|
|
||||||
let content = await runDist();
|
|
||||||
console.log(content);
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error);
|
|
||||||
log("<red:Aborting.>");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the tarball hash now that _version and package.json may have changed.
|
|
||||||
progress = prompt.getProgressBar(colorify("Updating tarballHash", "bold"));
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
progress(i / dirnames.length);
|
|
||||||
await updatePackage(dirnames[i]);
|
|
||||||
}
|
|
||||||
progress(1);
|
|
||||||
|
|
||||||
// Show the changed files (compared to npm)
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
let dirname = dirnames[i];
|
|
||||||
|
|
||||||
// Get local package.json
|
|
||||||
let info = await loadPackage(dirname);
|
|
||||||
let path = resolve("packages/", dirname);
|
|
||||||
|
|
||||||
// Get the remote package.json (or sub in a placeholder for new pacakges)
|
|
||||||
let npmInfo = await getPackageVersion(info.name);
|
|
||||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
|
||||||
|
|
||||||
// No change
|
|
||||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
|
||||||
|
|
||||||
let gitHead = await getGitTag(path);
|
|
||||||
|
|
||||||
log(`<bold:Package>: ${info.name}`);
|
|
||||||
log(` <green:Tarball Changed:> (bumping version)`);
|
|
||||||
log(` ${npmInfo.version} => ${info.version}`)
|
|
||||||
log(` <blue:Changed:>`);
|
|
||||||
let filenames = await getDiff(path, npmInfo.gitHead, true);
|
|
||||||
filenames.forEach((filename) => {
|
|
||||||
let short = filename.split("/").slice(1).join("/");
|
|
||||||
if (short.indexOf("/src.ts/") >= 0 || short.indexOf("/dist/") >= 0) {
|
|
||||||
log(` <bold:${short}>`);
|
|
||||||
} else {
|
|
||||||
log(` ${short}`);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
log("");
|
|
||||||
}
|
|
||||||
|
|
||||||
let existing = fs.readFileSync(ChangelogPath).toString();
|
|
||||||
let changelog = await generate();
|
|
||||||
if (existing !== changelog) {
|
|
||||||
let changelogStatus = await getStatus(ChangelogPath);
|
|
||||||
if (changelogStatus !== "unmodified") {
|
|
||||||
log("<bold:WARNING:> There are local changes to the CHANGELOG (they will be discarded)");
|
|
||||||
console.log(existing);
|
|
||||||
}
|
|
||||||
log("<bold:Updating CHANGELOG>...");
|
|
||||||
fs.writeFileSync(ChangelogPath, changelog);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
})();
|
|
||||||
@ -1,172 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const crypto = require('crypto');
|
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
const AWS = require('aws-sdk');
|
|
||||||
|
|
||||||
const config = require("../config");
|
|
||||||
|
|
||||||
|
|
||||||
const Bucket = "docs-beta.ethers.io";
|
|
||||||
|
|
||||||
|
|
||||||
function _getKeys(s3, result, nextToken, callback) {
|
|
||||||
const params = {
|
|
||||||
Bucket: Bucket,
|
|
||||||
MaxKeys: 1000,
|
|
||||||
ContinuationToken: nextToken,
|
|
||||||
};
|
|
||||||
s3.listObjectsV2(params, function(error, data) {
|
|
||||||
if (error) {
|
|
||||||
console.log(error);
|
|
||||||
callback(error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
data.Contents.forEach(function(item) {
|
|
||||||
result[item.Key] = item.ETag.replace(/"/g,'');
|
|
||||||
});
|
|
||||||
callback(null, data.IsTruncated ? data.NextContinuationToken: null);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getKeys(s3) {
|
|
||||||
const result = {};
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
function handleBlock(error, nextToken) {
|
|
||||||
if (error) {
|
|
||||||
reject(error);
|
|
||||||
} else if (nextToken) {
|
|
||||||
nextBlock(nextToken);
|
|
||||||
} else {
|
|
||||||
resolve(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function nextBlock(nextToken) {
|
|
||||||
_getKeys(s3, result, nextToken, handleBlock);
|
|
||||||
}
|
|
||||||
nextBlock(undefined);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getMime(filename) {
|
|
||||||
const comps = filename.split('.');
|
|
||||||
const ext = comps[comps.length - 1];
|
|
||||||
switch (ext.toLowerCase()) {
|
|
||||||
case 'css': return 'text/css';
|
|
||||||
case 'doctree': return 'application/x-doctree';
|
|
||||||
case 'eot': return 'application/vnd.ms-fontobject';
|
|
||||||
case 'gif': return 'image/gif';
|
|
||||||
case 'html': return 'text/html';
|
|
||||||
case 'js': return 'application/javascript';
|
|
||||||
case 'jpg': return 'image/jpeg';
|
|
||||||
case 'jpeg': return 'image/jpeg';
|
|
||||||
case 'md': return 'text/markdown';
|
|
||||||
case 'pickle': return 'application/x-pickle';
|
|
||||||
case 'png': return 'image/png';
|
|
||||||
case 'svg': return 'image/svg+xml';
|
|
||||||
case 'ttf': return 'application/x-font-ttf';
|
|
||||||
case 'txt': return 'text/plain';
|
|
||||||
case 'woff': return 'application/font-woff';
|
|
||||||
}
|
|
||||||
console.log('NO MIME', filename);
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
function putObject(s3, name, content) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
s3.putObject({
|
|
||||||
ACL: 'public-read',
|
|
||||||
Body: content,
|
|
||||||
Bucket: Bucket,
|
|
||||||
ContentType: getMime(name),
|
|
||||||
Key: name
|
|
||||||
}, function(error, data) {
|
|
||||||
if (error) {
|
|
||||||
reject(error);
|
|
||||||
} else {
|
|
||||||
console.log('Uplodaed:', name)
|
|
||||||
resolve({
|
|
||||||
name: name,
|
|
||||||
hash: data.ETag.replace(/"/g, '')
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function hash(filename) {
|
|
||||||
const hasher = crypto.createHash('md5');
|
|
||||||
hasher.update(fs.readFileSync(filename));
|
|
||||||
return hasher.digest().toString('hex');
|
|
||||||
}
|
|
||||||
|
|
||||||
function _getFiles(result, root) {
|
|
||||||
fs.readdirSync(root).forEach(function(filename) {
|
|
||||||
|
|
||||||
// We don't need to upload junk
|
|
||||||
if (filename === '.DS_Store') { return; }
|
|
||||||
|
|
||||||
const fullFilename = path.join(root, filename)
|
|
||||||
const stat = fs.statSync(fullFilename);
|
|
||||||
if (stat.isDirectory()) {
|
|
||||||
_getFiles(result, fullFilename);
|
|
||||||
} else {
|
|
||||||
result[fullFilename] = hash(fullFilename);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getFiles(dirs) {
|
|
||||||
const result = { } //"index.html": hash("index.html") };
|
|
||||||
dirs.forEach(function(dir) {
|
|
||||||
_getFiles(result, dir);
|
|
||||||
})
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
(async function() {
|
|
||||||
const awsAccessId = await config.get("aws-upload-docs-accesskey");
|
|
||||||
const awsSecretKey = await config.get("aws-upload-docs-secretkey");
|
|
||||||
|
|
||||||
const s3 = new AWS.S3({
|
|
||||||
apiVersion: '2006-03-01',
|
|
||||||
accessKeyId: awsAccessId,
|
|
||||||
secretAccessKey: awsSecretKey
|
|
||||||
});
|
|
||||||
|
|
||||||
const added = [], removed = [], changed = [], upload = [];
|
|
||||||
|
|
||||||
const local = await getFiles([ "docs" ]);
|
|
||||||
const remote = await getKeys(s3);
|
|
||||||
|
|
||||||
Object.keys(local).forEach((filename) => {
|
|
||||||
if (!remote[filename]) {
|
|
||||||
added.push(filename);
|
|
||||||
upload.push(filename);
|
|
||||||
} else if (remote[filename] != local[filename]) {
|
|
||||||
changed.push(filename);
|
|
||||||
upload.push(filename);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Object.keys(remote).forEach((filename) => {
|
|
||||||
if (!local[filename]) {
|
|
||||||
removed.push(filename);
|
|
||||||
} else if (!local[filename] && remote[filename] != local[filename]) {
|
|
||||||
changed.push(filename);
|
|
||||||
upload.push(filename);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('Added: ', added.length);
|
|
||||||
console.log('Removed: ', removed.length);
|
|
||||||
console.log('Changed: ', changed.length);
|
|
||||||
|
|
||||||
for (let i = 0; i < upload.length; i++) {
|
|
||||||
const filename = upload[i];
|
|
||||||
console.log("Uploading:", filename);
|
|
||||||
await putObject(s3, filename, fs.readFileSync(filename));
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
116
admin/config.js
116
admin/config.js
@ -1,116 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
const os = require("os");
|
|
||||||
const resolve = require("path").resolve;
|
|
||||||
|
|
||||||
const AES = require("aes-js");
|
|
||||||
const scrypt = require("scrypt-js");
|
|
||||||
|
|
||||||
const { prompt } = require("../packages/cli");
|
|
||||||
const randomBytes = require("../packages/random").randomBytes;
|
|
||||||
const computeHmac = require("../packages/sha2").computeHmac;
|
|
||||||
|
|
||||||
const colorify = require("./log").colorify;
|
|
||||||
|
|
||||||
function getScrypt(message, password, salt) {
|
|
||||||
let progressBar = prompt.getProgressBar(message);
|
|
||||||
return scrypt.scrypt(Buffer.from(password), Buffer.from(salt), (1 << 17), 8, 1, 64, progressBar);
|
|
||||||
}
|
|
||||||
|
|
||||||
function Config(filename) {
|
|
||||||
this.salt = null;
|
|
||||||
this.dkey = null;
|
|
||||||
this.values = { };
|
|
||||||
this.filename = filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
Config.prototype.load = async function() {
|
|
||||||
if (this.dkey) { return; }
|
|
||||||
|
|
||||||
let data = null;
|
|
||||||
if (fs.existsSync(this.filename)) {
|
|
||||||
data = JSON.parse(fs.readFileSync(this.filename));
|
|
||||||
} else {
|
|
||||||
data = {
|
|
||||||
salt: Buffer.from(randomBytes(32)).toString("hex")
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
this.salt = data.salt;
|
|
||||||
|
|
||||||
const password = await prompt.getPassword(colorify("Password (config-store): ", "bold"));
|
|
||||||
|
|
||||||
this.dkey = await getScrypt(colorify("Unlocking config", "bold"), password, this.salt);
|
|
||||||
|
|
||||||
if (data.ciphertext) {
|
|
||||||
const ciphertext = Buffer.from(data.ciphertext, "base64");
|
|
||||||
const iv = Buffer.from(data.iv, "base64");
|
|
||||||
const aes = new AES.ModeOfOperation.ctr(this.dkey.slice(0, 32), new AES.Counter(iv));
|
|
||||||
const plaintext = aes.decrypt(ciphertext);
|
|
||||||
const hmac = computeHmac("sha512", this.dkey.slice(32, 64), plaintext);
|
|
||||||
if (hmac !== data.hmac) {
|
|
||||||
throw new Error("wrong password");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.values = JSON.parse(Buffer.from(plaintext).toString());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Config.prototype.keys = async function() {
|
|
||||||
await this.load();
|
|
||||||
return Object.keys(this.values);
|
|
||||||
}
|
|
||||||
|
|
||||||
Config.prototype.save = function() {
|
|
||||||
this.values._junk = Buffer.from(randomBytes(16 + parseInt(Math.random() * 48))).toString("base64")
|
|
||||||
|
|
||||||
const plaintext = Buffer.from(JSON.stringify(this.values));
|
|
||||||
|
|
||||||
const iv = Buffer.from(randomBytes(16));
|
|
||||||
const hmac = computeHmac("sha512", this.dkey.slice(32, 64), plaintext);
|
|
||||||
|
|
||||||
const aes = new AES.ModeOfOperation.ctr(this.dkey.slice(0, 32), new AES.Counter(iv));
|
|
||||||
const ciphertext = Buffer.from(aes.encrypt(plaintext));
|
|
||||||
|
|
||||||
const data = {
|
|
||||||
ciphertext: ciphertext.toString("base64"),
|
|
||||||
iv: iv.toString("base64"),
|
|
||||||
salt: this.salt,
|
|
||||||
hmac: hmac
|
|
||||||
};
|
|
||||||
|
|
||||||
fs.writeFileSync(this.filename, JSON.stringify(data, null, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
Config.prototype.get = async function(key) {
|
|
||||||
await this.load();
|
|
||||||
return this.values[key];
|
|
||||||
};
|
|
||||||
|
|
||||||
Config.prototype.set = async function(key, value) {
|
|
||||||
await this.load();
|
|
||||||
this.values[key] = value;
|
|
||||||
this.save();
|
|
||||||
};
|
|
||||||
|
|
||||||
Config.prototype.lock = function() {
|
|
||||||
this.salt = this.dkey = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const config = new Config(resolve(os.homedir(), ".ethers-dist"));
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
get: function(key) {
|
|
||||||
return config.get(key);
|
|
||||||
},
|
|
||||||
set: function(key, value) {
|
|
||||||
config.set(key, value);
|
|
||||||
},
|
|
||||||
keys: function() {
|
|
||||||
return config.keys();
|
|
||||||
},
|
|
||||||
lock: function() {
|
|
||||||
config.lock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,94 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
|
|
||||||
const { loadJson, resolve } = require("./utils");
|
|
||||||
|
|
||||||
const ROOT = resolve("packages");
|
|
||||||
|
|
||||||
const dirnames = fs.readdirSync(ROOT);
|
|
||||||
|
|
||||||
function loadPackage(dirname) {
|
|
||||||
return loadJson(resolve("packages", dirname, "package.json"));
|
|
||||||
}
|
|
||||||
|
|
||||||
function getOrdered(skipNobuild) {
|
|
||||||
let packages = { };
|
|
||||||
let filenames = { };
|
|
||||||
|
|
||||||
let addDeps = (name, depends) => {
|
|
||||||
Object.keys(depends).forEach((dep) => {
|
|
||||||
// Not a package we manage
|
|
||||||
if (packages[dep] == null) { return; }
|
|
||||||
deps[name][dep] = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
let dirname = dirnames[i];
|
|
||||||
let info = loadPackage(dirname);
|
|
||||||
if (skipNobuild && info._ethers_nobuild) { continue; }
|
|
||||||
packages[info.name] = info;
|
|
||||||
filenames[info.name] = dirname;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Maps names to list of dependencies; { [ name:string]: Array<name: string> }
|
|
||||||
let deps = { };
|
|
||||||
let depGraph = { };
|
|
||||||
|
|
||||||
Object.keys(packages).forEach((name) => {
|
|
||||||
let info = packages[name];
|
|
||||||
deps[info.name] = { };
|
|
||||||
addDeps(info.name, info.dependencies || { });
|
|
||||||
addDeps(info.name, info.devDependencies || { });
|
|
||||||
deps[info.name] = Object.keys(deps[info.name]);
|
|
||||||
deps[info.name].sort();
|
|
||||||
});
|
|
||||||
|
|
||||||
let ordered = [ ];
|
|
||||||
let remaining = Object.keys(deps);
|
|
||||||
|
|
||||||
let isSatisfied = (name) => {
|
|
||||||
for (let i = 0; i < deps[name].length; i++) {
|
|
||||||
if (ordered.indexOf(deps[name][i]) === -1) { return false; }
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (remaining.length) {
|
|
||||||
let bail = true;
|
|
||||||
for (let i = 0; i < remaining.length; i++) {
|
|
||||||
if (!isSatisfied(remaining[i])) { continue; }
|
|
||||||
bail = false;
|
|
||||||
ordered.push(remaining[i]);
|
|
||||||
remaining.splice(i, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bail) {
|
|
||||||
throw new Error("Nothing processed; circular dependencies...");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ordered.map((name) => filenames[name]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function sort(dirnames) {
|
|
||||||
let ordered = getOrdered();
|
|
||||||
dirnames.sort((a, b) => {
|
|
||||||
let ai = ordered.indexOf(local.loadPackage(a).name);
|
|
||||||
let bi = ordered.indexOf(local.loadPackage(b).name);
|
|
||||||
if (ai === -1 || bi === -1) {
|
|
||||||
throw new Error("unknown dirname - " + [a, b].join(", "));
|
|
||||||
}
|
|
||||||
return ai - bi;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
dirnames: dirnames,
|
|
||||||
getOrdered: getOrdered,
|
|
||||||
loadPackage: loadPackage,
|
|
||||||
ROOT: ROOT,
|
|
||||||
sort: sort
|
|
||||||
}
|
|
||||||
186
admin/git.js
186
admin/git.js
@ -1,186 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const resolve = require("path").resolve;
|
|
||||||
const spawn = require("child_process").spawn;
|
|
||||||
|
|
||||||
const semver = require("semver");
|
|
||||||
|
|
||||||
const { run } = require("./build");
|
|
||||||
const { loadPackage } = require("./local");
|
|
||||||
|
|
||||||
function git(args) {
|
|
||||||
return run("git", args);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getStatus(filename) {
|
|
||||||
return git([ "status", "-s", resolve(__dirname, "..", filename) ]).then((result) => {
|
|
||||||
result = result.trim();
|
|
||||||
if (result === "") { return "unmodified"; }
|
|
||||||
switch (result.substring(0, 2)) {
|
|
||||||
case 'M ': return "modified";
|
|
||||||
case 'A ': return "added";
|
|
||||||
case 'D ': return "deleted";
|
|
||||||
case 'R ': return "renamed";
|
|
||||||
case 'C ': return "copied";
|
|
||||||
case 'U ': return "updated";
|
|
||||||
case '??': return "untracked";
|
|
||||||
}
|
|
||||||
console.log(result);
|
|
||||||
return "unknown";
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getChanges(latest) {
|
|
||||||
let diff = await git(["diff", "--name-only", latest ]);
|
|
||||||
|
|
||||||
// Map dirname => { dist: [ ], src: [ ] }
|
|
||||||
let changes = { "_": { filename: "_", dist: [], src: [] } };
|
|
||||||
|
|
||||||
diff.split("\n").forEach((line) => {
|
|
||||||
// e.g. packages/constants/index.d.ts
|
|
||||||
let comps = line.trim().split("/");
|
|
||||||
|
|
||||||
// Track non-packages as dist
|
|
||||||
if (comps.length < 2 || comps[0] !== "packages") {
|
|
||||||
let filename = comps.join("/").trim();
|
|
||||||
if (filename === "") { return; }
|
|
||||||
changes._.dist.push(filename);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let name = loadPackage(comps[1]).name;
|
|
||||||
|
|
||||||
let change = changes[name];
|
|
||||||
if (!change) {
|
|
||||||
change = { filename: comps[1], dist: [ ], src: [ ] }
|
|
||||||
changes[name] = change;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Split changes into source changes (src.ts/) or dist changes (output of TypeScript)
|
|
||||||
if (comps[2] === "src.ts") {
|
|
||||||
change.src.push(comps.join("/"));
|
|
||||||
} else {
|
|
||||||
change.dist.push(comps.join("/"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return changes;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getLatestTag() {
|
|
||||||
let seq = Promise.resolve();
|
|
||||||
|
|
||||||
// @TODO: Pull
|
|
||||||
if (false) {
|
|
||||||
seq = seq.then(() => {
|
|
||||||
console.log("Pulling remote changes...");
|
|
||||||
return git([ "pull" ]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
seq = seq.then(() => {
|
|
||||||
return git([ "tag" ]).then((tags) => {
|
|
||||||
tags = tags.split("\n").filter(tag => (tag.match(/^v[0-9]+\.[0-9]+\.[0-9]+\-/)));
|
|
||||||
tags.sort(semver.compare)
|
|
||||||
return tags.pop();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return seq;
|
|
||||||
}
|
|
||||||
|
|
||||||
function findChanges(latest) {
|
|
||||||
let seq = Promise.resolve();
|
|
||||||
|
|
||||||
seq = seq.then(() => {
|
|
||||||
return git(["diff", "--name-only", latest, "HEAD" ]).then((result) => {
|
|
||||||
let filenames = { };
|
|
||||||
result.split("\n").forEach((line) => {
|
|
||||||
// e.g. packages/constants/index.d.ts
|
|
||||||
let comps = line.trim().split("/");
|
|
||||||
if (comps.length < 2) { return; }
|
|
||||||
filenames[comps[1]] = true;
|
|
||||||
});
|
|
||||||
return Object.keys(filenames);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
seq = seq.then((filenames) => {
|
|
||||||
return filenames.map((filename) => {
|
|
||||||
let name = packages[filename].name;
|
|
||||||
return {
|
|
||||||
filename: filename,
|
|
||||||
name: name,
|
|
||||||
localVersion: getLocalVersion(name),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
seq = seq.then((packages) => {
|
|
||||||
let seq = Promise.resolve();
|
|
||||||
packages.forEach((p) => {
|
|
||||||
seq = seq.then(() => {
|
|
||||||
return getNpmVersion(p.name).then((version) => {
|
|
||||||
p.npmVersion = version;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return seq.then(() => packages);
|
|
||||||
});
|
|
||||||
return seq;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getGitTag(filename) {
|
|
||||||
let result = await git([ "log", "-n", "1", "--", filename ]);
|
|
||||||
result = result.trim();
|
|
||||||
if (!result) { return null; }
|
|
||||||
result = result.match(/^commit\s+([0-9a-f]{40})\n/i);
|
|
||||||
if (!result) { return null; }
|
|
||||||
return result[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getDiff(filename, tag, nameOnly) {
|
|
||||||
if (tag == null) { tag = "HEAD"; }
|
|
||||||
let cmd = [ "diff", "--name-only", tag, "--", filename ]
|
|
||||||
if (!nameOnly) { cmd.splice(1, 1); }
|
|
||||||
try {
|
|
||||||
let result = await git(cmd);
|
|
||||||
result = result.trim();
|
|
||||||
if (result === "") { return [ ]; }
|
|
||||||
return result.split("\n");
|
|
||||||
} catch (error) {
|
|
||||||
// This tag does not exist, so compare against beginning of time
|
|
||||||
// This happens when there is a new history (like an orphan branch)
|
|
||||||
if (error.stderr.trim().match(/^fatal: bad object/)) {
|
|
||||||
console.log("Could not find history; showing all");
|
|
||||||
let cmd = [ "rev-list", "--max-parents=0", "HEAD" ];
|
|
||||||
let tag = await git(cmd);
|
|
||||||
return getDiff(filename, tag.trim(), nameOnly);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getUntracked(filename) {
|
|
||||||
let cmd = [ "ls-files", "-o", "--exclude-standard"];
|
|
||||||
if (filename) {
|
|
||||||
cmd.push("--");
|
|
||||||
cmd.push(filename);
|
|
||||||
}
|
|
||||||
let result = await git(cmd);
|
|
||||||
result = result.trim();
|
|
||||||
if (result === "") { return [ ]; }
|
|
||||||
return result.split("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
findChanges: findChanges,
|
|
||||||
getChanges: getChanges,
|
|
||||||
getDiff: getDiff,
|
|
||||||
getGitTag: getGitTag,
|
|
||||||
getLatestTag: getLatestTag,
|
|
||||||
getStatus: getStatus,
|
|
||||||
getUntracked: getUntracked,
|
|
||||||
run: git,
|
|
||||||
}
|
|
||||||
162
admin/github.js
162
admin/github.js
@ -1,162 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
const { resolve } = require("path");
|
|
||||||
const zlib = require("zlib");
|
|
||||||
|
|
||||||
const { id } = require("../packages/hash");
|
|
||||||
const { fetchJson } = require("../packages/web");
|
|
||||||
|
|
||||||
const CacheDir = resolve(__dirname, "../github-cache/");
|
|
||||||
|
|
||||||
function addResponse(result, response) {
|
|
||||||
return { result, response };
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadFile(filename) {
|
|
||||||
return JSON.parse(zlib.gunzipSync(fs.readFileSync(filename)).toString());
|
|
||||||
//return JSON.parse(fs.readFileSync(filename).toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// @TODO: atomic
|
|
||||||
function saveFile(filename, content) {
|
|
||||||
fs.writeFileSync(filename, zlib.gzipSync(JSON.stringify(content)));
|
|
||||||
//fs.writeFileSync(filename, JSON.stringify(content));
|
|
||||||
}
|
|
||||||
|
|
||||||
function mockFetchJson(url, body, headers) {
|
|
||||||
return {
|
|
||||||
result: null,
|
|
||||||
response: {
|
|
||||||
statusCode: 304
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function _fetchGitHub(user, password, fetchJson, url) {
|
|
||||||
const result = [ ];
|
|
||||||
while (true) {
|
|
||||||
|
|
||||||
const filename = resolve(CacheDir, id(url).substring(2, 14));
|
|
||||||
|
|
||||||
const headers = {
|
|
||||||
"User-Agent": "ethers-io",
|
|
||||||
};
|
|
||||||
|
|
||||||
let items = null;
|
|
||||||
let link = null;
|
|
||||||
try {
|
|
||||||
const data = loadFile(filename);
|
|
||||||
headers["if-none-match"] = data.etag;
|
|
||||||
items = data.items;
|
|
||||||
link = data.link;
|
|
||||||
} catch (error) {
|
|
||||||
if (error.code !== "ENOENT") { throw error; }
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetch = await fetchJson({
|
|
||||||
url: url,
|
|
||||||
user: user,
|
|
||||||
password: password,
|
|
||||||
headers: headers
|
|
||||||
}, null, addResponse);
|
|
||||||
|
|
||||||
// Cached response is good; use it!
|
|
||||||
if (fetch.response.statusCode !== 304) {
|
|
||||||
items = fetch.result;
|
|
||||||
if (fetch.response.headers) {
|
|
||||||
link = (fetch.response.headers.link || null);
|
|
||||||
}
|
|
||||||
if (fetch.response.headers.etag){
|
|
||||||
saveFile(filename, {
|
|
||||||
timestamp: (new Date()).getTime(),
|
|
||||||
url: url,
|
|
||||||
link: link,
|
|
||||||
etag: fetch.response.headers.etag,
|
|
||||||
items: items,
|
|
||||||
version: 1
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
items.forEach((item) => { result.push(item)});
|
|
||||||
|
|
||||||
url = null;
|
|
||||||
(link || "").split(",").forEach((item) => {
|
|
||||||
if (item.indexOf('rel="next"') >= 0) {
|
|
||||||
const match = item.match(/<([^>]*)>/);
|
|
||||||
if (match) { url = match[1]; }
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!url) { break; }
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchGitHub(user, password, url, cacheOnly) {
|
|
||||||
if (cacheOnly) {
|
|
||||||
return await _fetchGitHub("none", "none", mockFetchJson, url);
|
|
||||||
}
|
|
||||||
|
|
||||||
const results = await _fetchGitHub(user, password, fetchJson, url);
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async function _getIssues(user, password) {
|
|
||||||
const cacheOnly = (user == null);
|
|
||||||
|
|
||||||
let issues = await fetchGitHub(user, password, "https://api.github.com/repos/ethers-io/ethers.js/issues?state=all&per_page=100", cacheOnly)
|
|
||||||
if (!cacheOnly) { console.log(`Found ${ issues.length } issues`); }
|
|
||||||
const result = [ ];
|
|
||||||
for (let i = 0; i < issues.length; i++) {
|
|
||||||
const issue = issues[i];
|
|
||||||
let comments = await fetchGitHub(user, password, issue.comments_url, cacheOnly);
|
|
||||||
result.push({ issue, comments});
|
|
||||||
if (!cacheOnly) { console.log(` Issue ${ issue.number }: ${ comments.length } comments`); }
|
|
||||||
}
|
|
||||||
result.sort((a, b) => (a.issue.number - b.issue.number));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getIssues() {
|
|
||||||
return _getIssues();
|
|
||||||
}
|
|
||||||
|
|
||||||
function syncIssues(user, password) {
|
|
||||||
return _getIssues(user, password);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function createRelease(user, password, tagName, title, body, prerelease, commit) {
|
|
||||||
const payload = {
|
|
||||||
tag_name: tagName,
|
|
||||||
target_commitish: (commit || "master"),
|
|
||||||
name: title,
|
|
||||||
body: body,
|
|
||||||
//draft: true,
|
|
||||||
draft: false,
|
|
||||||
prerelease: !!prerelease
|
|
||||||
};
|
|
||||||
|
|
||||||
const headers = {
|
|
||||||
"User-Agent": "ethers-io",
|
|
||||||
};
|
|
||||||
|
|
||||||
const result = await fetchJson({
|
|
||||||
url: "https://api.github.com/repos/ethers-io/ethers.js/releases",
|
|
||||||
user: user,
|
|
||||||
password: password,
|
|
||||||
headers: headers
|
|
||||||
}, JSON.stringify(payload));
|
|
||||||
|
|
||||||
|
|
||||||
return result.html_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
getIssues,
|
|
||||||
syncIssues,
|
|
||||||
createRelease,
|
|
||||||
}
|
|
||||||
|
|
||||||
401
admin/index.js
401
admin/index.js
@ -1,401 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
const resolve = require("path").resolve;
|
|
||||||
|
|
||||||
const diff = require("diff");
|
|
||||||
const semver = require("semver");
|
|
||||||
|
|
||||||
const { prompt } = require("../packages/cli");
|
|
||||||
|
|
||||||
const build = require("./build");
|
|
||||||
const changelog = require("./changelog");
|
|
||||||
const depgraph = require("./depgraph");
|
|
||||||
const { colorify, colorifyStatus, log } = require("./log");
|
|
||||||
const config = require("./config")
|
|
||||||
const git = require("./git");
|
|
||||||
const local = require("./local");
|
|
||||||
const npm = require("./npm");
|
|
||||||
const utils = require("./utils");
|
|
||||||
|
|
||||||
/*
|
|
||||||
async function runChanged(dirnames, callback) {
|
|
||||||
try {
|
|
||||||
await callback(dirname, info, npmInfo);
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error);
|
|
||||||
console.log(colorify("Aborting! " + error.message));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
if (diff) {
|
|
||||||
} else {
|
|
||||||
*/
|
|
||||||
|
|
||||||
async function runDiff(dirnames) {
|
|
||||||
// Default to all packages
|
|
||||||
if (dirnames == null || dirnames.length === 0) { dirnames = local.dirnames; }
|
|
||||||
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
let dirname = dirnames[i];
|
|
||||||
|
|
||||||
// Get local (update the tarballHash) and remote package.json
|
|
||||||
let info = await local.loadPackage(dirname);
|
|
||||||
let npmInfo = await npm.getPackageVersion(info.name);
|
|
||||||
if (!npmInfo) { npmInfo = { gitHead: "HEAD", version: "NEW" }; }
|
|
||||||
|
|
||||||
let delta = await git.getDiff(resolve(__dirname, "../packages", dirname), npmInfo.gitHead);
|
|
||||||
|
|
||||||
if (delta.length === 0) { continue; }
|
|
||||||
|
|
||||||
// Bump the version if necessary
|
|
||||||
if (info.version === npmInfo.version) {
|
|
||||||
info.version = semver.inc(info.version, "prerelease", "beta");
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(colorify("<bold:Package>: ") + info.name);
|
|
||||||
console.log(colorify(" <green:Git Head Changed:> (run update to bump version)"));
|
|
||||||
console.log(" " + npmInfo.gitHead)
|
|
||||||
console.log(" " + npmInfo.version + colorify(" => ", "bold") + info.version)
|
|
||||||
|
|
||||||
console.log(colorify(" Diff", "bold"));
|
|
||||||
delta.forEach((line) => {
|
|
||||||
let color = "blue";
|
|
||||||
switch (line.substring(0, 1)) {
|
|
||||||
case '+':
|
|
||||||
color = "green";
|
|
||||||
break;
|
|
||||||
case '-':
|
|
||||||
color = "red";
|
|
||||||
break;
|
|
||||||
case ' ':
|
|
||||||
color = "normal";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
console.log(" " + colorify(line, color));
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log("");
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("");
|
|
||||||
}
|
|
||||||
|
|
||||||
async function updateChangelog() {
|
|
||||||
let filename = resolve(local.ROOT, "../CHANGELOG.md");
|
|
||||||
|
|
||||||
let lastVersion = await git.getLatestTag();
|
|
||||||
let newVersion = "v" + local.getVersion("ethers");
|
|
||||||
|
|
||||||
let current = fs.readFileSync(filename).toString();
|
|
||||||
let log = await changelog.generate();
|
|
||||||
if (log === current) { return; }
|
|
||||||
|
|
||||||
let changes = diff.createTwoFilesPatch("CHANGELOG-old.md", "CHANGELOG.md", current, log, lastVersion, newVersion);
|
|
||||||
console.log(changes);
|
|
||||||
|
|
||||||
try {
|
|
||||||
let response = await prompt.getChoice(colorify("Accept changes?", "bold"), "yn", "n");
|
|
||||||
if (response === "n") { throw new Error("Not changing."); }
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Abort: " + error.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fs.writeFileSync(filename, log);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Updates the dependency-graph (tsconfig.project.json) so the build order is correct
|
|
||||||
async function runUpdateDepgraph() {
|
|
||||||
log(`<bold:Updating dependency-graph build order (tsconfig.project.json)...>`);
|
|
||||||
let ordered = depgraph.getOrdered();
|
|
||||||
|
|
||||||
let path = resolve(local.ROOT, "../tsconfig.project.json")
|
|
||||||
|
|
||||||
let projectConfig = local.loadJson(path);
|
|
||||||
projectConfig.references = ordered.map((name) => ({ path: ("./packages/" + name) }));
|
|
||||||
local.saveJson(path, projectConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function runUpdate(dirnames) {
|
|
||||||
|
|
||||||
// Check for untracked files...
|
|
||||||
let untracked = [ ];
|
|
||||||
if (dirnames == null || dirnames.length === 0) {
|
|
||||||
dirnames = local.dirnames;
|
|
||||||
let filenames = await git.getUntracked(resolve(__dirname, ".."));
|
|
||||||
for (let i = 0; i < filenames.length; i++) {
|
|
||||||
untracked.push(filenames[i]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
let filenames = await git.getUntracked(resolve(local.ROOT, dirnames[i]));
|
|
||||||
for (let j = 0; j < filenames.length; j++) {
|
|
||||||
untracked.push(filenames[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Untracked files! Abort.
|
|
||||||
if (untracked.length) {
|
|
||||||
log("<bold:Untracked Files:>");
|
|
||||||
untracked.forEach((filename) => {
|
|
||||||
console.log(" " + filename);
|
|
||||||
});
|
|
||||||
log("<red:Aborting.>");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
log(`<bold:Run TypeScript build...>`);
|
|
||||||
await build.runBuild()
|
|
||||||
|
|
||||||
log("");
|
|
||||||
|
|
||||||
// @TODO: Root
|
|
||||||
|
|
||||||
// Update all the package.json and _version.ts
|
|
||||||
let progress = prompt.getProgressBar(colorify("Updating versions", "bold"));
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
progress(i / dirnames.length);
|
|
||||||
|
|
||||||
let dirname = dirnames[i];
|
|
||||||
let path = resolve(__dirname, "../packages/", dirname);
|
|
||||||
|
|
||||||
// Get local package.json (update the tarballHash)
|
|
||||||
let info = await local.updatePackage(dirname);
|
|
||||||
|
|
||||||
// Get the remote package.json (or sub in a placeholder for new pacakges)
|
|
||||||
let npmInfo = await npm.getPackageVersion(info.name);
|
|
||||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
|
||||||
|
|
||||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
|
||||||
|
|
||||||
// Bump the version if necessary
|
|
||||||
if (info.version === npmInfo.version) {
|
|
||||||
let newVersion = semver.inc(info.version, "prerelease", "beta");
|
|
||||||
|
|
||||||
// Write out the _version.ts
|
|
||||||
if (!info._ethers_skipPrepare) {
|
|
||||||
let code = "export const version = " + JSON.stringify(newVersion) + ";\n";
|
|
||||||
fs.writeFileSync(resolve(path, "src.ts/_version.ts"), code);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the package.json (we do this after _version, so if we fail,
|
|
||||||
// this remains old; which is what triggers the version bump)
|
|
||||||
info = await local.updatePackage(dirname, { version: newVersion });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
progress(1);
|
|
||||||
|
|
||||||
// Build the TypeScript sources
|
|
||||||
log("<bold:Runing TypeScript build...>");
|
|
||||||
try {
|
|
||||||
await build.runTsc();
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error);
|
|
||||||
log("<red:Aborting.>");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the dist
|
|
||||||
// @TODO:
|
|
||||||
|
|
||||||
// Update the tarball hash now that _version and package.json may have changed.
|
|
||||||
progress = prompt.getProgressBar(colorify("Updating tarballHash", "bold"));
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
progress(i / dirnames.length);
|
|
||||||
await local.updatePackage(dirnames[i]);
|
|
||||||
}
|
|
||||||
progress(1);
|
|
||||||
|
|
||||||
// Show the changed files (compared to npm)
|
|
||||||
for (let i = 0; i < dirnames.length; i++) {
|
|
||||||
let dirname = dirnames[i];
|
|
||||||
|
|
||||||
// Get local package.json
|
|
||||||
let info = await local.loadPackage(dirname);
|
|
||||||
let path = resolve(__dirname, "../packages/", dirname);
|
|
||||||
|
|
||||||
// Get the remote package.json (or sub in a placeholder for new pacakges)
|
|
||||||
let npmInfo = await npm.getPackageVersion(info.name);
|
|
||||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
|
||||||
|
|
||||||
// No change
|
|
||||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
|
||||||
|
|
||||||
let gitHead = await git.getGitTag(path);
|
|
||||||
|
|
||||||
log(`<bold:Package>: ${info.name}`);
|
|
||||||
log(` <green:Tarball Changed:> (bumping version)`);
|
|
||||||
log(` ${npmInfo.version} => ${info.version}`)
|
|
||||||
log(` <blue:Changed:>`);
|
|
||||||
let filenames = await git.getDiff(resolve(__dirname, "../packages", dirname), npmInfo.gitHead, true);
|
|
||||||
filenames.forEach((filename) => {
|
|
||||||
let short = filename.split("/").slice(1).join("/");
|
|
||||||
if (short.indexOf("/src.ts/") >= 0) {
|
|
||||||
log(` <bold:${short}>`);
|
|
||||||
} else {
|
|
||||||
log(` ${short}`);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
log("");
|
|
||||||
}
|
|
||||||
|
|
||||||
// @TODO: Changelog
|
|
||||||
await updateChangelog();
|
|
||||||
}
|
|
||||||
|
|
||||||
async function runAdd(type, names) {
|
|
||||||
let latest = await git.getLatestTag();
|
|
||||||
console.log("");
|
|
||||||
console.log(colorify("<bold:Latest Published>: ") + latest);
|
|
||||||
console.log("");
|
|
||||||
|
|
||||||
let changes = await git.getChanges("HEAD");
|
|
||||||
|
|
||||||
if (!names || names.length === 0) {
|
|
||||||
names = Object.keys(changes);
|
|
||||||
}
|
|
||||||
|
|
||||||
let filenames = [ ];
|
|
||||||
for (let i = 0; i < names.length; i++) {
|
|
||||||
let name = names[i];
|
|
||||||
let change = changes[name] || changes[(packages[name] || {}).name];
|
|
||||||
if (!change) { return; }
|
|
||||||
change[type].forEach((filename) => {
|
|
||||||
filenames.push(filename);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filenames.length === 0) {
|
|
||||||
console.log(colorify("<bold:Nothing to add.>"));
|
|
||||||
console.log("");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < filenames.length; i++) {
|
|
||||||
let filename = filenames[i];
|
|
||||||
let status = await git.getStatus(filename);
|
|
||||||
console.log(" " + colorifyStatus(status) + ": " + utils.repeat(" ", 10 - status.length) + filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("");
|
|
||||||
|
|
||||||
try {
|
|
||||||
let response = await prompt.getChoice(colorify("Add these files?", "bold"), "yn", "n");
|
|
||||||
if (response === "n") { throw new Error("Not adding."); }
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Abort: " + error.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let params = filenames.map((f) => f); //resolve(ROOT, f));
|
|
||||||
params.unshift("--");
|
|
||||||
params.unshift("add");
|
|
||||||
|
|
||||||
console.log("git " + params.join(" "));
|
|
||||||
|
|
||||||
try {
|
|
||||||
await git.run(params);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Error: (status: " + error.code + ")");
|
|
||||||
console.log(" " + error.stderr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("Added.");
|
|
||||||
}
|
|
||||||
|
|
||||||
function runDist() {
|
|
||||||
// Run npm dist
|
|
||||||
// Generate changelog
|
|
||||||
// run status to update all the package
|
|
||||||
// add dist files?
|
|
||||||
}
|
|
||||||
|
|
||||||
async function runPublish(dirnames) {
|
|
||||||
|
|
||||||
// @TODO: Make sure there are no staged files
|
|
||||||
|
|
||||||
// @TODO: Make sure the repo has been pushed
|
|
||||||
|
|
||||||
// @TODO: Run the publish in the correct order
|
|
||||||
|
|
||||||
// Get the authentication token from our encrypted store
|
|
||||||
let token = await config.get("token");
|
|
||||||
token = token.trim().split("=");
|
|
||||||
|
|
||||||
let options = {
|
|
||||||
npmVersion: "ethers-dist@0.0.0",
|
|
||||||
tag: "next"
|
|
||||||
};
|
|
||||||
|
|
||||||
// Set the authentication token
|
|
||||||
options[token[0]] = token[1];
|
|
||||||
|
|
||||||
if (dirnames == null || dirnames.length === 0) { dirnames = local.dirnames; }
|
|
||||||
depgraph.sort(dirnames);
|
|
||||||
|
|
||||||
await runChanged(dirnames, async (dirname, info, npmInfo) => {
|
|
||||||
console.log(colorify("<bold:Publishing:> ") + info.name + "...")
|
|
||||||
console.log(colorify(" Version: ", "blue") + npmInfo.version + colorify(" => ", "bold") + info.version);
|
|
||||||
|
|
||||||
let success = await npm.publish(dirname, options);
|
|
||||||
if (!success) {
|
|
||||||
console.log(colorify(" <red:FAILED! Aborting.>"));
|
|
||||||
throw new Error("");
|
|
||||||
}
|
|
||||||
console.log(colorify(" <green:Done.>"));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function runTest() {
|
|
||||||
let r = await git([ "tag", "--porcelain", "-a", "-m", "Title of Release\n\nHello\n-----\n\nTesting 4 **bold** #1\nHello World", "test6", "HEAD" ]);
|
|
||||||
console.log(r);
|
|
||||||
try {
|
|
||||||
r = await git([ "push", "--tags" ])
|
|
||||||
} catch(e) { console.log(e); }
|
|
||||||
console.log(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
let args = process.argv.slice(2);
|
|
||||||
switch (args[0]) {
|
|
||||||
|
|
||||||
// Compare published to current stage
|
|
||||||
case "diff":
|
|
||||||
return runDiff(args.slice(1));
|
|
||||||
|
|
||||||
// Add unchecked-in source files
|
|
||||||
case "add-source":
|
|
||||||
return runAdd("src", args.slice(1));
|
|
||||||
|
|
||||||
// Update all package.json. the changelog and dist files
|
|
||||||
case "update":
|
|
||||||
return runUpdate(args.slice(1));
|
|
||||||
|
|
||||||
// Update dependency graph (./tsconfig-project.json)
|
|
||||||
case "update-depgraph":
|
|
||||||
return runUpdateDepgraph();
|
|
||||||
|
|
||||||
// Add unchecked-in dist files
|
|
||||||
case "add-dist":
|
|
||||||
return runAdd("dist", args.slice(1));
|
|
||||||
|
|
||||||
|
|
||||||
// Add unchecked-in source files
|
|
||||||
case "changelog":
|
|
||||||
return updateChangelog();
|
|
||||||
|
|
||||||
// Add unchecked-in source files
|
|
||||||
case "publish":
|
|
||||||
return runPublish(args.slice(1));
|
|
||||||
|
|
||||||
case "test":
|
|
||||||
return runTest();
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
101
admin/local.js
101
admin/local.js
@ -1,101 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const packlist = require("npm-packlist");
|
|
||||||
const tar = require("tar");
|
|
||||||
|
|
||||||
const keccak256 = (function() {
|
|
||||||
try {
|
|
||||||
return require("../packages/keccak256").keccak256;
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Cannot load Keccak256 (maybe not built yet? Not really a problem for most things)");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
|
|
||||||
const { dirnames, loadPackage, ROOT } = require("./depgraph");
|
|
||||||
const { resolve, saveJson } = require("./utils");
|
|
||||||
|
|
||||||
function sorted(obj) {
|
|
||||||
if (Array.isArray(obj)) { return obj.map(sorted); }
|
|
||||||
if (obj == null || typeof(obj) !== "object") { return obj; }
|
|
||||||
|
|
||||||
const keys = Object.keys(obj);
|
|
||||||
keys.sort();
|
|
||||||
|
|
||||||
const result = { };
|
|
||||||
keys.forEach((key) => { result[key] = sorted(obj[key]); });
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function savePackage(dirname, info) {
|
|
||||||
return saveJson(resolve(ROOT, dirname, "package.json"), sorted(info));
|
|
||||||
}
|
|
||||||
|
|
||||||
async function createTarball(dirname) {
|
|
||||||
let base = resolve(ROOT, dirname);
|
|
||||||
|
|
||||||
// From NPM publish, create the packed version
|
|
||||||
let files = await packlist({ path: base });
|
|
||||||
files = files.map((f) => ("./" + f));
|
|
||||||
|
|
||||||
let options = {
|
|
||||||
cwd: base,
|
|
||||||
prefix: 'package/',
|
|
||||||
portable: true,
|
|
||||||
sync: true,
|
|
||||||
// Provide a specific date in the 1980s for the benefit of zip,
|
|
||||||
// which is confounded by files dated at the Unix epoch 0.
|
|
||||||
mtime: new Date('1985-10-26T08:15:00.000Z'),
|
|
||||||
gzip: true
|
|
||||||
};
|
|
||||||
|
|
||||||
// Take the hash of the package sans
|
|
||||||
return tar.create(options, files).read();
|
|
||||||
}
|
|
||||||
|
|
||||||
async function updatePackage(dirname, values) {
|
|
||||||
let info = loadPackage(dirname);
|
|
||||||
|
|
||||||
if (values) {
|
|
||||||
for (let key in values) {
|
|
||||||
info[key] = values[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
["dependencies", "devDependencies"].forEach((key) => {
|
|
||||||
let deps = info[key] || [];
|
|
||||||
for (let name in deps) {
|
|
||||||
if (name.substring(0, "@ethersproject".length) === "@ethersproject" || name === "ethers") {
|
|
||||||
deps[name] = ">5.0.0-beta.0";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
//if (dirname !== "ethers") {
|
|
||||||
// delete info.publishConfig.tag;
|
|
||||||
//}
|
|
||||||
|
|
||||||
// Create a normalized version sans tarballHash to compute the tarballHash
|
|
||||||
delete info.tarballHash;
|
|
||||||
savePackage(dirname, info);
|
|
||||||
|
|
||||||
// Compute the tarballHash
|
|
||||||
let tarball = await createTarball(dirname);
|
|
||||||
info.tarballHash = keccak256(tarball);
|
|
||||||
|
|
||||||
// Save the updated package.json to disk
|
|
||||||
savePackage(dirname, info);
|
|
||||||
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
ROOT: ROOT,
|
|
||||||
createTarball: createTarball,
|
|
||||||
dirnames: dirnames,
|
|
||||||
getVersion: function(dirname) { return ((loadPackage(dirname) || {}).version || null); },
|
|
||||||
loadPackage: loadPackage,
|
|
||||||
savePackage: savePackage,
|
|
||||||
updatePackage: updatePackage,
|
|
||||||
}
|
|
||||||
53
admin/log.js
53
admin/log.js
@ -1,53 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
function getColor(color) {
|
|
||||||
if (!color || color === "normal") { return "\x1b[0m"; }
|
|
||||||
return "\x1b[1m" + ({
|
|
||||||
blue: "\x1b[34m",
|
|
||||||
cyan: "\x1b[36m",
|
|
||||||
green: "\x1b[32m",
|
|
||||||
magenta: "\x1b[35m",
|
|
||||||
red: "\x1b[31m",
|
|
||||||
yellow: "\x1b[33m",
|
|
||||||
bold: ""
|
|
||||||
})[color];
|
|
||||||
}
|
|
||||||
|
|
||||||
// See: https://stackoverflow.com/questions/9781218/how-to-change-node-jss-console-font-color
|
|
||||||
let disableColor = !(process.stdout.isTTY);
|
|
||||||
function colorify(message, color) {
|
|
||||||
if (color) {
|
|
||||||
if (disableColor) { return message; }
|
|
||||||
return getColor(color) + message + getColor();
|
|
||||||
}
|
|
||||||
|
|
||||||
return message.replace(/<([^:]*):((?:[^<>\\]|\\.)*)>/g, (all, color, message) => {
|
|
||||||
message = message.replace("\\>", ">");
|
|
||||||
if (disableColor) { return message; }
|
|
||||||
return getColor(color) + message + getColor();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function colorifyStatus(status) {
|
|
||||||
switch (status) {
|
|
||||||
case "modified": return colorify("<blue:" + status + ">");
|
|
||||||
case "added": return colorify("<green:" + status + ">");
|
|
||||||
case "deleted": return colorify("<red:" + status + ">");
|
|
||||||
case "unmodified": return colorify("<magenta:" + status + ">");
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
function log(message, color) {
|
|
||||||
if (color) {
|
|
||||||
console.log(colorify(message, color));
|
|
||||||
} else {
|
|
||||||
console.log(colorify(message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
colorify: colorify,
|
|
||||||
colorifyStatus: colorifyStatus,
|
|
||||||
log: log
|
|
||||||
}
|
|
||||||
104
admin/npm.js
104
admin/npm.js
@ -1,104 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const resolve = require("path").resolve;
|
|
||||||
|
|
||||||
const npm = require("libnpm");
|
|
||||||
const semver = require("semver");
|
|
||||||
|
|
||||||
const local = require("./local");
|
|
||||||
|
|
||||||
const keccak256 = require("../packages/keccak256").keccak256;
|
|
||||||
const fetchJson = require("../packages/web").fetchJson;
|
|
||||||
const { prompt } = require("../packages/cli");
|
|
||||||
|
|
||||||
const colorify = require("./log").colorify;
|
|
||||||
const git = require("./git");
|
|
||||||
|
|
||||||
|
|
||||||
let cache = { };
|
|
||||||
|
|
||||||
async function getPackage(name) {
|
|
||||||
if (cache[name]) { return cache[name]; }
|
|
||||||
|
|
||||||
return fetchJson("http:/" + "/registry.npmjs.org/" + name).then((result) => {
|
|
||||||
cache[name] = result;
|
|
||||||
return result;
|
|
||||||
}, (error) => {
|
|
||||||
if (error.status === 404) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
throw error;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getVersion(name) {
|
|
||||||
return getPackage(name).then((result) => {
|
|
||||||
if (!result) { return null; }
|
|
||||||
let versions = Object.keys(result.versions);
|
|
||||||
versions.sort(semver.compare)
|
|
||||||
return versions.pop();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getPackageVersion(name, version) {
|
|
||||||
let info = await getPackage(name)
|
|
||||||
if (!info) { return null; }
|
|
||||||
|
|
||||||
if (version == null) {
|
|
||||||
let versions = Object.keys(info.versions);
|
|
||||||
versions.sort(semver.compare);
|
|
||||||
version = versions.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
return info.versions[version] || null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getTarballHash(name, version) {
|
|
||||||
let info = await getPackageVersion(name, version);
|
|
||||||
return (info || {}).tarballHash;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function _publish(info, tarball, options) {
|
|
||||||
try {
|
|
||||||
let result = await npm.publish(info, tarball, options);
|
|
||||||
return result;
|
|
||||||
} catch (error) {
|
|
||||||
|
|
||||||
// We need an OTP
|
|
||||||
if (error.code === "EOTP") {
|
|
||||||
try {
|
|
||||||
let otp = await prompt.getMessage(colorify("Enter OTP: ", "bold"));
|
|
||||||
options.otp = otp.replace(" ", "");
|
|
||||||
} catch (error) {
|
|
||||||
|
|
||||||
// CTRL-C
|
|
||||||
if (error.message === "cancelled") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Something unexpected...
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retry with the new OTP
|
|
||||||
return _publish(info, tarball, options);
|
|
||||||
}
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function publish(dirname, options) {
|
|
||||||
let info = local.loadPackage(dirname);
|
|
||||||
info.gitHead = await git.getGitTag(resolve(__dirname, "../packages/", dirname));
|
|
||||||
if (info.gitHead == null) { throw new Error("no git tag found - " + dirname); }
|
|
||||||
let tarball = await local.createTarball(dirname);
|
|
||||||
return _publish(info, tarball, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
getPackage: getPackage,
|
|
||||||
getPackageVersion: getPackageVersion,
|
|
||||||
getTarballHash: getTarballHash,
|
|
||||||
getVersion: getVersion,
|
|
||||||
publish: publish,
|
|
||||||
};
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "DevelopmentChain",
|
|
||||||
"engine": {
|
|
||||||
"instantSeal": null
|
|
||||||
},
|
|
||||||
"params": {
|
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"accountStartNonce": "0x0",
|
|
||||||
"maximumExtraDataSize": "0x20",
|
|
||||||
"minGasLimit": "0x1388",
|
|
||||||
"networkID" : "0x11",
|
|
||||||
"registrar" : "0x0000000000000000000000000000000000001337",
|
|
||||||
"maxCodeSize": 24576,
|
|
||||||
"maxCodeSizeTransition": "0x0",
|
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
|
||||||
"eip140Transition": "0x0",
|
|
||||||
"eip145Transition": "0x0",
|
|
||||||
"eip150Transition": "0x0",
|
|
||||||
"eip155Transition": "0x0",
|
|
||||||
"eip160Transition": "0x0",
|
|
||||||
"eip161abcTransition": "0x0",
|
|
||||||
"eip161dTransition": "0x0",
|
|
||||||
"eip211Transition": "0x0",
|
|
||||||
"eip214Transition": "0x0",
|
|
||||||
"eip658Transition": "0x0",
|
|
||||||
"wasmActivationTransition": "0x0"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"seal": {
|
|
||||||
"generic": "0x0"
|
|
||||||
},
|
|
||||||
"difficulty": "0x20000",
|
|
||||||
"author": "0x0000000000000000000000000000000000000000",
|
|
||||||
"timestamp": "0x00",
|
|
||||||
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"extraData": "0x",
|
|
||||||
"gasLimit": "0x7A1200"
|
|
||||||
},
|
|
||||||
"accounts": {
|
|
||||||
"0000000000000000000000000000000000000001": { "balance": "1", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
|
|
||||||
"0000000000000000000000000000000000000002": { "balance": "1", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
|
|
||||||
"0000000000000000000000000000000000000003": { "balance": "1", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
|
|
||||||
"0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
|
|
||||||
"0000000000000000000000000000000000000005": { "balance": "1", "builtin": { "name": "modexp", "activate_at": 0, "pricing": { "modexp": { "divisor": 20 } } } },
|
|
||||||
"0000000000000000000000000000000000000006": { "balance": "1", "builtin": { "name": "alt_bn128_add", "activate_at": 0, "pricing": { "linear": { "base": 500, "word": 0 } } } },
|
|
||||||
"0000000000000000000000000000000000000007": { "balance": "1", "builtin": { "name": "alt_bn128_mul", "activate_at": 0, "pricing": { "linear": { "base": 40000, "word": 0 } } } },
|
|
||||||
"0000000000000000000000000000000000000008": { "balance": "1", "builtin": { "name": "alt_bn128_pairing", "activate_at": 0, "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } },
|
|
||||||
"0x7454a8f5a7c7555d79b172c89d20e1f4e4cc226c": { "balance": "1606938044258990275541962092341162602522202993782792835301376" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -1 +0,0 @@
|
|||||||
{"id":"24d70b97-fff9-d322-e760-4b8cc2e21751","version":3,"crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"45d392cd16dbbd5c0f5b2d145c112da9"},"ciphertext":"b001ccd09fc5431dc055975b58ee61f86e85529245506c04182c902716e750e5","kdf":"pbkdf2","kdfparams":{"c":10240,"dklen":32,"prf":"hmac-sha256","salt":"028594da27a0e864105f33b912e5dc6ce7c75ecd13c81bfc158fe963d30c93bb"},"mac":"374bf2e9144b74b889708abc19e9ebc164f90bc27e83fd9f01da4571a9f81a70"},"address":"7454a8f5a7c7555d79b172c89d20e1f4e4cc226c","name":"","meta":"{}"}
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
const fs = require("fs");
|
|
||||||
const _resolve = require("path").resolve;
|
|
||||||
|
|
||||||
function repeat(chr, length) {
|
|
||||||
let result = chr;
|
|
||||||
while (result.length < length) { result += chr; }
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function zpad(value) {
|
|
||||||
value = String(value);
|
|
||||||
while (value.length < 2) { value = "0" + value; }
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getDate(date) {
|
|
||||||
return [
|
|
||||||
date.getFullYear(),
|
|
||||||
zpad(date.getMonth() + 1),
|
|
||||||
zpad(date.getDate())
|
|
||||||
].join("-");
|
|
||||||
}
|
|
||||||
|
|
||||||
function getDateTime(date) {
|
|
||||||
return getDate(date) + " " + [
|
|
||||||
zpad(date.getHours()) ,
|
|
||||||
zpad(date.getMinutes() + 1)
|
|
||||||
].join(":");
|
|
||||||
}
|
|
||||||
|
|
||||||
function today() {
|
|
||||||
return getDate(new Date());
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadJson(filename) {
|
|
||||||
return JSON.parse(fs.readFileSync(filename).toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// @TODO: atomic write
|
|
||||||
function saveJson(filename, json) {
|
|
||||||
fs.writeFileSync(filename, JSON.stringify(json, null, 2) + "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolve(...args) {
|
|
||||||
args = args.slice();
|
|
||||||
args.unshift("..");
|
|
||||||
args.unshift(__dirname);
|
|
||||||
return _resolve.apply(null, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
resolve: resolve,
|
|
||||||
|
|
||||||
loadJson: loadJson,
|
|
||||||
saveJson: saveJson,
|
|
||||||
|
|
||||||
repeat: repeat,
|
|
||||||
|
|
||||||
today: today,
|
|
||||||
getDate: getDate,
|
|
||||||
getDateTime: getDateTime
|
|
||||||
}
|
|
||||||
22
dist/README.md
vendored
Normal file
22
dist/README.md
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
Distribution Folder
|
||||||
|
===================
|
||||||
|
|
||||||
|
The contents of this folder are for using `import` in ESM
|
||||||
|
browser-base projects.
|
||||||
|
|
||||||
|
The `ethers.js` (and `ethers.min.js`) files only include the
|
||||||
|
English wordlist to conserve space.
|
||||||
|
|
||||||
|
For additional Wordlist support, the `wordlist-extra.js` (and
|
||||||
|
`wordlist-extra.min.js`) should be imported too.
|
||||||
|
|
||||||
|
|
||||||
|
Notes
|
||||||
|
-----
|
||||||
|
|
||||||
|
The contents are generated via the `npm build dist` target using
|
||||||
|
`rollup` and the `/rollup.config.js` configuration.
|
||||||
|
|
||||||
|
Do not modify the files in this folder. They are deleted on `build-clean`.
|
||||||
|
|
||||||
|
To modify this `README.md`, see the `/output/post-build/dist`.
|
||||||
25628
dist/ethers.js
vendored
Normal file
25628
dist/ethers.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/ethers.js.map
vendored
Normal file
1
dist/ethers.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/ethers.min.js
vendored
Normal file
1
dist/ethers.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
25825
dist/ethers.umd.js
vendored
Normal file
25825
dist/ethers.umd.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/ethers.umd.js.map
vendored
Normal file
1
dist/ethers.umd.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/ethers.umd.min.js
vendored
Normal file
1
dist/ethers.umd.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1540
dist/wordlists-extra.js
vendored
Normal file
1540
dist/wordlists-extra.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/wordlists-extra.js.map
vendored
Normal file
1
dist/wordlists-extra.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/wordlists-extra.min.js
vendored
Normal file
1
dist/wordlists-extra.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -1,16 +1,5 @@
|
|||||||
Documentation
|
Documentation Source
|
||||||
=============
|
====================
|
||||||
|
|
||||||
These docs are built using [Flatworm Docs](https://github.com/ricmoo/flatworm).
|
This folder contains all the Flatworm source for the documentation.
|
||||||
|
|
||||||
The output is placed in [docs](../docs) and generates both HTML and Markdown
|
|
||||||
files.
|
|
||||||
|
|
||||||
|
|
||||||
Building
|
|
||||||
--------
|
|
||||||
|
|
||||||
```
|
|
||||||
/home/ricmoo/ethers.js> npm run build-docs
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|||||||
@ -1,162 +0,0 @@
|
|||||||
_section: Contract @<contract> @SRC<contracts:class.Contract>
|
|
||||||
|
|
||||||
_subsection: Properties
|
|
||||||
|
|
||||||
_property: contract.address => string<[[address]]>
|
|
||||||
This is the address (or ENS name) the contract was constructed with.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: contract.deployTransaction => [[provider-transactionresponse]]
|
|
||||||
If the **Contract** object is the result of a ContractFactory deployment,
|
|
||||||
this is the transaction which was used to deploy the contract.
|
|
||||||
|
|
||||||
_property: contract.interface => [[abi-interface]]
|
|
||||||
This is the ABI as an [[abi-interface]].
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: contract.signer => [[signer]]
|
|
||||||
If a signer was provided to the constructor, this is that signer.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Methods
|
|
||||||
|
|
||||||
_property: contract.attach(addressOrName) => [[contract]] @<contract-attach> @SRC<contracts:Contract.attach>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: contract.connect(providerOrSigner) => [[contract]] @<contract-connect> @SRC<contracts:Contract.connect>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: contract.deployed() => Promise<[[contract]]> @<contract-deployed> @SRC<contracts>
|
|
||||||
|
|
||||||
_property: Contract.isIndexed(value) => boolean @<contract-isIndexed> @SRC<contracts>
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Events
|
|
||||||
|
|
||||||
_property: contract.queryFilter(event [ , fromBlockOrBlockHash [ , toBlock ]) => Promise<Array<Event>> @<contract-queryfilter> @SRC<contracts>
|
|
||||||
Return Events that match the //event//.
|
|
||||||
|
|
||||||
_property: contract.listenerCount([ event ]) => number @<contract-listenerCount> @SRC<contracts:Contract.listenerCount>
|
|
||||||
Return the number of listeners that are subscribed to //event//. If
|
|
||||||
no event is provided, returns the total count of all events.
|
|
||||||
|
|
||||||
_property: contract.listeners(event) => Array<Listener> @<contract-listeners> @SRC<contracts:Contract.listeners>
|
|
||||||
Return a list of listeners that are subscribed to //event//.
|
|
||||||
|
|
||||||
_property: contract.off(event, listener) => this @<contract-off> @SRC<contracts>
|
|
||||||
Unsubscribe //listener// to //event//.
|
|
||||||
|
|
||||||
_property: contract.on(event, listener) => this @<contract-on> @SRC<contracts>
|
|
||||||
Subscribe to //event// calling //listener// when the event occurs.
|
|
||||||
|
|
||||||
_property: contract.once(event, listener) => this @<contract-once> @SRC<contracts>
|
|
||||||
Subscribe once to //event// calling //listener// when the event
|
|
||||||
occurs.
|
|
||||||
|
|
||||||
_property: contract.removeAllListeners([ event ]) => this @<contract-removeAllListeners> @SRC<contracts:Contract.removeAllListeners>
|
|
||||||
Unsubscribe all listeners for //event//. If no event is provided,
|
|
||||||
all events are unsubscribed.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Meta-Class @<contract-metaclass>
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Read-Only Methods (constant) @<contract-readonly>
|
|
||||||
|
|
||||||
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..
|
|
||||||
|
|
||||||
_property: contract.METHOD_NAME(...args [ overrides ]) => Promise<any> @<contract-call>
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Write Methods (non-constant) @<contract-write>
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: contract.METHOD_NAME(...args [ , overrides ]) => Promise<[[provider-transactionresponse]]> @<contract-send>
|
|
||||||
Returns a [[provider-transactionresponse]] for the transaction after
|
|
||||||
it is sent to the network. This requires the **Contract** has a
|
|
||||||
signer.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Write Methods Analysis @<contract-write-check>
|
|
||||||
|
|
||||||
There are secveral options to analyze properties and results of a
|
|
||||||
write method without actually executing it.
|
|
||||||
|
|
||||||
_property: contract.estimate.METHOD_NAME(...args [ , overrides ]) => Promise<[[bignumber]]> @<contract-estimateGas>
|
|
||||||
Returns the estimate units of gas that would be required to
|
|
||||||
execute the //METHOD_NAME// with //args// and //overrides//.
|
|
||||||
|
|
||||||
_property: contract.populateTransaction.METHOD_NAME(...args [ , overrides ]) => Promise<[UnsignedTx](types-unsignedtransaction)> @<contract-populateTransaction>
|
|
||||||
Returns an [[types-unsignedtransaction]] which represents the transaction
|
|
||||||
that would need to be signed and submitted to the network to execute
|
|
||||||
//METHOD_NAME// with //args/ and //overrides//.
|
|
||||||
|
|
||||||
_property: contract.staticCall.METHOD_NAME(...args [ , overrides ]) => Promise<any> @<contract-staticCall>
|
|
||||||
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](contract-readonly).
|
|
||||||
|
|
||||||
_heading: Event Filters @<contract-filter>
|
|
||||||
An event filter is made up of topics, which are values logged in a
|
|
||||||
[[link-wiki-bloomfilter]], allowing efficient searching for entries
|
|
||||||
which match a filter.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
@ -1,150 +0,0 @@
|
|||||||
_section: Example: ERC-20 Contract
|
|
||||||
|
|
||||||
_subsection: Connecting to a Contract
|
|
||||||
|
|
||||||
_code: token.txt
|
|
||||||
|
|
||||||
|
|
||||||
_heading: ERC20Contract @INHERIT<[[contract]]>
|
|
||||||
|
|
||||||
_property: 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//.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Properties ^^//(inheritted from [[contract]])//^^
|
|
||||||
|
|
||||||
_property: erc20.address => string<[[address]]>
|
|
||||||
This is the address (or ENS name) the contract was constructed with.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: erc20.deployTransaction => [[provider-transactionresponse]]
|
|
||||||
If the **Contract** object is the result of a ContractFactory deployment,
|
|
||||||
this is the transaction which was used to deploy the contract.
|
|
||||||
|
|
||||||
_property: erc20.interface => [[abi-interface]]
|
|
||||||
This is the ABI as an [[abi-interface]].
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: erc20.signer => [[signer]]
|
|
||||||
If a signer was provided to the constructor, this is that signer.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Methods ^^//(inheritted from [[contract]])//^^
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: erc20.deployed() => Promise<Contract>
|
|
||||||
|
|
||||||
_property: Contract.isIndexed(value) => boolean
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Events ^^//(inheritted from Contract)//^^ @<erc20-events>
|
|
||||||
|
|
||||||
_property: erc20.queryFilter(event [ , fromBlockOrBlockHash [ , toBlock ]) => Promise<Array<Event>> @<erc20-queryfilter>
|
|
||||||
Return Events that match the //event//.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: erc20.listeners(event) => Array<Listener>
|
|
||||||
Return a list of listeners that are subscribed to //event//.
|
|
||||||
|
|
||||||
_property: erc20.off(event, listener) => this
|
|
||||||
Unsubscribe //listener// to //event//.
|
|
||||||
|
|
||||||
_property: erc20.on(event, listener) => this
|
|
||||||
Subscribe to //event// calling //listener// when the event occurs.
|
|
||||||
|
|
||||||
_property: erc20.once(event, listener) => this
|
|
||||||
Subscribe once to //event// calling //listener// when the event
|
|
||||||
occurs.
|
|
||||||
|
|
||||||
_property: erc20.removeAllListeners([ event ]) => this
|
|
||||||
Unsubscribe all listeners for //event//. If no event is provided,
|
|
||||||
all events are unsubscribed.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: 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**.
|
|
||||||
|
|
||||||
_property: erc20.decimals([ overrides ]) => Promise<number>
|
|
||||||
Returns the number of decimal places used by this ERC-20 token. This can be
|
|
||||||
used with [parseUnits](utils-parseunits) when taking input from the user or
|
|
||||||
[formatUnits](utils-formatunits] when displaying the token amounts in the UI.
|
|
||||||
|
|
||||||
_property: erc20.getBalance(owner [, overrides ]) => Promise<[[bignumber]]>
|
|
||||||
Returns the balance of //owner// for this ERC-20 token.
|
|
||||||
|
|
||||||
_property: erc20.symbol([ overrides ]) => Promise<string>
|
|
||||||
Returns the symbol of the token.
|
|
||||||
|
|
||||||
_property: erc20_rw.transfer(target, amount [, overrides ]) => Promise<[[provider-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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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//.
|
|
||||||
|
|
||||||
_property: erc20.populateTransaction.transfer(target, amount [, overrides ]) => Promise<[UnsignedTx](types-unsignedtransaction)>
|
|
||||||
Returns an [[types-unsignedtransaction]] which could be signed and submitted
|
|
||||||
to the network to transaction //amount// tokens to //target//.
|
|
||||||
|
|
||||||
|
|
||||||
_note: 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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: 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**.
|
|
||||||
|
|
||||||
_property: erc20.filters.Transafer([ fromAddress [ , toAddress ] ]) => Filter
|
|
||||||
Returns a new Filter which can be used to [query](erc20-queryfilter) or
|
|
||||||
to [subscribe/unsubscribe to events](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.
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
_section: Contract Interaction @<contracts>
|
|
||||||
|
|
||||||
Explain what contracts are...
|
|
||||||
|
|
||||||
|
|
||||||
_toc:
|
|
||||||
contract
|
|
||||||
example
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
// 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)
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
_section: Application Programming Interface @NAV<API>
|
|
||||||
|
|
||||||
Here...
|
|
||||||
|
|
||||||
_toc:
|
|
||||||
contract
|
|
||||||
signer
|
|
||||||
providers
|
|
||||||
utils
|
|
||||||
other
|
|
||||||
@ -1,86 +0,0 @@
|
|||||||
_section: Utilities @<asm-utilities>
|
|
||||||
|
|
||||||
_subsection: Assembler
|
|
||||||
|
|
||||||
The assembler utilities allow parsing and assembling an
|
|
||||||
[Ethers ASM Dialect](asm-dialect) source file.
|
|
||||||
|
|
||||||
_property: asm.parse(code) => [[asm-node]] @<asm-parse> @SRC<asm/assembler>
|
|
||||||
Parse an ethers-format assembly file and return the [[asm-ast]].
|
|
||||||
|
|
||||||
_property: asm.assemble(node) => string<[[datahexstring]]> @SRC<asm/assembler:function.assemble>
|
|
||||||
Performs assembly of the [[asm-ast]] //node// and return the
|
|
||||||
resulting bytecode representation.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Disassembler
|
|
||||||
|
|
||||||
The **Disassembler** utilities make it easy to convert bytecode
|
|
||||||
into an object which can easily be examined for program structure.
|
|
||||||
|
|
||||||
_property: asm.disassemble(bytecode) => [[asm-bytecode]] @SRC<asm/assembler>
|
|
||||||
Returns an array of Operations given //bytecode//.
|
|
||||||
|
|
||||||
_property: asm.formatBytecode(operations) => string @SRC<asm/assembler>
|
|
||||||
Create a formatted output of an array of [[asm-operation]].
|
|
||||||
|
|
||||||
_heading: Bytecode @<asm-bytecode> @INHERIT<Array\<[[asm-operation]]\>>
|
|
||||||
|
|
||||||
Each arary index represents an operation, collapsing multi-byte operations
|
|
||||||
(i.e. ``PUSH``) into a single operation.
|
|
||||||
|
|
||||||
_property: bytecode.getOperation(offset) => [[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.
|
|
||||||
|
|
||||||
_heading: Operation @<asm-operation>
|
|
||||||
|
|
||||||
An **Operation** is a single command from a disassembled bytecode
|
|
||||||
stream.
|
|
||||||
|
|
||||||
_property: operation.opcode => [[asm-opcode]]
|
|
||||||
The opcode for this Operation.
|
|
||||||
|
|
||||||
_property: operation.offset => number
|
|
||||||
The offset into the bytecode for this Operation.
|
|
||||||
|
|
||||||
_property: operation.pushValue => string<[[datahexstring]]>
|
|
||||||
If the opcode is a ``PUSH``, this is the value of that push
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Opcode @<asm-opcode> @SRC<asm/opcodes:class.Opcode>
|
|
||||||
|
|
||||||
_property: asm.Opcode.from(valueOrMnemonic) => [[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").
|
|
||||||
|
|
||||||
_heading: Properties
|
|
||||||
|
|
||||||
_property: opcode.value => number
|
|
||||||
The value (bytecode as a number) of this opcode.
|
|
||||||
|
|
||||||
_property: opcode.mnemonic => string
|
|
||||||
The mnemonic string of this opcode.
|
|
||||||
|
|
||||||
_property: opcode.delta => number
|
|
||||||
The number of items this opcode will consume from the stack.
|
|
||||||
|
|
||||||
_property: opcode.alpha => number
|
|
||||||
The number of items this opcode will push onto the stack.
|
|
||||||
|
|
||||||
_property: opcode.doc => string
|
|
||||||
A short description of what this opcode does.
|
|
||||||
|
|
||||||
_property: opcode.isMemory() => "read" | "write" | "full"
|
|
||||||
Returns true if the opcode accesses memory.
|
|
||||||
|
|
||||||
_property: opcode.isStatic() => boolean
|
|
||||||
Returns true if the opcode cannot change state.
|
|
||||||
|
|
||||||
_property: opcode.isJump() => boolean
|
|
||||||
Returns true if the opcode is a jumper operation.
|
|
||||||
|
|
||||||
_property: opcode.isPush() => number
|
|
||||||
Returns 0 if the opcode is not a ``PUSH*``, or the number
|
|
||||||
of bytes this opcode will push if it is.
|
|
||||||
@ -1,150 +0,0 @@
|
|||||||
_section: Abstract Syntax Tree @<asm-ast>
|
|
||||||
|
|
||||||
Parsing a file using the [Ethers ASM Dialect](asm-dialect) will
|
|
||||||
generate an Abstract Syntax Tree. The root node will always
|
|
||||||
be a [[asm-scopenode]] whose name is ``_``.
|
|
||||||
|
|
||||||
To parse a file into an Abstract Syntax tree, use the [parse](asm-parse)
|
|
||||||
function.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Types
|
|
||||||
|
|
||||||
_heading: Location @<asm-location>
|
|
||||||
|
|
||||||
_property: offset => number
|
|
||||||
The offset into the source code to the start of this node.
|
|
||||||
|
|
||||||
_property: length => number
|
|
||||||
The length of characters in the source code to the end of this node.
|
|
||||||
|
|
||||||
_property: source => string
|
|
||||||
The source code of this node.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Nodes
|
|
||||||
|
|
||||||
@TODO: Place a diagram here showing the hierarchy
|
|
||||||
|
|
||||||
_heading: Node @<asm-node> @SRC<asm:class.Node>
|
|
||||||
|
|
||||||
_property: node.tag => string
|
|
||||||
A unique tag for this node for the lifetime of the process.
|
|
||||||
|
|
||||||
_property: node.location => [[asm-location]]
|
|
||||||
The source code and location within the source code that this
|
|
||||||
node represents.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: ValueNode @<asm-valuenode> @INHERIT<[[asm-node]]> @SRC<asm:class.ValueNode>
|
|
||||||
|
|
||||||
A **ValueNode** is a node which may manipulate the stack.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: LiteralNode @<asm-literalnode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.LiteralNode>
|
|
||||||
|
|
||||||
_property: literalNode.value => string
|
|
||||||
The literal value of this node, which may be a [[datahexstring]] or
|
|
||||||
string of a decimal number.
|
|
||||||
|
|
||||||
_property: literalNode.verbatim => boolean
|
|
||||||
This is true in a [[asm-datanode]] context, since in that case the
|
|
||||||
value should be taken verbatim and no ``PUSH`` operation shoud be
|
|
||||||
added, otherwise false.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: PopNode @<asm-popnode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.PopNode>
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: literalNode.index => number
|
|
||||||
|
|
||||||
The index this **PopNode** is representing. For an implicit place-holder
|
|
||||||
this is ``0``.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: LinkNode @<asm-linknode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.LinkNode>
|
|
||||||
|
|
||||||
A **LinkNode** represents a link to another [[asm-node]]'s data,
|
|
||||||
for example ``$foo`` or ``#bar``.
|
|
||||||
|
|
||||||
_property: linkNode.label => string
|
|
||||||
Te name of the target node.
|
|
||||||
|
|
||||||
_property: linkNode.type => "offset" | "length"
|
|
||||||
Whether this node is for an offset or a length value of the
|
|
||||||
target node.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: OpcodeNode @<asm-opcodenode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.OpcodeNode>
|
|
||||||
|
|
||||||
_property: opcodeNode.opcode => [[asm-opcode]]
|
|
||||||
The opcode for this Node.
|
|
||||||
|
|
||||||
_property: opcodeNode.operands => Array<[[asm-valuenode]]>
|
|
||||||
A list of all operands passed into this Node.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: EvaluationNode @<asm-evaluationnode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.EvaluationNode>
|
|
||||||
|
|
||||||
An **EvaluationNode** is used to execute code and insert the results
|
|
||||||
but does not generate
|
|
||||||
any output assembly, using the ``{{! code here }}`` syntax.
|
|
||||||
|
|
||||||
_property: literalNode.verbatim => boolean
|
|
||||||
This is true in a [[asm-datanode]] context, since in that case the
|
|
||||||
value should be taken verbatim and no ``PUSH`` operation shoud be
|
|
||||||
added, otherwise false.
|
|
||||||
|
|
||||||
_property: evaluationNode.script => string
|
|
||||||
The code to evaluate and produce the result to use as a literal.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: ExecutionNode @<asm-executionnode> @INHERIT<[[asm-node]]> @SRC<asm:class.ExecutionNode>
|
|
||||||
|
|
||||||
An **ExecutionNode** is used to execute code but does not generate
|
|
||||||
any output assembly, using the ``{{! code here }}`` syntax.
|
|
||||||
|
|
||||||
_property: evaluationNode.script => string
|
|
||||||
The code to execute. Any result is ignored.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: LabelledNode @<asm-labellednode> @INHERIT<[[asm-node]]> @SRC<asm:class.LabelledNode>
|
|
||||||
|
|
||||||
A **LabelledNode** is used for any Node that has a name, and can therefore
|
|
||||||
be targetted by a [[asm-linknode]].
|
|
||||||
|
|
||||||
_property: labelledNode.name => string
|
|
||||||
The name of this node.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: LabelNode @<asm-labelnode> @INHERIT<[[asm-labellednode]]> @SRC<asm:class.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.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: DataNode @<asm-datanode> @INHERIT<[[asm-labellednode]]> @SRC<asm:class.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.
|
|
||||||
|
|
||||||
_property: dataNode.data => Array<[[asm-valuenode]]>
|
|
||||||
The child nodes, which each represent a verbatim piece of data in insert.
|
|
||||||
|
|
||||||
_heading: ScopeNode @<asm-scopenode> @INHERIT<[[asm-labellednode]]> @SRC<asm:class.ScopeNode>
|
|
||||||
|
|
||||||
|
|
||||||
A **ScopeNode** allows a new frame of reference that all [[asm-linknode]]'s
|
|
||||||
will use when resolving offset locations, using ``@myScope{ ... }``.
|
|
||||||
|
|
||||||
_property: scopeNode.statements => Array<[[asm-node]]>
|
|
||||||
The list of child nodes for this scope.
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,115 +0,0 @@
|
|||||||
_section: Ethers ASM Dialect @<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](link-ethers-asm-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](cli-asm) can be used to assemble an
|
|
||||||
//Ethers ASM Dialect// file or to disassemble bytecode into its
|
|
||||||
human-readable (ish) opcodes and literals.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Opcodes @<asm-dialect-opcode>
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Labels @<asm-dialect-label>
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Literals @<asm-dialect-literal>
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Comments @<asm-dialect-comment>
|
|
||||||
|
|
||||||
To enter a comment in the **Ethers ASM Dialect**, any text following
|
|
||||||
a semi-colon (i.e. ``;``) is ignored by the assembler.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Scopes @<asm-dialect-scope>
|
|
||||||
|
|
||||||
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 [[asm-dialect-datasegment]] or
|
|
||||||
child [[asm-dialect-scope]] (with respect to itself) and may access the length
|
|
||||||
of any [[asm-dialect-datasegment]] or [[asm-dialect-scope]] anywhere in the program.
|
|
||||||
|
|
||||||
Every program in the **Ethers ASM Dialect** has a top-leve scope named ``_``.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Data Segment @<asm-dialect-datasegment>
|
|
||||||
|
|
||||||
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 [[asm-dialect-label]] adds.
|
|
||||||
|
|
||||||
@TODO: Example
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Links @<asm-dialect-links>
|
|
||||||
|
|
||||||
A **Link** allows access to a [[asm-dialect-scope]], [[asm-dialect-datasegment]] or [[asm-dialect-label]].
|
|
||||||
|
|
||||||
To access the byte offset of a labelled item, use ``$foobar``.
|
|
||||||
|
|
||||||
For a [[asm-dialect-label]], the target must be directly reachable within this scope. For
|
|
||||||
a [[asm-dialect-datasegment]] or a [[asm-dialect-scope]], it can be inside the same scope or any
|
|
||||||
child scope.
|
|
||||||
|
|
||||||
For a [[asm-dialect-datasegment]] or a [[asm-dialect-label]], 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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Stack Placeholders @<asm-dialect-placeholder>
|
|
||||||
|
|
||||||
@TODO: exampl
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Evaluation and Excution @<asm-dialect-scripting>
|
|
||||||
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
_section: Assembly
|
|
||||||
|
|
||||||
_toc:
|
|
||||||
dialect
|
|
||||||
api
|
|
||||||
ast
|
|
||||||
@ -1,15 +0,0 @@
|
|||||||
_section: Hardware Wallets
|
|
||||||
|
|
||||||
_subsection: LedgerSigner @<hw-ledger> @INHERIT<[[signer]]> @SRC<hardware-wallets:class.LedgerSigner>
|
|
||||||
|
|
||||||
The [Ledger Hardware Wallets](link-ledger) are a fairly
|
|
||||||
popular brand.
|
|
||||||
|
|
||||||
TODO: importing
|
|
||||||
|
|
||||||
_heading: API
|
|
||||||
|
|
||||||
_property: new LedgerSigner([provider [, type [ , path ] ] ]) => [[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.
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
_section: 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.
|
|
||||||
|
|
||||||
_toc:
|
|
||||||
assembly
|
|
||||||
hardware
|
|
||||||
@ -1,65 +0,0 @@
|
|||||||
_section: 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](get-default-provider).
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: EtherscanProvider @INHERIT<[[provider]]>
|
|
||||||
|
|
||||||
The **EtherscanProvider** is backed by a combination of the various
|
|
||||||
[Etherscan APIs](link-etherscan-api).
|
|
||||||
|
|
||||||
_property: provider.getHistory(address) => Array<History>
|
|
||||||
|
|
||||||
@TODO... Explain
|
|
||||||
|
|
||||||
_definition: **Supported Networks**
|
|
||||||
|
|
||||||
- Homestead (Mainnet)
|
|
||||||
- Ropsten (proof-of-work testnet)
|
|
||||||
- Rinkeby (proof-of-authority testnet)
|
|
||||||
- Görli (clique testnet)
|
|
||||||
- Kovan (proof-of-authority testnet)
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: InfuraProvider @INHERIT<[[provider-urljsonrpc]]>
|
|
||||||
|
|
||||||
The **InfuraProvider** is backed by the popular [INFURA](link-infura)
|
|
||||||
Ethereum service.
|
|
||||||
|
|
||||||
_definition: **Supported Networks**
|
|
||||||
|
|
||||||
- Homestead (Mainnet)
|
|
||||||
- Ropsten (proof-of-work testnet)
|
|
||||||
- Rinkeby (proof-of-authority testnet)
|
|
||||||
- Görli (clique testnet)
|
|
||||||
- Kovan (proof-of-authority testnet)
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: AlchemyProvider @INHERIT<[[provider-urljsonrpc]]>
|
|
||||||
|
|
||||||
The **AlchemtProvider** is backed by [Alchemy](link-alchemy).
|
|
||||||
|
|
||||||
_definition: **Supported Networks**
|
|
||||||
|
|
||||||
- Homestead (Mainnet)
|
|
||||||
- Ropsten (proof-of-work testnet)
|
|
||||||
- Rinkeby (proof-of-authority testnet)
|
|
||||||
- Görli (clique testnet)
|
|
||||||
- Kovan (proof-of-authority testnet)
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: CloudfrontProvider @INHERIT<[[provider-urljsonrpc]]>
|
|
||||||
|
|
||||||
The CloudfrontProvider is backed by the [Cloudflare Ethereum Gateway](link-cloudflare).
|
|
||||||
|
|
||||||
_definition: **Supported Networks**
|
|
||||||
|
|
||||||
- Homestead (Mainnet)
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
// <hide>
|
|
||||||
|
|
||||||
const { ethers } = require("./packages/ethers");
|
|
||||||
const provider = ethers.getDefaultProvider()
|
|
||||||
|
|
||||||
function _inspect(result) {
|
|
||||||
if (ethers.BigNumber.isBigNumber(result)) {
|
|
||||||
return `{ BigNumber: ${ JSON.stringify(result.toString()) } }`;
|
|
||||||
}
|
|
||||||
return JSON.stringify(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
// </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");
|
|
||||||
//!
|
|
||||||
@ -1,15 +0,0 @@
|
|||||||
// <hide>
|
|
||||||
|
|
||||||
const { ethers } = require("./packages/ethers");
|
|
||||||
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");
|
|
||||||
//!
|
|
||||||
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
_section: 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 [[get-default-provider]].
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Default Provider @<get-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 [[provider-fallback]] 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_subsection: Provider Documentation
|
|
||||||
|
|
||||||
_toc:
|
|
||||||
provider
|
|
||||||
jsonrpc-provider
|
|
||||||
api-providers
|
|
||||||
other
|
|
||||||
types
|
|
||||||
@ -1,73 +0,0 @@
|
|||||||
_section: JsonRpcProvider @<provider-jsonrpc> @INHERIT<[[provider]]>
|
|
||||||
|
|
||||||
The [JSON-RPC API](link-jsonrpc) is a
|
|
||||||
very popular method for interacting with Ethereum and is available in all
|
|
||||||
major Ethereum node implementations (e.g. [Geth](link-geth)
|
|
||||||
and [Parity](link-parity)) as well as many third-party web
|
|
||||||
services (e.g. [INFURA](link-infura))
|
|
||||||
|
|
||||||
_property: 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: 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.
|
|
||||||
|
|
||||||
_property: jsonRpcProvider.getSigner([ addressOrIndex ]) => [[signer-jsonrpc]] @<provider-jsonrpc-getsigner> @SRC<providers/json-rpc-provider>
|
|
||||||
Returns a [[signer-jsonrpc]] which is managed by this Ethereum node, at
|
|
||||||
//addressOrIndex//. If no //addressOrIndex// is provided, the first
|
|
||||||
account (account #0) is used.
|
|
||||||
|
|
||||||
_property: jsonRpcProvider.getUncheckedSigner([ addressOrIndex ]) => [[provider-jsonrpc-uncheckedsigner]] @<provider-jsonrpc-getuncheckedsigner> @SRC<providers/json-rpc-provider>
|
|
||||||
|
|
||||||
_property: jsonRpcProvider.listAccounts() => Array<string> @<provider-jsonrpc-listaccounts> @SRC<providers/json-rpc-provider>
|
|
||||||
Returns a list of all account addresses managed by this provider.
|
|
||||||
|
|
||||||
_property: jsonRpcProvider.send(method, params) => Promise<any> @<provider-jsonrpc-send> @SRC<providers/json-rpc-provider>
|
|
||||||
Allows sending raw messages to the provider.
|
|
||||||
|
|
||||||
This can be used for backend-specific calls, such as for debugging or
|
|
||||||
specific account management.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: JsonRpcSigner @<signer-jsonrpc> @INHERIT<[[signer]]>
|
|
||||||
A **JsonRpcSigner** is a simple Signer which is backed by a connected
|
|
||||||
[[provider-jsonrpc]].
|
|
||||||
|
|
||||||
_property: signer.provider => [[provider-jsonrpc]]
|
|
||||||
The provider this signer was established from.
|
|
||||||
|
|
||||||
_property: signer.connectUnchecked() => [[provider-jsonrpc-uncheckedsigner]]
|
|
||||||
Returns a new Signer object which does not perform addtional checks when
|
|
||||||
sending a transaction. See [[provider-jsonrpc-uncheckedsigner]] for more details.
|
|
||||||
|
|
||||||
_property: signer.sendUncheckedTransaction(transaction) => Promise<string<[[datahexstring]]<32>>>
|
|
||||||
Sends the //transaction// and returns a Promise which resolves to the
|
|
||||||
opacque transaction hash.
|
|
||||||
|
|
||||||
_property: signer.unlock(password) => Promise<boolean>
|
|
||||||
Request the node unlock the account (if locked) using //password//.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: JsonRpcUncheckedSigner @<provider-jsonrpc-uncheckedsigner> @INHERIT<[[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 [[signer-jsonrpc]] immeidately queries the provider for
|
|
||||||
the details using the returned transaction hash to populate the [[provider-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 [[provider-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.
|
|
||||||
@ -1,110 +0,0 @@
|
|||||||
_section: Other Providers
|
|
||||||
|
|
||||||
Others...
|
|
||||||
|
|
||||||
_subsection: FallbackProvider @<provider-fallback> @INHERIT<[[provider]]> @SRC<providers/fallback-provider:class.FallbackProvider>
|
|
||||||
|
|
||||||
The **FallbackProvider** is the most advanced [[provider]] available in
|
|
||||||
ethers.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: 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 [[provider-fallback-config]].
|
|
||||||
If a [[provider]] is provided, the defaults are a priority of 1 and a weight of 1.
|
|
||||||
|
|
||||||
_property: provider.providerConfigs => Array<[[provider-fallback-config]]>
|
|
||||||
The list of Provider Configurations that describe the backends.
|
|
||||||
|
|
||||||
_property: 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//.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: FallbackProviderConfig @<provider-fallback-config>
|
|
||||||
|
|
||||||
_property: fallbackProviderConfig.provider => [[provider]]
|
|
||||||
The provider for this configuration.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: fallbackProviderConfig.weight => number
|
|
||||||
The weight a response from this provider provides. This can be used if a given
|
|
||||||
[[provider]] is more trusted, for example.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: IpcProvider @<provider-ipc> @INHERIT<[[provider-jsonrpc]]> @SRC<providers:class.IpcProvider>
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: ipcProvider.path => string
|
|
||||||
The path this [[provider]] is connected to.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: UrlJsonRpcProvider @<provider-urljsonrpc> @INHERIT<[[provider-jsonrpc]]> @SRC<providers:class.UrlJsonRpcProvider>
|
|
||||||
|
|
||||||
This class is intended to be sub-classed and not used directly. It
|
|
||||||
simplifies creating a [[provider]] where a normal [[provider-jsonrpc]]
|
|
||||||
would suffice, with a little extra effort needed to generate the JSON-RPC
|
|
||||||
URL.
|
|
||||||
|
|
||||||
_property: 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``.
|
|
||||||
|
|
||||||
_property: urlJsonRpcProvider.apiKey => any
|
|
||||||
The value of the apiKey that was returned from ``InheritedClass.getApiKey``.
|
|
||||||
|
|
||||||
_property: 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``.
|
|
||||||
|
|
||||||
_property: InheritingClass.getUrl(network, apiKey) => string
|
|
||||||
The URL to use for the JsonRpcProvider instance.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Web3Provider @<provider-web3> @INHERIT<[[provider-jsonrpc]]>
|
|
||||||
|
|
||||||
The Web3Provider is meant to ease moving from a [web3.js based](link-web3)
|
|
||||||
application to ethers by wraping an existing Web3-compatible (such as a
|
|
||||||
[Web3HttpProvider](link-web3-http)[Web3IpcProvider](link-web3-ipc) or
|
|
||||||
[Web3WsProvider](link-web3-ws)) and exposing it as an ethers.js [[provider]]
|
|
||||||
which can then be used with the rest of the library.
|
|
||||||
|
|
||||||
_property: new ethers.providers.Web3Provider(web3Provider [, network ])
|
|
||||||
Create a new **Web3Provider**, which wraps an [EIP-1193 Provider]() or
|
|
||||||
Web3Provider-compatible Provider.
|
|
||||||
|
|
||||||
_property: web3Provider.provider => Web3CompatibleProvider
|
|
||||||
The provider used to create this instance.
|
|
||||||
|
|
||||||
@ -1,138 +0,0 @@
|
|||||||
_section: Provider @<provider>
|
|
||||||
|
|
||||||
Explain what a provider is...
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Accounts Methods
|
|
||||||
|
|
||||||
_property: provider.getBalance(address [ , blockTag = "latest" ]) => Promise<[[bignumber]]> @<provider-getbalance> @SRC<providers/base-provider>
|
|
||||||
Returns the balance of //address// as of the //blockTag// block height.
|
|
||||||
|
|
||||||
_property: provider.getCode(address [ , blockTag = "latest" ]) => Promise<string<[[datahexstring]]>> @<providers-getcode> @SRC<providers/base-provider>
|
|
||||||
Returns the contract code of //address// as of the //blockTag// block height. If there is
|
|
||||||
no contract currently deployed, the result is ``0x``.
|
|
||||||
|
|
||||||
_property: provider.getStorageAt(addr, pos [ , blockTag = "latest" ]) => Promise<string<[[datahexstring]]>> @<providers-getstorageat> @SRC<providers/base-provider>
|
|
||||||
Returns the ``Bytes32`` value of the position //pos// at address //addr//, as of the //blockTag//.
|
|
||||||
|
|
||||||
_property: provider.getTransactionCount(address [ , blockTag = "latest" ]) => Promise<number> @<providers-gettransactioncount> @SRC<providers/base-provider>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_heading: Examples
|
|
||||||
|
|
||||||
_code: example-account.js
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Blocks Methods
|
|
||||||
|
|
||||||
_property: provider.getBlock(block) => Promise<[[provider-block]]> @<providers-getblock> @SRC<providers/base-provider>
|
|
||||||
Get the //block// from the network, where the ``result.transactions`` is a list
|
|
||||||
of transaction hashes.
|
|
||||||
|
|
||||||
_property: provider.getBlockWithTransactions(block) => Promise<[[provider-blocktxs]]> @<providers-getblockwithtransactions> @SRC<providers/base-provider>
|
|
||||||
Get the //block// from the network, where the ``result.transactions`` is
|
|
||||||
an Array of [[provider-transactionresponse]] objects.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Ethereum Naming Service (ENS) Methods
|
|
||||||
|
|
||||||
TODO: Explain ENS here...
|
|
||||||
|
|
||||||
_property: provider.lookupAddress(address) => Promise<string> @<providers-lookupaddress> @SRC<providers/base-provider>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: provider.resolveName(name) => Promise<string<[Address](address)>> @<providers-resolvename> @SRC<providers/base-provider>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_heading: Examples
|
|
||||||
|
|
||||||
_code: example-ens.js
|
|
||||||
|
|
||||||
_subsection: Logs Methods
|
|
||||||
|
|
||||||
_property: provider.getLogs(filter) => Promise<Array<[[provider-log]]>> @<providers-getlogs> @SRC<providers/base-provider>
|
|
||||||
Returns the Array of [[provider-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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Network Status Methods
|
|
||||||
|
|
||||||
_property: provider.getNetwork() => Promise<[[provider-network]]> @<providers-getnetwork> @SRC<providers/base-provider:method.BaseProvider.getNetwork>
|
|
||||||
Returns the [[provider-network]] this Provider is connected to.
|
|
||||||
|
|
||||||
_property: provider.getBlockNumber() => Promise<number> @<providers-getblocknumber> @SRC<providers/base-provider>
|
|
||||||
Returns the block number (or height) of the most recently mined block.
|
|
||||||
|
|
||||||
_property: provider.getGasPrice() => Promise<[[bignumber]]> @<providers-getgasprice> @SRC<providers/base-provider>
|
|
||||||
Returns a //best guess// of the [[gas-price]] to use in a transaction.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Transactions Methods
|
|
||||||
|
|
||||||
_property: provider.call(transaction [ , blockTag = "latest" ]) => Promise<string<[[hexstring]]>> @<providers-call> @SRC<providers/base-provider>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: provider.estimateGas(transaction) => Promise<[[bignumber]]> @<providers-estimategas> @SRC<providers/base-provider>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: provider.sendTransaction(transaction) => Promise<[[provider-transactionresponse]]> @<providers-sendtransaction> @SRC<providers/base-provider>
|
|
||||||
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).
|
|
||||||
|
|
||||||
_property: provider.waitForTransaction(transactionHash) => Promise<[[provider-receipt]]> @<providers-waitfortransaction> @SRC<providers/base-provider>
|
|
||||||
Returns a Promise which will not resolve until //transactionHash// is mined.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Event Emitter Methods
|
|
||||||
|
|
||||||
Explain events here...
|
|
||||||
|
|
||||||
_property: provider.on(eventName, listener) => this @<providers-on> @SRC<providers/base-provider>
|
|
||||||
Add a //listener// to be triggered for each //eventName//.
|
|
||||||
|
|
||||||
_property: provider.once(eventName, listener) => this @<providers-once> @SRC<providers/base-provider>
|
|
||||||
Add a //listener// to be triggered for only the next //eventName//,
|
|
||||||
at which time it be removed.
|
|
||||||
|
|
||||||
_property: provider.emit(eventName, ...args) => boolean @<providers-emit> @SRC<providers/base-provider>
|
|
||||||
Notify all listeners of //eventName//, passing //args// to each listener. This
|
|
||||||
is generally only used internally.
|
|
||||||
|
|
||||||
_property: provider.off(eventName [ , listener ]) => this @<providers-off> @SRC<providers/base-provider>
|
|
||||||
Remove a //listener// for //eventName//. If no //listener// is provided,
|
|
||||||
all listeners for //eventName// are removed.
|
|
||||||
|
|
||||||
_property: provider.removeAllListeners([ eventName ]) => this @<providers-removealllisteners> @SRC<providers/base-provider>
|
|
||||||
Remove all the listeners for //eventName//. If no //eventName// is provided,
|
|
||||||
**all** events are removed.
|
|
||||||
|
|
||||||
_property: provider.listenerCount([ eventName ]) => number @<providers-listenercount> @SRC<providers/base-provider>
|
|
||||||
Returns the number of listeners for //eventName//. If no //eventName// is
|
|
||||||
provided, the total number of listeners is returned.
|
|
||||||
|
|
||||||
_property: provider.listeners(eventName) => Array<Listener> @<providers-listeners> @SRC<providers/base-provider>
|
|
||||||
Returns the list of Listeners for //eventName//.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Inspection Methods
|
|
||||||
|
|
||||||
_property: Provider.isProvider(object) => boolean @<providers-isprovider> @SRC<abstract-provider>
|
|
||||||
Returns true if and only if //object// is a Provider.
|
|
||||||
|
|
||||||
@ -1,301 +0,0 @@
|
|||||||
_section: Types
|
|
||||||
|
|
||||||
_subsection: BlockTag @<provider-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
|
|
||||||
|
|
||||||
_heading: EventType @<provider-eventtype>
|
|
||||||
|
|
||||||
And **EventType** can be any of the following.
|
|
||||||
|
|
||||||
- **//string//** -- TODO...
|
|
||||||
- **//Array<string<[[datahexstring]]<32>> | Array<string<[[datahexstring]]<32>>>>//** -- TODO...
|
|
||||||
- **//[[provider-eventfilter]]//** -- TODO...
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Network @<provider-network>
|
|
||||||
A **Network** represents an Etherem network.
|
|
||||||
|
|
||||||
_property: network.name => string
|
|
||||||
The human-readable name of the network, such as ``homestead``. If the network
|
|
||||||
name is unknown, this will be ``"unknown"``.
|
|
||||||
|
|
||||||
_property: network.chainId => number
|
|
||||||
The Chain ID of the network.
|
|
||||||
|
|
||||||
_property: network.ensAddress => string<[[address]]>
|
|
||||||
The address at which the ENS registry is deployed on this network.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Block @<provider-block>
|
|
||||||
|
|
||||||
_property: block.hash => string<[[datahexstring]]<32>>
|
|
||||||
The hash of this block.
|
|
||||||
|
|
||||||
_property: block.parentHash => string<[[datahexstring]]<32>>
|
|
||||||
The hash of the previous block.
|
|
||||||
|
|
||||||
_property: block.number => number
|
|
||||||
The height (number) of this block.
|
|
||||||
|
|
||||||
_property: block.timestamp => number
|
|
||||||
The timestamp of this block.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: block.difficulty => number
|
|
||||||
The difficulty target required to be met by the miner of the block.
|
|
||||||
|
|
||||||
This property is generally of little interest developers.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: block.gasUsed => [[bignumber]]
|
|
||||||
The total amount of gas used by all transactions in this block.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_heading: 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.
|
|
||||||
|
|
||||||
_property: block.transactions => Array<string<[[datahexstring]]<32>>>
|
|
||||||
A list of the transactions hashes for each transaction this block
|
|
||||||
includes.
|
|
||||||
|
|
||||||
_heading: BlockWithTransactions @<provider-blocktxs> @INHERIT<[Block](provider-block)>
|
|
||||||
|
|
||||||
If all transactions for a block are needed, this object instead includes
|
|
||||||
the full details on each transaction.
|
|
||||||
|
|
||||||
_property: block.transactions => Array<[[provider-transactionresponse]]>
|
|
||||||
A list of the transactions this block includes.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Events and Logs
|
|
||||||
|
|
||||||
_heading: EventFilter @<provider-eventfilter>
|
|
||||||
|
|
||||||
_property: filter.address => string<[[address]]>
|
|
||||||
The address to filter by, or ``null`` to match any address.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_heading: Filter @<provider-filter> @INHERIT<[[provider-eventfilter]]>
|
|
||||||
|
|
||||||
_property: filter.fromBlock => [[provider-blocktag]]
|
|
||||||
The starting block (inclusive) to search for logs matching the filter criteria.
|
|
||||||
|
|
||||||
_property: filter.toBlock => [[provider-blocktag]]
|
|
||||||
The end block (inclusive) to search for logs matching the filter criteria.
|
|
||||||
|
|
||||||
_heading: FilterByBlockHash @<provider-filterbyblockhash> @INHERIT<[[provider-eventfilter]]>
|
|
||||||
|
|
||||||
_property: filter.blockHash => string<[[datahexstring]]<32>>
|
|
||||||
The specific block (by its block hash) to search for logs matching the filter criteria.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Log @<provider-log>
|
|
||||||
|
|
||||||
_property: log.blockNumber => number
|
|
||||||
The block height (number) of the block including the transaction of this log.
|
|
||||||
|
|
||||||
_property: log.blockHash => string<[[datahexstring]]<32>>
|
|
||||||
The block hash of the block including the transaction of this log.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: log.transactionLogIndex => number
|
|
||||||
The index of this log in the transaction.
|
|
||||||
|
|
||||||
_property: log.address => string<[[address]]>
|
|
||||||
The address of the contract that generated this log.
|
|
||||||
|
|
||||||
_property: log.data => string<[[datahexstring]]>
|
|
||||||
The data included in this log.
|
|
||||||
|
|
||||||
_property: log.topics => Array<string<[[datahexstring]]<32> > >
|
|
||||||
The list of topics (indexed properties) for this log.
|
|
||||||
|
|
||||||
_property: log.transactionHash => string<[[datahexstring]]<32>>
|
|
||||||
The transaction hash of the transaction of this log.
|
|
||||||
|
|
||||||
_property: log.transactionIndex => number
|
|
||||||
The index of the transaction in the block of the transaction of this log.
|
|
||||||
|
|
||||||
_property: log.logIndex => number
|
|
||||||
The index of this log across all logs in the entire **block**.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Transactions
|
|
||||||
|
|
||||||
_heading: TransactionRequest @<provider-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.
|
|
||||||
|
|
||||||
_property: transactionRequest.to => string | Promise<string>
|
|
||||||
The address (or ENS name) this transaction it to.
|
|
||||||
|
|
||||||
_property: transactionRequest.from => string<[[address]]> | Promise<string<[[address]]>>
|
|
||||||
The address this transaction is from.
|
|
||||||
|
|
||||||
_property: transactionRequest.nonce => number | Promise<number>
|
|
||||||
The nonce for this transaction. This should be set to the number of
|
|
||||||
transactions ever sent **from** this address.
|
|
||||||
|
|
||||||
_property: transactionRequest.gasLimit => [[bignumber]] | Promise<[[bignumber]]>
|
|
||||||
The maximum amount of gas this transaction is permitted to use.
|
|
||||||
|
|
||||||
_property: transactionRequest.gasPrice => [[bignumber]] | Promise<[[bignumber]]>
|
|
||||||
The price (in wei) per unit of gas this transaction will pay.
|
|
||||||
|
|
||||||
_property: transactionRequest.data => [[datahexstring]] | Promise<[[datahexstring]]>
|
|
||||||
The transaction data.
|
|
||||||
|
|
||||||
_property: transactionRequest.value => [[bignumber]] | Promise<[[bignumber]]>
|
|
||||||
The amount (in wei) this transaction is sending.
|
|
||||||
|
|
||||||
_property: transactionRequest.chainId => number | Promise<number>
|
|
||||||
The chain ID this transaction is authorized on, as specified by
|
|
||||||
[EIP-155](link-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.
|
|
||||||
|
|
||||||
_heading: TransactionResponse @INHERIT<[[types-transaction]]> @<provider-transactionresponse>
|
|
||||||
|
|
||||||
A **TransactionResponse** includes all properties of a [[types-transaction]] as well as several
|
|
||||||
properties that are useful once it has been mined.
|
|
||||||
|
|
||||||
_property: transaction.blockNumber => number
|
|
||||||
The number ("height") of the block this transaction was mined in. If the block has not been mined,
|
|
||||||
this is ``null``.
|
|
||||||
|
|
||||||
_property: 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``.
|
|
||||||
|
|
||||||
_property: transaction.timestamp => number
|
|
||||||
The timestamp of the block this transaction was mined in. If the block has not been mined,
|
|
||||||
this is ``null``.
|
|
||||||
|
|
||||||
_property: transaction.confirmations => number
|
|
||||||
The number of blocks that have been mined (including the initial block) since this
|
|
||||||
transaction was mined.
|
|
||||||
|
|
||||||
_property: transaction.raw => string<[[datahexstring]]>
|
|
||||||
The serialized transaction.
|
|
||||||
|
|
||||||
_property: transaction.wait([ confirmations = 1 ]) => Promise<[[provider-receipt]]> @<transaction>
|
|
||||||
Wait for //confirmations//. If 0, and the transaction has not been mined,
|
|
||||||
``null`` is returned.
|
|
||||||
|
|
||||||
_heading: TransactionReceipt @<provider-receipt>
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: receipt.from => string<[[address]]>
|
|
||||||
The address this transaction is from.
|
|
||||||
|
|
||||||
_property: 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](utils-getcontractaddress)
|
|
||||||
utility function can also be used with a [[provider-transactionresponse]]
|
|
||||||
object, which requires the transaction nonce and the address of the sender.
|
|
||||||
|
|
||||||
_property: receipt.transactionIndex => number
|
|
||||||
The index of this transaction in the list of transactions included in
|
|
||||||
the block this transaction was mined in.
|
|
||||||
|
|
||||||
_property: receipt.root => string
|
|
||||||
The intermediate state root of a receipt.
|
|
||||||
|
|
||||||
Only transactions included in blocks **before** the [Byzantium Hard Fork](link-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.
|
|
||||||
|
|
||||||
_property: receipt.gasUsed => [[bignumber]]
|
|
||||||
The amount of gas actually used by this transaction.
|
|
||||||
|
|
||||||
_property: receipt.logsBloom => string<[[datahexstring]]>
|
|
||||||
A [bloom-filter](link-wiki-bloomfilter), which
|
|
||||||
incldues all the addresses and topics included in any log in this
|
|
||||||
transaction.
|
|
||||||
|
|
||||||
_property: receipt.blockHash => string<[[datahexstring]]<32>>
|
|
||||||
The block hash of the block that this transaction was included in.
|
|
||||||
|
|
||||||
_property: receipt.transactionHash => string<[[datahexstring]]<32>>
|
|
||||||
The transaction hash of this transaction.
|
|
||||||
|
|
||||||
_property: receipt.logs => Array<[[provider-log]]>
|
|
||||||
All the logs emitted by this transaction.
|
|
||||||
|
|
||||||
_property: receipt.blockNumber => number
|
|
||||||
The block height (number) of the block that this transaction was
|
|
||||||
included in.
|
|
||||||
|
|
||||||
_property: receipt.confirmations => number
|
|
||||||
The number of blocks that have been mined since this transaction,
|
|
||||||
including the actual block it was mined in.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: receipt.byzantium => boolean
|
|
||||||
This is true if the block is in a [post-Byzantium Hard Fork](link-eip-609)
|
|
||||||
block.
|
|
||||||
|
|
||||||
_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](link-eip-609)
|
|
||||||
have this property.
|
|
||||||
@ -1,217 +0,0 @@
|
|||||||
_section: Signers
|
|
||||||
|
|
||||||
A Signer represents...
|
|
||||||
|
|
||||||
_subsection: Signer @<signer> @SRC<abstract-signer:class.Signer>
|
|
||||||
|
|
||||||
The **Signer** class is abstract and cannot be directly instaniated. Instead
|
|
||||||
use one of the concreate sub-classes, such as the [[wallet]], [[void-signer]]
|
|
||||||
or [[signer-jsonrpc]].
|
|
||||||
|
|
||||||
_property: signer.connect(provider) => [[signer]] @<signer-connect>
|
|
||||||
|
|
||||||
Sub-classes **must** implement this, however they may simply throw an error
|
|
||||||
if changing providers is not supported.
|
|
||||||
|
|
||||||
_property: signer.getAddress() => Promise<string<[Address](address)>> @<signer-getaddress> @SRC<abstract-signer:Signer.connect>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: Signer.isSigner(object) => boolean @<signer-issigner> @SRC<abstract-signer>
|
|
||||||
Returns true if an only if //object// is a **Signer**.
|
|
||||||
|
|
||||||
_heading: Blockchain Methods @<signer-blockchain>
|
|
||||||
|
|
||||||
_property: signer.getBalance([ blockTag = "latest" ]) => Promise<[[bignumber]]> @<signer-getbalance> @SRC<abstract-signer>
|
|
||||||
Returns the balance of this wallet at //blockTag//.
|
|
||||||
|
|
||||||
_property: signer.getChainId() => Promise<number> @<signer-getchainid> @SRC<abstract-signer>
|
|
||||||
Returns ths chain ID this wallet is connected to.
|
|
||||||
|
|
||||||
_property: signer.getGasPrice() => Promise<[[bignumber]]> @<signer-getgasprice> @SRC<abstract-signer>
|
|
||||||
Returns the current gas price.
|
|
||||||
|
|
||||||
_property: signer.getTransactionCount([ blockTag = "latest" ]) => Promise<number> @<signer-gettransactioncount> @SRC<abstract-signer>
|
|
||||||
Returns the number of transactions this account has ever sent. This
|
|
||||||
is the value required to be included in transactions as the ``nonce``.
|
|
||||||
|
|
||||||
_property: signer.call(transactionRequest) => Promise<string<[[datahexstring]]>> @<signer-call> @SRC<abstract-signer>
|
|
||||||
Returns the result of calling using the //transactionRequest//, with this
|
|
||||||
account address being used as the ``from`` field.
|
|
||||||
|
|
||||||
_property: signer.estimateGas(transactionRequest) => Promise<[[bignumber]]> @<signer-estimategas> @SRC<abstract-signer>
|
|
||||||
Returns the result of estimating the cost to send the //transactionRequest//,
|
|
||||||
with this account address being used as the ``from`` field.
|
|
||||||
|
|
||||||
_property: signer.resolveName(ensName) => Promise<string<[Address](address)>> @<signer-resolvename> @SRC<abstract-signer>
|
|
||||||
Returns the address associated with the //ensName//.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Signing
|
|
||||||
|
|
||||||
_property: signer.signMessage(message) => Promise<string<[FlatSignature](signature-flat)>> @<signer-signmessage>
|
|
||||||
This returns a Promise which resolves to the [[signature-flat]]
|
|
||||||
of //message//.
|
|
||||||
|
|
||||||
Sub-classes **must** implement this, however they may throw if signing a
|
|
||||||
message is not supported.
|
|
||||||
|
|
||||||
_note: 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](utils-arrayify) utility function.
|
|
||||||
|
|
||||||
_null:
|
|
||||||
|
|
||||||
_property: signer.signTransaction(transactionRequest) => Promise<string<[[datahexstring]]>> @<signer-signtransaction>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: signer.sendTransaction(transactionRequest) => Promise<[[provider-transactionresponse]]> @<signer-sendtransaction>
|
|
||||||
This method populates the transactionRequest with missing fields, using
|
|
||||||
[populateTransaction](signer-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.
|
|
||||||
|
|
||||||
_heading: Sub-Classes @<signer-subclassing>
|
|
||||||
|
|
||||||
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()``.
|
|
||||||
|
|
||||||
_property: signer.checkTransaction(transactionRequest) => [[provider-transactionrequest]] @<signer-checktransaction> @SRC<abstract-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 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 [[provider-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.
|
|
||||||
|
|
||||||
_property: signer.populateTransaction(transactionRequest) => Promise<[[provider-transactionrequest]]> @<signer-populatetransaction> @SRC<abstract-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](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.
|
|
||||||
|
|
||||||
_subsection: Wallet @<wallet> @INHERIT<[[externally-owned-account]] and [[signer]]> @SRC<wallet:class.Wallet>
|
|
||||||
|
|
||||||
The Wallet class inherits [[signer]] and can sign transactions and messages
|
|
||||||
using a private key as a standard Externally Owned Account (EOA).
|
|
||||||
|
|
||||||
_property: new ethers.Wallet(privateKey [ , provider ]) @<wallet-constructor> @SRC<wallet:constructor.Wallet>
|
|
||||||
Create a new Wallet instance for //privateKey// and optionally
|
|
||||||
connected to the //provider//.
|
|
||||||
|
|
||||||
_property: ethers.Wallet.createRandom( [ options = { } ]) => [[wallet]] @<wallet-createrandom> @SRC<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.
|
|
||||||
|
|
||||||
_property: ethers.Wallet.fromEncryptedJson(json, password [ , progress ]) => Promise<[[wallet]]> @<wallet-fromencryptedjson> @SRC<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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_heading: Properties
|
|
||||||
|
|
||||||
_property: wallet.address => string<[Address](address)>
|
|
||||||
The address for the account this Wallet represents.
|
|
||||||
|
|
||||||
_property: wallet.provider => [[provider]]
|
|
||||||
The provider this wallet is connected to, which will ge used for any [[signer-blockchain]]
|
|
||||||
methods. This can be null.
|
|
||||||
|
|
||||||
_note: Note
|
|
||||||
A **Wallet** instance is immuatable, so if you wish to change the Provider, you
|
|
||||||
may use the [connect](signer-connect) method to create a new instance connected
|
|
||||||
to the desired provider.
|
|
||||||
|
|
||||||
_property: wallet.publicKey => string<[[datahexstring]]<65>>
|
|
||||||
The uncompressed public key for this Wallet represents.
|
|
||||||
|
|
||||||
_heading: Methods
|
|
||||||
|
|
||||||
_property: wallet.encrypt(password, [ options = { }, [ progress ] ]) => Promise<string>
|
|
||||||
|
|
||||||
Encrypt the wallet using //password// returning a Promise which resolves
|
|
||||||
to a JSON wallet.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: VoidSigner @<void-signer> @INHERIT<[[signer]]> @SRC<abstract-signer:class.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.
|
|
||||||
|
|
||||||
_property: new ethers.VoidSigner(address) => [[void-signer]]
|
|
||||||
Create a new instance of a **VoidSigner** for //address//.
|
|
||||||
|
|
||||||
_property: voidSigner.address => string<[Address](address)>
|
|
||||||
The address of this **VoidSigner**.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: ExternallyOwnedAccount @<externally-owned-account>
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: eoa.address => string<[Address](address)>
|
|
||||||
|
|
||||||
The [[address]] of this EOA.
|
|
||||||
|
|
||||||
_property: eoa.privateKey => string<[[datahexstring]]<32>>
|
|
||||||
|
|
||||||
The privateKey of this EOA
|
|
||||||
|
|
||||||
_property: eoa.mnemonic => [[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.
|
|
||||||
@ -1,241 +0,0 @@
|
|||||||
_section: Fragments
|
|
||||||
|
|
||||||
Explain an ABI.
|
|
||||||
|
|
||||||
_subsection: Formats
|
|
||||||
|
|
||||||
_heading: JSON String ABI (Solidity Output JSON)
|
|
||||||
|
|
||||||
The **JSON ABI Format** is the format that is
|
|
||||||
[output from the Solidity compiler](link-solc-output).
|
|
||||||
|
|
||||||
A JSON serialized object is always a string, which represents an Array
|
|
||||||
of Objects, where each Object has various properties describing the [[abi-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.
|
|
||||||
|
|
||||||
_heading: Humanb-Readable ABI
|
|
||||||
|
|
||||||
The Human-Readable ABI was
|
|
||||||
|
|
||||||
[article](link-ricmoo-humanreadableabi)
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Output Formats @<abi-outputformats> @SRC<abi/fragments:FormatTypes>
|
|
||||||
|
|
||||||
Each [[abi-fragment]] and [[abi-paramtype]] may be output using its ``format``
|
|
||||||
method.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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](abi-fragment-from).
|
|
||||||
|
|
||||||
_property: ethers.utils.FragmentTypes.json => string
|
|
||||||
|
|
||||||
This returns a JavaScript Object which is safe to call ``JSON.stringify``
|
|
||||||
on to create a JSON string.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_warning: Note
|
|
||||||
|
|
||||||
The ``sighash`` format is **insufficient** to re-create the original [[abi-fragment]],
|
|
||||||
since it discards modifiers such as indexed, anonymous, stateMutability, etc.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Fragment @<abi-fragment> @SRC<abi/fragments:class.Fragment>
|
|
||||||
|
|
||||||
An ABI is a collection of **Fragments**, where each fragment specifies:
|
|
||||||
|
|
||||||
- An [Event](abi-eventfragment)
|
|
||||||
- A [Function](abi-functionfragment)
|
|
||||||
- A [Constructor](abi-constructorfragment)
|
|
||||||
|
|
||||||
_heading: Properties
|
|
||||||
|
|
||||||
_property: fragment.name => string
|
|
||||||
|
|
||||||
This is the name of the Event or Function. This will be null for
|
|
||||||
a [[abi-constructorfragment]].
|
|
||||||
|
|
||||||
_property: fragment.type => string
|
|
||||||
|
|
||||||
This is a string which indicates the type of the [[abi-fragment]]. This
|
|
||||||
will be one of:
|
|
||||||
|
|
||||||
- ``constructor``
|
|
||||||
- ``event``
|
|
||||||
- ``function``
|
|
||||||
|
|
||||||
_property: fragment.inputs => Array<[[abi-paramtype]]>
|
|
||||||
|
|
||||||
This is an array of of each [[abi-paramtype]] for the input parameters to
|
|
||||||
the Constructor, Event of Function.
|
|
||||||
|
|
||||||
_heading: Methods
|
|
||||||
|
|
||||||
_property: ethers.utils.Fragment.from(objectOrString) => [[abi-fragment]] @<abi-fragment-from> @SRC<abi/fragments:Fragment.from>
|
|
||||||
|
|
||||||
Returns a
|
|
||||||
|
|
||||||
_property: ethers.utils.Fragment.isFragment(object) => boolean @<abi-isfragment> @SRC<abi/fragments:Fragment.isFragment>
|
|
||||||
|
|
||||||
Tra lal al
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: ConstructorFragment @<abi-constructorfragment> @INHERIT<[[abi-fragment]]> @SRC<abi/fragments:class.ConstructorFragment>
|
|
||||||
|
|
||||||
_heading: Properties
|
|
||||||
|
|
||||||
_property: fragment.gas => [[bignumber]]
|
|
||||||
|
|
||||||
This is the gas limit that should be used during deployment. It may be
|
|
||||||
null.
|
|
||||||
|
|
||||||
_property: fragment.payable => boolean
|
|
||||||
|
|
||||||
This is whether the constructor may receive ether during deployment as
|
|
||||||
an endowment (i.e. msg.value != 0).
|
|
||||||
|
|
||||||
_property: fragment.stateMutability => string
|
|
||||||
|
|
||||||
This is the state mutability of the constructor. It can be any of:
|
|
||||||
|
|
||||||
- ``nonpayable``
|
|
||||||
- ``payable``
|
|
||||||
|
|
||||||
_heading: Methods
|
|
||||||
|
|
||||||
_property: ethers.utils.ConstructorFragment.from(objectOrString) => [[abi-constructorfragment]] @<abi-constructorfragment-from> @SRC<abi/fragments:ConstructorFragment.from>
|
|
||||||
|
|
||||||
Tra la la...
|
|
||||||
|
|
||||||
_property: ethers.utils.ConstructorFragment.isConstructorFragment(object) => boolean @<abi-isconstructorfragment> @SRC<abi/fragments:ConstructorFragment.isConstructorFragment>
|
|
||||||
|
|
||||||
Tra lal al
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: EventFragment @<abi-eventfragment> @INHERIT<[[abi-fragment]]> @SRC<abi/fragments:class.EventFragment>
|
|
||||||
|
|
||||||
_heading: Properties
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_heading: Methods
|
|
||||||
|
|
||||||
_property: ethers.utils.EventFragment.from(objectOrString) => [[abi-eventfragment]] @<abi-eventfragment-from> @SRC<abi/fragments:EventFragment.from>
|
|
||||||
|
|
||||||
Tra la la...
|
|
||||||
|
|
||||||
_property: ethers.utils.EventFragment.isEventFragment(object) => boolean @<abi-iseventfragment> @SRC<abi/fragments:EventFragment.isEventFragment>
|
|
||||||
|
|
||||||
Tra lal al
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: FunctionFragment @<abi-functionfragment> @INHERIT<[[abi-constructorfragment]]> @SRC<abi/fragments:class.FunctionFragment>
|
|
||||||
|
|
||||||
_heading: Properties
|
|
||||||
|
|
||||||
_property: 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``.
|
|
||||||
|
|
||||||
_property: fragment.stateMutability => string
|
|
||||||
|
|
||||||
This is the state mutability of the constructor. It can be any of:
|
|
||||||
|
|
||||||
- ``nonpayable``
|
|
||||||
- ``payable``
|
|
||||||
- ``pure``
|
|
||||||
- ``view``
|
|
||||||
|
|
||||||
_property: fragment.outputs => Array<[[abi-paramtype]]>
|
|
||||||
|
|
||||||
A list of the Function output parameters.
|
|
||||||
|
|
||||||
_heading: Method
|
|
||||||
|
|
||||||
_property: ethers.utils.FunctionFragment.from(objectOrString) => [[abi-functionfragment]] @<abi-functionfragment-from> @SRC<abi/fragments:ConstructorFragment.from>
|
|
||||||
|
|
||||||
Tra la la...
|
|
||||||
|
|
||||||
_property: ethers.utils.FunctionFragment.isFunctionFragment(object) => boolean @<abi-isfunctionfragment> @SRC<abi/fragments:FunctionFragment.isFunctionFragment>
|
|
||||||
|
|
||||||
Tra lal al
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: ParamType @<abi-paramtype> @SRC<abi/fragments:class.ParamType>
|
|
||||||
|
|
||||||
The following examples will represent the Solidity parameter:
|
|
||||||
|
|
||||||
``string foobar``
|
|
||||||
|
|
||||||
_heading: Properties
|
|
||||||
|
|
||||||
_property: paramType.name => string @<abi-paramtype-name>
|
|
||||||
|
|
||||||
The local parameter name. This may be null for unnamed parameters. For example,
|
|
||||||
the parameter definition ``string foobar`` would be ``foobar``.
|
|
||||||
|
|
||||||
_property: paramType.type => string @<abi-paramtype-type>
|
|
||||||
|
|
||||||
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``.
|
|
||||||
|
|
||||||
_property: paramType.basetype => string @<abi-paramtype-basetype>
|
|
||||||
|
|
||||||
The base type of the parameter. For primitive types (e.g. ``address``, ``uint256``, etc)
|
|
||||||
this is equal to [type](abi-paramtype-type). For arrays, it will be the string ``array`` and for
|
|
||||||
a tuple, it will be the string ``tuple``.
|
|
||||||
|
|
||||||
_property: paramType.indexed => boolean @<abi-paramtype-indexed>
|
|
||||||
|
|
||||||
Whether the parameter has been marked as indexed. This **only** applies
|
|
||||||
to parameters which are part of an [[abi-eventfragment]].
|
|
||||||
|
|
||||||
_property: paramType.arrayChildren => [[abi-paramtype]] @<abi-paramtype-arraychildren>
|
|
||||||
|
|
||||||
The type of children of the array. This is null for for any parameter
|
|
||||||
wjhich is not an array.
|
|
||||||
|
|
||||||
_property: paramType.arrayLength => number @<abi-paramtype-arraylength>
|
|
||||||
|
|
||||||
The length of the array, or ``-1`` for dynamic-length arrays. This is
|
|
||||||
null for parameters which is not arrays.
|
|
||||||
|
|
||||||
_property: paramType.components => Array<[[abi-paramtype]]> @<abi-paramtype-components>
|
|
||||||
|
|
||||||
The components of a tuple. This is null for non-tuple parameters.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Methods
|
|
||||||
|
|
||||||
Tra la la...
|
|
||||||
|
|
||||||
_property: paramType.format([ outputType = sighash ])
|
|
||||||
|
|
||||||
Tra la la...
|
|
||||||
|
|
||||||
_property: ethers.utils.ParamType.from(objectOrString) => [[abi-paramtype]] @<abi-paramtype-from> @SRC<abi/fragments:ParamType.from>
|
|
||||||
|
|
||||||
Tra la la...
|
|
||||||
|
|
||||||
_property: ethers.utils.ParamType.isParamType(object) => boolean @<abi-paramtype-isparamtype> @SRC<abi/fragments:ParamType.isParamType>
|
|
||||||
|
|
||||||
Tra la la...
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
_section: Application Binary Interface @NAV<ABI>
|
|
||||||
|
|
||||||
_toc:
|
|
||||||
interface
|
|
||||||
fragments
|
|
||||||
@ -1,196 +0,0 @@
|
|||||||
_section: Interface @<abi-interface> @SRC<abi/interface:class.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 [[link-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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Creating Instances
|
|
||||||
|
|
||||||
_property: new ethers.utils.Interface(abi) @SRC<abi/interface:constructor.Interface>
|
|
||||||
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](link-solc-output) (or compatible languages).
|
|
||||||
|
|
||||||
The //abi// may also be a [Human-Readable Abi](link-ricmoo-humanreadableabi),
|
|
||||||
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.
|
|
||||||
|
|
||||||
_subsection: Properties
|
|
||||||
|
|
||||||
_property: interface.fragments => Array<[[abi-fragment]]>
|
|
||||||
All the [Fragments](abi-fragment) in the interface.
|
|
||||||
|
|
||||||
_property: interface.events => Array<[[abi-eventfragment]]>
|
|
||||||
All the [Event Fragments](abi-eventfragment) in the interface.
|
|
||||||
|
|
||||||
_property: interface.functions => Array<[[abi-functionfragment]]>
|
|
||||||
All the [Function Fragments](abi-functionfragment) in the interface.
|
|
||||||
|
|
||||||
_property: interface.deploy => [[abi-constructorfragment]]
|
|
||||||
The [Constructor Fragments](abi-constructorfragment) for the interface.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Formatting
|
|
||||||
|
|
||||||
_property: interface.format( [ format ]) => string | Array<string> @SRC<abi/interface>
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Fragment Access
|
|
||||||
|
|
||||||
_property: interface.getFunction(fragment) => [[abi-functionfragment]] @SRC<abi/interface>
|
|
||||||
Returns the [[abi-functionfragment]] for //fragment// (see [[abi-fragmentid]]).
|
|
||||||
|
|
||||||
_property: interface.getEvent(fragment) => [[abi-eventfragment]] @SRC<abi/interface>
|
|
||||||
Returns the [[abi-eventfragment]] for //fragment// (see [[abi-fragmentid]]).
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Signature and Topic Hashes
|
|
||||||
|
|
||||||
_property: interface.getSighash(fragment) => string<[[datahexstring]]<4>> @SRC<abi/interface:method.Interface.getSighash>
|
|
||||||
Return the sighash (or Function Selector) for //fragment// (see [[abi-fragmentid]]).
|
|
||||||
|
|
||||||
_property: interface.getEventTopic(fragment) => string<[[datahexstring]]<32>> @SRC<abi/interface:method.Interface.getEventTopic>
|
|
||||||
Return the topic hash for //fragment// (see [[abi-fragmentid]]).
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Encoding Data
|
|
||||||
|
|
||||||
_property: interface.encodeDeploy([ values ]) => string<[[datahexstring]]> @SRC<abi/interface>
|
|
||||||
Return the encoded deployment data, which can be concatenated to the
|
|
||||||
deployment bytecode of a contract to pass //values// into the contract
|
|
||||||
constructor.
|
|
||||||
|
|
||||||
_property: interface.encodeFilterTopics(fragment [ , values ]) => Array<topic | Array<topic>> @SRC<abi/interface>
|
|
||||||
Returns the encoded topic filter, which can be passed to getLogs for //fragment//
|
|
||||||
(see [[abi-fragmentid]]) for the given //values//.
|
|
||||||
|
|
||||||
Each //topic// is a 32 byte (64 nibble) [[datahexstring]].
|
|
||||||
|
|
||||||
_property: interface.encodeFunctionData(fragment [ , values ]) => string<[[datahexstring]]> @SRC<abi/interface>
|
|
||||||
Returns the encoded data, which can be used as the data for a transaction for
|
|
||||||
//fragment// (see [[abi-fragmentid]]) for the given //values//.
|
|
||||||
|
|
||||||
_property: interface.encodeFunctionResult(fragment [ , values ]) => string<[[datahexstring]]> @SRC<abi/interface>
|
|
||||||
Returns the encoded result, which would normally be the response from a call for
|
|
||||||
//fragment// (see [[abi-fragmentid]]) for the given //values//.
|
|
||||||
|
|
||||||
Most developers will not need this method, but may be useful for authors of a mock blockchain.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Decoding Data
|
|
||||||
|
|
||||||
_property: interface.decodeEventLog(fragment, data [ , topics ]) => [[abi-result]] @SRC<abi/interface>
|
|
||||||
Returns the decoded event values from an event log for
|
|
||||||
//fragment// (see [[abi-fragmentid]]) for the given //data//
|
|
||||||
with the optional //topics//.
|
|
||||||
|
|
||||||
If //topics// is not specified, placeholders will be inserted into the result.
|
|
||||||
|
|
||||||
_property: interface.decodeFunctionData(fragment, data) => [[abi-result]] @SRC<abi/interface>
|
|
||||||
Returns the decoded values from transaction data for
|
|
||||||
//fragment// (see [[abi-fragmentid]]) for the given //data//.
|
|
||||||
|
|
||||||
Most developers will not need this method, but may be useful for debugging
|
|
||||||
or inspecting transactions.
|
|
||||||
|
|
||||||
_property: interface.decodeFunctionResult(fragment, data) => [[abi-result]] @SRC<abi/interface>
|
|
||||||
Returns the decoded values from the result of a call for
|
|
||||||
//fragment// (see [[abi-fragmentid]]) for the given //data//.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: 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.
|
|
||||||
|
|
||||||
_property: interface.parseLog(log) => [[abi-log]] @SRC<abi/interface>
|
|
||||||
Search the event that matches the //log// topic hash and parse the values
|
|
||||||
the log represents.
|
|
||||||
|
|
||||||
_property: interface.parseTransaction(transaction) => [[abi-transaction]] @SRC<abi/interface>
|
|
||||||
Search for the function that matches the //transaction// data sighash
|
|
||||||
and parse the transaction properties.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Types
|
|
||||||
|
|
||||||
_heading: Result @<abi-result> @INHERIT<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.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: LogDescription @<abi-log>
|
|
||||||
|
|
||||||
_property: logDescription.args => [[abi-result]]
|
|
||||||
The values of the input parameters of the event.
|
|
||||||
|
|
||||||
_property: logDescription.eventFragment => [[abi-eventfragment]]
|
|
||||||
The [[abi-eventfragment]] which matches the topic in the Log.
|
|
||||||
|
|
||||||
_property: logDescription.name => string
|
|
||||||
The event name. (e.g. ``Transfer``)
|
|
||||||
|
|
||||||
_property: logDescription.signature => string
|
|
||||||
The event signature. (e.g. ``Transfer(address,address,uint256)``)
|
|
||||||
|
|
||||||
_property: logDescription.topic => string
|
|
||||||
The topic hash.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: TransactionDescription @<abi-transaction>
|
|
||||||
|
|
||||||
_property: transactionDescription.args => [[abi-result]]
|
|
||||||
The decoded values from the transaction data which were passed
|
|
||||||
as the input parameters.
|
|
||||||
|
|
||||||
_property: transactionDescription.functionFragment => [[abi-functionfragment]]
|
|
||||||
The [[abi-functionfragment]] which matches the sighash in the transaction data.
|
|
||||||
|
|
||||||
_property: transactionDescription.name => string
|
|
||||||
The name of the function. (e.g. ``transfer``)
|
|
||||||
|
|
||||||
_property: transactionDescription.sighash => string
|
|
||||||
The sighash (or function selector) that matched the transaction data.
|
|
||||||
|
|
||||||
_property: transactionDescription.signature => string
|
|
||||||
The signature of the function. (e.g. ``transfer(address,uint256)``)
|
|
||||||
|
|
||||||
_property: transactionDescription.value => [[bignumber]]
|
|
||||||
The value from the transaction.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Specifying Fragments @<abi-fragmentid>
|
|
||||||
|
|
||||||
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 [[abi-fragment]]
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
_section: Addresses @<addresses>
|
|
||||||
|
|
||||||
Explain addresses,formats and checksumming here.
|
|
||||||
|
|
||||||
Also see: [constants.AddressZero](constants)
|
|
||||||
|
|
||||||
_subsection: Address Formats @<address-formats>
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Address @<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.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: ICAP Address @<address-icap>
|
|
||||||
|
|
||||||
The **ICAP Address Format** was an early attempt to introduce a checksum
|
|
||||||
into Ethereum addresses using the popular banking industry's
|
|
||||||
[IBAN](link-wiki-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](utils-getIcapAddress).
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Functions
|
|
||||||
|
|
||||||
_property: ethers.utils.getAddress(address) => string<[[address]]> @<utils-getAddress> @SRC<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.
|
|
||||||
|
|
||||||
|
|
||||||
_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>
|
|
||||||
Returns //address// as an [ICAP address](link-icap).
|
|
||||||
Supports the same restrictions as [utils.getAddress](utils-getAddress).
|
|
||||||
|
|
||||||
_property: ethers.utils.getContractAddress(transaction) => string<[[address]]> @<utils-getcontractaddress> @SRC<address>
|
|
||||||
Returns the contract address that would result if //transaction// was
|
|
||||||
used to deploy a contract.
|
|
||||||
|
|
||||||
_property: ethers.utils.getCreate2Address(from, salt, initCodeHash) => string<[[address]]> @<utils-getCreate2Address> @SRC<address>
|
|
||||||
Returns the contract address that would result from the given
|
|
||||||
[CREATE2](link-eip-1014) call.
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
// <hide>
|
|
||||||
const { BigNumber } = require("./packages/ethers");
|
|
||||||
const { constants } = require("./packages/ethers");
|
|
||||||
|
|
||||||
function _inspect(result) {
|
|
||||||
if (BigNumber.isBigNumber(result)) {
|
|
||||||
return `{ BigNumber: ${ JSON.stringify(result.toString()) } }`;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
// </hide>
|
|
||||||
|
|
||||||
// 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
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
// <hide>
|
|
||||||
const { BigNumber } = require("./packages/ethers");
|
|
||||||
|
|
||||||
function _inspect(result) {
|
|
||||||
if (BigNumber.isBigNumber(result)) {
|
|
||||||
return `{ BigNumber: ${ JSON.stringify(result.toString()) } }`;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
// </hide>
|
|
||||||
|
|
||||||
let a = BigNumber.from(42);
|
|
||||||
let b = BigNumber.from("91");
|
|
||||||
|
|
||||||
a.mul(b);
|
|
||||||
//!
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER)
|
|
||||||
//!
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
/////
|
|
||||||
// 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";
|
|
||||||
@ -1,241 +0,0 @@
|
|||||||
_section: BigNumber @<bignumber>
|
|
||||||
|
|
||||||
Many operations in Ethereum operation on numbers which are
|
|
||||||
[outside the range of safe values](notes-safenumbers) to use
|
|
||||||
in JavaScript.
|
|
||||||
|
|
||||||
A **BigNumber** is an object which safely allows mathematic operations
|
|
||||||
on numbers of any magnitude.
|
|
||||||
|
|
||||||
Most operations which need to return a value will return a **BigNumber**
|
|
||||||
and parameters which accept values will generally accept them.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Importing
|
|
||||||
|
|
||||||
_code: bignumber-import.source
|
|
||||||
|
|
||||||
_subsection: Types
|
|
||||||
|
|
||||||
_heading: BigNumberish @<bignumberish>
|
|
||||||
|
|
||||||
Many functions and methods in this library take in values which
|
|
||||||
can be non-ambiguously and safely converted to a BigNumber. These
|
|
||||||
values can be sepcified as:
|
|
||||||
|
|
||||||
_definition: **//string//**
|
|
||||||
A [hexstring](hexstring) or a decimal string, either of which may
|
|
||||||
be negative.
|
|
||||||
|
|
||||||
_definition: **//BytesLike//**
|
|
||||||
A [BytesLike](byteslike) Object, such as an Array or Uint8Array.
|
|
||||||
|
|
||||||
_definition: **//BigNumber//**
|
|
||||||
An existing [[bignumber]] instance.
|
|
||||||
|
|
||||||
_definition: **//number//**
|
|
||||||
A number that is within the [safe range](link-js-maxsafe) for JavaScript numbers.
|
|
||||||
|
|
||||||
_definition: **//BigInt//**
|
|
||||||
A JavaScript [BigInt](link-js-bigint)
|
|
||||||
object, on environments that support BigInt.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Creating Instances
|
|
||||||
|
|
||||||
The constructor of BigNumber cannot be called directly. Instead, Use the static ``BigNumber.from``.
|
|
||||||
|
|
||||||
_property: ethers.BigNumber.from(aBigNumberish) => [[bignumber]]
|
|
||||||
Returns an instance of a **BigNumber** for //aBigNumberish//.
|
|
||||||
|
|
||||||
_heading: Examples: @<>
|
|
||||||
|
|
||||||
_code: bignumber-create.js
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Methods
|
|
||||||
|
|
||||||
The BigNumber class is immutable, so no operations can change the value
|
|
||||||
it represents.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Math Operations
|
|
||||||
|
|
||||||
_property: bignumber.add(otherValue) => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the value of //bignumber// **+** //otherValue//.
|
|
||||||
|
|
||||||
_property: bignumber.sub(otherValue) => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the value of //bignumber// **–** //otherValue//.
|
|
||||||
|
|
||||||
_property: bignumber.mul(otherValue) => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the value of //bignumber// **×** //otherValue//.
|
|
||||||
|
|
||||||
_property: bignumber.div(divisor) => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the value of //bignumber// **÷** //divisor//.
|
|
||||||
|
|
||||||
_property: bignumber.mod(divisor) => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the value of the **remainder** of //bignumber// ÷ //divisor//.
|
|
||||||
|
|
||||||
_property: bignumber.pow(exponent) => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the value of //bignumber// to the power of //exponent//.
|
|
||||||
|
|
||||||
_property: bignumber.abs() => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the absolute value of //bignumber//.
|
|
||||||
|
|
||||||
_property: bignumber.maskn(bitcount) => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the value of //bignumber// with bits beyond
|
|
||||||
the //bitcount// least significant bits set to zero.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Two's Compliment
|
|
||||||
|
|
||||||
[Two's Complicment](link-wiki-twoscomplement)
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: bignumber.fromTwos(bitwidth) => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the value of //bignumber// converted from twos-compliment with //bitwidth//.
|
|
||||||
|
|
||||||
_property: bignumber.toTwos(bitwidth) => [[bignumber]] @SRC<bignumber>
|
|
||||||
Returns a BigNumber with the value of //bignumber// converted to twos-compliment with //bitwidth//.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Comparison and Equivalence
|
|
||||||
|
|
||||||
_property: bignumber.eq(otherValue) => boolean @SRC<bignumber>
|
|
||||||
Returns true if and only if the value of //bignumber// is equal to //otherValue//.
|
|
||||||
|
|
||||||
_property: bignumber.lt(otherValue) => boolean @SRC<bignumber>
|
|
||||||
Returns true if and only if the value of //bignumber// **<** //otherValue//.
|
|
||||||
|
|
||||||
_property: bignumber.lte(otherValue) => boolean @SRC<bignumber>
|
|
||||||
Returns true if and only if the value of //bignumber// **≤** //otherValue//.
|
|
||||||
|
|
||||||
_property: bignumber.gt(otherValue) => boolean @SRC<bignumber>
|
|
||||||
Returns true if and only if the value of //bignumber// **>** //otherValue//.
|
|
||||||
|
|
||||||
_property: bignumber.gte(otherValue) => boolean @SRC<bignumber>
|
|
||||||
Returns true if and only if the value of //bignumber// **≥** //otherValue//.
|
|
||||||
|
|
||||||
_property: bignumber.isZero() => boolean @SRC<bignumber>
|
|
||||||
Returns true if and only if the value of //bignumber// is zero.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Conversion
|
|
||||||
|
|
||||||
_property: bignumber.toNumber() => number @SRC<bignumber>
|
|
||||||
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//.
|
|
||||||
|
|
||||||
_property: bignumber.toString() => string @SRC<bignumber:BigNumber.toString>
|
|
||||||
Returns the value of //bignumber// as a base-10 string.
|
|
||||||
|
|
||||||
_property: bignumber.toHexString() => string<[[datahexstring]]> @SRC<bignumber:BigNumber.toHexString>
|
|
||||||
Returns the value of //bignumber// as a base-16, ``0x``-prefixed [[datahexstring]].
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Inspection
|
|
||||||
|
|
||||||
_property: ethers.BigNumnber.isBigNumber(object) => boolean @SRC<bignumber>
|
|
||||||
Returns true if and only if the //object// is a BigNumber object.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Examples
|
|
||||||
|
|
||||||
_code: bignumber-examples.js
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Notes
|
|
||||||
|
|
||||||
This section is a for a couple of questions that come up frequently.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Why can't I just use numbers? @<notes-safenumbers>
|
|
||||||
|
|
||||||
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](link-wiki-ieee754)
|
|
||||||
numbers to represent numeric values. As a result, there are //holes//
|
|
||||||
in the integer set after 9,007,199,254,740,991; which is
|
|
||||||
problematic for //Ethereum// because that is only around 0.009
|
|
||||||
ether (in wei), which means any value over that will begin to
|
|
||||||
experience rounding errors.
|
|
||||||
|
|
||||||
To demonstrate how this may be an issue in your code, consider:
|
|
||||||
|
|
||||||
_code: bignumber-ieee754.js
|
|
||||||
|
|
||||||
To remedy this, all numbers (which can be large) are stored
|
|
||||||
and manipulated as [Big Numbers](bignumber).
|
|
||||||
|
|
||||||
The functions [parseEther( etherString )](http://linkto) and
|
|
||||||
[formatEther( wei )](http://linkto) can be used to convert
|
|
||||||
between string representations, which are displayed to or entered
|
|
||||||
by the user and Big Number representations which can have
|
|
||||||
mathematical operations handled safely.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Why not BigNumber.js, BN.js, BigDecimal, etc?
|
|
||||||
|
|
||||||
Everyone has their own favourite Big Number library, and once someone
|
|
||||||
has choosen one, it becomes part of their identity, like their editor,
|
|
||||||
vi vs emacs. There are over 100 Big Number libraries on [npm](link-npm-query-bignumber).
|
|
||||||
|
|
||||||
One of the biggest differences between the Ethers [[bignumber]] object and
|
|
||||||
other libraries is that it is immutable, which is very important when
|
|
||||||
dealing with the asynchronous nature of the blockchain.
|
|
||||||
|
|
||||||
Capturing the value is not safe in async functions, so immutability
|
|
||||||
protects us from easy to make mistakes, which is not possible on the
|
|
||||||
low-level library's objects which supports myriad in-place operations.
|
|
||||||
|
|
||||||
Second, the Ethers [[bignumber]] provides all the functionality required
|
|
||||||
internally and should generally be sufficient for most developers while
|
|
||||||
not exposing some of the more advanced and rare functionality. So it will
|
|
||||||
be eaiser to swap out the underlying library without impacting consumers.
|
|
||||||
|
|
||||||
For example, if [[link-npm-bnjs]] was exposed, someone may use the
|
|
||||||
greatest-common-denominator functions, which would then be functionality
|
|
||||||
the replacing library should also provide to ensure anyone depending on
|
|
||||||
that functionality is not broken.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Why BN.js??
|
|
||||||
|
|
||||||
The reason why [[link-npm-bnjs]] is used internally as the big
|
|
||||||
number is because that is the library used by [[link-npm-elliptic]].
|
|
||||||
|
|
||||||
Therefore it **must** be included regardless, so we leverage that
|
|
||||||
library rather than adding another Big Number library, which would
|
|
||||||
mean two different libraries offering the same functionality.
|
|
||||||
|
|
||||||
This has saved about 85kb (80% of this library size) of library size
|
|
||||||
over other libraries which include separate Big Number libraries for
|
|
||||||
various purposes.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Why not allow us to set a global Big Number library?
|
|
||||||
|
|
||||||
Another comment that comes up frequently is tha desire to specify a
|
|
||||||
global user-defined Big Number library, which all functions would
|
|
||||||
return.
|
|
||||||
|
|
||||||
This becomes problematic since your code may live along side other
|
|
||||||
libraries or code that use Ethers. In fact, even Ethers uses a lot
|
|
||||||
of the public functions internally.
|
|
||||||
|
|
||||||
If you, for example, used a library that used ``a.plus(b)`` instead
|
|
||||||
of ``a.add(b)``, this would break Ethers when it tries to compute
|
|
||||||
fees internally, and other libraries likely have similar logic.
|
|
||||||
|
|
||||||
But, the [[bignumber]] prototype is exposed, so you can always add a
|
|
||||||
``toMyCustomBigNumber()`` method to all [[bignumber]]'s globally
|
|
||||||
which is safe.
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
// <hide>
|
|
||||||
|
|
||||||
const { ethers } = require("./packages/ethers");
|
|
||||||
const { arrayify, hexlify, hexValue } = ethers.utils;
|
|
||||||
|
|
||||||
function _inspect(result) {
|
|
||||||
if (result && typeof(result.length) === "number" && typeof(result) !== "string") {
|
|
||||||
return "[ " + Array.prototype.map.call(result, (i) => _inspect(i)).join(", ") + " ]";
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// </hide>
|
|
||||||
|
|
||||||
// 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 ])
|
|
||||||
//!
|
|
||||||
@ -1,141 +0,0 @@
|
|||||||
_section: Byte Manipulation
|
|
||||||
|
|
||||||
Tra la la...
|
|
||||||
|
|
||||||
_subsection: Types
|
|
||||||
|
|
||||||
_heading: Bytes @<bytes>
|
|
||||||
|
|
||||||
A **Bytes** is any object which is an
|
|
||||||
[Array](link-js-array) or [TypedArray](link-js-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.
|
|
||||||
|
|
||||||
_heading: BytesLike @<byteslike>
|
|
||||||
|
|
||||||
A **BytesLike** can be either a [[bytes]] or a [[datahexstring]].
|
|
||||||
|
|
||||||
_heading: 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.
|
|
||||||
|
|
||||||
_heading: Hexstring @<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``).
|
|
||||||
|
|
||||||
_heading: Signature @<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](link-eip-2098) of the **s** and **v**
|
|
||||||
- **recoveryParam** --- The normalized (i.e. 0 or 1) value of **v**
|
|
||||||
|
|
||||||
_heading: Flat-Format Signature @<signature-flat>
|
|
||||||
|
|
||||||
A **Flat-Format Signature** is a common Signature format where
|
|
||||||
the r, s and v are concanenated into a 65 byte (130 nibble)
|
|
||||||
[[datahexstring]].
|
|
||||||
|
|
||||||
|
|
||||||
_heading: SignatureLike @<signaturelike>
|
|
||||||
|
|
||||||
A **SignatureLike** is similar to a [[signature]], except redundant properties
|
|
||||||
may be omitted or it may be a [[signature-flat]].
|
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Inspection
|
|
||||||
|
|
||||||
_property: ethers.utils.isBytes(object) => boolean @<utils-isbytes> @SRC<bytes>
|
|
||||||
Returns true if and only if //object// is a valid [[bytes]].
|
|
||||||
|
|
||||||
_property: ethers.utils.isBytesLike(object) => boolean @<utils-isbyteslike> @SRC<bytes>
|
|
||||||
Returns true if and only if //object// is a [[bytes]] or [[datahexstring]].
|
|
||||||
|
|
||||||
_property: ethers.utils.isHexString(object, [ length ] ) => boolean @<utils-ishexstring> @SRC<bytes>
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Converting between Arrays and Hexstrings
|
|
||||||
|
|
||||||
_property: ethers.utils.arrayify(datahexstringOrArrayish [ , options ]) => Uint8Array @<utils-arrayify> @SRC<bytes>
|
|
||||||
Converts //datahexstringOrArrayish// to a Uint8Array.
|
|
||||||
|
|
||||||
_property: ethers.utils.hexlify(hexstringOrArrayish) => string<[[datahexstring]]> @<utils-hexlify> @SRC<bytes>
|
|
||||||
Converts //hexstringOrArrayish// to a [[datahexstring]].
|
|
||||||
|
|
||||||
_property: ethers.utils.hexValue(aBigNumberish) => string<[[hexstring]]> @<utils-hexvalue> @SRC<bytes>
|
|
||||||
Converts //aBigNumberish// to a [[hexstring]], with no __unnecessary__ leading
|
|
||||||
zeros.
|
|
||||||
|
|
||||||
_heading: Examples
|
|
||||||
|
|
||||||
_code: bytes-conversion.js
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Array Manipulation
|
|
||||||
|
|
||||||
_property: ethers.utils.concat(arrayOfBytesLike) => Uint8Array @<utils-concat> @SRC<bytes>
|
|
||||||
Concatenates all the [[byteslike]] in //arrayOfBytesLike// into a single Uint8Array.
|
|
||||||
|
|
||||||
_property: ethers.utils.stripZeros(aBytesLike) => Uint8Array @<utils-stripzeros> @SRC<bytes>
|
|
||||||
Returns a Uint8Array with all leading ``0`` bytes of //aBtyesLike// removed.
|
|
||||||
|
|
||||||
_property: ethers.utils.zeroPad(aBytesLike, length) => Uint8Array @<utils-zeropad> @SRC<bytes>
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Hexstring Manipulation
|
|
||||||
|
|
||||||
_property: ethers.utils.hexConcat(arrayOfBytesLike) => string<[[datahexstring]]> @<utils-hexconcat> @SRC<bytes>
|
|
||||||
Concatenates all the [[byteslike]] in //arrayOfBytesLike// into a single [[datahexstring]]
|
|
||||||
|
|
||||||
_property: ethers.utils.hexDataLength(aBytesLike) => string<[[datahexstring]]> @<utils-hexdatalength> @SRC<bytes>
|
|
||||||
Returns the length (in bytes) of //aBytesLike//.
|
|
||||||
|
|
||||||
_property: ethers.utils.hexDataSlice(aBytesLike, offset [ , endOffset ] ) => string<[[datahexstring]]> @<utils-hexdataslice> @SRC<bytes>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: ethers.utils.hexStripZeros(aBytesLike) => string<[[hexstring]]> @<utils-hexstripzeros> @SRC<bytes>
|
|
||||||
Returns a [[hexstring]] representation of //aBytesLike// with all
|
|
||||||
leading zeros removed.
|
|
||||||
|
|
||||||
_property: ethers.utils.hexZeroPad(aBytesLike, length) => string<[[datahexstring]]> @<utils-hexzeropad> @SRC<bytes>
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Signature Conversion
|
|
||||||
|
|
||||||
_property: ethers.utils.joinSignature(aSignatureLike) => string<[FlatSignature](signature-flat)> @<utils-joinsignature> @SRC<bytes>
|
|
||||||
Return the flat-format of //aSignaturelike//, which is 65 bytes (130 nibbles)
|
|
||||||
long, concatenating the **r**, **s** and (normalized) **v** of a Signature.
|
|
||||||
|
|
||||||
_property: ethers.utils.splitSignature(aSignatureLikeOrBytesLike) => [[signature]] @<utils-splitsignature> @SRC<bytes>
|
|
||||||
Return the full expanded-format of //aSignaturelike// or a flat-format [[datahexstring]].
|
|
||||||
Any missing properties will be computed.
|
|
||||||
|
|
||||||
_subsection: Random Bytes
|
|
||||||
|
|
||||||
_property: ethers.utils.randomBytes(length) => Uint8Array @<utils-randombytes> @SRC<random/index>
|
|
||||||
Return a new Uint8Array of //length// random bytes.
|
|
||||||
|
|
||||||
_property: ethers.utils.shuffled(array) => Array<any> @<utils.shuffled> @SRC<random>
|
|
||||||
Return a copy of //array// shuffled using [[link-wiki-shuffle]].
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
|
|
||||||
//const { constants } = require("ethers");
|
|
||||||
// const { constants } = require("@ethersproject/constants");
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
_section: Constants @<constants>
|
|
||||||
|
|
||||||
The **ethers.contants** Object contains commonly used values.
|
|
||||||
|
|
||||||
_heading: Importing
|
|
||||||
|
|
||||||
_code: constants-import.js
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Bytes
|
|
||||||
|
|
||||||
_property: ethers.constants.AddressZero => string<[Address](address)> @<constants-addresszero> @SRC<constants>
|
|
||||||
The Address Zero, which is 20 bytes (40 nibbles) of zero.
|
|
||||||
|
|
||||||
_property: ethers.constants.HashZero => string<[[datahexstring]]<32>> @<constants-hashzero> @SRC<constants>
|
|
||||||
The Hash Zero, which is 32 bytes (64 nibbles) of zero.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Strings
|
|
||||||
|
|
||||||
_property: ethers.constants.EtherSymbol => string @<constants-ethersymbol> @SRC<constants>
|
|
||||||
The Ether symbol, **Ξ**.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: BigNumber
|
|
||||||
|
|
||||||
_property: ethers.constants.NegativeOne => [[bignumber]] @<constants-negativeone> @SRC<constants>
|
|
||||||
The BigNumber value representing ``"-1"``.
|
|
||||||
|
|
||||||
_property: ethers.constants.Zero => [[bignumber]] @<constants-zero> @SRC<constants>
|
|
||||||
The BigNumber value representing ``"0"``.
|
|
||||||
|
|
||||||
_property: ethers.constants.One => [[bignumber]] @<constants-one> @SRC<constants>
|
|
||||||
The BigNumber value representing ``"1"``.
|
|
||||||
|
|
||||||
_property: ethers.constants.Two => [[bignumber]] @<constants-two> @SRC<constants>
|
|
||||||
The BigNumber value representing ``"2"``.
|
|
||||||
|
|
||||||
_property: ethers.constants.WeiPerEther => [[bignumber]] @<constants-weiperether> @SRC<constants>
|
|
||||||
The BigNumber value representing ``"1000000000000000000"``, which is the
|
|
||||||
number of Wei per Ether.
|
|
||||||
|
|
||||||
_property: ethers.constants.MaxUint256 => [[bignumber]] @<constants-maxuint256> @SRC<constants>
|
|
||||||
The BigNumber value representing the maximum ``uint256`` value.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
_section: 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](unit-conversion) 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](unit-conversion) will format a [BigNumberish](bignumberish)
|
|
||||||
into a string, which is useful when displaying a balance.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Units
|
|
||||||
|
|
||||||
_heading: 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.
|
|
||||||
|
|
||||||
_heading: 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
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Functions
|
|
||||||
|
|
||||||
_heading: Formatting
|
|
||||||
|
|
||||||
_property: ethers.utils.commify(value) => string @<utils-commify> @SRC<units>
|
|
||||||
Returns a string with value grouped by 3 digits, separated by ``,``.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Conversion @<unit-conversion>
|
|
||||||
|
|
||||||
_property: ethers.utils.formatUnits(value [ , unit = "ether" ] ) => string @<utils-formatunits> @SRC<units>
|
|
||||||
Returns a string representation of //value// formatted with //unit//
|
|
||||||
digits (if it is a number) or to the unit specified (if a string).
|
|
||||||
|
|
||||||
_property: ethers.utils.formatEther(value) => string @<utils-formatether> @SRC<units>
|
|
||||||
The equivalent to calling ``formatUnits(value, "ether")``.
|
|
||||||
|
|
||||||
_property: ethers.utils.parseUnits(value [ , unit = "ether" ] ) => [BigNumber](bignumber) @<utils-parseunits> @SRC<units>
|
|
||||||
Returns a [BigNumber](bignumber) representation of //value//, parsed with
|
|
||||||
//unit// digits (if it is a number) or from the unit specified (if
|
|
||||||
a string).
|
|
||||||
|
|
||||||
_property: ethers.utils.parseEther(value) => [BigNumber](bignumber) @<utils-parseether> @SRC<units>
|
|
||||||
The equivalent to calling ``parseUnits(value, "ether")``.
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
_section: Encoding Utilities @<encoding>
|
|
||||||
|
|
||||||
_subsection: Base58 @<bse58> @SRC<basex:Base58>
|
|
||||||
|
|
||||||
_property: ethers.utils.base58.decode(textData) => Uin8Array
|
|
||||||
Return a typed Uint8Array representation of //textData// decoded using
|
|
||||||
base-58 encoding.
|
|
||||||
|
|
||||||
_property: ethers.utils.base58.encode(aBytesLike) => string
|
|
||||||
Return //aBytesLike// encoded as a string using the base-58 encoding.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Base64 @<base64>
|
|
||||||
|
|
||||||
_property: ethers.utils.base64.decode(textData) => Uin8Array @SRC<base64>
|
|
||||||
Return a typed Uint8Array representation of //textData// decoded using
|
|
||||||
base-64 encoding.
|
|
||||||
|
|
||||||
_property: ethers.utils.base64.encode(aBytesLike) => string @SRC<base64>
|
|
||||||
Return //aBytesLike// encoded as a string using the base-64 encoding.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Recursive-Length Prefix @<rlp>
|
|
||||||
|
|
||||||
The [[link-rlp]] encoding is used throughout Ethereum to serialize nested
|
|
||||||
structures of Arrays and data.
|
|
||||||
|
|
||||||
_property: ethers.utils.RLP.encode(dataObject) => string<[[datahexstring]]> @<rlp-encode> @SRC<rlp>
|
|
||||||
Encode a structured Data Object into its RLP-encoded representation.
|
|
||||||
|
|
||||||
Each Data component may be an valid [[byteslike]].
|
|
||||||
|
|
||||||
_property: ethers.utils.RLP.decode(aBytesLike) => [DataObject](rlp-dataobject) @<rlp-decode> @SRC<rlp>
|
|
||||||
Decode an RLP-encoded //aBytesLike// into its structured Data Object.
|
|
||||||
|
|
||||||
All Data components will be returned as a [[datahexstring]].
|
|
||||||
|
|
||||||
_heading: Data Object @<rlp-dataobject>
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
_definition: **Examples**
|
|
||||||
|
|
||||||
- ``"0x1234"``
|
|
||||||
- ``[ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]``
|
|
||||||
@ -1,126 +0,0 @@
|
|||||||
_section: 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.
|
|
||||||
|
|
||||||
_subsection: Creating Instances
|
|
||||||
|
|
||||||
The FixedNumber constructor cannot be called directly. There are several
|
|
||||||
static methods for creating a FixedNumber.
|
|
||||||
|
|
||||||
_property: FixedNumber.from(value [ , format = "fixed" ] ) => [[fixednumber]] @SRC<bignumber:FixedNumber.from>
|
|
||||||
Returns an instance of a **FixedNumber** for //value// as a //format//.
|
|
||||||
|
|
||||||
_property: FixedNumber.fromBytes(aBytesLike [ , format = "fixed" ] ) => [[fixednumber]] @SRC<bignumber>
|
|
||||||
Returns an instance of a **FixedNumber** for //value// as a //format//.
|
|
||||||
|
|
||||||
_property: FixedNumber.fromString(value [ , format = "fixed" ] ) => [[fixednumber]] @SRC<bignumber:FixedNumber.fromString>
|
|
||||||
Returns an instance of a **FixedNumber** for //value// as a //format//. The //value// must
|
|
||||||
not contain more decimals than the //format// permits.
|
|
||||||
|
|
||||||
_property: FixedNumber.fromValue(value [ , decimals = 0 [ , format = "fixed" ] ] ) => [[fixednumber]] @SRC<bignumber:FixedNumber.fromValue>
|
|
||||||
Returns an instance of a **FixedNumber** for //value// with //decimals// as a //format//.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Properties
|
|
||||||
|
|
||||||
_property: fixednumber.format
|
|
||||||
The [FixedFormat](fixedformat) of //fixednumber//.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Methods
|
|
||||||
|
|
||||||
_heading: Math Operations
|
|
||||||
|
|
||||||
_property: fixednumber.addUnsafe(otherValue) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
|
||||||
Returns a new FixedNumber with the value of //fixedvalue// **+** //otherValue//.
|
|
||||||
|
|
||||||
_property: fixednumber.subUnsafe(otherValue) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
|
||||||
Returns a new FixedNumber with the value of //fixedvalue// **–** //otherValue//.
|
|
||||||
|
|
||||||
_property: fixednumber.mulUnsafe(otherValue) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
|
||||||
Returns a new FixedNumber with the value of //fixedvalue// **×** //otherValue//.
|
|
||||||
|
|
||||||
_property: fixednumber.divUnsafe(otherValue) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
|
||||||
Returns a new FixedNumber with the value of //fixedvalue// **÷** //otherValue//.
|
|
||||||
|
|
||||||
_property: fixednumber.round([ decimals = 0 ]) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
|
||||||
Returns a new FixedNumber with the value of //fixedvalue// rounded to //decimals//.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Conversion
|
|
||||||
|
|
||||||
_property: fixednumber.toFormat(format) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
|
||||||
Returns a new FixedNumber with the value of //fixedvalue// with //format//.
|
|
||||||
|
|
||||||
_property: fixednumber.toHexString() => string @SRC<bignumber/fixednumber>
|
|
||||||
Returns a [Hexstring](hexstring) representation of //fixednumber//.
|
|
||||||
|
|
||||||
_property: fixednumber.toString() => string @SRC<bignumber/fixednumber>
|
|
||||||
Returns a string representation of //fixednumber//.
|
|
||||||
|
|
||||||
_property: fixednumber.toUnsafeFloat() => float @SRC<bignumber/fixednumber>
|
|
||||||
Returns a floating-point JavaScript number value of //fixednumber//.
|
|
||||||
Due to rounding in JavaScript numbers, the value is only approximate.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Inspection
|
|
||||||
|
|
||||||
_property: FixedNumber.isFixedNumber(value) => boolean @SRC<bignumber/fixednumber>
|
|
||||||
Returns true if and only if //value// is a **FixedNumber**.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: FixedFormat @<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 [[fixedformatstring]]
|
|
||||||
directly into the [[fixednumber]] will automatically create this.
|
|
||||||
|
|
||||||
_heading: Format Strings @<fixedformatstring>
|
|
||||||
|
|
||||||
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`
|
|
||||||
|
|
||||||
_heading: Creating Instances
|
|
||||||
|
|
||||||
_property: FixedFormat.from(value = "fixed128x18") => [[fixedformat]] @<fixednumber-from> @SRC<bignumber/fixednumber:FixedFormat.from>
|
|
||||||
|
|
||||||
Returns a new instance of a **FixedFormat** defined by //value//. Any valid [[fixedformatstring]]
|
|
||||||
may be passed in as well as any object which has any of ``signed``, ``width`` and ``decimals``
|
|
||||||
defined, including a [[fixedformat]] object.
|
|
||||||
|
|
||||||
_heading: Properties
|
|
||||||
|
|
||||||
_property: fixedFormat.signed => boolean
|
|
||||||
The signed-ness of //fixedFormat//, true if negative values are supported.
|
|
||||||
|
|
||||||
_property: fixedFormat.width => number
|
|
||||||
The width (in bits) of //fixedFormat//.
|
|
||||||
|
|
||||||
_property: fixedFormat.decimals => number
|
|
||||||
The number of decimal points of //fixedFormat//.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_definition: **//"fixed"//**
|
|
||||||
A shorthand for ``fixed128x80``.
|
|
||||||
|
|
||||||
@ -1,69 +0,0 @@
|
|||||||
_section: Hashing Algorithms
|
|
||||||
|
|
||||||
Explain what hash functions are?
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Cryptographic Hashing
|
|
||||||
|
|
||||||
The [Cryptographic Hash Functions](link-wiki-cryptographichash)
|
|
||||||
are a specific family of hash functions.
|
|
||||||
|
|
||||||
_property: ethers.utils.keccak256(aBytesLike) => string<[[datahexstring]]<32>> @<utils-keccak256> @SRC<keccak256>
|
|
||||||
Returns the [KECCAK256](link-wiki-sha3) digest //aBytesLike//.
|
|
||||||
|
|
||||||
_property: ethers.utils.ripemd160(aBytesLike) => string<[[datahexstring]]<20>> @<utils-ripemd160> @SRC<sha2>
|
|
||||||
Returns the [RIPEMD-160](link-wiki-ripemd) digest of //aBytesLike//.
|
|
||||||
|
|
||||||
_property: ethers.utils.sha256(aBytesLike) => string<[[datahexstring]]<32>> @<utils-sha256> @SRC<sha2:function.sha256>
|
|
||||||
Returns the [SHA2-256](link-wiki-sha2) digest of //aBytesLike//.
|
|
||||||
|
|
||||||
_property: ethers.utils.sha512(aBytesLike) => string<[[datahexstring]]<64>> @<utils-sha512> @SRC<sha2:function.sha512>
|
|
||||||
Returns the [SHA2-512](link-wiki-sha2) digest of //aBytesLike//.
|
|
||||||
|
|
||||||
_property: ethers.utils.computeHmac(algorithm, key, data) => string<[[datahexstring]]> @<utils-computehmac> @SRC<sha2>
|
|
||||||
Returns the [HMAC](link-wiki-hmac) of //data// with //key//
|
|
||||||
using the [Algorithm](supported-algorithm) //algorithm//.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: HMAC Supported Algorithms @<supported-algorithm> @SRC<sha2:enum.SupportedAlgorithm>
|
|
||||||
|
|
||||||
_property: ethers.utils.SupportedAlgorithm.sha256 => string
|
|
||||||
Use the [SHA2-256](link-wiki-sha2) hash algorithm.
|
|
||||||
|
|
||||||
_property: ethers.utils.SupportedAlgorithm.sha512 => string
|
|
||||||
Use the [SHA2-512](link-wiki-sha2) hash algorithm.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Common Hashing Helpers
|
|
||||||
|
|
||||||
_property: ethers.utils.hashMessage(message) => string<[[datahexstring]]<32>> @<utils-hashmessage> @SRC<hash>
|
|
||||||
Computes the [[link-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//.
|
|
||||||
|
|
||||||
_property: ethers.utils.id(text) => string<[[datahexstring]]<32>> @<utils-id> @SRC<hash>
|
|
||||||
The Ethereum Identity function computs the [KECCAK256](link-wiki-sha3) hash of the //text// bytes.
|
|
||||||
|
|
||||||
_property: ethers.utils.namehash(name) => string<[[datahexstring]]<32>> @<utils-namehash> @SRC<hash>
|
|
||||||
Returns the [ENS Namehash](link-namehash) of //name//.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: 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.
|
|
||||||
|
|
||||||
_property: ethers.utils.solidityPack(arrayOfTypes, arrayOfValues) => string<[[datahexstring]]> @<utils-soliditypack> @SRC<solidity:pack>
|
|
||||||
Returns the non-standard encoded //arrayOfValues// packed according to
|
|
||||||
their respecive type in //arrayOfTypes//.
|
|
||||||
|
|
||||||
_property: ethers.utils.solidityKeccak256(arrayOfTypes, arrayOfValues) => string<[[datahexstring]]<32>> @<utils-soliditykeccak256> @SRC<solidity:keccak256>
|
|
||||||
Returns the [KECCAK256](link-wiki-sha3) of the non-standard encoded //arrayOfValues// packed
|
|
||||||
according to their respective type in //arrayOfTypes//.
|
|
||||||
|
|
||||||
_property: ethers.utils.soliditySha256(arrayOfTypes, arrayOfValues) => string<[[datahexstring]]<32>> @<utils-soliditysha256> @SRC<solidity:sha256>
|
|
||||||
Returns the [SHA2-256](link-wiki-sha2) of the non-standard encoded //arrayOfValues// packed
|
|
||||||
according to their respective type in //arrayOfTypes//.
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,125 +0,0 @@
|
|||||||
_section: HD Wallet
|
|
||||||
|
|
||||||
TODO: Explain [BIP32](link-bip-32) [BIP-39](link-bip-39) and whatnot here...
|
|
||||||
|
|
||||||
_subsection: Types
|
|
||||||
|
|
||||||
_heading: Constants @<hdnode-defaultpath> @SRC<hdnode:defaultPath>
|
|
||||||
|
|
||||||
_property: ethers.utils.defaultPath => "m/44'/60'/0'/0/0"
|
|
||||||
The default path for Ethereum in an HD Wallet
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Mnemonic @<hdnode-mnemonic>
|
|
||||||
|
|
||||||
_property: 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``.
|
|
||||||
|
|
||||||
_property: mnemonic.path => string
|
|
||||||
The HD path for this mnemonic.
|
|
||||||
|
|
||||||
_property: mnemonic.locale => string
|
|
||||||
The language of the wordlist this mnemonic is using.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: HDNode @<hdnode> @SRC<hdnode:class.HDNode>
|
|
||||||
|
|
||||||
_heading: Creating Instances
|
|
||||||
|
|
||||||
_property: ethers.HDNode.fromMnemonic(phrase [, password [, wordlist ] ]) => [[hdnode]] @SRC<hdnode>
|
|
||||||
Return the [[hdnode]] for //phrase// with the optional //password//
|
|
||||||
and //wordlist//.
|
|
||||||
|
|
||||||
_property: ethers.HDNode.fromSeed(aBytesLike) => [[hdnode]] @SRC<hdnode>
|
|
||||||
Return the [[hdnode]] for the seed //aBytesLike//.
|
|
||||||
|
|
||||||
_property: ethers.HDNode.fromExtendedKey(extendedKey) => [[hdnode]] @SRC<hdnode>
|
|
||||||
Return the [[hdnode]] for the //extendedKey//. If //extendedKey// was
|
|
||||||
neutered, the **HDNode** will only be able to compute addresses and not
|
|
||||||
private keys.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Properties
|
|
||||||
|
|
||||||
_property: hdNode.privateKey => string<[[datahexstring]]<32>>
|
|
||||||
The private key for this HDNode.
|
|
||||||
|
|
||||||
_property: hdNode.publicKey => string<[[datahexstring]]<33>>
|
|
||||||
The (compresses) public key for this HDNode.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: hdNode.parentFingerprint => string<[[datahexstring]]<4>>
|
|
||||||
The fingerprint of the parent node. See //fingerprint// for more
|
|
||||||
details.
|
|
||||||
|
|
||||||
Most developers will not need to use this.
|
|
||||||
|
|
||||||
_property: hdNode.address => string<[[address]]>
|
|
||||||
The address of this HDNode.
|
|
||||||
|
|
||||||
_property: hdNode.mnemonic => [[hdnode-mnemonic]]
|
|
||||||
The mnemonic of this HDNode, if known.
|
|
||||||
|
|
||||||
_property: hdNode.path => string
|
|
||||||
The path of this HDNode, if known. If the //mnemonic// is also known,
|
|
||||||
this will match ``mnemonic.path``.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Methods
|
|
||||||
|
|
||||||
_property: hdNode.neuter() => [[hdnode]] @SRC<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.
|
|
||||||
|
|
||||||
_property: hdNode.derivePath(path) => [[hdnode]] @SRC<hdnode>
|
|
||||||
Return a new [[hdnode]] which is the child of //hdNode// found
|
|
||||||
by deriving //path//.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Other Functions
|
|
||||||
|
|
||||||
_property: ethers.utils.mnemonicToSeed(phrase [ , password]) => string<[[datahexstring]]<64>> @SRC<hdnode>
|
|
||||||
Convert a mnemonic phrase to a seed, according to [BIP-39](link-bip-39).
|
|
||||||
|
|
||||||
_property: ethers.utils.mnemonicToEntropy(phrase [ , wordlist ]) => string<[[datahexstring]]> @SRC<hdnode>
|
|
||||||
Convert a mnemonic phrase to its entropy, according to [BIP-39](link-bip-39).
|
|
||||||
|
|
||||||
_property: ethers.utils.isValidMnemonic(phrase [ , wordlist ]) => boolean @SRC<hdnode>
|
|
||||||
Returns true if //phrase// is a valid mnemonic phrase, by
|
|
||||||
testing the checksum.
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
_section: Utilities
|
|
||||||
|
|
||||||
These utilities are used extensively within the library, but
|
|
||||||
are also quite useful for application developers.
|
|
||||||
|
|
||||||
_toc:
|
|
||||||
abi
|
|
||||||
address
|
|
||||||
bignumber
|
|
||||||
bytes
|
|
||||||
constants
|
|
||||||
display-logic
|
|
||||||
encoding
|
|
||||||
fixednumber
|
|
||||||
hashing
|
|
||||||
hdnode
|
|
||||||
logger
|
|
||||||
properties
|
|
||||||
signing-key
|
|
||||||
strings
|
|
||||||
transactions
|
|
||||||
web
|
|
||||||
wordlists
|
|
||||||
@ -1,208 +0,0 @@
|
|||||||
_section: 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](logger-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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Logger @<logger> @SRC<logger:class.Logger>
|
|
||||||
|
|
||||||
_property: new ethers.utils.Logger(version) @SRC<logger:constructor.Logger>
|
|
||||||
Create a new logger which will include //version// in all errors thrown.
|
|
||||||
|
|
||||||
_property: Logger.globalLogger() => [[logger]] @SRC<logger>
|
|
||||||
Returns the singleton global logger.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Logging Output
|
|
||||||
|
|
||||||
_property: logger.debug(...args) => void @SRC<logger>
|
|
||||||
Log debugging information.
|
|
||||||
|
|
||||||
_property: logger.info(...args) => void @SRC<logger>
|
|
||||||
Log generic information.
|
|
||||||
|
|
||||||
_property: logger.warn(...args) => void @SRC<logger>
|
|
||||||
Log warnings.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Errors
|
|
||||||
|
|
||||||
These functions honor the current [Censorship](logger-censorship) and help create
|
|
||||||
a standard error model for detecting and processing errors within Ethers.
|
|
||||||
|
|
||||||
_property: logger.makeError(message [ , code = UNKNOWN_ERROR [ , params ] ]) => Error @SRC<logger>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: logger.throwError(message [ , code = UNKNOWN_ERROR [ , params ] ]) => never @SRC<logger>
|
|
||||||
Throw an Error with //message// and an optional //code// and
|
|
||||||
additional //params// set.
|
|
||||||
|
|
||||||
_property: logger.throwArgumentError(message, name, value) => never @SRC<logger>
|
|
||||||
Throw an [INVALID_ARGUMENT](error-invalidargument) Error with //name// and //value//.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Usage Validation
|
|
||||||
|
|
||||||
There can be used to ensure various properties and actions are safe.
|
|
||||||
|
|
||||||
_property: logger.checkAbstract(target, kind) => void @SRC<logger>
|
|
||||||
Checks that //target// is not //kind// and performs the same operatons
|
|
||||||
as ``checkNew``. This is useful for ensuring abstract classes are not
|
|
||||||
being instantiated.
|
|
||||||
|
|
||||||
_property: logger.checkArgumentCount(count, expectedCound [ , message) => void @SRC<logger>
|
|
||||||
If //count// is not equal to //expectedCount//, throws a [MISSING_ARGUMENT](error-missingargument)
|
|
||||||
or [UNEXPECTED_ARGUMENT](error-unexpectedargument) error.
|
|
||||||
|
|
||||||
_property: logger.checkNew(target, kind) => void @SRC<logger>
|
|
||||||
If //target// is not a valid ``this`` or ``target`` value, throw a
|
|
||||||
[MISSING_NEW](error-missingnew) error. This is useful to ensure
|
|
||||||
callers of a Class are using ``new``.
|
|
||||||
|
|
||||||
_property: logger.checkNormalize(message) => void @SRC<logger>
|
|
||||||
Check that the environment has a correctly functioning [[link-js-normalize]]. If not, a
|
|
||||||
[UNSUPPORTED_OPERATION](error-unsupported) error is thrown.
|
|
||||||
|
|
||||||
_property: logger.checkSafeUint53(value [, message ]) => void @SRC<logger>
|
|
||||||
If //value// is not safe as a [JavaScript number](link-wiki-ieee754), throws a
|
|
||||||
[NUMERIC_FAULT](error-numericfault) error.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Censorship @<logger-censorship>
|
|
||||||
|
|
||||||
_property: Logger.setCensorship(censor [ , permanent = false ]) => void @SRC<logger>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: Logger.setLogLevel(logLevel) => void @SRC<logger>
|
|
||||||
Set the log level, to suppress logging output below a [particular log level](logger-levels).
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Errors @<errors>
|
|
||||||
|
|
||||||
Every error in Ethers has a ``code`` value, which is a string that will
|
|
||||||
match one of the following error codes.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Generic Error Codes
|
|
||||||
|
|
||||||
_property: Logger.errors.NOT_IMPLEMENTED
|
|
||||||
The operation is not implemented.
|
|
||||||
|
|
||||||
_property: Logger.errors.SERVER_ERROR
|
|
||||||
There was an error communicating with a server.
|
|
||||||
|
|
||||||
_property: Logger.errors.TIMEOUT @<error-timeout>
|
|
||||||
A timeout occurred.
|
|
||||||
|
|
||||||
_property: Logger.errors.UNKNOWN_ERROR @<error-unknown>
|
|
||||||
A generic unknown error.
|
|
||||||
|
|
||||||
_property: Logger.errors.UNSUPPORTED_OPERATION @<error-unsupported>
|
|
||||||
The operation is not supported.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Safety Error Codes
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: Logger.errors.NUMERIC_FAULT @<error-numericfault>
|
|
||||||
There was an invalid operation done on numeric values.
|
|
||||||
|
|
||||||
Common cases of this occur when there is [[link-wiki-overflow]],
|
|
||||||
[[link-wiki-underflow]] in fixed numeric types or division by zero.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Usage Error Codes
|
|
||||||
|
|
||||||
_property: Logger.errors.INVALID_ARGUMENT @<error-invalidargument>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: Logger.errors.MISSING_ARGUMENT @<error-missingargument>
|
|
||||||
An expected parameter was not specified.
|
|
||||||
|
|
||||||
_property: Logger.errors.MISSING_NEW @<error-missingnew>
|
|
||||||
An object is a Class, but is now being called with ``new``.
|
|
||||||
|
|
||||||
_property: Logger.errors.UNEXPECTED_ARGUMENT @<error-unexpectedargument>
|
|
||||||
Too many parameters we passed into a function.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Ethereum Error Codes
|
|
||||||
|
|
||||||
_property: Logger.errors.CALL_EXCEPTION
|
|
||||||
An attempt to call a blockchain contract (getter) resulted in a
|
|
||||||
revert or other error.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: Logger.errors.NETWORK_ERROR
|
|
||||||
An Ethereum network validation error, such as an invalid chain ID.
|
|
||||||
|
|
||||||
_property: Logger.errors.NONCE_EXPIRED
|
|
||||||
The nonce being specified has already been used in a mined transaction.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Log Levels @<logger-levels>
|
|
||||||
|
|
||||||
_property: Logger.levels.DEBUG
|
|
||||||
Log all output, including debugging information.
|
|
||||||
|
|
||||||
_property: Logger.levels.INFO
|
|
||||||
Only log output for infomational, warnings and errors.
|
|
||||||
|
|
||||||
_property: Logger.levels.WARNING
|
|
||||||
Only log output for warnings and errors.
|
|
||||||
|
|
||||||
_property: Logger.levels.ERROR
|
|
||||||
Only log output for errors.
|
|
||||||
|
|
||||||
_property: Logger.levels.OFF
|
|
||||||
Do not output any logs.
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
_section: Property Utilities
|
|
||||||
|
|
||||||
_property: ethers.utils.checkPropertoes() => void
|
|
||||||
|
|
||||||
_property: ethers.utils.deepCopy(anObject) => any
|
|
||||||
_property: ethers.utils.defineReadOnly(anObject, name, value) => void
|
|
||||||
_property: ethers.utils.getStatic(aConstructor, key) => any
|
|
||||||
_property: ethers.utils.resolveProperties(anObject) => Promise<any> @<utils-resolveproperties> @SRC<properties>
|
|
||||||
_property: ethers.utils.shallowCopy(anObject) => any
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
_section: Signing Key @<utils-signingkey>
|
|
||||||
|
|
||||||
_property: new ethers.utils.SigningKey(privateKey)
|
|
||||||
Create a new SigningKey for //privateKey//.
|
|
||||||
|
|
||||||
_property: signingKey.privateKey => string<[[datahexstring]]<32>>
|
|
||||||
The private key for this Signing Key.
|
|
||||||
|
|
||||||
_property: 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``.
|
|
||||||
|
|
||||||
_property: 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``.
|
|
||||||
|
|
||||||
_property: signingKey.signDisgest(digest) => [[signature]]
|
|
||||||
Sign the //digest// and return the signature.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: SigningKey.isSigningKey(anObject) => boolean
|
|
||||||
Returns true if //anObject// is a SigningKey.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Other Functions
|
|
||||||
|
|
||||||
_property: ethers.utils.verifyMessage(message, signature) => string<[[address]]> @<utils-verifymessage> @SRC<wallet>
|
|
||||||
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](link-eip-155))
|
|
||||||
to be used since the v parameter is still completely non-ambiguous.
|
|
||||||
|
|
||||||
_property: ethers.utils.recocverPublicKey(digest, signature) => string<[[datahexstring]]<65>> @<utils-recoverpublickey>
|
|
||||||
|
|
||||||
_property: ethers.utils.computePublicKey(key [, compressed = false ]) => string<[[datahexstring]]> @<utils-computepublickey>
|
|
||||||
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.
|
|
||||||
@ -1,182 +0,0 @@
|
|||||||
_section: Strings
|
|
||||||
|
|
||||||
Tra la la
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Bytes32String @<bytes32-string>
|
|
||||||
|
|
||||||
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: Note
|
|
||||||
Strings that are 31 __//bytes//__ long may contain fewer than 31 __//characters//__,
|
|
||||||
since UTF-8 requires multiple bytes to encode international characters.
|
|
||||||
|
|
||||||
_property: ethers.utils.parseBytes32String(aBytesLike) => string @<utils-parsebytes32> @SRC<strings>
|
|
||||||
Returns the decoded string represented by the ``Bytes32`` encoded data.
|
|
||||||
|
|
||||||
_property: ethers.utils.formatBytes32String(text) => string<[[datahexstring]]<32>> @<utils-formatbytes32> @SRC<strings>
|
|
||||||
Returns a ``bytes32`` string representation of //text//. If the
|
|
||||||
length of //text// exceeds 31 bytes, it will throw an error.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: UTF-8 Strings @<utf8-string>
|
|
||||||
|
|
||||||
_property: ethers.utils.toUtf8Bytes(text [ , form = current ] ) => Uint8Array @<utils-toutf8bytes> @SRC<strings>
|
|
||||||
Returns the UTF-8 bytes of //text//, optionally normalizing it using the
|
|
||||||
[[unicode-normalization-form]] //form//.
|
|
||||||
|
|
||||||
_property: ethers.utils.toUtf8CodePoints(text [ , form = current ] ) => Array<number> @<utils-toutf8codepoints> @SRC<strings>
|
|
||||||
Returns the Array of codepoints of //text//, optionally normalized using the
|
|
||||||
[[unicode-normalization-form]] //form//.
|
|
||||||
|
|
||||||
_note: 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.
|
|
||||||
|
|
||||||
_property: ethers.utils.toUtf8String(aBytesLike [ , onError = error ] ) => string @<utils-toutf8string> @SRC<strings>
|
|
||||||
Returns the string represented by the UTF-8 bytes of //aBytesLike//.
|
|
||||||
|
|
||||||
The //onError// is a [Custom UTF-8 Error function](utf8error) and if not specified
|
|
||||||
it defaults to the [error](utf8error-error) function, which throws an error
|
|
||||||
on **any** UTF-8 error.
|
|
||||||
|
|
||||||
_subsection: UnicodeNormalizationForm @<unicode-normalization-form> @SRC<strings/utf8:enum.UnicodeNormalizationForm>
|
|
||||||
|
|
||||||
There are several [commonly used forms](link-wiki-unicode-equivalence)
|
|
||||||
when normalizing UTF-8 data, which allow strings to be compared or hashed in a stable
|
|
||||||
way.
|
|
||||||
|
|
||||||
_property: ethers.utils.UnicodeNormalizationForm.current
|
|
||||||
Maintain the current normalization form.
|
|
||||||
|
|
||||||
_property: 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``.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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"``.
|
|
||||||
|
|
||||||
_property: ethers.utils.UnicodeNormalizationForm.NFKD
|
|
||||||
The Decomposed Normalization Form with Canonical Equivalence.
|
|
||||||
See NFKC for more an example.
|
|
||||||
|
|
||||||
_note: 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](link-wiki-homoglyph).
|
|
||||||
|
|
||||||
_subsection: Custom UTF-8 Error Handling @<utf8error>
|
|
||||||
|
|
||||||
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:
|
|
||||||
|
|
||||||
_property: errorFunction(reason, offset, bytes, output [ , badCodepoint ]) => number
|
|
||||||
The //reason// is one of the [UTF-8 Error Reasons](utf8error-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.
|
|
||||||
|
|
||||||
_heading: UTF-8 Error Reasons @<utf8error-reasons> @SRC<strings/utf8:Utf8ErrorReason>
|
|
||||||
|
|
||||||
_property: ethers.utils.Utf8ErrorReason.BAD_PREFIX
|
|
||||||
A byte was encountered which is invalid to begin a UTF-8 byte
|
|
||||||
sequence with.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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](link-wiki-utf8-overlong)
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: ethers.utils.Utf8ErrorReason.OVERRUN
|
|
||||||
The string does not have enough characters remaining for the
|
|
||||||
length of this sequence.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Provided UTF-8 Error Handling Functions
|
|
||||||
|
|
||||||
There are already several functions available for the most common
|
|
||||||
situations.
|
|
||||||
|
|
||||||
_property: ethers.utils.Utf8ErrorFuncs.error @<utf8error-error> @SRC<strings/utf8:errorFunc>
|
|
||||||
The will throw an error on **any** error with a UTF-8 sequence, including
|
|
||||||
invalid prefix bytes, overlong sequences, UTF-16 surrogate pairs.
|
|
||||||
|
|
||||||
_property: ethers.utils.Utf8ErrorFuncs.ignore @<utf8error-ignore> @SRC<strings/utf8:ignoreFunc>
|
|
||||||
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.
|
|
||||||
|
|
||||||
_property: ethers.utils.Utf8ErrorFuncs.replace @<utf8error-replace> @SRC<strings/utf8:replaceFunc>
|
|
||||||
This will replace all invalid sequences (by consuming invalid prefix bytes and
|
|
||||||
any following continuation bytes) with the
|
|
||||||
[UTF-8 Replacement Character](link-wiki-utf8-replacement),
|
|
||||||
(i.e. U+FFFD).
|
|
||||||
@ -1,126 +0,0 @@
|
|||||||
_section: Transactions @<utils-transactions>
|
|
||||||
|
|
||||||
_subsection: Types
|
|
||||||
|
|
||||||
_heading: UnsignedTransaction @<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.
|
|
||||||
|
|
||||||
_property: unsignedTransaction.to => string<[Address](address)>
|
|
||||||
The addres this transaction is to.
|
|
||||||
|
|
||||||
_property: unsignedTransaction.nonce => number
|
|
||||||
The nonce of this transaction.
|
|
||||||
|
|
||||||
_property: unsignedTransaction.gasLimit => [[bignumberish]]
|
|
||||||
The gas limit for this transaction.
|
|
||||||
|
|
||||||
_property: unsignedTransaction.gasPrice => [[bignumberish]]
|
|
||||||
The gas price for this transaction.
|
|
||||||
|
|
||||||
_property: unsignedTransaction.data => [[byteslike]]
|
|
||||||
The data for this transaction.
|
|
||||||
|
|
||||||
_property: unsignedTransaction.value => [[bignumberish]]
|
|
||||||
The value (in wei) for this transaction.
|
|
||||||
|
|
||||||
_property: unsignedTransaction.chainId => number
|
|
||||||
The chain ID for this transaction. If the chain ID is 0 or null,
|
|
||||||
then [[link-eip-155]] is disabled and legacy signing is
|
|
||||||
used, unless overridden in a signature.
|
|
||||||
|
|
||||||
|
|
||||||
_heading: Transaction @<types-transaction>
|
|
||||||
A generic object to represent a transaction.
|
|
||||||
|
|
||||||
_property: 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//.
|
|
||||||
|
|
||||||
_property: unsignedTransaction.to => string<[Address](address)>
|
|
||||||
The address //transaction// is to.
|
|
||||||
|
|
||||||
_property: transaction.from => string<[Address](address)>
|
|
||||||
The address //transaction// is from.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: 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.
|
|
||||||
|
|
||||||
_property: transaction.gasPrice => [[bignumber]]
|
|
||||||
The price (in wei) per unit of gas for //transaction//.
|
|
||||||
|
|
||||||
_property: transaction.data => [[byteslike]]
|
|
||||||
The data for //transaction//. In a contract this is the call data.
|
|
||||||
|
|
||||||
_property: transaction.value => [[bignumber]]
|
|
||||||
The value (in wei) for //transaction//.
|
|
||||||
|
|
||||||
_property: transaction.chainId => number
|
|
||||||
The chain ID for //transaction//. This is used as part of
|
|
||||||
[[link-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.
|
|
||||||
|
|
||||||
_property: 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).
|
|
||||||
|
|
||||||
_property: transaction.s => string<[[datahexstring]]<32>>
|
|
||||||
The s portion of the elliptic curve signatures for //transaction//.
|
|
||||||
|
|
||||||
_property: 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 [[link-eip-155]] is additionally
|
|
||||||
used to encode the chain ID into the serialized transaction.
|
|
||||||
|
|
||||||
|
|
||||||
_subsection: Functions
|
|
||||||
|
|
||||||
_property: ethers.utils.computeAddress(publicOrPrivateKey) => string<[Address](address)> @<utils-computeaddress> @SRC<transactions>
|
|
||||||
Compute the address of //publicOrPrivateKey//. If a public key is
|
|
||||||
provided, it may be either compressed or uncompressed.
|
|
||||||
|
|
||||||
_property: ethers.utils.parse(aBytesLike) => [[types-transaction]] @<utils-parse> @SRC<transactions>
|
|
||||||
Parses the transaction properties from a serialized transactions.
|
|
||||||
|
|
||||||
_property: ethers.utils.recoverAddress(digest, aSignatureLike) => string<[Address](address)> @<utils-recoveraddress> @SRC<transactions>
|
|
||||||
Computes the address that signed //digest// to get //aSignatureLike// using the
|
|
||||||
ecrecover algorithm.
|
|
||||||
|
|
||||||
_property: ethers.utils.serialize(transaction [ , signature ]) => string<[[datahexstring]]> @<utils-serialize> @SRC<transactions>
|
|
||||||
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 [[link-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
|
|
||||||
[[link-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.
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user