Compare commits

...

112 Commits

Author SHA1 Message Date
Richard Moore
798cafa6fe Added all test environments back to CI. 2020-04-16 21:33:50 -04:00
Richard Moore
cc72f76695 Added support for Contract event parsing error recovery. 2020-04-16 21:33:24 -04:00
Richard Moore
4ef0e4f765 Fix provider log filters with zero topics (#785). 2020-04-16 21:30:35 -04:00
Richard Moore
51e198aee1 Attempting to fix ESM chrome-upgrade task. 2020-04-15 19:28:50 -04:00
Richard Moore
54dfaacba3 Updated dist files. 2020-04-15 18:28:04 -04:00
Richard Moore
797abb7267 Temporarily remove CloudflareProvider tests; it is down and breaking the tests. 2020-04-15 18:11:39 -04:00
Richard Moore
39c78f37ce Fixed Contract filter never unsubscribing. 2020-04-15 18:09:38 -04:00
Richard Moore
284771ea39 Updated ABI Number coder for BigNumber API change. 2020-04-15 16:49:55 -04:00
Richard Moore
7dcefcbf71 Better error reporting for Fragments. 2020-04-15 16:49:03 -04:00
Richard Moore
2eb3823de4 Fixed early Contract filter unsubscribing. 2020-04-15 16:47:55 -04:00
Richard Moore
69f707762e Fixed WebSocketProvider filter events (#784). 2020-04-15 16:46:15 -04:00
Richard Moore
7498c18235 Added bitwise operations to BigNumber (#781). 2020-04-15 15:39:26 -04:00
Richard Moore
220e0710a9 Fixed typo in changelog. 2020-04-03 22:16:39 -04:00
Richard Moore
40fb8b5b5c Updated dist files. 2020-04-03 22:13:06 -04:00
Richard Moore
8ad26f0ff4 Removed transactionLogIndex from tests (#415). 2020-04-03 22:03:51 -04:00
Richard Moore
d7c8b355a0 Fix stateMutability calculation for constructors (#762). 2020-04-03 22:01:33 -04:00
Richard Moore
6caf7c292c Correctly return the Provider in NonceManager. 2020-04-03 21:33:56 -04:00
Richard Moore
2882546351 Fail earlier when resolving an ENS name that is not a string. 2020-04-03 21:32:44 -04:00
Richard Moore
6526de016f Fixed mutabilityState calculation for function fragments (#762). 2020-04-03 21:28:53 -04:00
Richard Moore
da412f6607 Force Log properties to be non-optional (#415). 2020-04-03 20:45:23 -04:00
Richard Moore
053a2d7fcd Fixed Signer call not forwarding blockTag (#768). 2020-04-03 18:41:24 -04:00
Richard Moore
a656079752 Updated dist files. 2020-03-31 23:40:54 -04:00
Richard Moore
0f144c6cc0 Fixed ENS CLI lookup for Website. 2020-03-31 23:33:13 -04:00
Richard Moore
6c71b51512 Fixed getEtherPrice for EtherscanProvider (#776). 2020-03-31 23:17:10 -04:00
Richard Moore
70cffb6a51 Fixed ENS CLI tool set-websites and added set-name. 2020-03-31 23:16:16 -04:00
Richard Moore
ee647d26e3 Updated dist files. 2020-03-30 22:26:03 -04:00
Richard Moore
092ce9bcc2 Fixed Contract events for immutable Result. 2020-03-30 22:08:55 -04:00
Richard Moore
75abc0e5f6 Updated dist files. 2020-03-30 17:24:33 -04:00
Richard Moore
2692e783b4 Fixed Event args keyword access. 2020-03-30 15:11:23 -04:00
Richard Moore
bd32ee0af5 Updating TypeScript library and fixing some audit issues. 2020-03-22 14:57:17 -04:00
Richard Moore
62aad5f8f3 Updated dist files. 2020-03-21 12:48:22 -04:00
Richard Moore
030f65e66c Abstracted JSON-RPC parameter generation for others to use. 2020-03-17 14:00:13 -04:00
Richard Moore
390497f389 Updated RLP package to use Logger instead of bare errors. 2020-03-17 13:58:49 -04:00
Richard Moore
72c89922a4 Fixed log level filtering for Logger (#379). 2020-03-17 13:57:53 -04:00
Richard Moore
9ea16e5172 Throw errors when trying to RLP encode integers. 2020-03-17 13:55:45 -04:00
Richard Moore
3e44aac8f1 Added delays to provider tests to prevent throttling causing failed tests. 2020-03-13 16:19:48 +01:00
Richard Moore
d2c9214889 Update dist files. 2020-03-12 19:14:50 +01:00
Richard Moore
2c78f0bf26 Checking in initial Eip1193Bridge (experimental). 2020-03-12 19:04:15 +01:00
Richard Moore
117a5dd7ff Added initial WebSocketProvider (#141). 2020-03-12 18:53:34 +01:00
Richard Moore
fe3b3fa1ad Renamed properties based on community recommendations; estimate to estimateGas and addressPromise to resovledAddress. 2020-03-10 19:02:53 +01:00
Richard Moore
e52312e783 Better error reporting and fixed look-ahead for data labels. 2020-03-10 19:01:59 +01:00
Richard Moore
7d34f73769 Updated dist files. 2020-02-27 19:58:05 +00:00
Richard Moore
6809c370c0 Fixed syncScrypt declaration and use for json-wallets. 2020-02-27 19:49:05 +00:00
Richard Moore
64dccb275c Fix address-less filter listening in Provider (#741). 2020-02-27 19:29:02 +00:00
Richard Moore
0ad94cdf81 Added sync version of wallet decryption. 2020-02-27 18:42:59 +00:00
Richard Moore
2ac8c0276d Updated dist files. 2020-02-26 10:06:48 +00:00
Richard Moore
1a32990c81 Updating some packages that audit complains about (dev deps only). 2020-02-26 09:48:12 +00:00
Richard Moore
8f25e6ab5d Updated docs. 2020-02-25 14:57:11 -05:00
Richard Moore
1cfab3173c Reduced default Provider quorum for testnets. 2020-02-25 14:52:10 -05:00
Richard Moore
ad27600c69 Added JSON-RPC debugging on error responses. 2020-02-25 14:51:32 -05:00
Richard Moore
ac51a88c29 Fixed setLogLevel to affect global logging. 2020-02-25 14:51:04 -05:00
Richard Moore
f61f34bfb2 Renamed interface getTopic to getEventTopic. 2020-02-25 14:50:35 -05:00
Richard Moore
a5d2ec534f Fix log parsing when no matching topic hash is found (#733). 2020-02-25 13:51:51 -05:00
Richard Moore
4b8e198bf2 Fix log parsing when no matching topic is found (#733). 2020-02-25 13:51:33 -05:00
Wighawag
89ac9f4f29 parse log on tx confirmation should not fail 2020-02-20 15:21:35 +00:00
Ronan Sandford
908a33d190 Merge pull request #6 from ethers-io/ethers-v5-beta
Ethers v5 beta
2020-02-20 15:02:47 +00:00
Richard Moore
8c164ab3d0 Updated dist files. 2020-02-17 20:22:33 -05:00
Richard Moore
94db5dbdcf Remove dead code. 2020-02-17 18:15:03 -05:00
Richard Moore
311af88cfa Added default EtherscanProvider key. 2020-02-17 18:14:02 -05:00
Richard Moore
2fdf995e8a Updated generated documentaiton. 2020-02-17 17:56:50 -05:00
Richard Moore
067d96062a Updated documentation source. 2020-02-17 17:56:13 -05:00
Richard Moore
f9c1a24787 Increase UMD karma test timeout (for CI). 2020-02-13 16:23:53 -05:00
Richard Moore
6628b58561 Updated reporter to force output for CI. 2020-02-13 15:27:56 -05:00
Richard Moore
027467ad86 Updated dist files (for CI). 2020-02-12 18:21:51 -05:00
Richard Moore
6f2e9a7941 Reduce number of HDNode testcases so CI does not timeout. 2020-02-12 18:18:12 -05:00
Richard Moore
0e1cd4282d Added automatic createRelease to publish-all. 2020-02-12 17:18:43 -05:00
Richard Moore
ca25c2f13d Updated changelog. 2020-02-12 17:12:25 -05:00
Richard Moore
ab5ebd04c3 Updated dist files (for CI). 2020-02-12 15:55:09 -05:00
Richard Moore
133291e9ba Fix for node 8.x solc tests. 2020-02-12 15:00:18 -05:00
Richard Moore
fa25e61f77 Updates dist files (for CI). 2020-02-12 14:39:03 -05:00
Richard Moore
ec198fdb93 Set contract testcase timeout to daemon timer. 2020-02-12 14:33:39 -05:00
Richard Moore
afa54e356a Prevent failed event testcase from stalling node. 2020-02-10 16:51:42 -05:00
Richard Moore
c75bc3daa0 Updated testcase balance value. 2020-02-10 16:38:40 -05:00
Richard Moore
90959c679e Added libudev to CircleCI. 2020-02-10 16:13:39 -05:00
Richard Moore
88765d55cc Adding libusb to CircleCI. 2020-02-10 16:09:13 -05:00
Richard Moore
f259f9815d Updated dist files. 2020-02-10 15:51:58 -05:00
Richard Moore
944600d779 Added experimental EipWrappedProvider. 2020-02-10 15:40:55 -05:00
Richard Moore
b962b59ab7 Updated signature for JsonRpcProvider.send to match EIP-1193. 2020-02-10 15:39:38 -05:00
Richard Moore
375bd15594 Added binary literal support to ASM grammar. 2020-02-10 14:37:24 -05:00
Richard Moore
f9ab665b52 Updated dist files. 2020-02-06 18:21:34 -05:00
Richard Moore
a6b696d8bd Added explicit pop placeholders to ASM dialect. 2020-02-06 18:07:17 -05:00
Richard Moore
89615c59d3 Added position independent code option for asm. 2020-02-06 03:30:31 -05:00
Richard Moore
a33bf0e37f Added ASM semantic checking and the Pop placeholder. 2020-02-05 21:55:26 -05:00
Richard Moore
e7adc84a97 Better type safety for defineReadOnly. 2020-02-04 08:01:26 -05:00
Richard Moore
ff9bc2a282 Fixed CLI sandbox quiting after prompt entry. 2020-02-04 07:10:06 -05:00
Richard Moore
b29510e363 Updated dist files. 2020-02-04 01:06:47 -05:00
Richard Moore
13dbf1f965 Synced GitHub issue cache. 2020-02-04 00:54:36 -05:00
Richard Moore
5622f703d9 Better typing for Timers. 2020-02-04 00:50:27 -05:00
Richard Moore
edb7c5da91 Safer transaction serialization, matching signature.v with chainId (#708). 2020-02-04 00:48:45 -05:00
Richard Moore
15bb840907 Fixed Opcode typo and added check to prevent future typos. 2020-02-03 23:10:11 -05:00
Richard Moore
f02c7db410 Renamed AST nodes for teh assembler. 2020-02-03 23:09:32 -05:00
Richard Moore
bacc440397 Added timeout to waitForTransaction (#477). 2020-02-03 23:05:04 -05:00
Richard Moore
8eb0190d5e Updated docs to use external links. 2020-02-02 07:58:29 -05:00
Richard Moore
acd601e7e7 Updated docs output. 2020-02-02 00:53:22 -05:00
Richard Moore
05bfe21caf Updated documentation. 2020-02-02 00:52:20 -05:00
Richard Moore
aafa42a32b Added CLI for asm package. 2020-02-01 04:37:20 -05:00
Richard Moore
1c85fe95b2 Added more flatworm documentation. 2020-02-01 03:39:21 -05:00
Richard Moore
1decb13799 Prevent Signer.checkTransaction from creating conflicting from properties. 2020-02-01 03:38:19 -05:00
Richard Moore
ba29618896 Include asm in generated TypeScript dependencies. 2020-02-01 03:37:02 -05:00
Richard Moore
fa317ebc03 Clean up some asm checks and dead code. 2020-01-30 21:47:52 -05:00
Richard Moore
da8153c877 More contained Opcode API. 2020-01-30 21:41:03 -05:00
Richard Moore
0296594aba Added initial codedrop for the asm package. 2020-01-30 21:26:46 -05:00
Richard Moore
bee5944567 Updated dist files. 2020-01-29 21:43:56 -05:00
Richard Moore
7428776f75 Better solc support in CLI; it will search the local pacakge for an existing solc version. 2020-01-29 21:36:50 -05:00
Richard Moore
edb49da155 Update ENS registry address and lower default quorum for testnets. 2020-01-29 21:34:24 -05:00
Richard Moore
99329b013c Exposed isBytes and isBytesLike in ethers.utils. 2020-01-29 21:32:34 -05:00
Richard Moore
c11e7c348e Updated dist files. 2020-01-21 20:37:22 -05:00
Richard Moore
e0d1d3866d Better, easier and more provider testing. 2020-01-21 20:16:48 -05:00
Richard Moore
f92d156f17 Updated dist files. 2020-01-21 19:08:05 -05:00
Ronan Sandford
792afabdc0 Merge pull request #4 from ethers-io/ethers-v5-beta
Ethers v5 beta
2020-01-13 08:44:01 +05:30
Ronan Sandford
9b65111fc6 Merge pull request #3 from ethers-io/ethers-v5-beta
Ethers v5 beta
2019-09-25 12:06:02 +01:00
Ronan Sandford
8d27286be1 Merge pull request #2 from ethers-io/ethers-v5-beta
Ethers v5 beta Update
2019-09-07 04:36:31 -03:00
641 changed files with 31596 additions and 7552 deletions

View File

@@ -29,57 +29,56 @@ commands:
command: |
sudo apt-get purge chromium-browser
sudo apt-get update
sudo apt-get install -y libappindicator1 fonts-liberation
sudo apt-get install -y libappindicator1 fonts-liberation libgbm1
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 gcc version
name: Update C build environment
command: |
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-6
sudo apt install g++-6
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: 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: 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: 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 >>

View File

@@ -3,6 +3,127 @@ Changelog
This change log is managed by `scripts/cmds/update-versions` but may be manually updated.
ethers/v5.0.0-beta.181 (2020-04-15 18:23)
-----------------------------------------
- Temporarily remove CloudflareProvider tests; it is down and breaking the tests. ([797abb7](https://github.com/ethers-io/ethers.js/commit/797abb726711499d96bf1c12c61e3bb1a7b4925d))
- Better error reporting for Fragments. ([7dcefcb](https://github.com/ethers-io/ethers.js/commit/7dcefcbf71ef337103639bbe3f4ad2625565651a))
- Fixed Contract filter unsubscribing. ([2eb3823](https://github.com/ethers-io/ethers.js/commit/2eb3823de4ba111cc0c746a0715fe6dd3d1b16da), [39c78f3](https://github.com/ethers-io/ethers.js/commit/39c78f37ceff9b8ec08329903dcba7bd53bd8661))
- Fixed WebSocketProvider filter events. ([#784](https://github.com/ethers-io/ethers.js/issues/784); [69f7077](https://github.com/ethers-io/ethers.js/commit/69f707762ed5939c5f52bf6dce5c5513aaf6fa1d))
- Added bitwise operations to BigNumber. ([#781](https://github.com/ethers-io/ethers.js/issues/781); [7498c18](https://github.com/ethers-io/ethers.js/commit/7498c18235c7566b2f652cddba991f55e0943da8), [284771e](https://github.com/ethers-io/ethers.js/commit/284771ea39b6f4ee9cdf75ce5feea9e6aa9a65c5))
ethers/v5.0.0-beta.180 (2020-04-03 22:10)
-----------------------------------------
- Correctly return the Provider in NonceManager. ([6caf7c2](https://github.com/ethers-io/ethers.js/commit/6caf7c292cd5f03741cd6b30053c3325c4f30a81))
- Fail earlier when resolving an ENS name that is not a string. ([2882546](https://github.com/ethers-io/ethers.js/commit/28825463517f8821392464ec2283ee59c431d928))
- Fixed mutabilityState calculation for function fragments. ([#762](https://github.com/ethers-io/ethers.js/issues/762); [6526de0](https://github.com/ethers-io/ethers.js/commit/6526de016fda5403474dad61ee59acc62ee25ebc), [d7c8b35](https://github.com/ethers-io/ethers.js/commit/d7c8b355a049b36068b0525a357c6278639a8d58))
- Force Log properties to be non-optional. ([#415](https://github.com/ethers-io/ethers.js/issues/415); [da412f6](https://github.com/ethers-io/ethers.js/commit/da412f660723d1c411484e74970ce4eb166374c2), [8ad26f0](https://github.com/ethers-io/ethers.js/commit/8ad26f0ff42614a6c40e735cb6fffd36874da1a0))
- Fixed Signer call not forwarding blockTag. ([#768](https://github.com/ethers-io/ethers.js/issues/768); [053a2d7](https://github.com/ethers-io/ethers.js/commit/053a2d7fcdb4ca4c9bfd0bee0f42e0187d3db477))
ethers/v5.0.0-beta.179 (2020-03-31 23:40)
-----------------------------------------
- Fixed ENS CLI lookup for Website. ([0f144c6](https://github.com/ethers-io/ethers.js/commit/0f144c6cc03082026080782356b940af3389b34e))
- Fixed getEtherPrice for EtherscanProvider. ([#776](https://github.com/ethers-io/ethers.js/issues/776); [6c71b51](https://github.com/ethers-io/ethers.js/commit/6c71b515126d8ef3cea5a1aec814c4cab56cc1a5))
- Fixed ENS CLI tool set-websites and added set-name. ([70cffb6](https://github.com/ethers-io/ethers.js/commit/70cffb6a5166a79a54e02b03b6a7ec0085407e07))
ethers/v5.0.0-beta.178 (2020-03-30 22:14)
-----------------------------------------
- Fixed Event args keyword access. ([2692e78](https://github.com/ethers-io/ethers.js/commit/2692e783b40ce16207fa1a8e8513ebb5455fd2d0), [092ce9b](https://github.com/ethers-io/ethers.js/commit/092ce9bcc2abf92c40550c4a990a8e2c889cc250))
- Updating TypeScript library and fixing some audit issues. ([bd32ee0](https://github.com/ethers-io/ethers.js/commit/bd32ee0af5b25a435e5896773d8bfd482d3adcaf))
ethers/v5.0.0-beta.177 (2020-03-21 12:46)
-----------------------------------------
- Abstracted JSON-RPC parameter generation for others to use. ([030f65e](https://github.com/ethers-io/ethers.js/commit/030f65e66ce059d69d8d77973d5c3190745eaac2))
- Updated RLP package to use Logger instead of bare errors. ([390497f](https://github.com/ethers-io/ethers.js/commit/390497f38964a052837f6c0e7c96efe74c668517))
- Fixed log level filtering for Logger. ([#379](https://github.com/ethers-io/ethers.js/issues/379); [72c8992](https://github.com/ethers-io/ethers.js/commit/72c89922a4e1b77295414c8e0717a7373f2397b8))
- Throw errors when trying to RLP encode integers. ([9ea16e5](https://github.com/ethers-io/ethers.js/commit/9ea16e5172928962792ba4c0273e23db373409e0))
- Added delays to provider tests to prevent throttling causing failed tests. ([3e44aac](https://github.com/ethers-io/ethers.js/commit/3e44aac8f199ec09babb20c4af2ee668e0ab05a1))
ethers/v5.0.0-beta.176 (2020-03-12 19:10)
-----------------------------------------
- Checking in initial Eip1193Bridge (experimental). ([2c78f0b](https://github.com/ethers-io/ethers.js/commit/2c78f0bf265a0f7c9f4cfc1bc79ecd4629b59c49))
- Added initial WebSocketProvider. ([#141](https://github.com/ethers-io/ethers.js/issues/141); [117a5dd](https://github.com/ethers-io/ethers.js/commit/117a5dd7ffa783c4335c0b87621437447cd499d0))
- Renamed properties based on community recommendations; estimate to estimateGas and addressPromise to resovledAddress. ([fe3b3fa](https://github.com/ethers-io/ethers.js/commit/fe3b3fa1aded67827fec1131931d95d8153d8f32))
- Better error reporting and fixed look-ahead for data labels. ([e52312e](https://github.com/ethers-io/ethers.js/commit/e52312e783b8d0fdd7e9992716cbe2e179751b38))
ethers/v5.0.0-beta.175 (2020-02-27 19:53)
-----------------------------------------
- Fix address-less filter listening in Provider. ([#741](https://github.com/ethers-io/ethers.js/issues/741); [64dccb2](https://github.com/ethers-io/ethers.js/commit/64dccb275c68ebb40328350d4ab5be0f29b8a02e))
- Added sync version of wallet decryption. ([0ad94cd](https://github.com/ethers-io/ethers.js/commit/0ad94cdf8137259bedb38c0dc949b61570bcdac0), [6809c37](https://github.com/ethers-io/ethers.js/commit/6809c370c027aea148466c00d3ce09c6d0ee6ddc))
ethers/v5.0.0-beta.175 (2020-02-27 19:38)
-----------------------------------------
- Fix address-less filter listening in Provider. ([#741](https://github.com/ethers-io/ethers.js/issues/741); [64dccb2](https://github.com/ethers-io/ethers.js/commit/64dccb275c68ebb40328350d4ab5be0f29b8a02e))
- Added sync version of wallet decryption. ([0ad94cd](https://github.com/ethers-io/ethers.js/commit/0ad94cdf8137259bedb38c0dc949b61570bcdac0))
ethers/v5.0.0-beta.174 (2020-02-25 14:57)
-----------------------------------------
- Reduced default Provider quorum for testnets. ([1cfab31](https://github.com/ethers-io/ethers.js/commit/1cfab3173c3d0519beffc054efe73f70b7d28501))
- Added JSON-RPC debugging on error responses. ([ad27600](https://github.com/ethers-io/ethers.js/commit/ad27600c699827858e7343adff2d4fa622248e42))
- Fixed setLogLevel to affect global logging. ([ac51a88](https://github.com/ethers-io/ethers.js/commit/ac51a88c2913d7055e050c91d7d96bb42abf6656))
- Renamed interface getTopic to getEventTopic. ([f61f34b](https://github.com/ethers-io/ethers.js/commit/f61f34bfb295bafee3b7ee426efa696aaa9bbafe))
- 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))
ethers/v5.0.0-beta.173 (2020-02-12 17:09)
-----------------------------------------
- Added experimental EipWrappedProvider. ([944600d](https://github.com/ethers-io/ethers.js/commit/944600d779564c500ab98d3265286a0717642614))
- 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))
- 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))
- Better type safety for defineReadOnly. ([e7adc84](https://github.com/ethers-io/ethers.js/commit/e7adc84a972968f39a983efb6f21b6ceaacd6cc5))
- Fixed CLI sandbox quiting after prompt entry. ([ff9bc2a](https://github.com/ethers-io/ethers.js/commit/ff9bc2a282e617125bbca76702dec85149661390))
ethers/v5.0.0-beta.172 (2020-02-04 00:59)
-----------------------------------------
- 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))
- 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))
- Fixed Opcode typo and added check to prevent future typos. ([15bb840](https://github.com/ethers-io/ethers.js/commit/15bb8409077f96b22e8bd60c426cddd015454e6b))
- Renamed AST nodes for teh assembler. ([f02c7db](https://github.com/ethers-io/ethers.js/commit/f02c7db4109d1785b4528757aa50f24948e896ae))
- Added timeout to waitForTransaction. ([#477](https://github.com/ethers-io/ethers.js/issues/477); [bacc440](https://github.com/ethers-io/ethers.js/commit/bacc4403979fa423890e269e7a5c7d11c6891a9f))
- Added CLI for asm package. ([aafa42a](https://github.com/ethers-io/ethers.js/commit/aafa42a32b2a5c7481a409ad048dfc06112c6599))
- Prevent Signer.checkTransaction from creating conflicting from properties. ([1decb13](https://github.com/ethers-io/ethers.js/commit/1decb1379902b60a15925b9b1de39633393db825))
- Include asm in generated TypeScript dependencies. ([ba29618](https://github.com/ethers-io/ethers.js/commit/ba296188960fb345dfdab12f2bb3ed3dc5eab51a))
- Clean up some asm checks and dead code. ([fa317eb](https://github.com/ethers-io/ethers.js/commit/fa317ebc032f8a5f9fb2dd10e23496252ae744e1))
- More contained Opcode API. ([da8153c](https://github.com/ethers-io/ethers.js/commit/da8153c87753b79e5e4cd34d484b8e0e717426d9))
- Added initial codedrop for the asm package. ([0296594](https://github.com/ethers-io/ethers.js/commit/0296594aba8d1e90e9ef7a18d2324f6cac815953))
ethers/v5.0.0-beta.171 (2020-02-01 05:05)
-----------------------------------------
- Added CLI for asm package. ([aafa42a](https://github.com/ethers-io/ethers.js/commit/aafa42a32b2a5c7481a409ad048dfc06112c6599))
- Added more flatworm documentation. ([1c85fe9](https://github.com/ethers-io/ethers.js/commit/1c85fe95b2b536828e83087676becba85c9a90bb))
- Prevent Signer.checkTransaction from creating conflicting from properties. ([1decb13](https://github.com/ethers-io/ethers.js/commit/1decb1379902b60a15925b9b1de39633393db825))
- Include asm in generated TypeScript dependencies. ([ba29618](https://github.com/ethers-io/ethers.js/commit/ba296188960fb345dfdab12f2bb3ed3dc5eab51a))
- Clean up some asm checks and dead code. ([fa317eb](https://github.com/ethers-io/ethers.js/commit/fa317ebc032f8a5f9fb2dd10e23496252ae744e1))
- More contained Opcode API. ([da8153c](https://github.com/ethers-io/ethers.js/commit/da8153c87753b79e5e4cd34d484b8e0e717426d9))
- Added initial codedrop for the asm package. ([0296594](https://github.com/ethers-io/ethers.js/commit/0296594aba8d1e90e9ef7a18d2324f6cac815953))
ethers/v5.0.0-beta.171 (2020-01-29 21:41)
-----------------------------------------
- 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))
- 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)
-----------------------------------------
- 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))
ethers/v5.0.0-beta.169 (2020-01-20 19:42)
-----------------------------------------

View File

@@ -105,9 +105,41 @@ async function generate() {
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,
}

View File

@@ -2,13 +2,16 @@
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
@@ -32,6 +35,8 @@ if (process.argv.length > 2) {
(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
@@ -68,6 +73,7 @@ if (process.argv.length > 2) {
if (dirname === "ethers") {
options.tag = "next";
includeEthers = true;
} else {
options.tag = "latest";
}
@@ -89,4 +95,20 @@ if (process.argv.length > 2) {
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 }...`);
}
})();

View File

@@ -57,6 +57,11 @@ Config.prototype.load = async function() {
}
};
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")
@@ -102,6 +107,9 @@ module.exports = {
set: function(key, value) {
config.set(key, value);
},
keys: function() {
return config.keys();
},
lock: function() {
config.lock();
}

View File

@@ -128,7 +128,35 @@ 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,
}

View File

@@ -1,8 +0,0 @@
_title: Contracts
_null: Contract @<contract>
_section: Contracts
Explain what contracts are...
_subsection: Buckets

View File

@@ -0,0 +1,162 @@
_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.

View File

@@ -0,0 +1,150 @@
_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.

View File

@@ -0,0 +1,8 @@
_section: Contract Interaction @<contracts>
Explain what contracts are...
_toc:
contract
example

View File

@@ -0,0 +1,35 @@
// 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)

View File

@@ -1,6 +1,4 @@
_title: Application Programming Interface
_section: Application Programming Interface (API)
_section: Application Programming Interface @NAV<API>
Here...
@@ -9,3 +7,4 @@ _toc:
signer
providers
utils
other

View File

@@ -0,0 +1,86 @@
_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.

View File

@@ -0,0 +1,150 @@
_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.

View File

@@ -0,0 +1,115 @@
_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>

View File

@@ -0,0 +1,6 @@
_section: Assembly
_toc:
dialect
api
ast

View File

@@ -0,0 +1,15 @@
_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.

View File

@@ -0,0 +1,9 @@
_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

View File

@@ -1,5 +1,3 @@
_title: API Providers
_section: API Providers
There are many services which offer a web API for accessing
@@ -16,39 +14,52 @@ To mitigate these issues, it is recommended you use a
_subsection: EtherscanProvider @INHERIT<[[provider]]>
The **EtherscanProvider** is backed by a combination of the various
[Etherscan APIs](https://etherscan.io/apis).
[Etherscan APIs](link-etherscan-api).
_property: provider.getHistory(address) => Array<History>
@TODO... Explain
_subsection: InfuraProvider @INHERIT<[[urljsonrpc-provider]]>
_definition: **Supported Networks**
The **InfuraProvider** is backed by the popular [INFURA](https://infura.io)
- Homestead (Mainnet)
- Ropsten (proof-of-work testnet)
- Rinkeby (proof-of-authority testnet)
- G&ouml;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.
It supports Mainnet (homestead) and all common testnets (Ropsten, Rinkeby,
G&ouml;rli and Kovan).
_definition: **Supported Networks**
- Homestead (Mainnet)
- Ropsten (proof-of-work testnet)
- Rinkeby (proof-of-authority testnet)
- G&ouml;rli (clique testnet)
- Kovan (proof-of-authority testnet)
_subsection: NodesmithProvider @INHERIT<[[urljsonrpc-provider]]>
_subsection: AlchemyProvider @INHERIT<[[provider-urljsonrpc]]>
The **NodesmithProvider** is backed by [Nodesmith](https://nodesmith.io).
The **AlchemtProvider** is backed by [Alchemy](link-alchemy).
It supports Mainnet (homestead) and all common testnets (Ropsten, Rinkeby,
G&ouml;rli and Kovan), as well as the Ethereum-like network [Aion](https://aion.network).
_definition: **Supported Networks**
- Homestead (Mainnet)
- Ropsten (proof-of-work testnet)
- Rinkeby (proof-of-authority testnet)
- G&ouml;rli (clique testnet)
- Kovan (proof-of-authority testnet)
_subsection: AlchemyProvider @INHERIT<[[urljsonrpc-provider]]>
_subsection: CloudfrontProvider @INHERIT<[[provider-urljsonrpc]]>
The **AlchemtProvider** is backed by [Alchemy](https://alchemyapi.io).
The CloudfrontProvider is backed by the [Cloudflare Ethereum Gateway](link-cloudflare).
It supports Mainnet (homestead) and all common testnets (Ropsten, Rinkeby,
G&ouml;rli and Kovan).
_definition: **Supported Networks**
_subsection: CloudfrontProvider @INHERIT<[[urljsonrpc-provider]]>
The CloudfrontProvider is backed by the
[Cloudflare Ethereum Gateway](https://developers.cloudflare.com/distributed-web/ethereum-gateway/).
It only supports Mainnet (homestead).
- Homestead (Mainnet)

View File

@@ -1,5 +1,3 @@
_title: Providers
_section: Providers
A **Provider** is an abstraction of a connection to the

View File

@@ -1,27 +1,73 @@
_title: JSON-RPC Provider
_section: JsonRpcProvider @<provider-jsonrpc> @INHERIT<[[provider]]>
_section: JSON-RPC 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))
Explain here...
_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.
_subsection: JsonRpcProvider @<jsonrpc-provider> @INHERIT<[[provider]]>
_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.
TODO...
_property: jsonRpcProvider.getSigner([ addressOrIndex ]) => [[jsonrpc-signer]] @<provider-getsigner> @SRC<providers/json-rpc-provider>
Returns a [[jsonrpc-signer]] which is managed by this Ethereum node, at
_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 ]) => [[jsonrpc-uncheckedsigner]] @<provider-getuncheckedsigner> @SRC<providers/json-rpc-provider>
_property: jsonRpcProvider.getUncheckedSigner([ addressOrIndex ]) => [[provider-jsonrpc-uncheckedsigner]] @<provider-jsonrpc-getuncheckedsigner> @SRC<providers/json-rpc-provider>
_property: jsonRpcProvider.listAccounts() => Array<string> @<provider-listaccounts> @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-send> @SRC<providers/json-rpc-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 @<jsonrpc-signer> @INHERIT<[[signer]]>
TODO... Explain
_subsection: JsonRpcSigner @<signer-jsonrpc> @INHERIT<[[signer]]>
A **JsonRpcSigner** is a simple Signer which is backed by a connected
[[provider-jsonrpc]].
_subsection: JsonRpcUncheckedSigner @<jsonrpc-uncheckedsigner> @INHERIT<[[signer]]>
TODO... Explain
_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.

View File

@@ -1,37 +1,110 @@
_title: Other Providers
_section: Other Providers
Others...
_subsection: FallbackProvider @<provider-fallback> @INHERIT<[[provider]]>
_subsection: FallbackProvider @<provider-fallback> @INHERIT<[[provider]]> @SRC<providers/fallback-provider:class.FallbackProvider>
Explain...
The **FallbackProvider** is the most advanced [[provider]] available in
ethers.
_heading: Properties
It uses a quorum and connects to multiple [Providers](provider) as backends,
each configured with a //priority// and a //weight// .
_property: provider.providers => Array<[[provider]]>
The list of Providers this is connected to.
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//.
_property: provider.weights => Array<number>
The weight each of the Providers adds to a results acceptance.
_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<[[jsonrpc-provider]]>
_subsection: IpcProvider @<provider-ipc> @INHERIT<[[provider-jsonrpc]]> @SRC<providers:class.IpcProvider>
Explain...
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.
_subsection: UrlJsonRpcProvider @<urljsonrpc-provider> @INHERIT<[[jsonrpc-provider]]>
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.
Tra la la
_property: ipcProvider.path => string
The path this [[provider]] is connected to.
_subsection: Web3Provider @<web3provider> @INHERIT<[[jsonrpc-provider]]>
Tra la la
_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.

View File

@@ -1,6 +1,3 @@
_title: Abstract Provider
_section: Provider @<provider>
Explain what a provider is...
@@ -99,7 +96,7 @@ Submits //transaction// to the network to be mined. The //transaction// **must**
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-transactionreceipt]]> @<providers-waitfortransaction> @SRC<providers/base-provider>
_property: provider.waitForTransaction(transactionHash) => Promise<[[provider-receipt]]> @<providers-waitfortransaction> @SRC<providers/base-provider>
Returns a Promise which will not resolve until //transactionHash// is mined.

View File

@@ -1,50 +1,160 @@
_title: Types
_section: Types
_heading: BlockTag @<provider-blocktag>
_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 support this BlockTag
operations and backends support this BlockTag
- **//number//** -- The block at this height
- **//a negative number//** -- The block this many blocks ago
_heading: Network @<provider-network>
_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.
- **name** -- The human-readable name of the network
- **chainId** -- The Chain ID of the network
- **ensAddress** -- The address at which the ENS registry is deployed
_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: Blocks
_subsection: Block @<provider-block>
_heading: Block @<provider-block>
TODO
_property: block.hash => string<[[datahexstring]]<32>>
The hash of this block.
_heading: BlockWithTransactions @<provider-blocktxs>
TODO
_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
TODO
_heading: EventFilter @<provider-eventfilter>
_heading: EventType
TODO
_property: filter.address => string<[[address]]>
The address to filter by, or ``null`` to match any address.
_heading: Filter
TODO
_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: FilterByBlockHash
TODO
_heading: Log @<provider-log>
A network...
_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
@@ -54,22 +164,138 @@ _heading: TransactionRequest @<provider-transactionrequest>
A transaction request describes a transaction that is to
be sent to the network or otherwise processed.
It contains the fields:
- **to** --- target address
- **from** --- target address
- **nonce** --- target address
- **gasLimit** --- target address
- **gasPrice** --- target address
- **data** --- target address
- **value** --- target address
- **chainId** --- target address
All fields are optional and may be a promise which resolves
to the required type.
_heading: TransactionResponse @<provider-transactionresponse>
_property: transactionRequest.to => string | Promise<string>
The address (or ENS name) this transaction it to.
A **TransactionResponse** ..
_property: transactionRequest.from => string<[[address]]> | Promise<string<[[address]]>>
The address this transaction is from.
_heading: TransactionReceipt @<provider-transactionreceipt>
TODO
_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.

View File

@@ -1,5 +1,3 @@
_title: Signer
_section: Signers
A Signer represents...
@@ -8,7 +6,7 @@ _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 [[jsonrpc-signer]].
or [[signer-jsonrpc]].
_property: signer.connect(provider) => [[signer]] @<signer-connect>
@@ -29,25 +27,28 @@ 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>
TODO
Returns the balance of this wallet at //blockTag//.
_property: signer.getChainId() => Promise<number> @<signer-getchainid> @SRC<abstract-signer>
TODO
Returns ths chain ID this wallet is connected to.
_property: signer.getGasPrice() => Promise<[[bignumber]]> @<signer-getgasprice> @SRC<abstract-signer>
TODO
Returns the current gas price.
_property: signer.getTransactionCount([ blockTag = "latest" ]) => Promise<number> @<signer-gettransactioncount> @SRC<abstract-signer>
TODO
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>
TODO
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>
TODO
Returns the result of estimating the cost to send the //transactionRequest//,
with this account address being used as the ``from`` field.
_property: signer.resolveName(name) => Promise<string<[Address](address)>> @<signer-resolvename> @SRC<abstract-signer>
TODO
_property: signer.resolveName(ensName) => Promise<string<[Address](address)>> @<signer-resolvename> @SRC<abstract-signer>
Returns the address associated with the //ensName//.
_heading: Signing
@@ -102,11 +103,29 @@ serious issues.
A sub-class **must** call ``super()``.
_property: signer.checkTransaction(transactionRequest) => [[provider-transactionrequest]] @<signer-checktransaction> @SRC<abstract-signer>
TODO
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>
TODO
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>
@@ -179,6 +198,10 @@ 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.
@@ -187,10 +210,8 @@ _property: eoa.privateKey => string<[[datahexstring]]<32>>
The privateKey of this EOA
_property: eoa.mnemonic => string
_property: eoa.mnemonic => [[hdnode-mnemonic]]
//Optional//. The account HD mnemonic, if it has one and can be determined.
_property: eoa.path => string
//Optional//. The account HD path, if it has one and can be determined.
//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.

View File

@@ -1,6 +1,4 @@
_title: Application Binary Interface
_section: Application Binary Interface
_section: Fragments
Explain an ABI.
@@ -9,7 +7,7 @@ _subsection: Formats
_heading: JSON String ABI (Solidity Output JSON)
The **JSON ABI Format** is the format that is
[output from the Solidity compiler](https://solidity.readthedocs.io/en/v0.6.0/using-the-compiler.html#output-description).
[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.
@@ -21,31 +19,32 @@ _heading: Humanb-Readable ABI
The Human-Readable ABI was
[article](https://blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917)
[article](link-ricmoo-humanreadableabi)
_heading: Output Formats @<abi-outputformats> @src<abi/fragments:FormatTypes>
_heading: Output Formats @<abi-outputformats> @SRC<abi/fragments:FormatTypes>
Each [[abi-fragment]] and [[abi-paramtype]] may be output using its ``format``
method.
_property: utils.FragmentTypes.full => string
_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: utils.FragmentTypes.minimal => string
_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&thinsp;.&thinsp;from](abi-fragment-from).
_property: utils.FragmentTypes.json => string
_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: utils.FragmentTypes.sighash => 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.
@@ -60,9 +59,9 @@ _subsection: Fragment @<abi-fragment> @SRC<abi/fragments:class.Fragment>
An ABI is a collection of **Fragments**, where each fragment specifies:
- An Event
- A Function
- A Constructor
- An [Event](abi-eventfragment)
- A [Function](abi-functionfragment)
- A [Constructor](abi-constructorfragment)
_heading: Properties
@@ -87,11 +86,11 @@ the Constructor, Event of Function.
_heading: Methods
_property: utils.Fragment.from(objectOrString) => [[abi-fragment]] @<abi-fragment-from> @SRC<abi/fragments:Fragment.from>
_property: ethers.utils.Fragment.from(objectOrString) => [[abi-fragment]] @<abi-fragment-from> @SRC<abi/fragments:Fragment.from>
Returns a
_property: utils.Fragment.isFragment(object) => boolean @<abi-isfragment> @SRC<abi/fragments:Fragment.isFragment>
_property: ethers.utils.Fragment.isFragment(object) => boolean @<abi-isfragment> @SRC<abi/fragments:Fragment.isFragment>
Tra lal al
@@ -119,11 +118,11 @@ This is the state mutability of the constructor. It can be any of:
_heading: Methods
_property: utils.ConstructorFragment.from(objectOrString) => [[abi-constructorfragment]] @<abi-constructorfragment-from> @SRC<abi/fragments:ConstructorFragment.from>
_property: ethers.utils.ConstructorFragment.from(objectOrString) => [[abi-constructorfragment]] @<abi-constructorfragment-from> @SRC<abi/fragments:ConstructorFragment.from>
Tra la la...
_property: utils.ConstructorFragment.isConstructorFragment(object) => boolean @<abi-isconstructorfragment> @SRC<abi/fragments:ConstructorFragment.isConstructorFragment>
_property: ethers.utils.ConstructorFragment.isConstructorFragment(object) => boolean @<abi-isconstructorfragment> @SRC<abi/fragments:ConstructorFragment.isConstructorFragment>
Tra lal al
@@ -139,11 +138,11 @@ topic hash as topic0 when creating a log.
_heading: Methods
_property: utils.EventFragment.from(objectOrString) => [[abi-eventfragment]] @<abi-eventfragment-from> @SRC<abi/fragments:EventFragment.from>
_property: ethers.utils.EventFragment.from(objectOrString) => [[abi-eventfragment]] @<abi-eventfragment-from> @SRC<abi/fragments:EventFragment.from>
Tra la la...
_property: utils.EventFragment.isEventFragment(object) => boolean @<abi-iseventfragment> @SRC<abi/fragments:EventFragment.isEventFragment>
_property: ethers.utils.EventFragment.isEventFragment(object) => boolean @<abi-iseventfragment> @SRC<abi/fragments:EventFragment.isEventFragment>
Tra lal al
@@ -172,11 +171,11 @@ A list of the Function output parameters.
_heading: Method
_property: utils.FunctionFragment.from(objectOrString) => [[abi-functionfragment]] @<abi-functionfragment-from> @SRC<abi/fragments:ConstructorFragment.from>
_property: ethers.utils.FunctionFragment.from(objectOrString) => [[abi-functionfragment]] @<abi-functionfragment-from> @SRC<abi/fragments:ConstructorFragment.from>
Tra la la...
_property: utils.FunctionFragment.isFunctionFragment(object) => boolean @<abi-isfunctionfragment> @SRC<abi/fragments:FunctionFragment.isFunctionFragment>
_property: ethers.utils.FunctionFragment.isFunctionFragment(object) => boolean @<abi-isfunctionfragment> @SRC<abi/fragments:FunctionFragment.isFunctionFragment>
Tra lal al
@@ -229,14 +228,14 @@ _heading: Methods
Tra la la...
_property: paramType.format([ outputType = "sighash" ])
_property: paramType.format([ outputType = sighash ])
Tra la la...
_property: utils.ParamType.from(objectOrString) => [[abi-paramtype]] @<abi-paramtype-from> @SRC<abi/fragments:ParamType.from>
_property: ethers.utils.ParamType.from(objectOrString) => [[abi-paramtype]] @<abi-paramtype-from> @SRC<abi/fragments:ParamType.from>
Tra la la...
_property: utils.ParamType.isParamType(object) => boolean @<abi-paramtype-isparamtype> @SRC<abi/fragments:ParamType.isParamType>
_property: ethers.utils.ParamType.isParamType(object) => boolean @<abi-paramtype-isparamtype> @SRC<abi/fragments:ParamType.isParamType>
Tra la la...

View File

@@ -0,0 +1,5 @@
_section: Application Binary Interface @NAV<ABI>
_toc:
interface
fragments

View File

@@ -0,0 +1,196 @@
_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&lt;any&gt;>
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]]

View File

@@ -1,5 +1,3 @@
_title: Addresses
_section: Addresses @<addresses>
Explain addresses,formats and checksumming here.
@@ -8,15 +6,42 @@ Also see: [constants.AddressZero](constants)
_subsection: Address Formats @<address-formats>
_heading: Checksum Address @<address>
TODO
_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>
TODO
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: utils.getAddress(address) => string<[Address](address)> @<utils-getAddress> @SRC<address>
_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
@@ -25,17 +50,17 @@ the checksum is invalid, an InvalidArgument Error is throw.
The value of //address// may be any supported address format.
_property: utils.isAddress(address) => boolean @<utils-isAddress> @SRC<address>
_property: ethers.utils.isAddress(address) => boolean @<utils-isAddress> @SRC<address>
Returns true if //address// is valid (in any supported format).
_property: utils.getIcapAddress(address) => string<[IcapAddress](address-icap)> @<utils-getIcapAddress> @SRC<address>
Returns //address// as an [ICAP address](https://github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-%28ICAP%29).
_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: utils.getContractAddress(transaction) => string<[Address](address)> @<utils-getContractAddress> @SRC<address>
_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: utils.getCreate2Address(from, salt, initCodeHash) => string<[Address](address)> @<utils.getCreate2Address> @SRC<address>
_property: ethers.utils.getCreate2Address(from, salt, initCodeHash) => string<[[address]]> @<utils-getCreate2Address> @SRC<address>
Returns the contract address that would result from the given
[CREATE2](https://eips.ethereum.org/EIPS/eip-1014) call.
[CREATE2](link-eip-1014) call.

View File

@@ -1,9 +1,15 @@
_title: Big Number
_section: BigNumber @<bignumber>
Explain about BigNumber here...
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
@@ -25,13 +31,13 @@ _definition: **//BytesLike//**
A [BytesLike](byteslike) Object, such as an Array or Uint8Array.
_definition: **//BigNumber//**
An existing BigNumber instance.
An existing [[bignumber]] instance.
_definition: **//number//**
A number that is within the safe range for JavaScript numbers.
A number that is within the [safe range](link-js-maxsafe) for JavaScript numbers.
_definition: **//BigInt//**
A JavaScript [BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt)
A JavaScript [BigInt](link-js-bigint)
object, on environments that support BigInt.
@@ -39,10 +45,10 @@ _subsection: Creating Instances
The constructor of BigNumber cannot be called directly. Instead, Use the static ``BigNumber.from``.
_property: BigNumber.from(aBigNumberish) => [[bignumber]]
_property: ethers.BigNumber.from(aBigNumberish) => [[bignumber]]
Returns an instance of a **BigNumber** for //aBigNumberish//.
_heading: Examples:
_heading: Examples: @<>
_code: bignumber-create.js
@@ -83,7 +89,7 @@ the //bitcount// least significant bits set to zero.
_heading: Two's Compliment
[Two's Complicment](https://en.wikipedia.org/wiki/Two%27s_complement)
[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.
@@ -129,12 +135,12 @@ _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 [hexstring](hexstring).
Returns the value of //bignumber// as a base-16, ``0x``-prefixed [[datahexstring]].
_heading: Inspection
_property: BigNumnber.isBigNumber(object) => boolean @SRC<bignumber>
_property: ethers.BigNumnber.isBigNumber(object) => boolean @SRC<bignumber>
Returns true if and only if the //object// is a BigNumber object.
@@ -142,11 +148,13 @@ _heading: Examples
_code: bignumber-examples.js
_subsection: Notes
A few short notes on numbers...
This section is a for a couple of questions that come up frequently.
_heading: Why can't I just use numbers?
_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
@@ -154,7 +162,7 @@ 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](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)
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
@@ -173,3 +181,61 @@ The functions [parseEther( etherString )](http://linkto) and
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.

View File

@@ -1,5 +1,3 @@
_title: Byte Manipulation
_section: Byte Manipulation
Tra la la...
@@ -9,8 +7,7 @@ _subsection: Types
_heading: Bytes @<bytes>
A **Bytes** is any object which is an
[Array](https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) or
[TypedArray](https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) with
[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.
@@ -34,7 +31,7 @@ _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](https://eips.ethereum.org/EIPS/eip-2098) of the **s** and **v**
- **_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>
@@ -56,13 +53,13 @@ missing values can be computed).
_subsection: Inspection
_property: utils.isBytes(object) => boolean @<utils-isbytes> @SRC<bytes>
_property: ethers.utils.isBytes(object) => boolean @<utils-isbytes> @SRC<bytes>
Returns true if and only if //object// is a valid [[bytes]].
_property: utils.isBytesLike(object) => boolean @<utils-isbyteslike> @SRC<bytes>
_property: ethers.utils.isBytesLike(object) => boolean @<utils-isbyteslike> @SRC<bytes>
Returns true if and only if //object// is a [[bytes]] or [[datahexstring]].
_property: utils.isHexString(object, [ length ] ) => boolean @<utils-ishexstring> @SRC<bytes>
_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.
@@ -70,13 +67,13 @@ If //length// is specified and //object// is not a valid [[datahexstring]] of
_subsection: Converting between Arrays and Hexstrings
_property: utils.arrayify(datahexstringOrArrayish [ , options ]) => Uint8Array @<utils-arrayify> @SRC<bytes>
_property: ethers.utils.arrayify(datahexstringOrArrayish [ , options ]) => Uint8Array @<utils-arrayify> @SRC<bytes>
Converts //datahexstringOrArrayish// to a Uint8Array.
_property: utils.hexlify(hexstringOrArrayish) => string<[[datahexstring]]> @<utils-hexlify> @SRC<bytes>
_property: ethers.utils.hexlify(hexstringOrArrayish) => string<[[datahexstring]]> @<utils-hexlify> @SRC<bytes>
Converts //hexstringOrArrayish// to a [[datahexstring]].
_property: utils.hexValue(aBigNumberish) => string<[[hexstring]]> @<utils-hexvalue> @SRC<bytes>
_property: ethers.utils.hexValue(aBigNumberish) => string<[[hexstring]]> @<utils-hexvalue> @SRC<bytes>
Converts //aBigNumberish// to a [[hexstring]], with no __unnecessary__ leading
zeros.
@@ -87,13 +84,13 @@ _code: bytes-conversion.js
_subsection: Array Manipulation
_property: utils.concat(arrayOfBytesLike) => Uint8Array @<utils-concat> @SRC<bytes>
_property: ethers.utils.concat(arrayOfBytesLike) => Uint8Array @<utils-concat> @SRC<bytes>
Concatenates all the [[byteslike]] in //arrayOfBytesLike// into a single Uint8Array.
_property: utils.stripZeros(aBytesLike) => Uint8Array @<utils-stripzeros> @SRC<bytes>
_property: ethers.utils.stripZeros(aBytesLike) => Uint8Array @<utils-stripzeros> @SRC<bytes>
Returns a Uint8Array with all leading ``0`` bytes of //aBtyesLike// removed.
_property: utils.zeroPad(aBytesLike, length) => Uint8Array @<utils-zeropad> @SRC<bytes>
_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.
@@ -103,22 +100,22 @@ error will be thrown.
_subsection: Hexstring Manipulation
_property: utils.hexConcat(arrayOfBytesLike) => string<[[datahexstring]]> @<utils-hexconcat> @SRC<bytes>
_property: ethers.utils.hexConcat(arrayOfBytesLike) => string<[[datahexstring]]> @<utils-hexconcat> @SRC<bytes>
Concatenates all the [[byteslike]] in //arrayOfBytesLike// into a single [[datahexstring]]
_property: utils.hexDataLength(aBytesLike) => string<[[datahexstring]]> @<utils-hexdatalength> @SRC<bytes>
_property: ethers.utils.hexDataLength(aBytesLike) => string<[[datahexstring]]> @<utils-hexdatalength> @SRC<bytes>
Returns the length (in bytes) of //aBytesLike//.
_property: utils.hexDataSlice(aBytesLike, offset [ , endOffset ] ) => string<[[datahexstring]]> @<utils-hexdataslice> @SRC<bytes>
_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: utils.hexStripZeros(aBytesLike) => string<[[hexstring]]> @<utils-hexstripzeros> @SRC<bytes>
_property: ethers.utils.hexStripZeros(aBytesLike) => string<[[hexstring]]> @<utils-hexstripzeros> @SRC<bytes>
Returns a [[hexstring]] representation of //aBytesLike// with all
leading zeros removed.
_property: utils.hexZeroPad(aBytesLike, length) => string<[[datahexstring]]> @<utils-hexzeropad> @SRC<bytes>
_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
@@ -127,11 +124,18 @@ error will be thrown.
_subsection: Signature Conversion
_property: utils.joinSignature(aSignatureLike) => string<[FlatSignature](signature-flat)> @<utils-joinsignature> @SRC<bytes>
_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: utils.splitSignature(aSignatureLikeOrBytesLike) => [[signature]] @<utils-splitsignature> @SRC<bytes>
_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]].

View File

@@ -1,5 +1,3 @@
_title: Constants
_section: Constants @<constants>
The **ethers.contants** Object contains commonly used values.
@@ -11,38 +9,38 @@ _code: constants-import.js
_subsection: Bytes
_property: constants.AddressZero => string<[Address](address)> @<constants-addresszero> @SRC<constants>
_property: ethers.constants.AddressZero => string<[Address](address)> @<constants-addresszero> @SRC<constants>
The Address Zero, which is 20 bytes (40 nibbles) of zero.
_property: constants.HashZero => string<[[datahexstring]]<32>> @<constants-hashzero> @SRC<constants>
_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: constants.EtherSymbol => string @<constants-ethersymbol> @SRC<constants>
_property: ethers.constants.EtherSymbol => string @<constants-ethersymbol> @SRC<constants>
The Ether symbol, **&Xi;**.
_subsection: BigNumber
_property: constants.NegativeOne => [[bignumber]] @<constants-negativeone> @SRC<constants>
_property: ethers.constants.NegativeOne => [[bignumber]] @<constants-negativeone> @SRC<constants>
The BigNumber value representing ``"-1"``.
_property: constants.Zero => [[bignumber]] @<constants-zero> @SRC<constants>
_property: ethers.constants.Zero => [[bignumber]] @<constants-zero> @SRC<constants>
The BigNumber value representing ``"0"``.
_property: constants.One => [[bignumber]] @<constants-one> @SRC<constants>
_property: ethers.constants.One => [[bignumber]] @<constants-one> @SRC<constants>
The BigNumber value representing ``"1"``.
_property: constants.Two => [[bignumber]] @<constants-two> @SRC<constants>
_property: ethers.constants.Two => [[bignumber]] @<constants-two> @SRC<constants>
The BigNumber value representing ``"2"``.
_property: constants.WeiPerEther => [[bignumber]] @<constants-weiperether> @SRC<constants>
_property: ethers.constants.WeiPerEther => [[bignumber]] @<constants-weiperether> @SRC<constants>
The BigNumber value representing ``"1000000000000000000"``, which is the
number of Wei per Ether.
_property: constants.MaxUint256 => [[bignumber]] @<constants-maxuint256> @SRC<constants>
_property: ethers.constants.MaxUint256 => [[bignumber]] @<constants-maxuint256> @SRC<constants>
The BigNumber value representing the maximum ``uint256`` value.

View File

@@ -1,5 +1,3 @@
_title: Display Logic and Input
_section: Display Logic and Input
When creating an Application, it is useful to convert between
@@ -46,23 +44,23 @@ _subsection: Functions
_heading: Formatting
_property: utils.commify(value) => string @<util-commify> @SRC<units>
_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: utils.formatUnits(value [ , unit = "ether" ] ) => string @<util-formatunits> @SRC<units>
_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: utils.formatEther(value) => string @<util-formatether> @SRC<units>
_property: ethers.utils.formatEther(value) => string @<utils-formatether> @SRC<units>
The equivalent to calling ``formatUnits(value, "ether")``.
_property: utils.parseUnits(value [ , unit = "ether" ] ) => [BigNumber](bignumber) @<util-parseunits> @SRC<units>
_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: utils.parseEther(value) => [BigNumber](bignumber) @<util-parseether> @SRC<units>
_property: ethers.utils.parseEther(value) => [BigNumber](bignumber) @<utils-parseether> @SRC<units>
The equivalent to calling ``parseUnits(value, "ether")``.

View File

@@ -1,21 +1,49 @@
_title: Encoding Utilies
_section: Encoding Utilities @<encoding>
_section: Encoding Utilities
_property: utils.base58.decode(textData) => Uin8Array
_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: utils.base58.encode(aBytesLike) => string
_property: ethers.utils.base58.encode(aBytesLike) => string
Return //aBytesLike// encoded as a string using the base-58 encoding.
_property: utils.base64.decode(textData) => Uin8Array
_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: utils.base64.encode(aBytesLike) => string
_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" ], [ ] ]``

View File

@@ -1,55 +1,8 @@
_title: Fixed Number
_section: FixedNumber @<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
_property: fixedFormat.width => number
_property: fixedFormat.decimals => number
_property: fixedFormat.name => string
_definition: **//"fixed"//**
A shorthand for ``fixed128x80``.
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
@@ -117,3 +70,57 @@ _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``.

View File

@@ -1,5 +1,3 @@
_title: Hashing
_section: Hashing Algorithms
Explain what hash functions are?
@@ -7,47 +5,47 @@ Explain what hash functions are?
_subsection: Cryptographic Hashing
The [Cryptographic Hash Functions](https://en.wikipedia.org/wiki/Cryptographic_hash_function)
The [Cryptographic Hash Functions](link-wiki-cryptographichash)
are a specific family of hash functions.
_property: utils.keccak256(aBytesLike) => string<[[datahexstring]]<32>> @<utils-keccak256> @SRC<keccak256>
Returns the [KECCAK256](https://en.wikipedia.org/wiki/SHA-3) digest //aBytesLike//.
_property: ethers.utils.keccak256(aBytesLike) => string<[[datahexstring]]<32>> @<utils-keccak256> @SRC<keccak256>
Returns the [KECCAK256](link-wiki-sha3) digest //aBytesLike//.
_property: utils.ripemd160(aBytesLike) => string<[[datahexstring]]<20>> @<utils-ripemd160> @SRC<sha2>
Returns the [RIPEMD-160](https://en.m.wikipedia.org/wiki/RIPEMD) digest of //aBytesLike//.
_property: ethers.utils.ripemd160(aBytesLike) => string<[[datahexstring]]<20>> @<utils-ripemd160> @SRC<sha2>
Returns the [RIPEMD-160](link-wiki-ripemd) digest of //aBytesLike//.
_property: utils.sha256(aBytesLike) => string<[[datahexstring]]<32>> @<utils-sha256> @SRC<sha2:function.sha256>
Returns the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) 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: utils.sha512(aBytesLike) => string<[[datahexstring]]<64>> @<utils-sha512> @SRC<sha2:function.sha512>
Returns the [SHA2-512](https://en.wikipedia.org/wiki/SHA-2) 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: utils.computeHmac(algorithm, key, data) => string<[[datahexstring]]> @<utils-computehmac> @SRC<sha2>
Returns the [HMAC](https://en.wikipedia.org/wiki/HMAC) of //data// with //key//
_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.SupportedAlgorithms>
_heading: HMAC Supported Algorithms @<supported-algorithm> @SRC<sha2:enum.SupportedAlgorithm>
_property: utils.SupportedAlgorithms.sha256 => string
Use the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) hash algorithm.
_property: ethers.utils.SupportedAlgorithm.sha256 => string
Use the [SHA2-256](link-wiki-sha2) hash algorithm.
_property: utils.SupportedAlgorithms.sha512 => string
Use the [SHA2-512](https://en.wikipedia.org/wiki/SHA-2) hash algorithm.
_property: ethers.utils.SupportedAlgorithm.sha512 => string
Use the [SHA2-512](link-wiki-sha2) hash algorithm.
_subsection: Common Hashing Helpers
_property: utils.hashMessage(message) => string<[[datahexstring]]<32>> @<utils-hashmessage> @SRC<hash>
Computes the Ethereum message digest of //message//. Ethereum messages are
converted to UTF-8 bytes and prefixed with ``\x19Ethereum Signed Message:``
_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: utils.id(text) => string<[[datahexstring]]<32>> @<utils-id> @SRC<hash>
The Ethereum Identity function computs the keccak256 hash of the //text// bytes.
_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: utils.namehash(name) => string<[[datahexstring]]<32>> @<utils-namehash> @SRC<hash>
Returns the [ENS Namehash](https://docs.ens.domains/contract-api-reference/name-processing#hashing-names) of //name//.
_property: ethers.utils.namehash(name) => string<[[datahexstring]]<32>> @<utils-namehash> @SRC<hash>
Returns the [ENS Namehash](link-namehash) of //name//.
_subsection: Solidity Hashing Algorithms
@@ -56,16 +54,16 @@ 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: utils.solidityPack(arrayOfTypes, arrayOfValues) => string<[[datahexstring]]> @<utils-soliditypack> @SRC<solidity:pack>
_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: utils.solidityKeccak256(arrayOfTypes, arrayOfValues) => string<[[datahexstring]]<32>> @<utils-soliditykeccak256> @SRC<solidity:keccak256>
Returns the KECCAK256 of the non-standard encoded //arrayOfValues// packed
_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: utils.soliditySha256(arrayOfTypes, arrayOfValues) => string<[[datahexstring]]<32>> @<utils-soliditysha256> @SRC<solidity:sha256>
Returns the SHA2-256 of the non-standard encoded //arrayOfValues// packed
_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//.

View File

@@ -0,0 +1,125 @@
_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.

View File

@@ -1,17 +1,23 @@
_title: Utilities
_section: Utilities
These utilities are used extensively within the library, but
are also quite useful for application developers.
_toc:
address
abi
address
bignumber
bytes
constants
display-logic
encoding
fixednumber
hashing
hdnode
logger
properties
signing-key
strings
transactions
web
wordlists

View File

@@ -0,0 +1,208 @@
_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.

View File

@@ -0,0 +1,9 @@
_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

View File

@@ -1,12 +1,47 @@
_title: Signing Keys
_section: Signing Key @<utils-signingkey>
_section: Signing Key
_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](https://eips.ethereum.org/EIPS/eip-155))
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.

View File

@@ -1,5 +1,3 @@
_title: Strings
_section: Strings
Tra la la
@@ -21,22 +19,22 @@ _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: utils.parseBytes32String(aBytesLike) => string @<utils-parsebytes32> @SRC<strings>
_property: ethers.utils.parseBytes32String(aBytesLike) => string @<utils-parsebytes32> @SRC<strings>
Returns the decoded string represented by the ``Bytes32`` encoded data.
_property: utils.formatBytes32String(text) => string<[[datahexstring]]<32>> @<utils-formatbytes32> @SRC<strings>
_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: utils.toUtf8Bytes(text [ , form = current ] ) => Uint8Array @<utils-toutf8bytes> @SRC<strings>
_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: utils.toUtf8CodePoints(aBytesLike [ , form = current ] ) => Array<number> @<utils-toutf8codepoints> @SRC<strings>
Returns the Array of codepoints of //aBytesLike//, optionally normalizing it using the
_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
@@ -45,28 +43,29 @@ 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: utils.toUtf8String(aBytesLike [ , ignoreErrors = false ] ) => string @<utils-toutf8string> @SRC<strings>
Returns the string represented by the UTF-8 bytes of //aBytesLike//. This will
throw an error for invalid surrogates, overlong sequences or other UTF-8 issues,
unless //ignoreErrors// is specified.
_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.
_heading: UnicodeNormalizationForm @<unicode-normalization-form> @SRC<strings/utf8:enum.UnicodeNormalizationForm>
_subsection: UnicodeNormalizationForm @<unicode-normalization-form> @SRC<strings/utf8:enum.UnicodeNormalizationForm>
There are several [commonly used forms](https://en.wikipedia.org/wiki/Unicode_equivalence)
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: utils.UnicodeNormalizationForm.current
_property: ethers.utils.UnicodeNormalizationForm.current
Maintain the current normalization form.
_property: utils.UnicodeNormalizationForm.NFC
_property: ethers.utils.UnicodeNormalizationForm.NFC
The Composed Normalization Form. This form uses single codepoints
which represent the fully composed character.
For example, the **&eacute;** is a single codepoint, ``0x00e9``.
_property: utils.UnicodeNormalizationForm.NFD
_property: ethers.utils.UnicodeNormalizationForm.NFD
The Decomposed Normalization Form. This form uses multiple codepoints
(when necessary) to compose a character.
@@ -75,7 +74,7 @@ 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: utils.UnicodeNormalizationForm.NFKC
_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.
@@ -83,11 +82,101 @@ 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: utils.UnicodeNormalizationForm.NFKD
_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](https://en.wikipedia.org/wiki/IDN_homograph_attack).
[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).

View File

@@ -0,0 +1,126 @@
_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.

View File

@@ -0,0 +1,64 @@
_section: Web Utilities
_property: ethers.utils.fetchJson(urlOrConnectionInfo [, json [ , processFunc ] ]) => Promise<any> @<web-fetchjson>
Fetch and parse the JSON content from //urlOrConnectionInfo//, with the
optiona body //json// and optionally processing the result with //processFun//
before returning it.
_property: ethers.utils.poll(pollFunc [, options ]) => Promise<any> @<web-poll>
Repeatedly call pollFunc using the [[web-polloptions]] until it returns a
value other than undefined.
_heading: Connection Info @<web-connectioninfo>
_property: connection.url => string
The URL to connect to.
_property: connection.user => string
The username to use for [[link-wiki-basicauth]].
The default is null (i.e. do not use basic authentication)
_property: connection.password => string
The password to use for [[link-wiki-basicauth]].
The default is null (i.e. do not use basic authentication)
_property: connection.allowInsecureAuthentication => boolean
Allow [[link-wiki-basicauth]] over non-secure HTTP. The default is false.
_property: connection.timeout => number
How long to wait before rejecting with a //timeout// error.
_property: connection.headers => { [ key: string]: string }
Additional headers to include in the connection.
_heading: Poll Options @<web-polloptions>
_property: options.timeout => number
The amount of time allowed to ellapse before triggering a timeout
error.
_property: options.floor => number
The minimum time limit to allow for [[link-wiki-backoff]].
The default is 0s.
_property: options.ceiling => number
The maximum time limit to allow for [[link-wiki-backoff]].
The default is 10s.
_property: options.interval => number
The interval used during [[link-wiki-backoff]] calculation.
The default is 250ms.
_property: options.retryLimit => number
The number of times to retry in the event of an error or //undefined// is
returned.
_property: options.onceBlock => [[provider]]
If this is specified, the polling will wait on new blocks from
//provider// before attempting the //pollFunc// again.

View File

@@ -0,0 +1,58 @@
_section: Wordlists @<wordlists>
_subsection: Wordlist @<wordlist>
_property: wordlist.locale => string
The locale for this wordlist.
_property: wordlist.getWord(index) => string
Returns the word at //index//.
_property: wordlist.getWordIndex(word) => number
Returns the index of //word// within the wordlist.
_property: wordlist.split(mnemonic) => Array<string>
Returns the mnemonic split into each individual word, according to a
locale's valid whitespace character set.
_property: wordlist.join(words) => string
Returns the mnemonic by joining //words// together using the
whitespace that is standard for the locale.
_property: Wordlist.check(wordlists) => string<[[datahexstring]]<32>>
Checks that all words map both directions correctly and return the
hash of the lists. Sub-classes should use this to validate the wordlist
is correct against the official wordlist hash.
_property: Wordlist.register(wordlist [ , name ]) => void
Register a wordlist with the list of wordlists, optionally overriding
the registered //name//.
_subsection: Languages @<wordlist-languages>
_property: ethers.wordlists.cz => Wordlist
The Czech [[wordlist]].
_property: ethers.wordlists.en => Wordlist
The English [[wordlist]].
_property: ethers.wordlists.es => Wordlist
The Spanish [[wordlist]].
_property: ethers.wordlists.fr => Wordlist
The French [[wordlist]].
_property: ethers.wordlists.it => Wordlist
The Italian [[wordlist]].
_property: ethers.wordlists.ja => Wordlist
The Japanese [[wordlist]].
_property: ethers.wordlists.ko => Wordlist
The Korean [[wordlist]].
_property: ethers.wordlists.zh_cn => Wordlist
The Simplified Chinese [[wordlist]].
_property: ethers.wordlists.zh_tw => Wordlist
The Traditional Chinese [[wordlist]].

View File

@@ -0,0 +1,11 @@
/home/ethers> ethers-asm SimpleStore.asm
0x602a6000556044601160003960446000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f3
# Piping in ASM source code
/home/ethers> cat SimpleStore.asm | ethers-asm
# Same as above
# Setting a define which the ASM file checks and adds a checksum
/home/ethers> ethers-asm --define checksum SimpleStore.asm
0x602a6000556065601160003960656000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f37f10358310d664c9aeb4bf4ce7a10a6a03176bd23194c8ccbd3160a6dac90774d6

View File

@@ -0,0 +1,57 @@
/home/ethers> ethers-asm --disassemble SimpleStore.bin
0000 : 0x2a ; #1
0002 : 0x00 ; #1
0004 : SSTORE
0005 : 0x44 ; #1
0007 : 0x11 ; #1
0009 : 0x00 ; #1
000b : CODECOPY
000c : 0x44 ; #1
000e : 0x00 ; #1
0010 : RETURN
0011 : CALLVALUE
0012 : 0x1e ; #1
0014 : JUMPI
0015 : 0x00 ; #1
0017 : CALLDATALOAD
0018 : 0xe0 ; #1
001a : SHR
001b : DUP1
001c : 0x20965255 ; #4
0021 : EQ
0022 : 0x24 ; #1
0024 : JUMPI
0025 : DUP1
0026 : 0x55241077 ; #4
002b : EQ
002c : 0x30 ; #1
002e : JUMPI
002f*: JUMPDEST
0030 : 0x00 ; #1
0032 : 0x00 ; #1
0034 : REVERT
0035*: JUMPDEST
0036 : 0x00 ; #1
0038 : SLOAD
0039 : 0x00 ; #1
003b : MSTORE
003c : 0x20 ; #1
003e : 0x00 ; #1
0040 : RETURN
0041*: JUMPDEST
0042 : 0x24 ; #1
0044 : CALLDATASIZE
0045 : EQ
0046 : ISZERO
0047 : 0x1e ; #1
0049 : JUMPI
004a : 0x04 ; #1
004c : CALLDATALOAD
004d : 0x00 ; #1
004f : SSTORE
0050 : 0x00 ; #1
0052 : 0x00 ; #1
0054 : RETURN
/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble
# Same as above

14
docs.wrm/cli/asm-help.txt Normal file
View File

@@ -0,0 +1,14 @@
Usage:
ethers-asm [ FILENAME ] [ OPTIONS ]
OPTIONS
--define KEY=VALUE provide assembler defines
--disassemble Disassemble input bytecode
--ignore-warnings Ignore warnings
--pic generate position independent code
--target LABEL output LABEL bytecode (default: _)
OTHER OPTIONS
--debug Show stack traces for errors
--help Show this usage and exit
--version Show this version and exit

View File

@@ -0,0 +1,48 @@
; SimpleStore (uint)
; Set the inital value of 42
sstore(0, 42)
; Init code to deploy myContract
codecopy(0, $myContract, #myContract)
return(0, #myContract)
@myContract {
; Non-payable
jumpi($error, callvalue)
; Get the Sighash
shr({{= 256 - 32 }}, calldataload(0))
; getValue()
dup1
{{= sighash("getValue()") }}
jumpi($getValue, eq)
; setValue(uint)
dup1
{{= sighash("setValue(uint)") }}
jumpi($setValue, eq)
; No matching signature
@error:
revert(0, 0)
@getValue:
mstore(0, sload(0))
return (0, 32)
@setValue:
; Make sure we have exactly a uint
jumpi($error, iszero(eq(calldatasize, 36)))
; Store the value
sstore(0, calldataload(4))
return (0, 0)
; There is no *need* for the PUSH32, it just makes
; decompiled code look nicer
@checksum[
{{= (defines.checksum ? concat([ Opcode.from("PUSH32"), id(myContract.source) ]): "0x") }}
]
}

View File

@@ -0,0 +1,3 @@
0x602a6000556044601160003960446000f334601e5760003560e01c8063209652
0x5514602457806355241077146030575b60006000fd5b60005460005260206000
0xf35b6024361415601e5760043560005560006000f3

81
docs.wrm/cli/asm.wrm Normal file
View File

@@ -0,0 +1,81 @@
_section: Assembler @<cli-asm>
The assembler Command-Line utility allows you to assemble the
[Ethers ASM Dialect](asm-dialect) into deployable EVM bytecode
and disassemle EVM bytecode into human-readable mnemonics.
_subsection: Help
_code: asm-help.txt
_subsection: Example Input Files
_definition: **SimpleStore.asm**
_code: asm-simplestore-asm.txt
_definition: **SimpleStore.bin**
_code: asm-simplestore-bin.txt
_note: Note: Bytecode File Syntax
A bin file may be made up of multiple blocks of bytecode, each may
optionally begin with a ``0x`` prefix, all of which **must** be of
even length (since bytes are required, with 2 nibbles per byte)
All whitespace is ignored.
_subsection: Assembler Examples
The assembler converts an [Ethers ASM Dialect](asm-dialect) into
bytecode by running multiple passes of an assemble stage, each pass
more closely approximating the final result.
This allows small portions of the bytecode to be massaged and tweaked
until the bytecode stablizes. This allows for more compact jump
destinations and for code to be include more advanced meta-programming
techniques.
_code: asm-examples-assemble.txt
_heading: Options
_definition: **-\-define KEY=VALUE** //or// **-\-define FLAG**
This allows key/value pairs (where the value is a string) and
flags (which the value is ``true``) to be passed along to the
assembler, which can be accessed in
[Scripting Blocks](asm-dialect-scripting), such as ``{{= defined.someKey }}``.
_definition: **-\-ignore-warnings**
By default any warning will be treated like an error. This enabled
by-passing warnings.
_definition: **-\-pic**
When a program is assembled, the labels are usually given as an
absolute byte position, which can be jumped to for loops and
control flow. This means that a program must be installed at a specific
location.
Byt specifying the **Position Independent Code** flag, code
will be generated in a way such that all offsets are relative, allowing
the program to be moved without any impact to its logic.
This does incur an additional gsas cost of 8 gas per offset access though.
_definition: **-\-target LABEL**
All programs have a root scope named ``_`` which is by default
assembled. This option allows another labelled target (either a
[[asm-dialect-scope]] or a [[asm-dialect-datasegment]] to be
assembled instead. The entire program is still assembled per usual,
so this only impacts which part of the program is output.
_subsection: Disassembler Examples
A disassembled program shows offsets and mnemonics for the given
bytecode. This format may change in the future to be more
human-readable.
_code: asm-examples-disassemble.txt

View File

@@ -1,12 +1,10 @@
_title: ENS
_section: ENS
_section: Ethereum Naming Service @NAV<ENS>
_subsection: Help
_code: ens-help.txt
_heading: Examples
_subsection: Examples
TODO examples

View File

@@ -1,5 +1,3 @@
_title: Sandbox Utility
_section: Sandbox Utility
The sandbox utility provides a simple way to use the most common
@@ -48,7 +46,7 @@ _heading: Using Mnemonics (with experimental memory-hard passwords) @<cliex-mne
The ``-\-xxx-mnemonic-password`` is similar to the ``-\-mnemonic-password`` options,
which uses a password to decrypt the account for a mnemonic, however it passes
the password through the [scrypt](https:/\/en.wikipedia.org/wiki/Scrypt)
the password through the [scrypt](link-wiki-scrypt)
//password-based key derivation function// first, which is intentionally slow and makes
a brute-force attack far more difficult.

View File

@@ -1,9 +1,8 @@
_title: Command Line Interfaces
_section: Command Line Interfaces
_toc:
ethers
asm
ens
typescript
plugin

View File

@@ -1,6 +1,4 @@
_title: Making Your Own
_section: Making Your Own
_section: Making Your Own @<cli-diy>
The //cli// library is meant to make it easy to create command
line utilities of your own.

View File

@@ -1,5 +1,3 @@
_title: TypeScript
_section: TypeScript
_subsection: Help

View File

@@ -1,5 +1,3 @@
_title: Events
_section: Events
Explain how topics and such work

View File

@@ -1,5 +1,3 @@
_title: Gas
_section: Gas @<gas>
Explain attack vectors

View File

@@ -1,5 +1,3 @@
_title: Concepts
_section: Concepts
This is a very breif overview of some aspects of //Ethereum//

View File

@@ -100,12 +100,11 @@ const getSourceUrl = (function(path, include, exclude) {
if (!def.filename.match(pathCheck)) { return; }
def.defs.forEach((d) => {
if (!d.name.match(match)) { return; }
result.push({ filename: def.filename, lineNo: d.lineNo });
result.push({ filename: def.filename, lineNo: d.lineNo, name: d.name });
});
});
if (result.length > 1) {
throw new Error(`Amibguous TypeScript link: ${ key } in [ ${ result.map((r) => JSON.stringify(r.filename + ":" + r.lineNo)).join(", ") }]`);
throw new Error(`Ambiguous TypeScript link: ${ key } in [ ${ result.map((r) => JSON.stringify(r.filename + ":" + r.lineNo + "@" + r.name)).join(", ") }]`);
} else if (result.length === 0) {
throw new Error(`No matching TypeScript link: ${ key }`);
}
@@ -118,12 +117,93 @@ const getSourceUrl = (function(path, include, exclude) {
module.exports = {
title: "ethers",
foo: "Bat",
subtitle: "v5.0-beta",
logo: "logo.svg",
link: "https://docs-beta.ethers.io",
markdown: {
"banner": "-----\n\nDocumentation: [html](https://docs-beta.ethers.io/)\n\n-----\n\n"
},
getSourceUrl: getSourceUrl
getSourceUrl: getSourceUrl,
externalLinks: {
"link-alchemy": "https:/\/alchemyapi.io",
"link-cloudflare": "https:/\/developers.cloudflare.com/distributed-web/ethereum-gateway/",
"link-ethereum": "https:/\/ethereumorg",
"link-etherscan": "https:/\/etherscan.io",
"link-etherscan-api": "https:/\/etherscan.io/apis",
"link-flatworm": "https:/\/github.com/ricmoo/flatworm",
"link-geth": "https:/\/geth.ethereum.org",
"link-infura": "https:/\/infura.io",
"link-ledger": "https:/\/www.ledger.com",
"link-metamask": "https:/\/metamask.io/",
"link-parity": "https:/\/www.parity.io",
"link-rtd": "https:/\/github.com/readthedocs/sphinx_rtd_theme",
"link-solidity": { name: "Solidity" , url: "https:/\/solidity.readthedocs.io/en/v0.6.2/" },
"link-sphinx": "https:/\/www.sphinx-doc.org/",
"link-legacy-docs3": "https:/\/docs.ethers.io/ethers.js/v3.0/html/",
"link-legacy-docs4": "https:/\/docs.ethers.io/ethers.js",
"link-web3": "https:/\/github.com/ethereum/web3.js",
"link-web3-http": "https:/\/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-http",
"link-web3-ipc": "https:/\/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ipc",
"link-web3-ws": "https:/\/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ws",
"link-solc-output": "https:/\/solidity.readthedocs.io/en/v0.6.0/using-the-compiler.html#output-description",
"link-icap": "https:/\/github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-%28ICAP%29",
"link-jsonrpc": "https:/\/github.com/ethereum/wiki/wiki/JSON-RPC",
"link-mit": "https:/\/en.m.wikipedia.org/wiki/MIT_License",
"link-namehash": "https:/\/docs.ens.domains/contract-api-reference/name-processing#hashing-names",
"link-rlp": { name: "Recursive Length Prefix", url: "https:/\/github.com/ethereum/wiki/wiki/RLP" },
"link-ethersio": "https:/\/ethers.io/",
"link-ethers-docs": "https:/\/docs.ethers.io/",
"link-ethers-js": "https:/\/cdn.ethers.io/lib/ethers-5.0.esm.min.js",
"link-ethers-npm": "https:/\/www.npmjs.com/search?q=%40ethersproject%2F",
"link-ethers-asm-grammar": "https:/\/github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages/asm/grammar.jison",
"link-eip-155": { name: "EIP-155", url: "https:/\/eips.ethereum.org/EIPS/eip-155" },
"link-eip-191": { name: "EIP-191", url: "https:/\/eips.ethereum.org/EIPS/eip-191" },
"link-eip-609": "https:/\/eips.ethereum.org/EIPS/eip-609",
"link-eip-1014": "https:/\/eips.ethereum.org/EIPS/eip-1014",
"link-eip-2098": "https:/\/eips.ethereum.org/EIPS/eip-2098",
"link-bip-39": "https://en.bitcoin.it/wiki/BIP_0039",
"link-bip-32": "https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki",
"link-npm-elliptic": { name: "elliptic", url: "https:/\/www.npmjs.com/package/elliptic" },
"link-npm-bnjs": { name: "BN.js", url: "https:/\/www.npmjs.com/package/bn.js" },
"link-npm-query-bignumber": "https:/\/www.npmjs.com/search?q=bignumber",
"link-js-array": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array",
"link-js-bigint": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt",
"link-js-normalize": { name: "String.normalize", url: "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize" },
"link-js-maxsafe": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER#Description",
"link-js-typedarray": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray",
"link-ricmoo-humanreadableabi": "https:/\/blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917",
"link-wiki-basicauth": { name: "Basic Authentication", url: "https:/\/en.wikipedia.org/wiki/Basic_access_authentication" },
"link-wiki-backoff": { name: "Exponential Backoff", url: "https:/\/en.wikipedia.org/wiki/Exponential_backoff" },
"link-wiki-bloomfilter": { name: "Bloom Filter", url: "https:/\/en.wikipedia.org/wiki/Bloom_filter" },
"link-wiki-cryptographichash": "https:/\/en.wikipedia.org/wiki/Cryptographic_hash_function",
"link-wiki-homoglyph": "https:/\/en.wikipedia.org/wiki/IDN_homograph_attack",
"link-wiki-hmac": "https:/\/en.wikipedia.org/wiki/HMAC",
"link-wiki-iban": "https:/\/en.wikipedia.org/wiki/International_Bank_Account_Number",
"link-wiki-ieee754": "https:/\/en.wikipedia.org/wiki/Double-precision_floating-point_format",
"link-wiki-ripemd": "https:/\/en.m.wikipedia.org/wiki/RIPEMD",
"link-wiki-sha2": "https:/\/en.wikipedia.org/wiki/SHA-2",
"link-wiki-twoscomplement": "https:/\/en.wikipedia.org/wiki/Two%27s_complement",
"link-wiki-unicode-equivalence": "https:/\/en.wikipedia.org/wiki/Unicode_equivalence",
"link-wiki-utf8-overlong": "https:/\/en.wikipedia.org/wiki/UTF-8#Overlong_encodings",
"link-wiki-utf8-replacement": "https:/\/en.wikipedia.org/wiki/Specials_%28Unicode_block%29#Replacement_character",
"link-wiki-scrypt": "https:/\/en.wikipedia.org/wiki/Scrypt",
"link-wiki-sha3": "https:/\/en.wikipedia.org/wiki/SHA-3",
"link-wiki-shuffle": { name: "Fisher-Yates Shuffle", url: "https:/\/en.wikipedia.org/wiki/Fisher-Yates_shuffle" },
"link-wiki-overflow": { name: "overflow", url: "https:/\/en.wikipedia.org/wiki/Integer_overflow" },
"link-wiki-underflow": { name: "arithmetic underflow", url: "https:/\/en.wikipedia.org/wiki/Arithmetic_underflow" },
}
};

View File

@@ -1,5 +1,3 @@
_title: Contributing and Hacking
_section: Contributing and Hacking
The ethers.js library is something that I've written out of necessity,

View File

@@ -1,5 +1,3 @@
_title: Cookbook
_section: Cookbook
Cooking...

View File

@@ -1,13 +1,11 @@
_title: Flatworm Docs
_section: Flatworm Docs
The //Flatworm Docs// rendering script is designed to be **very**
simple, but provide enough formatting necessary for documenting
JavaScript libraries.
A lot of its inspiration came from [Read the Docs](https://github.com/readthedocs/sphinx_rtd_theme) and
the [Sphinx](https://www.sphinx-doc.org/) project.
A lot of its inspiration came from [Read the Docs](link-rtd) and
the [Sphinx](link-sphinx) project.
_subsection: Fragments @<flatworm-fragments>
@@ -75,7 +73,7 @@ a //definition//, the bodies are indented, so a //null// can be
used to reset the indentation.
_heading: Examples
_heading: Examples @<>
_code: examples.txt
@@ -110,6 +108,16 @@ This extended directive function is available for:
- _subsetion
- _heading
_heading: @NAV\<text>
Sets the name in the breadcrumbs when not the current node.
This extended directive function is available for:
- _section
_heading: @SRC\<text>
Calls the configuration ``getSourceUrl(text, VALUE)`` to get a URL which

View File

@@ -1,13 +1,10 @@
_title: Getting Started
_section: Getting Started
_subsection: Installing
The various Classes and Functions are available to be imported
manually from sub-packages under the
[@ethersproject](https://www.npmjs.com/search?q=%40ethersproject%2F)
manually from sub-packages under the [@ethersproject](link-ethers-npm)
but for most projects, the umbrella package is the easiest way to
get started.
@@ -23,8 +20,8 @@ _code: importing-node.source
_heading: Web Browser
It is generally better practice (for security reasons) to copy the
[ethers library](https://cdn.ethers.io/lib/ethers-5.0.esm.min.js) to
your own webserver and serve it yourself.
[ethers library](link-ethers-js) to your own webserver and serve it
yourself.
For quick demos or prototyping though, it can be loaded in your
Web Applications from our CDN.

View File

@@ -1,5 +1,3 @@
_title: Hacking
_section: Hacking
Things to keep in mind:

View File

@@ -1,10 +1,10 @@
_title: Documentation
_section: Documentation
_section: What is ethers?
_subsection: What is Ethers?
The ethers.js library aims to be a complete and compact library for
interacting with the Ethereum Blockchain and its ecosystem. It was
originally designed for use with [ethers.io](https://ethers.io/) and
originally designed for use with [ethers.io](link-ethersio) and
has since expanded into a much more general-purpose library.
_subsection: Features
@@ -17,17 +17,14 @@ _subsection: Features
- 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/),
[Nodesmith](https://nodesmith.io),
[Alchemy](https://alchemyapi.io),
or [MetaMask](https://metamask.io/).
[JSON-RPC](link-jsonrpc), [INFURA](link-infura),
[Etherscan](link-etherscan), [Alchemy](link-alchemy),
[Cloudflare](link-cloudflare) or [MetaMask](link-metamask).
- **ENS names** are first-class citizens; they can be used
anywhere an Ethereum addresses can be used
- **Tiny** (~88kb compressed; 284kb uncompressed)
- **Complete** functionality for all your Ethereum needs
- Extensive [documentation](https://docs.ethers.io/)
- Extensive [documentation](link-ethers-docs)
- Large collection of **test cases** which are maintained and added to
- Fully **TypeScript** ready, with definition files and full
TypeScript source
@@ -56,5 +53,5 @@ _subsection: Legacy Documentation
This section will be kept up to date, linking to documentation of
older versions of the library.
- [version 4.0](https://docs.ethers.io/ethers.js)
- [version 3.0](https://docs.ethers.io/ethers.js/v3.0/html/)
- [version 4.0](link-legacy-docs4)
- [version 3.0](link-legacy-docs3)

View File

@@ -1,11 +1,8 @@
_title: License and Copyright
_section: License and Copyright
_section: License and Copyright @<license>
The ethers library (including all dependencies) are available
under the [MIT License](https://en.m.wikipedia.org/wiki/MIT_License),
which permits a wide variety of uses.
under the [MIT License](link-mit), which permits a wide variety
of uses.
_heading: MIT License

View File

@@ -0,0 +1,8 @@
// v4
new ethers.utils.BigNumber(someValue)
ethers.utils.bigNumberify(someValue);
// v5
// - Constructor is private
// - Removed `bigNumberify`
ethers.BigNumber.from(someValue)

View File

@@ -0,0 +1,7 @@
// v4
ethers.utils.BigNumber
ethers.utils.BigNumberish
// v5
ethers.BigNumber
ethers.BigNumberish

View File

@@ -0,0 +1 @@
TODO

View File

@@ -0,0 +1,29 @@
// v4
ethers.errors.UNKNOWN_ERROR
ethers.errors.*
errors.setCensorship(censorship, permanent)
errors.setLogLevel(logLevel)
errors.checkArgumentCount(count, expectedCount, suffix)
errors.checkNew(self, kind)
errors.checkNormalize()
errors.throwError(message, code, params)
errors.warn(...)
errors.info(...)
// v5
ethers.utils.Logger.errors.UNKNOWN_ERROR
ethers.utils.Logger.errors.*
Logger.setCensorship(censorship, permanent)
Logger.setLogLevel(logLevel)
const logger = new ethers.utils.Logger(version);
logger.checkArgumentCount(count, expectedCount, suffix)
logger.checkNew(self, kind)
logger.checkNormalize()
logger.throwError(message, code, params)
logger.warn(...)
logger.info(...)

View File

@@ -0,0 +1,62 @@
_section: Migration: From Ethers v4 @<migration-v4>
_subsection: BigNumber
_heading: Namespace
Since [[bignumber]] is used quite frequently, it has been moved to
the top level of the umbrella package.
_code: bignumber-namespace.txt
_heading: Creating Instances
The ``bigNumberify`` method was always preferred over the constructor
since it could short-circuit an object instantiation for [[bignumber]
objects (since they are immutable). This has been moved to a static
``from`` class method.
_code: bignumber-creating.txt
_subsection: Contracts
_code: contracts.txt
_subsection: Errors
_heading: Namespace
All errors now belong to the [[logger]] class and the related functions
have been moved to [[logger]] instances, which can include a per-package
version string.
Global error fucntions have been moved [[logger]] class methods.
_code: errors.txt
_subsection: Interface
The [[abi-interface]] object has undergone the most dramatic changes.
It is no longer a meta-class and now has methods that simplify handling
contract interface operations without the need for object inspection and
special edge cases.
_heading: Functions
_code: interface-functions.txt
_heading: Events
_code: interface-events.txt
_heading: Inspection
Interrogating properties about a function or event can now (mostly) be
done directly on the [[abi-fragment]] object.
_code: interface-inspection.txt
_subsection: Utilities
_heading: Renaming
_code: utils.txt
_subsection: Wallet
_heading: Mnemonic Phrases
The **mnemonic** phrase and related properties have been merged into
a single ``mnemonic`` object, which also now includes the ``locale``.
_code: wallet.txt

View File

@@ -0,0 +1,7 @@
// v4 (example: Transfer(address indexed, address indexed, uint256)
interface.events.Transfer.encodeTopics(values)
interface.events.Transfer.decode(data, topics)
// v5
interface.encodeFilterTopics("Transfer", values)
interface.encodeEventLog("Transfer", data, topics)

View File

@@ -0,0 +1,14 @@
// v4 (example: "transfer(address to, uint amount)")
interface.functions.transfer.encode(to, amount)
interface.functions.transfer.decode(callData)
// v5
interface.encodeData("transfer", [ to, amount ])
interface.decodeResult("transfer", data)
// Or you can use any compatible signature or Fragment objects.
// Notice that signature normalization is performed for you,
// e.g. "uint" and "uint256" will be automatically converted
interface.encodeData("transfer(address,uint)", [ to, amount ])
interface.decodeResult("transfer(address to, uint256 amount)", data)

View File

@@ -0,0 +1,48 @@
// v4
interface.functions.transfer.name
interface.functions.transfer.inputs
interface.functions.transfer.outputs
interface.functions.transfer.payable
interface.functions.transfer.gas
// v5
const functionFragment = interface.getFunction("transfer")
functionFragment.name
functionFragment.inputs
functionFragment.outputs
functionFragment.payable
functionFragment.gas
// v4; type is "call" or "transaction"
interface.functions.transfer.type
// v5; constant is true (i.e. "call") or false (i.e. "transaction")
functionFragment.constant
// v4
interface.events.Transfer.anonymous
interface.events.Transfer.inputs
interface.events.Transfer.name
// v5
const eventFragment = interface.getEvent("Transfer");
eventFragment.anonymous
eventFragment.inputs
eventFragment.name
// v4
const functionSig = interface.functions.transfer.signature
const sighash = interface.functions.transfer.sighash
const eventSig = interface.events.Transfer.signature
const topic = interface.events.Transfer.topic
// v5
const functionSig = functionFragment.format()
const sighash = interface.getSighash(functionFragment)
const eventSig = eventFragment.format()
const topic = interface.getTopic(eventFragment)

View File

@@ -0,0 +1 @@
TODO

View File

@@ -0,0 +1,9 @@
// v4
wallet.mnemonic
wallet.path
// v5
// - Mnemonic phrase and path are a Mnemonic object
// - Note: wallet.mnemonic is null if there is no mnemonic
wallet.mnemonic.phrase
wallet.mnemonic.path

View File

@@ -1,13 +1,8 @@
_title: Migration Guide
_section: Migration Guide @<migration>
_section: Migration Guide
Here are some migration guides when upgrading from older versions
of Ethers or other libraries.
Migratimg...
_subsection: From Web3
test
_subsection: From ethers v4
test
_toc:
web3
ethers-v4

View File

@@ -0,0 +1,13 @@
_section: Migration: From Web3.js
TODO
_subsection: Contracts
_subsection: Providers
_subsection: Numbers
_subsection: Utilities

View File

@@ -1,5 +1,3 @@
_title: Testing
_section: Testing
Here goes info about testing

View File

@@ -4,14 +4,18 @@ Documentation: [html](https://docs-beta.ethers.io/)
-----
Documentation
=============
What is ethers?
===============
What is Ethers?
---------------
The ethers.js library aims to be a complete and compact library for
interacting with the Ethereum Blockchain and its ecosystem. It was
originally designed for use with [ethers.io](https://ethers.io/) and
originally designed for use with [ethers.io](Users/ricmoo/Development/ethers/ethers.js-v5/https:/ethers.io) and
has since expanded into a much more general-purpose library.
@@ -25,11 +29,11 @@ Features
* Import and export **JSON wallets** (Geth, Parity and crowdsale)
* Import and export BIP 39 **mnemonic phrases** (12 word backup phrases) and HD Wallets (English, Italian, Japanese, Korean, Simplified Chinese, Traditional Chinese; more coming soon)
* Meta-classes create JavaScript objects from any contract ABI, including **ABIv2** and **Human-Readable ABI**
* Connect to Ethereum nodes over [JSON-RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC), [INFURA](https://infura.io/), [Etherscan](https://etherscan.io/), [Nodesmith](https://nodesmith.io), [Alchemy](https://alchemyapi.io), or [MetaMask](https://metamask.io/).
* Connect to Ethereum nodes over [JSON-RPC](Users/ricmoo/Development/ethers/ethers.js-v5/https:/github.com/ethereum/wiki/wiki/JSON-RPC), [INFURA](Users/ricmoo/Development/ethers/ethers.js-v5/https:/infura.io), [Etherscan](Users/ricmoo/Development/ethers/ethers.js-v5/https:/etherscan.io), [Alchemy](Users/ricmoo/Development/ethers/ethers.js-v5/https:/alchemyapi.io), [Cloudflare](Users/ricmoo/Development/ethers/ethers.js-v5/https:/developers.cloudflare.com/distributed-web/ethereum-gateway) or [MetaMask](Users/ricmoo/Development/ethers/ethers.js-v5/https:/metamask.io).
* **ENS names** are first-class citizens; they can be used anywhere an Ethereum addresses can be used
* **Tiny** (~88kb compressed; 284kb uncompressed)
* **Complete** functionality for all your Ethereum needs
* Extensive [documentation](https://docs.ethers.io/)
* Extensive [documentation](Users/ricmoo/Development/ethers/ethers.js-v5/https:/docs.ethers.io)
* Large collection of **test cases** which are maintained and added to
* Fully **TypeScript** ready, with definition files and full TypeScript source
* **MIT License** (including *ALL* dependencies); completely open source to do with as you please
@@ -50,11 +54,24 @@ Developer Documentation
* [Gas Price](concepts/gas)
* [Gas Limit](concepts/gas)
* [Application Programming Interface](api)
* [Contracts](api/contract)
* [Buckets](api/contract)
* [Contract Interaction](api/contract)
* [Contract](api/contract/contract)
* [Properties](api/contract/contract)
* [Methods](api/contract/contract)
* [Events](api/contract/contract)
* [Meta-Class](api/contract/contract)
* [Example: ERC-20 Contract](api/contract/example)
* [Connecting to a Contract](api/contract/example)
* [Properties ^^//(inheritted from [[contract]])//^^](api/contract/example)
* [Methods ^^//(inheritted from [[contract]])//^^](api/contract/example)
* [Events ^^//(inheritted from Contract)//^^](api/contract/example)
* [Meta-Class Methods ^^//(added at Runtime)//^^](api/contract/example)
* [Meta-Class Filters ^^//(added at Runtime)//^^](api/contract/example)
* [Signers](api/signer)
* [Signer](api/signer)
* [Wallet inherits Signer](api/signer)
* [Wallet](api/signer)
* [VoidSigner](api/signer)
* [ExternallyOwnedAccount](api/signer)
* [Providers](api/providers)
* [Provider](api/providers/provider)
* [Accounts Methods](api/providers/provider)
@@ -65,25 +82,48 @@ Developer Documentation
* [Transactions Methods](api/providers/provider)
* [Event Emitter Methods](api/providers/provider)
* [Inspection Methods](api/providers/provider)
* [JSON-RPC Provider](api/providers/jsonrpc-provider)
* [JsonRpcProvider](api/providers/jsonrpc-provider)
* [JsonRpcProvider](api/providers/jsonrpc-provider)
* [JsonRpcSigner](api/providers/jsonrpc-provider)
* [JsonRpcUncheckedSigner](api/providers/jsonrpc-provider)
* [API Providers](api/providers/api-providers)
* [EtherscanProvider](api/providers/api-providers)
* [InfuraProvider](api/providers/api-providers)
* [NodesmithProvider](api/providers/api-providers)
* [AlchemyProvider](api/providers/api-providers)
* [CloudfrontProvider](api/providers/api-providers)
* [Other Providers](api/providers/other)
* [FallbackProvider](api/providers/other)
* [IpcProvider](api/providers/other)
* [UrlJsonRpcProvider](api/providers/other)
* [Web3Provider](api/providers/other)
* [Types](api/providers/types)
* [Blocks](api/providers/types)
* [BlockTag](api/providers/types)
* [Network](api/providers/types)
* [Block](api/providers/types)
* [Events and Logs](api/providers/types)
* [Transactions](api/providers/types)
* [Utilities](api/utils)
* [Application Binary Interface](api/utils/abi)
* [Interface](api/utils/abi/interface)
* [Creating Instances](api/utils/abi/interface)
* [Properties](api/utils/abi/interface)
* [Formatting](api/utils/abi/interface)
* [Fragment Access](api/utils/abi/interface)
* [Signature and Topic Hashes](api/utils/abi/interface)
* [Encoding Data](api/utils/abi/interface)
* [Decoding Data](api/utils/abi/interface)
* [Parsing](api/utils/abi/interface)
* [Types](api/utils/abi/interface)
* [Specifying Fragments](api/utils/abi/interface)
* [Fragments](api/utils/abi/fragments)
* [Formats](api/utils/abi/fragments)
* [Fragment](api/utils/abi/fragments)
* [ConstructorFragment](api/utils/abi/fragments)
* [EventFragment](api/utils/abi/fragments)
* [FunctionFragment](api/utils/abi/fragments)
* [ParamType](api/utils/abi/fragments)
* [Addresses](api/utils/address)
* [Address Formats](api/utils/address)
* [Functions](api/utils/address)
* [BigNumber](api/utils/bignumber)
* [Types](api/utils/bignumber)
* [Creating Instances](api/utils/bignumber)
@@ -96,6 +136,7 @@ Developer Documentation
* [Array Manipulation](api/utils/bytes)
* [Hexstring Manipulation](api/utils/bytes)
* [Signature Conversion](api/utils/bytes)
* [Random Bytes](api/utils/bytes)
* [Constants](api/utils/constants)
* [Bytes](api/utils/constants)
* [Strings](api/utils/constants)
@@ -103,28 +144,104 @@ Developer Documentation
* [Display Logic and Input](api/utils/display-logic)
* [Units](api/utils/display-logic)
* [Functions](api/utils/display-logic)
* [Encoding Utilities](api/utils/encoding)
* [Base58](api/utils/encoding)
* [Base64](api/utils/encoding)
* [Recursive-Length Prefix](api/utils/encoding)
* [FixedNumber](api/utils/fixednumber)
* [Types](api/utils/fixednumber)
* [Creating Instances](api/utils/fixednumber)
* [Properties](api/utils/fixednumber)
* [Methods](api/utils/fixednumber)
* [FixedFormat](api/utils/fixednumber)
* [Hashing Algorithms](api/utils/hashing)
* [Cryptographic Hashing](api/utils/hashing)
* [Common Hashing Helpers](api/utils/hashing)
* [Solidity Hashing Algorithms](api/utils/hashing)
* [HD Wallet](api/utils/hdnode)
* [Types](api/utils/hdnode)
* [HDNode](api/utils/hdnode)
* [Other Functions](api/utils/hdnode)
* [Logging](api/utils/logger)
* [Logger](api/utils/logger)
* [Errors](api/utils/logger)
* [Log Levels](api/utils/logger)
* [Property Utilities](api/utils/properties)
* [Signing Key](api/utils/signing-key)
* [Other Functions](api/utils/signing-key)
* [Strings](api/utils/strings)
* [Bytes32String](api/utils/strings)
* [UTF-8 Strings](api/utils/strings)
* [UnicodeNormalizationForm](api/utils/strings)
* [Custom UTF-8 Error Handling](api/utils/strings)
* [Transactions](api/utils/transactions)
* [Types](api/utils/transactions)
* [Functions](api/utils/transactions)
* [Web Utilities](api/utils/web)
* [Wordlists](api/utils/wordlists)
* [Wordlist](api/utils/wordlists)
* [Languages](api/utils/wordlists)
* [Other Libraries](api/other)
* [Assembly](api/other/assembly)
* [Ethers ASM Dialect](api/other/assembly/dialect)
* [Opcodes](api/other/assembly/dialect)
* [Labels](api/other/assembly/dialect)
* [Literals](api/other/assembly/dialect)
* [Comments](api/other/assembly/dialect)
* [Scopes](api/other/assembly/dialect)
* [Data Segment](api/other/assembly/dialect)
* [Links](api/other/assembly/dialect)
* [Stack Placeholders](api/other/assembly/dialect)
* [Evaluation and Excution](api/other/assembly/dialect)
* [Utilities](api/other/assembly/api)
* [Assembler](api/other/assembly/api)
* [Disassembler](api/other/assembly/api)
* [Opcode](api/other/assembly/api)
* [Abstract Syntax Tree](api/other/assembly/ast)
* [Types](api/other/assembly/ast)
* [Nodes](api/other/assembly/ast)
* [Hardware Wallets](api/other/hardware)
* [LedgerSigner](api/other/hardware)
* [Command Line Interfaces](cli)
* [Sandbox Utility](cli/ethers)
* [Help](cli/ethers)
* [Examples](cli/ethers)
* [Assembler](cli/asm)
* [Help](cli/asm)
* [Example Input Files](cli/asm)
* [Assembler Examples](cli/asm)
* [Disassembler Examples](cli/asm)
* [Ethereum Naming Service](cli/ens)
* [Help](cli/ens)
* [Examples](cli/ens)
* [TypeScript](cli/typescript)
* [Help](cli/typescript)
* [Examples](cli/typescript)
* [Making Your Own](cli/plugin)
* [CLI](cli/plugin)
* [Plugin](cli/plugin)
* [ArgParser](cli/plugin)
* [Cookbook](cookbook)
* [Migration Guide](migration)
* [From Web3](migration)
* [From ethers v4](migration)
* [Migration: From Web3.js](migration/web3)
* [Contracts](migration/web3)
* [Providers](migration/web3)
* [Numbers](migration/web3)
* [Utilities](migration/web3)
* [Migration: From Ethers v4](migration/ethers-v4)
* [BigNumber](migration/ethers-v4)
* [Contracts](migration/ethers-v4)
* [Errors](migration/ethers-v4)
* [Interface](migration/ethers-v4)
* [Utilities](migration/ethers-v4)
* [Wallet](migration/ethers-v4)
* [Testing](testing)
* [Contributing and Hacking](contributing)
* [Building](contributing)
* [Flatworm Docs](documentation)
* [Fragments](documentation)
* [Markdown](documentation)
* [Configuration](documentation)
* [Extended Directive Functions](documentation)
* [License and Copyright](license)
@@ -137,10 +254,10 @@ older versions of the library.
* [version 4.0](https://docs.ethers.io/ethers.js)
* [version 3.0](https://docs.ethers.io/ethers.js/v3.0/html/)
* [version 4.0](Users/ricmoo/Development/ethers/ethers.js-v5/https:/docs.ethers.io/ethers.js)
* [version 3.0](Users/ricmoo/Development/ethers/ethers.js-v5/https:/docs.ethers.io/ethers.js/v3.0/html)
-----
**Content Hash:** f1da4df3feeb06a567657ae41d8498ea3315f68d05dc2f9e86c2858b5d2b2f89
**Content Hash:** 1ccc27c4ba6e59efa2be69cc0fb345ea9c397f1f4444d08ec13780d0d1a46b60

View File

@@ -4,19 +4,31 @@ Documentation: [html](https://docs-beta.ethers.io/)
-----
Application Programming Interface (API)
=======================================
Application Programming Interface
=================================
Here...
* [Contracts](contract)
* [Buckets](contract)
* [Contract Interaction](contract)
* [Contract](contract/contract)
* [Properties](contract/contract)
* [Methods](contract/contract)
* [Events](contract/contract)
* [Meta-Class](contract/contract)
* [Example: ERC-20 Contract](contract/example)
* [Connecting to a Contract](contract/example)
* [Properties ^^//(inheritted from [[contract]])//^^](contract/example)
* [Methods ^^//(inheritted from [[contract]])//^^](contract/example)
* [Events ^^//(inheritted from Contract)//^^](contract/example)
* [Meta-Class Methods ^^//(added at Runtime)//^^](contract/example)
* [Meta-Class Filters ^^//(added at Runtime)//^^](contract/example)
* [Signers](signer)
* [Signer](signer)
* [Wallet inherits Signer](signer)
* [Wallet](signer)
* [VoidSigner](signer)
* [ExternallyOwnedAccount](signer)
* [Providers](providers)
* [Provider](providers/provider)
* [Accounts Methods](providers/provider)
@@ -27,25 +39,48 @@ Here...
* [Transactions Methods](providers/provider)
* [Event Emitter Methods](providers/provider)
* [Inspection Methods](providers/provider)
* [JSON-RPC Provider](providers/jsonrpc-provider)
* [JsonRpcProvider](providers/jsonrpc-provider)
* [JsonRpcProvider](providers/jsonrpc-provider)
* [JsonRpcSigner](providers/jsonrpc-provider)
* [JsonRpcUncheckedSigner](providers/jsonrpc-provider)
* [API Providers](providers/api-providers)
* [EtherscanProvider](providers/api-providers)
* [InfuraProvider](providers/api-providers)
* [NodesmithProvider](providers/api-providers)
* [AlchemyProvider](providers/api-providers)
* [CloudfrontProvider](providers/api-providers)
* [Other Providers](providers/other)
* [FallbackProvider](providers/other)
* [IpcProvider](providers/other)
* [UrlJsonRpcProvider](providers/other)
* [Web3Provider](providers/other)
* [Types](providers/types)
* [Blocks](providers/types)
* [BlockTag](providers/types)
* [Network](providers/types)
* [Block](providers/types)
* [Events and Logs](providers/types)
* [Transactions](providers/types)
* [Utilities](utils)
* [Application Binary Interface](utils/abi)
* [Interface](utils/abi/interface)
* [Creating Instances](utils/abi/interface)
* [Properties](utils/abi/interface)
* [Formatting](utils/abi/interface)
* [Fragment Access](utils/abi/interface)
* [Signature and Topic Hashes](utils/abi/interface)
* [Encoding Data](utils/abi/interface)
* [Decoding Data](utils/abi/interface)
* [Parsing](utils/abi/interface)
* [Types](utils/abi/interface)
* [Specifying Fragments](utils/abi/interface)
* [Fragments](utils/abi/fragments)
* [Formats](utils/abi/fragments)
* [Fragment](utils/abi/fragments)
* [ConstructorFragment](utils/abi/fragments)
* [EventFragment](utils/abi/fragments)
* [FunctionFragment](utils/abi/fragments)
* [ParamType](utils/abi/fragments)
* [Addresses](utils/address)
* [Address Formats](utils/address)
* [Functions](utils/address)
* [BigNumber](utils/bignumber)
* [Types](utils/bignumber)
* [Creating Instances](utils/bignumber)
@@ -58,6 +93,7 @@ Here...
* [Array Manipulation](utils/bytes)
* [Hexstring Manipulation](utils/bytes)
* [Signature Conversion](utils/bytes)
* [Random Bytes](utils/bytes)
* [Constants](utils/constants)
* [Bytes](utils/constants)
* [Strings](utils/constants)
@@ -65,20 +101,65 @@ Here...
* [Display Logic and Input](utils/display-logic)
* [Units](utils/display-logic)
* [Functions](utils/display-logic)
* [Encoding Utilities](utils/encoding)
* [Base58](utils/encoding)
* [Base64](utils/encoding)
* [Recursive-Length Prefix](utils/encoding)
* [FixedNumber](utils/fixednumber)
* [Types](utils/fixednumber)
* [Creating Instances](utils/fixednumber)
* [Properties](utils/fixednumber)
* [Methods](utils/fixednumber)
* [FixedFormat](utils/fixednumber)
* [Hashing Algorithms](utils/hashing)
* [Cryptographic Hashing](utils/hashing)
* [Common Hashing Helpers](utils/hashing)
* [Solidity Hashing Algorithms](utils/hashing)
* [HD Wallet](utils/hdnode)
* [Types](utils/hdnode)
* [HDNode](utils/hdnode)
* [Other Functions](utils/hdnode)
* [Logging](utils/logger)
* [Logger](utils/logger)
* [Errors](utils/logger)
* [Log Levels](utils/logger)
* [Property Utilities](utils/properties)
* [Signing Key](utils/signing-key)
* [Other Functions](utils/signing-key)
* [Strings](utils/strings)
* [Bytes32String](utils/strings)
* [UTF-8 Strings](utils/strings)
* [UnicodeNormalizationForm](utils/strings)
* [Custom UTF-8 Error Handling](utils/strings)
* [Transactions](utils/transactions)
* [Types](utils/transactions)
* [Functions](utils/transactions)
* [Web Utilities](utils/web)
* [Wordlists](utils/wordlists)
* [Wordlist](utils/wordlists)
* [Languages](utils/wordlists)
* [Other Libraries](other)
* [Assembly](other/assembly)
* [Ethers ASM Dialect](other/assembly/dialect)
* [Opcodes](other/assembly/dialect)
* [Labels](other/assembly/dialect)
* [Literals](other/assembly/dialect)
* [Comments](other/assembly/dialect)
* [Scopes](other/assembly/dialect)
* [Data Segment](other/assembly/dialect)
* [Links](other/assembly/dialect)
* [Stack Placeholders](other/assembly/dialect)
* [Evaluation and Excution](other/assembly/dialect)
* [Utilities](other/assembly/api)
* [Assembler](other/assembly/api)
* [Disassembler](other/assembly/api)
* [Opcode](other/assembly/api)
* [Abstract Syntax Tree](other/assembly/ast)
* [Types](other/assembly/ast)
* [Nodes](other/assembly/ast)
* [Hardware Wallets](other/hardware)
* [LedgerSigner](other/hardware)
-----
**Content Hash:** 82f760f38f47d32016d3fca512c5dc75539d885d13138f1faa15f4be82edf8aa
**Content Hash:** 792936ddc8c609e435d356c2bfde1adacf9f0b5b708481720f22081f1a61f73d

View File

@@ -4,20 +4,27 @@ Documentation: [html](https://docs-beta.ethers.io/)
-----
Contracts
=========
Contract Interaction
====================
Explain what contracts are...
Buckets
-------
* [Contract](contract)
* [Properties](contract)
* [Methods](contract)
* [Events](contract)
* [Meta-Class](contract)
* [Example: ERC-20 Contract](example)
* [Connecting to a Contract](example)
* [Properties ^^//(inheritted from [[contract]])//^^](example)
* [Methods ^^//(inheritted from [[contract]])//^^](example)
* [Events ^^//(inheritted from Contract)//^^](example)
* [Meta-Class Methods ^^//(added at Runtime)//^^](example)
* [Meta-Class Filters ^^//(added at Runtime)//^^](example)
-----
**Content Hash:** 190c93691014eae64ffcb66549f127aa73f4645fc7a4b3a2be9ae00216c79cf6
**Content Hash:** f1a5079be018a7b2e6ce8b86a5a191f7a1352b976434766ea16cec21d0ce3b80

View File

@@ -0,0 +1,284 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
-----
Contract
========
Properties
----------
#### *contract* . **address** **=>** *string< [Address](../../utils/address) >*
This is the address (or ENS name) the contract was constructed with.
#### *contract* . **addressPromise** **=>** *string< [Address](../../utils/address) >*
This is a promise that will resolve to the address the **Contract**
object is attached to. If an [Address](../../utils/address) was provided to the constructor,
it will be equal to this; if an ENS name was provided, this will be the
resolved address.
#### *contract* . **deployTransaction** **=>** *[TransactionResponse](../../providers/types)*
If the **Contract** object is the result of a ContractFactory deployment,
this is the transaction which was used to deploy the contract.
#### *contract* . **interface** **=>** *[Interface](../../utils/abi/interface)*
This is the ABI as an [Interface](../../utils/abi/interface).
#### *contract* . **provider** **=>** *[Provider](../../providers/provider)*
If a provider was provided to the constructor, this is that provider. If
a signer was provided that had a [Provider](../../providers/provider), this is that provider.
#### *contract* . **signer** **=>** *[Signer](../../signer)*
If a signer was provided to the constructor, this is that signer.
Methods
-------
#### *contract* . **attach** ( addressOrName ) **=>** *[Contract](./)*
Returns a new instance of the **Contract** attached to a new
address. This is useful if there are multiple similar or identical
copies of a Contract on the network and you wish to interact with
each of them.
#### *contract* . **connect** ( providerOrSigner ) **=>** *[Contract](./)*
Returns a new instance of the Contract, but connected to
*providerOrSigner*.
By passing in a [Provider](../../providers/provider), this will return a downgraded
**Contract** which only has read-only access (i.e. constant calls).
By passing in a [Signer](../../signer). the will return a **Contract** which
will act on behalf of that signer.
#### *contract* . **deployed** ( ) **=>** *Promise< [Contract](./) >*
#### *Contract* . **isIndexed** ( value ) **=>** *boolean*
Events
------
#### *contract* . **queryFilter** ( event [ , fromBlockOrBlockHash [ , toBlock ] ) **=>** *Promise< Array< Event > >*
Return Events that match the *event*.
#### *contract* . **listenerCount** ( [ event ] ) **=>** *number*
Return the number of listeners that are subscribed to *event*. If
no event is provided, returns the total count of all events.
#### *contract* . **listeners** ( event ) **=>** *Array< Listener >*
Return a list of listeners that are subscribed to *event*.
#### *contract* . **off** ( event , listener ) **=>** *this*
Unsubscribe *listener* to *event*.
#### *contract* . **on** ( event , listener ) **=>** *this*
Subscribe to *event* calling *listener* when the event occurs.
#### *contract* . **once** ( event , listener ) **=>** *this*
Subscribe once to *event* calling *listener* when the event
occurs.
#### *contract* . **removeAllListeners** ( [ event ] ) **=>** *this*
Unsubscribe all listeners for *event*. If no event is provided,
all events are unsubscribed.
Meta-Class
----------
A Meta-Class is a Class which has any of its properties determined
at run-time. The **Contract** object uses a Contract's ABI to
determine what methods are available, so the following sections
describe the generic ways to interact with the properties added
at run-time during the **Contract** constructor.
### Read-Only Methods (constant)
A constant method is read-only and evaluates a small amount of EVM
code against the current blockchain state and can be computed by
asking a single node, which can return a result. It is therefore
free and does not require any ether, but **cannot make changes** to
the blockchain state..
#### *contract* . **METHOD_NAME** ( ...args [ overrides ] ) **=>** *Promise< any >*
The type of the result depends on the ABI.
For values that have a simple meaning in JavaScript, the types are fairly
straight forward; strings and booleans are returned as JavaScript strings
and booleans.
For numbers, if the **type** is in the JavaSsript safe range (i.e. less
than 53 bits, such as an `int24` or `uint48`) a normal JavaScript
number is used. Otherwise a [BigNumber](../../utils/bignumber) is returned.
For bytes (both fixed length and dynamic), a [DataHexstring](../../utils/bytes) is returned.
### Write Methods (non-constant)
A non-constant method requires a transaction to be signed and requires
payment in the form of a fee to be paid to a miner. This transaction
will be verified by every node on the entire network as well by the
miner who will compute the new state of the blockchain after executing
it against the current state.
It cannot return a result. If a result is required, it should be logged
using a Solidity event (or EVM log), which can then be queried from the
transaction receipt.
#### *contract* . **METHOD_NAME** ( ...args [ , overrides ] ) **=>** *Promise< [TransactionResponse](../../providers/types) >*
Returns a [TransactionResponse](../../providers/types) for the transaction after
it is sent to the network. This requires the **Contract** has a
signer.
### Write Methods Analysis
There are secveral options to analyze properties and results of a
write method without actually executing it.
#### *contract* . *estimate* . **METHOD_NAME** ( ...args [ , overrides ] ) **=>** *Promise< [BigNumber](../../utils/bignumber) >*
Returns the estimate units of gas that would be required to
execute the *METHOD_NAME* with *args* and *overrides*.
#### *contract* . *populateTransaction* . **METHOD_NAME** ( ...args [ , overrides ] ) **=>** *Promise< [UnsignedTx](../../utils/transactions) >*
Returns an [UnsignedTransaction](../../utils/transactions) which represents the transaction
that would need to be signed and submitted to the network to execute
*METHOD_NAME* with *args/ and *overrides//.
#### *contract* . *staticCall* . **METHOD_NAME** ( ...args [ , overrides ] ) **=>** *Promise< any >*
Rather than executing the state-change of a transaction, it is possible
to ask a node to *pretend* that a call is not state-changing and
return the result.
This does not actually chagne any state, but is free. This in some cases
can be used to determine if a transaction will fail or succeed.
This otherwise functions the same as a [Read-Only Method](./).
### Event Filters
An event filter is made up of topics, which are values logged in a
[Bloom Filter](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/en.wikipedia.org/wiki/Bloom_filter), allowing efficient searching for entries
which match a filter.
#### *contract* . *filters* . **EVENT_NAME** ( ...args ) **=>** *Filter*
Return a filter for *EVENT_NAME*, optionally filtering by additional
constraints.
Only `indexed` event parameters may be filtered. If a parameter is
null (or not provided) then any value in that field matches.
-----
**Content Hash:** 8f1f64a28b2501d01dcf4b55c405c43096f3a9daca7169a96022000a315b2ef2

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

40
docs/api/other/README.md Normal file
View File

@@ -0,0 +1,40 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
-----
Other Libraries
===============
Now that ethers is more modular, it is possible to have additional
ancillary packages, which are not part of the core but optionally
add functionality only needed in certain situations.
* [Assembly](assembly)
* [Ethers ASM Dialect](assembly/dialect)
* [Opcodes](assembly/dialect)
* [Labels](assembly/dialect)
* [Literals](assembly/dialect)
* [Comments](assembly/dialect)
* [Scopes](assembly/dialect)
* [Data Segment](assembly/dialect)
* [Links](assembly/dialect)
* [Stack Placeholders](assembly/dialect)
* [Evaluation and Excution](assembly/dialect)
* [Utilities](assembly/api)
* [Assembler](assembly/api)
* [Disassembler](assembly/api)
* [Opcode](assembly/api)
* [Abstract Syntax Tree](assembly/ast)
* [Types](assembly/ast)
* [Nodes](assembly/ast)
* [Hardware Wallets](hardware)
* [LedgerSigner](hardware)
-----
**Content Hash:** 90507a9035452f2463c81dc6ce204622750f4781dd52673cf666afae6e607577

View File

@@ -0,0 +1,33 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
-----
Assembly
========
* [Ethers ASM Dialect](dialect)
* [Opcodes](dialect)
* [Labels](dialect)
* [Literals](dialect)
* [Comments](dialect)
* [Scopes](dialect)
* [Data Segment](dialect)
* [Links](dialect)
* [Stack Placeholders](dialect)
* [Evaluation and Excution](dialect)
* [Utilities](api)
* [Assembler](api)
* [Disassembler](api)
* [Opcode](api)
* [Abstract Syntax Tree](ast)
* [Types](ast)
* [Nodes](ast)
-----
**Content Hash:** c29497e2f7fe90669ffd6c67b0231649074fcb869470caa58750ddbc39905727

View File

@@ -0,0 +1,184 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
-----
Utilities
=========
Assembler
---------
The assembler utilities allow parsing and assembling an
[Ethers ASM Dialect](../dialect) source file.
#### *asm* . **parse** ( code ) **=>** *[Node](../ast)*
Parse an ethers-format assembly file and return the [Abstract Syntax Tree](../ast).
#### *asm* . **assemble** ( node ) **=>** *string< [DataHexstring](../../../utils/bytes) >*
Performs assembly of the [Abstract Syntax Tree](../ast) *node* and return the
resulting bytecode representation.
Disassembler
------------
The **Disassembler** utilities make it easy to convert bytecode
into an object which can easily be examined for program structure.
#### *asm* . **disassemble** ( bytecode ) **=>** *[Bytecode](./)*
Returns an array of Operations given *bytecode*.
#### *asm* . **formatBytecode** ( operations ) **=>** *string*
Create a formatted output of an array of [Operation](./).
### Bytecode
Each arary index represents an operation, collapsing multi-byte operations
(i.e. `PUSH`) into a single operation.
#### *bytecode* . **getOperation** ( offset ) **=>** *[Operation](./)*
Get the operation at a given *offset* into the bytecode. This ensures that
the byte at *offset* is an operation and not data contained within a `PUSH`,
in which case null it returned.
### Operation
An **Operation** is a single command from a disassembled bytecode
stream.
#### *operation* . **opcode** **=>** *[Opcode](./)*
The opcode for this Operation.
#### *operation* . **offset** **=>** *number*
The offset into the bytecode for this Operation.
#### *operation* . **pushValue** **=>** *string< [DataHexstring](../../../utils/bytes) >*
If the opcode is a `PUSH`, this is the value of that push
Opcode
------
#### *asm* . *Opcode* . **from** ( valueOrMnemonic ) **=>** *[Opcode](./)*
Create a new instnace of an Opcode for a given numeric value
(e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1").
### Properties
#### *opcode* . **value** **=>** *number*
The value (bytecode as a number) of this opcode.
#### *opcode* . **mnemonic** **=>** *string*
The mnemonic string of this opcode.
#### *opcode* . **delta** **=>** *number*
The number of items this opcode will consume from the stack.
#### *opcode* . **alpha** **=>** *number*
The number of items this opcode will push onto the stack.
#### *opcode* . **doc** **=>** *string*
A short description of what this opcode does.
#### *opcode* . **isMemory** ( ) **=>** *"read"|"write"|"full"*
Returns true if the opcode accesses memory.
#### *opcode* . **isStatic** ( ) **=>** *boolean*
Returns true if the opcode cannot change state.
#### *opcode* . **isJump** ( ) **=>** *boolean*
Returns true if the opcode is a jumper operation.
#### *opcode* . **isPush** ( ) **=>** *number*
Returns 0 if the opcode is not a `PUSH*`, or the number
of bytes this opcode will push if it is.
-----
**Content Hash:** d71fdeafad470effc353664c161dec6982a9c29b1015a5726fd2a3f576f8e377

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
-----
Documentation: [html](https://docs-beta.ethers.io/)
-----
Hardware Wallets
================
LedgerSigner
------------
The [Ledger Hardware Wallets](../../../Users/ricmoo/Development/ethers/ethers.js-v5/https:/www.ledger.com) are a fairly
popular brand.
TODO: importing
### API
#### **new** **LedgerSigner** ( [ provider [ , type [ , path ] ] ] ) **=>** *[LedgerSigner](./)*
Connects to a Ledger Hardware Wallet. The *type* if left unspecified is
determined by the environment; in node the default is "hid" and in the browser
"u2f" is the default. The default Ethereum path is used if *path* is left unspecified.
-----
**Content Hash:** 04412211499f34796f91e7112977e6f84607638be72dc600e488df07c4465805

File diff suppressed because one or more lines are too long

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