forked from tornado-packages/ethers.js
Compare commits
1319 Commits
v5.0.0-bet
...
v5.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dad3829c2e | ||
|
|
de4d683f6d | ||
|
|
ebe4cc90f5 | ||
|
|
35e3bf9d11 | ||
|
|
2d717dcef8 | ||
|
|
3316468e3e | ||
|
|
5144acf456 | ||
|
|
aadc5cd3d6 | ||
|
|
6e088099ad | ||
|
|
b6370f1360 | ||
|
|
26464c5425 | ||
|
|
37a9c77ab2 | ||
|
|
483d67f55c | ||
|
|
987bec87af | ||
|
|
a9cdbe1238 | ||
|
|
4e9abfdee4 | ||
|
|
3bb5fbf533 | ||
|
|
cadccc3060 | ||
|
|
65196097f6 | ||
|
|
8e22e0260e | ||
|
|
de7da421b3 | ||
|
|
a9f7957550 | ||
|
|
bd2d44eecf | ||
|
|
bd05aed070 | ||
|
|
ce8f1e4015 | ||
|
|
58488e78f9 | ||
|
|
29116593ba | ||
|
|
51f0e1a52f | ||
|
|
c086962302 | ||
|
|
c0daf437f7 | ||
|
|
8eaeba35f5 | ||
|
|
4a44865a8c | ||
|
|
725fe0aa32 | ||
|
|
08adc18a68 | ||
|
|
1fcf4b6ce6 | ||
|
|
7c8ae9cfcb | ||
|
|
0cd5fccfad | ||
|
|
53ee187443 | ||
|
|
4577444c44 | ||
|
|
1cb3199e5c | ||
|
|
25c3024a89 | ||
|
|
ae0d5eb7c2 | ||
|
|
b8df000c8f | ||
|
|
eb1ec2f231 | ||
|
|
b65508995c | ||
|
|
2a7dbf0571 | ||
|
|
0dc6f4a45b | ||
|
|
2534b1b3b2 | ||
|
|
a11602d066 | ||
|
|
bec066bcb5 | ||
|
|
ef5a2b4baa | ||
|
|
9e273220b6 | ||
|
|
d55ab6d4e6 | ||
|
|
1a7c4e89ef | ||
|
|
c84a5e62f5 | ||
|
|
6978cca17d | ||
|
|
0e3016bfae | ||
|
|
d50b2d7e65 | ||
|
|
941e4210c6 | ||
|
|
3b1d3fcee6 | ||
|
|
81fd628292 | ||
|
|
f9dd0996ca | ||
|
|
87ceaed4be | ||
|
|
0e1721b130 | ||
|
|
c47d2eba4d | ||
|
|
1db4ce12d4 | ||
|
|
6c43e20e7a | ||
|
|
b2ecffb0c8 | ||
|
|
a953f71752 | ||
|
|
c5a53d6911 | ||
|
|
bcda16df1d | ||
|
|
d937668dc1 | ||
|
|
8279120e0a | ||
|
|
243beffa4f | ||
|
|
3a76d69a16 | ||
|
|
5b41675f33 | ||
|
|
80cde06bcc | ||
|
|
7d0b33dc42 | ||
|
|
173f4d44bf | ||
|
|
73e94349de | ||
|
|
796954f880 | ||
|
|
f0a88f551f | ||
|
|
f4b97c00ed | ||
|
|
38eccc8b9d | ||
|
|
a3b5f7132c | ||
|
|
a1e7db4abe | ||
|
|
689459c1fd | ||
|
|
755fc72094 | ||
|
|
620b7b91a1 | ||
|
|
fb9eea6c7e | ||
|
|
d83c583412 | ||
|
|
3f97b94d15 | ||
|
|
0ae9ac6f98 | ||
|
|
2333b6cfd2 | ||
|
|
73b31b371f | ||
|
|
fd0cf2cc54 | ||
|
|
27a981c84b | ||
|
|
29be1e37bc | ||
|
|
e727efc33e | ||
|
|
4af2c19f45 | ||
|
|
4f67ecdf62 | ||
|
|
3396846a30 | ||
|
|
5c27b45ac9 | ||
|
|
20f6e16394 | ||
|
|
2df9dd1120 | ||
|
|
74470defda | ||
|
|
8175c83026 | ||
|
|
e0ccafb140 | ||
|
|
20335e96c2 | ||
|
|
a56a0a3336 | ||
|
|
4ad47b1b43 | ||
|
|
0e6cc9a9a8 | ||
|
|
21c6c7ddb6 | ||
|
|
8efbfc6afa | ||
|
|
8e3cfd8517 | ||
|
|
0a6c15e691 | ||
|
|
d3b1ac046a | ||
|
|
86b413750d | ||
|
|
70c2b1b300 | ||
|
|
5cb418cf7d | ||
|
|
8e4ee887b9 | ||
|
|
ef09361539 | ||
|
|
6e36447aa0 | ||
|
|
1c4259881a | ||
|
|
ba00df1ab7 | ||
|
|
45a2902874 | ||
|
|
211defa27f | ||
|
|
bdc6df4b8b | ||
|
|
799896ac13 | ||
|
|
8b54f7ff23 | ||
|
|
2cf462c571 | ||
|
|
1f6646e131 | ||
|
|
e6a52b309b | ||
|
|
fb808d1362 | ||
|
|
fd2882d088 | ||
|
|
a8e3380ed5 | ||
|
|
7f775f7ad6 | ||
|
|
d122d18cfa | ||
|
|
34488cd7d8 | ||
|
|
95e2871966 | ||
|
|
4a8d579dca | ||
|
|
fbbe4ad638 | ||
|
|
20defec9f1 | ||
|
|
c8bb77d8af | ||
|
|
29f6c34343 | ||
|
|
a185e89181 | ||
|
|
c9e548071e | ||
|
|
62c7195ed6 | ||
|
|
cc63e61f73 | ||
|
|
2816850716 | ||
|
|
4b7028a661 | ||
|
|
0382faebb1 | ||
|
|
97efeba8dc | ||
|
|
cddc258c96 | ||
|
|
3abfdffffa | ||
|
|
02546b9401 | ||
|
|
fff72ef369 | ||
|
|
f10977ab35 | ||
|
|
1729f804fb | ||
|
|
8933467c01 | ||
|
|
22bd0c76dd | ||
|
|
4809325bee | ||
|
|
e0b1d0e1e0 | ||
|
|
fe17a29581 | ||
|
|
d8cdd0e94c | ||
|
|
5a9bc30336 | ||
|
|
28f60d5ef8 | ||
|
|
a21202c66b | ||
|
|
116cc89686 | ||
|
|
550ecf2f25 | ||
|
|
7b19fdfeed | ||
|
|
15a90af5be | ||
|
|
86146650d8 | ||
|
|
7fcae25a78 | ||
|
|
15893537c3 | ||
|
|
be4e2164e6 | ||
|
|
3e676f21b0 | ||
|
|
5a4dd5a703 | ||
|
|
345a830dc4 | ||
|
|
cfa6dec293 | ||
|
|
5a6d9a3a38 | ||
|
|
a62d20d86f | ||
|
|
5e0e3de52e | ||
|
|
d78b7a3998 | ||
|
|
5abc2f36e2 | ||
|
|
38a068bcea | ||
|
|
65772a8e1a | ||
|
|
a022093ce0 | ||
|
|
50f84b3c57 | ||
|
|
df21d5326a | ||
|
|
e65fa8fc00 | ||
|
|
8e682cc848 | ||
|
|
ef8e4330d3 | ||
|
|
a0278615a4 | ||
|
|
d8821d7317 | ||
|
|
78a82d9ff2 | ||
|
|
1ac7decd89 | ||
|
|
4fa7276cc1 | ||
|
|
6ae222d55c | ||
|
|
efeeda5e5c | ||
|
|
c75c937b13 | ||
|
|
d1ee596292 | ||
|
|
b61e2cc96a | ||
|
|
ca94445f0f | ||
|
|
4d95fe925d | ||
|
|
f3e5b0ded1 | ||
|
|
8ce9761bad | ||
|
|
3d051e454d | ||
|
|
c48ad4421f | ||
|
|
40264ff900 | ||
|
|
e86f83b9c0 | ||
|
|
e986b09e58 | ||
|
|
22dee96f51 | ||
|
|
0c614b7097 | ||
|
|
f0a5869c53 | ||
|
|
5cd1668e0d | ||
|
|
0b061d68cc | ||
|
|
ffa4a2d054 | ||
|
|
f8072a8004 | ||
|
|
4306b3563a | ||
|
|
c4de88af6f | ||
|
|
9486185ceb | ||
|
|
261eb04e97 | ||
|
|
832bd6c908 | ||
|
|
05844caf85 | ||
|
|
f7e82fcb46 | ||
|
|
27b3af0a7b | ||
|
|
f733fac875 | ||
|
|
1097a1b020 | ||
|
|
ea422d63b3 | ||
|
|
a3821f6c4b | ||
|
|
de8a717b4c | ||
|
|
86e0269a86 | ||
|
|
d15c097dba | ||
|
|
49f71574f4 | ||
|
|
9ee685df46 | ||
|
|
263bfe5ce6 | ||
|
|
e8a9eea493 | ||
|
|
1c499c9f42 | ||
|
|
c1a297db99 | ||
|
|
be92339696 | ||
|
|
bc3eeeca39 | ||
|
|
042b74e6ee | ||
|
|
6e10675adf | ||
|
|
2b83feb6bd | ||
|
|
19fd55e935 | ||
|
|
710998b19a | ||
|
|
828a35fdca | ||
|
|
95bcda0d8a | ||
|
|
ccfe205db8 | ||
|
|
f9684aeec2 | ||
|
|
9d5de46c84 | ||
|
|
28ee745211 | ||
|
|
4e394fc680 | ||
|
|
97acaa1129 | ||
|
|
fe280c8458 | ||
|
|
bdccf7b8d3 | ||
|
|
0234cfbbef | ||
|
|
cadb28d6b3 | ||
|
|
72385c2287 | ||
|
|
201e5ced9c | ||
|
|
bf481f4bbf | ||
|
|
681f2a50b2 | ||
|
|
18fdb96fe1 | ||
|
|
35b64b9a65 | ||
|
|
4ca98825d4 | ||
|
|
0558bba8eb | ||
|
|
a440317594 | ||
|
|
2359a98641 | ||
|
|
a32fbd835d | ||
|
|
6fd3bb62d1 | ||
|
|
83db8a6bd1 | ||
|
|
f24240eddf | ||
|
|
d01d0c8448 | ||
|
|
d3b473e7c7 | ||
|
|
57eb5b777e | ||
|
|
240aac5683 | ||
|
|
8abdbbbf63 | ||
|
|
5fcd03f27e | ||
|
|
cb8f4a3a4e | ||
|
|
8facc1a530 | ||
|
|
17fdca8994 | ||
|
|
df0caab5d6 | ||
|
|
9733927f82 | ||
|
|
28dbcfc38c | ||
|
|
bb8e77dc70 | ||
|
|
ae619bcfc7 | ||
|
|
5b5904ea99 | ||
|
|
8f4b3027ef | ||
|
|
e9009631d5 | ||
|
|
be273f26e9 | ||
|
|
b0c082d728 | ||
|
|
9640e864a6 | ||
|
|
e1bbb064a1 | ||
|
|
d38ebaeb23 | ||
|
|
39a16260a7 | ||
|
|
2c49a52a41 | ||
|
|
c414a45825 | ||
|
|
e2d6f281d5 | ||
|
|
ba404ffb0b | ||
|
|
af10705632 | ||
|
|
5443363de4 | ||
|
|
e3f7426af4 | ||
|
|
8b907d5f5f | ||
|
|
771190202f | ||
|
|
5a4e3ede2a | ||
|
|
78b350bbc5 | ||
|
|
fe2f0f7489 | ||
|
|
9f20258d5d | ||
|
|
63dd3d4682 | ||
|
|
b1166211e2 | ||
|
|
7d43545303 | ||
|
|
32de4f1930 | ||
|
|
232c7a895b | ||
|
|
c443a8bd9d | ||
|
|
0940944048 | ||
|
|
3ac0aeaac6 | ||
|
|
8557285da6 | ||
|
|
fb46e0fd79 | ||
|
|
6fa853b309 | ||
|
|
88c7eaed06 | ||
|
|
c730cbc629 | ||
|
|
4ef3fc501b | ||
|
|
c22fd3e73d | ||
|
|
78eb9d6176 | ||
|
|
00f4ba0eeb | ||
|
|
588f64c760 | ||
|
|
6039464342 | ||
|
|
866ab30400 | ||
|
|
57fd6f0604 | ||
|
|
49e83b0c4d | ||
|
|
1cfe4962aa | ||
|
|
79b1da130b | ||
|
|
e128bfcd10 | ||
|
|
e3d3e604f2 | ||
|
|
619a8888eb | ||
|
|
c304d37cbd | ||
|
|
149e0839b1 | ||
|
|
0c1d55b6dc | ||
|
|
d0a79c6a13 | ||
|
|
c6601769ad | ||
|
|
a78ca7eb8d | ||
|
|
59239d2f61 | ||
|
|
bf65ddbff0 | ||
|
|
7e56f3d392 | ||
|
|
84d6fdfc37 | ||
|
|
4124a568fd | ||
|
|
db7202578d | ||
|
|
e38fa1cdd4 | ||
|
|
a1b2a62e6b | ||
|
|
f34be4e2c2 | ||
|
|
84e253f3f9 | ||
|
|
0fd9aa5cb6 | ||
|
|
2a73b6ed34 | ||
|
|
0838135d4a | ||
|
|
a144ed8a71 | ||
|
|
c646a0c881 | ||
|
|
0059b7e468 | ||
|
|
4838874127 | ||
|
|
96cb44025b | ||
|
|
7fe702d59b | ||
|
|
9e1434503e | ||
|
|
08c74e9a13 | ||
|
|
c53864de0a | ||
|
|
8c1ff4c862 | ||
|
|
987b5354cc | ||
|
|
1a4f7d1b53 | ||
|
|
f9e9347e69 | ||
|
|
d00362eb70 | ||
|
|
8ed67a5c19 | ||
|
|
f99029b49a | ||
|
|
3017a31127 | ||
|
|
bbb4f407b3 | ||
|
|
be7e86ec90 | ||
|
|
88e68495b6 | ||
|
|
738d34969d | ||
|
|
e0e0dbef18 | ||
|
|
039bad3848 | ||
|
|
73d29e6853 | ||
|
|
5a69e9caa8 | ||
|
|
f302d7b61a | ||
|
|
b30eaca475 | ||
|
|
d817416bae | ||
|
|
e805ab5b2d | ||
|
|
7157816fa5 | ||
|
|
9e4c7e609d | ||
|
|
e1dce87525 | ||
|
|
adc8d3d9ae | ||
|
|
693094e97c | ||
|
|
5e7d28b19b | ||
|
|
209f3a88e6 | ||
|
|
5b0e839a11 | ||
|
|
4c4830670a | ||
|
|
750ba7ff8c | ||
|
|
b12b820034 | ||
|
|
716ec324d0 | ||
|
|
ddad98ab32 | ||
|
|
d2406c42a1 | ||
|
|
d2ca4fb443 | ||
|
|
98bb58964b | ||
|
|
1a89c591c2 | ||
|
|
2bc7bb6e61 | ||
|
|
86d50bc9b6 | ||
|
|
cd7a0b36cd | ||
|
|
9e81012540 | ||
|
|
42dee67187 | ||
|
|
7f5035bb05 | ||
|
|
c445232980 | ||
|
|
6b8f0f3cb3 | ||
|
|
c29d20c602 | ||
|
|
41e66ab834 | ||
|
|
e5a1b4d5cb | ||
|
|
1b0ad5aa69 | ||
|
|
8efd8d2031 | ||
|
|
180a1aff3a | ||
|
|
f8777d0986 | ||
|
|
dc4daf75b0 | ||
|
|
b03c4edd31 | ||
|
|
ed29fac376 | ||
|
|
f963589400 | ||
|
|
85160766cd | ||
|
|
2a78953f9a | ||
|
|
55d98e852b | ||
|
|
647fbd8cbf | ||
|
|
fa87417e94 | ||
|
|
82a93263fa | ||
|
|
fde102b7ed | ||
|
|
fdf2253218 | ||
|
|
e2c830b639 | ||
|
|
4e8623efbf | ||
|
|
2a06893eb5 | ||
|
|
963197d70c | ||
|
|
84d37fda83 | ||
|
|
7f0374c5a5 | ||
|
|
8eeda23e98 | ||
|
|
657a0394f5 | ||
|
|
ab7c78118a | ||
|
|
dc48bfb7ad | ||
|
|
86670eb80e | ||
|
|
89a7ad8528 | ||
|
|
17dc022603 | ||
|
|
cafd34460b | ||
|
|
e96b43e84d | ||
|
|
fa6904fef3 | ||
|
|
3f37d15b88 | ||
|
|
99ae946476 | ||
|
|
0e3a66c829 | ||
|
|
7b1a7c7f31 | ||
|
|
20a3d9b98d | ||
|
|
098d7efb21 | ||
|
|
a6c1174dff | ||
|
|
472e5b07ea | ||
|
|
0d71cfb92c | ||
|
|
427e16826e | ||
|
|
fab14f8f5a | ||
|
|
e8c89d7ca9 | ||
|
|
b1c6575a1b | ||
|
|
3b7176f322 | ||
|
|
5f7ddcd5d7 | ||
|
|
4c9d740cdf | ||
|
|
a930047a10 | ||
|
|
4e41871fa4 | ||
|
|
9947acc349 | ||
|
|
748f89660a | ||
|
|
2987925fa5 | ||
|
|
0589b3102e | ||
|
|
df51b26fe7 | ||
|
|
b288ad9ba7 | ||
|
|
6da5c53120 | ||
|
|
26d3271643 | ||
|
|
12da07579a | ||
|
|
bd066b8542 | ||
|
|
4478896ca5 | ||
|
|
f996ec0c32 | ||
|
|
c76e01e61f | ||
|
|
f8087ae39c | ||
|
|
7250cdcd31 | ||
|
|
20f34f1ba9 | ||
|
|
4ac08432b8 | ||
|
|
3e3048df81 | ||
|
|
c6199bf52a | ||
|
|
20409c083c | ||
|
|
7a90f18145 | ||
|
|
df1ae611ba | ||
|
|
6009a26c89 | ||
|
|
30984b6f00 | ||
|
|
76a8e503dd | ||
|
|
d0e0e30532 | ||
|
|
b3f5266e78 | ||
|
|
0609ea9651 | ||
|
|
5af16a6090 | ||
|
|
4f88c5ba6e | ||
|
|
023e946072 | ||
|
|
004cb826d2 | ||
|
|
bfcf224b2b | ||
|
|
c969fe5a68 | ||
|
|
8737f12e1b | ||
|
|
1267eeef4a | ||
|
|
11c250ff7c | ||
|
|
c303199d26 | ||
|
|
ae458a1a49 | ||
|
|
760a5aec74 | ||
|
|
2967efc2b0 | ||
|
|
24f243e689 | ||
|
|
d719064628 | ||
|
|
a7d0b41d98 | ||
|
|
a980fc3db0 | ||
|
|
a34ca6b3a3 | ||
|
|
ef91dcd757 | ||
|
|
a5296a9258 | ||
|
|
f827ae68e2 | ||
|
|
fbf15c0ffe | ||
|
|
10fdbe7274 | ||
|
|
384fc328f2 | ||
|
|
055694ae61 | ||
|
|
edf59d2c26 | ||
|
|
92c978e5c2 | ||
|
|
34397fa2aa | ||
|
|
19587eea3f | ||
|
|
4a9373e773 | ||
|
|
2997bae935 | ||
|
|
b0bd9ee162 | ||
|
|
7075c8c235 | ||
|
|
a4a532fe8e | ||
|
|
77c771bf76 | ||
|
|
c93b48920e | ||
|
|
04c92bb8d5 | ||
|
|
16c9745326 | ||
|
|
05648177aa | ||
|
|
f318fd9cf1 | ||
|
|
c15a89832b | ||
|
|
94b0abc240 | ||
|
|
72edcd054f | ||
|
|
e4a2f8ac6c | ||
|
|
c6d7b31a84 | ||
|
|
0ed983a264 | ||
|
|
8fab48a380 | ||
|
|
86e815999d | ||
|
|
a2306f7870 | ||
|
|
60b75c10d7 | ||
|
|
41c2c8a729 | ||
|
|
9785eed8dd | ||
|
|
527de7ba5e | ||
|
|
14484e566e | ||
|
|
429af2c40d | ||
|
|
11fffd1690 | ||
|
|
af3aed4580 | ||
|
|
3a3764bdb4 | ||
|
|
18ee2c518c | ||
|
|
36172f7f7b | ||
|
|
908258f8d4 | ||
|
|
774b2d5fee | ||
|
|
b5f720ace6 | ||
|
|
9f201c386e | ||
|
|
700dd34137 | ||
|
|
f2dd977de4 | ||
|
|
5f013216c5 | ||
|
|
eac0805435 | ||
|
|
e5bee7e5a3 | ||
|
|
442553620a | ||
|
|
6d08968b87 | ||
|
|
c2ce59f95e | ||
|
|
f3ec27b95f | ||
|
|
c88cb5ea90 | ||
|
|
99a21660ab | ||
|
|
4bc62a1e8a | ||
|
|
26eb6cc01a | ||
|
|
bcba17a9e7 | ||
|
|
918b66bc2e | ||
|
|
152d672278 | ||
|
|
51fb472809 | ||
|
|
66440b8542 | ||
|
|
fefdd51084 | ||
|
|
6ca1d77298 | ||
|
|
4f6748ec4c | ||
|
|
f56fc572f1 | ||
|
|
16fdf6b621 | ||
|
|
a863037ca3 | ||
|
|
2d854bd94c | ||
|
|
9565c28a91 | ||
|
|
bc457bb3bd | ||
|
|
db383a3121 | ||
|
|
3f76f603d9 | ||
|
|
68304848ae | ||
|
|
bb6bc4cac3 | ||
|
|
ef8b9c36ef | ||
|
|
e6c943d01f | ||
|
|
31d3ee899f | ||
|
|
98143a845b | ||
|
|
bffc557be1 | ||
|
|
09208fa8fe | ||
|
|
048c571d3d | ||
|
|
24757f1064 | ||
|
|
88f2f51266 | ||
|
|
93152ef863 | ||
|
|
09b698b0a9 | ||
|
|
478aaf9619 | ||
|
|
fad902b438 | ||
|
|
7bfaf292db | ||
|
|
be0488a1a0 | ||
|
|
28a52cd485 | ||
|
|
3a19f43844 | ||
|
|
4852e837d2 | ||
|
|
fa68385cfe | ||
|
|
d54609a458 | ||
|
|
f682861e0b | ||
|
|
023a20ff47 | ||
|
|
e39cd84923 | ||
|
|
5020897f10 | ||
|
|
6ac2d923b7 | ||
|
|
6996dd86f4 | ||
|
|
493273d698 | ||
|
|
84344ac4c2 | ||
|
|
9b118af304 | ||
|
|
e39e2ed718 | ||
|
|
71f781d542 | ||
|
|
b2db10e216 | ||
|
|
3736a15714 | ||
|
|
248158130e | ||
|
|
f5c7ccbb80 | ||
|
|
24335d0dd7 | ||
|
|
908c2c1096 | ||
|
|
9797b36186 | ||
|
|
731f189010 | ||
|
|
cc5b157231 | ||
|
|
99fed75202 | ||
|
|
cb5f9f576a | ||
|
|
aeac2cdb86 | ||
|
|
0dafd83033 | ||
|
|
f6d946cf68 | ||
|
|
b9c07b549c | ||
|
|
c34a1f73c6 | ||
|
|
281bd0613d | ||
|
|
d936b4cd09 | ||
|
|
5a0ebf84ef | ||
|
|
c9c5b4d641 | ||
|
|
5e86e02304 | ||
|
|
15cd0d8e58 | ||
|
|
061b0eae1d | ||
|
|
d3876303f2 | ||
|
|
2ad110548d | ||
|
|
ef5d19e5c9 | ||
|
|
5f6bc405dd | ||
|
|
1ca203ca38 | ||
|
|
c8a75ab01d | ||
|
|
8c6eb555de | ||
|
|
cb68403387 | ||
|
|
7b5ce86c5b | ||
|
|
f4e247fc92 | ||
|
|
e582bd73ee | ||
|
|
543e12c6ca | ||
|
|
57439af25d | ||
|
|
f4dd5d19e7 | ||
|
|
05e30f4680 | ||
|
|
9c87e569cf | ||
|
|
15761027df | ||
|
|
65fa0b7b22 | ||
|
|
8b2e57276f | ||
|
|
25337d4543 | ||
|
|
892f30a051 | ||
|
|
829a56cc79 | ||
|
|
9d04f2c1eb | ||
|
|
f02f4bc0c0 | ||
|
|
b9829f205f | ||
|
|
eef07e5a4f | ||
|
|
13e50ec6db | ||
|
|
9dcf6f3253 | ||
|
|
e0cefb0398 | ||
|
|
6018bf63f9 | ||
|
|
7aebe53e5b | ||
|
|
32a070d909 | ||
|
|
b5408bcbd0 | ||
|
|
284ffdfd1f | ||
|
|
ae4cd90441 | ||
|
|
5efd0c1f8a | ||
|
|
962f75038b | ||
|
|
ea5a56f0f0 | ||
|
|
afae5cd2f9 | ||
|
|
280dc56a74 | ||
|
|
2b9d8d6d6a | ||
|
|
2d35e5e9d7 | ||
|
|
102a4e8bf4 | ||
|
|
ce837e307e | ||
|
|
810e9e743e | ||
|
|
e092746165 | ||
|
|
388b658bfa | ||
|
|
0358e8afb7 | ||
|
|
2b88efea65 | ||
|
|
f4c3073304 | ||
|
|
e4d5786861 | ||
|
|
46a55a1d99 | ||
|
|
2c1022cde1 | ||
|
|
f9723c42cb | ||
|
|
3635a9bb40 | ||
|
|
9e0bfa733b | ||
|
|
a80a8a8ced | ||
|
|
b44a80800c | ||
|
|
e3b04bb3fc | ||
|
|
fcee62a3d9 | ||
|
|
7f1fbfc203 | ||
|
|
4f63b82bbb | ||
|
|
f63c844c42 | ||
|
|
694c0b3f7d | ||
|
|
1c45840148 | ||
|
|
421b2c857b | ||
|
|
bacf42a22f | ||
|
|
5c8703fb30 | ||
|
|
30a84d8577 | ||
|
|
3198bc27fd | ||
|
|
c7555516ff | ||
|
|
3cd0e8bf88 | ||
|
|
957ccd2eaf | ||
|
|
558ef2c00d | ||
|
|
b73a964bac | ||
|
|
3e091a2938 | ||
|
|
cb6d18035f | ||
|
|
4b15229832 | ||
|
|
f0dfa50848 | ||
|
|
22f007498d | ||
|
|
cc6f658ef1 | ||
|
|
9b885296d0 | ||
|
|
c6c5ba0118 | ||
|
|
a966a60656 | ||
|
|
d05da1e487 | ||
|
|
294d0fda61 | ||
|
|
29f3d2dea8 | ||
|
|
d2b6570c39 | ||
|
|
a1a765f6e4 | ||
|
|
1d98928475 | ||
|
|
73486d6f39 | ||
|
|
640ed5dc33 | ||
|
|
dda957c8e5 | ||
|
|
97b6d8a797 | ||
|
|
00bb20546b | ||
|
|
7cf8596906 | ||
|
|
5a0607d11b | ||
|
|
26207e7bb8 | ||
|
|
ae8d75fe6a | ||
|
|
4db19a1799 | ||
|
|
543ca19361 | ||
|
|
7014afaab6 | ||
|
|
62987ac3a8 | ||
|
|
3a5ec9b4ca | ||
|
|
3169cf2f60 | ||
|
|
bceefc7197 | ||
|
|
bfff3ea4cc | ||
|
|
7d4caa05ca | ||
|
|
004fd7d37d | ||
|
|
e3da92d1ee | ||
|
|
0bc72c5ed4 | ||
|
|
d0cf0c8f43 | ||
|
|
4d4fe60a55 | ||
|
|
81903e99d3 | ||
|
|
fd40f66766 | ||
|
|
2aa2a38e37 | ||
|
|
d701995bc0 | ||
|
|
c4084fe625 | ||
|
|
8c7c592bd1 | ||
|
|
b9aca357a9 | ||
|
|
26f5a558d6 | ||
|
|
960919d00a | ||
|
|
b712c88088 | ||
|
|
a062f75d38 | ||
|
|
a67e3d1d65 | ||
|
|
28927a6f1a | ||
|
|
ce864fa1b2 | ||
|
|
7e1e760b95 | ||
|
|
d19df0dcae | ||
|
|
b61b84dfc8 | ||
|
|
922de67a8b | ||
|
|
e8c657ba70 | ||
|
|
1ce4f75b0d | ||
|
|
175966674d | ||
|
|
d1ce9f4964 | ||
|
|
0f9d0ef533 | ||
|
|
e4df325e22 | ||
|
|
3b843a1782 | ||
|
|
614b2d0325 | ||
|
|
46e4db0b24 | ||
|
|
94171f6c57 | ||
|
|
e0391ee1bc | ||
|
|
7004cd0b92 | ||
|
|
b61643fecb | ||
|
|
8d6fa3dc93 | ||
|
|
e6c8db88bd | ||
|
|
937194b5ee | ||
|
|
5f3ceec6f9 | ||
|
|
3f9f0e02e5 | ||
|
|
d6260ae11a | ||
|
|
0ecfe4bafd | ||
|
|
df2a00a2fc | ||
|
|
dfdbb9bb28 | ||
|
|
979e374270 | ||
|
|
b7e143b4f3 | ||
|
|
272265f085 | ||
|
|
27402fafe6 | ||
|
|
ac4211d0c6 | ||
|
|
ee0faba708 | ||
|
|
e5d5871b95 | ||
|
|
4514229f27 | ||
|
|
7ac8cb63c8 | ||
|
|
8e83ceaedc | ||
|
|
b1d026b800 | ||
|
|
ebf42dc9e0 | ||
|
|
a8283ea99f | ||
|
|
564c5fa364 | ||
|
|
6faa978767 | ||
|
|
8a340c8ff3 | ||
|
|
0b35f1959a | ||
|
|
98ea4b59a0 | ||
|
|
ac2ad5a886 | ||
|
|
8fe19de3ce | ||
|
|
40559b7044 | ||
|
|
0b8b682fee | ||
|
|
083aca4693 | ||
|
|
19475a06f5 | ||
|
|
5fa014e01d | ||
|
|
df591cfc4c | ||
|
|
fcd57f9756 | ||
|
|
c348c60d5c | ||
|
|
1d2fe8993b | ||
|
|
18aa885aef | ||
|
|
a693576941 | ||
|
|
5c0475ce8c | ||
|
|
380c17a0a5 | ||
|
|
bd4ca0d4d3 | ||
|
|
7949444612 | ||
|
|
cf16b0ffa9 | ||
|
|
ec40c67c50 | ||
|
|
55ac3fef88 | ||
|
|
c4edd957b4 | ||
|
|
a19cc91cd4 | ||
|
|
c83596455b | ||
|
|
41a91c3c2d | ||
|
|
b77937ec4c | ||
|
|
1082105eea | ||
|
|
45923ad5dd | ||
|
|
aa67537097 | ||
|
|
63e5ad1d95 | ||
|
|
b2be7c807f | ||
|
|
dde33aa5a5 | ||
|
|
91f6e8ede6 | ||
|
|
7d8abf4463 | ||
|
|
6abab3b974 | ||
|
|
970613fad9 | ||
|
|
edbf8e319c | ||
|
|
28cd3cace2 | ||
|
|
45f8827c6e | ||
|
|
342be430cb | ||
|
|
622f02c369 | ||
|
|
263bf8047a | ||
|
|
2feced5937 | ||
|
|
6de0a765c9 | ||
|
|
4fd35224b3 | ||
|
|
52dc35bf0e | ||
|
|
2a111ab6ce | ||
|
|
5631f071c3 | ||
|
|
a0f92954c8 | ||
|
|
64b312ef6e | ||
|
|
baf92d4ec8 | ||
|
|
1d282c544a | ||
|
|
5b18a63ebc | ||
|
|
336df72e04 | ||
|
|
cf79190175 | ||
|
|
5da4917c27 | ||
|
|
c1b24e818c | ||
|
|
af893e79a4 | ||
|
|
aa48dfcdf4 | ||
|
|
efbfed0d40 | ||
|
|
059b03e090 | ||
|
|
7391cf8d19 | ||
|
|
be7a128bf4 | ||
|
|
b6794b96a5 | ||
|
|
4df78764a2 | ||
|
|
c411d9744d | ||
|
|
f7bfa50f15 | ||
|
|
8c0308dc58 | ||
|
|
4758b30cd3 | ||
|
|
6a8ca9c318 | ||
|
|
884593ab76 | ||
|
|
0517f70946 | ||
|
|
514aab7ee3 | ||
|
|
eaaa689f2f | ||
|
|
cf7872a498 | ||
|
|
f779b6e3cc | ||
|
|
a6cced81d6 | ||
|
|
62e51861b8 | ||
|
|
6c6e031254 | ||
|
|
48c07f6ef6 | ||
|
|
1b6c20341e | ||
|
|
75eb7ed507 | ||
|
|
cd360a4f8c | ||
|
|
fd27d3e2ce | ||
|
|
6737128b84 | ||
|
|
63b2eae4f5 | ||
|
|
0b34aea23a | ||
|
|
1290fa0073 | ||
|
|
da74e95f88 | ||
|
|
ac82a5cb83 | ||
|
|
ba21348c0f | ||
|
|
27207037a8 | ||
|
|
a612e1e8fa | ||
|
|
08d3547d4e | ||
|
|
7702d4ce7c | ||
|
|
3bf39b3bee | ||
|
|
417065bad6 | ||
|
|
3cb21dd6c7 | ||
|
|
cebf2aab29 | ||
|
|
72bf73f931 | ||
|
|
65caec2ea5 | ||
|
|
ea7c74d48d | ||
|
|
86df2306c4 | ||
|
|
6c12d8f30c | ||
|
|
e649a22ccf | ||
|
|
eddf9de8f9 | ||
|
|
7e91091cc3 | ||
|
|
9745a6ecbc | ||
|
|
3936b15afc | ||
|
|
efb7dce524 | ||
|
|
ac4b5d9199 | ||
|
|
fdb7114511 | ||
|
|
03f8c1db86 | ||
|
|
12b68b0242 | ||
|
|
28ddf485ed | ||
|
|
96d420e832 | ||
|
|
0f98bb5ac5 | ||
|
|
296473299c | ||
|
|
ce7718c87e | ||
|
|
1ec8f9cf85 | ||
|
|
46fd2deb8b | ||
|
|
5a9f440c8f | ||
|
|
1d67aa3e29 | ||
|
|
bd7e8e708f | ||
|
|
8a842af999 | ||
|
|
224c17a9b9 | ||
|
|
89e1cb02a4 | ||
|
|
3cdb6aad25 | ||
|
|
8a26f38579 | ||
|
|
424cce9224 | ||
|
|
96abf66333 | ||
|
|
b2ada0cda9 | ||
|
|
e67a66f900 | ||
|
|
20293fbcfb | ||
|
|
03f20f023f | ||
|
|
dfdf4ef317 | ||
|
|
f10c595ad3 | ||
|
|
f611dba0ad | ||
|
|
da852d0012 | ||
|
|
6ade579542 | ||
|
|
e17947930c | ||
|
|
74c71e6677 | ||
|
|
7635708c21 | ||
|
|
4ee9a4d191 | ||
|
|
bb24fce859 | ||
|
|
21d53f190b | ||
|
|
5fc59dd1cf | ||
|
|
34fd2882d8 | ||
|
|
4a23b0ddc7 | ||
|
|
c4690f9e7b | ||
|
|
36c6d53757 | ||
|
|
c550f2eb07 | ||
|
|
67bb0b7f93 | ||
|
|
c5b411811a | ||
|
|
eddf93b200 | ||
|
|
9aeb309d9d | ||
|
|
bea0ea3aaf | ||
|
|
df930103e7 | ||
|
|
d6cf970ae9 | ||
|
|
e778ab6f30 | ||
|
|
b7fc74a99d | ||
|
|
b38a36b2f5 | ||
|
|
046a4a4dc0 | ||
|
|
357d49ecee | ||
|
|
a568be9df3 | ||
|
|
43061c691b | ||
|
|
a4e768e2b3 | ||
|
|
2d4fb371c2 | ||
|
|
9b54b53081 | ||
|
|
3512922bef | ||
|
|
60334b66ba | ||
|
|
d38bf992c2 | ||
|
|
ce95391804 | ||
|
|
511fff1390 | ||
|
|
178980c34a | ||
|
|
132e56e65e | ||
|
|
ff63e99c86 | ||
|
|
a3fab18a93 | ||
|
|
a9cc1bf641 | ||
|
|
fa4db2cecc | ||
|
|
ca249054e5 | ||
|
|
f6ace914e9 | ||
|
|
1d38633e69 | ||
|
|
8129f0cb8b | ||
|
|
b06002a2a8 | ||
|
|
464584265a | ||
|
|
184839a57a | ||
|
|
3ed66f5c16 | ||
|
|
0d106d01af | ||
|
|
807c8133ea | ||
|
|
f6cc207ae5 | ||
|
|
388a77258e | ||
|
|
424abc3395 | ||
|
|
83b5e4b4a3 | ||
|
|
03c10086e7 | ||
|
|
dae3a5b8b1 | ||
|
|
67a29eb92e | ||
|
|
5a837e1b0a | ||
|
|
a1f2c84d03 | ||
|
|
628c99936e | ||
|
|
e8b23c29a5 | ||
|
|
6e19e6eca9 | ||
|
|
ef71271db6 | ||
|
|
11f0434bdd | ||
|
|
46ff8e891e | ||
|
|
4df288e244 | ||
|
|
a9bc2b5ea8 | ||
|
|
d49beb8374 | ||
|
|
f88b3523c0 | ||
|
|
04f0a33489 | ||
|
|
b4bc01f2c3 | ||
|
|
7eaf22f573 | ||
|
|
255b7e0a0f | ||
|
|
9adcbbb0fe | ||
|
|
31b5650489 | ||
|
|
2e90718d6a | ||
|
|
fe3ac0e94d | ||
|
|
50422b6060 | ||
|
|
4351a3ac86 | ||
|
|
ccffc46f67 | ||
|
|
e8bb624560 | ||
|
|
21c6fdce3a | ||
|
|
18cd678b71 | ||
|
|
9cac6b06f5 | ||
|
|
73ee7664a1 | ||
|
|
8835225655 | ||
|
|
54c19dfb5a | ||
|
|
e4c455bdb6 | ||
|
|
3c9f6f6ab9 | ||
|
|
fb65772dd6 | ||
|
|
aeec6d6d52 | ||
|
|
9be0053d62 | ||
|
|
466fbcb8da | ||
|
|
f43a03a151 | ||
|
|
b3134642a2 | ||
|
|
4d00215098 | ||
|
|
6926e5f423 | ||
|
|
a5e1f40c30 | ||
|
|
857688f36c | ||
|
|
0ac2bfd1cf | ||
|
|
0adedcab50 | ||
|
|
74406cc0b7 | ||
|
|
8754bb80e0 | ||
|
|
67ac227fec | ||
|
|
666210a061 | ||
|
|
2403a98219 | ||
|
|
f140fa6017 | ||
|
|
a5df551689 | ||
|
|
ea6177d19e | ||
|
|
5c776a83ff | ||
|
|
bdcdfdabec | ||
|
|
264a7da9f7 | ||
|
|
f5f2bf85c5 | ||
|
|
cb7e40a892 | ||
|
|
121d104d46 | ||
|
|
44729ffba9 | ||
|
|
4a3d68eada | ||
|
|
afb35ec307 | ||
|
|
bbd3c94ec3 | ||
|
|
394761a6ca | ||
|
|
c566f00567 | ||
|
|
03b967c99a | ||
|
|
966267edf9 | ||
|
|
a53595eea5 | ||
|
|
eec9799706 | ||
|
|
811710c8f0 | ||
|
|
1c0d0157ad | ||
|
|
b4d622b02b | ||
|
|
1b3b117b06 | ||
|
|
33ca1fc670 | ||
|
|
91f9a47afa | ||
|
|
70f10cd23e | ||
|
|
0a52beb539 | ||
|
|
0d36f839c3 | ||
|
|
c815166eb5 | ||
|
|
9616720abb | ||
|
|
01f909fc05 | ||
|
|
b69d3de3e3 | ||
|
|
7b1856aacb | ||
|
|
d5402d017a | ||
|
|
c59414b74b | ||
|
|
0aee62df4d | ||
|
|
1531793084 | ||
|
|
4b41c0e1a2 | ||
|
|
12eb60d2f7 | ||
|
|
00b628c6cc | ||
|
|
9e80c55275 | ||
|
|
301d803fc5 | ||
|
|
a07dfa9572 | ||
|
|
b528131937 | ||
|
|
169347d0c4 | ||
|
|
e4dcec7de7 | ||
|
|
4407c7a4e1 | ||
|
|
cafd16b960 | ||
|
|
3d56251d15 | ||
|
|
a90ab3dbb1 | ||
|
|
c137f5fe9f | ||
|
|
f7bdaadd7e | ||
|
|
36a5b13a0c | ||
|
|
42f4ff398c | ||
|
|
d65a1f120e | ||
|
|
ef2be2e86d | ||
|
|
14841641c1 | ||
|
|
cde70b1494 | ||
|
|
79a7f3dd64 | ||
|
|
ef2f0add35 | ||
|
|
2ff0b10084 | ||
|
|
40634da90b | ||
|
|
afea5e81f9 | ||
|
|
29cc0795b4 | ||
|
|
f77d5ff909 | ||
|
|
88b48738cc | ||
|
|
617f7a1ce6 | ||
|
|
2ab382a355 | ||
|
|
28f40287ce | ||
|
|
7250e96850 | ||
|
|
92bef64979 | ||
|
|
1c2d7c466e | ||
|
|
85bce0582e | ||
|
|
e746891ae0 | ||
|
|
9fa2c878b9 | ||
|
|
6c963f6404 | ||
|
|
bb8f06c248 | ||
|
|
cb9bfccb9a | ||
|
|
3069fa759b | ||
|
|
ecd9d31371 | ||
|
|
6c0723bc43 | ||
|
|
dc4f2dcee7 | ||
|
|
f772ce111e | ||
|
|
d686374e05 | ||
|
|
73eef741b6 | ||
|
|
4075f330e2 | ||
|
|
c10c3b937c | ||
|
|
8603c836e1 | ||
|
|
27bdceaf32 | ||
|
|
9672b9d3b8 | ||
|
|
4f05bf87ac | ||
|
|
c88d796f0e | ||
|
|
0b8cf42fcf | ||
|
|
807b27048b | ||
|
|
6a01b622a2 | ||
|
|
7e61b6b730 | ||
|
|
156534e2ba | ||
|
|
5f650572ce | ||
|
|
9bed4096b8 | ||
|
|
b097e48efc | ||
|
|
1a3aa4fd1a | ||
|
|
83d099b37c | ||
|
|
637a6d7f40 | ||
|
|
78c4af5e4b | ||
|
|
730ccd36b2 | ||
|
|
33a1459505 | ||
|
|
30cf4a1702 | ||
|
|
16529909f9 | ||
|
|
adc1d93ac2 | ||
|
|
94ba940382 | ||
|
|
cf83d92cc1 | ||
|
|
f6990b6e1f | ||
|
|
da1526b92f | ||
|
|
4cd710f84e | ||
|
|
55833fcad0 | ||
|
|
f1d35ba18a | ||
|
|
54685bd660 | ||
|
|
b0f0e8841e | ||
|
|
a073968597 | ||
|
|
5ecba670a5 | ||
|
|
45c1108ca8 | ||
|
|
e115b2d8a8 | ||
|
|
cf20071189 | ||
|
|
b4b60b64aa | ||
|
|
8111ef74b2 | ||
|
|
b4c498f088 | ||
|
|
8286c63ddc | ||
|
|
7394e83eeb | ||
|
|
ebd9bbde2e | ||
|
|
90f27da293 | ||
|
|
7d11687f15 | ||
|
|
3234f04b27 | ||
|
|
5c16c14fed | ||
|
|
6aca737405 | ||
|
|
c884627e21 | ||
|
|
8fa9b34e87 | ||
|
|
b1190e6e0b | ||
|
|
0c1615aef5 | ||
|
|
e31f20e441 | ||
|
|
735e492f8c | ||
|
|
a107a7c3e2 | ||
|
|
b5f4d3b113 | ||
|
|
005c0d2cdc | ||
|
|
0db4b352b6 | ||
|
|
0694a5db0e | ||
|
|
73c7efffb0 | ||
|
|
729170ec97 | ||
|
|
2b0c40feb4 | ||
|
|
91543a0029 | ||
|
|
9625745f4c | ||
|
|
89c4c75e3c | ||
|
|
6aceee8486 | ||
|
|
26958d74d8 | ||
|
|
38d578a2c6 | ||
|
|
96aaed7395 | ||
|
|
7027935ff7 | ||
|
|
5d692f4908 | ||
|
|
9def4a6170 | ||
|
|
3a0d79b1e4 | ||
|
|
048ef96ad0 | ||
|
|
51f1fa50dd | ||
|
|
d8a88c18d3 | ||
|
|
db7cff9582 | ||
|
|
dc2583ddd8 | ||
|
|
3be962f09d | ||
|
|
736b08e016 | ||
|
|
d8013cae37 | ||
|
|
b26b1b9c53 | ||
|
|
1c9c7b7a7d | ||
|
|
a9aaeefe24 | ||
|
|
8257e3f885 | ||
|
|
965c987761 | ||
|
|
142e5276fe | ||
|
|
351d1a2dad | ||
|
|
72424ea2d2 | ||
|
|
1e703bfdb4 | ||
|
|
dee0a4bf3e | ||
|
|
9c1d6051fb | ||
|
|
3c67736cbb | ||
|
|
c697a5bc81 | ||
|
|
0e9df5cb76 | ||
|
|
7a37dd6949 | ||
|
|
cecefd416d | ||
|
|
79f9047c21 | ||
|
|
f9f7469ccf | ||
|
|
1e5933eb45 | ||
|
|
a4e1f531b7 | ||
|
|
0a38d14930 | ||
|
|
4e7f2fa3d4 | ||
|
|
4b99bb579c | ||
|
|
0b59519c19 | ||
|
|
4d18119ccf | ||
|
|
4af236d3ac | ||
|
|
eddb9c28a8 | ||
|
|
40a6fdd95e | ||
|
|
3f80001e4d | ||
|
|
89082164ce | ||
|
|
9df7c2f37a | ||
|
|
840f510bf1 | ||
|
|
1bd95b127b | ||
|
|
97154e49a6 | ||
|
|
db757b5bbb | ||
|
|
af62f54042 | ||
|
|
1b0dc18bdc | ||
|
|
1db36b3132 | ||
|
|
805879a213 | ||
|
|
e1157f3a4c | ||
|
|
46e0866410 | ||
|
|
621c1ee74e | ||
|
|
b3f9070b39 | ||
|
|
14b15dcf5a | ||
|
|
e4c62d2939 | ||
|
|
b50c0bd615 | ||
|
|
e55ee253ab | ||
|
|
f81fa6e4f5 | ||
|
|
4785c650f3 | ||
|
|
be99fa858e | ||
|
|
196d4f6659 | ||
|
|
1233233c6c | ||
|
|
742bcc753f | ||
|
|
839c2a10aa | ||
|
|
b298d41c22 | ||
|
|
c70a9f61cb | ||
|
|
6440d8e69d | ||
|
|
97dcd4d450 | ||
|
|
b8d4514dd0 | ||
|
|
0ceee56de3 | ||
|
|
024cc1806f | ||
|
|
5e421d2636 | ||
|
|
f71ea72d54 | ||
|
|
d65379f6c4 | ||
|
|
06281e85c4 | ||
|
|
5dc2621a32 | ||
|
|
c024f88ce1 | ||
|
|
b5e6ac7db9 | ||
|
|
60732f8243 | ||
|
|
4a557349a3 | ||
|
|
5bf0c310d3 | ||
|
|
99ec103e97 | ||
|
|
829505d548 | ||
|
|
5c9ee7f2a5 | ||
|
|
fa0d54966d | ||
|
|
401dd5162d | ||
|
|
2dee42449a | ||
|
|
224e8aff07 | ||
|
|
b5710cd710 | ||
|
|
8033a8f94c | ||
|
|
4bcef804b6 | ||
|
|
66a5b0ecdc | ||
|
|
2605e7de40 | ||
|
|
f50f171223 | ||
|
|
7626b541f5 | ||
|
|
24c7fc533a | ||
|
|
21fdfe9581 | ||
|
|
ca8ee1c0e3 | ||
|
|
0980b864fa | ||
|
|
d0a822f02a | ||
|
|
4dbce955ee | ||
|
|
6b18675274 | ||
|
|
907e65a359 | ||
|
|
723a4a910c | ||
|
|
89a6fac231 | ||
|
|
9a309ed7b7 | ||
|
|
d10aa35dab |
@@ -1,147 +0,0 @@
|
||||
version: 2.1
|
||||
|
||||
executors:
|
||||
machine_executor:
|
||||
machine: true
|
||||
working_directory: ~/repo
|
||||
|
||||
commands:
|
||||
build-and-test:
|
||||
parameters:
|
||||
node-version:
|
||||
type: string
|
||||
default: "10.16.3"
|
||||
test-script:
|
||||
type: string
|
||||
default: "test-node"
|
||||
upgrade-chrome:
|
||||
type: string
|
||||
default: ""
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
- when:
|
||||
condition: << parameters.upgrade-chrome >>
|
||||
steps:
|
||||
- run:
|
||||
name: Upgrade chrome
|
||||
command: |
|
||||
sudo apt-get purge chromium-browser
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libappindicator1 fonts-liberation 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 C build environment
|
||||
command: |
|
||||
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
|
||||
sudo apt update
|
||||
sudo apt install gcc-6 g++-6 libusb-1.0-0-dev libudev-dev
|
||||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6
|
||||
|
||||
# - run:
|
||||
# name: Prepare to run parity
|
||||
# command: |
|
||||
# mkdir -p /tmp/parity/keys
|
||||
# cp -r admin/test-parity/parity-keys /tmp/parity/keys/DevelopmentChain
|
||||
# cp admin/test-parity/parity-dev.* /tmp/parity
|
||||
# chmod -R 777 /tmp/parity
|
||||
# ls -la /tmp/parity
|
||||
|
||||
# - run:
|
||||
# name: Starting Parity
|
||||
# command: |
|
||||
# docker run -d \
|
||||
# -p 8545:8545 \
|
||||
# -p 8546:8546 \
|
||||
# -p 30303:30303 \
|
||||
# -p 30303:30303/udp \
|
||||
# --name parity \
|
||||
# -v /tmp/parity:/home/parity/.local/share/io.parity.ethereum parity/parity:v2.4.8-stable \
|
||||
# --chain /home/parity/.local/share/io.parity.ethereum/parity-dev.json \
|
||||
# --unlock=0x7454a8F5a7c7555d79B172C89D20E1f4e4CC226C \
|
||||
# --password /home/parity/.local/share/io.parity.ethereum/parity-dev.pwds \
|
||||
# --min-gas-price 1000000000 \
|
||||
# --jsonrpc-interface all
|
||||
|
||||
# - run:
|
||||
# name: Waiting for Parity to be ready
|
||||
# command: |
|
||||
# for i in `seq 1 20`;
|
||||
# do
|
||||
# nc -z localhost 8545 && echo Success && exit 0
|
||||
# echo -n .
|
||||
# sleep 2
|
||||
# done
|
||||
# docker ps -a
|
||||
# docker logs parity
|
||||
# echo Failed waiting for Parity && exit 1
|
||||
|
||||
- run:
|
||||
name: Run << parameters.test-script >> with node version << parameters.node-version >>
|
||||
command: |
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
|
||||
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
|
||||
nvm install << parameters.node-version >>
|
||||
node -v
|
||||
npm -v
|
||||
gcc --version
|
||||
npm ci
|
||||
npm run bootstrap
|
||||
npm run << parameters.test-script >>
|
||||
|
||||
jobs:
|
||||
node-v8:
|
||||
description: "test with node version 8"
|
||||
executor: machine_executor
|
||||
steps:
|
||||
- build-and-test:
|
||||
node-version: "8.16.1"
|
||||
test-script: "test-node"
|
||||
|
||||
node-v10:
|
||||
description: "test with node version 10"
|
||||
executor: machine_executor
|
||||
steps:
|
||||
- build-and-test:
|
||||
node-version: "10.16.3"
|
||||
test-script: "test-node"
|
||||
|
||||
node-v12:
|
||||
description: "test with node version 12"
|
||||
executor: machine_executor
|
||||
steps:
|
||||
- build-and-test:
|
||||
node-version: "12.13.1"
|
||||
test-script: "test-node"
|
||||
|
||||
browser-esm:
|
||||
description: "test browser with es6 module"
|
||||
executor: machine_executor
|
||||
steps:
|
||||
- build-and-test:
|
||||
node-version: "12.13.1"
|
||||
test-script: "test-browser-esm"
|
||||
upgrade-chrome: "true"
|
||||
|
||||
browser-umd:
|
||||
description: "test browser with es3 module"
|
||||
executor: machine_executor
|
||||
steps:
|
||||
- build-and-test:
|
||||
node-version: "12.13.1"
|
||||
test-script: "test-browser-umd"
|
||||
|
||||
|
||||
workflows:
|
||||
version: 2
|
||||
all:
|
||||
jobs:
|
||||
- node-v8
|
||||
- node-v10
|
||||
- node-v12
|
||||
- browser-esm
|
||||
- browser-umd
|
||||
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
custom: [ 'https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2', 'https://www.buymeacoffee.com/ricmoo' ]
|
||||
22
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
22
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: investigate
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Note: Not all sections may be relevant, but please be as thorough while remaining concise as possible. Remove this Notice and any sections that don't feel pertinent.
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**Reproduction steps**
|
||||
Please include code snippets, with console.log output, any contract ABI, contract address, network and the full error.
|
||||
|
||||
**Environment:**
|
||||
Please include anything that may be useful in diagnosing the issue. Node vs Browser? Geth vs Parity vs Ganache? Third Party tools, like Hardhat? Mobile vs. Desktop?
|
||||
|
||||
**Search Terms**
|
||||
Often similar issues have come up before. Include any search terms you have tried in this repository's Issues (including closed issues) and Discussions, so if there are matching issues, we can be sure to add those keywords to make it easier for people to find in the future.
|
||||
22
.github/ISSUE_TEMPLATE/feature-request.md
vendored
Normal file
22
.github/ISSUE_TEMPLATE/feature-request.md
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Suggest a new feature for ethers
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Note: The best place to start a Feature Request is usually in the Discussions, to mull through the desired feature, current options and think through the impact on the library overall.
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
143
.github/workflows/nodejs.yml
vendored
Normal file
143
.github/workflows/nodejs.yml
vendored
Normal file
@@ -0,0 +1,143 @@
|
||||
name: Node.js CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
|
||||
test-node:
|
||||
|
||||
# runs-on: ubuntu-latest
|
||||
runs-on: macos-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [ 8.x, 10.x, 12.x, 13.x ]
|
||||
|
||||
steps:
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# - name: Install node-hid requirements
|
||||
# run: sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev libudev-dev
|
||||
|
||||
- name: Install dependencies (and link per package)
|
||||
run: npm ci
|
||||
|
||||
- name: Build CommonJS and ESM (from TypeScript)
|
||||
run: npm run build-all
|
||||
|
||||
- name: Run tests
|
||||
run: npm run test-node
|
||||
|
||||
|
||||
test-browser:
|
||||
|
||||
# runs-on: ubuntu-latest
|
||||
runs-on: macos-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
module: [ 'esm', 'umd' ]
|
||||
|
||||
steps:
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 12.x
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# - name: Install node-hid requirements
|
||||
# run: sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev libudev-dev
|
||||
|
||||
- name: Install dependencies (and link per package)
|
||||
run: npm ci
|
||||
|
||||
- name: Build CommonJS and ESM (from TypeScript)
|
||||
run: npm run build-all
|
||||
|
||||
- name: Run tests
|
||||
run: npm run test-browser-${{ matrix.module }}
|
||||
|
||||
test-react-native:
|
||||
|
||||
runs-on: macos-latest
|
||||
|
||||
# Temporary for testing CI
|
||||
continue-on-error: true
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
|
||||
steps:
|
||||
- name: Use Node.js 12.x
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 12.x
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Install dependencies (and link per package)
|
||||
run: npm ci
|
||||
|
||||
- name: Build CommonJS and ESM (from TypeScript)
|
||||
run: npm run build-all
|
||||
|
||||
- name: Run tests
|
||||
run: npm run test-react
|
||||
|
||||
|
||||
coverage:
|
||||
|
||||
name: Coverage
|
||||
|
||||
# runs-on: ubuntu-latest
|
||||
runs-on: macos-latest
|
||||
|
||||
continue-on-error: true
|
||||
|
||||
steps:
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 12.x
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# - name: Install node-hid requirements
|
||||
# run: sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev libudev-dev
|
||||
|
||||
- name: Install dependencies (and link per package)
|
||||
run: npm ci
|
||||
|
||||
- name: Build CommonJS and ESM (from TypeScript)
|
||||
run: npm run build-all
|
||||
|
||||
- name: Run tests
|
||||
run: npm run test-coverage
|
||||
|
||||
- name: Upload coverage summary
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: coverage-summary
|
||||
path: ./output/summary.txt
|
||||
|
||||
- name: Tar files
|
||||
run: tar -cvf ./output/coverage.tar ./output/lcov-report/
|
||||
|
||||
- name: Upload coverage
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: coverage-complete
|
||||
path: ./output/coverage.tar
|
||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1,4 +1,7 @@
|
||||
node_modules/
|
||||
packages/*/node_modules
|
||||
packages/*/lib._esm
|
||||
.package_node_modules/
|
||||
obsolete/
|
||||
.DS_Store
|
||||
.tmp/
|
||||
@@ -18,3 +21,9 @@ lerna-debug.log
|
||||
packages/*/tsconfig.tsbuildinfo
|
||||
|
||||
packages/testcases/input/nameprep/**
|
||||
|
||||
.nyc_output/**
|
||||
|
||||
output/**
|
||||
|
||||
misc/testing/**
|
||||
|
||||
698
CHANGELOG.md
698
CHANGELOG.md
@@ -1,450 +1,312 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
This change log is managed by `scripts/cmds/update-versions` but may be manually updated.
|
||||
|
||||
ethers/v5.0.0-beta.184 (2020-04-28 04:58)
|
||||
-----------------------------------------
|
||||
|
||||
- Removed old EIP-1193 experimental provider; it can now be supported by Web3Provider as EIP-1193 is now backwards compatible. ([84c68ac](https://github.com/ethers-io/ethers.js/commit/84c68ac5c17b10897ade966d6c8fac1f1f66a4af))
|
||||
- Fixed getLogs filter deserialization. ([#805](https://github.com/ethers-io/ethers.js/issues/805); [393c0c7](https://github.com/ethers-io/ethers.js/commit/393c0c74a91175adca2e25026dcdb9e6445afd8f))
|
||||
- Added EIP-1193 support to Web3Provider. ([56af441](https://github.com/ethers-io/ethers.js/commit/56af4413b1dd1787db68985e0b612b63d86fdf7c))
|
||||
- Minor typing-detected fixes. ([d1f3a42](https://github.com/ethers-io/ethers.js/commit/d1f3a42c119d5588eab667ec7bb6e71042cfb656))
|
||||
- Added initial support for recoverable coding erros. ([#800](https://github.com/ethers-io/ethers.js/issues/800); [bda6623](https://github.com/ethers-io/ethers.js/commit/bda66230916e58e25a522e8430ce4de25091eb6b))
|
||||
- More draconian Typing. ([14e6811](https://github.com/ethers-io/ethers.js/commit/14e6811bf7d7c38a3b5714dededcc883c185d814))
|
||||
- Omit HID libraries for hardware-wallets package on unsupported environments. ([#798](https://github.com/ethers-io/ethers.js/issues/798); [2e24920](https://github.com/ethers-io/ethers.js/commit/2e24920d028d42908d0764ad4ca0b56b55f852d1), [5aefb43](https://github.com/ethers-io/ethers.js/commit/5aefb4303d2fdda62e7e5ddb644919f613d6016a))
|
||||
- Make default constructor non-payable. ([#684](https://github.com/ethers-io/ethers.js/issues/684); [017ea0d](https://github.com/ethers-io/ethers.js/commit/017ea0d6bd22833e9d399ae6b818443786f17884))
|
||||
|
||||
ethers/v5.0.0-beta.183 (2020-04-23 23:28)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed inconsistent log format in WebSocketProvider. ([#795](https://github.com/ethers-io/ethers.js/issues/795); [8e7751f](https://github.com/ethers-io/ethers.js/commit/8e7751f7dfb41e58f81c7918cf36c152c3209ae2))
|
||||
- Added WebSocketProvider support for ENS names in filters. ([6707754](https://github.com/ethers-io/ethers.js/commit/6707754580490c5a801d6205af0841794d20b3c9))
|
||||
- Fixed provider filtering by ENS name. ([aeeb75f](https://github.com/ethers-io/ethers.js/commit/aeeb75f74c3be11b9b3b2925fd73349070542e54))
|
||||
- Fixed ContractFactory.deploy ignoring overrides. ([#796](https://github.com/ethers-io/ethers.js/issues/796); [8bb2a0f](https://github.com/ethers-io/ethers.js/commit/8bb2a0fd08f6f128a80444e3fd90c29e4cd7edfb))
|
||||
- Fix median calculation for large block number deltas across FallbackProvider backends. ([fca5ccb](https://github.com/ethers-io/ethers.js/commit/fca5ccbc2052569e700a96dbb1de1c9cef7c966f))
|
||||
- Work-around for Cloudflare not offering eth_blockNumber. ([8cf4b3c](https://github.com/ethers-io/ethers.js/commit/8cf4b3cf4598f4f3643d5ebe9c366466d398cb83))
|
||||
- Added string spell-checking to library and fixed discovered typos. ([71d03c6](https://github.com/ethers-io/ethers.js/commit/71d03c6e3cab1aacb3e4e74d3966fbaa7db2ee06))
|
||||
- Fixed getUrl for node 8. ([560adea](https://github.com/ethers-io/ethers.js/commit/560adeabb06a2ab483bcad162f02ccef41ebc245))
|
||||
- Dependency security updates. ([da3b0bf](https://github.com/ethers-io/ethers.js/commit/da3b0bf0786fe8a95c68485d130ca59c597ffe4d))
|
||||
- Fixes for dist builds without injected XMLHttpRequest. ([#789](https://github.com/ethers-io/ethers.js/issues/789), [#506](https://github.com/ethers-io/ethers.js/issues/506); [9ae6b70](https://github.com/ethers-io/ethers.js/commit/9ae6b70efb9f3d3251820403597085cfa30ace05))
|
||||
|
||||
ethers/v5.0.0-beta.182 (2020-04-16 21:53)
|
||||
-----------------------------------------
|
||||
|
||||
- Added support for Contract event parsing error recovery. ([cc72f76](https://github.com/ethers-io/ethers.js/commit/cc72f76695572d235d7f5a5ad4dc1838a5fe884a))
|
||||
- Fix provider log filters with zero topics. ([#785](https://github.com/ethers-io/ethers.js/issues/785); [4ef0e4f](https://github.com/ethers-io/ethers.js/commit/4ef0e4f7653226bf8cca86e065ad614e7288af96))
|
||||
|
||||
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)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed imports after refactor. ([adf5622](https://github.com/ethers-io/ethers.js/commit/adf56229c6cc83003d319ea9a004677e2555d478))
|
||||
- Refactor some enum names and add UTF-8 error support to the umbrella package. ([931da2f](https://github.com/ethers-io/ethers.js/commit/931da2f77446fc9266cf07f0d7d78d4376625005))
|
||||
- Allow arbitrary apiKey for UrlJsonRpcProvider. ([5878b54](https://github.com/ethers-io/ethers.js/commit/5878b54d6eded1329a6dc3b4023f876a87f72b6e))
|
||||
- Added more general error handling (e.g. error, ignore, replace) for calling toUtf8String. ([a055edb](https://github.com/ethers-io/ethers.js/commit/a055edb5855b96fdf179403458c1694b96fd906c))
|
||||
|
||||
ethers/v5.0.0-beta.168 (2020-01-18 21:46)
|
||||
-----------------------------------------
|
||||
|
||||
- Much more resiliant FallbackProvider which can ignore properties that are only approximate and supports per-provider priorities. ([#635](https://github.com/ethers-io/ethers.js/issues/635), [#588](https://github.com/ethers-io/ethers.js/issues/588); [f4bcf24](https://github.com/ethers-io/ethers.js/commit/f4bcf24a257a17ec9beb98f3d0b3682de543534c))
|
||||
- Fixed some typing for receipts and logs. ([#497](https://github.com/ethers-io/ethers.js/issues/497); [ea102ef](https://github.com/ethers-io/ethers.js/commit/ea102ef7c4fa5df7b9389fbc8a2947bbbd4c471e))
|
||||
- Abstracting mnemonic phrases. ([#685](https://github.com/ethers-io/ethers.js/issues/685); [92a383f](https://github.com/ethers-io/ethers.js/commit/92a383ff0dad4587e44953efca3c6ab795a1b1bd))
|
||||
- Sync GitHub issues. ([75e1a37](https://github.com/ethers-io/ethers.js/commit/75e1a37bb5935d5d538ffcfce5b0073e1334d457))
|
||||
- Fixed 304 status for fetchJson. ([c66d81e](https://github.com/ethers-io/ethers.js/commit/c66d81e96f7c9b0808f181085ffe1c92f6219d46))
|
||||
|
||||
ethers/v5.0.0-beta.167 (2020-01-11 04:16)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed testcases for provider changes. ([90ed07c](https://github.com/ethers-io/ethers.js/commit/90ed07c74e7230ea0f02288b140d497d8b9779e0))
|
||||
- Add support for legacy flat signatures with recid instead of normalized v. ([245cd0e](https://github.com/ethers-io/ethers.js/commit/245cd0e48e07eef35f5bf45ee7fe5ed5ef31338a))
|
||||
- Fix TransactionResponse to have chainId instead of legacy networkId. ([#700](https://github.com/ethers-io/ethers.js/issues/700); [72b3bc9](https://github.com/ethers-io/ethers.js/commit/72b3bc9909074893038c768f3da1564ed96a6a20))
|
||||
- Fixed splitSignature computing wrong v for BytesLike. ([#700](https://github.com/ethers-io/ethers.js/issues/700); [4151c0e](https://github.com/ethers-io/ethers.js/commit/4151c0eacd22287e2369a8656ffa00359db6f84b))
|
||||
- Added dist files for hardware-wallets. ([c846649](https://github.com/ethers-io/ethers.js/commit/c84664953d2f50ee0d704a8aa18fe6c08668dabb))
|
||||
- Browser support (with dist files) for Ledger. ([6f7fbf3](https://github.com/ethers-io/ethers.js/commit/6f7fbf3858c82417933a5e5595a919c0ec0487c7))
|
||||
|
||||
ethers/v5.0.0-beta.166 (2020-01-10 03:09)
|
||||
-----------------------------------------
|
||||
|
||||
- Relaxed joinSignature API to allow SignauteLike. ([602e6a8](https://github.com/ethers-io/ethers.js/commit/602e6a8973480299843a0158f75451a2c6aac749))
|
||||
- Initial code drop of new hardware wallet package. ([2e8f5ca](https://github.com/ethers-io/ethers.js/commit/2e8f5ca7ed498261079da75713b18f3370dfd236))
|
||||
- Added more docs. ([381a72d](https://github.com/ethers-io/ethers.js/commit/381a72ddaa7fb59ef2ded84d228296d693df05c3))
|
||||
|
||||
ethers/v5.0.0-beta.165 (2020-01-09 03:31)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed require resolution for CLI scripts. ([c04f9a7](https://github.com/ethers-io/ethers.js/commit/c04f9a7fff727bb04a4aa3a0fa05fd5cd8e795a6))
|
||||
- Added new URLs for default ETC (and ETC testnets) providers. ([#351](https://github.com/ethers-io/ethers.js/issues/351); [3c184ac](https://github.com/ethers-io/ethers.js/commit/3c184ace21aafbb27f4d44cce1bb738af899d59f))
|
||||
|
||||
ethers/v5.0.0-beta.164 (2020-01-07 19:57)
|
||||
-----------------------------------------
|
||||
|
||||
- Use better Description typing. ([2d5492c](https://github.com/ethers-io/ethers.js/commit/2d5492cd2ee722c818c249244af7b5bea05d67b0))
|
||||
- Better property access on ABI decoded results. ([#698](https://github.com/ethers-io/ethers.js/issues/698); [13f50ab](https://github.com/ethers-io/ethers.js/commit/13f50abd847f7ddcc7e54c102da54e2d23b86fae))
|
||||
- Better typing support for Description. ([d0f4642](https://github.com/ethers-io/ethers.js/commit/d0f4642f6d2c9f5119f1910a0082894c60e81191))
|
||||
- Fixed resolveName when name is an address with an invalid checksum. ([#694](https://github.com/ethers-io/ethers.js/issues/694); [1e72fc7](https://github.com/ethers-io/ethers.js/commit/1e72fc7d6f7c3be4410dbdcfbab9a0463ceb52bd))
|
||||
|
||||
ethers/v5.0.0-beta.163 (2020-01-06 18:57)
|
||||
-----------------------------------------
|
||||
|
||||
- Added function to generate CREATE2 addresses. ([#697](https://github.com/ethers-io/ethers.js/issues/697); [eb26a6d](https://github.com/ethers-io/ethers.js/commit/eb26a6d95022a241c44f859e7b2f29646afb4914))
|
||||
- Force constructor name to be null (instead of undefined). ([a648f2b](https://github.com/ethers-io/ethers.js/commit/a648f2bd1e5e52a3662896f04fe7025884866972))
|
||||
- Added documentation uploading script. ([e593aba](https://github.com/ethers-io/ethers.js/commit/e593aba2946c98820b0c2edf9c5dab6cb30c7402))
|
||||
- Added Czech wordlist to default wordlists export. ([#691](https://github.com/ethers-io/ethers.js/issues/691); [5724fa5](https://github.com/ethers-io/ethers.js/commit/5724fa5d9c6fe73f14ec8bdea1f7226a222537ef))
|
||||
- Added Czech BIP-39 wordlist. ([#691](https://github.com/ethers-io/ethers.js/issues/691); [f54f06b](https://github.com/ethers-io/ethers.js/commit/f54f06b5c8092997fd3c9055d69a3e0796ce44f3))
|
||||
- Updated README. ([e809ead](https://github.com/ethers-io/ethers.js/commit/e809eadf8d608cd8c8a78c08a2e3547dd09156cf))
|
||||
- Updating docs. ([184c459](https://github.com/ethers-io/ethers.js/commit/184c459fab0d089a8a879584b72e5eb3560b33ce))
|
||||
- Merge branch 'yuetloo-ethers-v5-beta' into ethers-v5-beta ([06cafe3](https://github.com/ethers-io/ethers.js/commit/06cafe3437ef129b47f5f9c02f4759f2c4854d3c))
|
||||
- Add circleci and parity test files ([fdf0980](https://github.com/ethers-io/ethers.js/commit/fdf0980663ffead0faf3e9b7b233b22ca1574e21))
|
||||
- Fixed typo in package test dist scripts. ([9c78c7f](https://github.com/ethers-io/ethers.js/commit/9c78c7fee69d07733048d898d58205ae7f5c82d7))
|
||||
|
||||
ethers/v5.0.0-beta.162 (2019-11-25 0:02)
|
||||
----------------------------------------
|
||||
|
||||
- Update elliptic package to protect from Minerva timing attack. ([#666](https://github.com/ethers-io/ethers.js/issues/666); [cf036e1](https://github.com/ethers-io/ethers.js/commit/cf036e1ffad3340fcf1c7559d0032493ccc08e6e))
|
||||
- Browser and node testing works again. ([4470477](https://github.com/ethers-io/ethers.js/commit/4470477d7fd3031f2f3a1fbd9c538468c33c7350))
|
||||
|
||||
ethers/v5.0.0-beta.161 (2019-11-23 21:43)
|
||||
-----------------------------------------
|
||||
|
||||
- Updated dist files (sorted package.json to reduce package version change chatter). ([f308ba3](https://github.com/ethers-io/ethers.js/commit/f308ba3540ed0d282d099456d0369873ad9596b0))
|
||||
- Stubs for adding throttle support. ([2f0e679](https://github.com/ethers-io/ethers.js/commit/2f0e679f0bc81bf901cf60a79e50f9715cddec5a))
|
||||
- Refactor wordlists. ([abab9f6](https://github.com/ethers-io/ethers.js/commit/abab9f6aa27d1870d1053e7caa951408b86c454d))
|
||||
- Browser testcases work again. ([c11c2e2](https://github.com/ethers-io/ethers.js/commit/c11c2e2e3376a6764f07ed443245823f2792b8cc))
|
||||
- Added dist files for non-English wordlists. ([3d75c52](https://github.com/ethers-io/ethers.js/commit/3d75c52dac668af5eeede3e7764dadd3055a0707))
|
||||
- Sync GitHub issue cache. ([29f0e9d](https://github.com/ethers-io/ethers.js/commit/29f0e9dd627a7b4b7f772300497f27718c9ecc7b))
|
||||
|
||||
ethers/v5.0.0-beta.160 (2019-11-20 18:36)
|
||||
-----------------------------------------
|
||||
|
||||
- Updated API in testcases. ([3ab3733](https://github.com/ethers-io/ethers.js/commit/3ab373334c75800f2b20b6639ed8eb1b11e453ef))
|
||||
- Fixed scrypt import in ESM build. ([b72ef27](https://github.com/ethers-io/ethers.js/commit/b72ef27b2a8f9941fb9d79122ec449fed9d2464d))
|
||||
- Fixed null apiKey problem for InfuraProvider. ([e518151](https://github.com/ethers-io/ethers.js/commit/e51815150912d10e2734707986b10b37c87d6d12))
|
||||
- Added support for sighash-style tuple parsing. ([19aaade](https://github.com/ethers-io/ethers.js/commit/19aaade9c62510012cfd50ae487ebd1705a28678))
|
||||
- Fixed solc imports for cli. ([c35ddaf](https://github.com/ethers-io/ethers.js/commit/c35ddaf646efa25e738fee604585a0a7af45b206))
|
||||
- Added nonce manager to experimental index. ([8316406](https://github.com/ethers-io/ethers.js/commit/8316406977ea26ca2044d16f7b3bb6ba21ef5b43))
|
||||
- Removing NodesmithProvider from default provider as it is being discontinued. ([01ca350](https://github.com/ethers-io/ethers.js/commit/01ca35036ca11a47f60890e5cae62e46a00f3da8))
|
||||
- Moved bare ABI named functions and events from Interface into Contracts to simplify other consumers of Interface. ([da8ca2e](https://github.com/ethers-io/ethers.js/commit/da8ca2e8bc982fc3ea0343bb3c593a485ca1fef0))
|
||||
- Added support for complex API keys including support for INFURA project secrets. ([#464](https://github.com/ethers-io/ethers.js/issues/464), [#651](https://github.com/ethers-io/ethers.js/issues/651), [#652](https://github.com/ethers-io/ethers.js/issues/652); [1ec5804](https://github.com/ethers-io/ethers.js/commit/1ec5804bd460f6948d4813469fdc7bf739baa6a6))
|
||||
- Migrated to scrypt-js v3. ([75895fa](https://github.com/ethers-io/ethers.js/commit/75895fa1491e7542c755a102f4e4c190685fd2b6))
|
||||
- Moved getDefaultProvider to providers package. ([51e4ef2](https://github.com/ethers-io/ethers.js/commit/51e4ef2b45b83a8d82923600a2fac544d70b0807))
|
||||
- Migrating providers to modern syntax and scoping. ([#634](https://github.com/ethers-io/ethers.js/issues/634); [e1509a6](https://github.com/ethers-io/ethers.js/commit/e1509a6326dd2cb8bf7ed64b82dd3947b768a314))
|
||||
- Migrating to modern syntax and scoping. ([#634](https://github.com/ethers-io/ethers.js/issues/634); [394c36c](https://github.com/ethers-io/ethers.js/commit/394c36cad43f229a94c72d21f94d1c7982a887a1))
|
||||
- Added provider property to Web3Provider. ([#641](https://github.com/ethers-io/ethers.js/issues/641); [1d4f90a](https://github.com/ethers-io/ethers.js/commit/1d4f90a958da6364117353850d62535c9702abd2))
|
||||
- Updated GitHub issue cache. ([494381a](https://github.com/ethers-io/ethers.js/commit/494381a6284cc8ed90bd8002d42a6b6d94dc1200))
|
||||
- Force deploy receipt to address to be null. ([#573](https://github.com/ethers-io/ethers.js/issues/573); [d9d438a](https://github.com/ethers-io/ethers.js/commit/d9d438a119bb11f8516fc9cf02c534ab3816fcb3))
|
||||
- Updated experimental NonceManager. ([3d514c8](https://github.com/ethers-io/ethers.js/commit/3d514c8dbb94e1c4ce5754463e683dd9dbe7c0aa))
|
||||
- Fixed typo in error message. ([28339a9](https://github.com/ethers-io/ethers.js/commit/28339a9c8585392086da159a46df4afb8958915c))
|
||||
- Added GitHub issue caching. ([fea867a](https://github.com/ethers-io/ethers.js/commit/fea867a206f007a17718396e486883a5e718aa29))
|
||||
|
||||
ethers/v5.0.0-beta.159 (2019-10-17 01:08)
|
||||
-----------------------------------------
|
||||
|
||||
- Removing TypeScript build files from npm to fix excessive package diffs.
|
||||
- Fixed getBlock for blockhashes with a leading 0. ([#629](https://github.com/ethers-io/ethers.js/issues/629); [12cfc59](https://github.com/ethers-io/ethers.js/commit/12cfc599656d7e3a6d3d9aa4e468592865a711cc))
|
||||
|
||||
ethers/v5.0.0-beta.158 (2019-09-28 01:56)
|
||||
-----------------------------------------
|
||||
|
||||
- Added less-common, but useful, coding functions to Interface. ([778eb3b](https://github.com/ethers-io/ethers.js/commit/778eb3b425b5ab5b23d28e75be92feccd0fc56bc))
|
||||
- Add response handling and 304 support to fetchJson. ([3d25882](https://github.com/ethers-io/ethers.js/commit/3d25882d6bf689740506b9c569f6e0d30da6f6a5))
|
||||
- Allow numeric values in a transaction to be odd-lengthed hexstrings. ([#614](https://github.com/ethers-io/ethers.js/issues/614); [a12030a](https://github.com/ethers-io/ethers.js/commit/a12030ad29aa13c02aa75d9e0860f4986a0043b4))
|
||||
- Simpler crypt for admin tools. ([828c8cf](https://github.com/ethers-io/ethers.js/commit/828c8cfd419ac4f8d11d978c2e2ff83eba5ae909))
|
||||
|
||||
ethers/v5.0.0-beta.157 (2019-09-08 02:43)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed getContractAddress for odd-length hex values. ([#572](https://github.com/ethers-io/ethers.js/issues/572); [751793e](https://github.com/ethers-io/ethers.js/commit/751793ea25183d54d7fc4c610a789608f91c062e))
|
||||
- Fixed typo in error message. ([#592](https://github.com/ethers-io/ethers.js/issues/592); [6f4291f](https://github.com/ethers-io/ethers.js/commit/6f4291f65f0ea20c65fef7fd7b09b4d5bf5f0dcd))
|
||||
- Fixed typo in error message. ([#580](https://github.com/ethers-io/ethers.js/issues/580); [9c63b4a](https://github.com/ethers-io/ethers.js/commit/9c63b4a7535f423a802bb1c17c325ce968987349))
|
||||
- Fixed typo in error message. ([#574](https://github.com/ethers-io/ethers.js/issues/574); [22a2673](https://github.com/ethers-io/ethers.js/commit/22a26736cc332fe6e896c9d2707cc99ceee2fb10))
|
||||
|
||||
ethers/v5.0.0-beta.156 (2019-09-06 17:56)
|
||||
-----------------------------------------
|
||||
|
||||
- Removed export star to fix UMD dist file. ([4c17c4d](https://github.com/ethers-io/ethers.js/commit/4c17c4db0455e1b89fd597c4c929cdc36aa3d90d))
|
||||
- Updated TypeScript version. ([e8028d0](https://github.com/ethers-io/ethers.js/commit/e8028d0e73368257b76b394bb8e2bf63f8aecd71))
|
||||
- Fixed test suites and reporter. ([1e0ed4e](https://github.com/ethers-io/ethers.js/commit/1e0ed4e99a22a27fe5057336f8cb320809768f3e))
|
||||
- Added lock-versions admin tool. ([2187604](https://github.com/ethers-io/ethers.js/commit/21876049137644af2b3afa31120ee95d032843a8))
|
||||
- Updated packages with version lock and moved types. ([85b4db7](https://github.com/ethers-io/ethers.js/commit/85b4db7d6db37b853f11a90cf4648c34404edcf9))
|
||||
- Fixed typo in error message. ([#592](https://github.com/ethers-io/ethers.js/issues/592); [019c1fc](https://github.com/ethers-io/ethers.js/commit/019c1fc7089b3da2d7bd41c933b6c6bc35c8dade))
|
||||
- Fixed build process to re-target browser field to ES version. ([3a91e91](https://github.com/ethers-io/ethers.js/commit/3a91e91df56c1ef6cf096c0322f74fd5060891e0))
|
||||
- Major overhaul in compilation to enable ES6 module generation. ([73a0077](https://github.com/ethers-io/ethers.js/commit/73a0077fd38c6ae79f33a9d4d3cc128a904b4a6c))
|
||||
- Updated some of the flatworm docs. ([81fd942](https://github.com/ethers-io/ethers.js/commit/81fd9428cab4be7eee7ddeb564bf91f282cae475))
|
||||
- Fixed package descriptions. ([#561](https://github.com/ethers-io/ethers.js/issues/561); [ebfca98](https://github.com/ethers-io/ethers.js/commit/ebfca98dc276d6f6ca6961632635e8203bb17645))
|
||||
|
||||
ethers/v5.0.0-beta.155 (2019-08-22 17:11)
|
||||
-----------------------------------------
|
||||
|
||||
- Added Wrapped Ether and Token transfers to CLI. ([c031a13](https://github.com/ethers-io/ethers.js/commit/c031a1336815923bae85d9982dba0985a79cfaed))
|
||||
- Fixed sendTransaction and use median gas price in FallbackProvider. ([07e1599](https://github.com/ethers-io/ethers.js/commit/07e15993ba181cfbff987778d158dbde6bb84de2))
|
||||
- Port optional Secret Storage wallet address to v5. ([#582](https://github.com/ethers-io/ethers.js/issues/582); [a12d60d](https://github.com/ethers-io/ethers.js/commit/a12d60d722dfcf998a2e06eba5e46390d7d442e5))
|
||||
- Updated flatworm docs output. ([8745a81](https://github.com/ethers-io/ethers.js/commit/8745a81b11b710036ddb546308c13958be1affb9))
|
||||
- Added initial flatworm documentation stubs. ([0333a76](https://github.com/ethers-io/ethers.js/commit/0333a76f4ff382b5b59b24c672b702721e7a386a))
|
||||
|
||||
ethers/v5.0.0-beta.154 (2019-08-21 01:51)
|
||||
-----------------------------------------
|
||||
|
||||
- Use safe transfer for ENS in CLI. ([b7494d8](https://github.com/ethers-io/ethers.js/commit/b7494d8618001797a4e856f3d1886273897e6ba4))
|
||||
- Fixed quorum-matching logic for FallbackProvider. ([b304ec1](https://github.com/ethers-io/ethers.js/commit/b304ec1f008ec5301c0dbd1a493d790fe3528512))
|
||||
- Added CloudflareProvider. ([#587](https://github.com/ethers-io/ethers.js/issues/587); [621313d](https://github.com/ethers-io/ethers.js/commit/621313d2a697bc6e1dd25eb5b08d67e832a28d05))
|
||||
- Added receipt to CALL_EXCEPTION errors. ([724c32e](https://github.com/ethers-io/ethers.js/commit/724c32e8c08b55404594f263e52babb0550a15b8))
|
||||
|
||||
ethers/v5.0.0-beta.153 (2019-08-06 19:15)
|
||||
-----------------------------------------
|
||||
|
||||
- Updated gas estimate failure messaging to include that the tx may simple be causing a revert. ([edb26b1](https://github.com/ethers-io/ethers.js/commit/edb26b16354afd707e5d03e174c4cc809b951c4f))
|
||||
- Additional sanity checks in ethers-ens. ([de4b2a4](https://github.com/ethers-io/ethers.js/commit/de4b2a449ca3a49807c8bedb3e21e8e8d71e63fc))
|
||||
- Fix bug in --wait for CLI. ([9977c9f](https://github.com/ethers-io/ethers.js/commit/9977c9f66a7007dcc1963128c88c584b6b6c064b))
|
||||
- Added content-hash support to ENS CLI. ([7dfef46](https://github.com/ethers-io/ethers.js/commit/7dfef463f83a9190d1b89cf81e0fb692da3dd813))
|
||||
|
||||
ethers/v5.0.0-beta.152 (2019-08-05 14:37)
|
||||
-----------------------------------------
|
||||
|
||||
- Using CLI --wait instead of custom Plugin flag for ethers-ens. ([19ee2b5](https://github.com/ethers-io/ethers.js/commit/19ee2b516005b2c35b846f19457ec9bbfa0c283b))
|
||||
- Added --wait as a general flag to CLI. ([7640292](https://github.com/ethers-io/ethers.js/commit/7640292ac8b7b9e6de3ad6699d23e2debf26cc1b))
|
||||
- Added migrate-registrar and transfer to ENS CLI. ([31e8e1b](https://github.com/ethers-io/ethers.js/commit/31e8e1b0520bc8be390fbf7e2b473c36a8649eb3))
|
||||
- Include data in the CLI transaction dump. ([53bd96a](https://github.com/ethers-io/ethers.js/commit/53bd96a9f675233906033290f1e0c71ca4e9d389))
|
||||
- Better errors on gas estimation failure. ([0e6b810](https://github.com/ethers-io/ethers.js/commit/0e6b810def390309240508a99b2cf0736848dedd))
|
||||
|
||||
ethers/v5.0.0-beta.151 (2019-08-05 14:29)
|
||||
-----------------------------------------
|
||||
|
||||
- Added package name prefix to all _version for Logger. ([692589d](https://github.com/ethers-io/ethers.js/commit/692589db54cbca10a2a453e9a1801a8612056559))
|
||||
|
||||
ethers/v5.0.0-beta.150 (2019-08-03 01:07)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed old references to errors package. ([1cabce7](https://github.com/ethers-io/ethers.js/commit/1cabce7e1c23b15cc2b630c0b403dd72d815a5ba))
|
||||
- Added generation scripts for Table A.1 for stringprep. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [b21681a](https://github.com/ethers-io/ethers.js/commit/b21681a7f4292b0e77315caad3a59fe814e9292b))
|
||||
|
||||
ethers/v5.0.0-beta.149 (2019-08-03 00:45)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed some case-folding and added Table A.1 for IDNA. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [f955dca](https://github.com/ethers-io/ethers.js/commit/f955dca417a6f86690cf33a81b08baa99e1b1a5c))
|
||||
- Removed references to legacy errors pacakge and updated umbrella pacakge. ([c09de16](https://github.com/ethers-io/ethers.js/commit/c09de163473c361cac11ddef9ec852f4cbb7d8e3))
|
||||
- Updated admin module to use new fetchJson. ([226c100](https://github.com/ethers-io/ethers.js/commit/226c100c72c3fcb0c0e3b62be5f579fd9cc4c904))
|
||||
- Updated dist files. ([8354c3f](https://github.com/ethers-io/ethers.js/commit/8354c3f9fe5487f21acaaeccd4450d9a5d495bc1))
|
||||
- Full case-folding for IDNA in namehash. ([0af95f4](https://github.com/ethers-io/ethers.js/commit/0af95f4a655106e67c2ba8f445af88c9e9e24339))
|
||||
- Deprecating errors for logger. ([0b224e8](https://github.com/ethers-io/ethers.js/commit/0b224e8fb5811cd06727063c909ca1e1e5cde57e))
|
||||
- More consistent debug events for Providers. ([e8f28b5](https://github.com/ethers-io/ethers.js/commit/e8f28b55d7dd62e29f03628232ffe7c75dc811b5))
|
||||
This change log is managed by `admin/cmds/update-versions` but may be manually updated.
|
||||
|
||||
ethers/v5.0.0-beta.148 (2019-07-27 18:56)
|
||||
-----------------------------------------
|
||||
ethers/v5.2.0 (2021-05-17 16:18)
|
||||
--------------------------------
|
||||
|
||||
- Initial drop of new ENS CLI tool. ([c3c65b2](https://github.com/ethers-io/ethers.js/commit/c3c65b2fa19e117d6433c2e0b3d20decfe506c74))
|
||||
- Added TypeScript tool support for functions with multiple outputs. ([6de4a5d](https://github.com/ethers-io/ethers.js/commit/6de4a5d8a9d114c4c33c58f8a304b60e7370eeff))
|
||||
- Added CLI support for stand-alone (no sub-command) tools. ([b67b121](https://github.com/ethers-io/ethers.js/commit/b67b12123996f1aaf7cbe3c8648fd85a22d6674e))
|
||||
- Make utils.resolveProperties preserve object parameter order. ([74dbc28](https://github.com/ethers-io/ethers.js/commit/74dbc281ede042c5eeaa7b45150b215dea860a88))
|
||||
- Added initial IDNA support for full UTF-8 support in namehash. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [28eb38e](https://github.com/ethers-io/ethers.js/commit/28eb38ee703288aaad9f730b2d93fe3aeea7ada6))
|
||||
- More aggresively check for mempool transactions sent from JsonRpcSigner. ([3316468](https://github.com/ethers-io/ethers.js/commit/3316468e3e0a5925cbecad85d894cc7d622394e7))
|
||||
- Added initial support for detecting replacement transactions. ([#1477](https://github.com/ethers-io/ethers.js/issues/1477); [987bec8](https://github.com/ethers-io/ethers.js/commit/987bec87afaa365f291290a0136cedbc2b1992f2), [5144acf](https://github.com/ethers-io/ethers.js/commit/5144acf456b51c95bbe3950bd37609abecc7ebc7))
|
||||
- Added convenience method for HD path derivation. ([aadc5cd](https://github.com/ethers-io/ethers.js/commit/aadc5cd3d65421e13ebd4e4d7c293ac3ece5e178))
|
||||
- Added mnemonicPath option to cli. ([6e08809](https://github.com/ethers-io/ethers.js/commit/6e088099adabd7c5d2e6710062ebc62b316ba0f1))
|
||||
- Added some popular Ethereum-compatible chains to networks. ([b6370f1](https://github.com/ethers-io/ethers.js/commit/b6370f13600a0c444342cbf16a83f010a929976b))
|
||||
- Added debug event to Web3Provider. ([26464c5](https://github.com/ethers-io/ethers.js/commit/26464c54258f98c321638475d6cf11595186e76d))
|
||||
- Abstracted EtherscanProivder to more easily fascilitate other Etherscan-supported chains. ([#1204](https://github.com/ethers-io/ethers.js/issues/1204), [#1473](https://github.com/ethers-io/ethers.js/issues/1473); [37a9c77](https://github.com/ethers-io/ethers.js/commit/37a9c77ab2acb7f75e1fc4cc918810d2fe59dd76))
|
||||
- Added Custom Contract Errors. ([#1498](https://github.com/ethers-io/ethers.js/issues/1498); [6519609](https://github.com/ethers-io/ethers.js/commit/65196097f6626401638d85cf19e3d628a6223d5d), [483d67f](https://github.com/ethers-io/ethers.js/commit/483d67f55c15a76bcd853e889a0e35815d9850f7))
|
||||
- More flexible FixedNumber input and output for strings with no decimals. ([#1019](https://github.com/ethers-io/ethers.js/issues/1019), [#1291](https://github.com/ethers-io/ethers.js/issues/1291), [#1463](https://github.com/ethers-io/ethers.js/issues/1463); [a9cdbe1](https://github.com/ethers-io/ethers.js/commit/a9cdbe1238c149a7167c6bb1a78f314805b52755))
|
||||
- Added hex support for bigint. ([#1472](https://github.com/ethers-io/ethers.js/issues/1472); [4e9abfd](https://github.com/ethers-io/ethers.js/commit/4e9abfdee478a8423da4d55feea8c1aae78a8eb4))
|
||||
- Added support for null entries in EventFilter. ([#1499](https://github.com/ethers-io/ethers.js/issues/1499); [3bb5fbf](https://github.com/ethers-io/ethers.js/commit/3bb5fbf533107e880377ecc14f30f314a5028e56))
|
||||
- Add bigint to allowed BigNumberish types. ([#1472](https://github.com/ethers-io/ethers.js/issues/1472); [cadccc3](https://github.com/ethers-io/ethers.js/commit/cadccc3060b88ab2ca64aeb302717d2d1c95a897))
|
||||
- Minor version bump. ([8e22e02](https://github.com/ethers-io/ethers.js/commit/8e22e0260eb70713c943c9e99ee8d66d71ebe56d))
|
||||
|
||||
ethers/v5.0.0-beta.147 (2019-07-23 01:04)
|
||||
-----------------------------------------
|
||||
ethers/v5.1.4 (2021-04-22 06:33)
|
||||
--------------------------------
|
||||
|
||||
- Use the CLI solc instead of solc directly for ABI testcase generation. ([99c7b1c](https://github.com/ethers-io/ethers.js/commit/99c7b1ca94382490b9757fd51375a7ad4259b831))
|
||||
- Added experimental UTF-8 functions for escaping non-ascii strings. ([b132e32](https://github.com/ethers-io/ethers.js/commit/b132e32172c9d63e59209628dadd5796dd6291c8))
|
||||
- Bump Solidity version in CLI to 0.5.10. ([6005248](https://github.com/ethers-io/ethers.js/commit/600524842e1a4b857e8428a45c0c7d1baa0624ee))
|
||||
- Do not throw on ABI "error" type. ([#1493](https://github.com/ethers-io/ethers.js/issues/1493), [#1497](https://github.com/ethers-io/ethers.js/issues/1497); [bd05aed](https://github.com/ethers-io/ethers.js/commit/bd05aed070ac9e1421a3e2bff2ceea150bedf9b7))
|
||||
|
||||
ethers/v5.0.0-beta.146 (2019-07-20 21:06)
|
||||
-----------------------------------------
|
||||
ethers/v5.1.3 (2021-04-19 21:01)
|
||||
--------------------------------
|
||||
|
||||
- Keep extra filter topics when using Frgment filters in Contracts. ([efaafb2](https://github.com/ethers-io/ethers.js/commit/efaafb203feaf703de803df7e346652372e9fb75))
|
||||
- Updated package.json description for Contract package. ([#561](https://github.com/ethers-io/ethers.js/issues/561); [d88ee45](https://github.com/ethers-io/ethers.js/commit/d88ee45937b3484b68f72e3f72ad6c29556c984b))
|
||||
- Fixed JsonRpcProvider event-loop caching when using any network. ([#1484](https://github.com/ethers-io/ethers.js/issues/1484); [58488e7](https://github.com/ethers-io/ethers.js/commit/58488e78f9ef79715693e19b42663335aad88c03))
|
||||
- Updated experimental Eip1193Bridge to support final EIP-1193 API. ([2911659](https://github.com/ethers-io/ethers.js/commit/29116593ba6c9c0fa491b13787cca8b233d4218c))
|
||||
- Fail early for ABI decoding that will obviously run out of data. ([#1486](https://github.com/ethers-io/ethers.js/issues/1486); [51f0e1a](https://github.com/ethers-io/ethers.js/commit/51f0e1a52fb885e6f146f7b3b70ed487fd1c8f5a))
|
||||
- Fixed BigNumber toBigInt return type. ([#1485](https://github.com/ethers-io/ethers.js/issues/1485); [c086962](https://github.com/ethers-io/ethers.js/commit/c0869623024bbf3671938dad03b131ff2ac54345))
|
||||
|
||||
ethers/v5.0.0-beta.145 (2019-07-20 20:12)
|
||||
-----------------------------------------
|
||||
ethers/v5.1.2 (2021-04-18 19:31)
|
||||
--------------------------------
|
||||
|
||||
- Export provider.Formatter. ([#562](https://github.com/ethers-io/ethers.js/issues/562); [083fd76](https://github.com/ethers-io/ethers.js/commit/083fd76a3a638ec16d5f9bf652101e5a150c7347))
|
||||
- Update CLI to use new Fragment.format style. ([9a41199](https://github.com/ethers-io/ethers.js/commit/9a4119910b07d1ad61bafafb38ac18a9dae1d9ed))
|
||||
- Added FormatTypes to utils. ([a05027c](https://github.com/ethers-io/ethers.js/commit/a05027c744102bbe1be5e13dd89b9c1e64b3b526))
|
||||
- Added experimental memory-hard password scheme for password-protected mnemonics to the CLI. ([5877418](https://github.com/ethers-io/ethers.js/commit/5877418de94256a69fdf2ad466ba579309b9dee8))
|
||||
- Added more flexible output options to fragment.format (JSON and minimal) and better JSON object parsing. ([e9558c8](https://github.com/ethers-io/ethers.js/commit/e9558c8d4fe6df889f4d7ba6ac6448aa543ef99d))
|
||||
- Increase provider tests gas price for sending a transaction. ([8eaeba3](https://github.com/ethers-io/ethers.js/commit/8eaeba35f550c3d9aa1ae62eb8d8e0c912818f7f))
|
||||
- Fixed run-checking non-filter Contract events. ([#1458](https://github.com/ethers-io/ethers.js/issues/1458); [4a44865](https://github.com/ethers-io/ethers.js/commit/4a44865a8c22adb9c55d5c37a81ee46ebc68228c))
|
||||
|
||||
ethers/v5.0.0-beta.144 (2019-07-09 17:28)
|
||||
-----------------------------------------
|
||||
ethers/v5.1.1 (2021-04-18 02:47)
|
||||
--------------------------------
|
||||
|
||||
- Make mnemonic phrases case agnostic. ([#557](https://github.com/ethers-io/ethers.js/issues/557); [e4423b7](https://github.com/ethers-io/ethers.js/commit/e4423b7a277e7e1be1c02d345d4ab1eab484c9b8))
|
||||
- Increased sendTransaction timeout to 15 minutes and pull Pocket from tx tests. ([08adc18](https://github.com/ethers-io/ethers.js/commit/08adc18a68bdc730633bdaaf2329014a84c12b2b))
|
||||
- Export Eip1193Bridge in experimental package. ([1fcf4b6](https://github.com/ethers-io/ethers.js/commit/1fcf4b6ce6922d2bcb245375c967da3072f113ed))
|
||||
- Prevent non-typed transactions from unsafely ignoring specified access lists. ([#1364](https://github.com/ethers-io/ethers.js/issues/1364); [4577444](https://github.com/ethers-io/ethers.js/commit/4577444c448f41114263077c5b54fbe6af749fd4))
|
||||
- Update tests for current EIP-2930 support across backends. ([#1364](https://github.com/ethers-io/ethers.js/issues/1364); [1cb3199](https://github.com/ethers-io/ethers.js/commit/1cb3199e5cb01f5a55eb00ab6c7904606d7ea1dd))
|
||||
- Removed underscore from the JsonRpcBatchProvider name. ([#62](https://github.com/ethers-io/ethers.js/issues/62), [#656](https://github.com/ethers-io/ethers.js/issues/656), [#892](https://github.com/ethers-io/ethers.js/issues/892); [ae0d5eb](https://github.com/ethers-io/ethers.js/commit/ae0d5eb7c2e37a003d893671db59c2d5719aea0f))
|
||||
- Added better error detection when pre-EIP-155 transactions are disabled. ([b8df000](https://github.com/ethers-io/ethers.js/commit/b8df000c8f0ccd252b6049ac5a32a986d5a8e08d))
|
||||
- Fix Android React Native environment shims which crash on normalizing Korean test. ([#1298](https://github.com/ethers-io/ethers.js/issues/1298); [eb1ec2f](https://github.com/ethers-io/ethers.js/commit/eb1ec2f2318e2851073ea1634e5003cdb53f1c1b))
|
||||
- Fixed EIP-2930 transactions for EtherscanProvider. ([#1364](https://github.com/ethers-io/ethers.js/issues/1364); [b655089](https://github.com/ethers-io/ethers.js/commit/b65508995ce7d02f109a970ebeb625819beb915a))
|
||||
- Re-enable AlchemyProvider Berlin tests. ([bec066b](https://github.com/ethers-io/ethers.js/commit/bec066bcb5ab8b95a7e7ce4848d7b76d7f248ccc))
|
||||
- Added experimental _JsonRpcBatchProvider. ([#62](https://github.com/ethers-io/ethers.js/issues/62), [#656](https://github.com/ethers-io/ethers.js/issues/656), [#892](https://github.com/ethers-io/ethers.js/issues/892); [d55ab6d](https://github.com/ethers-io/ethers.js/commit/d55ab6d4e6025c484cc7e64486d927bd54a0772b))
|
||||
- Cache JsonRpcProvider requests for certain methods per event loop. ([#1371](https://github.com/ethers-io/ethers.js/issues/1371); [1a7c4e8](https://github.com/ethers-io/ethers.js/commit/1a7c4e89efecc2b8afc8bea4c1f8f75fdaac08c5))
|
||||
|
||||
ethers/v5.0.0-beta.143 (2019-07-02 16:12)
|
||||
-----------------------------------------
|
||||
ethers/v5.1.0 (2021-03-30 14:44)
|
||||
--------------------------------
|
||||
|
||||
- Adding more support for offline signing in the CLI. ([9cc269c](https://github.com/ethers-io/ethers.js/commit/9cc269ceb5d33b2d88542d4bc6771279f729e733))
|
||||
- Allow providers to prepare their Network object. ([6484908](https://github.com/ethers-io/ethers.js/commit/6484908cb25dd35e5d98b2672dca72ed3f30cbe1))
|
||||
- Export BIP-44 default path in ethers.utils. ([04bdf45](https://github.com/ethers-io/ethers.js/commit/04bdf456eb07aa72872265e0ee01e3231d2b6cf1))
|
||||
- Added BigNumber.toBigInt method. ([#1415](https://github.com/ethers-io/ethers.js/issues/1415); [81fd628](https://github.com/ethers-io/ethers.js/commit/81fd628292b7dde90fe5115074fa68476a872dbf))
|
||||
- Abstracted Contract with BaseContract without meta-class properties for easier extensions. ([#1384](https://github.com/ethers-io/ethers.js/issues/1384); [87ceaed](https://github.com/ethers-io/ethers.js/commit/87ceaed4be21283619da74678cf371c228c918b7))
|
||||
- Fixed Contract properties that collide with null member properties. ([#1393](https://github.com/ethers-io/ethers.js/issues/1393); [0e1721b](https://github.com/ethers-io/ethers.js/commit/0e1721b13084dacf63089e47116f7d5331be4f36))
|
||||
- Added EIP-2930 support. ([#1364](https://github.com/ethers-io/ethers.js/issues/1364); [c47d2eb](https://github.com/ethers-io/ethers.js/commit/c47d2eba4dc741eb5cb754c3ef5064b8ea7ac7cc))
|
||||
- Added abstraction for EIP-2718 support. ([1db4ce1](https://github.com/ethers-io/ethers.js/commit/1db4ce12d49e235a7155de24ee153f409e7e7370))
|
||||
|
||||
ethers/v5.0.0-beta.142 (2019-06-28 16:13)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.32 (2021-03-07 18:17)
|
||||
---------------------------------
|
||||
|
||||
- Do not require a Signer for contract.populateTransaction. ([0e78386](https://github.com/ethers-io/ethers.js/commit/0e78386a08d3d3a0a98c8d03cd665b8992ab3ea2))
|
||||
- Bumping version of solc to 0.5.9. ([e2da447](https://github.com/ethers-io/ethers.js/commit/e2da447c7bc05937966bc4909c47291e4819d2a9))
|
||||
- Bumped TypeScript to 4.2.2. ([#1288](https://github.com/ethers-io/ethers.js/issues/1288); [b2ecffb](https://github.com/ethers-io/ethers.js/commit/b2ecffb0c8d44c8ee65199e7866dc744abae4e6e))
|
||||
- Fixed shims from not displaying debug information. ([a953f71](https://github.com/ethers-io/ethers.js/commit/a953f717523a844a3a45810a5acc6630383884d3))
|
||||
- Force TypedData numbers to be in decimal. ([#1193](https://github.com/ethers-io/ethers.js/issues/1193); [c5a53d6](https://github.com/ethers-io/ethers.js/commit/c5a53d6911d7c41dd03a290b550e80f2919e9379))
|
||||
|
||||
ethers/v5.0.0-beta.141 (2019-06-24 21:25)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.31 (2021-02-12 19:04)
|
||||
---------------------------------
|
||||
|
||||
- Fix non-ES6 import in keccak256. ([5eb393d](https://github.com/ethers-io/ethers.js/commit/5eb393d828328b34567566d3c0d622b4aef1e202))
|
||||
- Refactored wordlist exports to export Wordlist directly. ([746d255](https://github.com/ethers-io/ethers.js/commit/746d255b741844b615583b2de3ffd07631b4e872))
|
||||
- Prevent unhandled rejections when passing nullish into Contract constructor. ([#1234](https://github.com/ethers-io/ethers.js/issues/1234); [d937668](https://github.com/ethers-io/ethers.js/commit/d937668dc1d39cc293f64bbd30b99b29614d1607))
|
||||
- Better error messaging when provider backends give bogus responses. ([#1243](https://github.com/ethers-io/ethers.js/issues/1243); [8279120](https://github.com/ethers-io/ethers.js/commit/8279120e0ad1cbb7aeabd32c08e168a4228abbec))
|
||||
- Prevent unconfigured ENS names from making an init tx. ([#1290](https://github.com/ethers-io/ethers.js/issues/1290); [243beff](https://github.com/ethers-io/ethers.js/commit/243beffa4f83c910f5f1c5e0554531e5dcf3ab93))
|
||||
|
||||
ethers/v5.0.0-beta.140 (2019-06-12 01:25)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.30 (2021-02-08 15:22)
|
||||
---------------------------------
|
||||
|
||||
- Move from node-fetch to cross-fetch; better browser fallback implementation. ([826ffbc](https://github.com/ethers-io/ethers.js/commit/826ffbc7c4ed1c301f30e6f264eedeaf3c243ca8))
|
||||
- Added getStatic with support for inheritance of static methods. ([5e4535e](https://github.com/ethers-io/ethers.js/commit/5e4535e939fdb9d9d23bd14b3e2590873d3eb508))
|
||||
- Fixed node-fetch for Safari (todo: push this fix upstream to node-fetch). ([7164e51](https://github.com/ethers-io/ethers.js/commit/7164e51131215ae3201b49f8c7f5ade8cbd8a420))
|
||||
- Migrated XMLHttpRequest to fetch API. ([#506](https://github.com/ethers-io/ethers.js/issues/506); [62201c5](https://github.com/ethers-io/ethers.js/commit/62201c5eebc52e9723dbbb2cc64823155ce1e0f9))
|
||||
- When in Status trigger personal_sign instead of eth_sign. ([#1285](https://github.com/ethers-io/ethers.js/issues/1285); [73e9434](https://github.com/ethers-io/ethers.js/commit/73e94349de94d2969ccb21c834119525ddfcb961))
|
||||
- Bump elliptic version for CVE-2020-28498. ([#1284](https://github.com/ethers-io/ethers.js/issues/1284); [796954f](https://github.com/ethers-io/ethers.js/commit/796954f8807b0c464c7baa8f7ff299e22685e192))
|
||||
|
||||
ethers/v5.0.0-beta.139 (2019-06-11 17:55)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.29 (2021-02-03 14:36)
|
||||
---------------------------------
|
||||
|
||||
- Removed freeze option from deepCopy; all properties are read-only and only objects may have new properties added. ([1bc792d](https://github.com/ethers-io/ethers.js/commit/1bc792d9dcc6a06a1be4fc5e5b9a538a3f6b7ada))
|
||||
- Moved away from isNamedInstance which breaks after Browserify name mangling. ([257d67c](https://github.com/ethers-io/ethers.js/commit/257d67c9625fa237bcfb3d651c49aa3b79175cae))
|
||||
- Expose poll function in utils. ([#512](https://github.com/ethers-io/ethers.js/issues/512); [e6f6383](https://github.com/ethers-io/ethers.js/commit/e6f6383346818fa67423f1f20450e011242eb554))
|
||||
- Make TransactionResponse hash required. ([#537](https://github.com/ethers-io/ethers.js/issues/537); [095c1fe](https://github.com/ethers-io/ethers.js/commit/095c1fe579068a3204ea0d1bc1893f293f61e719))
|
||||
- Fixed typos in JSON ABI formatting. ([#1275](https://github.com/ethers-io/ethers.js/issues/1275); [73b31b3](https://github.com/ethers-io/ethers.js/commit/73b31b371fa47bacc4f5f6bed01d0d1e5d66fa2c))
|
||||
|
||||
ethers/v5.0.0-beta.138 (2019-06-04 16:05)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.28 (2021-02-02 17:12)
|
||||
---------------------------------
|
||||
|
||||
- Fixed INFURA project ID checking. ([#534](https://github.com/ethers-io/ethers.js/issues/534); [5bf763f](https://github.com/ethers-io/ethers.js/commit/5bf763fe2307e8570ab5e91e30c43e2e5731fc39))
|
||||
- Added load balancer support to PocketProvider. ([#1052](https://github.com/ethers-io/ethers.js/issues/1052); [27a981c](https://github.com/ethers-io/ethers.js/commit/27a981c84b578feb762fdb37dd5325d9c335bd59))
|
||||
|
||||
ethers/v5.0.0-beta.137 (2019-06-01 14:06)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.27 (2021-02-01 15:55)
|
||||
---------------------------------
|
||||
|
||||
- Fixed invalid arrayify value in browser for SHA2-HMAC. ([#530](https://github.com/ethers-io/ethers.js/issues/530); [c4a494b](https://github.com/ethers-io/ethers.js/commit/c4a494b528f2e5f706c159d916d8ff0ffd96a211))
|
||||
- Fix event and function fragment formatting. ([a2d4b29](https://github.com/ethers-io/ethers.js/commit/a2d4b2907184d9480a72fe6f67652489074af86e))
|
||||
- Fixed default JsonRpcSigner. ([#532](https://github.com/ethers-io/ethers.js/issues/532); [5ba6a61](https://github.com/ethers-io/ethers.js/commit/5ba6a616a6f969b1f28f8c6367c21488f497a7ae))
|
||||
- Added changelog management to update-versions. ([4a3f719](https://github.com/ethers-io/ethers.js/commit/4a3f7190dc04275030d313289e1ba6a2b31407ec))
|
||||
- Added support for networks with slightly incorrect EIP-658 implementations. ([#952](https://github.com/ethers-io/ethers.js/issues/952), [#1251](https://github.com/ethers-io/ethers.js/issues/1251); [e727efc](https://github.com/ethers-io/ethers.js/commit/e727efc33eaa31c3af6adbb64a893caf354d0ba7))
|
||||
- Added Pocket network to the default provider. ([#1030](https://github.com/ethers-io/ethers.js/issues/1030), [#1052](https://github.com/ethers-io/ethers.js/issues/1052); [4af2c19](https://github.com/ethers-io/ethers.js/commit/4af2c19f455bb43406d3cc5421c3b3fdda75f78f))
|
||||
- Added TypeScript declaration maps. ([#401](https://github.com/ethers-io/ethers.js/issues/401); [3396846](https://github.com/ethers-io/ethers.js/commit/3396846a30a4be0ed58fe449589e7e4e54f3d32e))
|
||||
|
||||
ethers/v5.0.0-beta.136
|
||||
----------------------
|
||||
ethers/v5.0.26 (2021-01-13 14:47)
|
||||
---------------------------------
|
||||
|
||||
- Added queryFilter to Contracts. ([#463](https://github.com/ethers-io/ethers.js/issues/463); [eea53bb](https://github.com/ethers-io/ethers.js/commit/eea53bb1be29ad2bd1b229a13c85b12be264b019))
|
||||
- Allow storage class in Human-Readable ABI. ([#476](https://github.com/ethers-io/ethers.js/issues/476); [cf39adb](https://github.com/ethers-io/ethers.js/commit/cf39adb09020ca0393e028b330bfd07fb4869236))
|
||||
- Track per-provider JSON-RPC ID in JsonRpcProvider. ([#337](https://github.com/ethers-io/ethers.js/issues/337), [#489](https://github.com/ethers-io/ethers.js/issues/489); [044554b](https://github.com/ethers-io/ethers.js/commit/044554b58525d1677646a74119f86ea867a06d1e))
|
||||
- Fixed typo in error message. ([#470](https://github.com/ethers-io/ethers.js/issues/470); [47d92ae](https://github.com/ethers-io/ethers.js/commit/47d92aeff02cacfb26793850c7faef7cb21ce4cf))
|
||||
- Fixed abundant UnhandledRejectErrors in provider polling. ([#1084](https://github.com/ethers-io/ethers.js/issues/1084), [#1208](https://github.com/ethers-io/ethers.js/issues/1208), [#1221](https://github.com/ethers-io/ethers.js/issues/1221), [#1235](https://github.com/ethers-io/ethers.js/issues/1235); [74470de](https://github.com/ethers-io/ethers.js/commit/74470defda5170338735bbbe676c207cdd5cc1cf), [20f6e16](https://github.com/ethers-io/ethers.js/commit/20f6e16394909a43498c1ac6c73152957bd121bd))
|
||||
- Fixed non-checksum address comparisons in abstract Signer. ([#1236](https://github.com/ethers-io/ethers.js/issues/1236); [8175c83](https://github.com/ethers-io/ethers.js/commit/8175c83026436b6335800780ca12b7257e1b490f))
|
||||
|
||||
ethers/v5.0.0-beta.135
|
||||
----------------------
|
||||
ethers/v5.0.25 (2021-01-08 03:31)
|
||||
---------------------------------
|
||||
|
||||
- Better error message for unconfigured ENS names. ([#504](https://github.com/ethers-io/ethers.js/issues/504); [3cbc4b4](https://github.com/ethers-io/ethers.js/commit/3cbc4b462262ba61fa7d99a7a12e7bbf8049afb1))
|
||||
- Fixed contract events. ([#404](https://github.com/ethers-io/ethers.js/issues/404); [8cdda37](https://github.com/ethers-io/ethers.js/commit/8cdda37095df28f828ccd2ac5437ccb6541b16cc))
|
||||
- Updated license for BaseX to include original authors; was only included in the source. ([03c9725](https://github.com/ethers-io/ethers.js/commit/03c97259c46de10dbe6ce62921de2f32ffff0522))
|
||||
- Safety check on digest length for signing. ([20335e9](https://github.com/ethers-io/ethers.js/commit/20335e96c2429e851081b72031ea3fd4cd677904))
|
||||
- Fixed listenerCount for contract when requesting for all events. ([#1205](https://github.com/ethers-io/ethers.js/issues/1205); [a56a0a3](https://github.com/ethers-io/ethers.js/commit/a56a0a33366ea9276fba5bc45f1e4678dd723fa6))
|
||||
- Lock package versions for the ESM builds. ([#1009](https://github.com/ethers-io/ethers.js/issues/1009); [0e6cc9a](https://github.com/ethers-io/ethers.js/commit/0e6cc9a9a8ebceae4529ccbb7c107618eb54490a))
|
||||
|
||||
ethers/v5.0.24 (2020-12-08 01:43)
|
||||
---------------------------------
|
||||
|
||||
- Fixed EIP-712 getPayload dropping EIP712Domain from types for JSON-RPC calls. ([#687](https://github.com/ethers-io/ethers.js/issues/687); [d3b1ac0](https://github.com/ethers-io/ethers.js/commit/d3b1ac046aaf2a46f6c3efbd93c55adb0cb8f16d))
|
||||
- Remvoed dead files. ([70c2b1b](https://github.com/ethers-io/ethers.js/commit/70c2b1b3002f44c39f4fd87fc2cfc3f5dc6555ed))
|
||||
|
||||
ethers/v5.0.23 (2020-11-25 15:25)
|
||||
---------------------------------
|
||||
|
||||
- Fix BigNumber when passed something with a length property. ([#1172](https://github.com/ethers-io/ethers.js/issues/1172); [45a2902](https://github.com/ethers-io/ethers.js/commit/45a2902874e828a16396a253548bcb00bceccf95))
|
||||
|
||||
ethers/v5.0.22 (2020-11-23 19:16)
|
||||
---------------------------------
|
||||
|
||||
- Added directory to repo field for each package. ([799896a](https://github.com/ethers-io/ethers.js/commit/799896ac13cce857ce0124d2fb480f5d1eed114c))
|
||||
- Add ABI coder function to compute default values. ([#1101](https://github.com/ethers-io/ethers.js/issues/1101); [a8e3380](https://github.com/ethers-io/ethers.js/commit/a8e3380ed547b6368be5fe40b48be6e31b5cdd93))
|
||||
- Fix for new versions of Geth which return formatted data on revert rather than standard data. ([#949](https://github.com/ethers-io/ethers.js/issues/949); [4a8d579](https://github.com/ethers-io/ethers.js/commit/4a8d579dcaf026d0c232e20176605d34cba4767d))
|
||||
- Addd missing sideEffects flag to some packages. ([20defec](https://github.com/ethers-io/ethers.js/commit/20defec9f1683487b6ea9c8730d2ab7b3745bfa5))
|
||||
- Allow base-10 to be passed into BigNumbner.toString and improve errors for other radices. ([#1164](https://github.com/ethers-io/ethers.js/issues/1164); [c8bb77d](https://github.com/ethers-io/ethers.js/commit/c8bb77d8af85d2f9f9df82f1afbe7516ab296e98), [fbbe4ad](https://github.com/ethers-io/ethers.js/commit/fbbe4ad638e06089cdd976a7f4ffd51b85a31558))
|
||||
- Allow private keys to Wallet to omit the 0x prefix. ([#1166](https://github.com/ethers-io/ethers.js/issues/1166); [29f6c34](https://github.com/ethers-io/ethers.js/commit/29f6c34343d75fa42023bdcd07632f49a450570c))
|
||||
|
||||
ethers/v5.0.21 (2020-11-19 18:52)
|
||||
---------------------------------
|
||||
|
||||
- Force address to use bignumber package with base36 private functions. ([#1163](https://github.com/ethers-io/ethers.js/issues/1163); [c9e5480](https://github.com/ethers-io/ethers.js/commit/c9e548071e9ed03e3b12f40f0be779c16422a73f))
|
||||
- Remove stray console.log in hardware wallets. ([#1136](https://github.com/ethers-io/ethers.js/issues/1136); [cc63e61](https://github.com/ethers-io/ethers.js/commit/cc63e61f73d530c28655f9421506a25fc0a49df0))
|
||||
- Added some funding links for the sponsor button. ([2816850](https://github.com/ethers-io/ethers.js/commit/2816850716d4bf2b458f1db4e0c7a5dc09fb14f7))
|
||||
- Remove invalid pkg.module reference. ([#1133](https://github.com/ethers-io/ethers.js/issues/1133); [cddc258](https://github.com/ethers-io/ethers.js/commit/cddc258c963ab63de426b89ef190b83aefe6f6cd))
|
||||
|
||||
ethers/v5.0.20 (2020-11-17 20:32)
|
||||
---------------------------------
|
||||
|
||||
- Fix browser ws alias for WebSockets. ([02546b9](https://github.com/ethers-io/ethers.js/commit/02546b9401d8066135b4453da917f7ef49c95ad8))
|
||||
- Fixing React Native tests. ([f10977a](https://github.com/ethers-io/ethers.js/commit/f10977ab35f953c3148d99b61799788f47d2a5a2), [fff72ef](https://github.com/ethers-io/ethers.js/commit/fff72ef369f5420bf8283b0808e8fec71f26dd2b))
|
||||
- Refactoring dist build process. ([4809325](https://github.com/ethers-io/ethers.js/commit/4809325bee9cbdd269b099d7b12b218f441ac840), [22bd0c7](https://github.com/ethers-io/ethers.js/commit/22bd0c76dddef7134618ec70ac1b084a054e616e), [8933467](https://github.com/ethers-io/ethers.js/commit/8933467c01b64ead547d7c136f22f3c05c85ca1f))
|
||||
|
||||
ethers/v5.0.19 (2020-10-22 21:55)
|
||||
---------------------------------
|
||||
|
||||
- Allow 0x as a numeric value for 0 in Provider formatter. ([#1104](https://github.com/ethers-io/ethers.js/issues/1104); [fe17a29](https://github.com/ethers-io/ethers.js/commit/fe17a295816214d063f3d6bd4f3273e0ce0c3eac))
|
||||
- Use POST for long requests in EtherscanProvider. ([#1093](https://github.com/ethers-io/ethers.js/issues/1093); [28f60d5](https://github.com/ethers-io/ethers.js/commit/28f60d5ef83665541c8c1b432f8e173d73cb8227))
|
||||
- Added verifyTypedData for EIP-712 typed data. ([#687](https://github.com/ethers-io/ethers.js/issues/687); [550ecf2](https://github.com/ethers-io/ethers.js/commit/550ecf2f25b90f6d8996583489a218dbf2306ebc), [a21202c](https://github.com/ethers-io/ethers.js/commit/a21202c66b392ec6f91296d66551dffca742cf0a))
|
||||
|
||||
ethers/v5.0.18 (2020-10-19 01:26)
|
||||
---------------------------------
|
||||
|
||||
- Fix signTypedData call for JsonRpcSigner. ([#687](https://github.com/ethers-io/ethers.js/issues/687); [15a90af](https://github.com/ethers-io/ethers.js/commit/15a90af5be75806e26f589f0a3f3687c0fb1c672))
|
||||
- Added EIP-712 test cases. ([#687](https://github.com/ethers-io/ethers.js/issues/687); [1589353](https://github.com/ethers-io/ethers.js/commit/15893537c3d9c92fe8748a3e9617d133d1d5d6a7))
|
||||
- Initial Signer support for EIP-712 signed typed data. ([#687](https://github.com/ethers-io/ethers.js/issues/687); [be4e216](https://github.com/ethers-io/ethers.js/commit/be4e2164e64dfa0697561763e8079120a485a566))
|
||||
- Split hash library files up. ([3e676f2](https://github.com/ethers-io/ethers.js/commit/3e676f21b00931ed966f4561e4f28792a1f8f154))
|
||||
- Added EIP-712 multi-dimensional array support. ([#687](https://github.com/ethers-io/ethers.js/issues/687); [5a4dd5a](https://github.com/ethers-io/ethers.js/commit/5a4dd5a70377d3e86823d279d6ff466d03767644))
|
||||
- Consolidated TypedDataEncoder methods. ([#687](https://github.com/ethers-io/ethers.js/issues/687); [345a830](https://github.com/ethers-io/ethers.js/commit/345a830dc4bc869d5f3edfdc27465797e7663055))
|
||||
- Initial EIP-712 utilities. ([#687](https://github.com/ethers-io/ethers.js/issues/687); [cfa6dec](https://github.com/ethers-io/ethers.js/commit/cfa6dec29314fe485df283974612d40550bc4179))
|
||||
- Added initial PocketProvider. ([#1052](https://github.com/ethers-io/ethers.js/issues/1052); [a62d20d](https://github.com/ethers-io/ethers.js/commit/a62d20d86f2d545b9a7bcda5418993790b7db91c))
|
||||
|
||||
ethers/v5.0.17 (2020-10-07 20:08)
|
||||
---------------------------------
|
||||
|
||||
- Better error message for parseUnits of non-strings. ([#981](https://github.com/ethers-io/ethers.js/issues/981); [5abc2f3](https://github.com/ethers-io/ethers.js/commit/5abc2f36e20eef79a935961f3dd8133b5528d9e5))
|
||||
- Add gzip support to AlchemyProivder and InfuraProvider fetching. ([#1085](https://github.com/ethers-io/ethers.js/issues/1085); [38a068b](https://github.com/ethers-io/ethers.js/commit/38a068bcea3f251c8f3a349a90fcb077a39d23ad))
|
||||
- Add gzip support to getUrl in node. ([#1085](https://github.com/ethers-io/ethers.js/issues/1085); [65772a8](https://github.com/ethers-io/ethers.js/commit/65772a8e1a55d663bdb67e3a2b160fecc9f986ef))
|
||||
- Added CommunityResourcable to mark Providers as highly throttled. ([a022093](https://github.com/ethers-io/ethers.js/commit/a022093ce03f55db7ba2cac36e365d1af39ac45b))
|
||||
- Added debug event info to WebSocketProvider. ([#1018](https://github.com/ethers-io/ethers.js/issues/1018); [8e682cc](https://github.com/ethers-io/ethers.js/commit/8e682cc8481c6051a6f8115b29d78f4996120ccd))
|
||||
|
||||
ethers/v5.0.16 (2020-10-05 15:44)
|
||||
---------------------------------
|
||||
|
||||
- ABI encoding performance additions. ([#1012](https://github.com/ethers-io/ethers.js/issues/1012); [f3e5b0d](https://github.com/ethers-io/ethers.js/commit/f3e5b0ded1b227a377fd4799507653c95c76e353))
|
||||
- Export hexConcat in utils. ([#1079](https://github.com/ethers-io/ethers.js/issues/1079); [3d051e4](https://github.com/ethers-io/ethers.js/commit/3d051e454db978f58c7b38ff4484096c3eb85b94))
|
||||
- Cache chain ID for WebSocketProvider. ([#1054](https://github.com/ethers-io/ethers.js/issues/1054); [40264ff](https://github.com/ethers-io/ethers.js/commit/40264ff9006156ba8441e6101e5a7149a5cf03f6))
|
||||
|
||||
ethers/v5.0.15 (2020-09-26 03:22)
|
||||
---------------------------------
|
||||
|
||||
- Add more accurate intrinsic gas cost to ABI calls with specified gas property. ([#1058](https://github.com/ethers-io/ethers.js/issues/1058); [f0a5869](https://github.com/ethers-io/ethers.js/commit/f0a5869c53475e55a5f47d8651f609fff45dc9a7))
|
||||
- Better errors for unconfigured ENS names. ([#1066](https://github.com/ethers-io/ethers.js/issues/1066); [5cd1668](https://github.com/ethers-io/ethers.js/commit/5cd1668e0d29099c5b7ce1fdc1d0e8a41af1a249))
|
||||
- Updated CLI solc to versin 0.7.1. ([4306b35](https://github.com/ethers-io/ethers.js/commit/4306b3563a171baa9d7bf4872475a13c3434f834))
|
||||
|
||||
ethers/v5.0.14 (2020-09-16 02:39)
|
||||
---------------------------------
|
||||
|
||||
- More robust blockchain error detection ([#1047](https://github.com/ethers-io/ethers.js/issues/1047); [49f7157](https://github.com/ethers-io/ethers.js/commit/49f71574f4799d685a5ae8fd24fe1134f752d70a))
|
||||
- Forward blockchain errors from Signer during gas estimation. ([#1047](https://github.com/ethers-io/ethers.js/issues/1047); [9ee685d](https://github.com/ethers-io/ethers.js/commit/9ee685df46753c46cbbde12d05d6ea04f2b5ea3f))
|
||||
- Improve fetch errors with looser mime-type detection. ([#1047](https://github.com/ethers-io/ethers.js/issues/1047); [263bfe5](https://github.com/ethers-io/ethers.js/commit/263bfe5ce632790e0399d06a0ab660a501997998))
|
||||
|
||||
ethers/v5.0.13 (2020-09-11 02:10)
|
||||
---------------------------------
|
||||
|
||||
- Force content-length in web fetching. ([be92339](https://github.com/ethers-io/ethers.js/commit/be923396962ea76bf0fb566dcf8801e58ccf0e7e))
|
||||
- Better error forwarding from FallbackProvider. ([#1021](https://github.com/ethers-io/ethers.js/issues/1021); [bc3eeec](https://github.com/ethers-io/ethers.js/commit/bc3eeeca39adb734f24019d0e942eff2eac6ad4d))
|
||||
- Add clamping functions to FixedNumber. ([#1037](https://github.com/ethers-io/ethers.js/issues/1037); [042b74e](https://github.com/ethers-io/ethers.js/commit/042b74e6ee648d4fa37bf674194273d8f4483bfb))
|
||||
|
||||
ethers/v5.0.12 (2020-09-07 19:54)
|
||||
---------------------------------
|
||||
|
||||
- Allow events to use compact bytes ABI coded data for Solidity 0.4 external events. ([#891](https://github.com/ethers-io/ethers.js/issues/891), [#992](https://github.com/ethers-io/ethers.js/issues/992); [4e394fc](https://github.com/ethers-io/ethers.js/commit/4e394fc68019445ae4b4e201e41f95d6793dbe92))
|
||||
|
||||
ethers/v5.0.11 (2020-09-05 23:51)
|
||||
---------------------------------
|
||||
|
||||
- Synced unorm in shims to most recent version. ([bdccf7b](https://github.com/ethers-io/ethers.js/commit/bdccf7b8d352ba400317266a0a37e6e290633e3c))
|
||||
- Fixed LedgerSigner sendTransaction. ([#936](https://github.com/ethers-io/ethers.js/issues/936); [cadb28d](https://github.com/ethers-io/ethers.js/commit/cadb28d6b364e68e43a06f7a9b8a31797afbd920))
|
||||
- Added BrainWallet to experimental exports. ([72385c2](https://github.com/ethers-io/ethers.js/commit/72385c228783a3158511b3cddc5cb4f9ce1dddae))
|
||||
- More readable server errors. ([201e5ce](https://github.com/ethers-io/ethers.js/commit/201e5ced9c38da2de1dd7518ffbf24284d477e80))
|
||||
|
||||
ethers/v5.0.10 (2020-09-05 01:21)
|
||||
---------------------------------
|
||||
|
||||
- Added retry logic to provider tests. ([0558bba](https://github.com/ethers-io/ethers.js/commit/0558bba8eb1b783ef50bb37bcf4c9bae1f86f1e1), [35b64b9](https://github.com/ethers-io/ethers.js/commit/35b64b9a65e2c09ecb63b0eca712b45a3092c204), [681f2a5](https://github.com/ethers-io/ethers.js/commit/681f2a50b26d7954795dba5aec55bede4740e494))
|
||||
- Fixed link in docs. ([#1028](https://github.com/ethers-io/ethers.js/issues/1028); [2359a98](https://github.com/ethers-io/ethers.js/commit/2359a98641d99b26cf88ec892e3601a8a2c81c9c))
|
||||
- Added memory-like support and new opcodes to asm. ([6fd3bb6](https://github.com/ethers-io/ethers.js/commit/6fd3bb62d10eab1563dc4ddbd88732b4f484ec7a))
|
||||
- Added basic ENS resolver functions for contenthash, text and multi-coin addresses. ([#1003](https://github.com/ethers-io/ethers.js/issues/1003); [83db8a6](https://github.com/ethers-io/ethers.js/commit/83db8a6bd1364458dcfeea544de707df41890b4e))
|
||||
- Added support for changing Reporter logging function. ([d01d0c8](https://github.com/ethers-io/ethers.js/commit/d01d0c8448df40de52253f9e92889ab7e75c6a97))
|
||||
- Initial React Native test harness. ([#993](https://github.com/ethers-io/ethers.js/issues/993); [57eb5b7](https://github.com/ethers-io/ethers.js/commit/57eb5b777e2c67f1f8d74e41d3413e9f0564528d), [d3b473e](https://github.com/ethers-io/ethers.js/commit/d3b473e7c738fdfc65b6f1c8f80bcdacf9827d8a))
|
||||
- Updating shims for constrained environments. ([#944](https://github.com/ethers-io/ethers.js/issues/944), [#993](https://github.com/ethers-io/ethers.js/issues/993); [8abdbbb](https://github.com/ethers-io/ethers.js/commit/8abdbbbf633f96fde2346c4ae70e538895fd7829), [240aac5](https://github.com/ethers-io/ethers.js/commit/240aac568303deff14cbb2366b94c8c89cacefc1))
|
||||
|
||||
ethers/v5.0.9 (2020-08-25 01:45)
|
||||
--------------------------------
|
||||
|
||||
- Updated docs for all packages on npm pages. ([#1013](https://github.com/ethers-io/ethers.js/issues/1013); [cb8f4a3](https://github.com/ethers-io/ethers.js/commit/cb8f4a3a4e378a749c6bbbddf46d8d79d35722cc))
|
||||
- Added JSON support to BigNumber. ([#1010](https://github.com/ethers-io/ethers.js/issues/1010); [8facc1a](https://github.com/ethers-io/ethers.js/commit/8facc1a5305b1f699aa3afc5a0a692abe7927652))
|
||||
- Updated packages for security audit. ([5b5904e](https://github.com/ethers-io/ethers.js/commit/5b5904ea9977ecf8c079a57593b627553f0126a0))
|
||||
- Fix emitted error for ABI code array count mismatch. ([#1004](https://github.com/ethers-io/ethers.js/issues/1004); [b0c082d](https://github.com/ethers-io/ethers.js/commit/b0c082d728dc66b0f2a5ec315da44d6295716284))
|
||||
|
||||
ethers/v5.0.8 (2020-08-04 20:55)
|
||||
--------------------------------
|
||||
|
||||
- Abstract fetchJson for data. ([e2d6f28](https://github.com/ethers-io/ethers.js/commit/e2d6f281d5a2bd749bc72549a4e55f2c752a7bd8), [2c49a52](https://github.com/ethers-io/ethers.js/commit/2c49a52a41a30ae844376561de95f0c851d19f73), [e1bbb06](https://github.com/ethers-io/ethers.js/commit/e1bbb064a10d0b4bf5563e0a79396665d83935a1))
|
||||
|
||||
ethers/v5.0.7 (2020-07-20 02:22)
|
||||
--------------------------------
|
||||
|
||||
- Fix Logger setLogLevel with enum case mismatch. ([#947](https://github.com/ethers-io/ethers.js/issues/947); [5443363](https://github.com/ethers-io/ethers.js/commit/5443363de43e92de712e72d55165c3f4d7f652e9), [af10705](https://github.com/ethers-io/ethers.js/commit/af10705632bc1f8203ea50ea7ed3120b01c67122))
|
||||
- Removed UUID dependency from json-wallets. ([#966](https://github.com/ethers-io/ethers.js/issues/966); [e3f7426](https://github.com/ethers-io/ethers.js/commit/e3f7426af4d6d7e43db322700d768216b06433e0))
|
||||
- Removed unnecessary dependency from BigNumber. ([#951](https://github.com/ethers-io/ethers.js/issues/951); [78b350b](https://github.com/ethers-io/ethers.js/commit/78b350bbc5ea73561bf47038743b9e51049496f7))
|
||||
|
||||
ethers/v5.0.6 (2020-07-16 05:54)
|
||||
--------------------------------
|
||||
|
||||
- Removed unnecessary dependency from BigNumber. ([#951](https://github.com/ethers-io/ethers.js/issues/951); [78b350b](https://github.com/ethers-io/ethers.js/commit/78b350bbc5ea73561bf47038743b9e51049496f7))
|
||||
- Longer Etherscan throttle slot interval. ([9f20258](https://github.com/ethers-io/ethers.js/commit/9f20258d5d39cd901d2078275323071eb0f3505b))
|
||||
- Fixed ENS overrides for the default provider. ([#959](https://github.com/ethers-io/ethers.js/issues/959); [63dd3d4](https://github.com/ethers-io/ethers.js/commit/63dd3d4682b564445948988243fa9139c598587b))
|
||||
- Added Retry-After support and adjustable slot interval to fetchJson. ([7d43545](https://github.com/ethers-io/ethers.js/commit/7d435453039f009b339d835ddee47e35a843711b))
|
||||
- Added initial throttling support. ([#139](https://github.com/ethers-io/ethers.js/issues/139), [#904](https://github.com/ethers-io/ethers.js/issues/904), [#926](https://github.com/ethers-io/ethers.js/issues/926); [88c7eae](https://github.com/ethers-io/ethers.js/commit/88c7eaed061ae9a6798733a97e4e87011d36b8e7))
|
||||
- Use status code 1000 on WebSocket hangup for compatibility. ([588f64c](https://github.com/ethers-io/ethers.js/commit/588f64c760ee49bfb5109bfbaafb4beafe41c52a))
|
||||
- Updated WebSocketProvider to use web-style event listener API. ([57fd6f0](https://github.com/ethers-io/ethers.js/commit/57fd6f06047a1a2a3a46fe8b23ff585293a40062))
|
||||
- Normalize formatUnits to simplified decimals. ([79b1da1](https://github.com/ethers-io/ethers.js/commit/79b1da130be50df80c7e5aeb221edc5669fc211e))
|
||||
- Prevent zero-padding on Solidity type lengths. ([e128bfc](https://github.com/ethers-io/ethers.js/commit/e128bfcd10e006c920532151598700ca33a2127e))
|
||||
- Set sensible defaults for INFURA and AlchemyAPI getWebSocketProvider methods. ([e3d3e60](https://github.com/ethers-io/ethers.js/commit/e3d3e604f299edbafe7d0721c0a3eff5f67c83f4))
|
||||
- Added logger assert methods. ([619a888](https://github.com/ethers-io/ethers.js/commit/619a8888ebe08de9956f60c16703fb3543aeacc4))
|
||||
- Added initial code coverage testing. ([0c1d55b](https://github.com/ethers-io/ethers.js/commit/0c1d55b6dc9c725c86e849d13b911c8bace9821d))
|
||||
- Added destroy to WebSocketProvider. ([d0a79c6](https://github.com/ethers-io/ethers.js/commit/d0a79c6a1362e12f6f102e4af99adfef930092db))
|
||||
- Updated packages (security updates). ([c660176](https://github.com/ethers-io/ethers.js/commit/c6601769ada64832b1ce392680a30cb145c3cab9))
|
||||
|
||||
ethers/v5.0.5 (2020-07-07 23:18)
|
||||
--------------------------------
|
||||
|
||||
- Fixed splitSignature when recoveryParam is encoded directly. ([#893](https://github.com/ethers-io/ethers.js/issues/893), [#933](https://github.com/ethers-io/ethers.js/issues/933); [bf65ddb](https://github.com/ethers-io/ethers.js/commit/bf65ddbff0036f6eb8e99c145f30edff157687f5))
|
||||
- Fixed BigNumber string validation. ([#935](https://github.com/ethers-io/ethers.js/issues/935); [7e56f3d](https://github.com/ethers-io/ethers.js/commit/7e56f3d392e52815c5c859772b99660e0fc38ef5))
|
||||
|
||||
ethers/v5.0.4 (2020-07-04 23:46)
|
||||
--------------------------------
|
||||
|
||||
- Prevent negative exponents in BigNumber. ([#925](https://github.com/ethers-io/ethers.js/issues/925); [84e253f](https://github.com/ethers-io/ethers.js/commit/84e253f3f9674b52fa2a17b097644e91e6474021))
|
||||
- Fixed StaticJsonRpcProvider when auto-detecting network. ([#901](https://github.com/ethers-io/ethers.js/issues/901); [0fd9aa5](https://github.com/ethers-io/ethers.js/commit/0fd9aa5cb6f4a3f9c1bea9b4eeee389700db01fa))
|
||||
- Added WebSocket static method to Alchemy provider and updated Alchemy URLs. ([4838874](https://github.com/ethers-io/ethers.js/commit/48388741272df8569315637f21df7c6519f79e2e))
|
||||
|
||||
ethers/v5.0.3 (2020-06-29 00:50)
|
||||
--------------------------------
|
||||
|
||||
- Fixed typo in error string. ([7fe702d](https://github.com/ethers-io/ethers.js/commit/7fe702d59b0b81d2812e407b99a1e98e0e18ba03))
|
||||
- Updated elliptic package to address possible malleability issue; which should not affect Ethereum. ([9e14345](https://github.com/ethers-io/ethers.js/commit/9e1434503e2a0280e9918c4eadb4d972b062b3b0))
|
||||
- Fixed FixedNumber unguarded constructor and added isZero. ([#898](https://github.com/ethers-io/ethers.js/issues/898); [08c74e9](https://github.com/ethers-io/ethers.js/commit/08c74e9a132f37ab8cc3fb5dab3bd1fd708ee702))
|
||||
- Added StaticJsonRpcProvider for reducing calls to chainId in certain cases. ([#901](https://github.com/ethers-io/ethers.js/issues/901); [c53864d](https://github.com/ethers-io/ethers.js/commit/c53864de0af55dd8ec8ca5681e78da380d85250a))
|
||||
- Allow getDefaultProvider to accept a URL as a network. ([8c1ff4c](https://github.com/ethers-io/ethers.js/commit/8c1ff4c862b8cecb04c98d71910870e0b73867a0))
|
||||
- Make network an optional parameter to WebSocketProvider. ([987b535](https://github.com/ethers-io/ethers.js/commit/987b5354cc18ed41620c43910ac163f358d91b5d))
|
||||
- Removed deprecated errors package. ([f9e9347](https://github.com/ethers-io/ethers.js/commit/f9e9347e69133354c3d65c1f47475ddac8a793cf))
|
||||
- Updated badges in docs. ([d00362e](https://github.com/ethers-io/ethers.js/commit/d00362eb706cfbf9911611e8d934260061cfbbd2))
|
||||
- Create security policy. Create security policy. ([88e6849](https://github.com/ethers-io/ethers.js/commit/88e68495b67d9268ee66362b08c9b691d03ab58a))
|
||||
|
||||
ethers/v5.0.2 (2020-06-13 21:36)
|
||||
--------------------------------
|
||||
|
||||
- Allow provider.ready to stall until the network is available. ([#882](https://github.com/ethers-io/ethers.js/issues/882); [bbb4f40](https://github.com/ethers-io/ethers.js/commit/bbb4f407b34782c36ff93fa528e3b9f793987d4a))
|
||||
- Reduce dependencies to squash security issues. ([738d349](https://github.com/ethers-io/ethers.js/commit/738d34969d7c2184242b92f78228ba6a8aed1f3a))
|
||||
- Updated admin scripts for publishing prod releases. ([e0e0dbe](https://github.com/ethers-io/ethers.js/commit/e0e0dbef1830572c465670b826a7aa2b403ad2e8))
|
||||
|
||||
ethers/v5.0.1 (2020-06-12 23:09)
|
||||
--------------------------------
|
||||
|
||||
- Fixed embedded package version strings. ([5a69e9c](https://github.com/ethers-io/ethers.js/commit/5a69e9caa882aa5f1b44c4453d67cde43254eafe))
|
||||
|
||||
ethers/v5.0.0 (2020-06-12 19:58)
|
||||
--------------------------------
|
||||
|
||||
- Preserve config canary string. ([7157816](https://github.com/ethers-io/ethers.js/commit/7157816fa53f660d750811b293e3b1d5a2f70bd4))
|
||||
- Updated docs. ([9e4c7e6](https://github.com/ethers-io/ethers.js/commit/9e4c7e609d9eeb5f2a11d6a90bfa9d32ee696431))
|
||||
|
||||
523
CHANGELOG.v5-beta.md
Normal file
523
CHANGELOG.v5-beta.md
Normal file
@@ -0,0 +1,523 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
This change log is managed by `scripts/cmds/update-versions` but may be manually updated.
|
||||
|
||||
ethers/v5.0.0-beta.192 (2020-06-12 04:51)
|
||||
-----------------------------------------
|
||||
|
||||
- Support nonpayable Solidity modifier in ABI. ([adc8d3d](https://github.com/ethers-io/ethers.js/commit/adc8d3d9aec2f5ee8e207f8bc77d99052e473d16))
|
||||
- More debug information in timeout and fetch errors. ([#678](https://github.com/ethers-io/ethers.js/issues/678); [693094e](https://github.com/ethers-io/ethers.js/commit/693094e97ce4f0dc0cd49b9cf6b1557bd7dc517d))
|
||||
- Use URL parse instead of constructor for react compatibility. ([#874](https://github.com/ethers-io/ethers.js/issues/874); [5e7d28b](https://github.com/ethers-io/ethers.js/commit/5e7d28b19b18aa1bbb4b851f74f6d7865725be02))
|
||||
|
||||
ethers/v5.0.0-beta.191 (2020-06-03 03:41)
|
||||
-----------------------------------------
|
||||
|
||||
- Allow undefined properties in transaction object and fix stray this. ([#860](https://github.com/ethers-io/ethers.js/issues/860); [98bb589](https://github.com/ethers-io/ethers.js/commit/98bb58964bec7dff0ccf481d474354ec1ca6f376), [d2406c4](https://github.com/ethers-io/ethers.js/commit/d2406c42a18c123205918eb46bf24de0ff97ee23))
|
||||
- Allow JsonRpcSigner to override from if it matches Signer. ([#862](https://github.com/ethers-io/ethers.js/issues/862); [1a89c59](https://github.com/ethers-io/ethers.js/commit/1a89c591c26a7fcc2031d0df90137d8a096c5c01))
|
||||
- Added initial support for spontaneous network changes. ([#495](https://github.com/ethers-io/ethers.js/issues/495), [#861](https://github.com/ethers-io/ethers.js/issues/861); [2bc7bb6](https://github.com/ethers-io/ethers.js/commit/2bc7bb6e61219a40cfe2acd95c115c2195c21223), [d2ca4fb](https://github.com/ethers-io/ethers.js/commit/d2ca4fb443b2653063ca5aa349b52ecd0ff79e2f))
|
||||
|
||||
ethers/v5.0.0-beta.190 (2020-06-01 05:02)
|
||||
-----------------------------------------
|
||||
|
||||
- Re-enable tests removed to fix slow CI. ([cd7a0b3](https://github.com/ethers-io/ethers.js/commit/cd7a0b36cd77df5d5951a97cdb6b6be1c9387f51))
|
||||
- Major Contract refactor for overrides. ([#819](https://github.com/ethers-io/ethers.js/issues/819), [#845](https://github.com/ethers-io/ethers.js/issues/845), [#847](https://github.com/ethers-io/ethers.js/issues/847), [#860](https://github.com/ethers-io/ethers.js/issues/860); [42dee67](https://github.com/ethers-io/ethers.js/commit/42dee67187adb04d0b88f420b24cb3e73301d609))
|
||||
- Remove legacy Circle CI tasks. ([c445232](https://github.com/ethers-io/ethers.js/commit/c445232980007d3474bc036ff59fb37638f93820))
|
||||
- Fixing GitHub actions. ([#853](https://github.com/ethers-io/ethers.js/issues/853); [6b8f0f3](https://github.com/ethers-io/ethers.js/commit/6b8f0f3cb38295cd5d693f9b71f629b591206f1e))
|
||||
|
||||
ethers/v5.0.0-beta.189 (2020-05-29 21:25)
|
||||
-----------------------------------------
|
||||
|
||||
- Simplify typing for properties module. ([41e66ab](https://github.com/ethers-io/ethers.js/commit/41e66ab834e9835807481658a7956207edfef3d7))
|
||||
- Refactor Contract away from monolithic runMethod. ([e5a1b4d](https://github.com/ethers-io/ethers.js/commit/e5a1b4d5cbbaa0a8ce64c72e13d0d12fa2b856e3))
|
||||
- Correctly set last emitted block for WebSocketProvider. ([#856](https://github.com/ethers-io/ethers.js/issues/856); [1b0ad5a](https://github.com/ethers-io/ethers.js/commit/1b0ad5aa69327f80c7814069142965914673dc06))
|
||||
- Fixed delayed network detection attempting to overwrite read-only value. ([#854](https://github.com/ethers-io/ethers.js/issues/854); [8efd8d2](https://github.com/ethers-io/ethers.js/commit/8efd8d203158ebdef040ec759c3b423312a86e7c))
|
||||
- Better WebSocket compatibilities with Parity. ([#849](https://github.com/ethers-io/ethers.js/issues/849); [180a1af](https://github.com/ethers-io/ethers.js/commit/180a1aff3adc5b4af3a1349b52666ca5942c92a2))
|
||||
|
||||
ethers/v5.0.0-beta.188 (2020-05-21 00:02)
|
||||
-----------------------------------------
|
||||
|
||||
- Make filter blockHash property name match EIP-234. ([b03c4ed](https://github.com/ethers-io/ethers.js/commit/b03c4edd31a1929b411d0559d17eee7e3d6b11c8), [ed29fac](https://github.com/ethers-io/ethers.js/commit/ed29fac376c1a0aa210bf75979bb2ab62d0cf46b))
|
||||
- Fixed FallbackProvider sync-stalling for backends. ([#841](https://github.com/ethers-io/ethers.js/issues/841); [f963589](https://github.com/ethers-io/ethers.js/commit/f96358940043123aa7a8fe97a1af7af293ce9740))
|
||||
- Add correct tag to release on publish. ([#828](https://github.com/ethers-io/ethers.js/issues/828); [8516076](https://github.com/ethers-io/ethers.js/commit/85160766cdcd031f226382901ebadee9d7f40200))
|
||||
|
||||
ethers/v5.0.0-beta.187 (2020-05-12 23:29)
|
||||
-----------------------------------------
|
||||
|
||||
- Add sub-error to gas estimate error for Ganache users. ([#829](https://github.com/ethers-io/ethers.js/issues/829); [647fbd8](https://github.com/ethers-io/ethers.js/commit/647fbd8cbfa0f94f72db6faadd528e61c49b1dd6))
|
||||
- Moved ABI check for unique names to coding time and only if ambiguous. ([#816](https://github.com/ethers-io/ethers.js/issues/816); [fa87417](https://github.com/ethers-io/ethers.js/commit/fa87417e9416d99a37d9a2668a1e54feb7e342fc))
|
||||
- Added missing Interface exports to umbrella utils. ([82a9326](https://github.com/ethers-io/ethers.js/commit/82a93263fae330ae39a7212e74d973fa9f820f64))
|
||||
- Fixed FallbackProvider ESM super-this out-of-order issue. ([#822](https://github.com/ethers-io/ethers.js/issues/822); [fde102b](https://github.com/ethers-io/ethers.js/commit/fde102b7eda304403dcc677cd6d3b48339cd3a81))
|
||||
- Fixed node hanging on unnecessary timeout when fetchJson fails. ([fdf2253](https://github.com/ethers-io/ethers.js/commit/fdf2253218cf379043acc32dea8c95c284a82cec))
|
||||
|
||||
ethers/v5.0.0-beta.186 (2020-05-08 15:27)
|
||||
-----------------------------------------
|
||||
|
||||
- Fix JsonRpcProvider out-of-order super call. ([#822](https://github.com/ethers-io/ethers.js/issues/822); [963197d](https://github.com/ethers-io/ethers.js/commit/963197d70c96e5970b431173c2cc782cb496674c))
|
||||
|
||||
ethers/v5.0.0-beta.185 (2020-05-04 22:54)
|
||||
-----------------------------------------
|
||||
|
||||
- More robust FallbackProvider on clean exits. ([8eeda23](https://github.com/ethers-io/ethers.js/commit/8eeda23e989fcb0126bd20b17c67f62466d19259))
|
||||
- Safer test suite reporter timer. ([657a039](https://github.com/ethers-io/ethers.js/commit/657a0394f56b51a13c691477c2b0dcf74678fd7c))
|
||||
- Added goerli to AlchemyProvider tests. ([ab7c781](https://github.com/ethers-io/ethers.js/commit/ab7c78118ab80990a3e3368749599a1cf6e9d4ae))
|
||||
- Added more robust poll event to Provider. ([dc48bfb](https://github.com/ethers-io/ethers.js/commit/dc48bfb7adb9334848c93173ba2c634f22a9a72f))
|
||||
- Added goerli to AlchemyProvider. ([86670eb](https://github.com/ethers-io/ethers.js/commit/86670eb80e96fc4ba4e3664c9389f8130bbfea73))
|
||||
- Removed Cloudflare from test suite; it is down again. ([17dc022](https://github.com/ethers-io/ethers.js/commit/17dc022603afdfe4147638ab4b2704bcef09533f))
|
||||
- Prevent forceOutput in test reporter from crashing. ([cafd344](https://github.com/ethers-io/ethers.js/commit/cafd34460b194d78092021f1d7e0307130340b68))
|
||||
- Stall FallbackProvider backends from requests if not in-sync. ([fa6904f](https://github.com/ethers-io/ethers.js/commit/fa6904fef35e7ab888221f3a0613bfe7e6df3594))
|
||||
- Allow providers to detect their network after instantiation. ([#814](https://github.com/ethers-io/ethers.js/issues/814); [99ae946](https://github.com/ethers-io/ethers.js/commit/99ae946476a317a9d89e5d8f57cf37f8680bfa2b))
|
||||
- Better messaging on low-level network errors. ([#814](https://github.com/ethers-io/ethers.js/issues/814); [0e3a66c](https://github.com/ethers-io/ethers.js/commit/0e3a66c82959a08f3f4e4ffbca3ae3792ff2548f))
|
||||
- Manage FallbackProvider stalling without unref. ([#815](https://github.com/ethers-io/ethers.js/issues/815); [7b1a7c7](https://github.com/ethers-io/ethers.js/commit/7b1a7c7f31a3631e12c2a341b562983360e670e9))
|
||||
- Only error on duplicate signatures in Contract ABI. ([#499](https://github.com/ethers-io/ethers.js/issues/499); [098d7ef](https://github.com/ethers-io/ethers.js/commit/098d7efb21bd648c2660342297d2419904a10925))
|
||||
- Added getWebSocketProvider static method to InfuraProvider. ([a6c1174](https://github.com/ethers-io/ethers.js/commit/a6c1174dffe6dca1a3a64d1d472cec6e12372117))
|
||||
- Fix WebSocketProvider responses when message result is null. ([#813](https://github.com/ethers-io/ethers.js/issues/813); [472e5b0](https://github.com/ethers-io/ethers.js/commit/472e5b07eab180baa12185c8f00e5079ce4c671f))
|
||||
- Allow modifiers on Human-Readable ABI for tuples and arrays. ([83fba3d](https://github.com/ethers-io/ethers.js/commit/83fba3de25b524cc48975b1952f4319d63874205))
|
||||
- Added initial renew support to ENS CLI. ([54dfb75](https://github.com/ethers-io/ethers.js/commit/54dfb757c4c88e4bcada1890c4016fadfb25581a))
|
||||
- Allow contract filters to include OR-ed values. ([#437](https://github.com/ethers-io/ethers.js/issues/437); [28800d7](https://github.com/ethers-io/ethers.js/commit/28800d7681f3bab08f6d30a22f0813e04feee18a))
|
||||
|
||||
ethers/v5.0.0-beta.184 (2020-04-28 04:58)
|
||||
-----------------------------------------
|
||||
|
||||
- Removed old EIP-1193 experimental provider; it can now be supported by Web3Provider as EIP-1193 is now backwards compatible. ([84c68ac](https://github.com/ethers-io/ethers.js/commit/84c68ac5c17b10897ade966d6c8fac1f1f66a4af))
|
||||
- Fixed getLogs filter deserialization. ([#805](https://github.com/ethers-io/ethers.js/issues/805); [393c0c7](https://github.com/ethers-io/ethers.js/commit/393c0c74a91175adca2e25026dcdb9e6445afd8f))
|
||||
- Added EIP-1193 support to Web3Provider. ([56af441](https://github.com/ethers-io/ethers.js/commit/56af4413b1dd1787db68985e0b612b63d86fdf7c))
|
||||
- Minor typing-detected fixes. ([d1f3a42](https://github.com/ethers-io/ethers.js/commit/d1f3a42c119d5588eab667ec7bb6e71042cfb656))
|
||||
- Added initial support for recoverable coding erros. ([#800](https://github.com/ethers-io/ethers.js/issues/800); [bda6623](https://github.com/ethers-io/ethers.js/commit/bda66230916e58e25a522e8430ce4de25091eb6b))
|
||||
- More draconian Typing. ([14e6811](https://github.com/ethers-io/ethers.js/commit/14e6811bf7d7c38a3b5714dededcc883c185d814))
|
||||
- Omit HID libraries for hardware-wallets package on unsupported environments. ([#798](https://github.com/ethers-io/ethers.js/issues/798); [2e24920](https://github.com/ethers-io/ethers.js/commit/2e24920d028d42908d0764ad4ca0b56b55f852d1), [5aefb43](https://github.com/ethers-io/ethers.js/commit/5aefb4303d2fdda62e7e5ddb644919f613d6016a))
|
||||
- Make default constructor non-payable. ([#684](https://github.com/ethers-io/ethers.js/issues/684); [017ea0d](https://github.com/ethers-io/ethers.js/commit/017ea0d6bd22833e9d399ae6b818443786f17884))
|
||||
|
||||
ethers/v5.0.0-beta.183 (2020-04-23 23:28)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed inconsistent log format in WebSocketProvider. ([#795](https://github.com/ethers-io/ethers.js/issues/795); [8e7751f](https://github.com/ethers-io/ethers.js/commit/8e7751f7dfb41e58f81c7918cf36c152c3209ae2))
|
||||
- Added WebSocketProvider support for ENS names in filters. ([6707754](https://github.com/ethers-io/ethers.js/commit/6707754580490c5a801d6205af0841794d20b3c9))
|
||||
- Fixed provider filtering by ENS name. ([aeeb75f](https://github.com/ethers-io/ethers.js/commit/aeeb75f74c3be11b9b3b2925fd73349070542e54))
|
||||
- Fixed ContractFactory.deploy ignoring overrides. ([#796](https://github.com/ethers-io/ethers.js/issues/796); [8bb2a0f](https://github.com/ethers-io/ethers.js/commit/8bb2a0fd08f6f128a80444e3fd90c29e4cd7edfb))
|
||||
- Fix median calculation for large block number deltas across FallbackProvider backends. ([fca5ccb](https://github.com/ethers-io/ethers.js/commit/fca5ccbc2052569e700a96dbb1de1c9cef7c966f))
|
||||
- Work-around for Cloudflare not offering eth_blockNumber. ([8cf4b3c](https://github.com/ethers-io/ethers.js/commit/8cf4b3cf4598f4f3643d5ebe9c366466d398cb83))
|
||||
- Added string spell-checking to library and fixed discovered typos. ([71d03c6](https://github.com/ethers-io/ethers.js/commit/71d03c6e3cab1aacb3e4e74d3966fbaa7db2ee06))
|
||||
- Fixed getUrl for node 8. ([560adea](https://github.com/ethers-io/ethers.js/commit/560adeabb06a2ab483bcad162f02ccef41ebc245))
|
||||
- Dependency security updates. ([da3b0bf](https://github.com/ethers-io/ethers.js/commit/da3b0bf0786fe8a95c68485d130ca59c597ffe4d))
|
||||
- Fixes for dist builds without injected XMLHttpRequest. ([#789](https://github.com/ethers-io/ethers.js/issues/789), [#506](https://github.com/ethers-io/ethers.js/issues/506); [9ae6b70](https://github.com/ethers-io/ethers.js/commit/9ae6b70efb9f3d3251820403597085cfa30ace05))
|
||||
|
||||
ethers/v5.0.0-beta.182 (2020-04-16 21:53)
|
||||
-----------------------------------------
|
||||
|
||||
- Added support for Contract event parsing error recovery. ([cc72f76](https://github.com/ethers-io/ethers.js/commit/cc72f76695572d235d7f5a5ad4dc1838a5fe884a))
|
||||
- Fix provider log filters with zero topics. ([#785](https://github.com/ethers-io/ethers.js/issues/785); [4ef0e4f](https://github.com/ethers-io/ethers.js/commit/4ef0e4f7653226bf8cca86e065ad614e7288af96))
|
||||
|
||||
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)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed imports after refactor. ([adf5622](https://github.com/ethers-io/ethers.js/commit/adf56229c6cc83003d319ea9a004677e2555d478))
|
||||
- Refactor some enum names and add UTF-8 error support to the umbrella package. ([931da2f](https://github.com/ethers-io/ethers.js/commit/931da2f77446fc9266cf07f0d7d78d4376625005))
|
||||
- Allow arbitrary apiKey for UrlJsonRpcProvider. ([5878b54](https://github.com/ethers-io/ethers.js/commit/5878b54d6eded1329a6dc3b4023f876a87f72b6e))
|
||||
- Added more general error handling (e.g. error, ignore, replace) for calling toUtf8String. ([a055edb](https://github.com/ethers-io/ethers.js/commit/a055edb5855b96fdf179403458c1694b96fd906c))
|
||||
|
||||
ethers/v5.0.0-beta.168 (2020-01-18 21:46)
|
||||
-----------------------------------------
|
||||
|
||||
- Much more resiliant FallbackProvider which can ignore properties that are only approximate and supports per-provider priorities. ([#635](https://github.com/ethers-io/ethers.js/issues/635), [#588](https://github.com/ethers-io/ethers.js/issues/588); [f4bcf24](https://github.com/ethers-io/ethers.js/commit/f4bcf24a257a17ec9beb98f3d0b3682de543534c))
|
||||
- Fixed some typing for receipts and logs. ([#497](https://github.com/ethers-io/ethers.js/issues/497); [ea102ef](https://github.com/ethers-io/ethers.js/commit/ea102ef7c4fa5df7b9389fbc8a2947bbbd4c471e))
|
||||
- Abstracting mnemonic phrases. ([#685](https://github.com/ethers-io/ethers.js/issues/685); [92a383f](https://github.com/ethers-io/ethers.js/commit/92a383ff0dad4587e44953efca3c6ab795a1b1bd))
|
||||
- Sync GitHub issues. ([75e1a37](https://github.com/ethers-io/ethers.js/commit/75e1a37bb5935d5d538ffcfce5b0073e1334d457))
|
||||
- Fixed 304 status for fetchJson. ([c66d81e](https://github.com/ethers-io/ethers.js/commit/c66d81e96f7c9b0808f181085ffe1c92f6219d46))
|
||||
|
||||
ethers/v5.0.0-beta.167 (2020-01-11 04:16)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed testcases for provider changes. ([90ed07c](https://github.com/ethers-io/ethers.js/commit/90ed07c74e7230ea0f02288b140d497d8b9779e0))
|
||||
- Add support for legacy flat signatures with recid instead of normalized v. ([245cd0e](https://github.com/ethers-io/ethers.js/commit/245cd0e48e07eef35f5bf45ee7fe5ed5ef31338a))
|
||||
- Fix TransactionResponse to have chainId instead of legacy networkId. ([#700](https://github.com/ethers-io/ethers.js/issues/700); [72b3bc9](https://github.com/ethers-io/ethers.js/commit/72b3bc9909074893038c768f3da1564ed96a6a20))
|
||||
- Fixed splitSignature computing wrong v for BytesLike. ([#700](https://github.com/ethers-io/ethers.js/issues/700); [4151c0e](https://github.com/ethers-io/ethers.js/commit/4151c0eacd22287e2369a8656ffa00359db6f84b))
|
||||
- Added dist files for hardware-wallets. ([c846649](https://github.com/ethers-io/ethers.js/commit/c84664953d2f50ee0d704a8aa18fe6c08668dabb))
|
||||
- Browser support (with dist files) for Ledger. ([6f7fbf3](https://github.com/ethers-io/ethers.js/commit/6f7fbf3858c82417933a5e5595a919c0ec0487c7))
|
||||
|
||||
ethers/v5.0.0-beta.166 (2020-01-10 03:09)
|
||||
-----------------------------------------
|
||||
|
||||
- Relaxed joinSignature API to allow SignauteLike. ([602e6a8](https://github.com/ethers-io/ethers.js/commit/602e6a8973480299843a0158f75451a2c6aac749))
|
||||
- Initial code drop of new hardware wallet package. ([2e8f5ca](https://github.com/ethers-io/ethers.js/commit/2e8f5ca7ed498261079da75713b18f3370dfd236))
|
||||
- Added more docs. ([381a72d](https://github.com/ethers-io/ethers.js/commit/381a72ddaa7fb59ef2ded84d228296d693df05c3))
|
||||
|
||||
ethers/v5.0.0-beta.165 (2020-01-09 03:31)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed require resolution for CLI scripts. ([c04f9a7](https://github.com/ethers-io/ethers.js/commit/c04f9a7fff727bb04a4aa3a0fa05fd5cd8e795a6))
|
||||
- Added new URLs for default ETC (and ETC testnets) providers. ([#351](https://github.com/ethers-io/ethers.js/issues/351); [3c184ac](https://github.com/ethers-io/ethers.js/commit/3c184ace21aafbb27f4d44cce1bb738af899d59f))
|
||||
|
||||
ethers/v5.0.0-beta.164 (2020-01-07 19:57)
|
||||
-----------------------------------------
|
||||
|
||||
- Use better Description typing. ([2d5492c](https://github.com/ethers-io/ethers.js/commit/2d5492cd2ee722c818c249244af7b5bea05d67b0))
|
||||
- Better property access on ABI decoded results. ([#698](https://github.com/ethers-io/ethers.js/issues/698); [13f50ab](https://github.com/ethers-io/ethers.js/commit/13f50abd847f7ddcc7e54c102da54e2d23b86fae))
|
||||
- Better typing support for Description. ([d0f4642](https://github.com/ethers-io/ethers.js/commit/d0f4642f6d2c9f5119f1910a0082894c60e81191))
|
||||
- Fixed resolveName when name is an address with an invalid checksum. ([#694](https://github.com/ethers-io/ethers.js/issues/694); [1e72fc7](https://github.com/ethers-io/ethers.js/commit/1e72fc7d6f7c3be4410dbdcfbab9a0463ceb52bd))
|
||||
|
||||
ethers/v5.0.0-beta.163 (2020-01-06 18:57)
|
||||
-----------------------------------------
|
||||
|
||||
- Added function to generate CREATE2 addresses. ([#697](https://github.com/ethers-io/ethers.js/issues/697); [eb26a6d](https://github.com/ethers-io/ethers.js/commit/eb26a6d95022a241c44f859e7b2f29646afb4914))
|
||||
- Force constructor name to be null (instead of undefined). ([a648f2b](https://github.com/ethers-io/ethers.js/commit/a648f2bd1e5e52a3662896f04fe7025884866972))
|
||||
- Added documentation uploading script. ([e593aba](https://github.com/ethers-io/ethers.js/commit/e593aba2946c98820b0c2edf9c5dab6cb30c7402))
|
||||
- Added Czech wordlist to default wordlists export. ([#691](https://github.com/ethers-io/ethers.js/issues/691); [5724fa5](https://github.com/ethers-io/ethers.js/commit/5724fa5d9c6fe73f14ec8bdea1f7226a222537ef))
|
||||
- Added Czech BIP-39 wordlist. ([#691](https://github.com/ethers-io/ethers.js/issues/691); [f54f06b](https://github.com/ethers-io/ethers.js/commit/f54f06b5c8092997fd3c9055d69a3e0796ce44f3))
|
||||
- Updated README. ([e809ead](https://github.com/ethers-io/ethers.js/commit/e809eadf8d608cd8c8a78c08a2e3547dd09156cf))
|
||||
- Updating docs. ([184c459](https://github.com/ethers-io/ethers.js/commit/184c459fab0d089a8a879584b72e5eb3560b33ce))
|
||||
- Merge branch 'yuetloo-ethers-v5-beta' into ethers-v5-beta ([06cafe3](https://github.com/ethers-io/ethers.js/commit/06cafe3437ef129b47f5f9c02f4759f2c4854d3c))
|
||||
- Add circleci and parity test files ([fdf0980](https://github.com/ethers-io/ethers.js/commit/fdf0980663ffead0faf3e9b7b233b22ca1574e21))
|
||||
- Fixed typo in package test dist scripts. ([9c78c7f](https://github.com/ethers-io/ethers.js/commit/9c78c7fee69d07733048d898d58205ae7f5c82d7))
|
||||
|
||||
ethers/v5.0.0-beta.162 (2019-11-25 00:02)
|
||||
-----------------------------------------
|
||||
|
||||
- Update elliptic package to protect from Minerva timing attack. ([#666](https://github.com/ethers-io/ethers.js/issues/666); [cf036e1](https://github.com/ethers-io/ethers.js/commit/cf036e1ffad3340fcf1c7559d0032493ccc08e6e))
|
||||
- Browser and node testing works again. ([4470477](https://github.com/ethers-io/ethers.js/commit/4470477d7fd3031f2f3a1fbd9c538468c33c7350))
|
||||
|
||||
ethers/v5.0.0-beta.161 (2019-11-23 21:43)
|
||||
-----------------------------------------
|
||||
|
||||
- Updated dist files (sorted package.json to reduce package version change chatter). ([f308ba3](https://github.com/ethers-io/ethers.js/commit/f308ba3540ed0d282d099456d0369873ad9596b0))
|
||||
- Stubs for adding throttle support. ([2f0e679](https://github.com/ethers-io/ethers.js/commit/2f0e679f0bc81bf901cf60a79e50f9715cddec5a))
|
||||
- Refactor wordlists. ([abab9f6](https://github.com/ethers-io/ethers.js/commit/abab9f6aa27d1870d1053e7caa951408b86c454d))
|
||||
- Browser testcases work again. ([c11c2e2](https://github.com/ethers-io/ethers.js/commit/c11c2e2e3376a6764f07ed443245823f2792b8cc))
|
||||
- Added dist files for non-English wordlists. ([3d75c52](https://github.com/ethers-io/ethers.js/commit/3d75c52dac668af5eeede3e7764dadd3055a0707))
|
||||
- Sync GitHub issue cache. ([29f0e9d](https://github.com/ethers-io/ethers.js/commit/29f0e9dd627a7b4b7f772300497f27718c9ecc7b))
|
||||
|
||||
ethers/v5.0.0-beta.160 (2019-11-20 18:36)
|
||||
-----------------------------------------
|
||||
|
||||
- Updated API in testcases. ([3ab3733](https://github.com/ethers-io/ethers.js/commit/3ab373334c75800f2b20b6639ed8eb1b11e453ef))
|
||||
- Fixed scrypt import in ESM build. ([b72ef27](https://github.com/ethers-io/ethers.js/commit/b72ef27b2a8f9941fb9d79122ec449fed9d2464d))
|
||||
- Fixed null apiKey problem for InfuraProvider. ([e518151](https://github.com/ethers-io/ethers.js/commit/e51815150912d10e2734707986b10b37c87d6d12))
|
||||
- Added support for sighash-style tuple parsing. ([19aaade](https://github.com/ethers-io/ethers.js/commit/19aaade9c62510012cfd50ae487ebd1705a28678))
|
||||
- Fixed solc imports for cli. ([c35ddaf](https://github.com/ethers-io/ethers.js/commit/c35ddaf646efa25e738fee604585a0a7af45b206))
|
||||
- Added nonce manager to experimental index. ([8316406](https://github.com/ethers-io/ethers.js/commit/8316406977ea26ca2044d16f7b3bb6ba21ef5b43))
|
||||
- Removing NodesmithProvider from default provider as it is being discontinued. ([01ca350](https://github.com/ethers-io/ethers.js/commit/01ca35036ca11a47f60890e5cae62e46a00f3da8))
|
||||
- Moved bare ABI named functions and events from Interface into Contracts to simplify other consumers of Interface. ([da8ca2e](https://github.com/ethers-io/ethers.js/commit/da8ca2e8bc982fc3ea0343bb3c593a485ca1fef0))
|
||||
- Added support for complex API keys including support for INFURA project secrets. ([#464](https://github.com/ethers-io/ethers.js/issues/464), [#651](https://github.com/ethers-io/ethers.js/issues/651), [#652](https://github.com/ethers-io/ethers.js/issues/652); [1ec5804](https://github.com/ethers-io/ethers.js/commit/1ec5804bd460f6948d4813469fdc7bf739baa6a6))
|
||||
- Migrated to scrypt-js v3. ([75895fa](https://github.com/ethers-io/ethers.js/commit/75895fa1491e7542c755a102f4e4c190685fd2b6))
|
||||
- Moved getDefaultProvider to providers package. ([51e4ef2](https://github.com/ethers-io/ethers.js/commit/51e4ef2b45b83a8d82923600a2fac544d70b0807))
|
||||
- Migrating providers to modern syntax and scoping. ([#634](https://github.com/ethers-io/ethers.js/issues/634); [e1509a6](https://github.com/ethers-io/ethers.js/commit/e1509a6326dd2cb8bf7ed64b82dd3947b768a314))
|
||||
- Migrating to modern syntax and scoping. ([#634](https://github.com/ethers-io/ethers.js/issues/634); [394c36c](https://github.com/ethers-io/ethers.js/commit/394c36cad43f229a94c72d21f94d1c7982a887a1))
|
||||
- Added provider property to Web3Provider. ([#641](https://github.com/ethers-io/ethers.js/issues/641); [1d4f90a](https://github.com/ethers-io/ethers.js/commit/1d4f90a958da6364117353850d62535c9702abd2))
|
||||
- Updated GitHub issue cache. ([494381a](https://github.com/ethers-io/ethers.js/commit/494381a6284cc8ed90bd8002d42a6b6d94dc1200))
|
||||
- Force deploy receipt to address to be null. ([#573](https://github.com/ethers-io/ethers.js/issues/573); [d9d438a](https://github.com/ethers-io/ethers.js/commit/d9d438a119bb11f8516fc9cf02c534ab3816fcb3))
|
||||
- Updated experimental NonceManager. ([3d514c8](https://github.com/ethers-io/ethers.js/commit/3d514c8dbb94e1c4ce5754463e683dd9dbe7c0aa))
|
||||
- Fixed typo in error message. ([28339a9](https://github.com/ethers-io/ethers.js/commit/28339a9c8585392086da159a46df4afb8958915c))
|
||||
- Added GitHub issue caching. ([fea867a](https://github.com/ethers-io/ethers.js/commit/fea867a206f007a17718396e486883a5e718aa29))
|
||||
|
||||
ethers/v5.0.0-beta.159 (2019-10-17 01:08)
|
||||
-----------------------------------------
|
||||
|
||||
- Removing TypeScript build files from npm to fix excessive package diffs.
|
||||
- Fixed getBlock for blockhashes with a leading 0. ([#629](https://github.com/ethers-io/ethers.js/issues/629); [12cfc59](https://github.com/ethers-io/ethers.js/commit/12cfc599656d7e3a6d3d9aa4e468592865a711cc))
|
||||
|
||||
ethers/v5.0.0-beta.158 (2019-09-28 01:56)
|
||||
-----------------------------------------
|
||||
|
||||
- Added less-common, but useful, coding functions to Interface. ([778eb3b](https://github.com/ethers-io/ethers.js/commit/778eb3b425b5ab5b23d28e75be92feccd0fc56bc))
|
||||
- Add response handling and 304 support to fetchJson. ([3d25882](https://github.com/ethers-io/ethers.js/commit/3d25882d6bf689740506b9c569f6e0d30da6f6a5))
|
||||
- Allow numeric values in a transaction to be odd-lengthed hexstrings. ([#614](https://github.com/ethers-io/ethers.js/issues/614); [a12030a](https://github.com/ethers-io/ethers.js/commit/a12030ad29aa13c02aa75d9e0860f4986a0043b4))
|
||||
- Simpler crypt for admin tools. ([828c8cf](https://github.com/ethers-io/ethers.js/commit/828c8cfd419ac4f8d11d978c2e2ff83eba5ae909))
|
||||
|
||||
ethers/v5.0.0-beta.157 (2019-09-08 02:43)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed getContractAddress for odd-length hex values. ([#572](https://github.com/ethers-io/ethers.js/issues/572); [751793e](https://github.com/ethers-io/ethers.js/commit/751793ea25183d54d7fc4c610a789608f91c062e))
|
||||
- Fixed typo in error message. ([#592](https://github.com/ethers-io/ethers.js/issues/592); [6f4291f](https://github.com/ethers-io/ethers.js/commit/6f4291f65f0ea20c65fef7fd7b09b4d5bf5f0dcd))
|
||||
- Fixed typo in error message. ([#580](https://github.com/ethers-io/ethers.js/issues/580); [9c63b4a](https://github.com/ethers-io/ethers.js/commit/9c63b4a7535f423a802bb1c17c325ce968987349))
|
||||
- Fixed typo in error message. ([#574](https://github.com/ethers-io/ethers.js/issues/574); [22a2673](https://github.com/ethers-io/ethers.js/commit/22a26736cc332fe6e896c9d2707cc99ceee2fb10))
|
||||
|
||||
ethers/v5.0.0-beta.156 (2019-09-06 17:56)
|
||||
-----------------------------------------
|
||||
|
||||
- Removed export star to fix UMD dist file. ([4c17c4d](https://github.com/ethers-io/ethers.js/commit/4c17c4db0455e1b89fd597c4c929cdc36aa3d90d))
|
||||
- Updated TypeScript version. ([e8028d0](https://github.com/ethers-io/ethers.js/commit/e8028d0e73368257b76b394bb8e2bf63f8aecd71))
|
||||
- Fixed test suites and reporter. ([1e0ed4e](https://github.com/ethers-io/ethers.js/commit/1e0ed4e99a22a27fe5057336f8cb320809768f3e))
|
||||
- Added lock-versions admin tool. ([2187604](https://github.com/ethers-io/ethers.js/commit/21876049137644af2b3afa31120ee95d032843a8))
|
||||
- Updated packages with version lock and moved types. ([85b4db7](https://github.com/ethers-io/ethers.js/commit/85b4db7d6db37b853f11a90cf4648c34404edcf9))
|
||||
- Fixed typo in error message. ([#592](https://github.com/ethers-io/ethers.js/issues/592); [019c1fc](https://github.com/ethers-io/ethers.js/commit/019c1fc7089b3da2d7bd41c933b6c6bc35c8dade))
|
||||
- Fixed build process to re-target browser field to ES version. ([3a91e91](https://github.com/ethers-io/ethers.js/commit/3a91e91df56c1ef6cf096c0322f74fd5060891e0))
|
||||
- Major overhaul in compilation to enable ES6 module generation. ([73a0077](https://github.com/ethers-io/ethers.js/commit/73a0077fd38c6ae79f33a9d4d3cc128a904b4a6c))
|
||||
- Updated some of the flatworm docs. ([81fd942](https://github.com/ethers-io/ethers.js/commit/81fd9428cab4be7eee7ddeb564bf91f282cae475))
|
||||
- Fixed package descriptions. ([#561](https://github.com/ethers-io/ethers.js/issues/561); [ebfca98](https://github.com/ethers-io/ethers.js/commit/ebfca98dc276d6f6ca6961632635e8203bb17645))
|
||||
|
||||
ethers/v5.0.0-beta.155 (2019-08-22 17:11)
|
||||
-----------------------------------------
|
||||
|
||||
- Added Wrapped Ether and Token transfers to CLI. ([c031a13](https://github.com/ethers-io/ethers.js/commit/c031a1336815923bae85d9982dba0985a79cfaed))
|
||||
- Fixed sendTransaction and use median gas price in FallbackProvider. ([07e1599](https://github.com/ethers-io/ethers.js/commit/07e15993ba181cfbff987778d158dbde6bb84de2))
|
||||
- Port optional Secret Storage wallet address to v5. ([#582](https://github.com/ethers-io/ethers.js/issues/582); [a12d60d](https://github.com/ethers-io/ethers.js/commit/a12d60d722dfcf998a2e06eba5e46390d7d442e5))
|
||||
- Updated flatworm docs output. ([8745a81](https://github.com/ethers-io/ethers.js/commit/8745a81b11b710036ddb546308c13958be1affb9))
|
||||
- Added initial flatworm documentation stubs. ([0333a76](https://github.com/ethers-io/ethers.js/commit/0333a76f4ff382b5b59b24c672b702721e7a386a))
|
||||
|
||||
ethers/v5.0.0-beta.154 (2019-08-21 01:51)
|
||||
-----------------------------------------
|
||||
|
||||
- Use safe transfer for ENS in CLI. ([b7494d8](https://github.com/ethers-io/ethers.js/commit/b7494d8618001797a4e856f3d1886273897e6ba4))
|
||||
- Fixed quorum-matching logic for FallbackProvider. ([b304ec1](https://github.com/ethers-io/ethers.js/commit/b304ec1f008ec5301c0dbd1a493d790fe3528512))
|
||||
- Added CloudflareProvider. ([#587](https://github.com/ethers-io/ethers.js/issues/587); [621313d](https://github.com/ethers-io/ethers.js/commit/621313d2a697bc6e1dd25eb5b08d67e832a28d05))
|
||||
- Added receipt to CALL_EXCEPTION errors. ([724c32e](https://github.com/ethers-io/ethers.js/commit/724c32e8c08b55404594f263e52babb0550a15b8))
|
||||
|
||||
ethers/v5.0.0-beta.153 (2019-08-06 19:15)
|
||||
-----------------------------------------
|
||||
|
||||
- Updated gas estimate failure messaging to include that the tx may simple be causing a revert. ([edb26b1](https://github.com/ethers-io/ethers.js/commit/edb26b16354afd707e5d03e174c4cc809b951c4f))
|
||||
- Additional sanity checks in ethers-ens. ([de4b2a4](https://github.com/ethers-io/ethers.js/commit/de4b2a449ca3a49807c8bedb3e21e8e8d71e63fc))
|
||||
- Fix bug in --wait for CLI. ([9977c9f](https://github.com/ethers-io/ethers.js/commit/9977c9f66a7007dcc1963128c88c584b6b6c064b))
|
||||
- Added content-hash support to ENS CLI. ([7dfef46](https://github.com/ethers-io/ethers.js/commit/7dfef463f83a9190d1b89cf81e0fb692da3dd813))
|
||||
|
||||
ethers/v5.0.0-beta.152 (2019-08-05 14:37)
|
||||
-----------------------------------------
|
||||
|
||||
- Using CLI --wait instead of custom Plugin flag for ethers-ens. ([19ee2b5](https://github.com/ethers-io/ethers.js/commit/19ee2b516005b2c35b846f19457ec9bbfa0c283b))
|
||||
- Added --wait as a general flag to CLI. ([7640292](https://github.com/ethers-io/ethers.js/commit/7640292ac8b7b9e6de3ad6699d23e2debf26cc1b))
|
||||
- Added migrate-registrar and transfer to ENS CLI. ([31e8e1b](https://github.com/ethers-io/ethers.js/commit/31e8e1b0520bc8be390fbf7e2b473c36a8649eb3))
|
||||
- Include data in the CLI transaction dump. ([53bd96a](https://github.com/ethers-io/ethers.js/commit/53bd96a9f675233906033290f1e0c71ca4e9d389))
|
||||
- Better errors on gas estimation failure. ([0e6b810](https://github.com/ethers-io/ethers.js/commit/0e6b810def390309240508a99b2cf0736848dedd))
|
||||
|
||||
ethers/v5.0.0-beta.151 (2019-08-05 14:29)
|
||||
-----------------------------------------
|
||||
|
||||
- Added package name prefix to all _version for Logger. ([692589d](https://github.com/ethers-io/ethers.js/commit/692589db54cbca10a2a453e9a1801a8612056559))
|
||||
|
||||
ethers/v5.0.0-beta.150 (2019-08-03 01:07)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed old references to errors package. ([1cabce7](https://github.com/ethers-io/ethers.js/commit/1cabce7e1c23b15cc2b630c0b403dd72d815a5ba))
|
||||
- Added generation scripts for Table A.1 for stringprep. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [b21681a](https://github.com/ethers-io/ethers.js/commit/b21681a7f4292b0e77315caad3a59fe814e9292b))
|
||||
|
||||
ethers/v5.0.0-beta.149 (2019-08-03 00:45)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed some case-folding and added Table A.1 for IDNA. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [f955dca](https://github.com/ethers-io/ethers.js/commit/f955dca417a6f86690cf33a81b08baa99e1b1a5c))
|
||||
- Removed references to legacy errors pacakge and updated umbrella pacakge. ([c09de16](https://github.com/ethers-io/ethers.js/commit/c09de163473c361cac11ddef9ec852f4cbb7d8e3))
|
||||
- Updated admin module to use new fetchJson. ([226c100](https://github.com/ethers-io/ethers.js/commit/226c100c72c3fcb0c0e3b62be5f579fd9cc4c904))
|
||||
- Updated dist files. ([8354c3f](https://github.com/ethers-io/ethers.js/commit/8354c3f9fe5487f21acaaeccd4450d9a5d495bc1))
|
||||
- Full case-folding for IDNA in namehash. ([0af95f4](https://github.com/ethers-io/ethers.js/commit/0af95f4a655106e67c2ba8f445af88c9e9e24339))
|
||||
- Deprecating errors for logger. ([0b224e8](https://github.com/ethers-io/ethers.js/commit/0b224e8fb5811cd06727063c909ca1e1e5cde57e))
|
||||
- More consistent debug events for Providers. ([e8f28b5](https://github.com/ethers-io/ethers.js/commit/e8f28b55d7dd62e29f03628232ffe7c75dc811b5))
|
||||
|
||||
ethers/v5.0.0-beta.148 (2019-07-27 18:56)
|
||||
-----------------------------------------
|
||||
|
||||
- Initial drop of new ENS CLI tool. ([c3c65b2](https://github.com/ethers-io/ethers.js/commit/c3c65b2fa19e117d6433c2e0b3d20decfe506c74))
|
||||
- Added TypeScript tool support for functions with multiple outputs. ([6de4a5d](https://github.com/ethers-io/ethers.js/commit/6de4a5d8a9d114c4c33c58f8a304b60e7370eeff))
|
||||
- Added CLI support for stand-alone (no sub-command) tools. ([b67b121](https://github.com/ethers-io/ethers.js/commit/b67b12123996f1aaf7cbe3c8648fd85a22d6674e))
|
||||
- Make utils.resolveProperties preserve object parameter order. ([74dbc28](https://github.com/ethers-io/ethers.js/commit/74dbc281ede042c5eeaa7b45150b215dea860a88))
|
||||
- Added initial IDNA support for full UTF-8 support in namehash. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [28eb38e](https://github.com/ethers-io/ethers.js/commit/28eb38ee703288aaad9f730b2d93fe3aeea7ada6))
|
||||
|
||||
ethers/v5.0.0-beta.147 (2019-07-23 01:04)
|
||||
-----------------------------------------
|
||||
|
||||
- Use the CLI solc instead of solc directly for ABI testcase generation. ([99c7b1c](https://github.com/ethers-io/ethers.js/commit/99c7b1ca94382490b9757fd51375a7ad4259b831))
|
||||
- Added experimental UTF-8 functions for escaping non-ascii strings. ([b132e32](https://github.com/ethers-io/ethers.js/commit/b132e32172c9d63e59209628dadd5796dd6291c8))
|
||||
- Bump Solidity version in CLI to 0.5.10. ([6005248](https://github.com/ethers-io/ethers.js/commit/600524842e1a4b857e8428a45c0c7d1baa0624ee))
|
||||
|
||||
ethers/v5.0.0-beta.146 (2019-07-20 21:06)
|
||||
-----------------------------------------
|
||||
|
||||
- Keep extra filter topics when using Frgment filters in Contracts. ([efaafb2](https://github.com/ethers-io/ethers.js/commit/efaafb203feaf703de803df7e346652372e9fb75))
|
||||
- Updated package.json description for Contract package. ([#561](https://github.com/ethers-io/ethers.js/issues/561); [d88ee45](https://github.com/ethers-io/ethers.js/commit/d88ee45937b3484b68f72e3f72ad6c29556c984b))
|
||||
|
||||
ethers/v5.0.0-beta.145 (2019-07-20 20:12)
|
||||
-----------------------------------------
|
||||
|
||||
- Export provider.Formatter. ([#562](https://github.com/ethers-io/ethers.js/issues/562); [083fd76](https://github.com/ethers-io/ethers.js/commit/083fd76a3a638ec16d5f9bf652101e5a150c7347))
|
||||
- Update CLI to use new Fragment.format style. ([9a41199](https://github.com/ethers-io/ethers.js/commit/9a4119910b07d1ad61bafafb38ac18a9dae1d9ed))
|
||||
- Added FormatTypes to utils. ([a05027c](https://github.com/ethers-io/ethers.js/commit/a05027c744102bbe1be5e13dd89b9c1e64b3b526))
|
||||
- Added experimental memory-hard password scheme for password-protected mnemonics to the CLI. ([5877418](https://github.com/ethers-io/ethers.js/commit/5877418de94256a69fdf2ad466ba579309b9dee8))
|
||||
- Added more flexible output options to fragment.format (JSON and minimal) and better JSON object parsing. ([e9558c8](https://github.com/ethers-io/ethers.js/commit/e9558c8d4fe6df889f4d7ba6ac6448aa543ef99d))
|
||||
|
||||
ethers/v5.0.0-beta.144 (2019-07-09 17:28)
|
||||
-----------------------------------------
|
||||
|
||||
- Make mnemonic phrases case agnostic. ([#557](https://github.com/ethers-io/ethers.js/issues/557); [e4423b7](https://github.com/ethers-io/ethers.js/commit/e4423b7a277e7e1be1c02d345d4ab1eab484c9b8))
|
||||
|
||||
ethers/v5.0.0-beta.143 (2019-07-02 16:12)
|
||||
-----------------------------------------
|
||||
|
||||
- Adding more support for offline signing in the CLI. ([9cc269c](https://github.com/ethers-io/ethers.js/commit/9cc269ceb5d33b2d88542d4bc6771279f729e733))
|
||||
- Allow providers to prepare their Network object. ([6484908](https://github.com/ethers-io/ethers.js/commit/6484908cb25dd35e5d98b2672dca72ed3f30cbe1))
|
||||
- Export BIP-44 default path in ethers.utils. ([04bdf45](https://github.com/ethers-io/ethers.js/commit/04bdf456eb07aa72872265e0ee01e3231d2b6cf1))
|
||||
|
||||
ethers/v5.0.0-beta.142 (2019-06-28 16:13)
|
||||
-----------------------------------------
|
||||
|
||||
- Do not require a Signer for contract.populateTransaction. ([0e78386](https://github.com/ethers-io/ethers.js/commit/0e78386a08d3d3a0a98c8d03cd665b8992ab3ea2))
|
||||
- Bumping version of solc to 0.5.9. ([e2da447](https://github.com/ethers-io/ethers.js/commit/e2da447c7bc05937966bc4909c47291e4819d2a9))
|
||||
|
||||
ethers/v5.0.0-beta.141 (2019-06-24 21:25)
|
||||
-----------------------------------------
|
||||
|
||||
- Fix non-ES6 import in keccak256. ([5eb393d](https://github.com/ethers-io/ethers.js/commit/5eb393d828328b34567566d3c0d622b4aef1e202))
|
||||
- Refactored wordlist exports to export Wordlist directly. ([746d255](https://github.com/ethers-io/ethers.js/commit/746d255b741844b615583b2de3ffd07631b4e872))
|
||||
|
||||
ethers/v5.0.0-beta.140 (2019-06-12 01:25)
|
||||
-----------------------------------------
|
||||
|
||||
- Move from node-fetch to cross-fetch; better browser fallback implementation. ([826ffbc](https://github.com/ethers-io/ethers.js/commit/826ffbc7c4ed1c301f30e6f264eedeaf3c243ca8))
|
||||
- Added getStatic with support for inheritance of static methods. ([5e4535e](https://github.com/ethers-io/ethers.js/commit/5e4535e939fdb9d9d23bd14b3e2590873d3eb508))
|
||||
- Fixed node-fetch for Safari (todo: push this fix upstream to node-fetch). ([7164e51](https://github.com/ethers-io/ethers.js/commit/7164e51131215ae3201b49f8c7f5ade8cbd8a420))
|
||||
- Migrated XMLHttpRequest to fetch API. ([#506](https://github.com/ethers-io/ethers.js/issues/506); [62201c5](https://github.com/ethers-io/ethers.js/commit/62201c5eebc52e9723dbbb2cc64823155ce1e0f9))
|
||||
|
||||
ethers/v5.0.0-beta.139 (2019-06-11 17:55)
|
||||
-----------------------------------------
|
||||
|
||||
- Removed freeze option from deepCopy; all properties are read-only and only objects may have new properties added. ([1bc792d](https://github.com/ethers-io/ethers.js/commit/1bc792d9dcc6a06a1be4fc5e5b9a538a3f6b7ada))
|
||||
- Moved away from isNamedInstance which breaks after Browserify name mangling. ([257d67c](https://github.com/ethers-io/ethers.js/commit/257d67c9625fa237bcfb3d651c49aa3b79175cae))
|
||||
- Expose poll function in utils. ([#512](https://github.com/ethers-io/ethers.js/issues/512); [e6f6383](https://github.com/ethers-io/ethers.js/commit/e6f6383346818fa67423f1f20450e011242eb554))
|
||||
- Make TransactionResponse hash required. ([#537](https://github.com/ethers-io/ethers.js/issues/537); [095c1fe](https://github.com/ethers-io/ethers.js/commit/095c1fe579068a3204ea0d1bc1893f293f61e719))
|
||||
|
||||
ethers/v5.0.0-beta.138 (2019-06-04 16:05)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed INFURA project ID checking. ([#534](https://github.com/ethers-io/ethers.js/issues/534); [5bf763f](https://github.com/ethers-io/ethers.js/commit/5bf763fe2307e8570ab5e91e30c43e2e5731fc39))
|
||||
|
||||
ethers/v5.0.0-beta.137 (2019-06-01 14:06)
|
||||
-----------------------------------------
|
||||
|
||||
- Fixed invalid arrayify value in browser for SHA2-HMAC. ([#530](https://github.com/ethers-io/ethers.js/issues/530); [c4a494b](https://github.com/ethers-io/ethers.js/commit/c4a494b528f2e5f706c159d916d8ff0ffd96a211))
|
||||
- Fix event and function fragment formatting. ([a2d4b29](https://github.com/ethers-io/ethers.js/commit/a2d4b2907184d9480a72fe6f67652489074af86e))
|
||||
- Fixed default JsonRpcSigner. ([#532](https://github.com/ethers-io/ethers.js/issues/532); [5ba6a61](https://github.com/ethers-io/ethers.js/commit/5ba6a616a6f969b1f28f8c6367c21488f497a7ae))
|
||||
- Added changelog management to update-versions. ([4a3f719](https://github.com/ethers-io/ethers.js/commit/4a3f7190dc04275030d313289e1ba6a2b31407ec))
|
||||
|
||||
ethers/v5.0.0-beta.136
|
||||
----------------------
|
||||
|
||||
- Added queryFilter to Contracts. ([#463](https://github.com/ethers-io/ethers.js/issues/463); [eea53bb](https://github.com/ethers-io/ethers.js/commit/eea53bb1be29ad2bd1b229a13c85b12be264b019))
|
||||
- Allow storage class in Human-Readable ABI. ([#476](https://github.com/ethers-io/ethers.js/issues/476); [cf39adb](https://github.com/ethers-io/ethers.js/commit/cf39adb09020ca0393e028b330bfd07fb4869236))
|
||||
- Track per-provider JSON-RPC ID in JsonRpcProvider. ([#337](https://github.com/ethers-io/ethers.js/issues/337), [#489](https://github.com/ethers-io/ethers.js/issues/489); [044554b](https://github.com/ethers-io/ethers.js/commit/044554b58525d1677646a74119f86ea867a06d1e))
|
||||
- Fixed typo in error message. ([#470](https://github.com/ethers-io/ethers.js/issues/470); [47d92ae](https://github.com/ethers-io/ethers.js/commit/47d92aeff02cacfb26793850c7faef7cb21ce4cf))
|
||||
|
||||
ethers/v5.0.0-beta.135
|
||||
----------------------
|
||||
|
||||
- Better error message for unconfigured ENS names. ([#504](https://github.com/ethers-io/ethers.js/issues/504); [3cbc4b4](https://github.com/ethers-io/ethers.js/commit/3cbc4b462262ba61fa7d99a7a12e7bbf8049afb1))
|
||||
- Fixed contract events. ([#404](https://github.com/ethers-io/ethers.js/issues/404); [8cdda37](https://github.com/ethers-io/ethers.js/commit/8cdda37095df28f828ccd2ac5437ccb6541b16cc))
|
||||
- Updated license for BaseX to include original authors; was only included in the source. ([03c9725](https://github.com/ethers-io/ethers.js/commit/03c97259c46de10dbe6ce62921de2f32ffff0522))
|
||||
|
||||
101
README.md
101
README.md
@@ -1,17 +1,35 @@
|
||||
The Ethers Project
|
||||
==================
|
||||
|
||||
**EXPERIMENTAL**
|
||||
[](https://www.npmjs.com/package/ethers)
|
||||
[](https://github.com/ethers-io/ethers.js/actions?query=workflow%3A%22Node.js+CI%22)
|
||||
|
||||
This branch is the next release of ethers.js, which should
|
||||
be promoted to the official release shortly.
|
||||
A complete Ethereum wallet implementation and utilities in JavaScript (and TypeScript).
|
||||
|
||||
I would recommend it for most new projects and personally use
|
||||
it for my own projects.
|
||||
**Features:**
|
||||
|
||||
The [new documentation](https://docs-beta.ethers.io) is still a
|
||||
bit sparse, but is coming along as well and will be complete
|
||||
before the promotion to master.
|
||||
- Keep your private keys in your client, **safe** and sound
|
||||
- Import and export **JSON wallets** (Geth, Parity and crowdsale)
|
||||
- Import and export BIP 39 **mnemonic phrases** (12 word backup phrases) and **HD Wallets** (English as well as Czech, French, Italian, Japanese, Korean, Simplified Chinese, Spanish, Traditional Chinese)
|
||||
- Meta-classes create JavaScript objects from any contract ABI, including **ABIv2** and **Human-Readable ABI**
|
||||
- Connect to Ethereum nodes over [JSON-RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC), [INFURA](https://infura.io), [Etherscan](https://etherscan.io), [Alchemy](https://alchemyapi.io) or [MetaMask](https://metamask.io)
|
||||
- **ENS names** are first-class citizens; they can be used anywhere an Ethereum addresses can be used
|
||||
- **Tiny** (~104kb compressed; 322kb uncompressed)
|
||||
- **Modular** packages; include only what you need
|
||||
- **Complete** functionality for all your Ethereum desires
|
||||
- Extensive [documentation](https://docs.ethers.io/v5/)
|
||||
- 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
|
||||
|
||||
|
||||
Keep Updated
|
||||
------------
|
||||
|
||||
For the latest news and advisories, please follow the [@ethersproject](https://twitter.com/ethersproject)
|
||||
on Twitter (low-traffic, non-marketing, important information only) as well as watch this GitHub project.
|
||||
|
||||
For the latest changes, see the [CHANGELOG](https://github.com/ethers-io/ethers.js/blob/master/CHANGELOG.md).
|
||||
|
||||
|
||||
Installing
|
||||
@@ -20,13 +38,13 @@ Installing
|
||||
**node.js**
|
||||
|
||||
```
|
||||
/home/ricmoo/some_project> npm install --save ethers@next
|
||||
/home/ricmoo/some_project> npm install --save ethers
|
||||
```
|
||||
|
||||
**browser (UMD)**
|
||||
|
||||
```
|
||||
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js" type="text/javasctipt">
|
||||
<script src="https://cdn.ethers.io/lib/ethers-5.1.umd.min.js" type="text/javascript">
|
||||
</script>
|
||||
```
|
||||
|
||||
@@ -34,62 +52,37 @@ Installing
|
||||
|
||||
```
|
||||
<script type="module">
|
||||
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.0.umd.min.js";
|
||||
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.1.esm.min.js";
|
||||
</script>
|
||||
```
|
||||
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
Browse the [documentation](https://docs.ethers.io/v5/) online:
|
||||
|
||||
- [Getting Started](https://docs.ethers.io/v5/getting-started/)
|
||||
- [Full API Documentation](https://docs.ethers.io/v5/api/)
|
||||
- [Various Ethereum Articles](https://blog.ricmoo.com/)
|
||||
|
||||
Or browse the entire documentation as a [single page](https://docs.ethers.io/v5/single-page/) to make searching easier.
|
||||
|
||||
|
||||
Ancillary Packages
|
||||
------------------
|
||||
|
||||
These are a number of packages not included in the umbrella `ethers ` npm package, and
|
||||
These are a number of packages not included in the umbrella `ethers` npm package, and
|
||||
additional packages are always being added. Often these packages are for specific
|
||||
use-cases, so rather than adding them to the umbrella package, they are added as
|
||||
ancillary packaged, which can be included by those who need them, while not bloating
|
||||
ancillary packages, which can be included by those who need them, while not bloating
|
||||
everyone else with packages they do not need.
|
||||
|
||||
We will keep a list of useful pacakges here.
|
||||
We will keep a list of useful packages here.
|
||||
|
||||
- `@ethersproject/experimental`
|
||||
- `@ethersproject/cli`
|
||||
- `@ethersproject/ens`
|
||||
- `@ethersproject/ledger`
|
||||
- `@ethersproject/trezor`
|
||||
|
||||
|
||||
Hacking
|
||||
-------
|
||||
|
||||
This project uses a combination of Lerna and the ./admin scripts to manage
|
||||
itself as a package of packages.
|
||||
|
||||
The umbrella package can be found in `packages/ethers`, and all packages in general
|
||||
can be found in the `packages/` folder.
|
||||
|
||||
If you add new dependencies to any package (incuding internal dependencies), you will
|
||||
need to re-create the internal links and re-build teh dependency graph::
|
||||
|
||||
```
|
||||
/home/ethers> npm run bootstrap
|
||||
```
|
||||
|
||||
To run a continuous build (with incremental TypeScript compilation):
|
||||
|
||||
```
|
||||
/home/ethers> npm run auto-build
|
||||
```
|
||||
|
||||
Finally, once you have made all your changes, you will need to bump the version
|
||||
of packages that changed their NPM tarballs, as well as update the _version.*
|
||||
and distribution builds (which is what we host on the CDN for browser-based
|
||||
apps). To do this, run:
|
||||
|
||||
|
||||
```
|
||||
/home/ethers> npm run update-versions
|
||||
```
|
||||
|
||||
Which will also list all packages that have changed along with the specifc files.
|
||||
- `@ethersproject/experimental` ([documentation](https://docs.ethers.io/v5/api/experimental/))
|
||||
- `@ethersproject/cli` ([documentation](https://docs.ethers.io/v5/cli/))
|
||||
- `@ethersproject/hardware-wallets` ([documentation](https://docs.ethers.io/v5/api/other/hardware/))
|
||||
|
||||
|
||||
License
|
||||
|
||||
33
SECURITY.md
Normal file
33
SECURITY.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Maintaining multiple versions of the library is quite time consuming, so
|
||||
the majority of the effort is focused on the latest major release.
|
||||
|
||||
If you do require a version outside of this chart updated with patch fix,
|
||||
please [contact me](mailto:github@ricmoo.com).
|
||||
|
||||
| Version | Supported | Initial Release |
|
||||
| ------- | ------------------------------------------ | ----------------- |
|
||||
| 5.0.x | :white_check_mark: | 2020-06-12 |
|
||||
| 4.0.x | :white_check_mark: (security patches only) | 2018-10-01 |
|
||||
| 3.0.x | :x: | 2018-03-05 |
|
||||
| 2.2.x | :x: | 2018-01-11 |
|
||||
| 2.1.x | :x: | 2017-05-22 |
|
||||
| 2.0.x | :x: | 2017-04-05 |
|
||||
| 1.0.x | :x: | 2016-08-23 |
|
||||
| 0.0.x | :x: | 2016-07-14 |
|
||||
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
If you identify a security vulnerability with this library (or any dependency),
|
||||
please do not hesitate to contact [github@ricmoo.com](mailto:github@ricmoo.com)
|
||||
immediately.
|
||||
|
||||
I try to respond within the same day and will address any concern as quickly
|
||||
as possible (including code fixes and publishing to NPM).
|
||||
|
||||
Any vulnerability will also be published to this file, along with credits,
|
||||
pertinent information and links to fixes.
|
||||
@@ -1,59 +0,0 @@
|
||||
Admin Tool
|
||||
==========
|
||||
|
||||
This tool is meant for admin tasks related to ethers.js.
|
||||
|
||||
|
||||
Workflow
|
||||
--------
|
||||
|
||||
After a new series of changes have been made and tested:
|
||||
|
||||
1. Run `npm run update-versions` to update and build all packages
|
||||
2. Make any human-necessary changes to the automatically updated `CHANGELOG.md`
|
||||
3. Run `git add .`
|
||||
4. Run `git commit -S -m "Updated dist files."`
|
||||
5. Run `git push`
|
||||
6. Wait for TravisCI to complete running test cases
|
||||
7. Run `npm run publish-all` to publish changed packages to NPM and tag GitHub
|
||||
|
||||
|
||||
Update Dependency Graph: admin/cmds/update-depgraph
|
||||
---------------------------------------------------
|
||||
|
||||
This is run as part of `npm run bootstrap` before running lerna bootstrap.
|
||||
It recomputes the dependency graph and writes out the ordered
|
||||
**tsconfig.project.json**
|
||||
|
||||
|
||||
Update Versions: admin/cmds/update-versions
|
||||
-------------------------------------------
|
||||
|
||||
Run using the `npm run update-versions`, which also cleans, bootstraps and
|
||||
rebuilds the project before running the script.
|
||||
|
||||
For each package that has changed from the version in NPM (the published
|
||||
tarballs are compared):
|
||||
|
||||
- Update the `version` in the **package.json**
|
||||
- Update the `src.ts/_version.ts` (matches the **package.json**)
|
||||
- Updates the `tarballHash` in the **package.json**
|
||||
- Compiles the TypeScript (which updates the `_version.js` and `_version.d.js`)
|
||||
- Lists all changed files (highlighting src.ts files)
|
||||
|
||||
Then:
|
||||
|
||||
- Generate the distribution files
|
||||
- Update the `CHANGELOG.md`
|
||||
|
||||
|
||||
Publish: admin/cmds/publish
|
||||
---------------------------
|
||||
|
||||
Run using `npm run publish-all`. This requires a password for the secure
|
||||
local config and the OTP for NPM.
|
||||
|
||||
- Publish (in dependency order) changed files to NPM
|
||||
- The `gitHead` is updated in **only** the NPM **package.json**
|
||||
- @TODO: Cut a release on GitHub including the relevant CHANGELOG entry
|
||||
|
||||
111
admin/build.js
111
admin/build.js
@@ -1,111 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs");
|
||||
const resolve = require("path").resolve;
|
||||
const spawn = require("child_process").spawn;
|
||||
|
||||
const { dirnames } = require("./local");
|
||||
const { loadPackage, savePackage } = require("./local");
|
||||
const { loadJson, saveJson } = require("./utils");
|
||||
|
||||
function run(progname, args, ignoreErrorStream) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const proc = spawn(progname, args);
|
||||
|
||||
let stdout = Buffer.from([]);
|
||||
let stderr = Buffer.from([]);
|
||||
|
||||
proc.stdout.on("data", (data) => {
|
||||
stdout = Buffer.concat([ stdout, data ]);
|
||||
});
|
||||
|
||||
proc.stderr.on("data", (data) => {
|
||||
stderr = Buffer.concat([ stdout, data ]);
|
||||
});
|
||||
|
||||
proc.on("error", (error) => {
|
||||
console.log("ERROR");
|
||||
console.log(stderr.toString());
|
||||
error.stderr = stderr.toString();
|
||||
error.stdout = stdout.toString();
|
||||
reject(error);
|
||||
});
|
||||
|
||||
proc.on("close", (code) => {
|
||||
if ((stderr.length && !ignoreErrorStream) || code !== 0) {
|
||||
console.log("ERROR");
|
||||
console.log(stderr.toString());
|
||||
|
||||
let error = new Error(`stderr not empty: ${ progname } ${ JSON.stringify(args) }`);
|
||||
error.stderr = stderr.toString();
|
||||
error.stdout = stdout.toString();
|
||||
error.statusCode = code;
|
||||
reject(error);
|
||||
} else {
|
||||
resolve(stdout.toString());
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function setupConfig(outDir, moduleType, targetType) {
|
||||
|
||||
// Configure the tsconfit.package.json...
|
||||
const path = resolve(__dirname, "../tsconfig.package.json");
|
||||
const content = loadJson(path);
|
||||
content.compilerOptions.module = moduleType;
|
||||
content.compilerOptions.target = targetType;
|
||||
saveJson(path, content);
|
||||
|
||||
// Configure the browser field for every pacakge, copying the
|
||||
// browser.umd filed for UMD and browser.esm for ESM
|
||||
dirnames.forEach((dirname) => {
|
||||
let info = loadPackage(dirname);
|
||||
|
||||
if (info._ethers_nobuild) { return; }
|
||||
|
||||
if (targetType === "es2015") {
|
||||
if (info["browser.esm"]) {
|
||||
info.browser = info["browser.esm"];
|
||||
}
|
||||
} else if (targetType === "es5") {
|
||||
if (info["browser.umd"]) {
|
||||
info.browser = info["browser.umd"];
|
||||
}
|
||||
} else {
|
||||
throw new Error("unsupported target");
|
||||
}
|
||||
savePackage(dirname, info);
|
||||
|
||||
let path = resolve(__dirname, "../packages", dirname, "tsconfig.json");
|
||||
let content = loadJson(path);
|
||||
content.compilerOptions.outDir = outDir;
|
||||
saveJson(path, content);
|
||||
});
|
||||
}
|
||||
|
||||
function setupBuild(buildModule) {
|
||||
if (buildModule) {
|
||||
setupConfig("./lib.esm/", "es2015", "es2015");
|
||||
} else {
|
||||
setupConfig("./lib/", "commonjs", "es5");
|
||||
}
|
||||
}
|
||||
|
||||
function runBuild(buildModule) {
|
||||
setupBuild(buildModule);
|
||||
|
||||
// Compile
|
||||
return run("npx", [ "tsc", "--build", resolve(__dirname, "../tsconfig.project.json"), "--force" ]);
|
||||
}
|
||||
|
||||
function runDist() {
|
||||
return run("npm", [ "run", "_dist" ], true);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
run: run,
|
||||
runDist: runDist,
|
||||
runBuild: runBuild,
|
||||
setupBuild: setupBuild
|
||||
};
|
||||
@@ -1,145 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs");
|
||||
const resolve = require("path").resolve;
|
||||
|
||||
const git = require("./git");
|
||||
const local = require("./local");
|
||||
const npm = require("./npm");
|
||||
const utils = require("./utils");
|
||||
|
||||
const ChangelogPath = resolve(__dirname, "../CHANGELOG.md");
|
||||
|
||||
async function generate() {
|
||||
|
||||
// Get each section of the Changelog
|
||||
let existing = fs.readFileSync(ChangelogPath).toString().split("\n");
|
||||
let sections = [ ];
|
||||
let lastLine = existing[0];
|
||||
existing.slice(1).forEach((line) => {
|
||||
if (line.substring(0, 5) === "=====" || line.substring(0, 5) === "-----") {
|
||||
sections.push({
|
||||
title: lastLine,
|
||||
underline: line.substring(0, 1),
|
||||
body: [ ]
|
||||
});
|
||||
lastLine = null;
|
||||
return;
|
||||
} else if (lastLine) {
|
||||
sections[sections.length - 1].body.push(lastLine);
|
||||
}
|
||||
lastLine = line;
|
||||
});
|
||||
sections[sections.length - 1].body.push(lastLine);
|
||||
|
||||
let lastVersion = await npm.getPackageVersion("ethers");
|
||||
|
||||
let logs = await git.run([ "log", (lastVersion.gitHead + "..") ]);
|
||||
|
||||
let changes = [ ];
|
||||
logs.split("\n").forEach((line) => {
|
||||
if (line.toLowerCase().substring(0, 6) === "commit") {
|
||||
changes.push({
|
||||
commit: line.substring(6).trim(),
|
||||
body: [ ]
|
||||
});
|
||||
} else if (line.toLowerCase().substring(0, 5) === "date:") {
|
||||
changes[changes.length - 1].date = utils.getDateTime(new Date(line.substring(5).trim()));
|
||||
} else if (line.substring(0, 1) === " ") {
|
||||
line = line.trim();
|
||||
if (line === "") { return; }
|
||||
changes[changes.length - 1].body += line + " ";
|
||||
}
|
||||
});
|
||||
|
||||
// @TODO:
|
||||
// ethers/version ([date](tag))
|
||||
let newSection = {
|
||||
title: `ethers/v${ local.loadPackage("ethers").version } (${utils.getDateTime(new Date())})`,
|
||||
underline: "-",
|
||||
body: [ ]
|
||||
}
|
||||
|
||||
// Delete duplicate sections for the same version (ran update multiple times)
|
||||
while (sections[1].title === newSection.title) {
|
||||
sections.splice(1, 1);
|
||||
}
|
||||
|
||||
changes.forEach((change) => {
|
||||
let body = change.body.trim();
|
||||
let link = body.match(/(\((.*#.*)\))/)
|
||||
let commit = `[${ change.commit.substring(0, 7) }](https://github.com/ethers-io/ethers.js/commit/${ change.commit })`;
|
||||
if (link) {
|
||||
body = body.replace(/ *(\(.*#.*)\) */, "");
|
||||
link = link[2].replace(/#([0-9]+)/g, (all, issue) => {
|
||||
return `[#${ issue }](https://github.com/ethers-io/ethers.js/issues/${ issue })`;
|
||||
}) + "; " + commit;
|
||||
} else {
|
||||
link = commit;
|
||||
}
|
||||
newSection.body.push(` - ${ body } (${ link })`);
|
||||
});
|
||||
|
||||
sections.splice(1, 0, newSection);
|
||||
|
||||
|
||||
let formatted = [ ];
|
||||
sections.forEach((section) => {
|
||||
formatted.push(section.title);
|
||||
formatted.push(utils.repeat(section.underline, section.title.length));
|
||||
formatted.push("");
|
||||
section.body.forEach((line) => {
|
||||
line = line.trim();
|
||||
if (line === "") { return; }
|
||||
if (line.substring(0, 1) === "-") {
|
||||
line = "- " + line.substring(1).trim();
|
||||
}
|
||||
if (section.underline === "-") {
|
||||
line = " " + line;
|
||||
}
|
||||
formatted.push(line);
|
||||
});
|
||||
formatted.push("");
|
||||
});
|
||||
|
||||
return formatted.join("\n") + "\n";
|
||||
}
|
||||
|
||||
function getChanges() {
|
||||
const changes = [ ];
|
||||
|
||||
let lastLine = null;
|
||||
fs.readFileSync(ChangelogPath).toString().split("\n").forEach((line) => {
|
||||
line = line.trim();
|
||||
if (line === "") { return; }
|
||||
|
||||
if (line.substring(0, 5) === "-----") {
|
||||
changes.push({ title: lastLine, lines: [ ] });
|
||||
} else if (line.substring(0, 1) === "-" && changes.length) {
|
||||
changes[changes.length - 1].lines.push(line);
|
||||
}
|
||||
lastLine = line;
|
||||
});
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
function latestChange() {
|
||||
const recent = getChanges()[0];
|
||||
|
||||
const match = recent.title.match(/ethers\/([^\(]*)\(([^\)]*)\)/);
|
||||
|
||||
return {
|
||||
title: recent.title,
|
||||
version: match[1].trim(),
|
||||
data: match[2].trim(),
|
||||
content: recent.lines.join("\n")
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
generate: generate,
|
||||
latestChange: latestChange,
|
||||
ChangelogPath: ChangelogPath,
|
||||
}
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const { colorify } = require("../log");
|
||||
const { getIssues } = require("../github");
|
||||
const { repeat } = require("../utils");
|
||||
|
||||
const Options = {
|
||||
"body": 1,
|
||||
"end": 1,
|
||||
"issue": 1,
|
||||
"start": 1,
|
||||
"title": 1,
|
||||
"user": 1,
|
||||
};
|
||||
|
||||
const Flags = {
|
||||
"open": 1,
|
||||
"match-case": 1,
|
||||
};
|
||||
|
||||
(async function() {
|
||||
const options = { };
|
||||
for (let i = 2; i < process.argv.length; i++) {
|
||||
const option = process.argv[i];
|
||||
if (option.substring(0, 2) === "--") {
|
||||
const comps = option.substring(2).split(/=/);
|
||||
if (Flags[comps[0]]) {
|
||||
if (comps[1] != null) { throw new Error("Invalid flag: " + option); }
|
||||
options[comps[0]] = true;
|
||||
} else if (Options[comps[0]]) {
|
||||
if (comps[1] == null) {
|
||||
options[comps[0]] = process.argv[++i];
|
||||
if (options[comps[0]] == null) {
|
||||
throw new Error("Missing option value: " + option);
|
||||
}
|
||||
} else {
|
||||
options[comps[0]] = comps[1];
|
||||
}
|
||||
} else {
|
||||
throw new Error("Unexpected option: " + option);
|
||||
}
|
||||
} else {
|
||||
throw new Error("Unexpected argument: " + option);
|
||||
}
|
||||
}
|
||||
|
||||
if (options["title"]) { options.title = new RegExp(options.title, (options["match-case"] ? "": "i")); }
|
||||
if (options["body"]) { options.body = new RegExp(options.title, (options["match-case"] ? "": "i")); }
|
||||
if (options["start"]) {
|
||||
if (options["start"].match(/^[0-9]{4}-[0-9]{2}-[0-9{2}]$/)) {
|
||||
throw new Error("Expected YYYY-MM-DD");
|
||||
}
|
||||
}
|
||||
if (options["end"]) {
|
||||
if (options["end"].match(/^[0-9]{4}-[0-9]{2}-[0-9{2}]$/)) {
|
||||
throw new Error("Expected YYYY-MM-DD");
|
||||
}
|
||||
}
|
||||
|
||||
const count = { issues: 0, comments: 0, code: 0, responses: 0 };
|
||||
|
||||
const issues = await getIssues();
|
||||
issues.forEach((issue) => {
|
||||
const info = issue.issue;
|
||||
const comments = issue.comments;
|
||||
|
||||
if (options.issue && parseInt(options.issue) != info.number) { return; }
|
||||
if (options.open && info.state !== "open") { return; }
|
||||
if (options.title && !info.title.match(options.title)) { return; }
|
||||
if (options.body) {
|
||||
const body = info.body + "\n" + comments.map((c) => (c.body)).join("\n");
|
||||
if (!body.match(options.body)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (options.user) {
|
||||
const users = comments.map((c) => (c.user.login));
|
||||
users.push(info.user.login);
|
||||
if (users.indexOf(options.user) === -1) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const dates = comments.map((c) => (c.created_at.split("T")[0]));
|
||||
dates.push(info.created_at.split("T")[0]);
|
||||
|
||||
if (options.start) {
|
||||
if (dates.filter((d) => (d >= options.start)).length === 0) { return; }
|
||||
}
|
||||
if (options.end) {
|
||||
if (dates.filter((d) => (d <= options.start)).length === 0) { return; }
|
||||
}
|
||||
|
||||
count.issues++;
|
||||
|
||||
console.log(colorify(repeat("=", 70), "bold"))
|
||||
console.log(colorify("Issue:", "bold"), info.title, ` (#${ info.number })`);
|
||||
console.log(colorify("User:","bold"), colorify(info.user.login, "blue"));
|
||||
console.log(colorify("State:", "bold"), info.state);
|
||||
if (info.created_at === info.updated_at) {
|
||||
console.log(colorify("Created:", "bold"), info.created_at);
|
||||
} else {
|
||||
console.log(colorify("Created:", "bold"), info.created_at, ` (updated: ${ info.updated_at })`);
|
||||
}
|
||||
info.body.trim().split("\n").forEach((line) => {
|
||||
console.log(" " + line);
|
||||
});
|
||||
|
||||
if (comments.length) {
|
||||
comments.forEach((info) => {
|
||||
if (options.start && info.created_at < options.start) { return ; }
|
||||
if (options.end && info.created_at > options.end) { return; }
|
||||
count.comments++;
|
||||
if (options.user && info.user.login !== options.user) { return; }
|
||||
count.responses++;
|
||||
if (info.body.indexOf("`") >= 0) { count.code++; }
|
||||
console.log(colorify(repeat("-", 70), "bold"));
|
||||
console.log(colorify("User:", "bold"), colorify(info.user.login, "green"));
|
||||
if (info.created_at === info.updated_at) {
|
||||
console.log(colorify("Created:", "bold"), info.created_at);
|
||||
} else {
|
||||
console.log(colorify("Created:", "bold"), info.created_at, ` (updated: ${ info.updated_at })`);
|
||||
}
|
||||
info.body.trim().split("\n").forEach((line) => {
|
||||
console.log(" " + line);
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
console.log(colorify(repeat("=", 70), "bold"))
|
||||
|
||||
// @TODO: Add stats on new/closed issues
|
||||
//if (options.user) {
|
||||
// console.log(`${ count.responses } responses (${ count.code } w/ code) on ${ count.comments } comments across ${ count.issues } issues.`);
|
||||
//} else {
|
||||
console.log(`${ count.comments } comment${ (count.comments !== 1) ? "s": "" } across ${ count.issues } issue${ (count.issues !== 1) ? "s": ""}.`);
|
||||
//}
|
||||
|
||||
})().catch((error) => {
|
||||
console.log("Error: " + error.message);
|
||||
});
|
||||
@@ -1,41 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const { getOrdered, loadPackage } = require("../depgraph");
|
||||
const { savePackage } = require("../local");
|
||||
const { log } = require("../log");
|
||||
|
||||
(async function() {
|
||||
let versions = { };
|
||||
|
||||
const dirnames = getOrdered();
|
||||
|
||||
dirnames.forEach((dirname) => {
|
||||
let info = loadPackage(dirname);
|
||||
if (info.name.split("/")[0] === "@ethersproject" || info.name === "ethers") {
|
||||
versions[info.name] = info.version;
|
||||
}
|
||||
});
|
||||
|
||||
dirnames.forEach((dirname) => {
|
||||
const info = loadPackage(dirname);
|
||||
let shown = false;
|
||||
["dependencies", "devDependencies"].forEach((key) => {
|
||||
const deps = info[key];
|
||||
if (!deps) { return; }
|
||||
Object.keys(deps).forEach((name) => {
|
||||
if (versions[name] == null) { return; }
|
||||
const value = ">=" + versions[name];
|
||||
if (value !== deps[name])
|
||||
if (!deps[name]) { return; }
|
||||
if (!shown) {
|
||||
log(`<bold:Locking ${ info.name }:>`);
|
||||
shown = true;
|
||||
}
|
||||
log(` <green:${ name }>: ${ deps[name] } => <bold:${ value.substring(2) }>`);
|
||||
deps[name] = value;
|
||||
});
|
||||
});
|
||||
savePackage(dirname, info);
|
||||
});
|
||||
|
||||
})();
|
||||
@@ -1,114 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const config = require("../config");
|
||||
|
||||
const { latestChange } = require("../changelog");
|
||||
const { getOrdered, loadPackage } = require("../depgraph");
|
||||
const { createRelease } = require("../github");
|
||||
const { getPackageVersion, publish } = require("../npm");
|
||||
const { log } = require("../log");
|
||||
|
||||
const USER_AGENT = "ethers-dist@0.0.0";
|
||||
const TAG = "next";
|
||||
|
||||
|
||||
let dirnames = getOrdered();
|
||||
|
||||
// Only publish specific packages
|
||||
if (process.argv.length > 2) {
|
||||
let filter = process.argv.slice(2);
|
||||
|
||||
// Verify all named packages exist
|
||||
filter.forEach((dirname) => {
|
||||
try {
|
||||
loadPackage(dirname);
|
||||
} catch (error) {
|
||||
console.log("Package not found: " + dirname);
|
||||
process.exit(1);
|
||||
}
|
||||
});
|
||||
|
||||
// Filter out pacakges we don't care about
|
||||
dirnames = dirnames.filter((dirname) => (filter.indexOf(dirname) >= 0));
|
||||
}
|
||||
|
||||
(async function() {
|
||||
let token = null;
|
||||
|
||||
let includeEthers = false;
|
||||
|
||||
// @TODO: Fail if there are any untracked files or unchecked in files
|
||||
|
||||
// Load the token from the encrypted store
|
||||
try {
|
||||
token = await config.get("npm-token");
|
||||
} catch (error) {
|
||||
switch (error.message) {
|
||||
case "wrong password":
|
||||
log("<bold:Wrong password>");
|
||||
break;
|
||||
case "cancelled":
|
||||
break;
|
||||
default:
|
||||
console.log(error);
|
||||
}
|
||||
|
||||
log("<red:Aborting.>");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
token = token.trim().split("=");
|
||||
|
||||
let options = {
|
||||
npmVersion: USER_AGENT,
|
||||
tag: TAG
|
||||
};
|
||||
|
||||
// Set the authentication token
|
||||
options[token[0]] = token[1];
|
||||
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
let dirname = dirnames[i];
|
||||
|
||||
if (dirname === "ethers") {
|
||||
options.tag = "next";
|
||||
includeEthers = true;
|
||||
} else {
|
||||
options.tag = "latest";
|
||||
}
|
||||
|
||||
let info = loadPackage(dirname);
|
||||
let npmInfo = await getPackageVersion(info.name);
|
||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
||||
|
||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
||||
|
||||
log(`<bold:Publishing:> ${info.name}...`);
|
||||
log(` <blue:Version:> ${npmInfo.version} <bold:=\\>> ${info.version}`);
|
||||
|
||||
let success = await publish(dirname, options);
|
||||
if (!success) {
|
||||
log(" <red:FAILED! Aborting.>");
|
||||
return;
|
||||
}
|
||||
log(" <green:Done.>");
|
||||
}
|
||||
|
||||
// Publish the GitHub release (currently beta)
|
||||
const beta = true;
|
||||
if (includeEthers) {
|
||||
|
||||
// The password above already succeeded
|
||||
const username = await config.get("github-user");
|
||||
const password = await config.get("github-release");
|
||||
|
||||
// Get the latest change from the changelog
|
||||
const change = latestChange();
|
||||
|
||||
// Publish the release
|
||||
const link = await createRelease(username, password, change.version, change.title, change.content, beta);
|
||||
log(`<bold:Published Release:> ${ link }`);
|
||||
}
|
||||
|
||||
})();
|
||||
@@ -1,5 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const { setupBuild } = require("../build");
|
||||
|
||||
setupBuild(false);
|
||||
@@ -1,16 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const { prompt } = require("../../packages/cli");
|
||||
const config = require("../config");
|
||||
|
||||
if (process.argv.length !== 3) {
|
||||
console.log("Usage: set-config KEY");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const key = process.argv[2];
|
||||
|
||||
(async function() {
|
||||
const value = await prompt.getPassword("Value: ");
|
||||
await config.set(key, value);
|
||||
})();
|
||||
@@ -1,37 +0,0 @@
|
||||
const { setupBuild } = require("../build");
|
||||
const { loadPackage, savePackage } = require("../local");
|
||||
|
||||
const arg = process.argv[2];
|
||||
|
||||
(async function() {
|
||||
process.argv.slice(2).forEach((arg) => {
|
||||
console.log("Setting Option:", arg);
|
||||
switch(arg) {
|
||||
case "esm":
|
||||
setupBuild(true);
|
||||
break;
|
||||
|
||||
case "cjs":
|
||||
setupBuild(false);
|
||||
break;
|
||||
|
||||
// This will remove the browser field entirely, so make sure
|
||||
// to set esm of cjs first as they will restore the browser
|
||||
// field
|
||||
case "browser-lang-all": {
|
||||
const info = loadPackage("wordlists");
|
||||
delete info.browser;
|
||||
savePackage("wordlists", info);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
console.log("Unknown option:", arg);
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
return 0;
|
||||
|
||||
})().then((result) => {
|
||||
process.exit(result);
|
||||
});
|
||||
@@ -1,16 +0,0 @@
|
||||
"use stricT";
|
||||
|
||||
const depgraph = require("../depgraph");
|
||||
const { log } = require("../log");
|
||||
const { loadJson, resolve, saveJson } = require("../utils");
|
||||
|
||||
(async function() {
|
||||
log(`<bold:Updating dependency-graph build order (tsconfig.project.json)...>`);
|
||||
let ordered = depgraph.getOrdered(true);
|
||||
|
||||
let path = resolve("tsconfig.project.json")
|
||||
|
||||
let projectConfig = loadJson(path);
|
||||
projectConfig.references = ordered.map((name) => ({ path: ("./packages/" + name) }));
|
||||
saveJson(path, projectConfig);
|
||||
})();
|
||||
@@ -1,30 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs");
|
||||
const { resolve } = require("path");
|
||||
|
||||
const sourceEthers = fs.readFileSync(resolve(__dirname, "../../packages/ethers/src.ts/ethers.ts")).toString();
|
||||
const targets = sourceEthers.match(/export\s*{\s*((.|\s)*)}/)[1].trim();
|
||||
|
||||
const output = `"use strict";
|
||||
|
||||
// To modify this file, you must update ./admin/cmds/update-exports.js
|
||||
|
||||
import * as ethers from "./ethers";
|
||||
|
||||
try {
|
||||
const anyGlobal = (window as any);
|
||||
|
||||
if (anyGlobal._ethers == null) {
|
||||
anyGlobal._ethers = ethers;
|
||||
}
|
||||
} catch (error) { }
|
||||
|
||||
export { ethers };
|
||||
|
||||
export {
|
||||
${ targets }
|
||||
} from "./ethers";
|
||||
`;
|
||||
|
||||
fs.writeFileSync(resolve(__dirname, "../../packages/ethers/src.ts/index.ts"), output);
|
||||
@@ -1,146 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
// Expected this to be run after
|
||||
// - npm run clean
|
||||
// - npm run bootstrap
|
||||
// - npm run build
|
||||
|
||||
const fs = require("fs");
|
||||
|
||||
const semver = require("semver");
|
||||
|
||||
const { runBuild, runDist } = require("../build");
|
||||
const { ChangelogPath, generate } = require("../changelog");
|
||||
const { getOrdered, loadPackage } = require("../depgraph");
|
||||
const { getDiff, getStatus, getGitTag } = require("../git");
|
||||
const { updatePackage } = require("../local");
|
||||
const { getPackageVersion } = require("../npm");
|
||||
const { resolve } = require("../utils");
|
||||
const { colorify, log } = require("../log");
|
||||
|
||||
const { prompt } = require("../../packages/cli");
|
||||
|
||||
let dirnames = getOrdered();
|
||||
|
||||
// Only publish specific packages
|
||||
if (process.argv.length > 2) {
|
||||
let filter = process.argv.slice(2);
|
||||
|
||||
// Verify all named packages exist
|
||||
filter.forEach((dirname) => {
|
||||
try {
|
||||
loadPackage(dirname);
|
||||
} catch (error) {
|
||||
console.log("Package not found: " + dirname);
|
||||
process.exit(1);
|
||||
}
|
||||
});
|
||||
|
||||
// Filter out pacakges we don't care about
|
||||
dirnames = dirnames.filter((dirname) => (filter.indexOf(dirname) >= 0));
|
||||
}
|
||||
|
||||
(async function() {
|
||||
let progress = prompt.getProgressBar(colorify("Updating versions", "bold"));
|
||||
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
progress(i / dirnames.length);
|
||||
|
||||
let dirname = dirnames[i];
|
||||
let path = resolve("packages", dirname);
|
||||
|
||||
// Get local package.json (update the tarballHash)
|
||||
let info = await updatePackage(dirname);
|
||||
|
||||
// Get the remote package.json (or sub in a placeholder for new pacakges)
|
||||
let npmInfo = await getPackageVersion(info.name);
|
||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
||||
|
||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
||||
|
||||
// Bump the version if necessary
|
||||
if (info.version === npmInfo.version) {
|
||||
let newVersion = semver.inc(info.version, "prerelease", "beta");
|
||||
|
||||
// Write out the _version.ts
|
||||
if (!info._ethers_nobuild) {
|
||||
let code = "export const version = " + JSON.stringify(dirname + "/" + newVersion) + ";\n";
|
||||
fs.writeFileSync(resolve(path, "src.ts/_version.ts"), code);
|
||||
}
|
||||
|
||||
// Update the package.json (we do this after _version, so if we fail,
|
||||
// this remains old; which is what triggers the version bump)
|
||||
info = await updatePackage(dirname, { version: newVersion });
|
||||
}
|
||||
}
|
||||
progress(1);
|
||||
|
||||
try {
|
||||
log("<bold:Building TypeScript source (es6)...>");
|
||||
await runBuild(true);
|
||||
log("<bold:Building TypeScript source (commonjs)...>");
|
||||
await runBuild(false);
|
||||
log("<bold:Building distribution files...>");
|
||||
let content = await runDist();
|
||||
console.log(content);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
log("<red:Aborting.>");
|
||||
return;
|
||||
}
|
||||
|
||||
// Update the tarball hash now that _version and package.json may have changed.
|
||||
progress = prompt.getProgressBar(colorify("Updating tarballHash", "bold"));
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
progress(i / dirnames.length);
|
||||
await updatePackage(dirnames[i]);
|
||||
}
|
||||
progress(1);
|
||||
|
||||
// Show the changed files (compared to npm)
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
let dirname = dirnames[i];
|
||||
|
||||
// Get local package.json
|
||||
let info = await loadPackage(dirname);
|
||||
let path = resolve("packages/", dirname);
|
||||
|
||||
// Get the remote package.json (or sub in a placeholder for new pacakges)
|
||||
let npmInfo = await getPackageVersion(info.name);
|
||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
||||
|
||||
// No change
|
||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
||||
|
||||
let gitHead = await getGitTag(path);
|
||||
|
||||
log(`<bold:Package>: ${info.name}`);
|
||||
log(` <green:Tarball Changed:> (bumping version)`);
|
||||
log(` ${npmInfo.version} => ${info.version}`)
|
||||
log(` <blue:Changed:>`);
|
||||
let filenames = await getDiff(path, npmInfo.gitHead, true);
|
||||
filenames.forEach((filename) => {
|
||||
let short = filename.split("/").slice(1).join("/");
|
||||
if (short.indexOf("/src.ts/") >= 0 || short.indexOf("/dist/") >= 0) {
|
||||
log(` <bold:${short}>`);
|
||||
} else {
|
||||
log(` ${short}`);
|
||||
}
|
||||
});
|
||||
log("");
|
||||
}
|
||||
|
||||
let existing = fs.readFileSync(ChangelogPath).toString();
|
||||
let changelog = await generate();
|
||||
if (existing !== changelog) {
|
||||
let changelogStatus = await getStatus(ChangelogPath);
|
||||
if (changelogStatus !== "unmodified") {
|
||||
log("<bold:WARNING:> There are local changes to the CHANGELOG (they will be discarded)");
|
||||
console.log(existing);
|
||||
}
|
||||
log("<bold:Updating CHANGELOG>...");
|
||||
fs.writeFileSync(ChangelogPath, changelog);
|
||||
}
|
||||
|
||||
|
||||
})();
|
||||
116
admin/config.js
116
admin/config.js
@@ -1,116 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs");
|
||||
const os = require("os");
|
||||
const resolve = require("path").resolve;
|
||||
|
||||
const AES = require("aes-js");
|
||||
const scrypt = require("scrypt-js");
|
||||
|
||||
const { prompt } = require("../packages/cli");
|
||||
const randomBytes = require("../packages/random").randomBytes;
|
||||
const computeHmac = require("../packages/sha2").computeHmac;
|
||||
|
||||
const colorify = require("./log").colorify;
|
||||
|
||||
function getScrypt(message, password, salt) {
|
||||
let progressBar = prompt.getProgressBar(message);
|
||||
return scrypt.scrypt(Buffer.from(password), Buffer.from(salt), (1 << 17), 8, 1, 64, progressBar);
|
||||
}
|
||||
|
||||
function Config(filename) {
|
||||
this.salt = null;
|
||||
this.dkey = null;
|
||||
this.values = { };
|
||||
this.filename = filename;
|
||||
}
|
||||
|
||||
Config.prototype.load = async function() {
|
||||
if (this.dkey) { return; }
|
||||
|
||||
let data = null;
|
||||
if (fs.existsSync(this.filename)) {
|
||||
data = JSON.parse(fs.readFileSync(this.filename));
|
||||
} else {
|
||||
data = {
|
||||
salt: Buffer.from(randomBytes(32)).toString("hex")
|
||||
};
|
||||
}
|
||||
|
||||
this.salt = data.salt;
|
||||
|
||||
const password = await prompt.getPassword(colorify("Password (config-store): ", "bold"));
|
||||
|
||||
this.dkey = await getScrypt(colorify("Unlocking config", "bold"), password, this.salt);
|
||||
|
||||
if (data.ciphertext) {
|
||||
const ciphertext = Buffer.from(data.ciphertext, "base64");
|
||||
const iv = Buffer.from(data.iv, "base64");
|
||||
const aes = new AES.ModeOfOperation.ctr(this.dkey.slice(0, 32), new AES.Counter(iv));
|
||||
const plaintext = aes.decrypt(ciphertext);
|
||||
const hmac = computeHmac("sha512", this.dkey.slice(32, 64), plaintext);
|
||||
if (hmac !== data.hmac) {
|
||||
throw new Error("wrong password");
|
||||
}
|
||||
|
||||
this.values = JSON.parse(Buffer.from(plaintext).toString());
|
||||
}
|
||||
};
|
||||
|
||||
Config.prototype.keys = async function() {
|
||||
await this.load();
|
||||
return Object.keys(this.values);
|
||||
}
|
||||
|
||||
Config.prototype.save = function() {
|
||||
this.values._junk = Buffer.from(randomBytes(16 + parseInt(Math.random() * 48))).toString("base64")
|
||||
|
||||
const plaintext = Buffer.from(JSON.stringify(this.values));
|
||||
|
||||
const iv = Buffer.from(randomBytes(16));
|
||||
const hmac = computeHmac("sha512", this.dkey.slice(32, 64), plaintext);
|
||||
|
||||
const aes = new AES.ModeOfOperation.ctr(this.dkey.slice(0, 32), new AES.Counter(iv));
|
||||
const ciphertext = Buffer.from(aes.encrypt(plaintext));
|
||||
|
||||
const data = {
|
||||
ciphertext: ciphertext.toString("base64"),
|
||||
iv: iv.toString("base64"),
|
||||
salt: this.salt,
|
||||
hmac: hmac
|
||||
};
|
||||
|
||||
fs.writeFileSync(this.filename, JSON.stringify(data, null, 2));
|
||||
}
|
||||
|
||||
Config.prototype.get = async function(key) {
|
||||
await this.load();
|
||||
return this.values[key];
|
||||
};
|
||||
|
||||
Config.prototype.set = async function(key, value) {
|
||||
await this.load();
|
||||
this.values[key] = value;
|
||||
this.save();
|
||||
};
|
||||
|
||||
Config.prototype.lock = function() {
|
||||
this.salt = this.dkey = null;
|
||||
}
|
||||
|
||||
const config = new Config(resolve(os.homedir(), ".ethers-dist"));
|
||||
|
||||
module.exports = {
|
||||
get: function(key) {
|
||||
return config.get(key);
|
||||
},
|
||||
set: function(key, value) {
|
||||
config.set(key, value);
|
||||
},
|
||||
keys: function() {
|
||||
return config.keys();
|
||||
},
|
||||
lock: function() {
|
||||
config.lock();
|
||||
}
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs");
|
||||
|
||||
const { loadJson, resolve } = require("./utils");
|
||||
|
||||
const ROOT = resolve("packages");
|
||||
|
||||
const dirnames = fs.readdirSync(ROOT);
|
||||
|
||||
function loadPackage(dirname) {
|
||||
return loadJson(resolve("packages", dirname, "package.json"));
|
||||
}
|
||||
|
||||
function getOrdered(skipNobuild) {
|
||||
let packages = { };
|
||||
let filenames = { };
|
||||
|
||||
let addDeps = (name, depends) => {
|
||||
Object.keys(depends).forEach((dep) => {
|
||||
// Not a package we manage
|
||||
if (packages[dep] == null) { return; }
|
||||
deps[name][dep] = true;
|
||||
});
|
||||
}
|
||||
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
let dirname = dirnames[i];
|
||||
let info = loadPackage(dirname);
|
||||
if (skipNobuild && info._ethers_nobuild) { continue; }
|
||||
packages[info.name] = info;
|
||||
filenames[info.name] = dirname;
|
||||
}
|
||||
|
||||
// Maps names to list of dependencies; { [ name:string]: Array<name: string> }
|
||||
let deps = { };
|
||||
let depGraph = { };
|
||||
|
||||
Object.keys(packages).forEach((name) => {
|
||||
let info = packages[name];
|
||||
deps[info.name] = { };
|
||||
addDeps(info.name, info.dependencies || { });
|
||||
addDeps(info.name, info.devDependencies || { });
|
||||
deps[info.name] = Object.keys(deps[info.name]);
|
||||
deps[info.name].sort();
|
||||
});
|
||||
|
||||
let ordered = [ ];
|
||||
let remaining = Object.keys(deps);
|
||||
|
||||
let isSatisfied = (name) => {
|
||||
for (let i = 0; i < deps[name].length; i++) {
|
||||
if (ordered.indexOf(deps[name][i]) === -1) { return false; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
while (remaining.length) {
|
||||
let bail = true;
|
||||
for (let i = 0; i < remaining.length; i++) {
|
||||
if (!isSatisfied(remaining[i])) { continue; }
|
||||
bail = false;
|
||||
ordered.push(remaining[i]);
|
||||
remaining.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
if (bail) {
|
||||
throw new Error("Nothing processed; circular dependencies...");
|
||||
}
|
||||
}
|
||||
|
||||
return ordered.map((name) => filenames[name]);
|
||||
}
|
||||
|
||||
function sort(dirnames) {
|
||||
let ordered = getOrdered();
|
||||
dirnames.sort((a, b) => {
|
||||
let ai = ordered.indexOf(local.loadPackage(a).name);
|
||||
let bi = ordered.indexOf(local.loadPackage(b).name);
|
||||
if (ai === -1 || bi === -1) {
|
||||
throw new Error("unknown dirname - " + [a, b].join(", "));
|
||||
}
|
||||
return ai - bi;
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
dirnames: dirnames,
|
||||
getOrdered: getOrdered,
|
||||
loadPackage: loadPackage,
|
||||
ROOT: ROOT,
|
||||
sort: sort
|
||||
}
|
||||
186
admin/git.js
186
admin/git.js
@@ -1,186 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const resolve = require("path").resolve;
|
||||
const spawn = require("child_process").spawn;
|
||||
|
||||
const semver = require("semver");
|
||||
|
||||
const { run } = require("./build");
|
||||
const { loadPackage } = require("./local");
|
||||
|
||||
function git(args) {
|
||||
return run("git", args);
|
||||
}
|
||||
|
||||
function getStatus(filename) {
|
||||
return git([ "status", "-s", resolve(__dirname, "..", filename) ]).then((result) => {
|
||||
result = result.trim();
|
||||
if (result === "") { return "unmodified"; }
|
||||
switch (result.substring(0, 2)) {
|
||||
case 'M ': return "modified";
|
||||
case 'A ': return "added";
|
||||
case 'D ': return "deleted";
|
||||
case 'R ': return "renamed";
|
||||
case 'C ': return "copied";
|
||||
case 'U ': return "updated";
|
||||
case '??': return "untracked";
|
||||
}
|
||||
console.log(result);
|
||||
return "unknown";
|
||||
});
|
||||
}
|
||||
|
||||
async function getChanges(latest) {
|
||||
let diff = await git(["diff", "--name-only", latest ]);
|
||||
|
||||
// Map dirname => { dist: [ ], src: [ ] }
|
||||
let changes = { "_": { filename: "_", dist: [], src: [] } };
|
||||
|
||||
diff.split("\n").forEach((line) => {
|
||||
// e.g. packages/constants/index.d.ts
|
||||
let comps = line.trim().split("/");
|
||||
|
||||
// Track non-packages as dist
|
||||
if (comps.length < 2 || comps[0] !== "packages") {
|
||||
let filename = comps.join("/").trim();
|
||||
if (filename === "") { return; }
|
||||
changes._.dist.push(filename);
|
||||
return;
|
||||
}
|
||||
|
||||
let name = loadPackage(comps[1]).name;
|
||||
|
||||
let change = changes[name];
|
||||
if (!change) {
|
||||
change = { filename: comps[1], dist: [ ], src: [ ] }
|
||||
changes[name] = change;
|
||||
}
|
||||
|
||||
// Split changes into source changes (src.ts/) or dist changes (output of TypeScript)
|
||||
if (comps[2] === "src.ts") {
|
||||
change.src.push(comps.join("/"));
|
||||
} else {
|
||||
change.dist.push(comps.join("/"));
|
||||
}
|
||||
});
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
function getLatestTag() {
|
||||
let seq = Promise.resolve();
|
||||
|
||||
// @TODO: Pull
|
||||
if (false) {
|
||||
seq = seq.then(() => {
|
||||
console.log("Pulling remote changes...");
|
||||
return git([ "pull" ]);
|
||||
});
|
||||
}
|
||||
|
||||
seq = seq.then(() => {
|
||||
return git([ "tag" ]).then((tags) => {
|
||||
tags = tags.split("\n").filter(tag => (tag.match(/^v[0-9]+\.[0-9]+\.[0-9]+\-/)));
|
||||
tags.sort(semver.compare)
|
||||
return tags.pop();
|
||||
});
|
||||
});
|
||||
|
||||
return seq;
|
||||
}
|
||||
|
||||
function findChanges(latest) {
|
||||
let seq = Promise.resolve();
|
||||
|
||||
seq = seq.then(() => {
|
||||
return git(["diff", "--name-only", latest, "HEAD" ]).then((result) => {
|
||||
let filenames = { };
|
||||
result.split("\n").forEach((line) => {
|
||||
// e.g. packages/constants/index.d.ts
|
||||
let comps = line.trim().split("/");
|
||||
if (comps.length < 2) { return; }
|
||||
filenames[comps[1]] = true;
|
||||
});
|
||||
return Object.keys(filenames);
|
||||
});
|
||||
});
|
||||
|
||||
seq = seq.then((filenames) => {
|
||||
return filenames.map((filename) => {
|
||||
let name = packages[filename].name;
|
||||
return {
|
||||
filename: filename,
|
||||
name: name,
|
||||
localVersion: getLocalVersion(name),
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
seq = seq.then((packages) => {
|
||||
let seq = Promise.resolve();
|
||||
packages.forEach((p) => {
|
||||
seq = seq.then(() => {
|
||||
return getNpmVersion(p.name).then((version) => {
|
||||
p.npmVersion = version;
|
||||
});
|
||||
});
|
||||
});
|
||||
return seq.then(() => packages);
|
||||
});
|
||||
return seq;
|
||||
}
|
||||
|
||||
async function getGitTag(filename) {
|
||||
let result = await git([ "log", "-n", "1", "--", filename ]);
|
||||
result = result.trim();
|
||||
if (!result) { return null; }
|
||||
result = result.match(/^commit\s+([0-9a-f]{40})\n/i);
|
||||
if (!result) { return null; }
|
||||
return result[1];
|
||||
}
|
||||
|
||||
async function getDiff(filename, tag, nameOnly) {
|
||||
if (tag == null) { tag = "HEAD"; }
|
||||
let cmd = [ "diff", "--name-only", tag, "--", filename ]
|
||||
if (!nameOnly) { cmd.splice(1, 1); }
|
||||
try {
|
||||
let result = await git(cmd);
|
||||
result = result.trim();
|
||||
if (result === "") { return [ ]; }
|
||||
return result.split("\n");
|
||||
} catch (error) {
|
||||
// This tag does not exist, so compare against beginning of time
|
||||
// This happens when there is a new history (like an orphan branch)
|
||||
if (error.stderr.trim().match(/^fatal: bad object/)) {
|
||||
console.log("Could not find history; showing all");
|
||||
let cmd = [ "rev-list", "--max-parents=0", "HEAD" ];
|
||||
let tag = await git(cmd);
|
||||
return getDiff(filename, tag.trim(), nameOnly);
|
||||
}
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async function getUntracked(filename) {
|
||||
let cmd = [ "ls-files", "-o", "--exclude-standard"];
|
||||
if (filename) {
|
||||
cmd.push("--");
|
||||
cmd.push(filename);
|
||||
}
|
||||
let result = await git(cmd);
|
||||
result = result.trim();
|
||||
if (result === "") { return [ ]; }
|
||||
return result.split("\n");
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
findChanges: findChanges,
|
||||
getChanges: getChanges,
|
||||
getDiff: getDiff,
|
||||
getGitTag: getGitTag,
|
||||
getLatestTag: getLatestTag,
|
||||
getStatus: getStatus,
|
||||
getUntracked: getUntracked,
|
||||
run: git,
|
||||
}
|
||||
162
admin/github.js
162
admin/github.js
@@ -1,162 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs");
|
||||
const { resolve } = require("path");
|
||||
const zlib = require("zlib");
|
||||
|
||||
const { id } = require("../packages/hash");
|
||||
const { fetchJson } = require("../packages/web");
|
||||
|
||||
const CacheDir = resolve(__dirname, "../github-cache/");
|
||||
|
||||
function addResponse(result, response) {
|
||||
return { result, response };
|
||||
}
|
||||
|
||||
function loadFile(filename) {
|
||||
return JSON.parse(zlib.gunzipSync(fs.readFileSync(filename)).toString());
|
||||
//return JSON.parse(fs.readFileSync(filename).toString());
|
||||
}
|
||||
|
||||
// @TODO: atomic
|
||||
function saveFile(filename, content) {
|
||||
fs.writeFileSync(filename, zlib.gzipSync(JSON.stringify(content)));
|
||||
//fs.writeFileSync(filename, JSON.stringify(content));
|
||||
}
|
||||
|
||||
function mockFetchJson(url, body, headers) {
|
||||
return {
|
||||
result: null,
|
||||
response: {
|
||||
statusCode: 304
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function _fetchGitHub(user, password, fetchJson, url) {
|
||||
const result = [ ];
|
||||
while (true) {
|
||||
|
||||
const filename = resolve(CacheDir, id(url).substring(2, 14));
|
||||
|
||||
const headers = {
|
||||
"User-Agent": "ethers-io",
|
||||
};
|
||||
|
||||
let items = null;
|
||||
let link = null;
|
||||
try {
|
||||
const data = loadFile(filename);
|
||||
headers["if-none-match"] = data.etag;
|
||||
items = data.items;
|
||||
link = data.link;
|
||||
} catch (error) {
|
||||
if (error.code !== "ENOENT") { throw error; }
|
||||
}
|
||||
|
||||
const fetch = await fetchJson({
|
||||
url: url,
|
||||
user: user,
|
||||
password: password,
|
||||
headers: headers
|
||||
}, null, addResponse);
|
||||
|
||||
// Cached response is good; use it!
|
||||
if (fetch.response.statusCode !== 304) {
|
||||
items = fetch.result;
|
||||
if (fetch.response.headers) {
|
||||
link = (fetch.response.headers.link || null);
|
||||
}
|
||||
if (fetch.response.headers.etag){
|
||||
saveFile(filename, {
|
||||
timestamp: (new Date()).getTime(),
|
||||
url: url,
|
||||
link: link,
|
||||
etag: fetch.response.headers.etag,
|
||||
items: items,
|
||||
version: 1
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
items.forEach((item) => { result.push(item)});
|
||||
|
||||
url = null;
|
||||
(link || "").split(",").forEach((item) => {
|
||||
if (item.indexOf('rel="next"') >= 0) {
|
||||
const match = item.match(/<([^>]*)>/);
|
||||
if (match) { url = match[1]; }
|
||||
}
|
||||
});
|
||||
|
||||
if (!url) { break; }
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
async function fetchGitHub(user, password, url, cacheOnly) {
|
||||
if (cacheOnly) {
|
||||
return await _fetchGitHub("none", "none", mockFetchJson, url);
|
||||
}
|
||||
|
||||
const results = await _fetchGitHub(user, password, fetchJson, url);
|
||||
return results;
|
||||
}
|
||||
|
||||
|
||||
async function _getIssues(user, password) {
|
||||
const cacheOnly = (user == null);
|
||||
|
||||
let issues = await fetchGitHub(user, password, "https:/\/api.github.com/repos/ethers-io/ethers.js/issues?state=all&per_page=100", cacheOnly)
|
||||
if (!cacheOnly) { console.log(`Found ${ issues.length } issues`); }
|
||||
const result = [ ];
|
||||
for (let i = 0; i < issues.length; i++) {
|
||||
const issue = issues[i];
|
||||
let comments = await fetchGitHub(user, password, issue.comments_url, cacheOnly);
|
||||
result.push({ issue, comments});
|
||||
if (!cacheOnly) { console.log(` Issue ${ issue.number }: ${ comments.length } comments`); }
|
||||
}
|
||||
result.sort((a, b) => (a.issue.number - b.issue.number));
|
||||
return result;
|
||||
}
|
||||
|
||||
function getIssues() {
|
||||
return _getIssues();
|
||||
}
|
||||
|
||||
function syncIssues(user, password) {
|
||||
return _getIssues(user, password);
|
||||
}
|
||||
|
||||
async function createRelease(user, password, tagName, title, body, prerelease, commit) {
|
||||
const payload = {
|
||||
tag_name: tagName,
|
||||
target_commitish: (commit || "master"),
|
||||
name: title,
|
||||
body: body,
|
||||
//draft: true,
|
||||
draft: false,
|
||||
prerelease: !!prerelease
|
||||
};
|
||||
|
||||
const headers = {
|
||||
"User-Agent": "ethers-io",
|
||||
};
|
||||
|
||||
const result = await fetchJson({
|
||||
url: "https://api.github.com/repos/ethers-io/ethers.js/releases",
|
||||
user: user,
|
||||
password: password,
|
||||
headers: headers
|
||||
}, JSON.stringify(payload));
|
||||
|
||||
|
||||
return result.html_url;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getIssues,
|
||||
syncIssues,
|
||||
createRelease,
|
||||
}
|
||||
|
||||
401
admin/index.js
401
admin/index.js
@@ -1,401 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs");
|
||||
const resolve = require("path").resolve;
|
||||
|
||||
const diff = require("diff");
|
||||
const semver = require("semver");
|
||||
|
||||
const { prompt } = require("../packages/cli");
|
||||
|
||||
const build = require("./build");
|
||||
const changelog = require("./changelog");
|
||||
const depgraph = require("./depgraph");
|
||||
const { colorify, colorifyStatus, log } = require("./log");
|
||||
const config = require("./config")
|
||||
const git = require("./git");
|
||||
const local = require("./local");
|
||||
const npm = require("./npm");
|
||||
const utils = require("./utils");
|
||||
|
||||
/*
|
||||
async function runChanged(dirnames, callback) {
|
||||
try {
|
||||
await callback(dirname, info, npmInfo);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
console.log(colorify("Aborting! " + error.message));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
/*
|
||||
if (diff) {
|
||||
} else {
|
||||
*/
|
||||
|
||||
async function runDiff(dirnames) {
|
||||
// Default to all packages
|
||||
if (dirnames == null || dirnames.length === 0) { dirnames = local.dirnames; }
|
||||
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
let dirname = dirnames[i];
|
||||
|
||||
// Get local (update the tarballHash) and remote package.json
|
||||
let info = await local.loadPackage(dirname);
|
||||
let npmInfo = await npm.getPackageVersion(info.name);
|
||||
if (!npmInfo) { npmInfo = { gitHead: "HEAD", version: "NEW" }; }
|
||||
|
||||
let delta = await git.getDiff(resolve(__dirname, "../packages", dirname), npmInfo.gitHead);
|
||||
|
||||
if (delta.length === 0) { continue; }
|
||||
|
||||
// Bump the version if necessary
|
||||
if (info.version === npmInfo.version) {
|
||||
info.version = semver.inc(info.version, "prerelease", "beta");
|
||||
}
|
||||
|
||||
console.log(colorify("<bold:Package>: ") + info.name);
|
||||
console.log(colorify(" <green:Git Head Changed:> (run update to bump version)"));
|
||||
console.log(" " + npmInfo.gitHead)
|
||||
console.log(" " + npmInfo.version + colorify(" => ", "bold") + info.version)
|
||||
|
||||
console.log(colorify(" Diff", "bold"));
|
||||
delta.forEach((line) => {
|
||||
let color = "blue";
|
||||
switch (line.substring(0, 1)) {
|
||||
case '+':
|
||||
color = "green";
|
||||
break;
|
||||
case '-':
|
||||
color = "red";
|
||||
break;
|
||||
case ' ':
|
||||
color = "normal";
|
||||
break;
|
||||
}
|
||||
console.log(" " + colorify(line, color));
|
||||
});
|
||||
|
||||
console.log("");
|
||||
}
|
||||
|
||||
console.log("");
|
||||
}
|
||||
|
||||
async function updateChangelog() {
|
||||
let filename = resolve(local.ROOT, "../CHANGELOG.md");
|
||||
|
||||
let lastVersion = await git.getLatestTag();
|
||||
let newVersion = "v" + local.getVersion("ethers");
|
||||
|
||||
let current = fs.readFileSync(filename).toString();
|
||||
let log = await changelog.generate();
|
||||
if (log === current) { return; }
|
||||
|
||||
let changes = diff.createTwoFilesPatch("CHANGELOG-old.md", "CHANGELOG.md", current, log, lastVersion, newVersion);
|
||||
console.log(changes);
|
||||
|
||||
try {
|
||||
let response = await prompt.getChoice(colorify("Accept changes?", "bold"), "yn", "n");
|
||||
if (response === "n") { throw new Error("Not changing."); }
|
||||
} catch (error) {
|
||||
console.log("Abort: " + error.message);
|
||||
return;
|
||||
}
|
||||
|
||||
fs.writeFileSync(filename, log);
|
||||
}
|
||||
|
||||
// Updates the dependency-graph (tsconfig.project.json) so the build order is correct
|
||||
async function runUpdateDepgraph() {
|
||||
log(`<bold:Updating dependency-graph build order (tsconfig.project.json)...>`);
|
||||
let ordered = depgraph.getOrdered();
|
||||
|
||||
let path = resolve(local.ROOT, "../tsconfig.project.json")
|
||||
|
||||
let projectConfig = local.loadJson(path);
|
||||
projectConfig.references = ordered.map((name) => ({ path: ("./packages/" + name) }));
|
||||
local.saveJson(path, projectConfig);
|
||||
}
|
||||
|
||||
async function runUpdate(dirnames) {
|
||||
|
||||
// Check for untracked files...
|
||||
let untracked = [ ];
|
||||
if (dirnames == null || dirnames.length === 0) {
|
||||
dirnames = local.dirnames;
|
||||
let filenames = await git.getUntracked(resolve(__dirname, ".."));
|
||||
for (let i = 0; i < filenames.length; i++) {
|
||||
untracked.push(filenames[i]);
|
||||
}
|
||||
} else {
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
let filenames = await git.getUntracked(resolve(local.ROOT, dirnames[i]));
|
||||
for (let j = 0; j < filenames.length; j++) {
|
||||
untracked.push(filenames[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Untracked files! Abort.
|
||||
if (untracked.length) {
|
||||
log("<bold:Untracked Files:>");
|
||||
untracked.forEach((filename) => {
|
||||
console.log(" " + filename);
|
||||
});
|
||||
log("<red:Aborting.>");
|
||||
return;
|
||||
}
|
||||
|
||||
log(`<bold:Run TypeScript build...>`);
|
||||
await build.runBuild()
|
||||
|
||||
log("");
|
||||
|
||||
// @TODO: Root
|
||||
|
||||
// Update all the package.json and _version.ts
|
||||
let progress = prompt.getProgressBar(colorify("Updating versions", "bold"));
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
progress(i / dirnames.length);
|
||||
|
||||
let dirname = dirnames[i];
|
||||
let path = resolve(__dirname, "../packages/", dirname);
|
||||
|
||||
// Get local package.json (update the tarballHash)
|
||||
let info = await local.updatePackage(dirname);
|
||||
|
||||
// Get the remote package.json (or sub in a placeholder for new pacakges)
|
||||
let npmInfo = await npm.getPackageVersion(info.name);
|
||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
||||
|
||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
||||
|
||||
// Bump the version if necessary
|
||||
if (info.version === npmInfo.version) {
|
||||
let newVersion = semver.inc(info.version, "prerelease", "beta");
|
||||
|
||||
// Write out the _version.ts
|
||||
if (!info._ethers_skipPrepare) {
|
||||
let code = "export const version = " + JSON.stringify(newVersion) + ";\n";
|
||||
fs.writeFileSync(resolve(path, "src.ts/_version.ts"), code);
|
||||
}
|
||||
|
||||
// Update the package.json (we do this after _version, so if we fail,
|
||||
// this remains old; which is what triggers the version bump)
|
||||
info = await local.updatePackage(dirname, { version: newVersion });
|
||||
}
|
||||
}
|
||||
progress(1);
|
||||
|
||||
// Build the TypeScript sources
|
||||
log("<bold:Runing TypeScript build...>");
|
||||
try {
|
||||
await build.runTsc();
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
log("<red:Aborting.>");
|
||||
return;
|
||||
}
|
||||
|
||||
// Run the dist
|
||||
// @TODO:
|
||||
|
||||
// Update the tarball hash now that _version and package.json may have changed.
|
||||
progress = prompt.getProgressBar(colorify("Updating tarballHash", "bold"));
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
progress(i / dirnames.length);
|
||||
await local.updatePackage(dirnames[i]);
|
||||
}
|
||||
progress(1);
|
||||
|
||||
// Show the changed files (compared to npm)
|
||||
for (let i = 0; i < dirnames.length; i++) {
|
||||
let dirname = dirnames[i];
|
||||
|
||||
// Get local package.json
|
||||
let info = await local.loadPackage(dirname);
|
||||
let path = resolve(__dirname, "../packages/", dirname);
|
||||
|
||||
// Get the remote package.json (or sub in a placeholder for new pacakges)
|
||||
let npmInfo = await npm.getPackageVersion(info.name);
|
||||
if (!npmInfo) { npmInfo = { version: "NEW" }; }
|
||||
|
||||
// No change
|
||||
if (info.tarballHash === npmInfo.tarballHash) { continue; }
|
||||
|
||||
let gitHead = await git.getGitTag(path);
|
||||
|
||||
log(`<bold:Package>: ${info.name}`);
|
||||
log(` <green:Tarball Changed:> (bumping version)`);
|
||||
log(` ${npmInfo.version} => ${info.version}`)
|
||||
log(` <blue:Changed:>`);
|
||||
let filenames = await git.getDiff(resolve(__dirname, "../packages", dirname), npmInfo.gitHead, true);
|
||||
filenames.forEach((filename) => {
|
||||
let short = filename.split("/").slice(1).join("/");
|
||||
if (short.indexOf("/src.ts/") >= 0) {
|
||||
log(` <bold:${short}>`);
|
||||
} else {
|
||||
log(` ${short}`);
|
||||
}
|
||||
});
|
||||
log("");
|
||||
}
|
||||
|
||||
// @TODO: Changelog
|
||||
await updateChangelog();
|
||||
}
|
||||
|
||||
async function runAdd(type, names) {
|
||||
let latest = await git.getLatestTag();
|
||||
console.log("");
|
||||
console.log(colorify("<bold:Latest Published>: ") + latest);
|
||||
console.log("");
|
||||
|
||||
let changes = await git.getChanges("HEAD");
|
||||
|
||||
if (!names || names.length === 0) {
|
||||
names = Object.keys(changes);
|
||||
}
|
||||
|
||||
let filenames = [ ];
|
||||
for (let i = 0; i < names.length; i++) {
|
||||
let name = names[i];
|
||||
let change = changes[name] || changes[(packages[name] || {}).name];
|
||||
if (!change) { return; }
|
||||
change[type].forEach((filename) => {
|
||||
filenames.push(filename);
|
||||
});
|
||||
}
|
||||
|
||||
if (filenames.length === 0) {
|
||||
console.log(colorify("<bold:Nothing to add.>"));
|
||||
console.log("");
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = 0; i < filenames.length; i++) {
|
||||
let filename = filenames[i];
|
||||
let status = await git.getStatus(filename);
|
||||
console.log(" " + colorifyStatus(status) + ": " + utils.repeat(" ", 10 - status.length) + filename);
|
||||
}
|
||||
|
||||
console.log("");
|
||||
|
||||
try {
|
||||
let response = await prompt.getChoice(colorify("Add these files?", "bold"), "yn", "n");
|
||||
if (response === "n") { throw new Error("Not adding."); }
|
||||
} catch (error) {
|
||||
console.log("Abort: " + error.message);
|
||||
return;
|
||||
}
|
||||
|
||||
let params = filenames.map((f) => f); //resolve(ROOT, f));
|
||||
params.unshift("--");
|
||||
params.unshift("add");
|
||||
|
||||
console.log("git " + params.join(" "));
|
||||
|
||||
try {
|
||||
await git.run(params);
|
||||
} catch (error) {
|
||||
console.log("Error: (status: " + error.code + ")");
|
||||
console.log(" " + error.stderr);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("Added.");
|
||||
}
|
||||
|
||||
function runDist() {
|
||||
// Run npm dist
|
||||
// Generate changelog
|
||||
// run status to update all the package
|
||||
// add dist files?
|
||||
}
|
||||
|
||||
async function runPublish(dirnames) {
|
||||
|
||||
// @TODO: Make sure there are no staged files
|
||||
|
||||
// @TODO: Make sure the repo has been pushed
|
||||
|
||||
// @TODO: Run the publish in the correct order
|
||||
|
||||
// Get the authentication token from our encrypted store
|
||||
let token = await config.get("token");
|
||||
token = token.trim().split("=");
|
||||
|
||||
let options = {
|
||||
npmVersion: "ethers-dist@0.0.0",
|
||||
tag: "next"
|
||||
};
|
||||
|
||||
// Set the authentication token
|
||||
options[token[0]] = token[1];
|
||||
|
||||
if (dirnames == null || dirnames.length === 0) { dirnames = local.dirnames; }
|
||||
depgraph.sort(dirnames);
|
||||
|
||||
await runChanged(dirnames, async (dirname, info, npmInfo) => {
|
||||
console.log(colorify("<bold:Publishing:> ") + info.name + "...")
|
||||
console.log(colorify(" Version: ", "blue") + npmInfo.version + colorify(" => ", "bold") + info.version);
|
||||
|
||||
let success = await npm.publish(dirname, options);
|
||||
if (!success) {
|
||||
console.log(colorify(" <red:FAILED! Aborting.>"));
|
||||
throw new Error("");
|
||||
}
|
||||
console.log(colorify(" <green:Done.>"));
|
||||
});
|
||||
}
|
||||
|
||||
async function runTest() {
|
||||
let r = await git([ "tag", "--porcelain", "-a", "-m", "Title of Release\n\nHello\n-----\n\nTesting 4 **bold** #1\nHello World", "test6", "HEAD" ]);
|
||||
console.log(r);
|
||||
try {
|
||||
r = await git([ "push", "--tags" ])
|
||||
} catch(e) { console.log(e); }
|
||||
console.log(r);
|
||||
}
|
||||
|
||||
(function() {
|
||||
let args = process.argv.slice(2);
|
||||
switch (args[0]) {
|
||||
|
||||
// Compare published to current stage
|
||||
case "diff":
|
||||
return runDiff(args.slice(1));
|
||||
|
||||
// Add unchecked-in source files
|
||||
case "add-source":
|
||||
return runAdd("src", args.slice(1));
|
||||
|
||||
// Update all package.json. the changelog and dist files
|
||||
case "update":
|
||||
return runUpdate(args.slice(1));
|
||||
|
||||
// Update dependency graph (./tsconfig-project.json)
|
||||
case "update-depgraph":
|
||||
return runUpdateDepgraph();
|
||||
|
||||
// Add unchecked-in dist files
|
||||
case "add-dist":
|
||||
return runAdd("dist", args.slice(1));
|
||||
|
||||
|
||||
// Add unchecked-in source files
|
||||
case "changelog":
|
||||
return updateChangelog();
|
||||
|
||||
// Add unchecked-in source files
|
||||
case "publish":
|
||||
return runPublish(args.slice(1));
|
||||
|
||||
case "test":
|
||||
return runTest();
|
||||
}
|
||||
})();
|
||||
101
admin/local.js
101
admin/local.js
@@ -1,101 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const packlist = require("npm-packlist");
|
||||
const tar = require("tar");
|
||||
|
||||
const keccak256 = (function() {
|
||||
try {
|
||||
return require("../packages/keccak256").keccak256;
|
||||
} catch (error) {
|
||||
console.log("Cannot load Keccak256 (maybe not built yet? Not really a problem for most things)");
|
||||
return null;
|
||||
}
|
||||
})();
|
||||
|
||||
const { dirnames, loadPackage, ROOT } = require("./depgraph");
|
||||
const { resolve, saveJson } = require("./utils");
|
||||
|
||||
function sorted(obj) {
|
||||
if (Array.isArray(obj)) { return obj.map(sorted); }
|
||||
if (obj == null || typeof(obj) !== "object") { return obj; }
|
||||
|
||||
const keys = Object.keys(obj);
|
||||
keys.sort();
|
||||
|
||||
const result = { };
|
||||
keys.forEach((key) => { result[key] = sorted(obj[key]); });
|
||||
return result;
|
||||
}
|
||||
|
||||
function savePackage(dirname, info) {
|
||||
return saveJson(resolve(ROOT, dirname, "package.json"), sorted(info));
|
||||
}
|
||||
|
||||
async function createTarball(dirname) {
|
||||
let base = resolve(ROOT, dirname);
|
||||
|
||||
// From NPM publish, create the packed version
|
||||
let files = await packlist({ path: base });
|
||||
files = files.map((f) => ("./" + f));
|
||||
|
||||
let options = {
|
||||
cwd: base,
|
||||
prefix: 'package/',
|
||||
portable: true,
|
||||
sync: true,
|
||||
// Provide a specific date in the 1980s for the benefit of zip,
|
||||
// which is confounded by files dated at the Unix epoch 0.
|
||||
mtime: new Date('1985-10-26T08:15:00.000Z'),
|
||||
gzip: true
|
||||
};
|
||||
|
||||
// Take the hash of the package sans
|
||||
return tar.create(options, files).read();
|
||||
}
|
||||
|
||||
async function updatePackage(dirname, values) {
|
||||
let info = loadPackage(dirname);
|
||||
|
||||
if (values) {
|
||||
for (let key in values) {
|
||||
info[key] = values[key];
|
||||
}
|
||||
}
|
||||
/*
|
||||
["dependencies", "devDependencies"].forEach((key) => {
|
||||
let deps = info[key] || [];
|
||||
for (let name in deps) {
|
||||
if (name.substring(0, "@ethersproject".length) === "@ethersproject" || name === "ethers") {
|
||||
deps[name] = ">5.0.0-beta.0";
|
||||
}
|
||||
}
|
||||
});
|
||||
*/
|
||||
|
||||
//if (dirname !== "ethers") {
|
||||
// delete info.publishConfig.tag;
|
||||
//}
|
||||
|
||||
// Create a normalized version sans tarballHash to compute the tarballHash
|
||||
delete info.tarballHash;
|
||||
savePackage(dirname, info);
|
||||
|
||||
// Compute the tarballHash
|
||||
let tarball = await createTarball(dirname);
|
||||
info.tarballHash = keccak256(tarball);
|
||||
|
||||
// Save the updated package.json to disk
|
||||
savePackage(dirname, info);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
ROOT: ROOT,
|
||||
createTarball: createTarball,
|
||||
dirnames: dirnames,
|
||||
getVersion: function(dirname) { return ((loadPackage(dirname) || {}).version || null); },
|
||||
loadPackage: loadPackage,
|
||||
savePackage: savePackage,
|
||||
updatePackage: updatePackage,
|
||||
}
|
||||
53
admin/log.js
53
admin/log.js
@@ -1,53 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
function getColor(color) {
|
||||
if (!color || color === "normal") { return "\x1b[0m"; }
|
||||
return "\x1b[1m" + ({
|
||||
blue: "\x1b[34m",
|
||||
cyan: "\x1b[36m",
|
||||
green: "\x1b[32m",
|
||||
magenta: "\x1b[35m",
|
||||
red: "\x1b[31m",
|
||||
yellow: "\x1b[33m",
|
||||
bold: ""
|
||||
})[color];
|
||||
}
|
||||
|
||||
// See: https://stackoverflow.com/questions/9781218/how-to-change-node-jss-console-font-color
|
||||
let disableColor = !(process.stdout.isTTY);
|
||||
function colorify(message, color) {
|
||||
if (color) {
|
||||
if (disableColor) { return message; }
|
||||
return getColor(color) + message + getColor();
|
||||
}
|
||||
|
||||
return message.replace(/<([^:]*):((?:[^<>\\]|\\.)*)>/g, (all, color, message) => {
|
||||
message = message.replace("\\>", ">");
|
||||
if (disableColor) { return message; }
|
||||
return getColor(color) + message + getColor();
|
||||
});
|
||||
}
|
||||
|
||||
function colorifyStatus(status) {
|
||||
switch (status) {
|
||||
case "modified": return colorify("<blue:" + status + ">");
|
||||
case "added": return colorify("<green:" + status + ">");
|
||||
case "deleted": return colorify("<red:" + status + ">");
|
||||
case "unmodified": return colorify("<magenta:" + status + ">");
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
function log(message, color) {
|
||||
if (color) {
|
||||
console.log(colorify(message, color));
|
||||
} else {
|
||||
console.log(colorify(message));
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
colorify: colorify,
|
||||
colorifyStatus: colorifyStatus,
|
||||
log: log
|
||||
}
|
||||
104
admin/npm.js
104
admin/npm.js
@@ -1,104 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const resolve = require("path").resolve;
|
||||
|
||||
const npm = require("libnpm");
|
||||
const semver = require("semver");
|
||||
|
||||
const local = require("./local");
|
||||
|
||||
const keccak256 = require("../packages/keccak256").keccak256;
|
||||
const fetchJson = require("../packages/web").fetchJson;
|
||||
const { prompt } = require("../packages/cli");
|
||||
|
||||
const colorify = require("./log").colorify;
|
||||
const git = require("./git");
|
||||
|
||||
|
||||
let cache = { };
|
||||
|
||||
async function getPackage(name) {
|
||||
if (cache[name]) { return cache[name]; }
|
||||
|
||||
return fetchJson("http:/" + "/registry.npmjs.org/" + name).then((result) => {
|
||||
cache[name] = result;
|
||||
return result;
|
||||
}, (error) => {
|
||||
if (error.status === 404) {
|
||||
return null;
|
||||
}
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
async function getVersion(name) {
|
||||
return getPackage(name).then((result) => {
|
||||
if (!result) { return null; }
|
||||
let versions = Object.keys(result.versions);
|
||||
versions.sort(semver.compare)
|
||||
return versions.pop();
|
||||
});
|
||||
}
|
||||
|
||||
async function getPackageVersion(name, version) {
|
||||
let info = await getPackage(name)
|
||||
if (!info) { return null; }
|
||||
|
||||
if (version == null) {
|
||||
let versions = Object.keys(info.versions);
|
||||
versions.sort(semver.compare);
|
||||
version = versions.pop();
|
||||
}
|
||||
|
||||
return info.versions[version] || null;
|
||||
}
|
||||
|
||||
async function getTarballHash(name, version) {
|
||||
let info = await getPackageVersion(name, version);
|
||||
return (info || {}).tarballHash;
|
||||
}
|
||||
|
||||
async function _publish(info, tarball, options) {
|
||||
try {
|
||||
let result = await npm.publish(info, tarball, options);
|
||||
return result;
|
||||
} catch (error) {
|
||||
|
||||
// We need an OTP
|
||||
if (error.code === "EOTP") {
|
||||
try {
|
||||
let otp = await prompt.getMessage(colorify("Enter OTP: ", "bold"));
|
||||
options.otp = otp.replace(" ", "");
|
||||
} catch (error) {
|
||||
|
||||
// CTRL-C
|
||||
if (error.message === "cancelled") {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Something unexpected...
|
||||
throw error;
|
||||
}
|
||||
|
||||
// Retry with the new OTP
|
||||
return _publish(info, tarball, options);
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async function publish(dirname, options) {
|
||||
let info = local.loadPackage(dirname);
|
||||
info.gitHead = await git.getGitTag(resolve(__dirname, "../packages/", dirname));
|
||||
if (info.gitHead == null) { throw new Error("no git tag found - " + dirname); }
|
||||
let tarball = await local.createTarball(dirname);
|
||||
return _publish(info, tarball, options);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getPackage: getPackage,
|
||||
getPackageVersion: getPackageVersion,
|
||||
getTarballHash: getTarballHash,
|
||||
getVersion: getVersion,
|
||||
publish: publish,
|
||||
};
|
||||
@@ -1,50 +0,0 @@
|
||||
{
|
||||
"name": "DevelopmentChain",
|
||||
"engine": {
|
||||
"instantSeal": null
|
||||
},
|
||||
"params": {
|
||||
"gasLimitBoundDivisor": "0x0400",
|
||||
"accountStartNonce": "0x0",
|
||||
"maximumExtraDataSize": "0x20",
|
||||
"minGasLimit": "0x1388",
|
||||
"networkID" : "0x11",
|
||||
"registrar" : "0x0000000000000000000000000000000000001337",
|
||||
"maxCodeSize": 24576,
|
||||
"maxCodeSizeTransition": "0x0",
|
||||
"eip98Transition": "0x7fffffffffffff",
|
||||
"eip140Transition": "0x0",
|
||||
"eip145Transition": "0x0",
|
||||
"eip150Transition": "0x0",
|
||||
"eip155Transition": "0x0",
|
||||
"eip160Transition": "0x0",
|
||||
"eip161abcTransition": "0x0",
|
||||
"eip161dTransition": "0x0",
|
||||
"eip211Transition": "0x0",
|
||||
"eip214Transition": "0x0",
|
||||
"eip658Transition": "0x0",
|
||||
"wasmActivationTransition": "0x0"
|
||||
},
|
||||
"genesis": {
|
||||
"seal": {
|
||||
"generic": "0x0"
|
||||
},
|
||||
"difficulty": "0x20000",
|
||||
"author": "0x0000000000000000000000000000000000000000",
|
||||
"timestamp": "0x00",
|
||||
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"extraData": "0x",
|
||||
"gasLimit": "0x7A1200"
|
||||
},
|
||||
"accounts": {
|
||||
"0000000000000000000000000000000000000001": { "balance": "1", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
|
||||
"0000000000000000000000000000000000000002": { "balance": "1", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
|
||||
"0000000000000000000000000000000000000003": { "balance": "1", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
|
||||
"0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
|
||||
"0000000000000000000000000000000000000005": { "balance": "1", "builtin": { "name": "modexp", "activate_at": 0, "pricing": { "modexp": { "divisor": 20 } } } },
|
||||
"0000000000000000000000000000000000000006": { "balance": "1", "builtin": { "name": "alt_bn128_add", "activate_at": 0, "pricing": { "linear": { "base": 500, "word": 0 } } } },
|
||||
"0000000000000000000000000000000000000007": { "balance": "1", "builtin": { "name": "alt_bn128_mul", "activate_at": 0, "pricing": { "linear": { "base": 40000, "word": 0 } } } },
|
||||
"0000000000000000000000000000000000000008": { "balance": "1", "builtin": { "name": "alt_bn128_pairing", "activate_at": 0, "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } },
|
||||
"0x7454a8f5a7c7555d79b172c89d20e1f4e4cc226c": { "balance": "1606938044258990275541962092341162602522202993782792835301376" }
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
{"id":"24d70b97-fff9-d322-e760-4b8cc2e21751","version":3,"crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"45d392cd16dbbd5c0f5b2d145c112da9"},"ciphertext":"b001ccd09fc5431dc055975b58ee61f86e85529245506c04182c902716e750e5","kdf":"pbkdf2","kdfparams":{"c":10240,"dklen":32,"prf":"hmac-sha256","salt":"028594da27a0e864105f33b912e5dc6ce7c75ecd13c81bfc158fe963d30c93bb"},"mac":"374bf2e9144b74b889708abc19e9ebc164f90bc27e83fd9f01da4571a9f81a70"},"address":"7454a8f5a7c7555d79b172c89d20e1f4e4cc226c","name":"","meta":"{}"}
|
||||
@@ -1,64 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs");
|
||||
const _resolve = require("path").resolve;
|
||||
|
||||
function repeat(chr, length) {
|
||||
let result = chr;
|
||||
while (result.length < length) { result += chr; }
|
||||
return result;
|
||||
}
|
||||
|
||||
function zpad(value) {
|
||||
value = String(value);
|
||||
while (value.length < 2) { value = "0" + value; }
|
||||
return value;
|
||||
}
|
||||
|
||||
function getDate(date) {
|
||||
return [
|
||||
date.getFullYear(),
|
||||
zpad(date.getMonth() + 1),
|
||||
zpad(date.getDate())
|
||||
].join("-");
|
||||
}
|
||||
|
||||
function getDateTime(date) {
|
||||
return getDate(date) + " " + [
|
||||
zpad(date.getHours()) ,
|
||||
zpad(date.getMinutes() + 1)
|
||||
].join(":");
|
||||
}
|
||||
|
||||
function today() {
|
||||
return getDate(new Date());
|
||||
}
|
||||
|
||||
function loadJson(filename) {
|
||||
return JSON.parse(fs.readFileSync(filename).toString());
|
||||
}
|
||||
|
||||
// @TODO: atomic write
|
||||
function saveJson(filename, json) {
|
||||
fs.writeFileSync(filename, JSON.stringify(json, null, 2) + "\n");
|
||||
}
|
||||
|
||||
function resolve(...args) {
|
||||
args = args.slice();
|
||||
args.unshift("..");
|
||||
args.unshift(__dirname);
|
||||
return _resolve.apply(null, args);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
resolve: resolve,
|
||||
|
||||
loadJson: loadJson,
|
||||
saveJson: saveJson,
|
||||
|
||||
repeat: repeat,
|
||||
|
||||
today: today,
|
||||
getDate: getDate,
|
||||
getDateTime: getDateTime
|
||||
}
|
||||
1
docs.wrm/.gitignore
vendored
Normal file
1
docs.wrm/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
**.bak
|
||||
126
docs.wrm/api-keys.wrm
Normal file
126
docs.wrm/api-keys.wrm
Normal file
@@ -0,0 +1,126 @@
|
||||
_section: Provider API Keys @<api-keys>
|
||||
|
||||
//( **TL; DR** – sign up for your own API keys with the links below to improve your application performance )//
|
||||
|
||||
When using a [[Provider]] backed by an API service (such as [[link-alchemy]],
|
||||
[[link-etherscan]] or [[link-infura]]), the service requires an API key,
|
||||
which allows each service to track individual projects and their usage and
|
||||
permissions.
|
||||
|
||||
The ethers library offers default API keys for each service, so that each
|
||||
[[Provider]] works out-of-the-box.
|
||||
|
||||
These API keys are provided as a community resource by the backend services
|
||||
for low-traffic projects and for early prototyping.
|
||||
|
||||
Since these API keys are shared by all users (that have not acquired their
|
||||
own API key), they are aggressively throttled which means retries occur more
|
||||
frequently and the responses are slower.
|
||||
|
||||
It is **highly recommended** that you sign up for a free API key from each service for their
|
||||
free tier, which (depending on the service) includes many advantages:
|
||||
|
||||
- a much **higher request rate** and concurrent request limit
|
||||
- **faster** responses with fewer retries and timeouts
|
||||
- useful **metric tracking** for performance tuning and to analyze your customer behaviour
|
||||
- more **advanced APIs**, such as archive data or advanced log queries
|
||||
|
||||
_subsection: Etherscan @<api-keys--etherscan>
|
||||
|
||||
Etherscan is an Ethereum block explorer, which is possibly the most useful
|
||||
developer tool for building and debugging Ethereum applications.
|
||||
|
||||
They offer an extensive collection of API endpoints which provide all the
|
||||
operations required to interact with the Ethereum Blockchain.
|
||||
|
||||
[Sign up for a free API key on Etherscan](link-etherscan-signup)
|
||||
|
||||
**Benefits:**
|
||||
|
||||
- higher rate limit (since you are not using the [shared rate limit](link-etherscan-ratelimit))
|
||||
- customer usage metrics
|
||||
|
||||
_subsection: INFURA @<api-keys--infura>
|
||||
|
||||
The INFURA service has been around for quite some time and is very robust
|
||||
and reliable and highly recommended.
|
||||
|
||||
They offer a standard JSON-RPC interface and a WebSocket interface, which makes
|
||||
interaction with standard tools versatile, simple and straight forward.
|
||||
|
||||
[Sign up for a free Project ID on INFURA](link-infura-signup)
|
||||
|
||||
**Benefits:**
|
||||
|
||||
- higher rate limit
|
||||
- customer usage metrics
|
||||
- access to archive data (requires paid upgrade)
|
||||
|
||||
_subsection: Alchemy @<api-keys--alchemy>
|
||||
|
||||
The Alchemy service has been around a few years and is also very robust
|
||||
and reliable.
|
||||
|
||||
They offer a standard JSON-RPC interface and a WebSocket interface, as well
|
||||
as a collection of advanced APIs for interacting with tokens and to assist
|
||||
with debugging.
|
||||
|
||||
[Sign up for a free API key on Alchemy](link-alchemy-signup)
|
||||
|
||||
**Benefits:**
|
||||
|
||||
- higher rate limit
|
||||
- customer usage metrics
|
||||
- access to advanced token balance and metadata APIs
|
||||
- access to advanced debugging trace and revert reason APIs
|
||||
|
||||
_subsection: Pocket Gateway@<api-keys--pocket-gateway>
|
||||
|
||||
|
||||
[Sign up for a free API key on Pocket](link-pocket-signup)
|
||||
|
||||
**Benefits:**
|
||||
|
||||
- customer usage metrics
|
||||
- decentralized Access to Blockchain Infrastructure
|
||||
- Stake as opposed to paying a monthly fee
|
||||
- Highly redundant global set of nodes incentivized by cryptoeconomic incentives
|
||||
|
||||
|
||||
_subsection: Creating a Default Provider @<api-keys--getDefaultProvider>
|
||||
|
||||
The [default provider](providers-getDefaultProvider) connects to multiple
|
||||
backends and verifies their results internally, making it simple to have
|
||||
a high level of trust in third-party services.
|
||||
|
||||
A second optional parameter allows API keys to be specified to each
|
||||
Provider created internally and any API key omitted will fallback onto
|
||||
using the default API key for that service.
|
||||
|
||||
It is **highly recommended** that you provide an API for each service, to
|
||||
maximize your applications performance.
|
||||
|
||||
_code: Passing API Keys into getDefaultProvider @lang<script>
|
||||
|
||||
// Use the mainnet
|
||||
const network = "homestead";
|
||||
|
||||
// Specify your own API keys
|
||||
// Each is optional, and if you omit it the default
|
||||
// API key for that service will be used.
|
||||
const provider = ethers.getDefaultProvider(network, {
|
||||
etherscan: YOUR_ETHERSCAN_API_KEY,
|
||||
infura: YOUR_INFURA_PROJECT_ID,
|
||||
// Or if using a project secret:
|
||||
// infura: {
|
||||
// projectId: YOUR_INFURA_PROJECT_ID,
|
||||
// projectSecret: YOUR_INFURA_PROJECT_SECRET,
|
||||
// },
|
||||
alchemy: YOUR_ALCHEMY_API_KEY,
|
||||
pocket: YOUR_POCKET_APPLICATION_KEY
|
||||
// Or if using an application secret key:
|
||||
// pocket: {
|
||||
// applicationId: ,
|
||||
// applicationSecretKey:
|
||||
// }
|
||||
});
|
||||
121
docs.wrm/api/contract/contract-factory.wrm
Normal file
121
docs.wrm/api/contract/contract-factory.wrm
Normal file
@@ -0,0 +1,121 @@
|
||||
_section: ContractFactory @<ContractFactory> @SRC<contracts:class.ContractFactory>
|
||||
|
||||
To deploy a [[Contract]], additional information is needed
|
||||
that is not available on a Contract object itself.
|
||||
|
||||
Mainly, the bytecode (more specifically the initcode) of a contract is required.
|
||||
|
||||
The **Contract Factory** sends a special type of transaction, an initcode
|
||||
transaction (i.e. the ``to`` field is null, and the ``data`` field is the
|
||||
initcode) where the initcode will be evaluated and the result becomes the
|
||||
new code to be deployed as a new contract.
|
||||
|
||||
_subsection: Creating Instances @<ContractFactory--creating>
|
||||
|
||||
_property: new ethers.ContractFactory(interface, bytecode [ , signer ]) @SRC<contracts:constructor.ContractFactory>
|
||||
|
||||
Creates a new instance of a **ContractFactory** for the contract described
|
||||
by the //interface// and //bytecode// initcode.
|
||||
|
||||
_property: ContractFactory.fromSolidity(compilerOutput [ , signer ]) => [[ContractFactory]]
|
||||
|
||||
Consumes the output of the Solidity compiler, extracting the ABI
|
||||
and bytecode from it, allowing for the various formats the solc
|
||||
compiler has emitted over its life.
|
||||
|
||||
_property: contractFactory.connect(signer) => [[Contract]] @<ContractFactory-connect>
|
||||
|
||||
Returns a **new instance** of the ContractFactory with the same //interface//
|
||||
and //bytecode//, but with a different //signer//.
|
||||
|
||||
_subsection: Properties @<ContractFactory--properties>
|
||||
|
||||
_property: contractFactory.interface => [[Interface]]
|
||||
|
||||
The [[Contract]] interface.
|
||||
|
||||
_property: contractFactory.bytecode => string<[[DataHexString]]>
|
||||
|
||||
The bytecode (i.e. initcode) that this **ContractFactory** will
|
||||
use to deploy the Contract.
|
||||
|
||||
_property: contractFactory.signer => [[Signer]]
|
||||
|
||||
The [[Signer]] (if any) this ContractFactory will use to deploy instances
|
||||
of the Contract to the Blockchain.
|
||||
|
||||
|
||||
_subsection: Methods @<ContractFactory--methods>
|
||||
|
||||
_property: contractFactory.attach(address) => [[Contract]] @<ContractFactory-attach>
|
||||
|
||||
Return an instance of a [[Contract]] attached to //address//. This is the
|
||||
same as using the [Contract constructor](Contract--creating) with
|
||||
//address// and this the //interface// and //signerOrProvider// passed
|
||||
in when creating the ContractFactory.
|
||||
|
||||
_property: contractFactory.getDeployTransaction(...args [ , overrides ]) => [[UnsignedTransaction]]
|
||||
|
||||
Returns the unsigned transaction which would deploy this Contract with //args// passed
|
||||
to the Contract's constructor.
|
||||
|
||||
If the optional //overrides// is specified, they can be used to
|
||||
override the endowment ``value``, transaction ``nonce``, ``gasLimit`` or
|
||||
``gasPrice``.
|
||||
|
||||
_property: contractFactory.deploy(...args [ , overrides ]) => Promise<[[Contract]]> @<ContractFactory-deploy>
|
||||
|
||||
Uses the signer to deploy the Contract with //args// passed into the constructor and
|
||||
returns a Contract which is attached to the address where this contract **will** be
|
||||
deployed once the transaction is mined.
|
||||
|
||||
The transaction can be found at ``contract.deployTransaction``, and no interactions
|
||||
should be made until the transaction is mined.
|
||||
|
||||
If the optional //overrides// is specified, they can be used to
|
||||
override the endowment ``value``, transaction ``nonce``, ``gasLimit`` or
|
||||
``gasPrice``.
|
||||
|
||||
_code: Deploying a Contract @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const signer = localSigner;
|
||||
const ContractFactory = ethers.ContractFactory;
|
||||
const bytecode = "608060405234801561001057600080fd5b5060405161012e38038061012e8339818101604052604081101561003357600080fd5b81019080805190602001909291908051906020019092919050505081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060008190555050506088806100a66000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633fa4f24514602d575b600080fd5b60336049565b6040518082815260200191505060405180910390f35b6000805490509056fea2646970667358221220926465385af0e8706644e1ff3db7161af699dc063beaadd55405f2ccd6478d7564736f6c63430007040033";
|
||||
// </hide>
|
||||
|
||||
|
||||
// If your contract constructor requires parameters, the ABI
|
||||
// must include the constructor
|
||||
const abi = [
|
||||
"constructor(address owner, uint256 initialValue)",
|
||||
"function value() view returns (uint)"
|
||||
];
|
||||
|
||||
// The factory we use for deploying contracts
|
||||
factory = new ContractFactory(abi, bytecode, signer)
|
||||
|
||||
// Deploy an instance of the contract
|
||||
contract = await factory.deploy("ricmoo.eth", 42);
|
||||
//<hide>
|
||||
//! async contract
|
||||
//</hide>
|
||||
|
||||
// The address is available immediately, but the contract
|
||||
// is NOT deployed yet
|
||||
contract.address
|
||||
//!
|
||||
|
||||
// The transaction that the signer sent to deploy
|
||||
contract.deployTransaction
|
||||
//!
|
||||
|
||||
// Wait until the transaction is mined (i.e. contract is deployed)
|
||||
// - returns the receipt
|
||||
// - throws on failure (the reciept is on the error)
|
||||
contract.deployTransaction.wait()
|
||||
//!
|
||||
|
||||
// Now the contract is safe to interact with
|
||||
contract.value()
|
||||
//!
|
||||
@@ -1,82 +1,93 @@
|
||||
_section: Contract @<contract> @SRC<contracts:class.Contract>
|
||||
_section: Contract @<Contract> @SRC<contracts:class.Contract>
|
||||
|
||||
_subsection: Properties
|
||||
A **Contract** is an abstraction of code that has been deployed
|
||||
to the blockchain.
|
||||
|
||||
_property: contract.address => string<[[address]]>
|
||||
This is the address (or ENS name) the contract was constructed with.
|
||||
A Contract may be sent transactions, which will trigger its code
|
||||
to be run with the input of the transaction data.
|
||||
|
||||
_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.
|
||||
_subsection: Creating Instances @<Contract--creating>
|
||||
|
||||
_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: new ethers.Contract(address, abi, signerOrProvider) @src<contracts:class.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>
|
||||
_property: contract.attach(addressOrName) => [[Contract]] @<Contract-attach> @SRC<contracts:BaseContract.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>
|
||||
_property: contract.connect(providerOrSigner) => [[Contract]] @<Contract-connect> @SRC<contracts:BaseContract.connect>
|
||||
Returns a new instance of the Contract, but connected to
|
||||
//providerOrSigner//.
|
||||
|
||||
By passing in a [[provider]], this will return a downgraded
|
||||
By passing in a [[Provider]], this will return a downgraded
|
||||
**Contract** which only has read-only access (i.e. constant calls).
|
||||
|
||||
By passing in a [[signer]]. the will return a **Contract** which
|
||||
By passing in a [[Signer]]. this will return a **Contract** which
|
||||
will act on behalf of that signer.
|
||||
|
||||
_property: contract.deployed() => Promise<[[contract]]> @<contract-deployed> @SRC<contracts>
|
||||
|
||||
_property: Contract.isIndexed(value) => boolean @<contract-isIndexed> @SRC<contracts>
|
||||
_subsection: Properties @<Contract--properties>
|
||||
|
||||
_property: contract.address => string<[[address]]>
|
||||
This is the address (or ENS name) the contract was constructed with.
|
||||
|
||||
_property: contract.resolvedAddress => string<[[address]]>
|
||||
This is a promise that will resolve to the address the **Contract**
|
||||
object is attached to. If an [[address]] was provided to the constructor,
|
||||
it will be equal to this; if an ENS name was provided, this will be the
|
||||
resolved address.
|
||||
|
||||
_property: contract.deployTransaction => [[providers-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 => [[Interface]]
|
||||
This is the ABI as an [[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: Events
|
||||
_subsection: Methods @<Contract--methods>
|
||||
|
||||
_property: contract.queryFilter(event [ , fromBlockOrBlockHash [ , toBlock ]) => Promise<Array<Event>> @<contract-queryfilter> @SRC<contracts>
|
||||
_property: contract.deployed() => Promise<[[Contract]]> @<Contract-deployed> @SRC<contracts>
|
||||
|
||||
_property: Contract.isIndexed(value) => boolean @<Contract-isIndexed> @SRC<contracts>
|
||||
|
||||
|
||||
_subsection: Events @<Contract--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>
|
||||
_property: contract.listenerCount([ event ]) => number @<Contract-listenerCount> @SRC<contracts:BaseContract.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>
|
||||
_property: contract.listeners(event) => Array<Listener> @<Contract-listeners> @SRC<contracts:BaseContract.listeners>
|
||||
Return a list of listeners that are subscribed to //event//.
|
||||
|
||||
_property: contract.off(event, listener) => this @<contract-off> @SRC<contracts>
|
||||
_property: contract.off(event, listener) => this @<Contract-off> @SRC<contracts>
|
||||
Unsubscribe //listener// to //event//.
|
||||
|
||||
_property: contract.on(event, listener) => this @<contract-on> @SRC<contracts>
|
||||
_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>
|
||||
_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>
|
||||
_property: contract.removeAllListeners([ event ]) => this @<Contract-removeAllListeners> @SRC<contracts:BaseContract.removeAllListeners>
|
||||
Unsubscribe all listeners for //event//. If no event is provided,
|
||||
all events are unsubscribed.
|
||||
|
||||
|
||||
_subsection: Meta-Class @<contract-metaclass>
|
||||
_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
|
||||
@@ -85,7 +96,7 @@ describe the generic ways to interact with the properties added
|
||||
at run-time during the **Contract** constructor.
|
||||
|
||||
|
||||
_heading: Read-Only Methods (constant) @<contract-readonly>
|
||||
_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
|
||||
@@ -93,21 +104,68 @@ 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.
|
||||
_property: contract.METHOD_NAME(...args [, overrides ]) => Promise<any> @<Contract-functionsCall>
|
||||
The type of the result depends on the ABI. If the method returns a single
|
||||
value, it will be returned directly, otherwise a [[Result]] object will
|
||||
be returned with each parameter available positionally and if the parameter
|
||||
is named, it will also be available by its name.
|
||||
|
||||
For values that have a simple meaning in JavaScript, the types are fairly
|
||||
straight forward; strings and booleans are returned as JavaScript strings
|
||||
and booleans.
|
||||
|
||||
For numbers, if the **type** is in the JavaSsript safe range (i.e. less
|
||||
For numbers, if the **type** is in the JavaScript safe range (i.e. less
|
||||
than 53 bits, such as an ``int24`` or ``uint48``) a normal JavaScript
|
||||
number is used. Otherwise a [[bignumber]] is returned.
|
||||
number is used. Otherwise a [[BigNumber]] is returned.
|
||||
|
||||
For bytes (both fixed length and dynamic), a [[datahexstring]] is returned.
|
||||
For bytes (both fixed length and dynamic), a [[DataHexString]] is returned.
|
||||
|
||||
If the call reverts (or runs out of gas), a [CALL_EXCEPTION](errors--call-exception)
|
||||
will be thrown which will include:
|
||||
|
||||
_heading: Write Methods (non-constant) @<contract-write>
|
||||
- ``error.address`` - the contract address
|
||||
- ``error.args`` - the arguments passed into the method
|
||||
- ``error.transaction`` - the transaction
|
||||
|
||||
The //overrides// object for a read-only method may include any of:
|
||||
|
||||
- ``overrides.from`` - the ``msg.sender`` (or ``CALLER``) to use during the
|
||||
execution of the code
|
||||
- ``overrides.value`` - the ``msg.value`` (or ``CALLVALUE``) to use during the
|
||||
exectuiont of the code
|
||||
- ``overrides.gasPrice`` - the price to pay per gas (theoretically); since there
|
||||
is no transaction, there is not going to be any fee charged, but the EVM still
|
||||
requires a value to report to ``tx.gasprice`` (or ``GASPRICE``);
|
||||
//most developers will not require this//
|
||||
- ``overrides.gasLimit`` - the amount of gas (theoretically) to allow a node
|
||||
to use during the execution of the code; since there is no transaction, there
|
||||
is not going to be any fee charged, but the EVM still processes gas metering
|
||||
so calls like ``gasleft`` (or ``GAS``) report meaningful values
|
||||
- ``overrides.blockTag`` - a block tag to simulate the execution at, which
|
||||
can be used for hypothetical historic analysis; note that many backends
|
||||
do not support this, or may require paid plans to access as the node database
|
||||
storage and processing requirements are much higher
|
||||
|
||||
_property: contract.functions.METHOD_NAME(...args [, overrides ]) => Promise<[[Result]]>
|
||||
|
||||
The result will always be a [[Result]], even if there is only a single
|
||||
return value type.
|
||||
|
||||
This simplifies frameworks which wish to use the [[Contract]] object,
|
||||
since they do not need to inspect the return types to unwrap simplified
|
||||
functions.
|
||||
|
||||
Another use for this method is for error recovery. For example, if a
|
||||
function result is an invalid UTF-8 string, the normal call using the
|
||||
above meta-class function will throw an exception. This allows using the
|
||||
Result access error to access the low-level bytes and reason for the error
|
||||
allowing an alternate UTF-8 error strategy to be used.
|
||||
|
||||
Most developers should not require this.
|
||||
|
||||
The //overrides// are identical to the read-only operations above.
|
||||
|
||||
_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
|
||||
@@ -119,37 +177,71 @@ 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
|
||||
_property: contract.METHOD_NAME(...args [ , overrides ]) => Promise<[[providers-TransactionResponse]]> @<contract-functionsSend>
|
||||
Returns a [[providers-TransactionResponse]] for the transaction after
|
||||
it is sent to the network. This requires the **Contract** has a
|
||||
signer.
|
||||
|
||||
The //overrides// object for write methods may include any of:
|
||||
|
||||
_heading: Write Methods Analysis @<contract-write-check>
|
||||
- ``overrides.gasPrice`` - the price to pay per gas
|
||||
- ``overrides.gasLimit`` - the limit on the amount of gas to allow the transaction
|
||||
to consume; any unused gas is returned at the gasPrice
|
||||
- ``overrides.value`` - the amount of ether (in wei) to forward with the call
|
||||
- ``overrides.nonce`` - the nonce to use for the [[Signer]]
|
||||
|
||||
There are secveral options to analyze properties and results of a
|
||||
If the ``wait()`` method on the returned [[providers-TransactionResponse]]
|
||||
is called, there will be additional properties on the receipt:
|
||||
|
||||
- ``receipt.events`` - an array of the logs, with additional properties
|
||||
(if the ABI included a description for the events)
|
||||
- ``receipt.events[n].args`` - the parsed arguments
|
||||
- ``receipt.events[n].decode`` - a method that can be used to parse the
|
||||
log topics and data (this was used to compute ``args``)
|
||||
- ``receipt.events[n].event`` - the name of the event
|
||||
- ``receipt.events[n].eventSignature`` - the full signature of the event
|
||||
- ``receipt.removeListener()`` - a method to remove the listener that trigger
|
||||
this event
|
||||
- ``receipt.getBlock()`` - a method to return the [Block](providers-Block) this event occurred in
|
||||
- ``receipt.getTransaction()`` - a method to return the
|
||||
[Transaction](providers-TransactionResponse) this event occurred in
|
||||
- ``receipt.getTransactionReceipt()`` - a method to return the
|
||||
[Transaction Receipt](providers-TransactionReceipt) this event occurred in
|
||||
|
||||
|
||||
_heading: Write Methods Analysis @<Contract--check>
|
||||
|
||||
There are several options to analyze properties and results of a
|
||||
write method without actually executing it.
|
||||
|
||||
_property: contract.estimateGas.METHOD_NAME(...args [ , overrides ]) => Promise<[[bignumber]]> @<contract-estimateGas>
|
||||
_property: contract.estimateGas.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
|
||||
The //overrides// are identical to the overrides above for read-only
|
||||
or write methods, depending on the type of call of //METHOD_NAME//.
|
||||
|
||||
_property: contract.populateTransaction.METHOD_NAME(...args [ , overrides ]) => Promise<[UnsignedTx](UnsignedTransaction)> @<contract-populateTransaction>
|
||||
Returns an [[UnsignedTransaction]] which represents the transaction
|
||||
that would need to be signed and submitted to the network to execute
|
||||
//METHOD_NAME// with //args// and //overrides//.
|
||||
|
||||
_property: contract.staticCall.METHOD_NAME(...args [ , overrides ]) => Promise<any> @<contract-staticCall>
|
||||
The //overrides// are identical to the overrides above for read-only
|
||||
or write methods, depending on the type of call of //METHOD_NAME//.
|
||||
|
||||
_property: contract.callStatic.METHOD_NAME(...args [ , overrides ]) => Promise<any> @<contract-callStatic>
|
||||
Rather than executing the state-change of a transaction, it is possible
|
||||
to ask a node to //pretend// that a call is not state-changing and
|
||||
return the result.
|
||||
|
||||
This does not actually chagne any state, but is free. This in some cases
|
||||
This does not actually change any state, but is free. This in some cases
|
||||
can be used to determine if a transaction will fail or succeed.
|
||||
|
||||
This otherwise functions the same as a [Read-Only Method](contract-readonly).
|
||||
This otherwise functions the same as a [Read-Only Method](Contract--readonly).
|
||||
|
||||
_heading: Event Filters @<contract-filter>
|
||||
The //overrides// are identical to the read-only operations above.
|
||||
|
||||
_heading: Event Filters @<Contract--filters>
|
||||
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.
|
||||
|
||||
@@ -41,7 +41,7 @@ const erc20 = new ethers.Contract(address, abi, provider);
|
||||
const erc20_rw = new ethers.Contract(address, abi, signer)
|
||||
|
||||
|
||||
_heading: ERC20Contract @INHERIT<[[contract]]>
|
||||
_heading: ERC20Contract @INHERIT<[[Contract]]>
|
||||
|
||||
_property: new ethers.Contract(address, abi, providerOrSigner)
|
||||
See the above code example for creating an Instance which will
|
||||
@@ -50,48 +50,48 @@ add the additional properties defined in //abi// to a **Contract**
|
||||
connected to //address// using the //providerOrSigner//.
|
||||
|
||||
|
||||
_subsection: Properties @NOTE<(inheritted from [[contract]])>
|
||||
_subsection: Properties @NOTE<(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]]>
|
||||
_property: erc20.resolvedAddress => string<[[address]]>
|
||||
This is a promise that will resolve to the address the **Contract**
|
||||
object is attached to. If an [[address]] was provided to the constructor,
|
||||
it will be equal to this; if an ENS name was provided, this will be the
|
||||
resolved address.
|
||||
|
||||
_property: erc20.deployTransaction => [[provider-transactionresponse]]
|
||||
_property: erc20.deployTransaction => [[providers-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.interface => [[Interface]]
|
||||
This is the ABI as an [[Interface]].
|
||||
|
||||
_property: erc20.provider => [[provider]]
|
||||
_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.
|
||||
a signer was provided that had a [[Provider]], this is that provider.
|
||||
|
||||
_property: erc20.signer => [[signer]]
|
||||
_property: erc20.signer => [[Signer]]
|
||||
If a signer was provided to the constructor, this is that signer.
|
||||
|
||||
|
||||
_subsection: Methods @NOTE<(inheritted from [[contract]])>
|
||||
_subsection: Methods @NOTE<(inheritted from [[Contract]])>
|
||||
|
||||
_property: erc20.attach(addressOrName) => [[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]]
|
||||
_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
|
||||
By passing in a [[Provider]], this will return a downgraded
|
||||
**Contract** which only has read-only access (i.e. constant calls).
|
||||
|
||||
By passing in a [[signer]]. the will return a **Contract** which
|
||||
By passing in a [[Signer]]. this will return a **Contract** which
|
||||
will act on behalf of that signer.
|
||||
|
||||
_property: erc20.deployed() => Promise<Contract>
|
||||
@@ -99,7 +99,7 @@ _property: erc20.deployed() => Promise<Contract>
|
||||
_property: Contract.isIndexed(value) => boolean
|
||||
|
||||
|
||||
_subsection: Events @NOTE<(inheritted from [[contract]])> @<erc20-events>
|
||||
_subsection: Events @NOTE<(inheritted from [[Contract]])> @<erc20-events>
|
||||
|
||||
_property: erc20.queryFilter(event [ , fromBlockOrBlockHash [ , toBlock ]) => Promise<Array<Event>> @<erc20-queryfilter>
|
||||
Return Events that match the //event//.
|
||||
@@ -133,16 +133,16 @@ 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
|
||||
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]]>
|
||||
_property: erc20.balanceOf(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]]>
|
||||
_property: erc20_rw.transfer(target, amount [, overrides ]) => Promise<[[providers-TransactionResponse]]>
|
||||
Transfers //amount// tokens to //target// from the current signer.
|
||||
The return value (a boolean) is inaccessible during a write operation
|
||||
using a transaction. Other techniques (such as events) are required
|
||||
@@ -155,12 +155,12 @@ 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]]>
|
||||
_property: erc20.estimateGas.transfer(target, amount [, overrides ]) => Promise<[[BigNumber]]>
|
||||
Returns an estimate for how many units of gas would be required
|
||||
to transfer //amount// tokens to //target//.
|
||||
|
||||
_property: erc20.populateTransaction.transfer(target, amount [, overrides ]) => Promise<[UnsignedTx](types-unsignedtransaction)>
|
||||
Returns an [[types-unsignedtransaction]] which could be signed and submitted
|
||||
_property: erc20.populateTransaction.transfer(target, amount [, overrides ]) => Promise<[UnsignedTx](UnsignedTransaction)>
|
||||
Returns an [[UnsignedTransaction]] which could be signed and submitted
|
||||
to the network to transaction //amount// tokens to //target//.
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ _subsection: Meta-Class Filters @NOTE<(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
|
||||
_property: erc20.filters.Transfer([ fromAddress [ , toAddress ] ]) => Filter
|
||||
Returns a new Filter which can be used to [query](erc20-queryfilter) or
|
||||
to [subscribe/unsubscribe to events](erc20-events).
|
||||
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
_section: Contract Interaction @<contracts>
|
||||
|
||||
Explain what contracts are...
|
||||
A **Contract** object is an abstraction of a contract (EVM bytecode)
|
||||
deployed on the Ethereum network. It allows for a simple way to
|
||||
serialize calls and transactions to an on-chain contract and
|
||||
deserialize their results and emitted logs.
|
||||
|
||||
A **ContractFactory** is an abstraction of a contract's //bytecode//
|
||||
and facilitates deploying a contract.
|
||||
|
||||
_toc:
|
||||
contract
|
||||
contract-factory
|
||||
example
|
||||
|
||||
@@ -5,7 +5,7 @@ to be included in the base library. The API should not be considered
|
||||
stable and does not follow [[link-semver]] versioning, so applications
|
||||
requiring it should specify the //exact version// needed.
|
||||
|
||||
_subsection: BrainWallet @<experimental-brainwallet> @INHERIT<[[wallet]]>
|
||||
_subsection: BrainWallet @<experimental-brainwallet> @INHERIT<[[Wallet]]>
|
||||
|
||||
Ethers removed support for BrainWallets in v4, since they are unsafe and
|
||||
many can be easily guessed, allowing attackers to steal the funds. This
|
||||
@@ -17,17 +17,17 @@ Generates a brain wallet, with a slightly improved experience, in which
|
||||
the generated wallet has a mnemonic.
|
||||
|
||||
_property: BrainWallet.generateLegacy(username, password [ , progressCallback ]) => [[experimental-brainwallet]]
|
||||
Generate a brain wallet which is compatibile with the ethers v3 and earlier.
|
||||
Generate a brain wallet which is compatible with the ethers v3 and earlier.
|
||||
|
||||
|
||||
_subsection: EIP1193Bridge @<experimental-eip1193bridge> @INHERIT<[[link-npm-events]]>
|
||||
|
||||
The **EIP1193Bridge** allows a normal Ethers [[signer]] and [[provider]] to be
|
||||
The **EIP1193Bridge** allows a normal Ethers [[Signer]] and [[Provider]] to be
|
||||
exposed in as a standard [EIP-1193 Provider](link-eip-1193), which may be useful
|
||||
when interacting with other libraries.
|
||||
|
||||
|
||||
_subsection: NonceManager @<experimental-noncemanager> @INHERIT<[[signer]]>
|
||||
_subsection: NonceManager @<experimental-noncemanager> @INHERIT<[[Signer]]>
|
||||
|
||||
The **NonceManager** is designed to manage the nonce for a Signer,
|
||||
automatically increasing it as it sends transactions.
|
||||
@@ -46,20 +46,20 @@ a transaction is dependent on another transaction being mined first.
|
||||
_property: new NonceManager(signer)
|
||||
Create a new NonceManager.
|
||||
|
||||
_property: nonceManager.signer => [[signer]]
|
||||
_property: nonceManager.signer => [[Signer]]
|
||||
The signer whose nonce is being managed.
|
||||
|
||||
_property: nonceManager.provider => [[provider]]
|
||||
_property: nonceManager.provider => [[Provider]]
|
||||
The provider associated with the signer.
|
||||
|
||||
_property: nonceManager.setTransactionCount(count) => void
|
||||
Set the current transaction count (nonce) for the signer.
|
||||
|
||||
This may be useful it interacting with the signer outside of using
|
||||
This may be useful in interacting with the signer outside of using
|
||||
this class.
|
||||
|
||||
_property: nonceManager.increaseTransactionCount( [ count = 1 ]) => void
|
||||
_property: nonceManager.incrementTransactionCount( [ count = 1 ]) => void
|
||||
Bump the current transaction count (nonce) by //count//.
|
||||
|
||||
This may be useful it interacting with the signer outside of using
|
||||
This may be useful in interacting with the signer outside of using
|
||||
this class.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
_section: Application Programming Interface @NAV<API>
|
||||
_section: Application Programming Interface @<api> @NAV<API>
|
||||
|
||||
An Application Programming Interface (API) is the formal
|
||||
specification of the library.
|
||||
|
||||
_toc:
|
||||
contract
|
||||
signer
|
||||
providers
|
||||
signer
|
||||
contract
|
||||
utils
|
||||
other
|
||||
experimental
|
||||
|
||||
@@ -8,7 +8,7 @@ The assembler utilities allow parsing and assembling an
|
||||
_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>
|
||||
_property: asm.assemble(node) => string<[[DataHexString]]> @SRC<asm/assembler:function.assemble>
|
||||
Performs assembly of the [[asm-ast]] //node// and return the
|
||||
resulting bytecode representation.
|
||||
|
||||
@@ -26,7 +26,7 @@ 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
|
||||
Each array index represents an operation, collapsing multi-byte operations
|
||||
(i.e. ``PUSH``) into a single operation.
|
||||
|
||||
_property: bytecode.getOperation(offset) => [[asm-operation]]
|
||||
@@ -45,14 +45,14 @@ The opcode for this Operation.
|
||||
_property: operation.offset => number
|
||||
The offset into the bytecode for this Operation.
|
||||
|
||||
_property: operation.pushValue => string<[[datahexstring]]>
|
||||
_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
|
||||
Create a new instance of an Opcode for a given numeric value
|
||||
(e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1").
|
||||
|
||||
_heading: Properties
|
||||
|
||||
@@ -44,12 +44,12 @@ 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
|
||||
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
|
||||
value should be taken verbatim and no ``PUSH`` operation should be
|
||||
added, otherwise false.
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ _heading: PopNode @<asm-popnode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.PopN
|
||||
|
||||
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
|
||||
explicit place-holder (e.g. ``$1``), which indicates the expected stack position
|
||||
to consume.
|
||||
|
||||
_property: literalNode.index => number
|
||||
@@ -72,7 +72,7 @@ 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.
|
||||
The name of the target node.
|
||||
|
||||
_property: linkNode.type => "offset" | "length"
|
||||
Whether this node is for an offset or a length value of the
|
||||
@@ -96,7 +96,7 @@ 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
|
||||
value should be taken verbatim and no ``PUSH`` operation should be
|
||||
added, otherwise false.
|
||||
|
||||
_property: evaluationNode.script => string
|
||||
@@ -115,7 +115,7 @@ 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]].
|
||||
be targeted by a [[asm-linknode]].
|
||||
|
||||
_property: labelledNode.name => string
|
||||
The name of this node.
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
_section: Ethers ASM Dialect @<asm-dialect>
|
||||
|
||||
This provides a quick, high-level overcview of the **Ethers ASM Dialect**
|
||||
This provides a quick, high-level overview 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),
|
||||
Once a program is compiled by a higher level language 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
|
||||
@@ -34,7 +34,7 @@ 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
|
||||
@TODO: Examples
|
||||
|
||||
|
||||
_subsection: Literals @<asm-dialect-literal>
|
||||
@@ -42,10 +42,10 @@ _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
|
||||
A **Literal** can be provided using a [[DataHexString]] or a decimal
|
||||
byte value.
|
||||
|
||||
@TODO: exmples
|
||||
@TODO: examples
|
||||
|
||||
|
||||
_subsection: Comments @<asm-dialect-comment>
|
||||
@@ -64,7 +64,7 @@ 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
|
||||
returns some other bytecode as a result, this result is the bytecode
|
||||
to be installed.
|
||||
|
||||
Therefore it is important that embedded code uses jumps relative to itself,
|
||||
@@ -76,7 +76,7 @@ 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 ``_``.
|
||||
Every program in the **Ethers ASM Dialect** has a top-level scope named ``_``.
|
||||
|
||||
|
||||
_subsection: Data Segment @<asm-dialect-datasegment>
|
||||
@@ -84,7 +84,7 @@ _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
|
||||
An empty **Data Segment** can also be used when a labelled location is
|
||||
required, but without the ``JUMPDEST`` which a [[asm-dialect-label]] adds.
|
||||
|
||||
@TODO: Example
|
||||
@@ -111,5 +111,5 @@ _subsection: Stack Placeholders @<asm-dialect-placeholder>
|
||||
@TODO: exampl
|
||||
|
||||
|
||||
_subsection: Evaluation and Excution @<asm-dialect-scripting>
|
||||
_subsection: Evaluation and Execution @<asm-dialect-scripting>
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
_section: Assembly
|
||||
|
||||
This module should still be considered fairly experimental.
|
||||
|
||||
_toc:
|
||||
dialect
|
||||
api
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
_section: Hardware Wallets
|
||||
|
||||
_subsection: LedgerSigner @<hw-ledger> @INHERIT<[[signer]]> @SRC<hardware-wallets:class.LedgerSigner>
|
||||
|
||||
_subsection: LedgerSigner @<hw-ledger> @INHERIT<[[Signer]]> @SRC<hardware-wallets:class.LedgerSigner>
|
||||
|
||||
The [Ledger Hardware Wallets](link-ledger) are a fairly
|
||||
popular brand.
|
||||
|
||||
TODO: importing
|
||||
|
||||
_code: Importing in ES6 or TypeScript @lang<script>
|
||||
|
||||
import { LedgerSigner } from "@ethersproject/hardware-wallets";
|
||||
|
||||
|
||||
_heading: API
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
_section: API Providers
|
||||
_section: API Providers @<api-providers>
|
||||
|
||||
There are many services which offer a web API for accessing
|
||||
the Ethereum Blockchain. These Providers allow connecting
|
||||
@@ -6,19 +6,36 @@ to them, which simplifies development, since you do not need
|
||||
to run your own instance or cluster of Ethereum nodes.
|
||||
|
||||
However, this reliance on third-party services can reduce
|
||||
resiliance, security and increase the amount of required trust.
|
||||
resilience, security and increase the amount of required trust.
|
||||
To mitigate these issues, it is recommended you use a
|
||||
[Default Provider](get-default-provider).
|
||||
[Default Provider](providers-getDefaultProvider).
|
||||
|
||||
|
||||
_subsection: EtherscanProvider @INHERIT<[[provider]]>
|
||||
_subsection: EtherscanProvider @<EtherscanProvider> @inherit<[[Provider]]> @src<providers:class.EtherscanProvider>
|
||||
|
||||
The **EtherscanProvider** is backed by a combination of the various
|
||||
[Etherscan APIs](link-etherscan-api).
|
||||
|
||||
_property: provider.getHistory(address) => Array<History>
|
||||
_property: new ethers.providers.EtherscanProvider([ network = "homestead", [ apiKey ] ])
|
||||
Create a new **EtherscanProvider** connected to //network// with the
|
||||
optional //apiKey//.
|
||||
|
||||
The //network// may be specified as a **string** for a common
|
||||
network name, a **number** for a common chain ID or a
|
||||
[Network Object]provider-(network).
|
||||
|
||||
If no //apiKey// is provided, a shared API key will be used,
|
||||
which may result in reduced performance and throttled requests.
|
||||
It is highly recommended for production, you register with
|
||||
[Etherscan](link-etherscan) for your own API key.
|
||||
|
||||
_note: Note: Default API keys
|
||||
If no //apiKey// is provided, a shared API key will be used,
|
||||
which may result in reduced performance and throttled requests.
|
||||
|
||||
It is highly recommended for production, you register with
|
||||
[Etherscan](link-etherscan) for your own API key.
|
||||
|
||||
@TODO... Explain
|
||||
|
||||
_definition: **Supported Networks**
|
||||
|
||||
@@ -28,24 +45,69 @@ _definition: **Supported Networks**
|
||||
- Görli (clique testnet)
|
||||
- Kovan (proof-of-authority testnet)
|
||||
|
||||
_code: Etherscan Examples @lang<javascript>
|
||||
|
||||
_subsection: InfuraProvider @INHERIT<[[provider-urljsonrpc]]>
|
||||
// <hide>
|
||||
const EtherscanProvider = ethers.providers.EtherscanProvider;
|
||||
const apiKey = "...";
|
||||
// </hide>
|
||||
|
||||
// Connect to mainnet (homestead)
|
||||
provider = new EtherscanProvider();
|
||||
|
||||
// Connect to rinkeby testnet (these are equivalent)
|
||||
provider = new EtherscanProvider("rinkeby");
|
||||
provider = new EtherscanProvider(4);
|
||||
|
||||
const network = ethers.providers.getNetwork("rinkeby");
|
||||
// <hide>
|
||||
delete network._defaultProvider;
|
||||
network
|
||||
// </hide>
|
||||
//!
|
||||
|
||||
provider = new EtherscanProvider(network);
|
||||
|
||||
// Connect to mainnet (homestead) with an API key
|
||||
provider = new EtherscanProvider(null, apiKey);
|
||||
provider = new EtherscanProvider("homestead", apiKey);
|
||||
|
||||
|
||||
_property: provider.getHistory(address) => Array<History> @src<providers>
|
||||
@TODO... Explain
|
||||
|
||||
|
||||
_subsection: InfuraProvider @<InfuraProvider> @INHERIT<[[UrlJsonRpcProvider]]> @src<providers:class.InfuraProvider>
|
||||
|
||||
The **InfuraProvider** is backed by the popular [INFURA](link-infura)
|
||||
Ethereum service.
|
||||
|
||||
_definition: **Supported Networks**
|
||||
_property: new ethers.providers.InfuraProvider([ network = "homestead", [ apiKey ] ]) @SRC<providers>
|
||||
Create a new **InfuraProvider** connected to //network// with
|
||||
the optional //apiKey//.
|
||||
|
||||
- Homestead (Mainnet)
|
||||
- Ropsten (proof-of-work testnet)
|
||||
- Rinkeby (proof-of-authority testnet)
|
||||
- Görli (clique testnet)
|
||||
- Kovan (proof-of-authority testnet)
|
||||
The //network// may be specified as a **string** for a common
|
||||
network name, a **number** for a common chain ID or a
|
||||
[Network Object]provider-(network).
|
||||
|
||||
The //apiKey// can be a **string** Project ID or an **object**
|
||||
with the properties ``projectId`` and ``projectSecret`` to
|
||||
specify a [Project Secret](link-infura-secret) which can be used
|
||||
on non-public sources (like on a server) to further secure your
|
||||
API access and quotas.
|
||||
|
||||
_subsection: AlchemyProvider @INHERIT<[[provider-urljsonrpc]]>
|
||||
_property: InfuraProvider.getWebSocketProvider([ network [ , apiKey ] ]) => [[WebSocketProvider]] @<InfuraProvider-getWebSocketProvider> @SRC<providers:InfuraProvider.getWebSocketProvider>
|
||||
Create a new [[WebSocketProvider]] using the INFURA web-socket endpoint
|
||||
to connect to //network// with the optional //apiKey//.
|
||||
|
||||
The **AlchemtProvider** is backed by [Alchemy](link-alchemy).
|
||||
The //network// and //apiKey// are specified the same as [the constructor](InfuraProvider).
|
||||
|
||||
_note: Note: Default API keys
|
||||
If no //apiKey// is provided, a shared API key will be used,
|
||||
which may result in reduced performance and throttled requests.
|
||||
|
||||
It is highly recommended for production, you register with
|
||||
[INFURA](link-infura) for your own API key.
|
||||
|
||||
_definition: **Supported Networks**
|
||||
|
||||
@@ -55,11 +117,106 @@ _definition: **Supported Networks**
|
||||
- Görli (clique testnet)
|
||||
- Kovan (proof-of-authority testnet)
|
||||
|
||||
_code: INFURA Examples @lang<javascript>
|
||||
|
||||
_subsection: CloudflareProvider @INHERIT<[[provider-urljsonrpc]]>
|
||||
// <hide>
|
||||
const InfuraProvider = ethers.providers.InfuraProvider;
|
||||
const projectId = "...";
|
||||
const projectSecret = "...";
|
||||
// </hide>
|
||||
|
||||
// Connect to mainnet (homestead)
|
||||
provider = new InfuraProvider();
|
||||
|
||||
// Connect to the ropsten testnet
|
||||
// (see EtherscanProvider above for other network examples)
|
||||
provider = new InfuraProvider("ropsten");
|
||||
|
||||
// Connect to mainnet with a Project ID (these are equivalent)
|
||||
provider = new InfuraProvider(null, projectId);
|
||||
provider = new InfuraProvider("homestead", projectId);
|
||||
|
||||
// Connect to mainnet with a Project ID and Project Secret
|
||||
provider = new InfuraProvider("homestead", {
|
||||
projectId: projectId,
|
||||
projectSecret: projectSecret
|
||||
});
|
||||
|
||||
// Connect to the INFURA WebSocket endpoints with a WebSocketProvider
|
||||
provider = InfuraProvider.getWebSocketProvider()
|
||||
// <hide>
|
||||
provider.destroy();
|
||||
// </hide>
|
||||
|
||||
|
||||
_subsection: AlchemyProvider @<AlchemyProvider> @inherit<[[UrlJsonRpcProvider]]> @src<providers:class.AlchemyProvider>
|
||||
|
||||
The **AlchemyProvider** is backed by [Alchemy](link-alchemy).
|
||||
|
||||
_property: new ethers.providers.AlchemyProvider([ network = "homestead", [ apiKey ] ])
|
||||
Create a new **AlchemyProvider** connected to //network// with
|
||||
the optional //apiKey//.
|
||||
|
||||
The //network// may be specified as a **string** for a common
|
||||
network name, a **number** for a common chain ID or a
|
||||
[Network Object](providers-Network).
|
||||
|
||||
_note: Note: Default API keys
|
||||
If no //apiKey// is provided, a shared API key will be used,
|
||||
which may result in reduced performance and throttled requests.
|
||||
|
||||
It is highly recommended for production, you register with
|
||||
[Alchemy](link-alchemy) for your own API key.
|
||||
|
||||
_definition: **Supported Networks**
|
||||
|
||||
- Homestead (Mainnet)
|
||||
- Ropsten (proof-of-work testnet)
|
||||
- Rinkeby (proof-of-authority testnet)
|
||||
- Görli (clique testnet)
|
||||
- Kovan (proof-of-authority testnet)
|
||||
|
||||
_code: Alchemy Examples @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const AlchemyProvider = ethers.providers.AlchemyProvider;
|
||||
const apiKey = "...";
|
||||
// </hide>
|
||||
|
||||
// Connect to mainnet (homestead)
|
||||
provider = new AlchemyProvider();
|
||||
|
||||
// Connect to the ropsten testnet
|
||||
// (see EtherscanProvider above for other network examples)
|
||||
provider = new AlchemyProvider("ropsten");
|
||||
|
||||
// Connect to mainnet with an API key (these are equivalent)
|
||||
provider = new AlchemyProvider(null, apiKey);
|
||||
provider = new AlchemyProvider("homestead", apiKey);
|
||||
|
||||
// Connect to the Alchemy WebSocket endpoints with a WebSocketProvider
|
||||
provider = AlchemyProvider.getWebSocketProvider()
|
||||
// <hide>
|
||||
provider.destroy();
|
||||
// </hide>
|
||||
|
||||
|
||||
_subsection: CloudflareProvider @<CloudflareProvider> @inherit<[[UrlJsonRpcProvider]]> @src<providers:class.CloudflareProvider>
|
||||
|
||||
The CloudflareProvider is backed by the [Cloudflare Ethereum Gateway](link-cloudflare).
|
||||
|
||||
_property: new ethers.providers.CloudflareProvider()
|
||||
Create a new **CloudflareProvider** connected to mainnet (i.e. "homestead").
|
||||
|
||||
_definition: **Supported Networks**
|
||||
|
||||
- Homestead (Mainnet)
|
||||
|
||||
_code: Cloudflare Examples @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const CloudflareProvider = ethers.providers.CloudflareProvider;
|
||||
// </hide>
|
||||
|
||||
// Connect to mainnet (homestead)
|
||||
provider = new CloudflareProvider();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
_section: Providers
|
||||
_section: Providers @<providers>
|
||||
|
||||
A **Provider** is an abstraction of a connection to the
|
||||
Ethereum network, providing a concise, consistent interface
|
||||
@@ -9,18 +9,18 @@ cover the vast majority of use-cases, but also includes the
|
||||
necessary functions and classes for sub-classing if a more
|
||||
custom configuration is necessary.
|
||||
|
||||
Most users should be able to simply use the [[get-default-provider]].
|
||||
Most users should use the [[providers-getDefaultProvider]].
|
||||
|
||||
|
||||
_subsection: Default Provider @<get-default-provider>
|
||||
_subsection: Default Provider @<providers-getDefaultProvider>
|
||||
|
||||
The default provider is the safest, easiest way to begin
|
||||
developing on //Ethereum//, and it is also robust enough
|
||||
for use in production.
|
||||
|
||||
It creates a [[provider-fallback]] connected to as many backend
|
||||
It creates a [[FallbackProvider]] connected to as many backend
|
||||
services as possible. When a request is made, it is sent to
|
||||
multiple backends simulatenously. As responses from each backend
|
||||
multiple backends simultaneously. As responses from each backend
|
||||
are returned, they are checked that they agree. Once a quorum
|
||||
has been reached (i.e. enough of the backends agree), the response
|
||||
is provided to your application.
|
||||
@@ -29,11 +29,73 @@ This ensures that if a backend has become out-of-sync, or if it
|
||||
has been compromised that its responses are dropped in favor of
|
||||
responses that match the majority.
|
||||
|
||||
_property: ethers.getDefaultProvider([ network ]) => [[provider]]
|
||||
_property: ethers.getDefaultProvider([ network, [ options ] ]) => [[Provider]]
|
||||
Returns a new Provider, backed by multiple services, connected
|
||||
to //network//. Is no //network// is provided, **homestead**
|
||||
to //network//. If no //network// is provided, **homestead**
|
||||
(i.e. mainnet) is used.
|
||||
|
||||
The //network// may also be a URL to connect to, such as ``http:/\/localhost:8545``
|
||||
or ``wss:/\/example.com``.
|
||||
|
||||
The //options// is an object, with the following properties:
|
||||
|
||||
_table: Option Properties
|
||||
|
||||
$Alchemy: [[link-alchemy]] API Token
|
||||
$Etherscan: [[link-etherscan]] API Token
|
||||
$Infura: [[link-infura]] Project ID or ``{ projectId, projectSecret }``
|
||||
$Pocket: [[link-pocket]] Application ID or ``{ applicationId, applicationSecretKey }``
|
||||
$Quorum: The number of backends that must agree
|
||||
//(default: 2 for mainnet, 1 for testnets)//
|
||||
|
||||
| **Property** | **Description** |
|
||||
| //alchemy// | $Alchemy |
|
||||
| //etherscan// | $Etherscan |
|
||||
| //infura// | $Infura |
|
||||
| //pocket// | $Pocket |
|
||||
| //quorum// | $Quorum |
|
||||
|
||||
_note: Note: API Keys
|
||||
|
||||
It is highly recommended for production services to acquire
|
||||
and specify an API Key for each service.
|
||||
|
||||
The default API Keys used by ethers are shared across all users,
|
||||
so services may throttle all services that are using the default
|
||||
API Keys during periods of load without realizing it.
|
||||
|
||||
Many services also have monitoring and usage metrics, which are
|
||||
only available if an API Key is specified. This allows tracking
|
||||
how many requests are being sent and which methods are being
|
||||
used the most.
|
||||
|
||||
Some services also provide additional paid features, which are only
|
||||
available when specifying an API Key.
|
||||
|
||||
_subsection: Networks
|
||||
|
||||
There are several official common Ethereum networks as well as custom
|
||||
networks and other compatible projects.
|
||||
|
||||
Any API that accept a [[providers-Networkish]] can be passed a common name (such as
|
||||
``"mainnet"`` or ``"ropsten"``) to use that network definition or may specify
|
||||
custom parameters.
|
||||
|
||||
_heading: Custom ENS Contract
|
||||
|
||||
One common reason to specify custom properties for a [[providers-Network]] is to override
|
||||
the address of the root ENS registry, either on a common network to intercept
|
||||
the [ENS Methods](Provider--ens-methods) or to specify the ENS registry on a
|
||||
dev network (on most dev networks you must deploy the ENS contracts manually).
|
||||
|
||||
_code: Example: Override the ENS registry @lang<script>
|
||||
|
||||
const network = {
|
||||
name: "dev",
|
||||
chianId: 1337,
|
||||
ensAddress: customEnsAddress
|
||||
};
|
||||
|
||||
_subsection: Provider Documentation
|
||||
|
||||
_toc:
|
||||
|
||||
@@ -1,73 +1,94 @@
|
||||
_section: JsonRpcProvider @<provider-jsonrpc> @INHERIT<[[provider]]>
|
||||
_section: JsonRpcProvider @<JsonRpcProvider> @INHERIT<[[Provider]]> @SRC<providers:class.JsonRpcProvider>
|
||||
|
||||
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))
|
||||
The [JSON-RPC API](link-jsonrpc) is a popular method for interacting
|
||||
with Ethereum and is available in all major Ethereum node implementations
|
||||
(e.g. [[link-geth]] and [[link-parity]]) as well as many
|
||||
third-party web services (e.g. [[link-infura]])
|
||||
|
||||
_property: new ethers.providers.JsonRpcProvider([ url [ , aNetworkish ] ])
|
||||
Connect to a JSON-RPC API located at //url// using the //aNetworkish// network.
|
||||
If //url// is not specified, the default (i.e. ``http:/\/localhost:8545``) is used
|
||||
and if no network is specified, it will be determined automatically by
|
||||
querying the node.
|
||||
_property: new ethers.providers.JsonRpcProvider([ urlOrConnectionInfo [ , networkish ] ]) @SRC<providers:constructor.JsonRpcProvider>
|
||||
Connect to a JSON-RPC HTTP API using the URL or [[ConnectionInfo]] //urlOrConnectionInfo//
|
||||
connected to the //networkish// network.
|
||||
|
||||
If //urlOrConnectionInfo// 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 using ``eth_chaindId`` and falling back on ``eth_networkId``.
|
||||
|
||||
_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.
|
||||
Each node implementation is slightly different and may require specific
|
||||
command-line flags, configuration or settings in their UI to enable
|
||||
JSON-RPC, unlock accounts or expose specific APIs. Please consult
|
||||
their documentation.
|
||||
|
||||
_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
|
||||
_property: jsonRpcProvider.getSigner([ addressOrIndex ]) => [[JsonRpcSigner]] @<JsonRpcProvider-getSigner> @SRC<providers/json-rpc-provider>
|
||||
Returns a [[JsonRpcSigner]] which is managed by this Ethereum node, at
|
||||
//addressOrIndex//. If no //addressOrIndex// is provided, the first
|
||||
account (account #0) is used.
|
||||
|
||||
_property: jsonRpcProvider.getUncheckedSigner([ addressOrIndex ]) => [[provider-jsonrpc-uncheckedsigner]] @<provider-jsonrpc-getuncheckedsigner> @SRC<providers/json-rpc-provider>
|
||||
_property: jsonRpcProvider.getUncheckedSigner([ addressOrIndex ]) => [[UncheckedJsonRpcSigner]] @<JsonRpcProvider-getUncheckedSigner> @SRC<providers/json-rpc-provider>
|
||||
|
||||
_property: jsonRpcProvider.listAccounts() => Array<string> @<provider-jsonrpc-listaccounts> @SRC<providers/json-rpc-provider>
|
||||
_property: jsonRpcProvider.listAccounts() => Array<string> @<JsonRpcProvider-listAccounts> @SRC<providers/json-rpc-provider>
|
||||
Returns a list of all account addresses managed by this provider.
|
||||
|
||||
_property: jsonRpcProvider.send(method, params) => Promise<any> @<provider-jsonrpc-send> @SRC<providers/json-rpc-provider>
|
||||
_property: jsonRpcProvider.send(method, params) => Promise<any> @<JsonRpcProvider-send> @SRC<providers/json-rpc-provider>
|
||||
Allows sending raw messages to the provider.
|
||||
|
||||
This can be used for backend-specific calls, such as for debugging or
|
||||
specific account management.
|
||||
|
||||
|
||||
_subsection: JsonRpcSigner @<signer-jsonrpc> @INHERIT<[[signer]]>
|
||||
_subsection: JsonRpcSigner @<JsonRpcSigner> @INHERIT<[[Signer]]> @SRC<providers:class.JsonRpcSigner>
|
||||
A **JsonRpcSigner** is a simple Signer which is backed by a connected
|
||||
[[provider-jsonrpc]].
|
||||
[[JsonRpcProvider]].
|
||||
|
||||
_property: signer.provider => [[provider-jsonrpc]]
|
||||
_property: signer.provider => [[JsonRpcProvider]]
|
||||
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.connectUnchecked() => [[UncheckedJsonRpcSigner]] @<JsonRpcSigner-connectUnchecked> @SRC<providers>
|
||||
Returns a new Signer object which does not perform additional checks when
|
||||
sending a transaction. See [getUncheckedSigner](JsonRpcProvider-getUncheckedSigner) for more details.
|
||||
|
||||
_property: signer.sendUncheckedTransaction(transaction) => Promise<string<[[datahexstring]]<32>>>
|
||||
_property: signer.sendUncheckedTransaction(transaction) => Promise<string<[[DataHexString]]\<32>\>> @<JsonRpcSigner-sendUncheckedTransaction> @SRC<providers>
|
||||
Sends the //transaction// and returns a Promise which resolves to the
|
||||
opacque transaction hash.
|
||||
opaque transaction hash.
|
||||
|
||||
_property: signer.unlock(password) => Promise<boolean>
|
||||
_property: signer.unlock(password) => Promise<boolean> @<JsonRpcSigner-unlock> @SRC<providers>
|
||||
Request the node unlock the account (if locked) using //password//.
|
||||
|
||||
|
||||
_subsection: JsonRpcUncheckedSigner @<provider-jsonrpc-uncheckedsigner> @INHERIT<[[signer]]>
|
||||
_subsection: JsonRpcUncheckedSigner @<UncheckedJsonRpcSigner> @INHERIT<[[Signer]]> @SRC<providers:class.UncheckedJsonRpcSigner>
|
||||
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]]
|
||||
To remedy this, the [[JsonRpcSigner]] immediately queries the provider for
|
||||
the details using the returned transaction hash to populate the [[providers-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
|
||||
immediately return the result as a mock [[providers-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.
|
||||
|
||||
|
||||
_subsection: Node-Specific Methods @<JsonRpcProvider--other>
|
||||
|
||||
Many methods are less common or specific to certain Ethereum Node implementations
|
||||
(e.g. [Parity](link-parity) vs [Geth](link-geth). These include account and admin management,
|
||||
debugging, deeper block and transaction exploration and other services (such as
|
||||
Swarm and Whisper).
|
||||
|
||||
The [jsonRpcProvider.send](JsonRpcProvider-send) method can be used to access these.
|
||||
|
||||
- [All JSON-RPC methods](link-json-rpc) (including the less common methods) which most
|
||||
Ethereum Nodes support.
|
||||
- [Parity's Trace Module](link-parity-trace) can be used to trace and debug EVM
|
||||
execution of a transaction (requires custom configuration)
|
||||
- [Geth's Debug Module](link-geth-debug) can be used to debug transactions and
|
||||
internal cache state, etc.
|
||||
- [Additional Geth Methods](link-geth-rpc)
|
||||
- [Additional Parity Methods](link-parity-rpc)
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
_section: Other Providers
|
||||
|
||||
Others...
|
||||
_subsection: FallbackProvider @<FallbackProvider> @INHERIT<[[Provider]]> @SRC<providers/fallback-provider:class.FallbackProvider>
|
||||
|
||||
_subsection: FallbackProvider @<provider-fallback> @INHERIT<[[provider]]> @SRC<providers/fallback-provider:class.FallbackProvider>
|
||||
|
||||
The **FallbackProvider** is the most advanced [[provider]] available in
|
||||
The **FallbackProvider** is the most advanced [[Provider]] available in
|
||||
ethers.
|
||||
|
||||
It uses a quorum and connects to multiple [Providers](provider) as backends,
|
||||
It uses a quorum and connects to multiple [Providers](Provider) as backends,
|
||||
each configured with a //priority// and a //weight// .
|
||||
|
||||
When a request is made, the request is dispatched to multiple backends, randomly
|
||||
choosen (higher prioirty backends are always selected first) and the results from
|
||||
chosen (lower-value priority 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.
|
||||
|
||||
@@ -23,10 +21,10 @@ 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.
|
||||
The //providers// can be either an array of [[Provider]] or [[FallbackProviderConfig]].
|
||||
If a [[Provider]] is provided, the defaults are a priority of 1 and a weight of 1.
|
||||
|
||||
_property: provider.providerConfigs => Array<[[provider-fallback-config]]>
|
||||
_property: provider.providerConfigs => Array<[[FallbackProviderConfig]]>
|
||||
The list of Provider Configurations that describe the backends.
|
||||
|
||||
_property: provider.quorum => number
|
||||
@@ -34,18 +32,18 @@ The quorum the backend responses must agree upon before a result will be
|
||||
resolved. By default this is //half the sum of the weights//.
|
||||
|
||||
|
||||
_heading: FallbackProviderConfig @<provider-fallback-config>
|
||||
_heading: FallbackProviderConfig @<FallbackProviderConfig>
|
||||
|
||||
_property: fallbackProviderConfig.provider => [[provider]]
|
||||
_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.
|
||||
The priority used for the provider. Lower-value priorities are favoured over
|
||||
higher-value priorities. If multiple providers share the same priority, they
|
||||
are chosen at random.
|
||||
|
||||
_property: fallbackProviderConfig.stallTimeout => number
|
||||
The timeout (in ms) after which another [[provider]] will be attempted. This
|
||||
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.
|
||||
|
||||
@@ -54,10 +52,10 @@ 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.
|
||||
[[Provider]] is more trusted, for example.
|
||||
|
||||
|
||||
_subsection: IpcProvider @<provider-ipc> @INHERIT<[[provider-jsonrpc]]> @SRC<providers:class.IpcProvider>
|
||||
_subsection: IpcProvider @<IpcProvider> @INHERIT<[[JsonRpcProvider]]> @SRC<providers:class.IpcProvider>
|
||||
|
||||
The **IpcProvider** allows the JSON-RPC API to be used over a local
|
||||
filename on the file system, exposed by Geth, Parity and other nodes.
|
||||
@@ -67,13 +65,13 @@ and may have additional complications due to file permissions. See any
|
||||
related notes on the documentation for the actual node implementation websites.
|
||||
|
||||
_property: ipcProvider.path => string
|
||||
The path this [[provider]] is connected to.
|
||||
The path this [[Provider]] is connected to.
|
||||
|
||||
|
||||
_subsection: UrlJsonRpcProvider @<provider-urljsonrpc> @INHERIT<[[provider-jsonrpc]]> @SRC<providers:class.UrlJsonRpcProvider>
|
||||
_subsection: UrlJsonRpcProvider @<UrlJsonRpcProvider> @INHERIT<[[JsonRpcProvider]]> @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]]
|
||||
simplifies creating a [[Provider]] where a normal [[JsonRpcProvider]]
|
||||
would suffice, with a little extra effort needed to generate the JSON-RPC
|
||||
URL.
|
||||
|
||||
@@ -93,18 +91,71 @@ The URL to use for the JsonRpcProvider instance.
|
||||
|
||||
|
||||
|
||||
_subsection: Web3Provider @<provider-web3> @INHERIT<[[provider-jsonrpc]]>
|
||||
_subsection: Web3Provider @<Web3Provider> @INHERIT<[[JsonRpcProvider]]> @SRC<providers:class.Web3Provider>
|
||||
|
||||
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]]
|
||||
application to ethers by wrapping 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
|
||||
This may also be used to wrap a standard [EIP-1193 Provider](link-eip-1193].
|
||||
|
||||
_property: new ethers.providers.Web3Provider(externalProvider [, network ])
|
||||
Create a new **Web3Provider**, which wraps an [EIP-1193 Provider](link-eip-1193) or
|
||||
Web3Provider-compatible Provider.
|
||||
|
||||
_property: web3Provider.provider => Web3CompatibleProvider
|
||||
The provider used to create this instance.
|
||||
|
||||
_heading: ExternalProvider @<Web3Provider--ExternalProvider>
|
||||
|
||||
An **ExternalProvider** can be either one for the above mentioned Web3
|
||||
Providers (or otherwise compatible) or an [[link-eip-1193]] provider.
|
||||
|
||||
An ExternalProvider must offer one of the following signatures, and the
|
||||
first matching is used:
|
||||
|
||||
_property: externalProvider.request(request) => Promise<any>
|
||||
|
||||
This follows the [[link-eip-1193]] API signature.
|
||||
|
||||
The //request// should be a standard JSON-RPC payload, which should at
|
||||
a minimum specify the ``method`` and ``params``.
|
||||
|
||||
The result should be the actual result, which differs from the Web3.js
|
||||
response, which is a wrapped JSON-RPC response.
|
||||
|
||||
_property: externalProvider.sendAsync(request, callback) => void
|
||||
|
||||
This follows the [Web3.js Provider Signature](link-web3-send).
|
||||
|
||||
The //request// should be a standard JSON-RPC payload, which should at
|
||||
a minimum specify the ``method`` and ``params``.
|
||||
|
||||
The //callback// should use the error-first calling semantics, so
|
||||
``(error, result)`` where the result is a JSON-RPC wrapped result.
|
||||
|
||||
_property: externalProvider.send(request, callback) => void
|
||||
|
||||
This is identical to ``sendAsync``. Historically, this used a synchronous
|
||||
web request, but no current browsers support this, so its use this way
|
||||
was deprecated quite a long time ago
|
||||
|
||||
|
||||
_subsection: WebSocketProvider @<WebSocketProvider> @INHERIT<[[JsonRpcProvider]]> @SRC<providers:class.WebSocketProvider>
|
||||
|
||||
The **WebSocketProvider** connects to a JSON-RPC WebSocket-compatible backend
|
||||
which allows for a persistent connection, multiplexing requests and pub-sub
|
||||
events for a more immediate event dispatching.
|
||||
|
||||
The WebSocket API is newer, and if running your own infrastructure, note that
|
||||
WebSockets are much more intensive on your server resources, as they must manage
|
||||
and maintain the state for each client. For this reason, many services may also
|
||||
charge additional fees for using their WebSocket endpoints.
|
||||
|
||||
_property: new ethers.providers.WebSocketProvider([ url [ , network ] ])
|
||||
Returns a new [[WebSocketProvider]] connected to //url// as the //network//.
|
||||
|
||||
If //url// is unspecified, the default ``"ws:/\/localhost:8546"`` will be used.
|
||||
If //network// is unspecified, it will be queried from the network.
|
||||
|
||||
@@ -1,32 +1,39 @@
|
||||
_section: Provider @<provider>
|
||||
_section: Provider @<Provider>
|
||||
|
||||
Explain what a provider is...
|
||||
A **Provider** in ethers is a read-only abstraction to
|
||||
access the blockchain data.
|
||||
|
||||
_note: Coming from Web3.js?
|
||||
If you are coming from Web3.js, this is one of the biggest
|
||||
differences you will encounter using ethers.
|
||||
|
||||
_subsection: Accounts Methods
|
||||
The ethers library creates a strong division between the
|
||||
operation a **Provider** can perform and those of a [[Signer]],
|
||||
which Web3.js lumps together.
|
||||
|
||||
_property: provider.getBalance(address [ , blockTag = latest ]) => Promise<[[bignumber]]> @<provider-getbalance> @SRC<providers/base-provider>
|
||||
This separation of concerns and a stricted subset of Provider
|
||||
operations allows for a larger variety of backends, a more
|
||||
consistent API and ensures other libraries to operate without
|
||||
being able to rely on any underlying assumption.
|
||||
|
||||
_subsection: Accounts Methods @<Provider--account-methods>
|
||||
|
||||
_property: provider.getBalance(address [ , blockTag = latest ]) => Promise<[[BigNumber]]> @<Provider-getBalance> @SRC<providers/base-provider>
|
||||
Returns the balance of //address// as of the //blockTag// block height.
|
||||
|
||||
_property: provider.getCode(address [ , blockTag = latest ]) => Promise<string<[[datahexstring]]>> @<providers-getcode> @SRC<providers/base-provider>
|
||||
_property: provider.getCode(address [ , blockTag = latest ]) => Promise<string<[[DataHexString]]>> @<Provider-getCode> @SRC<providers/base-provider>
|
||||
Returns the contract code of //address// as of the //blockTag// block height. If there is
|
||||
no contract currently deployed, the result is ``0x``.
|
||||
|
||||
_property: provider.getStorageAt(addr, pos [ , blockTag = latest ]) => Promise<string<[[datahexstring]]>> @<providers-getstorageat> @SRC<providers/base-provider>
|
||||
_property: provider.getStorageAt(addr, pos [ , blockTag = latest ]) => Promise<string<[[DataHexString]]>> @<Provider-getStorageAt> @SRC<providers/base-provider>
|
||||
Returns the ``Bytes32`` value of the position //pos// at address //addr//, as of the //blockTag//.
|
||||
|
||||
_property: provider.getTransactionCount(address [ , blockTag = latest ]) => Promise<number> @<providers-gettransactioncount> @SRC<providers/base-provider>
|
||||
_property: provider.getTransactionCount(address [ , blockTag = latest ]) => Promise<number> @<Provider-getTransactionCount> @SRC<providers/base-provider>
|
||||
Returns the number of transactions //address// has ever **sent**, as of //blockTag//.
|
||||
This value is required to be the nonce for the next transaction from //address//
|
||||
sent to the network.
|
||||
|
||||
_heading: Examples
|
||||
|
||||
_code: @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const provider = ethers.getDefaultProvider()
|
||||
// </hide>
|
||||
_code: Account Examples @lang<javascript>
|
||||
|
||||
// Get the balance for an account...
|
||||
provider.getBalance("ricmoo.firefly.eth");
|
||||
@@ -45,38 +52,55 @@ provider.getTransactionCount("ricmoo.firefly.eth");
|
||||
//!
|
||||
|
||||
|
||||
_subsection: Blocks Methods
|
||||
_subsection: Blocks Methods @<Provider--block-methods>
|
||||
|
||||
_property: provider.getBlock(block) => Promise<[[provider-block]]> @<providers-getblock> @SRC<providers/base-provider>
|
||||
_property: provider.getBlock(block) => Promise<[[providers-Block]]> @<Provider-getBlock> @SRC<providers/base-provider>
|
||||
Get the //block// from the network, where the ``result.transactions`` is a list
|
||||
of transaction hashes.
|
||||
|
||||
_property: provider.getBlockWithTransactions(block) => Promise<[[provider-blocktxs]]> @<providers-getblockwithtransactions> @SRC<providers/base-provider>
|
||||
_property: provider.getBlockWithTransactions(block) => Promise<[[providers-BlockWithTransactions]]> @<Provider-getBlockWithTransactions> @SRC<providers/base-provider>
|
||||
Get the //block// from the network, where the ``result.transactions`` is
|
||||
an Array of [[provider-transactionresponse]] objects.
|
||||
an Array of [[providers-TransactionResponse]] objects.
|
||||
|
||||
_code: Block Examples @lang<javascript>
|
||||
|
||||
_subsection: Ethereum Naming Service (ENS) Methods
|
||||
provider.getBlock(100004)
|
||||
//!
|
||||
|
||||
TODO: Explain ENS here...
|
||||
provider.getBlockWithTransactions(100004)
|
||||
//!
|
||||
|
||||
_property: provider.lookupAddress(address) => Promise<string> @<providers-lookupaddress> @SRC<providers/base-provider>
|
||||
_subsection: Ethereum Naming Service (ENS) Methods @<Provider--ens-methods>
|
||||
|
||||
The [Ethereum Naming Service](link-ens) (ENS) allows a short and
|
||||
easy-to-remember ENS Name to be attached to any set of keys
|
||||
and values.
|
||||
|
||||
One of the most common uses for this is to use a simple name to
|
||||
refer to an [Ethereum Address](address).
|
||||
|
||||
In the ethers API, nearly anywhere that accepts an address, an
|
||||
ENS name may be used instead, which can simplify code and make
|
||||
reading and debugging much simpler.
|
||||
|
||||
The provider offers some basic operations to help resolve and
|
||||
work with ENS names.
|
||||
|
||||
_property: provider.getResolver(name) => Promise<[[EnsResolver]]>
|
||||
Returns an EnsResolver instance which can be used to further inquire
|
||||
about specific entries for an ENS name.
|
||||
|
||||
_property: provider.lookupAddress(address) => Promise<string> @<Provider-lookupAddress> @SRC<providers/base-provider>
|
||||
Performs a reverse lookup of the //address// in ENS using the
|
||||
//Reverse Registrar//. If the name does not exist, or the
|
||||
forward lookup does not match, ``null`` is returned.
|
||||
|
||||
_property: provider.resolveName(name) => Promise<string<[Address](address)>> @<providers-resolvename> @SRC<providers/base-provider>
|
||||
_property: provider.resolveName(name) => Promise<string<[Address](address)>> @<Provider-ResolveName> @SRC<providers/base-provider>
|
||||
Looks up the address of //name//. If the name is not owned, or
|
||||
does not have a //Resolver// configured, or the //Resolver// does
|
||||
not have an address configured, ``null`` is returned.
|
||||
|
||||
_heading: Examples
|
||||
|
||||
_code: @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const provider = ethers.getDefaultProvider()
|
||||
// </hide>
|
||||
_code: ENS Examples @lang<javascript>
|
||||
|
||||
// Reverse lookup of an ENS by address...
|
||||
provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c");
|
||||
@@ -87,36 +111,87 @@ provider.resolveName("ricmoo.firefly.eth");
|
||||
//!
|
||||
|
||||
|
||||
_subsection: Logs Methods
|
||||
_subsection: EnsResolver @<EnsResolver>
|
||||
|
||||
_property: provider.getLogs(filter) => Promise<Array<[[provider-log]]>> @<providers-getlogs> @SRC<providers/base-provider>
|
||||
Returns the Array of [[provider-log]] matching the //filter//.
|
||||
_property: resolver.name => string
|
||||
The name of this resolver.
|
||||
|
||||
_property: resolver.address => string<[[address]]>
|
||||
The address of the Resolver.
|
||||
|
||||
_property: resolver.getAddress([ cointType = 60 ]) => Promise<string>
|
||||
Returns a Promise which resolves to the [[link-eip-2304]] multicoin address
|
||||
stored for the //coinType//. By default an Ethereum [[address]]
|
||||
(``coinType = 60``) will be returned.
|
||||
|
||||
_property: resolver.getContentHash() => Promise<string>
|
||||
Returns a Promise which resolves to any stored [[link-eip-1577]] content hash.
|
||||
|
||||
_property: resolver.getText(key) => Promise<string>
|
||||
Returns a Promise which resolves to any stored [[link-eip-634]] text entry for //key//.
|
||||
|
||||
_subsection: Logs Methods @<Provider--log-methods>
|
||||
|
||||
_property: provider.getLogs(filter) => Promise<Array<[[providers-Log]]>> @<Provider-getLogs> @SRC<providers/base-provider>
|
||||
Returns the Array of [[providers-Log]] matching the //filter//.
|
||||
|
||||
Keep in mind that many backends will discard old events, and that requests
|
||||
which are too broad may get dropped as they require too many resources to
|
||||
execute the query.
|
||||
|
||||
|
||||
_subsection: Network Status Methods
|
||||
_subsection: Network Status Methods @<Provider--network-methods>
|
||||
|
||||
_property: provider.getNetwork() => Promise<[[provider-network]]> @<providers-getnetwork> @SRC<providers/base-provider:method.BaseProvider.getNetwork>
|
||||
Returns the [[provider-network]] this Provider is connected to.
|
||||
_property: provider.getNetwork() => Promise<[[providers-Network]]> @<Provider-getNetwork> @SRC<providers/base-provider:method.BaseProvider.getNetwork>
|
||||
Returns the [[providers-Network]] this Provider is connected to.
|
||||
|
||||
_property: provider.getBlockNumber() => Promise<number> @<providers-getblocknumber> @SRC<providers/base-provider>
|
||||
_property: provider.getBlockNumber() => Promise<number> @<Provider-getBlockNumber> @SRC<providers/base-provider>
|
||||
Returns the block number (or height) of the most recently mined block.
|
||||
|
||||
_property: provider.getGasPrice() => Promise<[[bignumber]]> @<providers-getgasprice> @SRC<providers/base-provider>
|
||||
_property: provider.getGasPrice() => Promise<[[BigNumber]]> @<Provider-getGasPrice> @SRC<providers/base-provider>
|
||||
Returns a //best guess// of the [[gas-price]] to use in a transaction.
|
||||
|
||||
_property: provider.ready => Promise<[[providers-Network]]> @<Provider-ready> @src<providers/base-provider>
|
||||
Returns a Promise which will stall until the network has heen established,
|
||||
ignoring errors due to the target node not being active yet.
|
||||
|
||||
_subsection: Transactions Methods
|
||||
This can be used for testing or attaching scripts to wait until the node is
|
||||
up and running smoothly.
|
||||
|
||||
_property: provider.call(transaction [ , blockTag = latest ]) => Promise<string<[[datahexstring]]>> @<providers-call> @SRC<providers/base-provider>
|
||||
_code: Network Status Examples @lang<javascript>
|
||||
|
||||
// The network information
|
||||
provider.getNetwork()
|
||||
// <hide>
|
||||
//!
|
||||
network = utils.shallowCopy(_)
|
||||
delete network._defaultProvider
|
||||
network
|
||||
// </hide>
|
||||
//!
|
||||
|
||||
// The current block number
|
||||
provider.getBlockNumber()
|
||||
//!
|
||||
|
||||
// Get the current suggested gas price (in wei)...
|
||||
gasPrice = await provider.getGasPrice()
|
||||
//! async gasPrice
|
||||
|
||||
// ...often this gas price is easier to understand or
|
||||
// display to the user in gwei (giga-wei, or 1e9 wei)
|
||||
utils.formatUnits(gasPrice, "gwei")
|
||||
//!
|
||||
|
||||
|
||||
_subsection: Transactions Methods @<Provider--transaction-methods>
|
||||
|
||||
_property: provider.call(transaction [ , blockTag = latest ]) => Promise<string<[[DataHexString]]>> @<Provider-call> @SRC<providers/base-provider>
|
||||
Returns the result of executing the //transaction//, using //call//. A call
|
||||
does not require any ether, but cannot change any state. This is useful
|
||||
for calling gettings on Contracts.
|
||||
for calling getters on Contracts.
|
||||
|
||||
_property: provider.estimateGas(transaction) => Promise<[[bignumber]]> @<providers-estimategas> @SRC<providers/base-provider>
|
||||
_property: provider.estimateGas(transaction) => Promise<[[BigNumber]]> @<Provider-estimateGas> @SRC<providers/base-provider>
|
||||
Returns an estimate of the amount of gas that would be required to submit //transaction//
|
||||
to the network.
|
||||
|
||||
@@ -124,48 +199,199 @@ An estimate may not be accurate since there could be another transaction
|
||||
on the network that was not accounted for, but after being mined affected
|
||||
relevant state.
|
||||
|
||||
_property: provider.sendTransaction(transaction) => Promise<[[provider-transactionresponse]]> @<providers-sendtransaction> @SRC<providers/base-provider>
|
||||
_property: provider.getTransaction(hash) => Promise<[[providers-TransactionResponse]]> @<Provider-getTransaction> @src<providers/base-provider>
|
||||
Returns the transaction with //hash// or null if the transaction is unknown.
|
||||
|
||||
If a transaction has not been mined, this method will search the transaction
|
||||
pool. Various backends may have more restrictive transaction pool access (e.g.
|
||||
if the gas price is too low or the transaction was only recently sent and not
|
||||
yet indexed) in which case this method may also return null.
|
||||
|
||||
_property: provider.getTransactionReceipt(hash) => Promise<[[providers-TransactionReceipt]]> @<Provider-getTransactionReceipt> @src<providers/base-provider>
|
||||
Returns the transaction receipt for //hash// or null if the transaction
|
||||
has not been mined.
|
||||
|
||||
To stall until the transaction has been mined, consider the ``waitForTransaction``
|
||||
method below.
|
||||
|
||||
_property: provider.sendTransaction(transaction) => Promise<[[providers-TransactionResponse]]> @<Provider-sendTransaction> @SRC<providers/base-provider>
|
||||
Submits //transaction// to the network to be mined. The //transaction// **must** be signed,
|
||||
and be valid (i.e. the nonce is correct and the account has sufficient balance to pay
|
||||
for the transaction).
|
||||
|
||||
_property: provider.waitForTransaction(hash [ , confirms = 1 [ , timeout ] ]) => Promise<[TxReceipt](provider-receipt)> @<providers-waitfortransaction> @SRC<providers/base-provider>
|
||||
_property: provider.waitForTransaction(hash [ , confirms = 1 [ , timeout ] ]) => Promise<[TxReceipt](providers-TransactionReceipt)> @<Provider-waitForTransaction> @SRC<providers/base-provider>
|
||||
Returns a Promise which will not resolve until //transactionHash// is mined.
|
||||
|
||||
If //confirms// is 0, this method is non-blocking and if the
|
||||
transaction has not been mined returns null. Otherwise,
|
||||
this method will block until the transaction has //confirms//
|
||||
blocks mined on top of the block in which is was mined.
|
||||
|
||||
_subsection: Event Emitter Methods
|
||||
_subsection: Event Emitter Methods @<Provider--event-methods>
|
||||
|
||||
Explain events here...
|
||||
The EventEmitter API allows applications to use an
|
||||
[[link-wiki-observer-pattern]] to register callbacks for when
|
||||
various events occur.
|
||||
|
||||
_property: provider.on(eventName, listener) => this @<providers-on> @SRC<providers/base-provider>
|
||||
Add a //listener// to be triggered for each //eventName//.
|
||||
This closely follows the Event Emitter provided by other JavaScript
|
||||
libraries with the exception that event names support some more
|
||||
[complex objects](Provider--events), not only strings. The objects
|
||||
are normalized internally.
|
||||
|
||||
_property: provider.once(eventName, listener) => this @<providers-once> @SRC<providers/base-provider>
|
||||
Add a //listener// to be triggered for only the next //eventName//,
|
||||
at which time it be removed.
|
||||
_property: provider.on(eventName, listener) => this @<Provider-on> @SRC<providers/base-provider>
|
||||
Add a //listener// to be triggered for each //eventName// [event](Provider--events).
|
||||
|
||||
_property: provider.emit(eventName, ...args) => boolean @<providers-emit> @SRC<providers/base-provider>
|
||||
Notify all listeners of //eventName//, passing //args// to each listener. This
|
||||
is generally only used internally.
|
||||
_property: provider.once(eventName, listener) => this @<Provider-once> @SRC<providers/base-provider>
|
||||
Add a //listener// to be triggered for only the next
|
||||
//eventName// [event](Provider--events), at which time it will be removed.
|
||||
|
||||
_property: provider.off(eventName [ , listener ]) => this @<providers-off> @SRC<providers/base-provider>
|
||||
Remove a //listener// for //eventName//. If no //listener// is provided,
|
||||
all listeners for //eventName// are removed.
|
||||
_property: provider.emit(eventName, ...args) => boolean @<Provider-emit> @SRC<providers/base-provider>
|
||||
Notify all listeners of the //eventName// [event](Provider--events),
|
||||
passing //args// to each listener. This is generally only used internally.
|
||||
|
||||
_property: provider.removeAllListeners([ eventName ]) => this @<providers-removealllisteners> @SRC<providers/base-provider>
|
||||
Remove all the listeners for //eventName//. If no //eventName// is provided,
|
||||
**all** events are removed.
|
||||
_property: provider.off(eventName [ , listener ]) => this @<Provider-off> @SRC<providers/base-provider>
|
||||
Remove a //listener// for the //eventName// [event](Provider--events).
|
||||
If no //listener// is provided, all listeners for //eventName// are removed.
|
||||
|
||||
_property: provider.listenerCount([ eventName ]) => number @<providers-listenercount> @SRC<providers/base-provider>
|
||||
Returns the number of listeners for //eventName//. If no //eventName// is
|
||||
provided, the total number of listeners is returned.
|
||||
_property: provider.removeAllListeners([ eventName ]) => this @<Provider-removeAllListeners> @SRC<providers/base-provider>
|
||||
Remove all the listeners for the //eventName// [events](Provider--events).
|
||||
If no //eventName// is provided, **all** events are removed.
|
||||
|
||||
_property: provider.listeners(eventName) => Array<Listener> @<providers-listeners> @SRC<providers/base-provider>
|
||||
Returns the list of Listeners for //eventName//.
|
||||
_property: provider.listenerCount([ eventName ]) => number @<Provider-listenerCount> @SRC<providers/base-provider>
|
||||
Returns the number of listeners for the //eventName// [events](Provider--events).
|
||||
If no //eventName// is provided, the total number of listeners is returned.
|
||||
|
||||
_property: provider.listeners(eventName) => Array<Listener> @<Provider-listeners> @SRC<providers/base-provider>
|
||||
Returns the list of Listeners for the //eventName// [events](Provider--events).
|
||||
|
||||
|
||||
_subsection: Inspection Methods
|
||||
_heading: Events @<Provider--events>
|
||||
|
||||
_property: Provider.isProvider(object) => boolean @<providers-isprovider> @SRC<abstract-provider>
|
||||
Any of the following may be used as the //eventName// in the above methods.
|
||||
|
||||
_definition: **Log Filter**
|
||||
|
||||
A filter is an object, representing a contract log Filter, which has the optional
|
||||
properties ``address`` (the source contract) and ``topics`` (a topic-set to match).
|
||||
|
||||
If ``address`` is unspecified, the filter matches any contract address.
|
||||
|
||||
See [EventFilters](providers-EventFilter) for more information on filtering events.
|
||||
|
||||
_definition: **Topic-Set Filter**
|
||||
|
||||
The value of a **Topic-Set Filter** is a array of Topic-Sets.
|
||||
|
||||
This event is identical to a //Log Filter// with the address omitted (i.e. from
|
||||
any contract).
|
||||
|
||||
See [EventFilters](providers-EventFilter) for more information on filtering events.
|
||||
|
||||
_definition: **Transaction Filter**
|
||||
|
||||
The value of a **Transaction Filter** is any transaction hash.
|
||||
|
||||
This event is emitted on every block that is part of a chain that
|
||||
includes the given mined transaction. It is much more common that the
|
||||
[once](Provider-once) method is used than the [on](Provider-on) method.
|
||||
|
||||
_null:
|
||||
|
||||
In addition to transaction and filter events, there are several named
|
||||
events.
|
||||
|
||||
_table: Named Provider Events @style<full>
|
||||
|
||||
$Block: emitted when a new block is mined
|
||||
$Error: emitted on any error
|
||||
$Pending: emitted when a new transaction enters the memory pool; only
|
||||
certain providers offer this event and may require
|
||||
running your own node for reliable results
|
||||
$WillPoll: emitted prior to a polling loop is about to begin;
|
||||
//(very rarely used by most developers)//
|
||||
$DidPoll: emitted after all events from a polling loop are emitted;
|
||||
//(very rarely used by most developers)//
|
||||
$Poll: emitted during each poll cycle after `blockNumber` is updated
|
||||
(if changed) and before any other events (if any) are emitted
|
||||
during the poll loop;
|
||||
//(very rarely used by most developers)//
|
||||
$Debug: each Provider may use this to emit useful debugging information
|
||||
and the format is up to the developer;
|
||||
//(very rarely used by most developers)//
|
||||
|
||||
| **Event Name** | **Arguments** <| **Description** <<<|
|
||||
| ``"block"`` | //blockNumber// <| $Block <<<|
|
||||
| ``"error"`` | //error// <| $Error <<<|
|
||||
| ``"pending"`` | //pendingTransaction// <| $Pending <<<|
|
||||
| ``"willPoll"`` | //pollId// <| $WillPoll <<<|
|
||||
| ``"poll"`` | //pollId//, //blockNumber// <| $Poll <<<|
|
||||
| ``"didPoll"`` | //pollId// <| $DidPoll <<<|
|
||||
| ``"debug"`` | provider dependent <| $Debug <<<|
|
||||
|
||||
|
||||
_code: Events Example @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const txHash = utils.id("dummy-data");
|
||||
const myAddress = ethers.constants.HashZero;
|
||||
const myOtherAddress = ethers.constants.HashZero;
|
||||
// </hide>
|
||||
|
||||
provider.on("block", (blockNumber) => {
|
||||
// Emitted on every block change
|
||||
})
|
||||
|
||||
|
||||
provider.once(txHash, (transaction) => {
|
||||
// Emitted when the transaction has been mined
|
||||
})
|
||||
|
||||
|
||||
// This filter could also be generated with the Contract or
|
||||
// Interface API. If address is not specified, any address
|
||||
// matches and if topics is not specified, any log matches
|
||||
filter = {
|
||||
address: "dai.tokens.ethers.eth",
|
||||
topics: [
|
||||
utils.id("Transfer(address,address,uint256)")
|
||||
]
|
||||
}
|
||||
provider.on(filter, (log, event) => {
|
||||
// Emitted whenever a DAI token transfer occurs
|
||||
})
|
||||
|
||||
|
||||
// Notice this is an array of topic-sets and is identical to
|
||||
// using a filter with no address (i.e. match any address)
|
||||
topicSets = [
|
||||
utils.id("Transfer(address,address,uint256)"),
|
||||
null,
|
||||
[
|
||||
myAddress,
|
||||
myOtherAddress
|
||||
]
|
||||
]
|
||||
provider.on(topicSets, (log, event) => {
|
||||
// Emitted any token is sent TO either address
|
||||
})
|
||||
|
||||
|
||||
provider.on("pending", (tx) => {
|
||||
// Emitted when any new pending transaction is noticed
|
||||
});
|
||||
|
||||
|
||||
provider.on("error", (tx) => {
|
||||
// Emitted when any error occurs
|
||||
});
|
||||
|
||||
// <hide>
|
||||
// Make sure our documentation builds without waiting forever
|
||||
provider.removeAllListeners()
|
||||
// </hide>
|
||||
|
||||
_subsection: Inspection Methods @<Provider--inspection-methods>
|
||||
|
||||
_property: Provider.isProvider(object) => boolean @<Provider-isProvider> @SRC<abstract-provider>
|
||||
Returns true if and only if //object// is a Provider.
|
||||
|
||||
|
||||
@@ -1,26 +1,27 @@
|
||||
_section: Types
|
||||
|
||||
_subsection: BlockTag @<provider-blocktag>
|
||||
A **BlockTag** specifies a specific location in the Blockchain.
|
||||
_subsection: BlockTag @<providers-BlockTag>
|
||||
A **BlockTag** specifies a specific block location in the Blockchain.
|
||||
|
||||
- **``"latest"``** -- The most recently mined block
|
||||
- **``"earliest"``** -- Block #0
|
||||
- **``"pending"``** -- The block currently being prepared for mining; not all
|
||||
- **``"latest"``** - The most recently mined block
|
||||
- **``"earliest"``** - Block #0
|
||||
- **``"pending"``** - The block currently being prepared for mining; not all
|
||||
operations and backends support this BlockTag
|
||||
- **//number//** -- The block at this height
|
||||
- **//a negative number//** -- The block this many blocks ago
|
||||
- **//number//** - The block at this height
|
||||
- **//a negative number//** - The block this many blocks ago
|
||||
- **//hex string//** - The block at this height (as a hexidecimal value)
|
||||
|
||||
_heading: EventType @<provider-eventtype>
|
||||
_subsection: Networkish @<providers-Networkish>
|
||||
A **Networkish** may be any of the following:
|
||||
|
||||
And **EventType** can be any of the following.
|
||||
- a [[providers-Network]] object
|
||||
- the name of a common network as a string (e.g. ``"homestead"``)
|
||||
- the chain ID a network as a number; if the chain ID is that of a
|
||||
common network, the ``name`` and ``ensAddress`` will be populated, otherwise,
|
||||
the default name ``"unknown"`` and no ``ensAddress`` is used
|
||||
|
||||
- **//string//** -- TODO...
|
||||
- **//Array<string<[[datahexstring]]<32>> | Array<string<[[datahexstring]]<32>>>>//** -- TODO...
|
||||
- **//[[provider-eventfilter]]//** -- TODO...
|
||||
|
||||
|
||||
_subsection: Network @<provider-network>
|
||||
A **Network** represents an Etherem network.
|
||||
_subsection: Network @<providers-Network>
|
||||
A **Network** represents an Ethereum network.
|
||||
|
||||
_property: network.name => string
|
||||
The human-readable name of the network, such as ``homestead``. If the network
|
||||
@@ -33,12 +34,12 @@ _property: network.ensAddress => string<[[address]]>
|
||||
The address at which the ENS registry is deployed on this network.
|
||||
|
||||
|
||||
_subsection: Block @<provider-block>
|
||||
_subsection: Block @<providers-Block>
|
||||
|
||||
_property: block.hash => string<[[datahexstring]]<32>>
|
||||
_property: block.hash => string<[[DataHexString]]<32>>
|
||||
The hash of this block.
|
||||
|
||||
_property: block.parentHash => string<[[datahexstring]]<32>>
|
||||
_property: block.parentHash => string<[[DataHexString]]<32>>
|
||||
The hash of the previous block.
|
||||
|
||||
_property: block.number => number
|
||||
@@ -47,24 +48,24 @@ The height (number) of this block.
|
||||
_property: block.timestamp => number
|
||||
The timestamp of this block.
|
||||
|
||||
_property: block.nonce => string<[[datahexstring]]>
|
||||
_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.
|
||||
This property is generally of little interest to 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.
|
||||
This property is generally of little interest to developers.
|
||||
|
||||
_property: block.gasLimit => [[bignumber]]
|
||||
_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.
|
||||
This property is generally of little interest to developers.
|
||||
|
||||
_property: block.gasUsed => [[bignumber]]
|
||||
_property: block.gasUsed => [[BigNumber]]
|
||||
The total amount of gas used by all transactions in this block.
|
||||
|
||||
_property: block.miner => string
|
||||
@@ -74,7 +75,7 @@ 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.
|
||||
This property is generally of little interest to developers.
|
||||
|
||||
_heading: Block (with transaction hashes)
|
||||
|
||||
@@ -82,51 +83,56 @@ 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>>>
|
||||
_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)>
|
||||
_heading: BlockWithTransactions @<providers-BlockWithTransactions> @INHERIT<[Block](providers-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]]>
|
||||
_property: block.transactions => Array<[[providers-TransactionResponse]]>
|
||||
A list of the transactions this block includes.
|
||||
|
||||
|
||||
_subsection: Events and Logs
|
||||
|
||||
_heading: EventFilter @<provider-eventfilter>
|
||||
_heading: EventFilter @<providers-EventFilter>
|
||||
|
||||
_property: filter.address => string<[[address]]>
|
||||
The address to filter by, or ``null`` to match any address.
|
||||
|
||||
_property: filter.topics => Array<string<[[datahexstring]]<32>> | Array<string<[[datahexstring]]<32>>>>
|
||||
The topics to filter by, or ``null`` to match any topics. Each entry represents an
|
||||
**AND** condition that must match, or may be ``null`` to match anything. If a given
|
||||
entry is an Array, then that entry is treated as an **OR** for any value in the entry.
|
||||
_property: filter.topics => Array<string<[Data](DataHexString)<32>> | Array<string<[Data](DataHexString)<32>>>>
|
||||
The topics to filter by or ``null`` to match any topics.
|
||||
|
||||
_heading: Filter @<provider-filter> @INHERIT<[[provider-eventfilter]]>
|
||||
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.
|
||||
|
||||
_property: filter.fromBlock => [[provider-blocktag]]
|
||||
See [Filters](events--filters) for more details and examples
|
||||
on specifying complex filters.
|
||||
|
||||
_heading: Filter @<providers-Filter> @INHERIT<[[providers-EventFilter]]>
|
||||
|
||||
_property: filter.fromBlock => [[providers-BlockTag]]
|
||||
The starting block (inclusive) to search for logs matching the filter criteria.
|
||||
|
||||
_property: filter.toBlock => [[provider-blocktag]]
|
||||
_property: filter.toBlock => [[providers-BlockTag]]
|
||||
The end block (inclusive) to search for logs matching the filter criteria.
|
||||
|
||||
_heading: FilterByBlockHash @<provider-filterbyblockhash> @INHERIT<[[provider-eventfilter]]>
|
||||
_heading: FilterByBlockHash @<providers-FilterByBlockHash> @INHERIT<[[providers-EventFilter]]>
|
||||
|
||||
_property: filter.blockHash => string<[[datahexstring]]<32>>
|
||||
_property: filter.blockHash => string<[[DataHexString]]<32>>
|
||||
The specific block (by its block hash) to search for logs matching the filter criteria.
|
||||
|
||||
|
||||
_heading: Log @<provider-log>
|
||||
_heading: Log @<providers-Log>
|
||||
|
||||
_property: log.blockNumber => number
|
||||
The block height (number) of the block including the transaction of this log.
|
||||
|
||||
_property: log.blockHash => string<[[datahexstring]]<32>>
|
||||
_property: log.blockHash => string<[[DataHexString]]<32>>
|
||||
The block hash of the block including the transaction of this log.
|
||||
|
||||
_property: log.removed => boolean
|
||||
@@ -141,13 +147,13 @@ 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]]>
|
||||
_property: log.data => string<[[DataHexString]]>
|
||||
The data included in this log.
|
||||
|
||||
_property: log.topics => Array<string<[[datahexstring]]<32> > >
|
||||
_property: log.topics => Array<string<[[DataHexString]]<32> > >
|
||||
The list of topics (indexed properties) for this log.
|
||||
|
||||
_property: log.transactionHash => string<[[datahexstring]]<32>>
|
||||
_property: log.transactionHash => string<[[DataHexString]]<32>>
|
||||
The transaction hash of the transaction of this log.
|
||||
|
||||
_property: log.transactionIndex => number
|
||||
@@ -159,7 +165,7 @@ The index of this log across all logs in the entire **block**.
|
||||
|
||||
_subsection: Transactions
|
||||
|
||||
_heading: TransactionRequest @<provider-transactionrequest>
|
||||
_heading: TransactionRequest @<providers-TransactionRequest>
|
||||
|
||||
A transaction request describes a transaction that is to
|
||||
be sent to the network or otherwise processed.
|
||||
@@ -177,16 +183,16 @@ _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]]>
|
||||
_property: transactionRequest.gasLimit => [[BigNumber]] | Promise<[[BigNumber]]>
|
||||
The maximum amount of gas this transaction is permitted to use.
|
||||
|
||||
_property: transactionRequest.gasPrice => [[bignumber]] | Promise<[[bignumber]]>
|
||||
_property: transactionRequest.gasPrice => [[BigNumber]] | Promise<[[BigNumber]]>
|
||||
The price (in wei) per unit of gas this transaction will pay.
|
||||
|
||||
_property: transactionRequest.data => [[datahexstring]] | Promise<[[datahexstring]]>
|
||||
_property: transactionRequest.data => [[DataHexString]] | Promise<[[DataHexString]]>
|
||||
The transaction data.
|
||||
|
||||
_property: transactionRequest.value => [[bignumber]] | Promise<[[bignumber]]>
|
||||
_property: transactionRequest.value => [[BigNumber]] | Promise<[[BigNumber]]>
|
||||
The amount (in wei) this transaction is sending.
|
||||
|
||||
_property: transactionRequest.chainId => number | Promise<number>
|
||||
@@ -196,18 +202,29 @@ The chain ID this transaction is authorized on, as specified by
|
||||
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.
|
||||
intended. Intentionally-replayable transactions are also disabled by default
|
||||
on recent versions of Geth and require configuration to enable.
|
||||
|
||||
_heading: TransactionResponse @INHERIT<[[types-transaction]]> @<provider-transactionresponse>
|
||||
_property: transactionRequest.type => null | number
|
||||
|
||||
A **TransactionResponse** includes all properties of a [[types-transaction]] as well as several
|
||||
The [[link-eip-2718]] type of this transaction envelope, or ``null``
|
||||
for legacy transactions that do not have an envelope.
|
||||
|
||||
_property: transactionRequest.accessList => [[providers-AccessListish]]
|
||||
|
||||
The [[providers-AccessList]] to include in an [[link-eip-2930]] transaction, which will
|
||||
include a ``type`` of ``1``.
|
||||
|
||||
_heading: TransactionResponse @<providers-TransactionResponse> @INHERIT<[[Transaction]]>
|
||||
|
||||
A **TransactionResponse** includes all properties of a [[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>>
|
||||
_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``.
|
||||
|
||||
@@ -219,17 +236,36 @@ _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]]>
|
||||
_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.
|
||||
_property: transaction.wait([ confirms = 1 ]) => Promise<[[providers-TransactionReceipt]]>
|
||||
Resolves to the [[providers-TransactionReceipt]] once the transaction
|
||||
has been included in the chain for //confirms// blocks. If //confirms//
|
||||
is 0, and the transaction has not been mined, ``null`` is returned.
|
||||
|
||||
_heading: TransactionReceipt @<provider-receipt>
|
||||
If the transaction execution failed (i.e. the receipt status is ``0``),
|
||||
a [CALL_EXCEPTION](errors--call-exception) Error will be rejected with
|
||||
the following properties:
|
||||
|
||||
- ``error.transaction`` - the original transaction
|
||||
- ``error.transactionHash`` - the hash of the transaction
|
||||
- ``error.receipt`` - the actual receipt, with the status of ``0``
|
||||
|
||||
_property: transactionRequest.type => null | number
|
||||
|
||||
The [[link-eip-2718]] type of this transaction envelope, or ``null``
|
||||
for legacy transactions that do not have an envelope.
|
||||
|
||||
_property: transactionRequest.accessList => [[providers-AccessList]]
|
||||
|
||||
The [[providers-AccessList]] included in an [[link-eip-2930]] transaction, which will
|
||||
also have its ``type`` equal to ``1``.
|
||||
|
||||
_heading: TransactionReceipt @<providers-TransactionReceipt>
|
||||
|
||||
_property: receipt.to => string<[[address]]>
|
||||
The address this transaction is to. This is ``null`` if the the
|
||||
The address this transaction is to. This is ``null`` if the
|
||||
transaction was an **init transaction**, used to deploy a contract.
|
||||
|
||||
_property: receipt.from => string<[[address]]>
|
||||
@@ -241,7 +277,7 @@ 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]]
|
||||
utility function can also be used with a [[providers-TransactionResponse]]
|
||||
object, which requires the transaction nonce and the address of the sender.
|
||||
|
||||
_property: receipt.transactionIndex => number
|
||||
@@ -259,21 +295,21 @@ 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]]
|
||||
_property: receipt.gasUsed => [[BigNumber]]
|
||||
The amount of gas actually used by this transaction.
|
||||
|
||||
_property: receipt.logsBloom => string<[[datahexstring]]>
|
||||
_property: receipt.logsBloom => string<[[DataHexString]]>
|
||||
A [bloom-filter](link-wiki-bloomfilter), which
|
||||
incldues all the addresses and topics included in any log in this
|
||||
includes all the addresses and topics included in any log in this
|
||||
transaction.
|
||||
|
||||
_property: receipt.blockHash => string<[[datahexstring]]<32>>
|
||||
_property: receipt.blockHash => string<[[DataHexString]]<32>>
|
||||
The block hash of the block that this transaction was included in.
|
||||
|
||||
_property: receipt.transactionHash => string<[[datahexstring]]<32>>
|
||||
_property: receipt.transactionHash => string<[[DataHexString]]<32>>
|
||||
The transaction hash of this transaction.
|
||||
|
||||
_property: receipt.logs => Array<[[provider-log]]>
|
||||
_property: receipt.logs => Array<[[providers-Log]]>
|
||||
All the logs emitted by this transaction.
|
||||
|
||||
_property: receipt.blockNumber => number
|
||||
@@ -284,9 +320,9 @@ _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]]
|
||||
_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
|
||||
gas used by each transaction in the ordered list of transactions
|
||||
up to (and including) this transaction.
|
||||
|
||||
This is generally of little interest to developers.
|
||||
@@ -299,3 +335,110 @@ _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.
|
||||
|
||||
_subsection: Access Lists
|
||||
|
||||
An Access List is optional an includes a list of addresses and storage
|
||||
slots for that address which should be //warmed// or pre-fetched for
|
||||
use within the execution of this transaction. A //warmed// value has an
|
||||
additional upfront cost to access, but is discounted throughout the code
|
||||
execution for reading and writing.
|
||||
|
||||
_heading: AccessListish @<providers-AccessListish>
|
||||
|
||||
A looser description of an [[providers-AccessList]], which will be
|
||||
converted internally using [accessListify](utils-accessListify).
|
||||
|
||||
|
||||
It may be any of:
|
||||
|
||||
- any [[providers-AccessList]]
|
||||
- an Array of 2-element Arrays, where the first element is the address
|
||||
and second array is an array of storage keys
|
||||
- an object, whose keys represent the addresses and each value is an
|
||||
array of storage keys
|
||||
|
||||
When using the object form (the last option), the addresses and storage
|
||||
slots will be sorted. If an explicit order for the access list is
|
||||
required, one of the other forms must be used. Most developers
|
||||
**do not** require explicit order.
|
||||
|
||||
_code: equivalent to the AccessList example below @lang<javascript>
|
||||
|
||||
// Option 1:
|
||||
// AccessList
|
||||
// see below
|
||||
|
||||
// Option 2:
|
||||
// Array< [ Address, Array<Bytes32> ] >
|
||||
[
|
||||
[
|
||||
"0x0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
||||
[
|
||||
"0x0000000000000000000000000000000000000000000000000000000000000004",
|
||||
"0x0bcad17ecf260d6506c6b97768bdc2acfb6694445d27ffd3f9c1cfbee4a9bd6d"
|
||||
]
|
||||
],
|
||||
[
|
||||
"0x5FfC014343cd971B7eb70732021E26C35B744cc4",
|
||||
[
|
||||
"0x0000000000000000000000000000000000000000000000000000000000000001"
|
||||
]
|
||||
]
|
||||
]
|
||||
// <hide>
|
||||
;
|
||||
// </hide>
|
||||
|
||||
// Option 3:
|
||||
// Record<Address, Array<Bytes32>>
|
||||
// <hide>
|
||||
(
|
||||
// </hide>
|
||||
{
|
||||
"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e": [
|
||||
"0x0000000000000000000000000000000000000000000000000000000000000004",
|
||||
"0x0bcad17ecf260d6506c6b97768bdc2acfb6694445d27ffd3f9c1cfbee4a9bd6d"
|
||||
],
|
||||
"0x5FfC014343cd971B7eb70732021E26C35B744cc4": [
|
||||
"0x0000000000000000000000000000000000000000000000000000000000000001"
|
||||
]
|
||||
}
|
||||
// <hide>
|
||||
)
|
||||
// </hide>
|
||||
|
||||
|
||||
_heading: AccessList @<providers-AccessList>
|
||||
|
||||
An [[link-eip-2930]] transaction allows an optional **AccessList**
|
||||
which causes a transaction to //warm// (i.e. pre-cache) another
|
||||
addresses state and the specified storage keys.
|
||||
|
||||
This incurs an increased intrinsic cost for the transaction, but provides
|
||||
discounts for storage and state access throughout the execution of the
|
||||
transaction.
|
||||
|
||||
_code: example access list
|
||||
|
||||
// Array of objects with the form:
|
||||
// {
|
||||
// address: Address,
|
||||
// storageKey: Array< DataHexString< 32 > >
|
||||
// }
|
||||
|
||||
[
|
||||
{
|
||||
address: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
||||
storageKeys: [
|
||||
"0x0000000000000000000000000000000000000000000000000000000000000004",
|
||||
"0x0bcad17ecf260d6506c6b97768bdc2acfb6694445d27ffd3f9c1cfbee4a9bd6d"
|
||||
]
|
||||
},
|
||||
{
|
||||
address: "0x5FfC014343cd971B7eb70732021E26C35B744cc4",
|
||||
storageKeys: [
|
||||
"0x0000000000000000000000000000000000000000000000000000000000000001"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,19 +1,36 @@
|
||||
_section: Signers
|
||||
|
||||
A Signer represents...
|
||||
_section: Signers @<signers>
|
||||
|
||||
_subsection: Signer @<signer> @SRC<abstract-signer:class.Signer>
|
||||
A **Signer** in //ethers// is an abstraction of an Ethereum Account,
|
||||
which can be used to sign messages and transactions and send
|
||||
signed transactions to the Ethereum Network to execute state
|
||||
changing operations.
|
||||
|
||||
The **Signer** class is abstract and cannot be directly instaniated. Instead
|
||||
use one of the concreate sub-classes, such as the [[wallet]], [[void-signer]]
|
||||
or [[signer-jsonrpc]].
|
||||
The available operations depend largely on the sub-class used.
|
||||
|
||||
_property: signer.connect(provider) => [[signer]] @<signer-connect>
|
||||
For example, a Signer from MetaMask can send transactions and sign
|
||||
messages but cannot sign a transaction (without broadcasting it).
|
||||
|
||||
The most common Signers you will encounter are:
|
||||
|
||||
- [[Wallet]], which is a class which knows its private key and can
|
||||
execute any operations with it
|
||||
- [[JsonRpcSigner]], which is connected to a [[JsonRpcProvider]] (or
|
||||
sub-class) and is acquired using [getSigner](JsonRpcProvider-getSigner)
|
||||
|
||||
_subsection: Signer @<Signer> @SRC<abstract-signer:class.Signer>
|
||||
|
||||
The **Signer** class is abstract and cannot be directly instantiated.
|
||||
|
||||
Instead use one of the concrete sub-classes, such as the [[Wallet]],
|
||||
[[VoidSigner]] or [[JsonRpcSigner]].
|
||||
|
||||
_property: signer.connect(provider) => [[Signer]] @<Signer-connect>
|
||||
|
||||
Sub-classes **must** implement this, however they may simply throw an error
|
||||
if changing providers is not supported.
|
||||
|
||||
_property: signer.getAddress() => Promise<string<[Address](address)>> @<signer-getaddress> @SRC<abstract-signer:Signer.connect>
|
||||
_property: signer.getAddress() => Promise<string<[[address]]>> @<Signer-getaddress> @SRC<abstract-signer:Signer.connect>
|
||||
Returns a Promise that resolves to the account address.
|
||||
|
||||
This is a Promise so that a **Signer** can be designed around an
|
||||
@@ -21,51 +38,52 @@ asynchronous source, such as hardware wallets.
|
||||
|
||||
Sub-classes **must** implement this.
|
||||
|
||||
_property: Signer.isSigner(object) => boolean @<signer-issigner> @SRC<abstract-signer>
|
||||
_property: Signer.isSigner(object) => boolean @<Signer-isSigner> @SRC<abstract-signer>
|
||||
Returns true if an only if //object// is a **Signer**.
|
||||
|
||||
_heading: Blockchain Methods @<signer-blockchain>
|
||||
_heading: Blockchain Methods @<Signer--blockchain-methods>
|
||||
|
||||
_property: signer.getBalance([ blockTag = "latest" ]) => Promise<[[bignumber]]> @<signer-getbalance> @SRC<abstract-signer>
|
||||
_property: signer.getBalance([ blockTag = "latest" ]) => Promise<[[BigNumber]]> @<Signer-getBalance> @SRC<abstract-signer>
|
||||
Returns the balance of this wallet at //blockTag//.
|
||||
|
||||
_property: signer.getChainId() => Promise<number> @<signer-getchainid> @SRC<abstract-signer>
|
||||
Returns ths chain ID this wallet is connected to.
|
||||
_property: signer.getChainId() => Promise<number> @<Signer-getChainId> @SRC<abstract-signer>
|
||||
Returns the chain ID this wallet is connected to.
|
||||
|
||||
_property: signer.getGasPrice() => Promise<[[bignumber]]> @<signer-getgasprice> @SRC<abstract-signer>
|
||||
_property: signer.getGasPrice() => Promise<[[BigNumber]]> @<Signer-getGasPrice> @SRC<abstract-signer>
|
||||
Returns the current gas price.
|
||||
|
||||
_property: signer.getTransactionCount([ blockTag = "latest" ]) => Promise<number> @<signer-gettransactioncount> @SRC<abstract-signer>
|
||||
_property: signer.getTransactionCount([ blockTag = "latest" ]) => Promise<number> @<Signer-getTransactionCount> @SRC<abstract-signer>
|
||||
Returns the number of transactions this account has ever sent. This
|
||||
is the value required to be included in transactions as the ``nonce``.
|
||||
|
||||
_property: signer.call(transactionRequest) => Promise<string<[[datahexstring]]>> @<signer-call> @SRC<abstract-signer>
|
||||
_property: signer.call(transactionRequest) => Promise<string<[[DataHexString]]>> @<Signer-call> @SRC<abstract-signer>
|
||||
Returns the result of calling using the //transactionRequest//, with this
|
||||
account address being used as the ``from`` field.
|
||||
|
||||
_property: signer.estimateGas(transactionRequest) => Promise<[[bignumber]]> @<signer-estimategas> @SRC<abstract-signer>
|
||||
_property: signer.estimateGas(transactionRequest) => Promise<[[BigNumber]]> @<Signer-estimateGas> @SRC<abstract-signer>
|
||||
Returns the result of estimating the cost to send the //transactionRequest//,
|
||||
with this account address being used as the ``from`` field.
|
||||
|
||||
_property: signer.resolveName(ensName) => Promise<string<[Address](address)>> @<signer-resolvename> @SRC<abstract-signer>
|
||||
_property: signer.resolveName(ensName) => Promise<string<[[address]]>> @<Signer-resolveName> @SRC<abstract-signer>
|
||||
Returns the address associated with the //ensName//.
|
||||
|
||||
|
||||
_heading: Signing
|
||||
_heading: Signing @<Signer--signing-methods>
|
||||
|
||||
_property: signer.signMessage(message) => Promise<string<[FlatSignature](signature-flat)>> @<signer-signmessage>
|
||||
This returns a Promise which resolves to the [[signature-flat]]
|
||||
_property: signer.signMessage(message) => Promise<string<[RawSignature](signature-raw)>> @<Signer-signMessage>
|
||||
This returns a Promise which resolves to the [[signature-raw]]
|
||||
of //message//.
|
||||
|
||||
Sub-classes **must** implement this, however they may throw if signing a
|
||||
message is not supported.
|
||||
message is not supported, such as in a Contract-based Wallet or
|
||||
Meta-Transaction-based Wallet.
|
||||
|
||||
_note: Note
|
||||
|
||||
If //message// is a string, it is **treated as a string** and
|
||||
converted to its representation in UTF8 bytes.
|
||||
|
||||
**If and only if** a message is a [[bytes]] will it be treated as
|
||||
**If and only if** a message is a [[Bytes]] will it be treated as
|
||||
binary data.
|
||||
|
||||
For example, the string ``"0x1234"`` is 6 characters long (and in
|
||||
@@ -78,44 +96,105 @@ string, it **must** be converted to an array first, using the
|
||||
|
||||
_null:
|
||||
|
||||
_property: signer.signTransaction(transactionRequest) => Promise<string<[[datahexstring]]>> @<signer-signtransaction>
|
||||
_property: signer.signTransaction(transactionRequest) => Promise<string<[[DataHexString]]>> @<Signer-signTransaction>
|
||||
Returns a Promise which resolves to the signed transaction of the
|
||||
//transactionRequest//. This method does not populate any missing fields.
|
||||
|
||||
Sub-classes **must** implement this, however they may throw if signing a
|
||||
transaction is not supported.
|
||||
transaction is not supported, which is common for security reasons in many
|
||||
clients.
|
||||
|
||||
_property: signer.sendTransaction(transactionRequest) => Promise<[[provider-transactionresponse]]> @<signer-sendtransaction>
|
||||
_property: signer.sendTransaction(transactionRequest) => Promise<[[providers-TransactionResponse]]> @<Signer-sendTransaction>
|
||||
This method populates the transactionRequest with missing fields, using
|
||||
[populateTransaction](signer-populatetransaction) and returns a Promise which resolves to the transaction.
|
||||
[populateTransaction](Signer-populateTransaction) and returns a Promise which resolves to the transaction.
|
||||
|
||||
Sub-classes **must** implement this, however they may throw if signing a
|
||||
transaction is not supported.
|
||||
Sub-classes **must** implement this, however they may throw if sending a
|
||||
transaction is not supported, such as the [[VoidSigner]] or if the
|
||||
Wallet is offline and not connected to a [[Provider]].
|
||||
|
||||
_heading: Sub-Classes @<signer-subclassing>
|
||||
_property: signer._signTypedData(domain, types, value) => Promise<string<[RawSignature](signature-raw)>> @<Signer-signTypedData>
|
||||
|
||||
Signs the typed data //value// with //types// data structure for //domain// using
|
||||
the [[link-eip-712]] specification.
|
||||
|
||||
_warning: Experimental feature (this method name will change)
|
||||
|
||||
This is still an experimental feature. If using it, please specify the **exact**
|
||||
version of ethers you are using (e.g. spcify ``"5.0.18"``, **not** ``"^5.0.18"``) as
|
||||
the method name will be renamed from ``_signTypedData`` to ``signTypedData`` once
|
||||
it has been used in the field a bit.
|
||||
|
||||
_code: Typed Data Example @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
signer = new Wallet("0x1234567890123456789012345678901234567890123456789012345678901234");
|
||||
// </hide>
|
||||
|
||||
// All properties on a domain are optional
|
||||
const domain = {
|
||||
name: 'Ether Mail',
|
||||
version: '1',
|
||||
chainId: 1,
|
||||
verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'
|
||||
};
|
||||
|
||||
// The named list of all type definitions
|
||||
const types = {
|
||||
Person: [
|
||||
{ name: 'name', type: 'string' },
|
||||
{ name: 'wallet', type: 'address' }
|
||||
],
|
||||
Mail: [
|
||||
{ name: 'from', type: 'Person' },
|
||||
{ name: 'to', type: 'Person' },
|
||||
{ name: 'contents', type: 'string' }
|
||||
]
|
||||
};
|
||||
|
||||
// The data to sign
|
||||
const value = {
|
||||
from: {
|
||||
name: 'Cow',
|
||||
wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826'
|
||||
},
|
||||
to: {
|
||||
name: 'Bob',
|
||||
wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'
|
||||
},
|
||||
contents: 'Hello, Bob!'
|
||||
};
|
||||
|
||||
|
||||
const signature = await signer._signTypedData(domain, types, value);
|
||||
//! async signature
|
||||
|
||||
|
||||
_heading: Sub-Classes @<Signer--subclassing>
|
||||
|
||||
It is very important that all important properties of a **Signer** are
|
||||
**immutable**. Since Ethereum is very asynchronous and deals with critical
|
||||
data (such as ether and other potentially valuable crypto assets), keeping
|
||||
properties such as the //provider// and //address// static helps prevent
|
||||
serious issues.
|
||||
properties such as the //provider// and //address// static throughout the
|
||||
life-cycle of the Signer helps prevent serious issues and many other classes
|
||||
and libraries make this assumption.
|
||||
|
||||
A sub-class **must** call ``super()``.
|
||||
A sub-class **must** extend Signer and **must** call ``super()``.
|
||||
|
||||
_property: signer.checkTransaction(transactionRequest) => [[provider-transactionrequest]] @<signer-checktransaction> @SRC<abstract-signer>
|
||||
This is generally not required to be overridden, but may needed to provide
|
||||
_property: signer.checkTransaction(transactionRequest) => [[providers-TransactionRequest]] @<Signer-checkTransaction> @SRC<abstract-signer>
|
||||
This is generally not required to be overridden, but may be 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.
|
||||
The default implementation checks only if valid [[providers-TransactionRequest]] properties
|
||||
exist and adds ``from`` to the transaction if it does not exist.
|
||||
|
||||
_property: signer.populateTransaction(transactionRequest) => Promise<[[provider-transactionrequest]]> @<signer-populatetransaction> @SRC<abstract-signer>
|
||||
This is generally not required to be overridden, but may needed to provide
|
||||
If there is a ``from`` field it **must** be verified to be equal to the Signer's address.
|
||||
|
||||
_property: signer.populateTransaction(transactionRequest) => Promise<[[providers-TransactionRequest]]> @<Signer-populateTransaction> @SRC<abstract-signer>
|
||||
This is generally not required to be overridden, but may be needed to provide
|
||||
custom behaviour in sub-classes.
|
||||
|
||||
This should return a **copy** of //transactionRequest//, follow the same procedure
|
||||
@@ -127,65 +206,139 @@ The default implementation calls ``checkTransaction`` and resolves to if it is a
|
||||
ENS name, adds ``gasPrice``, ``nonce``, ``gasLimit`` and ``chainId`` based on the
|
||||
related operations on Signer.
|
||||
|
||||
_subsection: Wallet @<wallet> @INHERIT<[[externally-owned-account]] and [[signer]]> @SRC<wallet:class.Wallet>
|
||||
|
||||
The Wallet class inherits [[signer]] and can sign transactions and messages
|
||||
_subsection: Wallet @<Wallet> @INHERIT<[[ExternallyOwnedAccount]] and [[Signer]]> @SRC<wallet:class.Wallet>
|
||||
|
||||
The Wallet class inherits [[Signer]] and can sign transactions and messages
|
||||
using a private key as a standard Externally Owned Account (EOA).
|
||||
|
||||
_property: new ethers.Wallet(privateKey [ , provider ]) @<wallet-constructor> @SRC<wallet:constructor.Wallet>
|
||||
_property: new ethers.Wallet(privateKey [ , provider ]) @<Wallet-constructor> @SRC<wallet:constructor.Wallet>
|
||||
Create a new Wallet instance for //privateKey// and optionally
|
||||
connected to the //provider//.
|
||||
|
||||
_property: ethers.Wallet.createRandom( [ options = { } ]) => [[wallet]] @<wallet-createrandom> @SRC<wallet>
|
||||
_property: ethers.Wallet.createRandom( [ options = { } ]) => [[Wallet]] @<Wallet-createRandom> @SRC<wallet>
|
||||
Returns a new Wallet with a random private key, generated from
|
||||
cryptographically secure entropy sources. If the current environment
|
||||
does not have a secure entropy source, an error is thrown.
|
||||
|
||||
_property: ethers.Wallet.fromEncryptedJson(json, password [ , progress ]) => Promise<[[wallet]]> @<wallet-fromencryptedjson> @SRC<wallet>
|
||||
Create an instance from an encrypted JSON wallet. If //progress//
|
||||
is provided it will be called during decryption with a value between 0 and
|
||||
1 indicating the progress towards completion.
|
||||
Wallets created using this method will have a mnemonic.
|
||||
|
||||
_property: ethers.Wallet.fromEncryptedJsonSync(json, password) => [[wallet]] @<wallet-fromencryptedjsonsync> @SRC<wallet>
|
||||
_property: ethers.Wallet.fromEncryptedJson(json, password [ , progress ]) => Promise<[[Wallet]]> @<Wallet-fromEncryptedJson> @SRC<wallet>
|
||||
Create an instance from an encrypted JSON wallet.
|
||||
|
||||
If //progress// is provided it will be called during decryption
|
||||
with a value between 0 and 1 indicating the progress towards
|
||||
completion.
|
||||
|
||||
_property: ethers.Wallet.fromEncryptedJsonSync(json, password) => [[Wallet]] @<Wallet-fromEncryptedJsonSync> @SRC<wallet>
|
||||
Create an instance from an encrypted JSON wallet.
|
||||
|
||||
This operation will operate synchronously which will lock up the user
|
||||
interface, possibly for a non-trivial duration. Most applications should
|
||||
use the asynchronous ``fromEncryptedJson`` instead.
|
||||
|
||||
_property: ethers.Wallet.fromMnemonic(mnemonic [ , path, [ wordlist ] ]) => [[wallet]]
|
||||
_property: ethers.Wallet.fromMnemonic(mnemonic [ , path, [ wordlist ] ]) => [[Wallet]] @<Wallet.fromMnemonic>
|
||||
Create an instance from a mnemonic phrase.
|
||||
|
||||
If path is not specified, the Ethereum default path is used (i.e. m/44'/60'/0'/0/0).
|
||||
If path is not specified, the Ethereum default path is used (i.e. ``m/44'/60'/0'/0/0``).
|
||||
|
||||
If wordlist is not specified, the English Wordlist is used.
|
||||
|
||||
_heading: Properties
|
||||
_heading: Properties @<Wallet--properties>
|
||||
|
||||
_property: wallet.address => string<[Address](address)>
|
||||
_property: wallet.address => string<[[address]]>
|
||||
The address for the account this Wallet represents.
|
||||
|
||||
_property: wallet.provider => [[provider]]
|
||||
The provider this wallet is connected to, which will ge used for any [[signer-blockchain]]
|
||||
_property: wallet.provider => [[Provider]]
|
||||
The provider this wallet is connected to, which will be used for any [[Signer--blockchain-methods]]
|
||||
methods. This can be null.
|
||||
|
||||
_note: Note
|
||||
A **Wallet** instance is immuatable, so if you wish to change the Provider, you
|
||||
may use the [connect](signer-connect) method to create a new instance connected
|
||||
A **Wallet** instance is immutable, so if you wish to change the Provider, you
|
||||
may use the [connect](Signer-connect) method to create a new instance connected
|
||||
to the desired provider.
|
||||
|
||||
_property: wallet.publicKey => string<[[datahexstring]]<65>>
|
||||
_property: wallet.publicKey => string<[[DataHexString]]<65>>
|
||||
The uncompressed public key for this Wallet represents.
|
||||
|
||||
_heading: Methods
|
||||
_heading: Methods @<Wallet--methods>
|
||||
|
||||
_property: wallet.encrypt(password, [ options = { }, [ progress ] ]) => Promise<string>
|
||||
_property: wallet.encrypt(password, [ options = { }, [ progress ] ]) => Promise<string> @<Wallet-encrypt>
|
||||
|
||||
Encrypt the wallet using //password// returning a Promise which resolves
|
||||
to a JSON wallet.
|
||||
|
||||
If //progress// is provided it will be called during decryption
|
||||
with a value between 0 and 1 indicating the progress towards
|
||||
completion.
|
||||
|
||||
_subsection: VoidSigner @<void-signer> @INHERIT<[[signer]]> @SRC<abstract-signer:class.VoidSigner>
|
||||
_code: Wallet Examples @lang<javascript>
|
||||
|
||||
// Create a wallet instance from a mnemonic...
|
||||
mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol"
|
||||
walletMnemonic = Wallet.fromMnemonic(mnemonic)
|
||||
|
||||
// ...or from a private key
|
||||
walletPrivateKey = new Wallet(walletMnemonic.privateKey)
|
||||
|
||||
walletMnemonic.address === walletPrivateKey.address
|
||||
//!
|
||||
|
||||
// The address as a Promise per the Signer API
|
||||
walletMnemonic.getAddress()
|
||||
//!
|
||||
|
||||
// A Wallet address is also available synchronously
|
||||
walletMnemonic.address
|
||||
//!
|
||||
|
||||
// The internal cryptographic components
|
||||
walletMnemonic.privateKey
|
||||
//!
|
||||
walletMnemonic.publicKey
|
||||
//!
|
||||
|
||||
// The wallet mnemonic
|
||||
walletMnemonic.mnemonic
|
||||
//!
|
||||
|
||||
// Note: A wallet created with a private key does not
|
||||
// have a mnemonic (the derivation prevents it)
|
||||
walletPrivateKey.mnemonic
|
||||
//!
|
||||
|
||||
// Signing a message
|
||||
walletMnemonic.signMessage("Hello World")
|
||||
//!
|
||||
|
||||
tx = {
|
||||
to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
|
||||
value: utils.parseEther("1.0")
|
||||
}
|
||||
|
||||
// Signing a transaction
|
||||
walletMnemonic.signTransaction(tx)
|
||||
//!
|
||||
|
||||
// The connect method returns a new instance of the
|
||||
// Wallet connected to a provider
|
||||
wallet = walletMnemonic.connect(provider)
|
||||
|
||||
// Querying the network
|
||||
wallet.getBalance();
|
||||
//!
|
||||
wallet.getTransactionCount();
|
||||
//!
|
||||
|
||||
// Sending ether
|
||||
wallet.sendTransaction(tx)
|
||||
// <hide>
|
||||
//! error
|
||||
// </hide>
|
||||
|
||||
|
||||
|
||||
_subsection: VoidSigner @<VoidSigner> @INHERIT<[[Signer]]> @SRC<abstract-signer:class.VoidSigner>
|
||||
|
||||
A **VoidSigner** is a simple Signer which cannot sign.
|
||||
|
||||
@@ -196,29 +349,65 @@ will be carried.
|
||||
For example, the ``call`` operation will automatically have the
|
||||
provided address passed along during the execution.
|
||||
|
||||
_property: new ethers.VoidSigner(address) => [[void-signer]]
|
||||
_property: new ethers.VoidSigner(address [ , provider ]) => [[VoidSigner]]
|
||||
Create a new instance of a **VoidSigner** for //address//.
|
||||
|
||||
_property: voidSigner.address => string<[Address](address)>
|
||||
_property: voidSigner.address => string<[[address]]>
|
||||
The address of this **VoidSigner**.
|
||||
|
||||
_code: VoidSigner Pre-flight Example @lang<javascript>
|
||||
|
||||
_subsection: ExternallyOwnedAccount @<externally-owned-account>
|
||||
address = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"
|
||||
signer = new ethers.VoidSigner(address, provider)
|
||||
|
||||
// The DAI token contract
|
||||
abi = [
|
||||
"function balanceOf(address) view returns (uint)",
|
||||
"function transfer(address, uint) returns (bool)"
|
||||
]
|
||||
contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer)
|
||||
|
||||
// <hide>
|
||||
//!
|
||||
// </hide>
|
||||
// Get the number of tokens for this account
|
||||
tokens = await contract.balanceOf(signer.getAddress())
|
||||
//! async tokens
|
||||
|
||||
//
|
||||
// Pre-flight (check for revert) on DAI from the signer
|
||||
//
|
||||
// Note: We do not have the private key at this point, this
|
||||
// simply allows us to check what would happen if we
|
||||
// did. This can be useful to check before prompting
|
||||
// a request in the UI
|
||||
//
|
||||
|
||||
// This will pass since the token balance is available
|
||||
contract.callStatic.transfer("donations.ethers.eth", tokens)
|
||||
//!
|
||||
|
||||
// This will fail since it is greater than the token balance
|
||||
contract.callStatic.transfer("donations.ethers.eth", tokens.add(1))
|
||||
//! error
|
||||
|
||||
|
||||
_subsection: ExternallyOwnedAccount @<ExternallyOwnedAccount>
|
||||
|
||||
This is an interface which contains a minimal set of properties
|
||||
required for Externally Owned Accounts which can have certain
|
||||
operations performed, such as encoding as a JSON wallet.
|
||||
|
||||
_property: eoa.address => string<[Address](address)>
|
||||
_property: eoa.address => string<[[address]]>
|
||||
|
||||
The [[address]] of this EOA.
|
||||
|
||||
_property: eoa.privateKey => string<[[datahexstring]]<32>>
|
||||
_property: eoa.privateKey => string<[[DataHexString]]<32>>
|
||||
|
||||
The privateKey of this EOA
|
||||
|
||||
_property: eoa.mnemonic => [[hdnode-mnemonic]]
|
||||
_property: eoa.mnemonic => [[Mnemonic]]
|
||||
|
||||
//Optional//. The account HD mnemonic, if it has one and can be
|
||||
determined. Some sources do not encode the mnemonic, such as an
|
||||
determined. Some sources do not encode the mnemonic, such as
|
||||
HD extended keys.
|
||||
|
||||
48
docs.wrm/api/utils/abi/coder.wrm
Normal file
48
docs.wrm/api/utils/abi/coder.wrm
Normal file
@@ -0,0 +1,48 @@
|
||||
_section: AbiCoder @<AbiCoder> @SRC<abi:class.AbiCoder>
|
||||
|
||||
The **AbiCoder** is a collection of Coders which can be used to
|
||||
encode and decode the binary data formats used to interoperate
|
||||
between the EVM and higher level libraries.
|
||||
|
||||
Most developers will never need to use this class directly, since
|
||||
the [[Interface]] class greatly simplifies these operations.
|
||||
|
||||
|
||||
_subsection: Creating Instance @<AbiCoder--creating>
|
||||
|
||||
For the most part, there should never be a need to manually create
|
||||
an instance of an [[AbiCoder]], since one is created with the
|
||||
default coercion function when the library is loaded which can
|
||||
be used universally.
|
||||
|
||||
This is likely only needed by those with specific needs to override
|
||||
how values are coerced after they are decoded from their binary format.
|
||||
|
||||
_property: new ethers.utils.AbiCoder([coerceFunc]) @SRC<abi:constructor.AbiCoder>
|
||||
|
||||
Create a new AbiCoder instance, which will call the //coerceFunc// on every
|
||||
decode, where the result of the call will be used in the Result.
|
||||
|
||||
The function signature is `(type, value)`, where the //type// is the string
|
||||
describing the type and the //value// is the processed value from the underlying
|
||||
Coder.
|
||||
|
||||
If the callback throws, the Result will contain a property that when accessed will
|
||||
throw, allowing for higher level libraries to recover from data errors.
|
||||
|
||||
_property: ethers.utils.defaultAbiCoder => [[AbiCoder]]
|
||||
|
||||
An [[AbiCoder]] created when the library is imported which is used by
|
||||
the [[Interface]].
|
||||
|
||||
_subsection: Coding Methods @<AbiCoder--methods>
|
||||
|
||||
_property: abiCoder.encode(types, values) => string<[[DataHexString]]> @<AbiCoder-encode> @SRC<abi/abi-coder>
|
||||
|
||||
Encode the array //values// according to the array of //types//, each of which may be a
|
||||
string or a [[ParamType]].
|
||||
|
||||
_property: abiCoder.decode(types, data) => [[Result]] @<AbiCoder-decode> @SRC<abi/abi-coder>
|
||||
|
||||
Decode the //data// according to the array of //types//, each of which may be a
|
||||
string or [[ParamType]].
|
||||
11
docs.wrm/api/utils/abi/formats.wrm
Normal file
11
docs.wrm/api/utils/abi/formats.wrm
Normal file
@@ -0,0 +1,11 @@
|
||||
_section: ABI Formats @<abi-formats>
|
||||
|
||||
@TODO: Expand this section
|
||||
|
||||
_subsection: Human-Readable ABI @<abi-formats--human-readable-abi>
|
||||
|
||||
See [Human-Readable Abi](link-ricmoo-humanreadableabi).
|
||||
|
||||
_subsection: Solidity JSON ABI @<abi-formats--solidity>
|
||||
|
||||
See [Solidity compiler](link-solc-output).
|
||||
@@ -1,4 +1,4 @@
|
||||
_section: Fragments
|
||||
_section: Fragments @<fragments>
|
||||
|
||||
Explain an ABI.
|
||||
|
||||
@@ -10,34 +10,34 @@ The **JSON ABI Format** is the format that is
|
||||
[output from the Solidity compiler](link-solc-output).
|
||||
|
||||
A JSON serialized object is always a string, which represents an Array
|
||||
of Objects, where each Object has various properties describing the [[abi-fragment]] of the ABI.
|
||||
of Objects, where each Object has various properties describing the [[Fragment]] of the ABI.
|
||||
|
||||
The deserialied JSON string (which is a normal JavaScript Object) may
|
||||
The deserialized JSON string (which is a normal JavaScript Object) may
|
||||
also be passed into any function which accepts a JSON String ABI.
|
||||
|
||||
_heading: Humanb-Readable ABI
|
||||
|
||||
The Human-Readable ABI was
|
||||
The Human-Readable ABI was @TODO
|
||||
|
||||
[article](link-ricmoo-humanreadableabi)
|
||||
|
||||
|
||||
_heading: Output Formats @<abi-outputformats> @SRC<abi/fragments:FormatTypes>
|
||||
_heading: Output Formats @<fragments--output-formats> @SRC<abi/fragments:FormatTypes>
|
||||
|
||||
Each [[abi-fragment]] and [[abi-paramtype]] may be output using its ``format``
|
||||
Each [[Fragment]] and [[ParamType]] may be output using its ``format``
|
||||
method.
|
||||
|
||||
_property: ethers.utils.FragmentTypes.full => string
|
||||
|
||||
This is a full human-readable string, including all parameter names, any
|
||||
optional modifiers (e.g. ``indexed``, ``public``, etc) and white-space
|
||||
to aid in human readabiliy.
|
||||
to aid in human readability.
|
||||
|
||||
_property: ethers.utils.FragmentTypes.minimal => string
|
||||
|
||||
This is similar to ``full``, except with no unnecessary whitespace or parameter
|
||||
names. This is useful for storing a minimal string which can still fully
|
||||
reconstruct the original Fragment using [Fragment . from](abi-fragment-from).
|
||||
reconstruct the original Fragment using [Fragment . from](Fragment-from).
|
||||
|
||||
_property: ethers.utils.FragmentTypes.json => string
|
||||
|
||||
@@ -51,55 +51,55 @@ signature hash or an event topic hash.
|
||||
|
||||
_warning: Note
|
||||
|
||||
The ``sighash`` format is **insufficient** to re-create the original [[abi-fragment]],
|
||||
The ``sighash`` format is **insufficient** to re-create the original [[Fragment]],
|
||||
since it discards modifiers such as indexed, anonymous, stateMutability, etc.
|
||||
|
||||
|
||||
_subsection: Fragment @<abi-fragment> @SRC<abi/fragments:class.Fragment>
|
||||
_subsection: Fragment @<Fragment> @SRC<abi/fragments:class.Fragment>
|
||||
|
||||
An ABI is a collection of **Fragments**, where each fragment specifies:
|
||||
|
||||
- An [Event](abi-eventfragment)
|
||||
- A [Function](abi-functionfragment)
|
||||
- A [Constructor](abi-constructorfragment)
|
||||
- An [Event](EventFragment)
|
||||
- A [Function](FunctionFragment)
|
||||
- A [Constructor](ConstructorFragment)
|
||||
|
||||
_heading: Properties
|
||||
|
||||
_property: fragment.name => string
|
||||
|
||||
This is the name of the Event or Function. This will be null for
|
||||
a [[abi-constructorfragment]].
|
||||
a [[ConstructorFragment]].
|
||||
|
||||
_property: fragment.type => string
|
||||
|
||||
This is a string which indicates the type of the [[abi-fragment]]. This
|
||||
This is a string which indicates the type of the [[Fragment]]. This
|
||||
will be one of:
|
||||
|
||||
- ``constructor``
|
||||
- ``event``
|
||||
- ``function``
|
||||
|
||||
_property: fragment.inputs => Array<[[abi-paramtype]]>
|
||||
_property: fragment.inputs => Array<[[ParamType]]>
|
||||
|
||||
This is an array of of each [[abi-paramtype]] for the input parameters to
|
||||
This is an array of each [[ParamType]] for the input parameters to
|
||||
the Constructor, Event of Function.
|
||||
|
||||
_heading: Methods
|
||||
|
||||
_property: ethers.utils.Fragment.from(objectOrString) => [[abi-fragment]] @<abi-fragment-from> @SRC<abi/fragments:Fragment.from>
|
||||
_property: ethers.utils.Fragment.from(objectOrString) => [[Fragment]] @<Fragment-from> @SRC<abi/fragments:Fragment.from>
|
||||
|
||||
Returns a
|
||||
|
||||
_property: ethers.utils.Fragment.isFragment(object) => boolean @<abi-isfragment> @SRC<abi/fragments:Fragment.isFragment>
|
||||
_property: ethers.utils.Fragment.isFragment(object) => boolean @<Fragment-isFragment> @SRC<abi/fragments:Fragment.isFragment>
|
||||
|
||||
Tra lal al
|
||||
|
||||
|
||||
_subsection: ConstructorFragment @<abi-constructorfragment> @INHERIT<[[abi-fragment]]> @SRC<abi/fragments:class.ConstructorFragment>
|
||||
_subsection: ConstructorFragment @<ConstructorFragment> @INHERIT<[[Fragment]]> @SRC<abi/fragments:class.ConstructorFragment>
|
||||
|
||||
_heading: Properties
|
||||
|
||||
_property: fragment.gas => [[bignumber]]
|
||||
_property: fragment.gas => [[BigNumber]]
|
||||
|
||||
This is the gas limit that should be used during deployment. It may be
|
||||
null.
|
||||
@@ -118,16 +118,16 @@ This is the state mutability of the constructor. It can be any of:
|
||||
|
||||
_heading: Methods
|
||||
|
||||
_property: ethers.utils.ConstructorFragment.from(objectOrString) => [[abi-constructorfragment]] @<abi-constructorfragment-from> @SRC<abi/fragments:ConstructorFragment.from>
|
||||
_property: ethers.utils.ConstructorFragment.from(objectOrString) => [[ConstructorFragment]] @<ConstructorFragment-from> @SRC<abi/fragments:ConstructorFragment.from>
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.ConstructorFragment.isConstructorFragment(object) => boolean @<abi-isconstructorfragment> @SRC<abi/fragments:ConstructorFragment.isConstructorFragment>
|
||||
_property: ethers.utils.ConstructorFragment.isConstructorFragment(object) => boolean @<ConstructorFragment-isConstructorFragment> @SRC<abi/fragments:ConstructorFragment.isConstructorFragment>
|
||||
|
||||
Tra lal al
|
||||
|
||||
|
||||
_subsection: EventFragment @<abi-eventfragment> @INHERIT<[[abi-fragment]]> @SRC<abi/fragments:class.EventFragment>
|
||||
_subsection: EventFragment @<EventFragment> @INHERIT<[[Fragment]]> @SRC<abi/fragments:class.EventFragment>
|
||||
|
||||
_heading: Properties
|
||||
|
||||
@@ -138,16 +138,16 @@ topic hash as topic0 when creating a log.
|
||||
|
||||
_heading: Methods
|
||||
|
||||
_property: ethers.utils.EventFragment.from(objectOrString) => [[abi-eventfragment]] @<abi-eventfragment-from> @SRC<abi/fragments:EventFragment.from>
|
||||
_property: ethers.utils.EventFragment.from(objectOrString) => [[EventFragment]] @<EventFragment-from> @SRC<abi/fragments:EventFragment.from>
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.EventFragment.isEventFragment(object) => boolean @<abi-iseventfragment> @SRC<abi/fragments:EventFragment.isEventFragment>
|
||||
_property: ethers.utils.EventFragment.isEventFragment(object) => boolean @<EventFragment-isEventFragment> @SRC<abi/fragments:EventFragment.isEventFragment>
|
||||
|
||||
Tra lal al
|
||||
|
||||
|
||||
_subsection: FunctionFragment @<abi-functionfragment> @INHERIT<[[abi-constructorfragment]]> @SRC<abi/fragments:class.FunctionFragment>
|
||||
_subsection: FunctionFragment @<FunctionFragment> @INHERIT<[[ConstructorFragment]]> @SRC<abi/fragments:class.FunctionFragment>
|
||||
|
||||
_heading: Properties
|
||||
|
||||
@@ -165,22 +165,22 @@ This is the state mutability of the constructor. It can be any of:
|
||||
- ``pure``
|
||||
- ``view``
|
||||
|
||||
_property: fragment.outputs => Array<[[abi-paramtype]]>
|
||||
_property: fragment.outputs => Array<[[ParamType]]>
|
||||
|
||||
A list of the Function output parameters.
|
||||
|
||||
_heading: Method
|
||||
|
||||
_property: ethers.utils.FunctionFragment.from(objectOrString) => [[abi-functionfragment]] @<abi-functionfragment-from> @SRC<abi/fragments:ConstructorFragment.from>
|
||||
_property: ethers.utils.FunctionFragment.from(objectOrString) => [[FunctionFragment]] @<FunctionFragment-from> @SRC<abi/fragments:ConstructorFragment.from>
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.FunctionFragment.isFunctionFragment(object) => boolean @<abi-isfunctionfragment> @SRC<abi/fragments:FunctionFragment.isFunctionFragment>
|
||||
_property: ethers.utils.FunctionFragment.isFunctionFragment(object) => boolean @<FunctionFragment-isFunctionFragment> @SRC<abi/fragments:FunctionFragment.isFunctionFragment>
|
||||
|
||||
Tra lal al
|
||||
|
||||
|
||||
_subsection: ParamType @<abi-paramtype> @SRC<abi/fragments:class.ParamType>
|
||||
_subsection: ParamType @<ParamType> @SRC<abi/fragments:class.ParamType>
|
||||
|
||||
The following examples will represent the Solidity parameter:
|
||||
|
||||
@@ -188,38 +188,38 @@ The following examples will represent the Solidity parameter:
|
||||
|
||||
_heading: Properties
|
||||
|
||||
_property: paramType.name => string @<abi-paramtype-name>
|
||||
_property: paramType.name => string @<ParamType-name>
|
||||
|
||||
The local parameter name. This may be null for unnamed parameters. For example,
|
||||
the parameter definition ``string foobar`` would be ``foobar``.
|
||||
|
||||
_property: paramType.type => string @<abi-paramtype-type>
|
||||
_property: paramType.type => string @<ParamType-type>
|
||||
|
||||
The full type of the parameter, including tuple and array symbols. This may be null
|
||||
for unnamed parameters. For the above example, this would be ``foobar``.
|
||||
|
||||
_property: paramType.basetype => string @<abi-paramtype-basetype>
|
||||
_property: paramType.baseType => string @<ParamType-baseType>
|
||||
|
||||
The base type of the parameter. For primitive types (e.g. ``address``, ``uint256``, etc)
|
||||
this is equal to [type](abi-paramtype-type). For arrays, it will be the string ``array`` and for
|
||||
this is equal to [type](ParamType-type). For arrays, it will be the string ``array`` and for
|
||||
a tuple, it will be the string ``tuple``.
|
||||
|
||||
_property: paramType.indexed => boolean @<abi-paramtype-indexed>
|
||||
_property: paramType.indexed => boolean @<ParamType-indexed>
|
||||
|
||||
Whether the parameter has been marked as indexed. This **only** applies
|
||||
to parameters which are part of an [[abi-eventfragment]].
|
||||
to parameters which are part of an [[EventFragment]].
|
||||
|
||||
_property: paramType.arrayChildren => [[abi-paramtype]] @<abi-paramtype-arraychildren>
|
||||
_property: paramType.arrayChildren => [[ParamType]] @<ParamType-arrayChildren>
|
||||
|
||||
The type of children of the array. This is null for for any parameter
|
||||
wjhich is not an array.
|
||||
The type of children of the array. This is null for any parameter
|
||||
which is not an array.
|
||||
|
||||
_property: paramType.arrayLength => number @<abi-paramtype-arraylength>
|
||||
_property: paramType.arrayLength => number @<ParamType-arrayLength>
|
||||
|
||||
The length of the array, or ``-1`` for dynamic-length arrays. This is
|
||||
null for parameters which is not arrays.
|
||||
null for parameters which are not arrays.
|
||||
|
||||
_property: paramType.components => Array<[[abi-paramtype]]> @<abi-paramtype-components>
|
||||
_property: paramType.components => Array<[[ParamType]]> @<ParamType-components>
|
||||
|
||||
The components of a tuple. This is null for non-tuple parameters.
|
||||
|
||||
@@ -232,10 +232,10 @@ _property: paramType.format([ outputType = sighash ])
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.ParamType.from(objectOrString) => [[abi-paramtype]] @<abi-paramtype-from> @SRC<abi/fragments:ParamType.from>
|
||||
_property: ethers.utils.ParamType.from(objectOrString) => [[ParamType]] @<ParamType-from> @SRC<abi/fragments:ParamType.from>
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.ParamType.isParamType(object) => boolean @<abi-paramtype-isparamtype> @SRC<abi/fragments:ParamType.isParamType>
|
||||
_property: ethers.utils.ParamType.isParamType(object) => boolean @<ParamType-isParamType> @SRC<abi/fragments:ParamType.isParamType>
|
||||
|
||||
Tra la la...
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
_section: Application Binary Interface @NAV<ABI>
|
||||
|
||||
An **Application Binary Interface** (ABI) is a collection of
|
||||
[Fragments](abi-fragment) which specify how to interact with
|
||||
[Fragments](Fragment) which specify how to interact with
|
||||
various components of a Contract.
|
||||
|
||||
An [[abi-interface]] helps organize Fragments by type as well
|
||||
An [[Interface]] helps organize Fragments by type as well
|
||||
as provides the functionality required to encode, decode and
|
||||
work with each component.
|
||||
|
||||
Most developers will not require this low-level access to encoding
|
||||
and decoding the binary data on the network and will most likely
|
||||
use a [[contract]] which provides a more convenient interface. Some
|
||||
use a [[Contract]] which provides a more convenient interface. Some
|
||||
framework, tool developers or developers using advanced techniques
|
||||
may find these classes and utilities useful.
|
||||
|
||||
_toc:
|
||||
interface
|
||||
coder
|
||||
formats
|
||||
fragments
|
||||
interface
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
_section: Interface @<abi-interface> @SRC<abi/interface:class.Interface>
|
||||
_section: Interface @<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
|
||||
language, which other languages have adopted to remain compatible with
|
||||
existing deployed contracts.
|
||||
|
||||
The EVM itself does not understand what the ABI is. It is simply an agreed
|
||||
@@ -12,7 +12,7 @@ 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
|
||||
_subsection: Creating Instances @<Interface--creating>
|
||||
|
||||
_property: new ethers.utils.Interface(abi) @SRC<abi/interface:constructor.Interface>
|
||||
Create a new **Interface** from a JSON string or object representing
|
||||
@@ -26,22 +26,22 @@ 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
|
||||
_subsection: Properties @<Interface--properties>
|
||||
|
||||
_property: interface.fragments => Array<[[abi-fragment]]>
|
||||
All the [Fragments](abi-fragment) in the interface.
|
||||
_property: interface.fragments => Array<[[Fragment]]>
|
||||
All the [Fragments](Fragment) in the interface.
|
||||
|
||||
_property: interface.events => Array<[[abi-eventfragment]]>
|
||||
All the [Event Fragments](abi-eventfragment) in the interface.
|
||||
_property: interface.events => Array<[[EventFragment]]>
|
||||
All the [Event Fragments](EventFragment) in the interface.
|
||||
|
||||
_property: interface.functions => Array<[[abi-functionfragment]]>
|
||||
All the [Function Fragments](abi-functionfragment) in the interface.
|
||||
_property: interface.functions => Array<[[FunctionFragment]]>
|
||||
All the [Function Fragments](FunctionFragment) in the interface.
|
||||
|
||||
_property: interface.deploy => [[abi-constructorfragment]]
|
||||
The [Constructor Fragments](abi-constructorfragment) for the interface.
|
||||
_property: interface.deploy => [[ConstructorFragment]]
|
||||
The [Constructor Fragments](ConstructorFragment) for the interface.
|
||||
|
||||
|
||||
_subsection: Formatting
|
||||
_subsection: Formatting @<Interface--formatting>
|
||||
|
||||
_property: interface.format( [ format ]) => string | Array<string> @SRC<abi/interface>
|
||||
Return the formatted **Interface**. If the format type is ``json`` a
|
||||
@@ -49,87 +49,87 @@ single string is returned, otherwise an Array of the human-readable
|
||||
strings is returned.
|
||||
|
||||
|
||||
_subsection: Fragment Access
|
||||
_subsection: Fragment Access @<Interface--fragments>
|
||||
|
||||
_property: interface.getFunction(fragment) => [[abi-functionfragment]] @SRC<abi/interface>
|
||||
Returns the [[abi-functionfragment]] for //fragment// (see [[abi-fragmentid]]).
|
||||
_property: interface.getFunction(fragment) => [[FunctionFragment]] @SRC<abi/interface>
|
||||
Returns the [[FunctionFragment]] for //fragment// (see [[Interface--specifying-fragments]]).
|
||||
|
||||
_property: interface.getEvent(fragment) => [[abi-eventfragment]] @SRC<abi/interface>
|
||||
Returns the [[abi-eventfragment]] for //fragment// (see [[abi-fragmentid]]).
|
||||
_property: interface.getEvent(fragment) => [[EventFragment]] @SRC<abi/interface>
|
||||
Returns the [[EventFragment]] for //fragment// (see [[Interface--specifying-fragments]]).
|
||||
|
||||
|
||||
_subsection: Signature and Topic Hashes
|
||||
_subsection: Signature and Topic Hashes @<Interface--selectors>
|
||||
|
||||
_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.getSighash(fragment) => string<[[DataHexString]]<4>> @SRC<abi/interface:method.Interface.getSighash>
|
||||
Return the sighash (or Function Selector) for //fragment// (see [[Interface--specifying-fragments]]).
|
||||
|
||||
_property: interface.getEventTopic(fragment) => string<[[datahexstring]]<32>> @SRC<abi/interface:method.Interface.getEventTopic>
|
||||
Return the topic hash 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 [[Interface--specifying-fragments]]).
|
||||
|
||||
|
||||
_subsection: Encoding Data
|
||||
_subsection: Encoding Data @<Interface--encoding>
|
||||
|
||||
_property: interface.encodeDeploy([ values ]) => string<[[datahexstring]]> @SRC<abi/interface>
|
||||
_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//.
|
||||
(see [[Interface--specifying-fragments]]) for the given //values//.
|
||||
|
||||
Each //topic// is a 32 byte (64 nibble) [[datahexstring]].
|
||||
Each //topic// is a 32 byte (64 nibble) [[DataHexString]].
|
||||
|
||||
_property: interface.encodeFunctionData(fragment [ , values ]) => string<[[datahexstring]]> @SRC<abi/interface>
|
||||
_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//.
|
||||
//fragment// (see [[Interface--specifying-fragments]]) for the given //values//.
|
||||
|
||||
_property: interface.encodeFunctionResult(fragment [ , values ]) => string<[[datahexstring]]> @SRC<abi/interface>
|
||||
_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//.
|
||||
//fragment// (see [[Interface--specifying-fragments]]) for the given //values//.
|
||||
|
||||
Most developers will not need this method, but may be useful for authors of a mock blockchain.
|
||||
|
||||
|
||||
_subsection: Decoding Data
|
||||
_subsection: Decoding Data @<Interface--decoding>
|
||||
|
||||
_property: interface.decodeEventLog(fragment, data [ , topics ]) => [[abi-result]] @SRC<abi/interface>
|
||||
_property: interface.decodeEventLog(fragment, data [ , topics ]) => [[Result]] @SRC<abi/interface>
|
||||
Returns the decoded event values from an event log for
|
||||
//fragment// (see [[abi-fragmentid]]) for the given //data//
|
||||
//fragment// (see [[Interface--specifying-fragments]]) 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>
|
||||
_property: interface.decodeFunctionData(fragment, data) => [[Result]] @SRC<abi/interface>
|
||||
Returns the decoded values from transaction data for
|
||||
//fragment// (see [[abi-fragmentid]]) for the given //data//.
|
||||
//fragment// (see [[Interface--specifying-fragments]]) 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>
|
||||
_property: interface.decodeFunctionResult(fragment, data) => [[Result]] @SRC<abi/interface>
|
||||
Returns the decoded values from the result of a call for
|
||||
//fragment// (see [[abi-fragmentid]]) for the given //data//.
|
||||
//fragment// (see [[Interface--specifying-fragments]]) for the given //data//.
|
||||
|
||||
|
||||
_subsection: Parsing
|
||||
_subsection: Parsing @<Interface--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>
|
||||
_property: interface.parseLog(log) => [[LogDescription]] @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>
|
||||
_property: interface.parseTransaction(transaction) => [[TransactionDescription]] @SRC<abi/interface>
|
||||
Search for the function that matches the //transaction// data sighash
|
||||
and parse the transaction properties.
|
||||
|
||||
|
||||
_subsection: Types
|
||||
_subsection: Types @<Interface--types>
|
||||
|
||||
_heading: Result @<abi-result> @INHERIT<Array<any>>
|
||||
_heading: Result @<Result> @INHERIT<Array\<any\>>
|
||||
|
||||
A **Result** is an array, so each value can be accessed as a positional
|
||||
argument.
|
||||
@@ -142,13 +142,13 @@ 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>
|
||||
_heading: LogDescription @<LogDescription>
|
||||
|
||||
_property: logDescription.args => [[abi-result]]
|
||||
_property: logDescription.args => [[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.eventFragment => [[EventFragment]]
|
||||
The [[EventFragment]] which matches the topic in the Log.
|
||||
|
||||
_property: logDescription.name => string
|
||||
The event name. (e.g. ``Transfer``)
|
||||
@@ -160,14 +160,14 @@ _property: logDescription.topic => string
|
||||
The topic hash.
|
||||
|
||||
|
||||
_heading: TransactionDescription @<abi-transaction>
|
||||
_heading: TransactionDescription @<TransactionDescription>
|
||||
|
||||
_property: transactionDescription.args => [[abi-result]]
|
||||
_property: transactionDescription.args => [[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.functionFragment => [[FunctionFragment]]
|
||||
The [[FunctionFragment]] which matches the sighash in the transaction data.
|
||||
|
||||
_property: transactionDescription.name => string
|
||||
The name of the function. (e.g. ``transfer``)
|
||||
@@ -178,11 +178,11 @@ 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]]
|
||||
_property: transactionDescription.value => [[BigNumber]]
|
||||
The value from the transaction.
|
||||
|
||||
|
||||
_subsection: Specifying Fragments @<abi-fragmentid>
|
||||
_subsection: Specifying Fragments @<Interface--specifying-fragments>
|
||||
|
||||
When specifying a fragment to any of the functions in an **Interface**,
|
||||
any of the following may be used:
|
||||
@@ -193,4 +193,4 @@ any of the following may be used:
|
||||
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]]
|
||||
- A [[Fragment]]
|
||||
|
||||
@@ -9,7 +9,7 @@ _subsection: Address Formats @<address-formats>
|
||||
|
||||
_heading: Address @<address>
|
||||
|
||||
An **Address** is a [[datahexstring]] of 20 bytes (40 nibbles), with optional
|
||||
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
|
||||
@@ -39,25 +39,25 @@ accepts an address can receive an ICAP address, and it will be converted interna
|
||||
To convert an address into the ICAP format, see [getIcapAddress](utils-getIcapAddress).
|
||||
|
||||
|
||||
_subsection: Converting and Verifying @<urils--address-basic>
|
||||
_subsection: Converting and Verifying @<utils--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
|
||||
the checksum is invalid, an InvalidArgument Error is throw.
|
||||
If //address// is an invalid 40-nibble [[HexString]] or if it contains mixed case and
|
||||
the checksum is invalid, an [INVALID_ARGUMENT](errors--invalid-argument) Error is thrown.
|
||||
|
||||
The value of //address// may be any supported address format.
|
||||
|
||||
_property: ethers.utils.getIcapAddress(address) => string<[IcapAddress](address-icap)> @<utils-getIcapAddress> @SRC<address>
|
||||
Returns //address// as an [ICAP address](link-icap).
|
||||
Supports the same restrictions as [utils.getAddress](utils-getAddress).
|
||||
Supports the same restrictions as [getAddress](utils-getAddress).
|
||||
|
||||
_property: ethers.utils.isAddress(address) => boolean @<utils-isAddress> @SRC<address>
|
||||
Returns true if //address// is valid (in any supported format).
|
||||
|
||||
|
||||
_subsection: Derivation @<utils--address-computation>
|
||||
_subsection: Derivation @<utils--address-derivation>
|
||||
|
||||
_property: ethers.utils.computeAddress(publicOrPrivateKey) => string<[[address]]> @<utils-computeAddress> @SRC<transactions>
|
||||
Returns the address for //publicOrPrivateKey//. A public key may be
|
||||
|
||||
@@ -1,53 +1,33 @@
|
||||
_section: BigNumber @<bignumber>
|
||||
_section: BigNumber @<BigNumber>
|
||||
|
||||
Many operations in Ethereum operation on numbers which are
|
||||
[outside the range of safe values](notes-safenumbers) to use
|
||||
[outside the range of safe values](BigNumber--notes-safenumbers) to use
|
||||
in JavaScript.
|
||||
|
||||
A **BigNumber** is an object which safely allows mathematic operations
|
||||
A **BigNumber** is an object which safely allows mathematical 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
|
||||
_subsection: Types @<BigNumber--types>
|
||||
|
||||
_code: CommonJS @lang<script>
|
||||
|
||||
// From the Umbrella ethers package...
|
||||
const { BigNumber } = require("ethers");
|
||||
|
||||
// From the bignumber pacakge...
|
||||
const { BigNumber } = require("@ethersproject/bignumber");
|
||||
|
||||
|
||||
_code: ES6 and TypeScript CommonJS @lang<script>
|
||||
|
||||
// From the Umbrella ethers package...
|
||||
import { BigNumber } from "ethers";
|
||||
|
||||
// From the bignumber pacakge...
|
||||
import { BigNumber } from "@ethersproject/bignumber";
|
||||
|
||||
|
||||
_subsection: Types
|
||||
|
||||
_heading: BigNumberish @<bignumberish>
|
||||
_heading: BigNumberish @<BigNumberish>
|
||||
|
||||
Many functions and methods in this library take in values which
|
||||
can be non-ambiguously and safely converted to a BigNumber. These
|
||||
values can be sepcified as:
|
||||
values can be specified as:
|
||||
|
||||
_definition: **//string//**
|
||||
A [hexstring](hexstring) or a decimal string, either of which may
|
||||
A [[HexString]] or a decimal string, either of which may
|
||||
be negative.
|
||||
|
||||
_definition: **//BytesLike//**
|
||||
A [BytesLike](byteslike) Object, such as an Array or Uint8Array.
|
||||
A [[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](link-js-maxsafe) for JavaScript numbers.
|
||||
@@ -57,11 +37,11 @@ A JavaScript [BigInt](link-js-bigint)
|
||||
object, on environments that support BigInt.
|
||||
|
||||
|
||||
_subsection: Creating Instances
|
||||
_subsection: Creating Instances @<BigNumber--creating>
|
||||
|
||||
The constructor of BigNumber cannot be called directly. Instead, Use the static ``BigNumber.from``.
|
||||
|
||||
_property: ethers.BigNumber.from(aBigNumberish) => [[bignumber]]
|
||||
_property: ethers.BigNumber.from(aBigNumberish) => [[BigNumber]]
|
||||
Returns an instance of a **BigNumber** for //aBigNumberish//.
|
||||
|
||||
_heading: Examples: @<>
|
||||
@@ -72,11 +52,11 @@ _code: @lang<javascript>
|
||||
BigNumber.from("42")
|
||||
//!
|
||||
|
||||
// From a hexstring...
|
||||
// From a HexString...
|
||||
BigNumber.from("0x2a")
|
||||
//!
|
||||
|
||||
// From a negative hexstring...
|
||||
// From a negative HexString...
|
||||
BigNumber.from("-0x2a")
|
||||
//!
|
||||
|
||||
@@ -108,7 +88,7 @@ BigNumber.from(Number.MAX_SAFE_INTEGER);
|
||||
//! error
|
||||
|
||||
|
||||
_subsection: Methods
|
||||
_subsection: Methods @<BigNumber--methods>
|
||||
|
||||
The BigNumber class is immutable, so no operations can change the value
|
||||
it represents.
|
||||
@@ -116,86 +96,86 @@ it represents.
|
||||
|
||||
_heading: Math Operations
|
||||
|
||||
_property: bignumber.add(otherValue) => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //bignumber// **+** //otherValue//.
|
||||
_property: BigNumber.add(otherValue) => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //BigNumber// **+** //otherValue//.
|
||||
|
||||
_property: bignumber.sub(otherValue) => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //bignumber// **-** //otherValue//.
|
||||
_property: BigNumber.sub(otherValue) => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //BigNumber// **-** //otherValue//.
|
||||
|
||||
_property: bignumber.mul(otherValue) => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //bignumber// **×** //otherValue//.
|
||||
_property: BigNumber.mul(otherValue) => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //BigNumber// **×** //otherValue//.
|
||||
|
||||
_property: bignumber.div(divisor) => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //bignumber// **÷** //divisor//.
|
||||
_property: BigNumber.div(divisor) => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //BigNumber// **÷** //divisor//.
|
||||
|
||||
_property: bignumber.mod(divisor) => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of the **remainder** of //bignumber// ÷ //divisor//.
|
||||
_property: BigNumber.mod(divisor) => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of the **remainder** of //BigNumber// ÷ //divisor//.
|
||||
|
||||
_property: bignumber.pow(exponent) => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //bignumber// to the power of //exponent//.
|
||||
_property: BigNumber.pow(exponent) => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //BigNumber// to the power of //exponent//.
|
||||
|
||||
_property: bignumber.abs() => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the absolute value of //bignumber//.
|
||||
_property: BigNumber.abs() => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the absolute value of //BigNumber//.
|
||||
|
||||
_property: bignumber.mask(bitcount) => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //bignumber// with bits beyond
|
||||
_property: BigNumber.mask(bitcount) => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //BigNumber// with bits beyond
|
||||
the //bitcount// least significant bits set to zero.
|
||||
|
||||
|
||||
_heading: Two's Compliment
|
||||
_heading: Two's Complement
|
||||
|
||||
[Two's Complicment](link-wiki-twoscomplement)
|
||||
[Two's Complement](link-wiki-twoscomplement)
|
||||
is an elegant method used to encode and decode fixed-width signed values
|
||||
while efficiently preserving mathematic operations.
|
||||
while efficiently preserving mathematical operations.
|
||||
Most users will not need to interact with these.
|
||||
|
||||
_property: bignumber.fromTwos(bitwidth) => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //bignumber// converted from twos-compliment with //bitwidth//.
|
||||
_property: BigNumber.fromTwos(bitwidth) => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //BigNumber// converted from twos-complement with //bitwidth//.
|
||||
|
||||
_property: bignumber.toTwos(bitwidth) => [[bignumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //bignumber// converted to twos-compliment with //bitwidth//.
|
||||
_property: BigNumber.toTwos(bitwidth) => [[BigNumber]] @SRC<bignumber>
|
||||
Returns a BigNumber with the value of //BigNumber// converted to twos-complement with //bitwidth//.
|
||||
|
||||
|
||||
_heading: Comparison and Equivalence
|
||||
|
||||
_property: bignumber.eq(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //bignumber// is equal to //otherValue//.
|
||||
_property: BigNumber.eq(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //BigNumber// is equal to //otherValue//.
|
||||
|
||||
_property: bignumber.lt(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //bignumber// **<** //otherValue//.
|
||||
_property: BigNumber.lt(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //BigNumber// **<** //otherValue//.
|
||||
|
||||
_property: bignumber.lte(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //bignumber// **≤** //otherValue//.
|
||||
_property: BigNumber.lte(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //BigNumber// **≤** //otherValue//.
|
||||
|
||||
_property: bignumber.gt(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //bignumber// **>** //otherValue//.
|
||||
_property: BigNumber.gt(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //BigNumber// **>** //otherValue//.
|
||||
|
||||
_property: bignumber.gte(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //bignumber// **≥** //otherValue//.
|
||||
_property: BigNumber.gte(otherValue) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //BigNumber// **≥** //otherValue//.
|
||||
|
||||
_property: bignumber.isZero() => boolean @SRC<bignumber>
|
||||
Returns true if and only if the value of //bignumber// is zero.
|
||||
_property: BigNumber.isZero() => boolean @SRC<bignumber:BigNumber.isZero>
|
||||
Returns true if and only if the value of //BigNumber// is zero.
|
||||
|
||||
|
||||
_heading: Conversion
|
||||
|
||||
_property: bignumber.toNumber() => number @SRC<bignumber>
|
||||
Returns the value of //bignumber// as a JavaScript value.
|
||||
_property: BigNumber.toNumber() => number @SRC<bignumber>
|
||||
Returns the value of //BigNumber// as a JavaScript value.
|
||||
|
||||
This will **throw an error**
|
||||
if the value is greater than or equal to //Number.MAX_SAFE_INTEGER// or less than or
|
||||
equal to //Number.MIN_SAFE_INTEGER//.
|
||||
|
||||
_property: bignumber.toString() => string @SRC<bignumber:BigNumber.toString>
|
||||
Returns the value of //bignumber// as a base-10 string.
|
||||
_property: BigNumber.toString() => string @SRC<bignumber:BigNumber.toString>
|
||||
Returns the value of //BigNumber// as a base-10 string.
|
||||
|
||||
_property: bignumber.toHexString() => string<[[datahexstring]]> @SRC<bignumber:BigNumber.toHexString>
|
||||
Returns the value of //bignumber// as a base-16, ``0x``-prefixed [[datahexstring]].
|
||||
_property: BigNumber.toHexString() => string<[[DataHexString]]> @SRC<bignumber:BigNumber.toHexString>
|
||||
Returns the value of //BigNumber// as a base-16, ``0x``-prefixed [[DataHexString]].
|
||||
|
||||
|
||||
_heading: Inspection
|
||||
|
||||
_property: ethers.BigNumnber.isBigNumber(object) => boolean @SRC<bignumber>
|
||||
_property: ethers.BigNumber.isBigNumber(object) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the //object// is a BigNumber object.
|
||||
|
||||
|
||||
@@ -210,12 +190,12 @@ a.mul(b);
|
||||
//!
|
||||
|
||||
|
||||
_subsection: Notes
|
||||
_subsection: Notes @<BigNumber--notes>
|
||||
|
||||
This section is a for a couple of questions that come up frequently.
|
||||
|
||||
|
||||
_heading: Why can't I just use numbers? @<notes-safenumbers>
|
||||
_heading: Why can't I just use numbers? @<BigNumber--notes-safenumbers>
|
||||
|
||||
The first problem many encounter when dealing with Ethereum is
|
||||
the concept of numbers. Most common currencies are broken down
|
||||
@@ -240,10 +220,10 @@ _code: @lang<javascript>
|
||||
_null:
|
||||
|
||||
To remedy this, all numbers (which can be large) are stored
|
||||
and manipulated as [Big Numbers](bignumber).
|
||||
and manipulated as [Big Numbers](BigNumber).
|
||||
|
||||
The functions [parseEther( etherString )](utils-parseether) and
|
||||
[formatEther( wei )](utils-formatether) can be used to convert
|
||||
The functions [parseEther( etherString )](utils-parseEther) and
|
||||
[formatEther( wei )](utils-formatEther) can be used to convert
|
||||
between string representations, which are displayed to or entered
|
||||
by the user and Big Number representations which can have
|
||||
mathematical operations handled safely.
|
||||
@@ -252,10 +232,10 @@ 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,
|
||||
has chosen 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
|
||||
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.
|
||||
|
||||
@@ -263,10 +243,10 @@ 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
|
||||
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.
|
||||
be easier 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
|
||||
@@ -290,7 +270,7 @@ various purposes.
|
||||
|
||||
_heading: Allow us to set a global Big Number library?
|
||||
|
||||
Another comment that comes up frequently is tha desire to specify a
|
||||
Another comment that comes up frequently is the desire to specify a
|
||||
global user-defined Big Number library, which all functions would
|
||||
return.
|
||||
|
||||
@@ -302,6 +282,6 @@ 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
|
||||
But, the [[BigNumber]] prototype is exposed, so you can always add a
|
||||
``toMyCustomBigNumber()`` method to all [[BigNumber]]'s globally
|
||||
which is safe.
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
_section: Byte Manipulation
|
||||
|
||||
Tra la la...
|
||||
While there are many high-level APIs for interacting with
|
||||
Ethereum, such as [Contracts](Contract) and [Providers](Provider),
|
||||
a lot of the low level access requires byte manipulation
|
||||
operations.
|
||||
|
||||
Many of these operations are used internally, but can also be
|
||||
used to help normalize binary data representations from the
|
||||
output of various functions and methods.
|
||||
|
||||
_subsection: Types
|
||||
|
||||
_heading: Bytes @<bytes>
|
||||
_heading: Bytes @<Bytes>
|
||||
|
||||
A **Bytes** is any object which is an
|
||||
[Array](link-js-array) or [TypedArray](link-js-typedarray) with
|
||||
@@ -12,39 +19,38 @@ each value in the valid byte range (i.e. between 0 and 255 inclusive),
|
||||
or is an Object with a ``length`` property where each indexed property
|
||||
is in the valid byte range.
|
||||
|
||||
_heading: BytesLike @<byteslike>
|
||||
_heading: BytesLike @<BytesLike>
|
||||
|
||||
A **BytesLike** can be either a [[bytes]] or a [[datahexstring]].
|
||||
A **BytesLike** can be either a [[Bytes]] or a [[DataHexString]].
|
||||
|
||||
_heading: DataHexstring @<datahexstring>
|
||||
_heading: DataHexString @<DataHexString>
|
||||
|
||||
A **DataHexstring** is identical to a [[hexstring]] except that it has
|
||||
A **DataHexstring** is identical to a [[HexString]] except that it has
|
||||
an even number of nibbles, and therefore is a valid representation of
|
||||
binary data as a string.
|
||||
|
||||
_heading: Hexstring @<hexstring>
|
||||
_heading: HexString @<HexString>
|
||||
|
||||
A **Hexstring** is a string which has a ``0x`` prefix followed by any
|
||||
number of nibbles (i.e. case-insensitive hexidecumal characters, ``0-9`` and ``a-f``).
|
||||
number of nibbles (i.e. case-insensitive hexadecimal characters, ``0-9`` and ``a-f``).
|
||||
|
||||
_heading: Signature @<signature>
|
||||
_heading: Signature @<Signature>
|
||||
|
||||
- **r** and **s** --- The x co-ordinate of **r** and the **s** value of the signature
|
||||
- **v** --- The parity of the y co-ordinate of **r**
|
||||
- **_vs** --- The [compact representation](link-eip-2098) of the **s** and **v**
|
||||
- **recoveryParam** --- The normalized (i.e. 0 or 1) value of **v**
|
||||
|
||||
_heading: Flat-Format Signature @<signature-flat>
|
||||
_heading: Raw Signature @<signature-raw> @inherit<string\<[[DataHexString]]\<65\>\>>
|
||||
|
||||
A **Flat-Format Signature** is a common Signature format where
|
||||
the r, s and v are concanenated into a 65 byte (130 nibble)
|
||||
[[datahexstring]].
|
||||
A **Raw Signature** is a common Signature format where the r, s and v are
|
||||
concatenated into a 65 byte (130 nibble) [[DataHexString]].
|
||||
|
||||
|
||||
_heading: SignatureLike @<signaturelike>
|
||||
_heading: SignatureLike @<SignatureLike>
|
||||
|
||||
A **SignatureLike** is similar to a [[signature]], except redundant properties
|
||||
may be omitted or it may be a [[signature-flat]].
|
||||
A **SignatureLike** is similar to a [[Signature]], except redundant properties
|
||||
may be omitted or it may be a [[signature-raw]].
|
||||
|
||||
For example, if **_vs** is specified, **s** and **v** may be omitted. Likewise,
|
||||
if **recoveryParam** is provided, **v** may be omitted (as in these cases the
|
||||
@@ -53,33 +59,31 @@ missing values can be computed).
|
||||
|
||||
_subsection: Inspection
|
||||
|
||||
_property: ethers.utils.isBytes(object) => boolean @<utils-isbytes> @SRC<bytes>
|
||||
Returns true if and only if //object// is a valid [[bytes]].
|
||||
_property: ethers.utils.isBytes(object) => boolean @<utils-isBytes> @SRC<bytes>
|
||||
Returns true if and only if //object// is a valid [[Bytes]].
|
||||
|
||||
_property: ethers.utils.isBytesLike(object) => boolean @<utils-isbyteslike> @SRC<bytes>
|
||||
Returns true if and only if //object// is a [[bytes]] or [[datahexstring]].
|
||||
_property: ethers.utils.isBytesLike(object) => boolean @<utils-isBytesLike> @SRC<bytes>
|
||||
Returns true if and only if //object// is a [[Bytes]] or [[DataHexString]].
|
||||
|
||||
_property: ethers.utils.isHexString(object, [ length ] ) => boolean @<utils-ishexstring> @SRC<bytes>
|
||||
_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
|
||||
If //length// is specified and //object// is not a valid [[DataHexString]] of
|
||||
//length// bytes, an InvalidArgument error is thrown.
|
||||
|
||||
|
||||
_subsection: Converting between Arrays and Hexstrings
|
||||
|
||||
_property: ethers.utils.arrayify(datahexstringOrArrayish [ , options ]) => Uint8Array @<utils-arrayify> @SRC<bytes>
|
||||
Converts //datahexstringOrArrayish// to a Uint8Array.
|
||||
_property: ethers.utils.arrayify(DataHexStringOrArrayish [ , options ]) => Uint8Array @<utils-arrayify> @SRC<bytes>
|
||||
Converts //DataHexStringOrArrayish// to a Uint8Array.
|
||||
|
||||
_property: ethers.utils.hexlify(hexstringOrArrayish) => string<[[datahexstring]]> @<utils-hexlify> @SRC<bytes>
|
||||
Converts //hexstringOrArrayish// to a [[datahexstring]].
|
||||
_property: ethers.utils.hexlify(hexstringOrArrayish) => string<[[DataHexString]]> @<utils-hexlify> @SRC<bytes>
|
||||
Converts //hexstringOrArrayish// to a [[DataHexString]].
|
||||
|
||||
_property: ethers.utils.hexValue(aBigNumberish) => string<[[hexstring]]> @<utils-hexvalue> @SRC<bytes>
|
||||
Converts //aBigNumberish// to a [[hexstring]], with no __unnecessary__ leading
|
||||
_property: ethers.utils.hexValue(aBigNumberish) => string<[[HexString]]> @<utils-hexValue> @SRC<bytes>
|
||||
Converts //aBigNumberish// to a [[HexString]], with no __unnecessary__ leading
|
||||
zeros.
|
||||
|
||||
_heading: Examples
|
||||
|
||||
_code: @lang<javascript>
|
||||
_code: Examples @lang<javascript>
|
||||
|
||||
// Convert a hexstring to a Uint8Array
|
||||
arrayify("0x1234")
|
||||
@@ -109,13 +113,13 @@ hexValue([ 1, 2 ])
|
||||
_subsection: Array Manipulation
|
||||
|
||||
_property: ethers.utils.concat(arrayOfBytesLike) => Uint8Array @<utils-concat> @SRC<bytes>
|
||||
Concatenates all the [[byteslike]] in //arrayOfBytesLike// into a single Uint8Array.
|
||||
Concatenates all the [[BytesLike]] in //arrayOfBytesLike// into a single Uint8Array.
|
||||
|
||||
_property: ethers.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: ethers.utils.zeroPad(aBytesLike, length) => Uint8Array @<utils-zeropad> @SRC<bytes>
|
||||
Retutns a Uint8Array of the data in //aBytesLike// with ``0`` bytes prepended to
|
||||
_property: ethers.utils.zeroPad(aBytesLike, length) => Uint8Array @<utils-zeroPad> @SRC<bytes>
|
||||
Returns a Uint8Array of the data in //aBytesLike// with ``0`` bytes prepended to
|
||||
//length// bytes long.
|
||||
|
||||
If //aBytesLike// is already longer than //length// bytes long, an InvalidArgument
|
||||
@@ -124,23 +128,23 @@ error will be thrown.
|
||||
|
||||
_subsection: Hexstring Manipulation
|
||||
|
||||
_property: ethers.utils.hexConcat(arrayOfBytesLike) => string<[[datahexstring]]> @<utils-hexconcat> @SRC<bytes>
|
||||
Concatenates all the [[byteslike]] in //arrayOfBytesLike// into a single [[datahexstring]]
|
||||
_property: ethers.utils.hexConcat(arrayOfBytesLike) => string<[[DataHexString]]> @<utils-hexConcat> @SRC<bytes>
|
||||
Concatenates all the [[BytesLike]] in //arrayOfBytesLike// into a single [[DataHexString]]
|
||||
|
||||
_property: ethers.utils.hexDataLength(aBytesLike) => string<[[datahexstring]]> @<utils-hexdatalength> @SRC<bytes>
|
||||
_property: ethers.utils.hexDataLength(aBytesLike) => string<[[DataHexString]]> @<utils-hexDataLength> @SRC<bytes>
|
||||
Returns the length (in bytes) of //aBytesLike//.
|
||||
|
||||
_property: ethers.utils.hexDataSlice(aBytesLike, offset [ , endOffset ] ) => string<[[datahexstring]]> @<utils-hexdataslice> @SRC<bytes>
|
||||
Returns a [[datahexstring]] representation of a slice of //aBytesLike//, from
|
||||
_property: ethers.utils.hexDataSlice(aBytesLike, offset [ , endOffset ] ) => string<[[DataHexString]]> @<utils-hexDataSlice> @SRC<bytes>
|
||||
Returns a [[DataHexString]] representation of a slice of //aBytesLike//, from
|
||||
//offset// (in bytes) to //endOffset// (in bytes). If //endOffset// is
|
||||
omitted, the length of //aBytesLike// is used.
|
||||
|
||||
_property: ethers.utils.hexStripZeros(aBytesLike) => string<[[hexstring]]> @<utils-hexstripzeros> @SRC<bytes>
|
||||
Returns a [[hexstring]] representation of //aBytesLike// with all
|
||||
_property: ethers.utils.hexStripZeros(aBytesLike) => string<[[HexString]]> @<utils-hexStripZeros> @SRC<bytes>
|
||||
Returns a [[HexString]] representation of //aBytesLike// with all
|
||||
leading zeros removed.
|
||||
|
||||
_property: ethers.utils.hexZeroPad(aBytesLike, length) => string<[[datahexstring]]> @<utils-hexzeropad> @SRC<bytes>
|
||||
Returns a [[datahexstring]] representation of //aBytesLike// padded to //length// bytes.
|
||||
_property: ethers.utils.hexZeroPad(aBytesLike, length) => string<[[DataHexString]]> @<utils-hexZeroPad> @SRC<bytes>
|
||||
Returns a [[DataHexString]] representation of //aBytesLike// padded to //length// bytes.
|
||||
|
||||
If //aBytesLike// is already longer than //length// bytes long, an InvalidArgument
|
||||
error will be thrown.
|
||||
@@ -148,20 +152,20 @@ error will be thrown.
|
||||
|
||||
_subsection: Signature Conversion
|
||||
|
||||
_property: ethers.utils.joinSignature(aSignatureLike) => string<[FlatSignature](signature-flat)> @<utils-joinsignature> @SRC<bytes>
|
||||
Return the flat-format of //aSignaturelike//, which is 65 bytes (130 nibbles)
|
||||
_property: ethers.utils.joinSignature(aSignatureLike) => string<[RawSignature](signature-raw)> @<utils-joinSignature> @SRC<bytes>
|
||||
Return the raw-format of //aSignaturelike//, which is 65 bytes (130 nibbles)
|
||||
long, concatenating the **r**, **s** and (normalized) **v** of a Signature.
|
||||
|
||||
_property: ethers.utils.splitSignature(aSignatureLikeOrBytesLike) => [[signature]] @<utils-splitsignature> @SRC<bytes>
|
||||
Return the full expanded-format of //aSignaturelike// or a flat-format [[datahexstring]].
|
||||
_property: ethers.utils.splitSignature(aSignatureLikeOrBytesLike) => [[Signature]] @<utils-splitSignature> @SRC<bytes>
|
||||
Return the full expanded-format of //aSignaturelike// or a raw-format [[DataHexString]].
|
||||
Any missing properties will be computed.
|
||||
|
||||
_subsection: Random Bytes
|
||||
|
||||
_property: ethers.utils.randomBytes(length) => Uint8Array @<utils-randombytes> @SRC<random/index>
|
||||
_property: ethers.utils.randomBytes(length) => Uint8Array @<utils-randomBytes> @SRC<random/random>
|
||||
Return a new Uint8Array of //length// random bytes.
|
||||
|
||||
_property: ethers.utils.shuffled(array) => Array<any> @<utils.shuffled> @SRC<random>
|
||||
_property: ethers.utils.shuffled(array) => Array<any> @<utils-shuffled> @SRC<random>
|
||||
Return a copy of //array// shuffled using [[link-wiki-shuffle]].
|
||||
|
||||
_code: Examples @lang<javascript>
|
||||
@@ -169,10 +173,12 @@ _code: Examples @lang<javascript>
|
||||
utils.randomBytes(8)
|
||||
//!
|
||||
|
||||
const foo = [ 1, 2, 3, 4, 5, 6, 7 ];
|
||||
utils.shuffled(foo);
|
||||
const data = [ 1, 2, 3, 4, 5, 6, 7 ];
|
||||
|
||||
// Returns a new Array
|
||||
utils.shuffled(data);
|
||||
//!
|
||||
|
||||
// The original array is unscathed...
|
||||
foo
|
||||
// The Original is unscathed...
|
||||
data
|
||||
//!
|
||||
|
||||
@@ -2,48 +2,41 @@ _section: Constants @<constants>
|
||||
|
||||
The **ethers.contants** Object contains commonly used values.
|
||||
|
||||
_heading: Importing
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
const { constants } = require("ethers");
|
||||
const { constants } = require("@ethersproject/constants");
|
||||
|
||||
|
||||
_subsection: Bytes
|
||||
|
||||
_property: ethers.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: ethers.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: ethers.constants.EtherSymbol => string @<constants-ethersymbol> @SRC<constants>
|
||||
_property: ethers.constants.EtherSymbol => string @<constants-EtherSymbol> @SRC<constants>
|
||||
The Ether symbol, **Ξ**.
|
||||
|
||||
|
||||
_subsection: BigNumber
|
||||
|
||||
_property: ethers.constants.NegativeOne => [[bignumber]] @<constants-negativeone> @SRC<constants>
|
||||
_property: ethers.constants.NegativeOne => [[BigNumber]] @<constants-NegativeOne> @SRC<constants>
|
||||
The BigNumber value representing ``"-1"``.
|
||||
|
||||
_property: ethers.constants.Zero => [[bignumber]] @<constants-zero> @SRC<constants>
|
||||
_property: ethers.constants.Zero => [[BigNumber]] @<constants-Zero> @SRC<constants>
|
||||
The BigNumber value representing ``"0"``.
|
||||
|
||||
_property: ethers.constants.One => [[bignumber]] @<constants-one> @SRC<constants>
|
||||
_property: ethers.constants.One => [[BigNumber]] @<constants-One> @SRC<constants>
|
||||
The BigNumber value representing ``"1"``.
|
||||
|
||||
_property: ethers.constants.Two => [[bignumber]] @<constants-two> @SRC<constants>
|
||||
_property: ethers.constants.Two => [[BigNumber]] @<constants-Two> @SRC<constants>
|
||||
The BigNumber value representing ``"2"``.
|
||||
|
||||
_property: ethers.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: ethers.constants.MaxUint256 => [[bignumber]] @<constants-maxuint256> @SRC<constants>
|
||||
_property: ethers.constants.MaxUint256 => [[BigNumber]] @<constants-MaxUint256> @SRC<constants>
|
||||
The BigNumber value representing the maximum ``uint256`` value.
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
_section: Display Logic and Input
|
||||
_section: Display Logic and Input @<display-logic>
|
||||
|
||||
When creating an Application, it is useful to convert between
|
||||
user-friendly strings (usually displaying **ether**) and the
|
||||
@@ -10,18 +10,18 @@ gas prices in gwei for the User Interface, but when sending
|
||||
a transaction, both must be specified in wei.
|
||||
|
||||
The [parseUnits](unit-conversion) will parse a string representing
|
||||
ether, such as ``1.1`` into a [BigNumber](bignumber) in wei, and is
|
||||
ether, such as ``1.1`` into a [BigNumber](BigNumber) in wei, and is
|
||||
useful when a user types in a value, such as sending 1.1 ether.
|
||||
|
||||
The [formatUnits](unit-conversion) will format a [BigNumberish](bignumberish)
|
||||
The [formatUnits](unit-conversion) will format a [BigNumberish](BigNumberish)
|
||||
into a string, which is useful when displaying a balance.
|
||||
|
||||
|
||||
_subsection: Units
|
||||
_subsection: Units @<display-logic--units>
|
||||
|
||||
_heading: Decimal Count
|
||||
|
||||
A **Unit** can be specified as an number, which indicates the
|
||||
A **Unit** can be specified as a number, which indicates the
|
||||
number of decimal places that should be used.
|
||||
|
||||
**Examples:**
|
||||
@@ -29,7 +29,7 @@ number of decimal places that should be used.
|
||||
- 1 ether in wei, has **18** decimal places (i.e. 1 ether represents 10^^18^^ wei)
|
||||
- 1 bitcoin in Satoshi, has **8** decimal places (i.e. 1 bitcoin represents 10^^8^^ satoshi)
|
||||
|
||||
_heading: Named Units
|
||||
_heading: Named Units @<display-logic--named-units>
|
||||
|
||||
There are also several common **Named Units**, in which case their name (as
|
||||
a string) may be used.
|
||||
@@ -46,9 +46,9 @@ _table: @STYLE<compact>
|
||||
| //ether// | 18 |
|
||||
|
||||
|
||||
_subsection: Functions
|
||||
_subsection: Functions @<display-logic--functions>
|
||||
|
||||
_heading: Formatting
|
||||
_heading: Formatting @<display-logic--formatting>
|
||||
|
||||
_property: ethers.utils.commify(value) => string @<utils-commify> @SRC<units>
|
||||
Returns a string with value grouped by 3 digits, separated by ``,``.
|
||||
@@ -56,17 +56,17 @@ Returns a string with value grouped by 3 digits, separated by ``,``.
|
||||
|
||||
_heading: Conversion @<unit-conversion>
|
||||
|
||||
_property: ethers.utils.formatUnits(value [ , unit = "ether" ] ) => string @<utils-formatunits> @SRC<units>
|
||||
_property: ethers.utils.formatUnits(value [ , unit = "ether" ] ) => string @<utils-formatUnits> @SRC<units>
|
||||
Returns a string representation of //value// formatted with //unit//
|
||||
digits (if it is a number) or to the unit specified (if a string).
|
||||
|
||||
_property: ethers.utils.formatEther(value) => string @<utils-formatether> @SRC<units>
|
||||
_property: ethers.utils.formatEther(value) => string @<utils-formatEther> @SRC<units>
|
||||
The equivalent to calling ``formatUnits(value, "ether")``.
|
||||
|
||||
_property: ethers.utils.parseUnits(value [ , unit = "ether" ] ) => [BigNumber](bignumber) @<utils-parseunits> @SRC<units>
|
||||
Returns a [BigNumber](bignumber) representation of //value//, parsed with
|
||||
_property: ethers.utils.parseUnits(value [ , unit = "ether" ] ) => [BigNumber](BigNumber) @<utils-parseUnits> @SRC<units>
|
||||
Returns a [BigNumber](BigNumber) representation of //value//, parsed with
|
||||
//unit// digits (if it is a number) or from the unit specified (if
|
||||
a string).
|
||||
|
||||
_property: ethers.utils.parseEther(value) => [BigNumber](bignumber) @<utils-parseether> @SRC<units>
|
||||
_property: ethers.utils.parseEther(value) => [BigNumber](BigNumber) @<utils-parseEther> @SRC<units>
|
||||
The equivalent to calling ``parseUnits(value, "ether")``.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
_section: Encoding Utilities @<encoding>
|
||||
|
||||
_subsection: Base58 @<bse58> @SRC<basex:Base58>
|
||||
_subsection: Base58 @<Bse58> @SRC<basex:Base58>
|
||||
|
||||
_property: ethers.utils.base58.decode(textData) => Uin8Array
|
||||
Return a typed Uint8Array representation of //textData// decoded using
|
||||
@@ -10,7 +10,7 @@ _property: ethers.utils.base58.encode(aBytesLike) => string
|
||||
Return //aBytesLike// encoded as a string using the base-58 encoding.
|
||||
|
||||
|
||||
_subsection: Base64 @<base64>
|
||||
_subsection: Base64 @<Base64>
|
||||
|
||||
_property: ethers.utils.base64.decode(textData) => Uin8Array @SRC<base64>
|
||||
Return a typed Uint8Array representation of //textData// decoded using
|
||||
@@ -20,22 +20,22 @@ _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>
|
||||
_subsection: Recursive-Length Prefix @<rlp--methods>
|
||||
|
||||
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>
|
||||
_property: ethers.utils.RLP.encode(dataObject) => string<[[DataHexString]]> @<utils-rlpEncode> @SRC<rlp>
|
||||
Encode a structured Data Object into its RLP-encoded representation.
|
||||
|
||||
Each Data component may be an valid [[byteslike]].
|
||||
Each Data component may be a valid [[BytesLike]].
|
||||
|
||||
_property: ethers.utils.RLP.decode(aBytesLike) => [DataObject](rlp-dataobject) @<rlp-decode> @SRC<rlp>
|
||||
_property: ethers.utils.RLP.decode(aBytesLike) => [DataObject](rlp--dataobject) @<utils.rlpDecode> @SRC<rlp>
|
||||
Decode an RLP-encoded //aBytesLike// into its structured Data Object.
|
||||
|
||||
All Data components will be returned as a [[datahexstring]].
|
||||
All Data components will be returned as a [[DataHexString]].
|
||||
|
||||
_heading: Data Object @<rlp-dataobject>
|
||||
_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:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
_section: FixedNumber @<fixednumber>
|
||||
_section: FixedNumber @<FixedNumber>
|
||||
|
||||
A **FixedNumber** is a fixed-width (in bits) number with an internal
|
||||
base-10 divisor, which allows it to represent a decimal fractional
|
||||
@@ -9,53 +9,59 @@ _subsection: Creating Instances
|
||||
The FixedNumber constructor cannot be called directly. There are several
|
||||
static methods for creating a FixedNumber.
|
||||
|
||||
_property: FixedNumber.from(value [ , format = "fixed" ] ) => [[fixednumber]] @SRC<bignumber:FixedNumber.from>
|
||||
_property: FixedNumber.from(value [ , format = "fixed" ] ) => [[FixedNumber]] @SRC<bignumber:FixedNumber.from>
|
||||
Returns an instance of a **FixedNumber** for //value// as a //format//.
|
||||
|
||||
_property: FixedNumber.fromBytes(aBytesLike [ , format = "fixed" ] ) => [[fixednumber]] @SRC<bignumber>
|
||||
_property: FixedNumber.fromBytes(aBytesLike [ , format = "fixed" ] ) => [[FixedNumber]] @SRC<bignumber>
|
||||
Returns an instance of a **FixedNumber** for //value// as a //format//.
|
||||
|
||||
_property: FixedNumber.fromString(value [ , format = "fixed" ] ) => [[fixednumber]] @SRC<bignumber:FixedNumber.fromString>
|
||||
_property: FixedNumber.fromString(value [ , format = "fixed" ] ) => [[FixedNumber]] @SRC<bignumber:FixedNumber.fromString>
|
||||
Returns an instance of a **FixedNumber** for //value// as a //format//. The //value// must
|
||||
not contain more decimals than the //format// permits.
|
||||
|
||||
_property: FixedNumber.fromValue(value [ , decimals = 0 [ , format = "fixed" ] ] ) => [[fixednumber]] @SRC<bignumber:FixedNumber.fromValue>
|
||||
_property: FixedNumber.fromValue(value [ , decimals = 0 [ , format = "fixed" ] ] ) => [[FixedNumber]] @SRC<bignumber:FixedNumber.fromValue>
|
||||
Returns an instance of a **FixedNumber** for //value// with //decimals// as a //format//.
|
||||
|
||||
|
||||
_subsection: Properties
|
||||
|
||||
_property: fixednumber.format
|
||||
The [FixedFormat](fixedformat) of //fixednumber//.
|
||||
The [FixedFormat](FixedFormat) of //fixednumber//.
|
||||
|
||||
|
||||
_subsection: Methods
|
||||
|
||||
_heading: Math Operations
|
||||
|
||||
_property: fixednumber.addUnsafe(otherValue) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
||||
_property: fixednumber.addUnsafe(otherValue) => [[FixedNumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// **+** //otherValue//.
|
||||
|
||||
_property: fixednumber.subUnsafe(otherValue) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// **–** //otherValue//.
|
||||
_property: fixednumber.subUnsafe(otherValue) => [[FixedNumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// **-** //otherValue//.
|
||||
|
||||
_property: fixednumber.mulUnsafe(otherValue) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
||||
_property: fixednumber.mulUnsafe(otherValue) => [[FixedNumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// **×** //otherValue//.
|
||||
|
||||
_property: fixednumber.divUnsafe(otherValue) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// **÷** //otherValue//.
|
||||
_property: fixednumber.divUnsafe(otherValue) => [[FixedNumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// **÷** //otherValue//.
|
||||
|
||||
_property: fixednumber.round([ decimals = 0 ]) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
||||
_property: fixednumber.round([ decimals = 0 ]) => [[FixedNumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// rounded to //decimals//.
|
||||
|
||||
|
||||
_heading: Comparison and Equivalence
|
||||
|
||||
_property: FixedNumber.isZero() => boolean @SRC<bignumber/fixednumber:FixedNumber.isZero>
|
||||
Returns true if and only if the value of //FixedNumber// is zero.
|
||||
|
||||
|
||||
_heading: Conversion
|
||||
|
||||
_property: fixednumber.toFormat(format) => [[fixednumber]] @SRC<bignumber/fixednumber>
|
||||
_property: fixednumber.toFormat(format) => [[FixedNumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// with //format//.
|
||||
|
||||
_property: fixednumber.toHexString() => string @SRC<bignumber/fixednumber>
|
||||
Returns a [Hexstring](hexstring) representation of //fixednumber//.
|
||||
Returns a [[HexString]] representation of //fixednumber//.
|
||||
|
||||
_property: fixednumber.toString() => string @SRC<bignumber/fixednumber>
|
||||
Returns a string representation of //fixednumber//.
|
||||
@@ -71,14 +77,14 @@ _property: FixedNumber.isFixedNumber(value) => boolean @SRC<bignumber/fixednumb
|
||||
Returns true if and only if //value// is a **FixedNumber**.
|
||||
|
||||
|
||||
_subsection: FixedFormat @<fixedformat>
|
||||
_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.
|
||||
class directly is unnecessary, as passing in a [[FixedFormat--strings]]
|
||||
directly into the [[FixedNumber]] will automatically create this.
|
||||
|
||||
_heading: Format Strings @<fixedformatstring>
|
||||
_heading: Format Strings @<FixedFormat--strings>
|
||||
|
||||
A format string is composed of three components, including signed-ness,
|
||||
bit-width and number of decimals.
|
||||
@@ -87,7 +93,7 @@ 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
|
||||
The width must be congruent 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:
|
||||
@@ -100,11 +106,11 @@ For example:
|
||||
|
||||
_heading: Creating Instances
|
||||
|
||||
_property: FixedFormat.from(value = "fixed128x18") => [[fixedformat]] @<fixednumber-from> @SRC<bignumber/fixednumber:FixedFormat.from>
|
||||
_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]]
|
||||
Returns a new instance of a **FixedFormat** defined by //value//. Any valid [[FixedFormat--strings]]
|
||||
may be passed in as well as any object which has any of ``signed``, ``width`` and ``decimals``
|
||||
defined, including a [[fixedformat]] object.
|
||||
defined, including a [[FixedFormat]] object.
|
||||
|
||||
_heading: Properties
|
||||
|
||||
|
||||
@@ -1,31 +1,117 @@
|
||||
_section: Hashing Algorithms
|
||||
_section: Hashing Algorithms @<hashing-algorithms>
|
||||
|
||||
Explain what hash functions are?
|
||||
There are many hashing algorithms used throughout the blockchain
|
||||
space as well as some more complex usages which require utilities
|
||||
to facilitate these common operations.
|
||||
|
||||
|
||||
_subsection: Cryptographic Hashing
|
||||
_subsection: Cryptographic Hash Functions @<cryptographic-hash-functions>
|
||||
|
||||
The [Cryptographic Hash Functions](link-wiki-cryptographichash)
|
||||
are a specific family of hash functions.
|
||||
|
||||
_property: ethers.utils.keccak256(aBytesLike) => string<[[datahexstring]]<32>> @<utils-keccak256> @SRC<keccak256>
|
||||
_property: ethers.utils.id(text) => string<[[DataHexString]]<32>> @<utils-id> @SRC<hash>
|
||||
The Ethereum Identity function computes the [KECCAK256](link-wiki-sha3) hash of the //text// bytes.
|
||||
|
||||
_property: ethers.utils.keccak256(aBytesLike) => string<[[DataHexString]]<32>> @<utils-keccak256> @SRC<keccak256>
|
||||
Returns the [KECCAK256](link-wiki-sha3) digest //aBytesLike//.
|
||||
|
||||
_property: ethers.utils.ripemd160(aBytesLike) => string<[[datahexstring]]<20>> @<utils-ripemd160> @SRC<sha2>
|
||||
_property: ethers.utils.ripemd160(aBytesLike) => string<[[DataHexString]]<20>> @<utils-ripemd160> @SRC<sha2>
|
||||
Returns the [RIPEMD-160](link-wiki-ripemd) digest of //aBytesLike//.
|
||||
|
||||
_property: ethers.utils.sha256(aBytesLike) => string<[[datahexstring]]<32>> @<utils-sha256> @SRC<sha2:function.sha256>
|
||||
_property: ethers.utils.sha256(aBytesLike) => string<[[DataHexString]]<32>> @<utils-sha256> @SRC<sha2:function.sha256>
|
||||
Returns the [SHA2-256](link-wiki-sha2) digest of //aBytesLike//.
|
||||
|
||||
_property: ethers.utils.sha512(aBytesLike) => string<[[datahexstring]]<64>> @<utils-sha512> @SRC<sha2:function.sha512>
|
||||
_property: ethers.utils.sha512(aBytesLike) => string<[[DataHexString]]<64>> @<utils-sha512> @SRC<sha2:function.sha512>
|
||||
Returns the [SHA2-512](link-wiki-sha2) digest of //aBytesLike//.
|
||||
|
||||
_property: ethers.utils.computeHmac(algorithm, key, data) => string<[[datahexstring]]> @<utils-computehmac> @SRC<sha2>
|
||||
_code: KECCAK256 @lang<javascript>
|
||||
|
||||
utils.keccak256([ 0x12, 0x34 ])
|
||||
//!
|
||||
|
||||
utils.keccak256("0x")
|
||||
//!
|
||||
|
||||
utils.keccak256("0x1234")
|
||||
//!
|
||||
|
||||
// The value MUST be data, such as:
|
||||
// - an Array of numbers
|
||||
// - a data hex string (e.g. "0x1234")
|
||||
// - a Uint8Array
|
||||
|
||||
// Do NOT use UTF-8 strings that are not a DataHexstring
|
||||
utils.keccak256("hello world")
|
||||
//! error
|
||||
|
||||
// If needed, convert strings to bytes first:
|
||||
utils.keccak256(utils.toUtf8Bytes("hello world"))
|
||||
//!
|
||||
|
||||
// Or equivalently use the identity function:
|
||||
utils.id("hello world")
|
||||
//!
|
||||
|
||||
// Keep in mind that the string "0x1234" represents TWO
|
||||
// bytes (i.e. [ 0x12, 0x34 ]. If you wish to compute the
|
||||
// hash of the 6 characters "0x1234", convert it to UTF-8
|
||||
// bytes first using utils.toUtf8Bytes.
|
||||
|
||||
// Consider the following examples:
|
||||
|
||||
// Hash of TWO (2) bytes:
|
||||
utils.keccak256("0x1234")
|
||||
//!
|
||||
|
||||
// Hash of TWO (2) bytes: (same result)
|
||||
utils.keccak256([ 0x12, 0x34 ])
|
||||
//!
|
||||
|
||||
const bytes = utils.toUtf8Bytes("0x1234")
|
||||
// <hide>
|
||||
bytes
|
||||
// </hide>
|
||||
//!
|
||||
|
||||
// Hash of SIX (6) characters (different than above)
|
||||
utils.keccak256(bytes)
|
||||
//!
|
||||
|
||||
// Hash of SIX (6) characters (same result)
|
||||
utils.id("0x1234")
|
||||
//!
|
||||
|
||||
_code: RIPEMD160 @lang<javascript>
|
||||
|
||||
utils.ripemd160("0x")
|
||||
//!
|
||||
|
||||
utils.ripemd160("0x1234")
|
||||
//!
|
||||
|
||||
_code: SHA-2 @lang<javascript>
|
||||
|
||||
utils.sha256("0x")
|
||||
//!
|
||||
|
||||
utils.sha256("0x1234")
|
||||
//!
|
||||
|
||||
utils.sha512("0x")
|
||||
//!
|
||||
|
||||
utils.sha512("0x1234")
|
||||
//!
|
||||
|
||||
|
||||
_subsection: HMAC @<utils--hmac>
|
||||
|
||||
_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//.
|
||||
using the [Algorithm](utils--hmac-supported-algorithm) //algorithm//.
|
||||
|
||||
|
||||
_heading: HMAC Supported Algorithms @<supported-algorithm> @SRC<sha2:enum.SupportedAlgorithm>
|
||||
_heading: **HMAC Supported Algorithms** @<utils--hmac-supported-algorithm> @SRC<sha2:enum.SupportedAlgorithm>
|
||||
|
||||
_property: ethers.utils.SupportedAlgorithm.sha256 => string
|
||||
Use the [SHA2-256](link-wiki-sha2) hash algorithm.
|
||||
@@ -33,37 +119,231 @@ Use the [SHA2-256](link-wiki-sha2) hash algorithm.
|
||||
_property: ethers.utils.SupportedAlgorithm.sha512 => string
|
||||
Use the [SHA2-512](link-wiki-sha2) hash algorithm.
|
||||
|
||||
_code: HMAC @lang<javascript>
|
||||
|
||||
_subsection: Common Hashing Helpers
|
||||
const key = "0x0102"
|
||||
const data = "0x1234"
|
||||
utils.computeHmac("sha256", key, data)
|
||||
//!
|
||||
|
||||
_property: ethers.utils.hashMessage(message) => string<[[datahexstring]]<32>> @<utils-hashmessage> @SRC<hash>
|
||||
|
||||
_subsection: Hashing Helpers @<utils--hashing-helpers>
|
||||
|
||||
_property: ethers.utils.hashMessage(message) => string<[[DataHexString]]<32>> @<utils-hashMessage> @SRC<hash>
|
||||
Computes the [[link-eip-191]] personal message digest of //message//. Personal messages are
|
||||
converted to UTF-8 bytes and prefixed with ``\\x19Ethereum Signed Message:``
|
||||
and the length of //message//.
|
||||
|
||||
_property: ethers.utils.id(text) => string<[[datahexstring]]<32>> @<utils-id> @SRC<hash>
|
||||
The Ethereum Identity function computs the [KECCAK256](link-wiki-sha3) hash of the //text// bytes.
|
||||
_code: Hashing Messages @lang<javascript>
|
||||
|
||||
_property: ethers.utils.namehash(name) => string<[[datahexstring]]<32>> @<utils-namehash> @SRC<hash>
|
||||
// Hashing a string message
|
||||
utils.hashMessage("Hello World")
|
||||
//!
|
||||
|
||||
// Hashing binary data (also "Hello World", but as bytes)
|
||||
utils.hashMessage( [ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100 ])
|
||||
//!
|
||||
|
||||
// NOTE: It is important to understand how strings and binary
|
||||
// data is handled differently. A string is ALWAYS processed
|
||||
// as the bytes of the string, so a hexstring MUST be
|
||||
// converted to an ArrayLike object first.
|
||||
|
||||
// Hashing a hex string is the same as hashing a STRING
|
||||
// Note: this is the hash of the 4 characters [ '0', 'x', '4', '2' ]
|
||||
utils.hashMessage("0x42")
|
||||
//!
|
||||
|
||||
// Hashing the binary data
|
||||
// Note: this is the hash of the 1 byte [ 0x42 ]
|
||||
utils.hashMessage([ 0x42 ])
|
||||
//!
|
||||
|
||||
// Hashing the binary data
|
||||
// Note: similarly, this is the hash of the 1 byte [ 0x42 ]
|
||||
utils.hashMessage(utils.arrayify("0x42"))
|
||||
//!
|
||||
|
||||
|
||||
_property: ethers.utils.namehash(name) => string<[[DataHexString]]<32>> @<utils-namehash> @SRC<hash>
|
||||
Returns the [ENS Namehash](link-namehash) of //name//.
|
||||
|
||||
_code: Namehash @lang<javascript>
|
||||
|
||||
_subsection: Solidity Hashing Algorithms
|
||||
utils.namehash("")
|
||||
//!
|
||||
|
||||
utils.namehash("eth")
|
||||
//!
|
||||
|
||||
utils.namehash("ricmoo.firefly.eth")
|
||||
//!
|
||||
|
||||
utils.namehash("ricmoo.xyz")
|
||||
//!
|
||||
|
||||
_heading: Typed Data Encoder @<TypedDataEncoder> @SRC<hash:class.TypedDataEncoder>
|
||||
|
||||
The **TypedDataEncoder** is used to compute the various encoded data required
|
||||
for [[link-eip-712]] signed data.
|
||||
|
||||
Signed data requires a domain, list of structures and their members and the data
|
||||
itself.
|
||||
|
||||
The **domain** is an object with values for any of the standard domain
|
||||
properties.
|
||||
|
||||
The **types** is an object with each property being the name of a structure, mapping
|
||||
to an array of field descriptions. It should **not** include the ``EIP712Domain``
|
||||
property unless it is required as a child structure of another.
|
||||
|
||||
_note: Experimental Feature (this exported class name will change)
|
||||
This is still an experimental feature. If using it, please specify the **exact**
|
||||
version of ethers you are using (e.g. spcify ``"5.0.18"``, **not** ``"^5.0.18"``) as
|
||||
the exported class name will be renamed from ``_TypedDataEncoder`` to ``TypedDataEncoder`` once
|
||||
it has been used in the field a bit.
|
||||
|
||||
_property: ethers.utils._TypedDataEncoder.from(types) => [TypedDataEncoder] @<TypedDataEncoder-from> @SRC<hash:TypedDataEncoder.from>
|
||||
|
||||
Creates a new **TypedDataEncoder** for //types//. This object is a fairly
|
||||
low-level object that most developers should not require using instances
|
||||
directly.
|
||||
|
||||
Most developers will find the static class methods below the most useful.
|
||||
|
||||
_property: TypedDataEncoder.encode(domain, types, values) => string @<TypedDataEncoder-encode> @SRC<hash:staticmethod.TypedDataEncoder.encode>
|
||||
|
||||
Encodes the Returns the hashed [[link-eip-712]] domain.
|
||||
|
||||
_property: TypedDataEncoder.getPayload(domain, types, value) => any @<TypedDataEncoder-getPayload> @SRC<hash:TypedDataEncoder.getPayload>
|
||||
|
||||
Returns the standard payload used by various JSON-RPC ``eth_signTypedData*``
|
||||
calls.
|
||||
|
||||
All domain values and entries in value are normalized and the types are
|
||||
verified.
|
||||
|
||||
_property: TypedDataEncoder.getPrimaryType(types) => string @<TypedDataEncoder-getPrimaryType> @SRC<hash:TypedDataEncoder.getPrimaryType>
|
||||
|
||||
Constructs a directed acyclic graph of the types and returns the
|
||||
root type, which can be used as the **primaryType** for [[link-eip-712]]
|
||||
payloads.
|
||||
|
||||
_property: TypedDataEncoder.hash(domain, types, values) => string<[[DataHexString]]<32>> @<TypedDataEncoder-hash> @SRC<hash:staticmethod.TypedDataEncoder.hash>
|
||||
|
||||
Returns the computed [[link-eip-712]] hash.
|
||||
|
||||
_property: TypedDataEncoder.hashDomain(domain) => string<[[DataHexString]]<32>> @<TypedDataEncoder-hashDomain> @SRC<hash:TypedDataEncoder.hashDomain>
|
||||
|
||||
Returns the hashed [[link-eip-712]] domain.
|
||||
|
||||
_property: TypedDataEncoder.resolveNames(domain, types, value, resolveName) => Promise<any> @<TypedDataEncoder-resolveNames> @SRC<hash:TypedDataEncoder.resolveNames>
|
||||
|
||||
Returns a copy of value, where any leaf value with a type of ``address`` will have
|
||||
been recursively replacedwith the value of calling //resolveName// with that value.
|
||||
|
||||
_code: Typed Data Example @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
TypedDataEncoder = ethers.utils._TypedDataEncoder
|
||||
// </hide>
|
||||
|
||||
const domain = {
|
||||
name: 'Ether Mail',
|
||||
version: '1',
|
||||
chainId: 1,
|
||||
verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'
|
||||
}
|
||||
|
||||
// The named list of all type definitions
|
||||
const types = {
|
||||
Person: [
|
||||
{ name: 'name', type: 'string' },
|
||||
{ name: 'wallet', type: 'address' }
|
||||
],
|
||||
Mail: [
|
||||
{ name: 'from', type: 'Person' },
|
||||
{ name: 'to', type: 'Person' },
|
||||
{ name: 'contents', type: 'string' }
|
||||
]
|
||||
}
|
||||
|
||||
// The data to sign
|
||||
const value = {
|
||||
from: {
|
||||
name: 'Cow',
|
||||
wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826'
|
||||
},
|
||||
to: {
|
||||
name: 'Bob',
|
||||
wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'
|
||||
},
|
||||
contents: 'Hello, Bob!'
|
||||
}
|
||||
|
||||
|
||||
TypedDataEncoder.encode(domain, types, value)
|
||||
//!
|
||||
|
||||
TypedDataEncoder.getPayload(domain, types, value)
|
||||
//!
|
||||
|
||||
TypedDataEncoder.getPrimaryType(types)
|
||||
//!
|
||||
|
||||
TypedDataEncoder.hash(domain, types, value)
|
||||
//!
|
||||
|
||||
TypedDataEncoder.hashDomain(domain)
|
||||
//!
|
||||
|
||||
|
||||
_subsection: Solidity Hashing Algorithms @<utils--solidity-hashing>
|
||||
|
||||
When using the Solidity ``abi.packEncoded(...)`` function, a non-standard
|
||||
//tightly packed// version of encoding is used. These functions implement
|
||||
the tightly packing algorithm.
|
||||
|
||||
_property: ethers.utils.solidityPack(arrayOfTypes, arrayOfValues) => string<[[datahexstring]]> @<utils-soliditypack> @SRC<solidity:pack>
|
||||
Returns the non-standard encoded //arrayOfValues// packed according to
|
||||
their respecive type in //arrayOfTypes//.
|
||||
_property: ethers.utils.solidityPack(types, values) => string<[[DataHexString]]> @<utils-solidityPack> @SRC<solidity:pack>
|
||||
Returns the non-standard encoded //values// packed according to
|
||||
their respective type in //types//.
|
||||
|
||||
_property: ethers.utils.solidityKeccak256(arrayOfTypes, arrayOfValues) => string<[[datahexstring]]<32>> @<utils-soliditykeccak256> @SRC<solidity:keccak256>
|
||||
Returns the [KECCAK256](link-wiki-sha3) of the non-standard encoded //arrayOfValues// packed
|
||||
according to their respective type in //arrayOfTypes//.
|
||||
_property: ethers.utils.solidityKeccak256(types, values) => string<[[DataHexString]]<32>> @<utils-solidityKeccak256> @SRC<solidity:keccak256>
|
||||
Returns the [KECCAK256](link-wiki-sha3) of the non-standard encoded //values// packed
|
||||
according to their respective type in //types//.
|
||||
|
||||
_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//.
|
||||
_property: ethers.utils.soliditySha256(types, values) => string<[[DataHexString]]<32>> @<utils-soliditySha256> @SRC<solidity:sha256>
|
||||
Returns the [SHA2-256](link-wiki-sha2) of the non-standard encoded //values// packed
|
||||
according to their respective type in //types//.
|
||||
|
||||
_code: Solidity Hashing @lang<javascript>
|
||||
|
||||
utils.solidityPack([ "int16", "uint48" ], [ -1, 12 ])
|
||||
//!
|
||||
|
||||
utils.solidityPack([ "string", "uint8" ], [ "Hello", 3 ])
|
||||
//!
|
||||
|
||||
utils.solidityKeccak256([ "int16", "uint48" ], [ -1, 12 ])
|
||||
//!
|
||||
|
||||
utils.soliditySha256([ "int16", "uint48" ], [ -1, 12 ])
|
||||
//!
|
||||
|
||||
// As a short example of the non-distinguished nature of
|
||||
// Solidity tight-packing (which is why it is inappropriate
|
||||
// for many things from a security point of view), consider
|
||||
// the following examples are all equal, despite representing
|
||||
// very different values and layouts.
|
||||
|
||||
utils.solidityPack([ "string", "string" ], [ "hello", "world01" ])
|
||||
//!
|
||||
|
||||
utils.solidityPack([ "string", "string" ], [ "helloworld", "01" ])
|
||||
//!
|
||||
|
||||
utils.solidityPack([ "string", "string", "uint16" ], [ "hell", "oworld", 0x3031 ])
|
||||
//!
|
||||
|
||||
utils.solidityPack([ "uint96" ], [ "32309054545061485574011236401" ])
|
||||
//!
|
||||
|
||||
@@ -1,16 +1,26 @@
|
||||
_section: HD Wallet
|
||||
_section: HD Wallet @<hdnodes>
|
||||
|
||||
TODO: Explain [BIP32](link-bip-32) [BIP-39](link-bip-39) and whatnot here...
|
||||
The Hierarchal Desterministic (HD) Wallet was a standard
|
||||
created for Bitcoin, but lends itself well to a wide variety of
|
||||
Blockchains which rely on secp256k1 private keys.
|
||||
|
||||
For a more detailed technical understanding:
|
||||
|
||||
- [BIP-32](link-bip-32) - the hierarchal deterministic description
|
||||
- [BIP-39](link-bip-39) - the method used to derive the BIP-32 seed
|
||||
from human-readable sequences of words (i.e. a mnemonic)
|
||||
- [BIP-44](link-bip-44) - a standard defined to make BIP-32 easy
|
||||
to adapt to any future compatible blockchain
|
||||
|
||||
_subsection: Types
|
||||
|
||||
_heading: Constants @<hdnode-defaultpath> @SRC<hdnode:defaultPath>
|
||||
_heading: Constants @<hdnodes--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>
|
||||
_heading: Mnemonic @<Mnemonic>
|
||||
|
||||
_property: mnemonic.phrase => string
|
||||
The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long
|
||||
@@ -23,39 +33,39 @@ _property: mnemonic.locale => string
|
||||
The language of the wordlist this mnemonic is using.
|
||||
|
||||
|
||||
_subsection: HDNode @<hdnode> @SRC<hdnode:class.HDNode>
|
||||
_subsection: HDNode @<HDNode> @SRC<hdnode:class.HDNode>
|
||||
|
||||
_heading: Creating Instances
|
||||
_heading: Creating Instances @<HDNode--creating>
|
||||
|
||||
_property: ethers.HDNode.fromMnemonic(phrase [, password [, wordlist ] ]) => [[hdnode]] @SRC<hdnode>
|
||||
Return the [[hdnode]] for //phrase// with the optional //password//
|
||||
_property: ethers.HDNode.fromMnemonic(phrase [, password [, wordlist ] ]) => [[HDNode]] @<HDNode-fromMnemonic> @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.fromSeed(aBytesLike) => [[HDNode]] @<HDNode-fromSeed> @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
|
||||
_property: ethers.HDNode.fromExtendedKey(extendedKey) => [[HDNode]] @<HDNode-fromExtendedKey> @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
|
||||
_heading: Properties @<HDNode--properties>
|
||||
|
||||
_property: hdNode.privateKey => string<[[datahexstring]]<32>>
|
||||
_property: hdNode.privateKey => string<[[DataHexString]]<32>>
|
||||
The private key for this HDNode.
|
||||
|
||||
_property: hdNode.publicKey => string<[[datahexstring]]<33>>
|
||||
_property: hdNode.publicKey => string<[[DataHexString]]<33>>
|
||||
The (compresses) public key for this HDNode.
|
||||
|
||||
_property: hdNode.fingerprint => string<[[datahexstring]]<4>>
|
||||
_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>>
|
||||
_property: hdNode.parentFingerprint => string<[[DataHexString]]<4>>
|
||||
The fingerprint of the parent node. See //fingerprint// for more
|
||||
details.
|
||||
|
||||
@@ -64,14 +74,14 @@ Most developers will not need to use this.
|
||||
_property: hdNode.address => string<[[address]]>
|
||||
The address of this HDNode.
|
||||
|
||||
_property: hdNode.mnemonic => [[hdnode-mnemonic]]
|
||||
_property: hdNode.mnemonic => [[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>>
|
||||
_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.
|
||||
@@ -97,29 +107,29 @@ serializing and deserializing (using the ``fromExtendedKey`` class
|
||||
method) will result in reduced information.
|
||||
|
||||
|
||||
_heading: Methods
|
||||
_heading: Methods @<HDNode--methods>
|
||||
|
||||
_property: hdNode.neuter() => [[hdnode]] @SRC<hdnode>
|
||||
_property: hdNode.neuter() => [[HDNode]] @<HDNode-neuter> @SRC<hdnode>
|
||||
Return a new instance of //hdNode// with its private key removed
|
||||
but all otehr properties preserved. This ensures that the key
|
||||
but all other 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
|
||||
_property: hdNode.derivePath(path) => [[HDNode]] @<HDNode-derivePath> @SRC<hdnode>
|
||||
Return a new [[HDNode]] which is the child of //hdNode// found
|
||||
by deriving //path//.
|
||||
|
||||
|
||||
|
||||
_subsection: Other Functions
|
||||
_subsection: Other Functions @<HDNode--utilities>
|
||||
|
||||
_property: ethers.utils.mnemonicToSeed(phrase [ , password]) => string<[[datahexstring]]<64>> @SRC<hdnode>
|
||||
_property: ethers.utils.mnemonicToSeed(phrase [ , password]) => string<[[DataHexString]]<64>> @<utils-mnemonicToSeed> @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>
|
||||
_property: ethers.utils.mnemonicToEntropy(phrase [ , wordlist ]) => string<[[DataHexString]]> @<utils-mnemonicToEntropy> @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>
|
||||
_property: ethers.utils.isValidMnemonic(phrase [ , wordlist ]) => boolean @<utils-isValidMnemonic> @SRC<hdnode>
|
||||
Returns true if //phrase// is a valid mnemonic phrase, by
|
||||
testing the checksum.
|
||||
|
||||
@@ -3,21 +3,21 @@ _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
|
||||
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
|
||||
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>
|
||||
_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>
|
||||
_property: Logger.globalLogger() => [[Logger]] @SRC<logger>
|
||||
Returns the singleton global logger.
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ Log warnings.
|
||||
|
||||
_heading: Errors
|
||||
|
||||
These functions honor the current [Censorship](logger-censorship) and help create
|
||||
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>
|
||||
@@ -48,39 +48,38 @@ 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//.
|
||||
|
||||
Throw an [INVALID_ARGUMENT](errors--invalid-argument) 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.checkAbstract(target, kind) => void @<Logger-checkAbstract> @SRC<logger>
|
||||
If //target// is //kind//, throws a [UNSUPPORTED_OPERATION](errors--unsupported-operation) error
|
||||
otherwise performs the same operations as [checkNew](Logger-checkNew).
|
||||
|
||||
_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.
|
||||
This is useful for ensuring abstract classes are not being instantiated.
|
||||
|
||||
_property: logger.checkNew(target, kind) => void @SRC<logger>
|
||||
_property: logger.checkArgumentCount(count, expectedCount [ , message) => void @<Logger-checkArgumentCount> @SRC<logger>
|
||||
If //count// is not equal to //expectedCount//, throws a [MISSING_ARGUMENT](errors--missing-argument)
|
||||
or [UNEXPECTED_ARGUMENT](errors--unexpected-argument) error.
|
||||
|
||||
_property: logger.checkNew(target, kind) => void @<Logger-checkNew> @SRC<logger>
|
||||
If //target// is not a valid ``this`` or ``target`` value, throw a
|
||||
[MISSING_NEW](error-missingnew) error. This is useful to ensure
|
||||
[MISSING_NEW](errors--missing-new) error. This is useful to ensure
|
||||
callers of a Class are using ``new``.
|
||||
|
||||
_property: logger.checkNormalize(message) => void @SRC<logger>
|
||||
_property: logger.checkNormalize(message) => void @<Logger-checkNoralize> @SRC<logger>
|
||||
Check that the environment has a correctly functioning [[link-js-normalize]]. If not, a
|
||||
[UNSUPPORTED_OPERATION](error-unsupported) error is thrown.
|
||||
[UNSUPPORTED_OPERATION](errors--unsupported-operation) error is thrown.
|
||||
|
||||
_property: logger.checkSafeUint53(value [, message ]) => void @SRC<logger>
|
||||
_property: logger.checkSafeUint53(value [, message ]) => void @<Logger-checkSafeUint53> @SRC<logger>
|
||||
If //value// is not safe as a [JavaScript number](link-wiki-ieee754), throws a
|
||||
[NUMERIC_FAULT](error-numericfault) error.
|
||||
[NUMERIC_FAULT](errors--numeric-fault) error.
|
||||
|
||||
_heading: Censorship @<Logger--censorship>
|
||||
|
||||
_heading: Censorship @<logger-censorship>
|
||||
|
||||
_property: Logger.setCensorship(censor [ , permanent = false ]) => void @SRC<logger>
|
||||
_property: Logger.setCensorship(censor [ , permanent = false ]) => void @<Logger-setCensorship> @SRC<logger>
|
||||
Set error censorship, optionally preventing errors from being uncensored.
|
||||
|
||||
In production applications, this prevents any error from leaking information
|
||||
@@ -88,8 +87,8 @@ 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).
|
||||
_property: Logger.setLogLevel(logLevel) => void @<Logger-setLogLevel> @SRC<logger>
|
||||
Set the log level, to suppress logging output below a [particular log level](Logger-levels).
|
||||
|
||||
|
||||
_subsection: Errors @<errors>
|
||||
@@ -98,76 +97,113 @@ 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
|
||||
_heading: Generic Error Codes @<errors-generic>
|
||||
|
||||
_property: Logger.errors.NOT_IMPLEMENTED
|
||||
The operation is not implemented.
|
||||
_property: Logger.errors.NOT_IMPLEMENTED @<errors--not-implemented>
|
||||
The operation is not implemented. This may occur when calling a method
|
||||
on a sub-class that has not fully implemented its abstract superclass.
|
||||
|
||||
_property: Logger.errors.SERVER_ERROR
|
||||
_property: Logger.errors.SERVER_ERROR @<errors--server-error>
|
||||
There was an error communicating with a server.
|
||||
|
||||
_property: Logger.errors.TIMEOUT @<error-timeout>
|
||||
This may occur for a number of reasons, for example:
|
||||
|
||||
- a [CORS](link-cors) issue; this is quite often the problem and also the
|
||||
hardest to diagnose and fix, so it is very beneficial to familiarize
|
||||
yourself with CORS; some backends allow you configure your CORS, such as
|
||||
the geth command-line or conifguration files or the INFURA and Alchemy
|
||||
dashboards by specifing allowed Origins, methods, etc.
|
||||
- an SSL issue; for example, if you are trying to connect to a local node via
|
||||
HTTP but are serving the content from a secure HTTPS website
|
||||
- a link issue; a firewall is preventing the traffic from reaching the server
|
||||
- a server issue; the server is down, or is returning 500 error codes
|
||||
- a backend DDoS mitigation proxy; for example, Etherscan operates behind a
|
||||
Cloudflare proxy, which will block traffic if the request is sent via
|
||||
specific User Agents or the client fingerprint is detected as a bot in some
|
||||
cases
|
||||
|
||||
_property: Logger.errors.TIMEOUT @<errors--timeout>
|
||||
A timeout occurred.
|
||||
|
||||
_property: Logger.errors.UNKNOWN_ERROR @<error-unknown>
|
||||
_property: Logger.errors.UNKNOWN_ERROR @<errors--unknown-error>
|
||||
A generic unknown error.
|
||||
|
||||
_property: Logger.errors.UNSUPPORTED_OPERATION @<error-unsupported>
|
||||
_property: Logger.errors.UNSUPPORTED_OPERATION @<errors--unsupported-operation>
|
||||
The operation is not supported.
|
||||
|
||||
This can happen for a variety reasons, for example:
|
||||
|
||||
_heading: Safety Error Codes
|
||||
- Some backends do not support certain operations; such as passing a blockTag
|
||||
to an [[EtherscanProvider]] for [call](Provider-call)
|
||||
- A [[Contract]] object connected to [[Provider]] (instead of a [[Signer]]) cannot
|
||||
[sign](Signer-signTransaction) or [send](Signer-sendTransaction) transactions
|
||||
- a [[Contract]] connected to a [[Signer]] without a [[Provider]] is write-only
|
||||
and cannot estimate gas or execute static calls
|
||||
|
||||
_property: Logger.errors.BUFFER_OVERRUN
|
||||
|
||||
_heading: Safety Error Codes @<errors-safety>
|
||||
|
||||
_property: Logger.errors.BUFFER_OVERRUN @<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>
|
||||
This can occur if a contract erroneously returns invalid ABI-encoded
|
||||
data or RLP data is malformed.
|
||||
|
||||
_property: Logger.errors.NUMERIC_FAULT @<errors--numeric-fault>
|
||||
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
|
||||
_heading: Usage Error Codes @<errors-usage>
|
||||
|
||||
_property: Logger.errors.INVALID_ARGUMENT @<error-invalidargument>
|
||||
_property: Logger.errors.INVALID_ARGUMENT @<errors--invalid-argument>
|
||||
The type or value of an argument is invalid. This will generally also
|
||||
include the ``name`` and ``value`` of the argument. Any function which
|
||||
accepts sensitive data (such as a private key) will include the string
|
||||
``[\[REDACTED]\]`` instead of the value passed in.
|
||||
``"[\[REDACTED]\]"`` instead of the value passed in.
|
||||
|
||||
_property: Logger.errors.MISSING_ARGUMENT @<error-missingargument>
|
||||
_property: Logger.errors.MISSING_ARGUMENT @<errors--missing-argument>
|
||||
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.MISSING_NEW @<errors--missing-new>
|
||||
An object is a Class, but is not being called with ``new``.
|
||||
|
||||
_property: Logger.errors.UNEXPECTED_ARGUMENT @<error-unexpectedargument>
|
||||
_property: Logger.errors.UNEXPECTED_ARGUMENT @<errors--unexpected-argument>
|
||||
Too many parameters we passed into a function.
|
||||
|
||||
|
||||
_heading: Ethereum Error Codes
|
||||
_heading: Ethereum Error Codes @<errors-ethereum>
|
||||
|
||||
_property: Logger.errors.CALL_EXCEPTION
|
||||
_property: Logger.errors.CALL_EXCEPTION @<errors--call-exception>
|
||||
An attempt to call a blockchain contract (getter) resulted in a
|
||||
revert or other error.
|
||||
revert or other error, such as insufficient gas (out-of-gas) or an
|
||||
invalid opcode. This can also occur during gas estimation or if
|
||||
waiting for a [[providers-TransactionReceipt]] which failed during execution.
|
||||
|
||||
_property: Logger.errors.INSUFFICIENT_FUNDS
|
||||
Consult the contract to determine the cause, such as a failed condition
|
||||
in a ``require`` statement. The ``reason`` property may provide more
|
||||
context for the cause of this error.
|
||||
|
||||
_property: Logger.errors.INSUFFICIENT_FUNDS @<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.
|
||||
of data is 4 gas for each zero byte and 68 gas for each non-zero byte, as well
|
||||
as 35000 gas if a transaction contains no ``to`` property and is therefore
|
||||
expected to create a new account.
|
||||
|
||||
_property: Logger.errors.NETWORK_ERROR
|
||||
_property: Logger.errors.NETWORK_ERROR @<errors--network>
|
||||
An Ethereum network validation error, such as an invalid chain ID.
|
||||
|
||||
_property: Logger.errors.NONCE_EXPIRED
|
||||
_property: Logger.errors.NONCE_EXPIRED @<errors--nonce-expired>
|
||||
The nonce being specified has already been used in a mined transaction.
|
||||
|
||||
_property: Logger.errors.REPLACEMENT_UNDERPRICED
|
||||
_property: Logger.errors.REPLACEMENT_UNDERPRICED @<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.
|
||||
@@ -175,9 +211,12 @@ 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.
|
||||
replacement should be 15.000000001 gwei. This is not enforced by the protocol, as
|
||||
it deals with unmined transactions, and can be configured by each node, however
|
||||
to ensure a transaction is propagated to a miner it is best practice to follow
|
||||
the defaults most nodes have enabled.
|
||||
|
||||
_property: Logger.errors.UNPREDICTABLE_GAS_LIMIT
|
||||
_property: Logger.errors.UNPREDICTABLE_GAS_LIMIT @<errors--unpredicatable-gas-limit>
|
||||
When estimating the required amount of gas for a transaction, a node is queried for
|
||||
its best guess.
|
||||
|
||||
@@ -190,13 +229,13 @@ 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>
|
||||
_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.
|
||||
Only log output for informational, warnings and errors.
|
||||
|
||||
_property: Logger.levels.WARNING
|
||||
Only log output for warnings and errors.
|
||||
|
||||
@@ -1,9 +1,40 @@
|
||||
_section: Property Utilities
|
||||
|
||||
_property: ethers.utils.checkProperties() => void
|
||||
This is a collection of utility functions used for handling
|
||||
properties in a platform-safe way.
|
||||
|
||||
The next major version of ethers will no longer be compatible
|
||||
with ES3, so many of these will be removed in favor of the
|
||||
built-in options available in ES2015 and above.
|
||||
|
||||
_property: ethers.utils.checkProperties(object, check) => void
|
||||
|
||||
Checks that //object// only contains properties included
|
||||
in //check//, and throws [INVALID_ARGUMENT](errors--invalid-argument) if not.
|
||||
|
||||
_property: ethers.utils.deepCopy(anObject) => any
|
||||
|
||||
Creates a recursive copy of //anObject//. Frozen (i.e. and other known
|
||||
immutable) objects are copied by reference.
|
||||
|
||||
_property: ethers.utils.defineReadOnly(anObject, name, value) => void
|
||||
|
||||
Uses the ``Object.defineProperty`` method to set a read-only property
|
||||
on an object.
|
||||
|
||||
_property: ethers.utils.getStatic(aConstructor, key) => any
|
||||
|
||||
Recursively check for a static method //key// on an inheritance chain
|
||||
from //aConstructor// to all ancestors.
|
||||
|
||||
This is used to mimic behaviour in other languages where ``this`` in
|
||||
a static method will also search ancestors.
|
||||
|
||||
_property: ethers.utils.resolveProperties(anObject) => Promise<any> @<utils-resolveproperties> @SRC<properties>
|
||||
|
||||
Retruns a Promise which resolves all child values on //anObject//.
|
||||
|
||||
_property: ethers.utils.shallowCopy(anObject) => any
|
||||
|
||||
Returns a shallow copy of //anObject//. This is the same as
|
||||
using ``Object.assign({ }, anObject)``.
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
_section: Signing Key @<utils-signingkey>
|
||||
_section: Signing Key @<SigningKey>
|
||||
|
||||
_property: new ethers.utils.SigningKey(privateKey)
|
||||
_property: new ethers.utils.SigningKey(privateKey) @<SigningKey-constructor> @src<signing-key:constructor.SigningKey>
|
||||
Create a new SigningKey for //privateKey//.
|
||||
|
||||
_property: signingKey.privateKey => string<[[datahexstring]]<32>>
|
||||
_property: signingKey.privateKey => string<[[DataHexString]]<32>>
|
||||
The private key for this Signing Key.
|
||||
|
||||
_property: signingKey.publicKey => string<[[datahexstring]]<65>>
|
||||
_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``.
|
||||
65 bytes (130 nibbles) and begins with ``0x04``.
|
||||
|
||||
_property: signingKey.compressedPublicKey => string<[[datahexstring]]<33>>
|
||||
_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``.
|
||||
33 bytes (66 nibbles) and begins with either ``0x02`` or ``0x03``.
|
||||
|
||||
_property: signingKey.signDigest(digest) => [[signature]]
|
||||
_property: signingKey.signDigest(digest) => [[Signature]]
|
||||
Sign the //digest// and return the signature.
|
||||
|
||||
_property: signingKey.computeSharedSecret(otherKey) => string<[[datahexstring]]<32>>
|
||||
_property: signingKey.computeSharedSecret(otherKey) => string<[[DataHexString]]<32>> @SRC<signing-key>
|
||||
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.
|
||||
@@ -25,13 +25,13 @@ 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
|
||||
_property: SigningKey.isSigningKey(anObject) => boolean @SRC<signing-key>
|
||||
Returns true if //anObject// is a SigningKey.
|
||||
|
||||
|
||||
_subsection: Other Functions
|
||||
|
||||
_property: ethers.utils.verifyMessage(message, signature) => string<[[address]]> @<utils-verifymessage> @SRC<wallet>
|
||||
_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
|
||||
@@ -39,9 +39,15 @@ will then be used to compute the address; this allows systems which use
|
||||
the v to encode additional data (such as [EIP-155](link-eip-155))
|
||||
to be used since the v parameter is still completely non-ambiguous.
|
||||
|
||||
_property: ethers.utils.recoverPublicKey(digest, signature) => string<[[datahexstring]]<65>> @<utils-recoverpublickey>
|
||||
_property: ethers.utils.verifyTypedData(domain, types, value, signature) => string<[[address]]> @<utils-verifyTypedData> @SRC<wallet>
|
||||
Returns the address that signed the [[link-eip-712]] //value// for the //domain//
|
||||
and //types// to produce the signature.
|
||||
|
||||
_property: ethers.utils.computePublicKey(key [, compressed = false ]) => string<[[datahexstring]]> @<utils-computepublickey>
|
||||
_property: ethers.utils.recoverPublicKey(digest, signature) => string<[[DataHexString]]<65>> @<utils-recoverPublicKey>
|
||||
Returns the uncompressed public key (i.e. the first byte will be ``0x04``)
|
||||
of the private key that was used to sign //digest// which gave the //signature//.
|
||||
|
||||
_property: ethers.utils.computePublicKey(key [, compressed = false ]) => string<[[DataHexString]]> @<utils-computePublicKey>
|
||||
Computes the public key of //key//, optionally compressing it. The //key//
|
||||
can be any form of public key (compressed or uncompressed) or a private
|
||||
key.
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
_section: Strings
|
||||
_section: Strings @<strings>
|
||||
|
||||
Tra la la
|
||||
A **String** is a representation of a human-readable input of output,
|
||||
which are often taken for granted.
|
||||
|
||||
When dealing with blockchains, properly handling human-readable and
|
||||
human-provided data is important to prevent loss of funds, assets,
|
||||
incorrect permissions, etc.
|
||||
|
||||
_subsection: Bytes32String @<bytes32-string>
|
||||
_subsection: Bytes32String @<Bytes32String>
|
||||
|
||||
A string in Solidity is length prefixed with its 256-bit (32 byte)
|
||||
length, which means that even short strings require 2 words (64 bytes)
|
||||
@@ -19,38 +23,38 @@ _note: Note
|
||||
Strings that are 31 __//bytes//__ long may contain fewer than 31 __//characters//__,
|
||||
since UTF-8 requires multiple bytes to encode international characters.
|
||||
|
||||
_property: ethers.utils.parseBytes32String(aBytesLike) => string @<utils-parsebytes32> @SRC<strings>
|
||||
_property: ethers.utils.parseBytes32String(aBytesLike) => string @<utils-parseBytes32> @SRC<strings>
|
||||
Returns the decoded string represented by the ``Bytes32`` encoded data.
|
||||
|
||||
_property: ethers.utils.formatBytes32String(text) => string<[[datahexstring]]<32>> @<utils-formatbytes32> @SRC<strings>
|
||||
_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>
|
||||
_subsection: UTF-8 Strings @<strings-utf8>
|
||||
|
||||
_property: ethers.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//.
|
||||
[[strings--unicode-normalization-form]] //form//.
|
||||
|
||||
_property: ethers.utils.toUtf8CodePoints(text [ , form = current ] ) => Array<number> @<utils-toutf8codepoints> @SRC<strings>
|
||||
_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//.
|
||||
[[strings--unicode-normalization-form]] //form//.
|
||||
|
||||
_note: Note
|
||||
This function correctly splits each **user-perceived character** into
|
||||
its codepoint, accounting for surrogate pairs. This should not be confused with
|
||||
``string.split("")``, which destroys surrogate pairs, spliting between each UTF-16
|
||||
``string.split("")``, which destroys surrogate pairs, splitting between each UTF-16
|
||||
codeunit instead.
|
||||
|
||||
_property: ethers.utils.toUtf8String(aBytesLike [ , onError = error ] ) => string @<utils-toutf8string> @SRC<strings>
|
||||
_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
|
||||
The //onError// is a [Custom UTF-8 Error function](strings--error-handling) and if not specified
|
||||
it defaults to the [error](strings--Utf8Error) function, which throws an error
|
||||
on **any** UTF-8 error.
|
||||
|
||||
_subsection: UnicodeNormalizationForm @<unicode-normalization-form> @SRC<strings/utf8:enum.UnicodeNormalizationForm>
|
||||
_subsection: UnicodeNormalizationForm @<strings--unicode-normalization-form> @SRC<strings/utf8:enum.UnicodeNormalizationForm>
|
||||
|
||||
There are several [commonly used forms](link-wiki-unicode-equivalence)
|
||||
when normalizing UTF-8 data, which allow strings to be compared or hashed in a stable
|
||||
@@ -88,10 +92,11 @@ 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
|
||||
it should **not** be considered a method to achieve //any// level of security from
|
||||
[homoglyph attacks](link-wiki-homoglyph).
|
||||
|
||||
_subsection: Custom UTF-8 Error Handling @<utf8error>
|
||||
|
||||
_subsection: Custom UTF-8 Error Handling @<strings--error-handling>
|
||||
|
||||
When converting a string to its codepoints, there is the possibility
|
||||
of invalid byte sequences. Since certain situations may need specific
|
||||
@@ -99,7 +104,7 @@ 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
|
||||
The //reason// is one of the [UTF-8 Error Reasons](strings--error-reasons), //offset// is the index
|
||||
into //bytes// where the error was first encountered, output is the list
|
||||
of codepoints already processed (and may be modified) and in certain Error
|
||||
Reasons, the //badCodepoint// indicates the currently computed codepoint,
|
||||
@@ -108,7 +113,8 @@ 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>
|
||||
|
||||
_heading: UTF-8 Error Reasons @<strings--error-reasons> @SRC<strings/utf8:Utf8ErrorReason>
|
||||
|
||||
_property: ethers.utils.Utf8ErrorReason.BAD_PREFIX
|
||||
A byte was encountered which is invalid to begin a UTF-8 byte
|
||||
@@ -166,16 +172,16 @@ _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>
|
||||
_property: ethers.utils.Utf8ErrorFuncs.error @<strings--Utf8Error> @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>
|
||||
_property: ethers.utils.Utf8ErrorFuncs.ignore @<strings--Utf8Ignore> @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>
|
||||
_property: ethers.utils.Utf8ErrorFuncs.replace @<strings--Utf8Replace> @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),
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
_section: Transactions @<utils-transactions>
|
||||
_section: Transactions @<transactions>
|
||||
|
||||
_subsection: Types
|
||||
_subsection: Types @<transactions--types>
|
||||
|
||||
_heading: UnsignedTransaction @<types-unsignedtransaction>
|
||||
_heading: UnsignedTransaction @<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.
|
||||
The address this transaction is to.
|
||||
|
||||
_property: unsignedTransaction.nonce => number
|
||||
The nonce of this transaction.
|
||||
|
||||
_property: unsignedTransaction.gasLimit => [[bignumberish]]
|
||||
_property: unsignedTransaction.gasLimit => [[BigNumberish]]
|
||||
The gas limit for this transaction.
|
||||
|
||||
_property: unsignedTransaction.gasPrice => [[bignumberish]]
|
||||
_property: unsignedTransaction.gasPrice => [[BigNumberish]]
|
||||
The gas price for this transaction.
|
||||
|
||||
_property: unsignedTransaction.data => [[byteslike]]
|
||||
_property: unsignedTransaction.data => [[BytesLike]]
|
||||
The data for this transaction.
|
||||
|
||||
_property: unsignedTransaction.value => [[bignumberish]]
|
||||
_property: unsignedTransaction.value => [[BigNumberish]]
|
||||
The value (in wei) for this transaction.
|
||||
|
||||
_property: unsignedTransaction.chainId => number
|
||||
@@ -30,10 +30,10 @@ then [[link-eip-155]] is disabled and legacy signing is
|
||||
used, unless overridden in a signature.
|
||||
|
||||
|
||||
_heading: Transaction @<types-transaction>
|
||||
_heading: Transaction @<Transaction>
|
||||
A generic object to represent a transaction.
|
||||
|
||||
_property: transaction.hash => string<[[datahexstring]]<32>>
|
||||
_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//.
|
||||
@@ -50,20 +50,20 @@ 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]]
|
||||
_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
|
||||
to complete execution, the effects of the transaction are reverted, but
|
||||
the gas is **fully consumed** and an out-of-gas error occurs.
|
||||
|
||||
_property: transaction.gasPrice => [[bignumber]]
|
||||
_property: transaction.gasPrice => [[BigNumber]]
|
||||
The price (in wei) per unit of gas for //transaction//.
|
||||
|
||||
_property: transaction.data => [[byteslike]]
|
||||
_property: transaction.data => [[BytesLike]]
|
||||
The data for //transaction//. In a contract this is the call data.
|
||||
|
||||
_property: transaction.value => [[bignumber]]
|
||||
_property: transaction.value => [[BigNumber]]
|
||||
The value (in wei) for //transaction//.
|
||||
|
||||
_property: transaction.chainId => number
|
||||
@@ -80,12 +80,12 @@ 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>>
|
||||
_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>>
|
||||
_property: transaction.s => string<[[DataHexString]]<32>>
|
||||
The s portion of the elliptic curve signatures for //transaction//.
|
||||
|
||||
_property: transaction.v => number
|
||||
@@ -95,20 +95,21 @@ x-coordinate can have, and in [[link-eip-155]] is additionally
|
||||
used to encode the chain ID into the serialized transaction.
|
||||
|
||||
|
||||
_subsection: Functions
|
||||
_subsection: Functions @<transactions--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.accessListify(anAcceslistish) => [[providers-AccessList]] @<utils-accessListify> @SRC<transactions:accessListify>
|
||||
Normalizes the [[providers-AccessListish]] //anAccessListish// into
|
||||
an [[providers-AccessList]].
|
||||
|
||||
_property: ethers.utils.parse(aBytesLike) => [[types-transaction]] @<utils-parse> @SRC<transactions>
|
||||
Parses the transaction properties from a serialized transactions.
|
||||
This is useful for other utility functions which wish to remain
|
||||
flexible as to the input parameter for access lists, such as
|
||||
when creating a [[Signer]] which needs to manipulate a possibly
|
||||
typed transaction envelope.
|
||||
|
||||
_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.parseTransaction(aBytesLike) => [[Transaction]] @<utils-parseTransaction> @SRC<transactions:parse>
|
||||
Parses the transaction properties from a serialized transaction.
|
||||
|
||||
_property: ethers.utils.serialize(transaction [ , signature ]) => string<[[datahexstring]]> @<utils-serialize> @SRC<transactions>
|
||||
_property: ethers.utils.serializeTransaction(tx [ , signature ]) => string<[[DataHexString]]> @<utils-serializeTransaction> @SRC<transactions:serialize>
|
||||
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
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
_section: Web Utilities
|
||||
_section: Web Utilities @<web>
|
||||
|
||||
|
||||
_property: ethers.utils.fetchJson(urlOrConnectionInfo [, json [ , processFunc ] ]) => Promise<any> @<web-fetchjson>
|
||||
_property: ethers.utils.fetchJson(urlOrConnectionInfo [, json [ , processFunc ] ]) => Promise<any> @<utils-fetchJson>
|
||||
Fetch and parse the JSON content from //urlOrConnectionInfo//, with the
|
||||
optiona body //json// and optionally processing the result with //processFun//
|
||||
optional 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
|
||||
_property: ethers.utils.poll(pollFunc [, options ]) => Promise<any> @<utils-poll>
|
||||
Repeatedly call pollFunc using the [[PollOptions]] until it returns a
|
||||
value other than undefined.
|
||||
|
||||
|
||||
_heading: Connection Info @<web-connectioninfo>
|
||||
_heading: ConnectionInfo @<ConnectionInfo>
|
||||
|
||||
_property: connection.url => string
|
||||
The URL to connect to.
|
||||
@@ -34,10 +34,10 @@ _property: connection.headers => { [ key: string]: string }
|
||||
Additional headers to include in the connection.
|
||||
|
||||
|
||||
_heading: Poll Options @<web-polloptions>
|
||||
_heading: PollOptions @<PollOptions>
|
||||
|
||||
_property: options.timeout => number
|
||||
The amount of time allowed to ellapse before triggering a timeout
|
||||
The amount of time allowed to elapse before triggering a timeout
|
||||
error.
|
||||
|
||||
_property: options.floor => number
|
||||
@@ -59,6 +59,11 @@ _property: options.retryLimit => number
|
||||
The number of times to retry in the event of an error or //undefined// is
|
||||
returned.
|
||||
|
||||
_property: options.onceBlock => [[provider]]
|
||||
_property: options.onceBlock => [[Provider]]
|
||||
If this is specified, the polling will wait on new blocks from
|
||||
//provider// before attempting the //pollFunc// again.
|
||||
|
||||
_property: options.oncePoll => [[Provider]]
|
||||
If this is specified, the polling will occur on each poll
|
||||
cycle of //provider// before attempting the //pollFunc//
|
||||
again.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
_section: Wordlists @<wordlists>
|
||||
|
||||
_subsection: Wordlist @<wordlist>
|
||||
_subsection: Wordlist @<Wordlist>
|
||||
|
||||
_property: wordlist.locale => string
|
||||
The locale for this wordlist.
|
||||
@@ -19,7 +19,7 @@ _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>>
|
||||
_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.
|
||||
@@ -28,31 +28,36 @@ _property: Wordlist.register(wordlist [ , name ]) => void
|
||||
Register a wordlist with the list of wordlists, optionally overriding
|
||||
the registered //name//.
|
||||
|
||||
_subsection: Languages @<wordlist-languages>
|
||||
_subsection: Languages @<wordlists--languages>
|
||||
|
||||
The [official wordlists](link-bip39-wordlists) available at
|
||||
`ethers.wordlists`. In the browser, only the english language is
|
||||
available by default; to include the others (which increases the
|
||||
size of the library), see the dist files in the `ethers` package.
|
||||
|
||||
_property: ethers.wordlists.cz => Wordlist
|
||||
The Czech [[wordlist]].
|
||||
The Czech [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.en => Wordlist
|
||||
The English [[wordlist]].
|
||||
The English [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.es => Wordlist
|
||||
The Spanish [[wordlist]].
|
||||
The Spanish [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.fr => Wordlist
|
||||
The French [[wordlist]].
|
||||
The French [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.it => Wordlist
|
||||
The Italian [[wordlist]].
|
||||
The Italian [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.ja => Wordlist
|
||||
The Japanese [[wordlist]].
|
||||
The Japanese [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.ko => Wordlist
|
||||
The Korean [[wordlist]].
|
||||
The Korean [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.zh_cn => Wordlist
|
||||
The Simplified Chinese [[wordlist]].
|
||||
The Simplified Chinese [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.zh_tw => Wordlist
|
||||
The Traditional Chinese [[wordlist]].
|
||||
The Traditional Chinese [[Wordlist]].
|
||||
|
||||
@@ -2,7 +2,7 @@ _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.
|
||||
and disassemble EVM bytecode into human-readable mnemonics.
|
||||
|
||||
|
||||
_subsection: Help
|
||||
@@ -27,13 +27,11 @@ OTHER OPTIONS
|
||||
|
||||
_subsection: Example Input Files
|
||||
|
||||
_definition: **SimpleStore.asm**
|
||||
|
||||
_code: @lang<asm>
|
||||
_code: SimpleStore.asm @lang<asm>
|
||||
|
||||
; SimpleStore (uint)
|
||||
|
||||
; Set the inital value of 42
|
||||
; Set the initial value of 42
|
||||
sstore(0, 42)
|
||||
|
||||
; Init code to deploy myContract
|
||||
@@ -76,14 +74,16 @@ return(0, #myContract)
|
||||
; There is no *need* for the PUSH32, it just makes
|
||||
; decompiled code look nicer
|
||||
@checksum[
|
||||
{{= (defines.checksum ? concat([ Opcode.from("PUSH32"), id(myContract.source) ]): "0x") }}
|
||||
{{= (defines.checksum ? concat([
|
||||
Opcode.from("PUSH32"),
|
||||
id(myContract.source)
|
||||
]): "0x")
|
||||
}}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
_definition: **SimpleStore.bin**
|
||||
|
||||
_code: @lang<text>
|
||||
_code: SimpleStore.bin @lang<text>
|
||||
|
||||
0x602a6000556044601160003960446000f334601e5760003560e01c8063209652
|
||||
0x5514602457806355241077146030575b60006000fd5b60005460005260206000
|
||||
@@ -104,8 +104,8 @@ 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
|
||||
until the bytecode stabilizes. This allows for more compact jump
|
||||
destinations and for code to include more advanced meta-programming
|
||||
techniques.
|
||||
|
||||
_code: @lang<shell>
|
||||
@@ -144,7 +144,7 @@ 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.
|
||||
This does incur an additional gas cost of 8 gas per offset access though.
|
||||
|
||||
_definition: **-\-target LABEL**
|
||||
All programs have a root scope named ``_`` which is by default
|
||||
|
||||
@@ -62,7 +62,7 @@ TRANSACTION OPTIONS (default: query network)
|
||||
--gasPrice GWEI Default gas price for transactions(in wei)
|
||||
--gasLimit GAS Default gas limit for transactions
|
||||
--nonce NONCE Initial nonce for the first transaction
|
||||
--yes Always accept Siging and Sending
|
||||
--yes Always accept Signing and Sending
|
||||
|
||||
OTHER OPTIONS
|
||||
--wait Wait until transactions are mined
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
_section: Sandbox Utility
|
||||
|
||||
The sandbox utility provides a simple way to use the most common
|
||||
ethers utilities required during learning, debuging and managing
|
||||
ethers utilities required during learning, debugging and managing
|
||||
interactions with the Ethereum network.
|
||||
|
||||
If no command is given, it will enter a REPL interface with many
|
||||
@@ -64,7 +64,7 @@ TRANSACTION OPTIONS (default: query network)
|
||||
--gasPrice GWEI Default gas price for transactions(in wei)
|
||||
--gasLimit GAS Default gas limit for transactions
|
||||
--nonce NONCE Initial nonce for the first transaction
|
||||
--yes Always accept Siging and Sending
|
||||
--yes Always accept Signing and Sending
|
||||
|
||||
OTHER OPTIONS
|
||||
--wait Wait until transactions are mined
|
||||
@@ -78,9 +78,7 @@ OTHER OPTIONS
|
||||
|
||||
_subsection: Examples
|
||||
|
||||
_heading: Creating Wallets @<cliex-init>
|
||||
|
||||
_code: @lang<shell>
|
||||
_code: Creating New Wallets @lang<shell> @<cliex-init>
|
||||
|
||||
/home/ethers> ethers init wallet.json
|
||||
Creating a new JSON Wallet - wallet.json
|
||||
@@ -98,9 +96,7 @@ Saved: wallet.json
|
||||
Transaction Hash: 0x8dc55b8f8dc8076acded97f9e3ed7d6162460c0221e2769806006b6d7d1156e0
|
||||
|
||||
|
||||
_heading: Sending Ether and Tokens @<cliex-send>
|
||||
|
||||
_code: @lang<shell>
|
||||
_code: Sending Ether and Tokens @<cliex-send> @lang<shell>
|
||||
|
||||
# Sending ether
|
||||
/home/ricmoo> ethers --account wallet.json send ricmoo.firefly.eth 0.123
|
||||
@@ -147,9 +143,7 @@ Response:
|
||||
Hash: 0xd609ecb7e3b5e8d36fd781dffceede3975ece6774b6322ea56cf1e4d0a17e3a1
|
||||
|
||||
|
||||
_heading: Signing Messages @<cliex-signing>
|
||||
|
||||
_code: @lang<shell>
|
||||
_code: Signing Messages @<cliex-signing> @lang<shell>
|
||||
|
||||
/home/ethers> ethers --account wallet.json sign-message 'Hello World'
|
||||
Password (wallet.json): ******
|
||||
@@ -173,25 +167,47 @@ The ``eval`` command can be used to execute simple one-line scripts from
|
||||
the command line to be passed into other commands or stored in script
|
||||
environment variables.
|
||||
|
||||
_code: @lang<shell>
|
||||
|
||||
# Get the formatted balance of an account
|
||||
/home/ethers> ethers --network ropsten --account wallet.json eval 'accounts[0].getBalance().then(b => formatEther(b))'
|
||||
_code: Get the formatted balance of an account @lang<shell>
|
||||
/home/ethers> ethers --network ropsten \
|
||||
--account wallet.json \
|
||||
eval \
|
||||
'accounts[0].getBalance().then(b => formatEther(b))'
|
||||
3.141592653589793238
|
||||
|
||||
# Get the current block number
|
||||
/home/ethers> ethers --network rinkeby eval "provider.getBlockNumber()"
|
||||
_code: Get the current block number @lang<shell>
|
||||
/home/ethers> ethers --network rinkeby \
|
||||
eval "provider.getBlockNumber()"
|
||||
5761009
|
||||
|
||||
# Convert a Solidity signature to JSON
|
||||
/home/ethers> ethers eval 'utils.Fragment.from("function balanceOf(address owner) view returns (uint)").format("json")'
|
||||
{"type":"function","name":"balanceOf","constant":true,"stateMutability":"view","payble":false,"inputs":[{"type":"address","name":"owner"}],"ouputs":[{"type":"uint256"}]}
|
||||
_code: Convert a Solidity signature to JSON @lang<shell>
|
||||
/home/ethers> ethers eval 'utils.Fragment.from(
|
||||
"function balanceOf(address) view returns (uint)"
|
||||
).format("json")' | json_pp
|
||||
{
|
||||
"inputs" : [
|
||||
{
|
||||
"type" : "address",
|
||||
"name" : "owner"
|
||||
}
|
||||
],
|
||||
"type" : "function",
|
||||
"payble" : false,
|
||||
"stateMutability" : "view",
|
||||
"ouputs" : [
|
||||
{
|
||||
"type" : "uint256"
|
||||
}
|
||||
],
|
||||
"name" : "balanceOf",
|
||||
"constant" : true
|
||||
}
|
||||
|
||||
# Compute a topic hash
|
||||
|
||||
_code: Compute a topic hash @lang<shell>
|
||||
/home/ricmoo> ethers eval 'id("Transfer(address,address,uint256")'
|
||||
0xd99659a21de82e379975ce8df556f939a4ccb95e92144f38bb0dd35730ffcdd5
|
||||
|
||||
# Create a random mnemonic
|
||||
_code: Create a random mnemonic @lang<shell>
|
||||
/home/ricmoo> ethers eval 'Wallet.createRandom().mnemonic'
|
||||
useful pond inch knock ritual matrix giggle attend dilemma convince coach amazing
|
||||
|
||||
@@ -205,7 +221,7 @@ use to decrypt the account.
|
||||
|
||||
_code: @lang<shell>
|
||||
|
||||
/home/ricmoo> ethers --account public-mnemonic.txt --mnemonic-password
|
||||
/home/ricmoo> ethers --account mnemonic.txt --mnemonic-password
|
||||
Password (mnemonic): ******
|
||||
network: homestead (chainId: 1)
|
||||
homestead> accounts[0].getAddress()
|
||||
|
||||
@@ -21,7 +21,7 @@ associated plugin class will be instantiated and run.
|
||||
|
||||
_property: setPlugin(pluginClass) => void @<cli-setplugin> @SRC<cli/cli>
|
||||
Set a dedicated [[cli-plugin]] class which will handle all input. This
|
||||
may not be used in conjuction with addPlugin and will not automatically
|
||||
may not be used in conjunction with addPlugin and will not automatically
|
||||
accept a command from the arguments.
|
||||
|
||||
_property: showUsage([ message = "" [ , status = 0 ] ]) => never @<cli-showusage> @SRC<cli/cli>
|
||||
@@ -36,7 +36,7 @@ _subsection: Plugin @<cli-plugin> @SRC<cli:class.Plugin>
|
||||
Each **Plugin** manages each command of a CLI and is executed in phases.
|
||||
|
||||
If the usage (i.e. help) of a CLI is requested, the static methods ``getHelp``
|
||||
and ``getOptionHelp`` are used to geneate the help screen.
|
||||
and ``getOptionHelp`` are used to generate the help screen.
|
||||
|
||||
Otherwise, a plugin is instantiated and the ``prepareOptions`` is called. Each
|
||||
plugin **must** call ``super.prepareOptions``, otherwise the basic options are
|
||||
@@ -47,27 +47,27 @@ for a given option is invalid or some combination of options and flags is not
|
||||
allowed.
|
||||
|
||||
Once the prepareOptions is complete (the returned promise is resolved), the ``prepareArguments``
|
||||
is called. This should validate the number of arguments is expected and throw
|
||||
and error if there are too many or too few arguments or if any arguments do not
|
||||
is called. This should validate the number of arguments expected and throw
|
||||
an error if there are too many or too few arguments or if any arguments do not
|
||||
make sense.
|
||||
|
||||
Once the prepareArguments is complete (the returned promise is resolved), the ``run``
|
||||
is called.
|
||||
|
||||
_property: plugin.network => [[provider-network]]
|
||||
_property: plugin.network => [[providers-Network]]
|
||||
The network this plugin is running for.
|
||||
|
||||
_property: plugin.provider => [[provider]]
|
||||
_property: plugin.provider => [[Provider]]
|
||||
The provider for this plugin is running for.
|
||||
|
||||
_property: plugin.accounts => Array<[[signer]]>
|
||||
_property: plugin.accounts => Array<[[Signer]]>
|
||||
The accounts passed into the plugin using ``--account``,
|
||||
``--account-rpc`` and ``--account-void`` which this plugin can use.
|
||||
|
||||
_property: plugin.gasLimit => [[bignumber]]
|
||||
_property: plugin.gasLimit => [[BigNumber]]
|
||||
The gas limit this plugin should use. This is null if unspecified.
|
||||
|
||||
_property: plugin.gasPrice => [[bignumber]]
|
||||
_property: plugin.gasPrice => [[BigNumber]]
|
||||
The gas price this plugin should use. This is null if unspecified.
|
||||
|
||||
_property: plugin.nonce => number
|
||||
@@ -83,7 +83,7 @@ _property: plugin.prepareArgs(args) => Promise<void> @<plugin-prepareargs> @SR
|
||||
_property: plugin.run() => Promise<void> @<plugin-run> @SRC<cli/cli:Plugin.run>
|
||||
|
||||
_property: plugin.getAddress(addressOrName [ , message = "", [ allowZero = false ] ]) => Promise<string> @<plugin-getaddress> @SRC<cli/cli:Plugin.getAddress>
|
||||
A plugin should use this method to resolve an address. If the resovled address is
|
||||
A plugin should use this method to resolve an address. If the resolved address is
|
||||
the zero address and //allowZero// is not true, an error is raised.
|
||||
|
||||
_property: plugin.dump(header, info) => void @<plugin-dump> @SRC<cli/cli:Plugin.dump>
|
||||
@@ -92,7 +92,7 @@ formatted style. In the future, plugins may support a JSON output format
|
||||
which will automatically work with this method.
|
||||
|
||||
_property: plugin.throwUsageError([ message = "" ]) => never @<plugin-throwusageerror> @SRC<cli/cli>
|
||||
Stops exectuion of the plugin and shows the help screen of the plugin with
|
||||
Stops execution of the plugin and shows the help screen of the plugin with
|
||||
the optional //message//.
|
||||
|
||||
_property: plugin.throwError(message) => never @<plugin-throwerror> @SRC<cli/cli>
|
||||
@@ -133,7 +133,7 @@ Flags are simple binary options (such as the ``--yes``), which are true if prese
|
||||
otherwise false.
|
||||
|
||||
Options require a single parameter follow them on the command line
|
||||
(such as ``--account wallet.json``, which nhas the name ``account`` and the value
|
||||
(such as ``--account wallet.json``, which has the name ``account`` and the value
|
||||
``wallet.json``)
|
||||
|
||||
Arguments are all other values on the command line, and are not accessed through
|
||||
|
||||
39
docs.wrm/concepts/best-practices.wrm
Normal file
39
docs.wrm/concepts/best-practices.wrm
Normal file
@@ -0,0 +1,39 @@
|
||||
_section: Best Practices @<best-practices>
|
||||
|
||||
_subsection: Network Changes
|
||||
|
||||
Handling a change in the network (e.g. Ropsten vs Mainnet) is
|
||||
incredibly complex and a slight failure can at best make your
|
||||
application seem confusing and at worst cause the loss of funds,
|
||||
leak private data or misrepresent what an action performed.
|
||||
|
||||
Luckily, standard users should likely never change their networks
|
||||
unless tricked to do so or they make a mistake.
|
||||
|
||||
This is a problem you mainly need to worry about for developers, and
|
||||
most developers should understand the vast array of issues surrounding
|
||||
a network change during application operation and will understand the
|
||||
page reloading (which is already the default behaviour in many clients).
|
||||
|
||||
So, the best practice when a network change occurs is to simply
|
||||
refresh the page. This should cause all your UI components to
|
||||
reset to a known-safe state, including any banners and warnings
|
||||
to your users if they are on an unsupported network.
|
||||
|
||||
This can be accomplished by using the following function:
|
||||
|
||||
_code: Automatically Refresh on Network Change @lang<script>
|
||||
|
||||
// Force page refreshes on network changes
|
||||
{
|
||||
// The "any" network will allow spontaneous network changes
|
||||
const provider = new ethers.providers.Web3Provider(window.ethereum, "any");
|
||||
provider.on("network", (newNetwork, oldNetwork) => {
|
||||
// When a Provider makes its initial connection, it emits a "network"
|
||||
// event with a null oldNetwork along with the newNetwork. So, if the
|
||||
// oldNetwork exists, it represents a changing network
|
||||
if (oldNetwork) {
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1,7 +1,213 @@
|
||||
_section: Events
|
||||
_section: Events @<events>
|
||||
|
||||
Explain how topics and such work
|
||||
_subsection: Logs and Filtering
|
||||
|
||||
_subsection: Solidity Topics
|
||||
Logs and filtering are used quite often in blockchain applications,
|
||||
since they allow for efficient queries of indexed data and provide
|
||||
lower-cost data storage when the data is not required to be
|
||||
accessed on-chain.
|
||||
|
||||
How to compute the topic...
|
||||
These can be used in conjunction with the [Provider Events API](Provider--event-methods)
|
||||
and with the [Contract Events API](Contract--events).
|
||||
|
||||
The Contract Events API also provides [higher-level methods](Contract--filters)
|
||||
to compute and query this data, which should be preferred over the lower-level filter.
|
||||
|
||||
_heading: Filters @<events--filters>
|
||||
|
||||
When a Contract creates a log, it can include up to 4 pieces of
|
||||
data to be indexed by. The indexed data is hashed and included in
|
||||
a [[link-wiki-bloomfilter]], which is a data structure that allows
|
||||
for efficient filtering.
|
||||
|
||||
So, a filter may correspondingly have up to 4 topic-sets, where each
|
||||
topic-set refers to a condition that must match the indexed log topic
|
||||
in that position (i.e. each condition is ``AND``-ed together).
|
||||
|
||||
If a topic-set is ``null``, a log topic in that position is **not filtered**
|
||||
at all and **any value** matches.
|
||||
|
||||
If a topic-set is a single topic, a log topic in that position **must** match
|
||||
**that topic**.
|
||||
|
||||
If a topic-set is an array of topics, a log topic in that position must
|
||||
match **any one** of the topics (i.e. the topic in this position are ``OR``-ed).
|
||||
|
||||
This may sound complicated at first, but is more easily understood with
|
||||
some examples.
|
||||
|
||||
_table: Example Log Matching @style<full>
|
||||
|
||||
$TopicABaCD: **[** (topic[0] = A) **OR** (topic[0] = B) **]** **AND**
|
||||
**[** (topic[1] = C) **OR** (topic[1] = D) **]**
|
||||
|
||||
| **Topic-Sets** | **Matching Logs** <<|
|
||||
| [ A ] | topic[0] = A <<|
|
||||
| [ A, null ] | ^ |
|
||||
| [ null, B ] | topic[1] = B <<|
|
||||
| [ null, [ B ] ] | ^ |
|
||||
| [ null, [ B ], null ] | ^ |
|
||||
| [ A, B ] | (topic[0] = A) **AND** (topic[1] = B) <<|
|
||||
| [ A, [ B ] ] | ^ |
|
||||
| [ A, [ B ], null ] | ^ |
|
||||
| [ [ A, B ] ] | (topic[0] = A) **OR** (topic[0] = B) <<|
|
||||
| [ [ A, B ], null ] | ^ |
|
||||
| [ [ A, B ], [ C, D ] ] | $TopicABaCD <<|
|
||||
|
||||
|
||||
_code: ERC-20 Transfer Filter Examples @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const tokenAddress = ethers.constants.AddressZero;
|
||||
const myAddress = ethers.constants.AddressZero;
|
||||
const myOtherAddress = ethers.constants.AddressZero;
|
||||
const id = ethers.utils.id;
|
||||
const hexZeroPad = ethers.utils.hexZeroPad;
|
||||
// </hide>
|
||||
|
||||
// Short example of manually creating filters for an ERC-20
|
||||
// Transfer event.
|
||||
//
|
||||
// Most users should generally use the Contract API to
|
||||
// compute filters, as it is much simpler, but this is
|
||||
// provided as an illustration for those curious. See
|
||||
// below for examples of the equivalent Contract API.
|
||||
|
||||
// ERC-20:
|
||||
// Transfer(address indexed src, address indexed dst, uint val)
|
||||
//
|
||||
// -------------------^
|
||||
// ----------------------------------------^
|
||||
//
|
||||
// Notice that only *src* and *dst* are *indexed*, so ONLY they
|
||||
// qualify for filtering.
|
||||
//
|
||||
// Also, note that in Solidity an Event uses the first topic to
|
||||
// identify the Event name; for Transfer this will be:
|
||||
// id("Transfer(address,address,uint256)")
|
||||
//
|
||||
// Other Notes:
|
||||
// - A topic must be 32 bytes; so shorter types must be padded
|
||||
|
||||
// List all token transfers *from* myAddress
|
||||
filter = {
|
||||
address: tokenAddress,
|
||||
topics: [
|
||||
id("Transfer(address,address,uint256)"),
|
||||
hexZeroPad(myAddress, 32)
|
||||
]
|
||||
}
|
||||
|
||||
// List all token transfers *to* myAddress:
|
||||
filter = {
|
||||
address: tokenAddress,
|
||||
topics: [
|
||||
id("Transfer(address,address,uint256)"),
|
||||
null,
|
||||
hexZeroPad(myAddress, 32)
|
||||
]
|
||||
}
|
||||
|
||||
// List all token transfers *to* myAddress or myOtherAddress:
|
||||
filter = {
|
||||
address: tokenAddress,
|
||||
topics: [
|
||||
id("Transfer(address,address,uint256)"),
|
||||
null,
|
||||
[
|
||||
hexZeroPad(myAddress, 32),
|
||||
hexZeroPad(myOtherAddress, 32),
|
||||
]
|
||||
]
|
||||
}
|
||||
|
||||
_null:
|
||||
|
||||
To simplify life, ..., explain here, the contract API
|
||||
|
||||
|
||||
_code: ERC-20 Contract Filter Examples @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const tokenAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; // DAI
|
||||
const myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72";
|
||||
const otherAddress = "0xEA517D5a070e6705Cc5467858681Ed953d285Eb9";
|
||||
const provider = ethers.getDefaultProvider();
|
||||
const Contract = ethers.Contract;
|
||||
// </hide>
|
||||
|
||||
const abi = [
|
||||
"event Transfer(address indexed src, address indexed dst, uint val)"
|
||||
];
|
||||
|
||||
const contract = new Contract(tokenAddress, abi, provider);
|
||||
|
||||
// List all token transfers *from* myAddress
|
||||
contract.filters.Transfer(myAddress)
|
||||
//!
|
||||
|
||||
// List all token transfers *to* myAddress:
|
||||
contract.filters.Transfer(null, myAddress)
|
||||
//!
|
||||
|
||||
// List all token transfers *from* myAddress *to* otherAddress:
|
||||
contract.filters.Transfer(myAddress, otherAddress)
|
||||
//!
|
||||
|
||||
// List all token transfers *to* myAddress OR otherAddress:
|
||||
contract.filters.Transfer(null, [ myAddress, otherAddress ])
|
||||
//!
|
||||
|
||||
|
||||
_subsection: Solidity Topics @<events-solidity>
|
||||
|
||||
This is a quick (and non-comprehensive) overview of how events are computed
|
||||
in Solidity.
|
||||
|
||||
This is likely out of the scope for most developers, but may be interesting
|
||||
to those who want to learn a bit more about the underlying technology.
|
||||
|
||||
Solidity provides two types of events, anonymous and non-anonymous. The
|
||||
default is non-anonymous, and most developers will not need to worry about
|
||||
anonymous events.
|
||||
|
||||
For non-anonymous events, up to 3 topics may be indexed (instead of 4), since
|
||||
the first topic is reserved to specify the event signature. This allows
|
||||
non-anonymous events to always be filtered by their event signature.
|
||||
|
||||
This topic hash is always in the first slot of the indexed data, and is
|
||||
computed by normalizing the Event signature and taking the keccak256 hash
|
||||
of it.
|
||||
|
||||
For anonymous events, up to 4 topics may be indexed, and there is no
|
||||
signature topic hash, so the events cannot be filtered by the event
|
||||
signature.
|
||||
|
||||
Each additional indexed property is processed depending on whether its
|
||||
length is fixed or dynamic.
|
||||
|
||||
For fixed length types (e.g. ``uint``, ``bytes5``), all of which are
|
||||
internally exactly 32 bytes (shorter types are padded with zeros;
|
||||
numeric values are padded on the left, data values padded on the right),
|
||||
these are included directly by their actual value, 32 bytes of data.
|
||||
|
||||
For dynamic types (e.g. ``string``, ``uint256[]``) , the value is hashed
|
||||
using keccak256 and this hash is used.
|
||||
|
||||
Because dynamic types are hashed, there are important consequences in
|
||||
parsing events that should be kept in mind. Mainly that the original
|
||||
value is lost in the event. So, it is possible to tell is a topic is
|
||||
equal to a given string, but if they do not match, there is no way
|
||||
to determine what the value was.
|
||||
|
||||
If a developer requires that a string value is required to be both
|
||||
able to be filtered and also able to be read, the value must be included
|
||||
in the signature twice, once indexed and once non-indexed (e.g.
|
||||
``someEvent(string indexed searchBy, string clearText)``).
|
||||
|
||||
For a more detailed description, please refer to the
|
||||
[Solidity Event Documentation](link-solidity-events).
|
||||
|
||||
_heading: Other Things? TODO
|
||||
|
||||
Explain what happens to strings and bytes, how to filter and retain the value
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
_section: Ethereum Basics
|
||||
|
||||
This is a very breif overview of some aspects of //Ethereum//
|
||||
This is a brief overview of some aspects of //Ethereum//
|
||||
and blockchains which developers can make use of or should
|
||||
be aware of.
|
||||
|
||||
This section is sparse at the moment, but will be expanded
|
||||
as time goes on.
|
||||
|
||||
_toc:
|
||||
events
|
||||
gas
|
||||
security
|
||||
best-practices
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
_section: Security
|
||||
_section: Security @<security>
|
||||
|
||||
_subsection: Key Derivation Functions @<security-pbkdf>
|
||||
_subsection: Key Derivation Functions @<security--pbkdf>
|
||||
|
||||
This is not specific to Ethereum, but is a useful technique
|
||||
to understand and has some implications on User Experience.
|
||||
@@ -12,7 +12,7 @@ much stronger security.
|
||||
|
||||
The algorithm usually used for this process is [scrypt](link-wiki-scrypt),
|
||||
which is a memory and CPU intensive algorithm which computes
|
||||
a key (fixed-length psudo-random series of bytes) for a given
|
||||
a key (fixed-length pseudo-random series of bytes) for a given
|
||||
password.
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ _heading: Why does it take so long?
|
||||
The goal is to use as much CPU and memory as possible during
|
||||
this algorithm, so that a single computer can only compute a
|
||||
very small number of results for some fixed amount of time. To
|
||||
scale up an attack, the attacker requires additional compuers,
|
||||
scale up an attack, the attacker requires additional computers,
|
||||
increasing the cost to [brute-force attack](link-wiki-bruteforce)
|
||||
to guess the password.
|
||||
|
||||
@@ -50,7 +50,7 @@ progress callback which will be periodically called with a number between
|
||||
|
||||
In general a progress bar makes the experience feel faster, as well as
|
||||
more comfortable since there is a clear indication how much (relative) time
|
||||
is remaining. Additionally, using language like //"decrpyting..."// in
|
||||
is remaining. Additionally, using language like //"decrypting..."// in
|
||||
a progress bar makes a user feel like there time is not being //needlessly//
|
||||
wasted.
|
||||
|
||||
|
||||
@@ -43,6 +43,8 @@ function getDefinitions(source) {
|
||||
if (depth === 3) {
|
||||
add("var", node.name.escapedText, node.name.end);
|
||||
}
|
||||
} else if (ts.isGetAccessorDeclaration(node)) {
|
||||
add("getter", (lastClass + "." + node.name.text), node.name.end);
|
||||
}
|
||||
ts.forEachChild(node, (node) => { return visit(node, depth + 1); });
|
||||
}
|
||||
@@ -54,7 +56,7 @@ function getDefinitions(source) {
|
||||
|
||||
const getSourceUrl = (function(path, include, exclude) {
|
||||
console.log("Scanning TypeScript Sources...");
|
||||
const Link = "https://github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages$FILENAME#L$LINE";
|
||||
const Link = "https://github.com/ethers-io/ethers.js/blob/master/packages$FILENAME#L$LINE";
|
||||
const Root = resolve(__dirname, path);
|
||||
|
||||
const readdir = function(path) {
|
||||
@@ -116,6 +118,7 @@ const getSourceUrl = (function(path, include, exclude) {
|
||||
})("../packages/", new RegExp("packages/.*/src.ts/.*\.ts$"), new RegExp("/node_modules/|src.ts/.*browser.*"));
|
||||
|
||||
function codeContextify(context) {
|
||||
const { inspect } = require("util");
|
||||
const ethers = context.require("./packages/ethers");
|
||||
|
||||
context.ethers = ethers;
|
||||
@@ -126,30 +129,51 @@ function codeContextify(context) {
|
||||
context.hexlify = ethers.utils.hexlify;
|
||||
context.hexValue = ethers.utils.hexValue;
|
||||
context.Wallet = ethers.Wallet;
|
||||
context.provider = new ethers.providers.InfuraProvider("mainnet", "49a0efa3aaee4fd99797bfa94d8ce2f1");
|
||||
|
||||
context._inspect = function(value) {
|
||||
if (context.BigNumber.isBigNumber(value)) {
|
||||
return `{ BigNumber: ${ JSON.stringify(value.toString()) } }`;
|
||||
// We use a local dev node for some signing examples, but want to
|
||||
// resolve ENS names against mainnet; super hacky but makes the
|
||||
// docs nicer
|
||||
context.localProvider = new ethers.providers.JsonRpcProvider();
|
||||
context.localSigner = context.localProvider.getSigner();
|
||||
context.localProvider.resolveName = context.provider.resolveName.bind(context.provider);
|
||||
|
||||
context.BigNumber.prototype[inspect.custom] = function(depth, options) {
|
||||
return `{ BigNumber: ${JSON.stringify(this.toString()) } }`;
|
||||
}
|
||||
|
||||
|
||||
context._inspect = function(value, depth) {
|
||||
if (value && value.constructor && value.constructor.name === "Uint8Array") {
|
||||
return `Uint8Array [ ${ Array.prototype.join.call(value, ", ") } ]`;
|
||||
}
|
||||
|
||||
if (value && typeof(value.length) === "number" && typeof(value) !== "string") {
|
||||
return "[ " + Array.prototype.map.call(value, (i) => context._inspect(i)).join(", ") + " ]";
|
||||
}
|
||||
|
||||
return JSON.stringify(value);
|
||||
//return JSON.stringify(value);
|
||||
return inspect(value, {
|
||||
compact: false,
|
||||
depth: null,
|
||||
breakLength: Infinity,
|
||||
sorted: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
title: "ethers",
|
||||
subtitle: "v5.0-beta",
|
||||
subtitle: "v5.2",
|
||||
description: "Documentation for ethers, a complete, tiny and simple Ethereum library.",
|
||||
logo: "logo.svg",
|
||||
|
||||
link: "https://docs-beta.ethers.io",
|
||||
copyright: "The content of this site is licensed under the [Creative Commons Attribution 4.0 International License](https://choosealicense.com/licenses/cc-by-4.0/).",
|
||||
socialImage: "social.jpg",
|
||||
|
||||
prefix: "/v5",
|
||||
|
||||
link: "https:/\/docs.ethers.io",
|
||||
copyright: "The content of this site is licensed under the [Creative Commons License](https:/\/choosealicense.com/licenses/cc-by-4.0/). Generated on &$now;.",
|
||||
|
||||
markdown: {
|
||||
"banner": "-----\n\nDocumentation: [html](https://docs-beta.ethers.io/)\n\n-----\n\n"
|
||||
"banner": "-----\n\nDocumentation: [html](https://docs.ethers.io/)\n\n-----\n\n"
|
||||
},
|
||||
|
||||
codeContextify: codeContextify,
|
||||
@@ -159,24 +183,53 @@ module.exports = {
|
||||
codeRoot: "../",
|
||||
|
||||
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-mail": "mailto:me@ricmoo.com",
|
||||
"link-alchemy": { name: "Alchemy", url: "https:/\/alchemyapi.io" },
|
||||
"link-cloudflare": { name: "Cloudflare", url: "https:/\/developers.cloudflare.com/distributed-web/ethereum-gateway/" },
|
||||
"link-ens": { name: "ENS", url: "https:/\/ens.domains/" },
|
||||
"link-ethereum": { name: "Ethereum", url: "https:/\/ethereumorg" },
|
||||
"link-etherscan": { name: "Etherscan", url: "https:/\/etherscan.io" },
|
||||
"link-expo": { name: "Expo", url: "https:/\/expo.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-flatworm": { name: "Flatworm", url: "https:/\/github.com/ricmoo/flatworm" },
|
||||
"link-geth": { name: "Geth", url: "https:/\/geth.ethereum.org" },
|
||||
"link-infura": { name: "INFURA", url: "https:/\/infura.io" },
|
||||
"link-javascriptcore": { name: "JavaScriptCore", url: "https:/\/developer.apple.com/documentation/javascriptcore?language=objc" },
|
||||
"link-ledger": "https:/\/www.ledger.com",
|
||||
"link-metamask": "https:/\/metamask.io/",
|
||||
"link-parity": "https:/\/www.parity.io",
|
||||
"link-metamask": { name: "Metamask", url: "https:/\/metamask.io/" },
|
||||
"link-otto": "https:/\/github.com/robertkrimen/otto",
|
||||
"link-parity": { name: "Parity", url: "https:/\/www.parity.io" },
|
||||
"link-pocket": { name: "Pocket Network", url: "https:/\/pokt.network" },
|
||||
"link-react-native": { name: "React Native", url: "https:/\/reactnative.dev" },
|
||||
"link-rtd": "https:/\/github.com/readthedocs/sphinx_rtd_theme",
|
||||
"link-semver": { name: "semver", url: "https:/\/semver.org" },
|
||||
"link-solidity": { name: "Solidity" , url: "https:/\/solidity.readthedocs.io/en/v0.6.2/" },
|
||||
"link-sphinx": "https:/\/www.sphinx-doc.org/",
|
||||
"link-solidity": { name: "Solidity" , url: "https:/\/solidity.readthedocs.io/" },
|
||||
"link-solidity-errors": "https:/\/docs.soliditylang.org/en/v0.8.4/abi-spec.html#errors",
|
||||
"link-solidity-events": "https:/\/docs.soliditylang.org/en/v0.8.4/abi-spec.html#events",
|
||||
"link-sphinx": { name: "Sphinx", url: "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-alchemy-signup": "https:/\/dashboard.alchemyapi.io/signup?referral=55a35117-028e-4b7c-9e47-e275ad0acc6d",
|
||||
"link-etherscan-signup": "https:/\/etherscan.io/apis",
|
||||
"link-etherscan-ratelimit": "https:/\/info.etherscan.com/api-return-errors/",
|
||||
"link-infura-signup": "https:/\/infura.io/register",
|
||||
"link-pocket-signup": "https:/\/pokt.network/pocket-gateway-ethereum-mainnet/",
|
||||
|
||||
"link-json-rpc": "https:/\/github.com/ethereum/wiki/wiki/JSON-RPC",
|
||||
"link-web3-send": "https:/\/github.com/ethereum/web3.js/blob/1.x/packages/web3-providers-http/types/index.d.ts#L57",
|
||||
"link-parity-trace": "https:/\/openethereum.github.io/wiki/JSONRPC-trace-module",
|
||||
"link-parity-rpc": "https:/\/openethereum.github.io/wiki/JSONRPC",
|
||||
"link-geth-debug": "https:/\/github.com/ethereum/go-ethereum/wiki/Management-APIs#debug",
|
||||
"link-geth-rpc": "https:/\/github.com/ethereum/go-ethereum/wiki/Management-APIs",
|
||||
|
||||
"link-legacy-docs3": "https:/\/docs.ethers.io/v3/",
|
||||
"link-legacy-docs4": "https:/\/docs.ethers.io/v4/",
|
||||
|
||||
"link-github-ci": "https:/\/github.com/ethers-io/ethers.js/actions/runs/158006903",
|
||||
"link-github-issues": "https:/\/github.com/ethers-io/ethers.js/issues",
|
||||
|
||||
"link-issue-407": "https:/\/github.com/ethers-io/ethers.js/issues/407",
|
||||
|
||||
"link-infura-secret": "https:/\/infura.io/docs/gettingStarted/authentication",
|
||||
|
||||
"link-web3": "https:/\/github.com/ethereum/web3.js",
|
||||
"link-web3-http": "https:/\/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-http",
|
||||
@@ -184,41 +237,56 @@ module.exports = {
|
||||
"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-bip39-wordlists": "https:/\/github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md",
|
||||
|
||||
"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-mit": { name: "MIT License", url: "https:/\/en.m.wikipedia.org/wiki/MIT_License" },
|
||||
"link-namehash": { name: "namehash", url: "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-js": "https:/\/cdn.ethers.io/lib/ethers-5.1.esm.min.js",
|
||||
"link-ethers-npm": "https:/\/www.npmjs.com/search?q=%40ethersproject%2F",
|
||||
"link-ethers-asm-grammar": "https:/\/github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages/asm/grammar.jison",
|
||||
"link-ethers-asm-grammar": "https:/\/github.com/ethers-io/ethers.js/blob/master/packages/asm/grammar.jison",
|
||||
|
||||
"link-eip-155": { name: "EIP-155", url: "https:/\/eips.ethereum.org/EIPS/eip-155" },
|
||||
"link-eip-191": { name: "EIP-191", url: "https:/\/eips.ethereum.org/EIPS/eip-191" },
|
||||
"link-eip-609": "https:/\/eips.ethereum.org/EIPS/eip-609",
|
||||
"link-eip-1014": "https:/\/eips.ethereum.org/EIPS/eip-1014",
|
||||
"link-eip-609": { name: "EIP-609", url: "https:/\/eips.ethereum.org/EIPS/eip-609" },
|
||||
"link-eip-634": { name: "EIP-634", url: "https:/\/eips.ethereum.org/EIPS/eip-634" },
|
||||
"link-eip-712": { name: "EIP-712", url: "https:/\/eips.ethereum.org/EIPS/eip-712" },
|
||||
"link-eip-1014": { name: "EIP-1014", url: "https:/\/eips.ethereum.org/EIPS/eip-1014" },
|
||||
"link-eip-1193": { name: "EIP-1193", url: "https:/\/eips.ethereum.org/EIPS/eip-1193" },
|
||||
"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-eip-1577": { name: "EIP-1577", url: "https:/\/eips.ethereum.org/EIPS/eip-1577" },
|
||||
"link-eip-2098": { name: "EIP-2098", url: "https:/\/eips.ethereum.org/EIPS/eip-2098" },
|
||||
"link-eip-2304": { name: "EIP-2304", url: "https:/\/eips.ethereum.org/EIPS/eip-2304" },
|
||||
"link-eip-2718": { name: "EIP-2718", url: "https:/\/eips.ethereum.org/EIPS/eip-2718" },
|
||||
"link-eip-2930": { name: "EIP-2930", url: "https:/\/eips.ethereum.org/EIPS/eip-2930" },
|
||||
"link-bip-39": { name: "BIP-39", url: "https:/\/en.bitcoin.it/wiki/BIP_0039" },
|
||||
"link-bip-32": { name: "BIP-32", url: "https:/\/github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" },
|
||||
"link-bip-44": { name: "BIP-44", url: "https:/\/en.bitcoin.it/wiki/BIP_0044" },
|
||||
|
||||
"link-npm-elliptic": { name: "elliptic", url: "https:/\/www.npmjs.com/package/elliptic" },
|
||||
"link-npm-ethersproject-shims": { name: "Shims", url: "https:/\/www.npmjs.com/package/@ethersproject/shims" },
|
||||
"link-npm-events": { name: "EventEmitter", url: "https:/\/nodejs.org/dist/latest-v13.x/docs/api/events.html#events_class_eventemitter" },
|
||||
"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-npm-react-native-get-random-values": { name: "React Native get-random-values", url: "https:/\/www.npmjs.com/package/react-native-get-random-values" },
|
||||
|
||||
"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-proxy": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy",
|
||||
"link-js-typedarray": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray",
|
||||
|
||||
"link-cors": { name: "CORS", url: "https:/\/developer.mozilla.org/en-US/docs/Web/HTTP/CORS" },
|
||||
|
||||
"link-ricmoo-humanreadableabi": "https:/\/blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917",
|
||||
|
||||
"link-other-ethereum-dev-docs": "https:/\/ethereum.org/en/developers/docs/",
|
||||
|
||||
"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" },
|
||||
@@ -229,6 +297,7 @@ module.exports = {
|
||||
"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-observer-pattern": { name: "Obeserver Pattern", url: "https:/\/en.wikipedia.org/wiki/Observer_pattern" },
|
||||
"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",
|
||||
@@ -240,5 +309,5 @@ module.exports = {
|
||||
"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" },
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
_section: Contributing and Hacking
|
||||
_section: Contributing and Hacking @<contributing>
|
||||
|
||||
The ethers.js library is something that I've written out of necessity,
|
||||
and has grown somewhat organically over time.
|
||||
@@ -7,7 +7,7 @@ Many things are the way they are for good (at the time, at least) reasons,
|
||||
but I always welcome criticism, and am completely willing to have my mind
|
||||
changed on things.
|
||||
|
||||
So, pull requests are always welcome, but please keep a few points in mind:
|
||||
Pull requests are always welcome, but please keep a few points in mind:
|
||||
|
||||
- Backwards-compatibility-breaking changes will not be accepted; they may be
|
||||
considered for the next major version
|
||||
@@ -15,19 +15,209 @@ So, pull requests are always welcome, but please keep a few points in mind:
|
||||
arguments as to why
|
||||
- The library aims to be lean, so keep an eye on the dist/ethers.min.js
|
||||
file size before and after your changes
|
||||
- Keep the PR simple and readable; only modify files in the ``docs.wrm/``
|
||||
and ``packages/*/src.ts/`` folders, as this allows the changes to be easily
|
||||
verified
|
||||
- Add test cases for both expected and unexpected input
|
||||
- Any new features need to be supported by me (future issues, documentation,
|
||||
testing, migration), so anything that is overly complicated or specific
|
||||
may not be accepted
|
||||
|
||||
In general, **please start an issue //before// beginning a pull request**, so we can
|
||||
have a public discussion and figure out the best way to address to problem/feature.
|
||||
have a public discussion and figure out the best way to address the problem/feature.
|
||||
**:)**
|
||||
|
||||
|
||||
_subsection: Building
|
||||
_subsection: Building @<contributing--building>
|
||||
|
||||
use npm run auto-build
|
||||
The build process for ethers is unfortunatly not super trivial, but
|
||||
I have attempted to make it as straight-forward as possible.
|
||||
|
||||
use npm run update-version
|
||||
It is a mono-repo which attempts to be compatibile with a large
|
||||
number of environments, build tools and platforms, which is why
|
||||
there are a some weird things it must do.
|
||||
|
||||
There are several custom scripts in the ``misc/admin`` folder
|
||||
to help manage the monorepo. Developers working on contributing
|
||||
to ethers should not generally need to worry about those, since
|
||||
they are wrapped up behind ``npm run SCRIPT`` operations.
|
||||
|
||||
_code: Installing @lang<shell>
|
||||
|
||||
# Clone the repository
|
||||
/home/ricmoo> git clone https://github.com/ethers-io/ethers.js.git
|
||||
|
||||
/home/ricmoo> cd ethers.js
|
||||
|
||||
# Install all dependencies:
|
||||
# - Hoists all sub-package dependencies in the package.json (preinstall)
|
||||
# - Installs all the (hoisted) dependencies and devDependencies (install)
|
||||
# - Build the rat-nests (in .package_node_modules) (postinstall)
|
||||
# - Create a dependency graph for the TypeScript (postinstall)
|
||||
# - Link the rat-nets into each project (postinstall)
|
||||
/home/ricmoo/ethers.js> npm install
|
||||
|
||||
_heading: Making Changes @<contributing--updating>
|
||||
|
||||
Once your environment is set up, you should be able to simply
|
||||
start the ``auto-build`` feature, and make changes to the
|
||||
TypeScript source.
|
||||
|
||||
_code: Watching and Building @lang<shell>
|
||||
|
||||
# Begin watching the files and re-building whenever they change
|
||||
/home/ricmoo/ethers.js> npm run auto-build
|
||||
|
||||
# Or if you do not want to watch and just build
|
||||
/home/ricmoo/ethers.js> npm run build
|
||||
|
||||
_heading: Creating Browser-Ready Files
|
||||
|
||||
To create files for use directly in a browser, the distribution
|
||||
files (located in ``packages/ethers/dist``) need to be built
|
||||
which requires several intermediate builds, scripts and for
|
||||
various rollup scripts to execute.
|
||||
|
||||
_code: Building Distribution Files @lang<shell>
|
||||
|
||||
# If you need to rebuild all the libs (esm + cjs) and dist files
|
||||
# Note: this requires node 10 or newer
|
||||
/home/ricmoo/ethers.js> npm run build-all
|
||||
|
||||
_heading: Testing
|
||||
|
||||
_code: Testing @lang<shell>
|
||||
|
||||
# Rebuilds all files (npm run build-all) and bundles testcases up for testing
|
||||
/home/ricmoo/ethers.js> npm test
|
||||
|
||||
# Often you don't need the full CI experience
|
||||
/home/ricmoo/ethers.js> npm run test-node
|
||||
|
||||
_heading: Distribution
|
||||
|
||||
Most developers should not ever require this step, but for people
|
||||
forking ethers and creating alternates (for example if you have
|
||||
a non-EVM compatible chain but are trying to reuse this package).
|
||||
|
||||
This script will rebuild the entire ethers project, compare it
|
||||
against npm, re-write package versions, update internal hashes,
|
||||
re-write various TypeScript files (to get around some ES+TS
|
||||
limitations for Tree Shaking and linking), re-write map files,
|
||||
bundle stripped versions of dependencies and basically just a
|
||||
whole bunch of stuff.
|
||||
|
||||
If you use this and get stuck, [message me](link-mail).
|
||||
|
||||
_code: Preparing the Distribution @lang<shell>
|
||||
|
||||
# Prepare all the distribution files
|
||||
# - Remove all generated files (i.e. npm run clean)
|
||||
# - Re-install all dependencies, hoisting, etc. (npm install)
|
||||
# - Spell check all strings in every TypeScript files
|
||||
# - Build everything from scratch with this clean install
|
||||
# - Compare local with npm, bumping the version if changed
|
||||
# - Build everything again (with the updated versions)
|
||||
# - Update the CHANGELOG.md with the git history since the last change
|
||||
/home/ricmoo/ethers.js> npm run update-version
|
||||
|
||||
_note: Do NOT check in dist files in a PR
|
||||
|
||||
For Pull Requests, please ONLY commit files in the ``docs.wrm/`` and
|
||||
``packages/*/src.ts/`` folders. I will prepare the distribution builds
|
||||
myself and keeping the PR relevant makes it easier to verify the changes.
|
||||
|
||||
_heading: Publishing
|
||||
|
||||
Again, this should not be necessary for most developers. This step
|
||||
requires using the ``misc/admin/cmds/config-set`` script for a number
|
||||
of values, including private keys, NPM session keys, AWS access keys,
|
||||
GitHub API tokens, etc.
|
||||
|
||||
The config file is encrypted with about 30 seconds of scrypt password-based
|
||||
key derivation function, so brute-forcing the file is quite expensive.
|
||||
|
||||
The config file also contains a plain-text mnemonic. This is a money-pot.
|
||||
Place a tempting amount of ether or Bitcoin on this account and set up an
|
||||
e-mail alert for this account.
|
||||
|
||||
If any attacker happens across your encrypted config, they will have instant
|
||||
access to the plain-text mnemonic, so they have the option to immediately
|
||||
steal the ether (i.e. the responsible-disclosure bond).
|
||||
|
||||
If you ever see this ether taken, your encrypted file is compromised! Rotate
|
||||
all your AWS keys, NPM session keys, etc. immedately.
|
||||
|
||||
@TODO: document all the keys that need to be set for each step
|
||||
|
||||
_code: Preparing the Distribution @lang<shell>
|
||||
|
||||
# Publish
|
||||
# - Update any changed packages to NPM
|
||||
# - Create a release on GitHub with the latest CHANGELOG.md description
|
||||
# - Upload the bundled files the the CDN
|
||||
# - Flush the CDN edge caches
|
||||
/home/ricmoo/ethers.js> npm run publish-all
|
||||
|
||||
|
||||
_subsection: Documentation @<contributing--documentation>
|
||||
|
||||
The documents are generated using [Flatworm](flatworm) documentation
|
||||
generation tool, which was written for the purpose of writing the documentation
|
||||
for ethers.
|
||||
|
||||
Style Guide (this section will have much more coming):
|
||||
|
||||
- Try to keep lines no longer than //around// 80 characters
|
||||
- Avoid inline links in the source; use the ``externalLinks`` field in the config.js
|
||||
- Prefix external links with ``link-``
|
||||
- Changing an anchor name must be well justified, as it will break all existing links
|
||||
to that section; flatworm will support symlinks in the future
|
||||
- In general, I aim for consistency; look to similar situations throughout the documentation
|
||||
|
||||
|
||||
_heading: Building
|
||||
|
||||
To build the documentation, you should first follow the
|
||||
[above steps](contributing--building) to build the ethers library.
|
||||
|
||||
Building the docs will generate several types of output:
|
||||
|
||||
- A full set of HTML pages, linking across each other
|
||||
- A single one-page HTML page with all pages linking to local anchors
|
||||
- A full set of README.md pages organized to be browsable and linkable in GitHub
|
||||
- A metadata dump for tool ingestion (still needs more work)
|
||||
- (@TODO; only half done) The documentation as a LaTeX and generated PDF
|
||||
|
||||
_code: Building the Documentations @lang<shell>
|
||||
|
||||
/home/ricmoo/ethers.js> npm run build-docs
|
||||
|
||||
|
||||
_heading: Evaluation
|
||||
|
||||
When building the documentation, all code samples are run through a JavaScript
|
||||
VM to ensure there are no typos in the example code, as well the exact output
|
||||
of results are injected into the output, so there is no need to keep the results
|
||||
and code in-sync.
|
||||
|
||||
However, this can be a bit of a headache when making many small changes, so to
|
||||
build the documentation faster, you can skip the evaluation step, which will
|
||||
inject the code directly.
|
||||
|
||||
_code: Build docs skipping evaluation @lang<shell>
|
||||
|
||||
/home/ricmoo/ethers.js> npm run build-docs -- --skip-eval
|
||||
|
||||
|
||||
_heading: Previewing Changes
|
||||
|
||||
To preview the changes locally, you can use any standard web server and run
|
||||
from the ``/docs/`` folder, or use the built-in web server.
|
||||
|
||||
The same caveats as normal web development apply, such flushing browser
|
||||
caches after changing (and re-building) the docs.
|
||||
|
||||
_code: Running a webserver @lang<shell>
|
||||
|
||||
/home/ricmoo/ethers.js> npm run serve-docs
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
_section: Cookbook
|
||||
|
||||
Cooking...
|
||||
A collection (that will grow over time) of common, simple
|
||||
snippets of code that are in general useful.
|
||||
|
||||
_toc:
|
||||
|
||||
react-native
|
||||
|
||||
|
||||
60
docs.wrm/cookbook/react-native.wrm
Normal file
60
docs.wrm/cookbook/react-native.wrm
Normal file
@@ -0,0 +1,60 @@
|
||||
_section: React Native (and ilk) @<cookbook-reactnative>
|
||||
|
||||
The [[link-react-native]] framework has become quite popular and
|
||||
has many popular forks, such as [[link-expo]].
|
||||
|
||||
React Native is based on [[link-javascriptcore]] (part of WebKit) and
|
||||
does not use Node.js or the common Web and DOM APIs. As such,
|
||||
there are many operations missing that a normal web environment
|
||||
or Node.js instance would provide.
|
||||
|
||||
For this reason, there is a [[link-npm-ethersproject-shims]] module
|
||||
provided to fill in the holes.
|
||||
|
||||
|
||||
_subsection: Installing @<cookbook-reactnative-shims>
|
||||
|
||||
To use ethers in React Native, you must either provide shims for the needed
|
||||
missing functionality, or use the ethers.js shim.
|
||||
|
||||
It is **HIGHLY RECOMMENDED** you check out the [security section](cookbook-reactnative-security)
|
||||
below for instructions on installing packages which can affect the security
|
||||
of your application.
|
||||
|
||||
After installing packages, you may need to restart your packager and company.
|
||||
|
||||
_code: Installing @lang<shell>
|
||||
|
||||
/home/ricmoo/my-react-project> npm install @ethersproject/shims --save
|
||||
|
||||
_code: Importing @lang<script>
|
||||
|
||||
// Pull in the shims (BEFORE importing ethers)
|
||||
import "@ethersproject/shims"
|
||||
|
||||
// Import the ethers library
|
||||
import { ethers } from "ethers";
|
||||
|
||||
|
||||
_subsection: Security @<cookbook-reactnative-security>
|
||||
|
||||
The React Native environment does not contain a secure random source, which
|
||||
is used when computing random private keys. This could result in private
|
||||
keys that others could possibly guess, allowing funds to be stolen and assets
|
||||
manipulated.
|
||||
|
||||
For this reason, it is **HIGHLY RECOMMENDED** to also install the
|
||||
[[link-npm-react-native-get-random-values]], which **must** be included
|
||||
before the shims. If it worked correctly you should not receive any
|
||||
warning in the console regarding missing secure random sources.
|
||||
|
||||
_code: Importing with Secure Random Sources @lang<script>
|
||||
|
||||
// Import the crypto getRandomValues shim (**BEFORE** the shims)
|
||||
import "react-native-get-random-values"
|
||||
|
||||
// Import the the ethers shims (**BEFORE** ethers)
|
||||
import "@ethersproject/shims"
|
||||
|
||||
// Import the ethers library
|
||||
import { ethers } from "ethers";
|
||||
@@ -1,6 +1,6 @@
|
||||
_section: Flatworm Docs
|
||||
_section: Flatworm Docs @<flatworm>
|
||||
|
||||
The //Flatworm Docs// rendering script is designed to be **very**
|
||||
The //Flatworm Docs// rendering engine is designed to be **very**
|
||||
simple, but provide enough formatting necessary for documenting
|
||||
JavaScript libraries.
|
||||
|
||||
@@ -10,10 +10,12 @@ the [Sphinx](link-sphinx) project.
|
||||
|
||||
_subsection: Fragments @<flatworm-fragments>
|
||||
|
||||
Flatworm Docs are made up of fragments. A fragment is either a lone
|
||||
body of [markdown](flatworm-markdown) text, or a
|
||||
[directive](flatworm-directive) for specialized formatting, which may
|
||||
itself have body.
|
||||
Each page is made up of fragments. A fragment is a [directive](flatworm-directive),
|
||||
with an value and optional //link//, //extensions// and a body.
|
||||
|
||||
Many directives support [markdown](flatworm-markdown) in their value and body.
|
||||
|
||||
A fragment's body continues until another fragment is encountered.
|
||||
|
||||
|
||||
_heading: Directive Format
|
||||
@@ -23,6 +25,8 @@ _code: @lang<text>
|
||||
\_DIRECTIVE: VALUE @<LINK> @EXTENSION<PARAMETER>
|
||||
BODY
|
||||
|
||||
MORE BODY
|
||||
|
||||
DIRECTIVE: The directive name
|
||||
VALUE: Optional; the value to pass to the directive
|
||||
LINK: Optional; a name for internal linking
|
||||
@@ -36,99 +40,141 @@ _heading: Flatworm Directives @<flatworm-directive>
|
||||
_definition: **_section:** //TITLE//
|
||||
A //section// has its **TITLE** in an H1 font. Sections are linked
|
||||
to in //Table of Contents// and have a dividing line drawn above
|
||||
them. If an option is specified, it is avaialble as a name for
|
||||
intern linking. There should only be one ``_section:`` per page.
|
||||
them.
|
||||
|
||||
**Extensions:** @INHERIT, @SRC, @NAV, @NOTE
|
||||
The body supports markdown.
|
||||
|
||||
There should only be one ``_section:`` per page.
|
||||
|
||||
**Extensions:** [@inherit](flatworm--ext-inherit), [@src](flatworm--ext-src), [@nav](flatworm--ext-nav), [@note](flatworm--ext-note)
|
||||
|
||||
_definition: **_subsection:** //TITLE//
|
||||
A //subsection// has its **TITLE** in an H2 font. Subsections are linked
|
||||
to in //Table of Contents// and have a dividing line drawn above
|
||||
them. If an option is specified, it is avaialble as a name for
|
||||
internal linking.
|
||||
them.
|
||||
|
||||
**Extensions:** @INHERIT, @SRC, @NOTE
|
||||
The title and body support markdown.
|
||||
|
||||
**Extensions:** [@inherit](flatworm--ext-inherit), [@src](flatworm--ext-src), [@note](flatworm--ext-note)
|
||||
|
||||
_definition: **_heading:** //TITLE//
|
||||
A //heading// has its **TITLE** in an H3 font. If an option is specified,
|
||||
it is available as a name for internal linking.
|
||||
A //heading// has its **TITLE** in an H3 font.
|
||||
|
||||
**Extensions:** @INHERIT, @SRC, @NOTE
|
||||
The title and body support markdown.
|
||||
|
||||
**Extensions:** [@inherit](flatworm--ext-inherit), [@src](flatworm--ext-src), [@note](flatworm--ext-note)
|
||||
|
||||
_definition: **_definition:** //TERM//
|
||||
A //definition// has its **TERM** bolded and the markdown body is
|
||||
A //definition// has its **TERM** in normal text and the body is
|
||||
indented.
|
||||
|
||||
The title and body support markdown.
|
||||
|
||||
_definition: **_property:** //SIGNATURE//
|
||||
A //property// has its JavaScript **SIGNATURE** formatted and the
|
||||
markdown body is indented.
|
||||
A //property// has its JavaScript **SIGNATURE** formatted.
|
||||
|
||||
**Extensions:** @SRC
|
||||
The body supports markdown and the return portion of the signature
|
||||
support markdown links.
|
||||
|
||||
_definition: **_note:** //TITLE//
|
||||
**Extensions:** [@src](flatworm--ext-src)
|
||||
|
||||
_definition: **_note:** //BANNER//
|
||||
A //note// is placed in a blue bordered-box to draw attention to it.
|
||||
|
||||
_definition: **_warning:** //TITLE//
|
||||
The body supports markdown.
|
||||
|
||||
_definition: **_warning:** //BANNER//
|
||||
A //warning// is placed in an orange bordered-box to draw attention to it.
|
||||
|
||||
_definition: **_code:** //TITLE//
|
||||
A //code// creates a code block.
|
||||
The body supports markdown.
|
||||
|
||||
**Extensions:** @LANG
|
||||
_definition: **_code:** //CAPTION//
|
||||
Creates a [Code](flatworm--code) block.
|
||||
|
||||
For JavaScript files, the file is executed, with ``\/\/!`` replaced
|
||||
with the result of the last statement and ``\/\/!error`` is replaced
|
||||
with the throw error. If the error state does not agree, rendering
|
||||
fails.
|
||||
The body does **not** support markdown, and will be output exactly as
|
||||
is, with the exception of [Code Evaluation](flatworm--code-eval).
|
||||
|
||||
If a line begins with a ``"_"``, it should be escaped with a ``"\\"``.
|
||||
|
||||
**Extensions:** [@lang](flatworm--ext-lang)
|
||||
|
||||
_definition: **_table:** //FOOTER//
|
||||
|
||||
Creates a [Table](flatworm--table) structured according to the body.
|
||||
|
||||
Each cell contents supports markdown and variables supports markdown.
|
||||
|
||||
**Extensions:** [@style](flatworm--ext-style)
|
||||
|
||||
_definition: **_toc:**
|
||||
A //toc// injects a Table of Contents, loading each line of the
|
||||
body as a filename and recursively loads the //toc// if present,
|
||||
otherwise all the //sections// and //subsections//.
|
||||
|
||||
The body does **not** support markdown, as it is interpreted as
|
||||
a list of files and directories to process.
|
||||
|
||||
_definition: **_null:**
|
||||
A //null// is used to terminated a directive. For example, after
|
||||
a //definition//, the bodies are indented, so a //null// can be
|
||||
used to reset the indentation.
|
||||
|
||||
The body supports markdown.
|
||||
|
||||
_heading: Examples @<>
|
||||
_code: Example @lang<text>
|
||||
|
||||
_code: @lang<text>
|
||||
\_section: Hello World @<link-main>
|
||||
Body for section...
|
||||
|
||||
\_section: Hello World @<link-to-this-section>
|
||||
|
||||
\_subsection: Some Example @<link-to-this-subsection>
|
||||
\_subsection: Some Example @<link-secondary>
|
||||
Body for subsection...
|
||||
|
||||
|
||||
\_heading: Large Bold Text @<link-here>
|
||||
Body for heading...
|
||||
|
||||
\_heading: Large Bold Text @<link-to-this-heading>
|
||||
|
||||
\_definition: Flatworm
|
||||
A phylum of relatively **simple** bilaterian, unsegmented,
|
||||
soft-bodied invertebrates.
|
||||
|
||||
|
||||
\_property: String.fromCharCode(code) => string
|
||||
Returns a string created from //code//, a sequence of
|
||||
UTF-16 code units.
|
||||
|
||||
|
||||
\_code: heading
|
||||
|
||||
// Some code goes here
|
||||
while(1);
|
||||
|
||||
|
||||
\_table: Table Footer
|
||||
|
||||
| **Name** | **Color** |
|
||||
| Apple | Red |
|
||||
| Banana | Yellow |
|
||||
| Grape | Purple |
|
||||
|
||||
|
||||
\_toc:
|
||||
some-file
|
||||
some-directory
|
||||
|
||||
\_definition and reset the indentation.
|
||||
|
||||
\_note: Title
|
||||
This is placed in a blue box.
|
||||
|
||||
|
||||
\_warning: Title
|
||||
This is placed in an orange box.
|
||||
|
||||
|
||||
\_null:
|
||||
This breaks out of a directive. For example, to end a
|
||||
This breaks out of a directive. For example, to end
|
||||
a ``_note:`` or ``_code:``.
|
||||
|
||||
|
||||
_subsection: Markdown @<flatworm-markdown>
|
||||
@@ -138,6 +184,9 @@ other dialects, but allows for **bold**, //italic//,
|
||||
__underlined__, ``monospaced``, super^^script^^ and ~~strike~~
|
||||
text, supporting [links](flatworm-markdown) and lists.
|
||||
|
||||
Lists are rendered as blocks of a body, so cannot be used within
|
||||
a title or within another list.
|
||||
|
||||
_code: @lang<text>
|
||||
|
||||
**bold text**
|
||||
@@ -163,6 +212,216 @@ This is a self-titled link [[https://ethereumorg]] and this
|
||||
[[some-link]] will use the title from its directives value.
|
||||
|
||||
|
||||
_subsection: Code @<flatworm--code>
|
||||
|
||||
The code directive creates a monospace, contained block useful
|
||||
for displaying code samples.
|
||||
|
||||
_heading: JavaScript Evaluation @<flatworm--code-eval>
|
||||
|
||||
For JavaScript files, the file is executed with some simple substitution.
|
||||
|
||||
A bare ``\/\/!`` on a line is replaced with the result of the last
|
||||
statement. Building will fail if an error is thrown.
|
||||
|
||||
A bare ``\/\/!error`` is replaced with the throw error. Building will
|
||||
fail if an error is not thrown.
|
||||
|
||||
Also any code included between the lines **``\/\/ <hide>``** and
|
||||
**``\/\/ </hide>``** will be omitted from the output, which can be used
|
||||
to setup variables.
|
||||
|
||||
_code: Code Evaluation Example @lang<text>
|
||||
|
||||
\_code: Result of Code Example @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const url = require("url");
|
||||
// </hide>
|
||||
|
||||
url.parse("https://www.ricmoo.com/").protocol
|
||||
//!
|
||||
|
||||
url.parse(45)
|
||||
//! error
|
||||
|
||||
// You want to assign (doesn't emit eval) AND display the value
|
||||
const foo = 4 + 5;
|
||||
// <hide>
|
||||
foo
|
||||
// </hide>
|
||||
//!
|
||||
|
||||
|
||||
_code: Result of Code Example @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const url = require("url");
|
||||
// </hide>
|
||||
|
||||
url.parse("https://www.ricmoo.com/").protocol
|
||||
//!
|
||||
|
||||
url.parse(45)
|
||||
//! error
|
||||
|
||||
// You want to assign (doesn't emit eval) AND display the value
|
||||
const foo = 4 + 5;
|
||||
// <hide>
|
||||
foo
|
||||
// </hide>
|
||||
//!
|
||||
|
||||
|
||||
_heading: Languages
|
||||
|
||||
The language can be specified using the [@lang extension](flatworm--ext-lang).
|
||||
|
||||
_table:
|
||||
|
||||
| **Language** | **Notes** |
|
||||
| javascript | Syntax highlights and [evaluates](flatworm--code-eval) the JavaScript |
|
||||
| script | Same as ``javascript``, but does not evaluate the results |
|
||||
| shell | Shell scripts or command-line |
|
||||
| text | Plain text with no syntax highlighting |
|
||||
|
||||
_subsection: Tables @<flatworm--table>
|
||||
|
||||
The table directive consumes the entire body up until the next
|
||||
directive. To terminate a table early to begin a text block,
|
||||
use a **_null:** directive.
|
||||
|
||||
Each line of the body should be [Row Data](flatworm--table-row) or a
|
||||
[Variable Declaration](flatworm--table-variable) (or continuation of
|
||||
a //Variable Declaration//). Blank lines are ignored.
|
||||
|
||||
_heading: Row Data @<flatworm--table-row>
|
||||
|
||||
Each **Row Data** line must begin and end with a **``"|"``**, with each
|
||||
gap representing the cell data, [alignment](flatworm--table-alignment)
|
||||
with optional [column and row spanning](flatworm--table-spanning).
|
||||
|
||||
|
||||
_heading: Alignment @<flatworm--table-alignment>
|
||||
|
||||
The alignment for a cell is determined by the whitespace surrounding the
|
||||
cell data.
|
||||
|
||||
_table: Alignment Conditions (higher precedence listed first)
|
||||
|
||||
| **Alignment** | **Whitespace** |
|
||||
| //Left// | 1 or fewer spaces before the content |
|
||||
| //Right// | 1 or fewer spaces after the content |
|
||||
| //Center// | 2 or more space **both** before and after the content |
|
||||
|
||||
|
||||
_code: Alignment Example @lang<text>
|
||||
|
||||
\_table: Result of Alignment Example @style<compact>
|
||||
|
||||
| center |
|
||||
|
||||
| left |
|
||||
|left |
|
||||
|
||||
| right |
|
||||
| right|
|
||||
|
||||
_table: Result of Alignment Example @style<compact>
|
||||
|
||||
| center |
|
||||
|
||||
| left |
|
||||
|left |
|
||||
|
||||
| right |
|
||||
| right|
|
||||
|
||||
|
||||
_heading: Row and Column Spanning @<flatworm--table-spanning>
|
||||
|
||||
A column may end its content with any number of **``"<"``** which indicates
|
||||
how many //additional// columns to extend into.
|
||||
|
||||
If the cell content contains only a **``"^"``**, then the row above is
|
||||
extended into this cell (into the same number of columns).
|
||||
|
||||
_code: Cell Spanning Example @lang<text>
|
||||
|
||||
\_table: Result of Cell Spanning Example @style<compact>
|
||||
|
||||
| (1x1) | (1x2) <| (2x1) |
|
||||
| (2x2) <| (2x1) | ^ |
|
||||
| ^ | ^ | (1x1) |
|
||||
|
||||
_table: Result of Cell Spanning Example @style<compact>
|
||||
|
||||
| (1x1) | (1x2) <| (2x1) |
|
||||
| (2x2) <| (2x1) | ^ |
|
||||
| ^ | ^ | (1x1) |
|
||||
|
||||
|
||||
_heading: Styles @<flatworm--table-style>
|
||||
|
||||
The [@style extension](flatworm--ext-style) for a table can be used to control its
|
||||
appearance.
|
||||
|
||||
_table:
|
||||
|
||||
| **Name** | **Width** | **Columns** |
|
||||
| //minimal// | minimum size | best fit |
|
||||
| //compact// | 40% | evenly spaced |
|
||||
| //wide// | 67% | evenly spaced |
|
||||
| //full// | 100% | evenly spaced |
|
||||
|
||||
|
||||
_heading: Variables @<flatworm--table-variable>
|
||||
|
||||
Often the layout of a table is easier to express and maintain without
|
||||
uneven or changing content within it. So the content can be defined
|
||||
separately within a table directive using **variables**. A variable
|
||||
name must begin with a letter and must only contain letters and numbers.
|
||||
|
||||
Variables are also useful when content is repeated throughout a table.
|
||||
|
||||
A variable is declared by starting a line with ``"$NAME:"``, which
|
||||
consumes all lines until the next variable declaration or until the
|
||||
next table row line.
|
||||
|
||||
A variable name must start with a letter and may consist of letters and
|
||||
numbers. (i.e. ``/[a-z][a-z0-9]*/i``)
|
||||
|
||||
_code: Variables Example @lang<text>
|
||||
|
||||
\_table: Result of Variables Example
|
||||
|
||||
$Yes: This option is supported.
|
||||
$No: This option is **not** supported
|
||||
$bottom: This just represents an example of
|
||||
what is possible. Notice that variable
|
||||
content can span multiple lines.
|
||||
|
||||
| **Feature** | **Supported** |
|
||||
| Dancing Monkey | $Yes |
|
||||
| Singing Turtle | $No |
|
||||
| Newt Hair | $Yes |
|
||||
| $bottom <|
|
||||
|
||||
_table: Result of Variables Example
|
||||
|
||||
$Yes: This option is supported.
|
||||
$No: This option is **not** supported.
|
||||
$bottom: This just represents an example of
|
||||
what is possible. Notice that variable
|
||||
content can span multiple lines.
|
||||
|
||||
| **Feature** | **Supported** |
|
||||
| Dancing Monkey | $Yes |
|
||||
| Singing Turtle | $No |
|
||||
| Newt Hair | $Yes |
|
||||
| $bottom <|
|
||||
|
||||
|
||||
_subsection: Configuration @<flatworm-config>
|
||||
|
||||
Configuration is optional (but highly recommended) and may be either
|
||||
@@ -174,38 +433,38 @@ TODO: example JSON and example JS
|
||||
|
||||
_subsection: Extensions @<flatworm-extensions>
|
||||
|
||||
_heading: @INHERIT\<markdown>
|
||||
_heading: @inherit\< //markdown// > @<flatworm--ext-inherit>
|
||||
|
||||
Adds an inherits description to a directive. The //markdown// may contain links.
|
||||
|
||||
|
||||
_heading: @LANG\<text>
|
||||
_heading: @lang\< //text// > @<flatworm--ext-lang>
|
||||
|
||||
Set the language the code should be syntax-highlighted for. If "javascript", the
|
||||
code will be evaluated.
|
||||
|
||||
- javascript (will be evaluated)
|
||||
- script (useful for JavaScript but that should not be evaluated)
|
||||
- shell
|
||||
- text
|
||||
Set the language a [code directive](flatworm--code) should be
|
||||
syntax-highlighted for. If "javascript", the code will be evaluated.
|
||||
|
||||
|
||||
_heading: @NAV\<text>
|
||||
_heading: @nav\< //text// > @<flatworm--ext-nav>
|
||||
|
||||
Sets the name in the breadcrumbs when not the current node.
|
||||
|
||||
|
||||
_heading: @NOTE\<markdown>
|
||||
_heading: @note\<// markdown// > @<flatworm--ext-note>
|
||||
|
||||
Adds a note to a directive. The //markdown// may contain links. If the directive
|
||||
already has an @INHERIT extension, that will be used instead and the @NOTE will
|
||||
be ignored.
|
||||
|
||||
|
||||
_heading: @SRC\<text>
|
||||
_heading: @src\< //key// > @<flatworm--ext-src>
|
||||
|
||||
Calls the configuration ``getSourceUrl(text, VALUE)`` to get a URL which
|
||||
Calls the configuration ``getSourceUrl(key, VALUE)`` to get a URL which
|
||||
will be linked to by a link next to the //directive//.
|
||||
|
||||
This extended directive function requires an advanced ``config.js`` [[flatworm-config]]
|
||||
file since it requires a JavaScript function.
|
||||
|
||||
|
||||
_heading: @style\< //text// > @<flatworm--ext-style>
|
||||
|
||||
The [Table Style](flatworm--table-style) to use for a table directive.
|
||||
|
||||
BIN
docs.wrm/favicon.ico
Normal file
BIN
docs.wrm/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
113
docs.wrm/generate-redirects.js
Normal file
113
docs.wrm/generate-redirects.js
Normal file
@@ -0,0 +1,113 @@
|
||||
const fs = require("fs");
|
||||
const { resolve } = require("path");
|
||||
|
||||
const Content = `
|
||||
<html>
|
||||
<head>
|
||||
<title>ethers.js - Legacy Documentation</title>
|
||||
<style type="text/css">
|
||||
html {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
h1 {
|
||||
opacity: 0.8;
|
||||
}
|
||||
.content {
|
||||
border: 2px solid #000;
|
||||
border-radius: 7px;
|
||||
box-shadow: 5px 5px 10px #aaa;
|
||||
left: 50%;
|
||||
padding: 20px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
transform: translate(-50%, 30px);
|
||||
width: 700px;
|
||||
}
|
||||
.hr {
|
||||
border-top: 1px solid black;
|
||||
margin: 4px 10px 40px;
|
||||
}
|
||||
span.v5 {
|
||||
font-size: 24px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
span.v4 {
|
||||
opacity: 0.7;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="content">
|
||||
<h1>This link is out-of-date <i>and</i> has moved.</h1>
|
||||
<div class="hr"></div>
|
||||
<span class="v5">Click <a id="link-v5" href="%%DEFAULT%%">here</a> to visit the updated documentation</span>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<span class="v4">or continue to the historic <a id="link-v4" href="%%LEGACY%%">legacy documentation</a>.</span>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
var redirects = %%REDIRECTS%%;
|
||||
var hash = location.hash;
|
||||
if (hash && hash !== "#") {
|
||||
hash = hash.substring(1);
|
||||
var v4 = document.getElementById("link-v4");
|
||||
v4.setAttribute("href", v4.getAttribute("href").split("#")[0] + "#" + hash);
|
||||
var target = redirects[hash];
|
||||
if (target) {
|
||||
var v5 = document.getElementById("link-v5");
|
||||
v5.setAttribute("href", target);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>`
|
||||
|
||||
const redirects = require("./redirects.json");
|
||||
const links = require("../docs/v5/metadata.json").links;
|
||||
|
||||
const result = { };
|
||||
|
||||
const prefix = "ethers.js/html/";
|
||||
Object.keys(redirects).forEach((uri) => {
|
||||
if (uri.substring(0, prefix.length) !== prefix) { return; }
|
||||
|
||||
const comps = uri.substring(prefix.length).split("#");
|
||||
const filename = comps[0];
|
||||
const hash = comps[1] || "_";
|
||||
const tag = redirects[uri];
|
||||
|
||||
let path = null;
|
||||
if (tag.path) {
|
||||
path = tag.path;
|
||||
} else if (tag.tag) {
|
||||
path = links[tag.tag] || null;
|
||||
} else {
|
||||
console.log("Missing tag:", uri);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!path) {
|
||||
console.log("Missing path:", uri);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!result[filename]) { result[filename] = {
|
||||
"_legacy": `/v4/${ filename }`
|
||||
}; }
|
||||
result[filename][hash] = path;
|
||||
});
|
||||
|
||||
function generateOutput(filename) {
|
||||
const page = result[filename];
|
||||
return Content.replace("%%DEFAULT%%", page._ || "/v5/")
|
||||
.replace("%%LEGACY%%", page._legacy || "/v4/")
|
||||
.replace("%%REDIRECTS%%", JSON.stringify(page));
|
||||
}
|
||||
|
||||
Object.keys(result).forEach((filename) => {
|
||||
const output = generateOutput(filename);
|
||||
const path = resolve(__dirname, "../docs/ethers.js/html", filename);
|
||||
fs.writeFileSync(path, output);
|
||||
});
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
_section: Getting Started
|
||||
_section: Getting Started @<getting-started>
|
||||
|
||||
|
||||
_subsection: Installing
|
||||
_subsection: Installing @<installing>
|
||||
|
||||
The various Classes and Functions are available to be imported
|
||||
Ethers' various Classes and Functions are available to import
|
||||
manually from sub-packages under the [@ethersproject](link-ethers-npm)
|
||||
but for most projects, the umbrella package is the easiest way to
|
||||
get started.
|
||||
organization but for most projects, the umbrella package is the
|
||||
easiest way to get started.
|
||||
|
||||
_code: @lang<shell>
|
||||
|
||||
/home/ricmoo> npm install --save ethers@next
|
||||
/home/ricmoo> npm install --save ethers
|
||||
|
||||
|
||||
_subsection: Importing
|
||||
_subsection: Importing @<importing>
|
||||
|
||||
_heading: Node.js
|
||||
|
||||
_code: @lang<script>
|
||||
_code: node.js require @lang<script>
|
||||
|
||||
// CommonJS
|
||||
const { ethers } = require("ethers");
|
||||
|
||||
// ES6 or TypeScript
|
||||
_code: ES6 or TypeScript @lang<script>
|
||||
|
||||
import { ethers } from "ethers";
|
||||
|
||||
|
||||
@@ -32,10 +32,343 @@ It is generally better practice (for security reasons) to copy the
|
||||
[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
|
||||
For quick demos or prototyping though, you can load it in your
|
||||
Web Applications from our CDN.
|
||||
|
||||
_code: @lang<html>
|
||||
|
||||
<script src="https://cdn.ethers.io/lib/ethers-5.0.esm.min.js"
|
||||
type="application/javascipt"></script>
|
||||
_code: ES6 in the Browser @lang<html>
|
||||
|
||||
<script type="module">
|
||||
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.0.esm.min.js";
|
||||
// Your code here...
|
||||
</script>
|
||||
|
||||
|
||||
_code: ES3 (UMD) in the Browser @lang<html>
|
||||
|
||||
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js"
|
||||
type="application/javascript"></script>
|
||||
|
||||
|
||||
_subsection: Common Terminology @<getting-started--glossary>
|
||||
|
||||
This section needs work...
|
||||
|
||||
_table: Common Terms
|
||||
|
||||
$Provider: A Provider (in ethers) is a class which provides an abstraction
|
||||
for a connection to the Ethereum Network. It provides read-only
|
||||
access to the Blockchain and its status.
|
||||
$Signer: A Signer is a class which (usually) in some way directly or
|
||||
indirectly has access to a private key, which can sign messages
|
||||
and transactions to authorize the network to charge your account
|
||||
ether to perform operations.
|
||||
$Contract: A Contract is an abstraction which represents a connection to a
|
||||
specific contract on the Ethereum Network, so that applications
|
||||
can use it like a normal JavaScript object.
|
||||
|
||||
|
||||
| **Provider** | $Provider |
|
||||
| **Signer** | $Signer |
|
||||
| **Contract** | $Contract |
|
||||
|
||||
|
||||
_subsection: Connecting to Ethereum: Metamask @<getting-started--connecting>
|
||||
|
||||
The quickest and easiest way to experiment and begin developing on
|
||||
Ethereum is to use [[link-metamask]], which is a browser extension
|
||||
that provides:
|
||||
|
||||
- A connection to the Ethereum network (a [[Provider]])
|
||||
- Holds your private key and can sign things (a [[Signer]])
|
||||
|
||||
_code: Connecting to Metamask @lang<script>
|
||||
|
||||
// A Web3Provider wraps a standard Web3 provider, which is
|
||||
// what Metamask injects as window.ethereum into each page
|
||||
const provider = new ethers.providers.Web3Provider(window.ethereum)
|
||||
|
||||
// The Metamask plugin also allows signing transactions to
|
||||
// send ether and pay to change state within the blockchain.
|
||||
// For this, you need the account signer...
|
||||
const signer = provider.getSigner()
|
||||
|
||||
_subsection: Connecting to Ethereum: RPC @<getting-started--connecting-rpc>
|
||||
|
||||
The [JSON-RPC API](link-jsonrpc) is another popular method for interacting
|
||||
with Ethereum and is available in all major Ethereum node implementations
|
||||
(e.g. [[link-geth]] and [[link-parity]]) as well as many
|
||||
third-party web services (e.g. [[link-infura]]). It typically provides:
|
||||
|
||||
- A connection to the Ethereum network (a [[Provider]])
|
||||
- Holds your private key and can sign things (a [[Signer]])
|
||||
|
||||
_code: Connecting to an RPC client @lang<script>
|
||||
|
||||
// If you don't specify a //url//, Ethers connects to the default
|
||||
// (i.e. ``http:/\/localhost:8545``)
|
||||
const provider = new ethers.providers.JsonRpcProvider();
|
||||
|
||||
// The provider also allows signing transactions to
|
||||
// send ether and pay to change state within the blockchain.
|
||||
// For this, we need the account signer...
|
||||
const signer = provider.getSigner()
|
||||
|
||||
_heading: Querying the Blockchain @<getting-started--querying>
|
||||
|
||||
Once you have a [[Provider]], you have a read-only connection to the
|
||||
blockchain, which you can use to query the current state, fetch historic
|
||||
logs, look up deployed code and so on.
|
||||
|
||||
_code: Basic Queries @lang<javascript>
|
||||
|
||||
// Look up the current block number
|
||||
provider.getBlockNumber()
|
||||
//!
|
||||
|
||||
// Get the balance of an account (by address or ENS name, if supported by network)
|
||||
balance = await provider.getBalance("ethers.eth")
|
||||
//! async balance
|
||||
|
||||
// Often you need to format the output to something more user-friendly,
|
||||
// such as in ether (instead of wei)
|
||||
ethers.utils.formatEther(balance)
|
||||
//!
|
||||
|
||||
// If a user enters a string in an input field, you may need
|
||||
// to convert it from ether (as a string) to wei (as a BigNumber)
|
||||
ethers.utils.parseEther("1.0")
|
||||
//!
|
||||
|
||||
|
||||
_heading: Writing to the Blockchain @<getting-started--sending>
|
||||
|
||||
_code: Sending Ether @lang<script>
|
||||
|
||||
// Send 1 ether to an ens name.
|
||||
const tx = signer.sendTransaction({
|
||||
to: "ricmoo.firefly.eth",
|
||||
value: ethers.utils.parseEther("1.0")
|
||||
});
|
||||
|
||||
|
||||
_subsection: Contracts @<getting-started--contracts>
|
||||
|
||||
A Contract is an abstraction of program code which lives on the
|
||||
Ethereum blockchain.
|
||||
|
||||
The [[Contract]] object makes it easier to use an on-chain
|
||||
Contract as a normal JavaScript object, with the methods
|
||||
mapped to encoding and decoding data for you.
|
||||
|
||||
If you are familiar with Databases, this is similar to an //Object Relational Mapper// (ORM).
|
||||
|
||||
In order to communicate with the Contract on-chain, this class
|
||||
needs to know what methods are available and how to encode and
|
||||
decode the data, which is what the //Application Binary Interface// (ABI)
|
||||
provides.
|
||||
|
||||
This class is a //meta-class//, which means its methods are constructed
|
||||
at runtime, and when you pass in the ABI to the constructor it uses it
|
||||
to determine which methods to add.
|
||||
|
||||
While an on-chain Contract may have many methods available, you can safely ignore
|
||||
any methods you don't need or use, providing a smaller subset of the ABI to
|
||||
the contract.
|
||||
|
||||
An ABI often comes from the Solidity or Vyper compiler, but you can use the
|
||||
Human-Readable ABI in code, which the following examples use.
|
||||
|
||||
_code: Connecting to the DAI Contract @lang<javascript>
|
||||
|
||||
// You can also use an ENS name for the contract address
|
||||
const daiAddress = "dai.tokens.ethers.eth";
|
||||
|
||||
// The ERC-20 Contract ABI, which is a common contract interface
|
||||
// for tokens (this is the Human-Readable ABI format)
|
||||
const daiAbi = [
|
||||
// Some details about the token
|
||||
"function name() view returns (string)",
|
||||
"function symbol() view returns (string)",
|
||||
|
||||
// Get the account balance
|
||||
"function balanceOf(address) view returns (uint)",
|
||||
|
||||
// Send some of your tokens to someone else
|
||||
"function transfer(address to, uint amount)",
|
||||
|
||||
// An event triggered whenever anyone transfers to someone else
|
||||
"event Transfer(address indexed from, address indexed to, uint amount)"
|
||||
];
|
||||
|
||||
// The Contract object
|
||||
const daiContract = new ethers.Contract(daiAddress, daiAbi, provider);
|
||||
|
||||
|
||||
_heading: Read-Only Methods @<getting-started--reading>
|
||||
|
||||
_code: Querying the DAI Contract @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const daiAbi = [
|
||||
// Some simple details about the token
|
||||
"function name() view returns (string)",
|
||||
"function symbol() view returns (string)",
|
||||
|
||||
// Get the account balance
|
||||
"function balanceOf(address) view returns (uint)",
|
||||
];
|
||||
const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider);
|
||||
// </hide>
|
||||
|
||||
// Get the ERC-20 token name
|
||||
daiContract.name()
|
||||
//!
|
||||
|
||||
// Get the ERC-20 token symbol (for tickers and UIs)
|
||||
daiContract.symbol()
|
||||
//!
|
||||
|
||||
// Get the balance of an address
|
||||
balance = await daiContract.balanceOf("ricmoo.firefly.eth")
|
||||
//! async balance
|
||||
|
||||
// Format the DAI for displaying to the user
|
||||
ethers.utils.formatUnits(balance, 18)
|
||||
//!
|
||||
|
||||
|
||||
_heading: State Changing Methods @<getting-started--writing>
|
||||
|
||||
_code: Sending DAI @lang<script>
|
||||
|
||||
// The DAI Contract is currently connected to the Provider,
|
||||
// which is read-only. You need to connect to a Signer, so
|
||||
// that you can pay to send state-changing transactions.
|
||||
const daiWithSigner = contract.connect(signer);
|
||||
|
||||
// Each DAI has 18 decimal places
|
||||
const dai = ethers.utils.parseUnits("1.0", 18);
|
||||
|
||||
// Send 1 DAI to "ricmoo.firefly.eth"
|
||||
tx = daiWithSigner.transfer("ricmoo.firefly.eth", dai);
|
||||
|
||||
|
||||
_heading: Listening to Events @<getting-started--events>
|
||||
|
||||
_code: Listening to Events @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const daiAbi = [
|
||||
"event Transfer(address indexed, address indexed, uint256)"
|
||||
];
|
||||
const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider);
|
||||
const formatEther = ethers.utils.formatEther;
|
||||
// </hide>
|
||||
|
||||
// Receive an event when ANY transfer occurs
|
||||
daiContract.on("Transfer", (from, to, amount, event) => {
|
||||
console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`);
|
||||
// The event object contains the verbatim log data, the
|
||||
// EventFragment and functions to fetch the block,
|
||||
// transaction and receipt and event functions
|
||||
});
|
||||
|
||||
// A filter for when a specific address receives tokens
|
||||
myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72";
|
||||
filter = daiContract.filters.Transfer(null, myAddress)
|
||||
// <hide>
|
||||
filter
|
||||
// </hide>
|
||||
//!
|
||||
|
||||
// Receive an event when that filter occurs
|
||||
daiContract.on(filter, (from, to, amount, event) => {
|
||||
// The to will always be "address"
|
||||
console.log(`I got ${ formatEther(amount) } from ${ from }.`);
|
||||
});
|
||||
|
||||
// <hide>
|
||||
// Don't want to block the docs from compiling...
|
||||
daiContract.removeAllListeners();
|
||||
// </hide>
|
||||
|
||||
|
||||
_heading: Query Historic Events @<getting-started--history>
|
||||
|
||||
_code: Filtering Historic Events @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const signer = new ethers.VoidSigner("0x8ba1f109551bD432803012645Ac136ddd64DBA72");
|
||||
const daiAbi = [
|
||||
"event Transfer(address indexed, address indexed, uint256)"
|
||||
];
|
||||
const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider);
|
||||
//!
|
||||
// </hide>
|
||||
|
||||
// Get the address of the Signer
|
||||
myAddress = await signer.getAddress()
|
||||
//! async myAddress
|
||||
|
||||
// Filter for all token transfers from me
|
||||
filterFrom = daiContract.filters.Transfer(myAddress, null);
|
||||
// <hide>
|
||||
filterFrom
|
||||
// </hide>
|
||||
//!
|
||||
|
||||
// Filter for all token transfers to me
|
||||
filterTo = daiContract.filters.Transfer(null, myAddress);
|
||||
// <hide>
|
||||
filterTo
|
||||
// </hide>
|
||||
//!
|
||||
|
||||
// List all transfers sent from me a specific block range
|
||||
daiContract.queryFilter(filterFrom, 9843470, 9843480)
|
||||
//!
|
||||
|
||||
//
|
||||
// The following have had the results omitted due to the
|
||||
// number of entries; but they provide some useful examples
|
||||
//
|
||||
|
||||
// List all transfers sent in the last 10,000 blocks
|
||||
daiContract.queryFilter(filterFrom, -10000)
|
||||
|
||||
// List all transfers ever sent to me
|
||||
daiContract.queryFilter(filterTo)
|
||||
|
||||
|
||||
_subsection: Signing Messages @<getting-started--signing>
|
||||
|
||||
_code: Signing Messages @lang<javascript>
|
||||
|
||||
// <hide>
|
||||
const signer = ethers.Wallet.createRandom();
|
||||
//!
|
||||
// </hide>
|
||||
|
||||
// To sign a simple string, which are used for
|
||||
// logging into a service, such as CryptoKitties,
|
||||
// pass the string in.
|
||||
signature = await signer.signMessage("Hello World");
|
||||
//! async signature
|
||||
|
||||
//
|
||||
// A common case is also signing a hash, which is 32
|
||||
// bytes. It is important to note, that to sign binary
|
||||
// data it MUST be an Array (or TypedArray)
|
||||
//
|
||||
|
||||
// This string is 66 characters long
|
||||
message = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
|
||||
|
||||
// This array representation is 32 bytes long
|
||||
messageBytes = ethers.utils.arrayify(message);
|
||||
//!
|
||||
|
||||
// To sign a hash, you most often want to sign the bytes
|
||||
signature = await signer.signMessage(messageBytes)
|
||||
//! async signature
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
_section: Documentation
|
||||
_section: Documentation @<documentation>
|
||||
|
||||
_subsection: What is Ethers?
|
||||
_subsection: What is Ethers? @<preamble>
|
||||
|
||||
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](link-ethersio) and
|
||||
has since expanded into a much more general-purpose library.
|
||||
has since expanded into a more general-purpose library.
|
||||
|
||||
_subsection: Features
|
||||
_subsection: Features @<features>
|
||||
|
||||
- Keep your private keys in your client, **safe** and sound
|
||||
- Import and export **JSON wallets** (Geth, Parity and crowdsale)
|
||||
@@ -38,17 +38,19 @@ _toc:
|
||||
|
||||
getting-started
|
||||
concepts
|
||||
api-keys
|
||||
api
|
||||
cli
|
||||
cookbook
|
||||
migration
|
||||
testing
|
||||
contributing
|
||||
other-resources
|
||||
documentation
|
||||
license
|
||||
|
||||
|
||||
_subsection: Legacy Documentation
|
||||
_subsection: Legacy Documentation @<documentation--legacy>
|
||||
|
||||
This section will be kept up to date, linking to documentation of
|
||||
older versions of the library.
|
||||
|
||||
@@ -7,7 +7,7 @@ of uses.
|
||||
|
||||
_heading: MIT License
|
||||
|
||||
//Copyright © 2019 [Richard Moore](mailto:me@ricmoo.com).//
|
||||
//Copyright © 2019-2021 [Richard Moore](mailto:me@ricmoo.com).//
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
_section: Migration: From Ethers v4 @<migration-v4>
|
||||
|
||||
This document only covers the features present in v4 which have changed
|
||||
in some important way in v5.
|
||||
|
||||
It does not cover all the new additional features that have been added and
|
||||
mainly aims to help those updating their older scripts and applications to
|
||||
retain functional parity.
|
||||
|
||||
If you encounter any missing changes, please let me know and I'll update this
|
||||
guide.
|
||||
|
||||
|
||||
_subsection: BigNumber
|
||||
|
||||
_heading: Namespace
|
||||
Since [[bignumber]] is used quite frequently, it has been moved to
|
||||
Since [[BigNumber]] is used quite frequently, it has been moved to
|
||||
the top level of the umbrella package.
|
||||
|
||||
_code: @lang<script>
|
||||
@@ -18,8 +29,9 @@ ethers.BigNumberish
|
||||
|
||||
|
||||
_heading: Creating Instances
|
||||
|
||||
The ``bigNumberify`` method was always preferred over the constructor
|
||||
since it could short-circuit an object instantiation for [[bignumber]
|
||||
since it could short-circuit an object instantiation for [[BigNumber]
|
||||
objects (since they are immutable). This has been moved to a static
|
||||
``from`` class method.
|
||||
|
||||
@@ -37,19 +49,109 @@ ethers.BigNumber.from(someValue)
|
||||
|
||||
_subsection: Contracts
|
||||
|
||||
_code: @lang<script>
|
||||
_heading: ENS Name Resolution
|
||||
|
||||
// @TODO
|
||||
The name of the resolved address has changed. If the address passed into the
|
||||
constructor was an ENS name, the address will be resolved before any calls
|
||||
are made to the contract.
|
||||
|
||||
The name of the property where the resolved address has changed from ``addressPromise``
|
||||
to ``resolvedAddress``.
|
||||
|
||||
_code: Resolved ENS Names @lang<script>
|
||||
|
||||
// v4
|
||||
contract.addressPromise
|
||||
|
||||
// v5
|
||||
contract.resolvedAddress
|
||||
|
||||
|
||||
_heading: Gas Estimation
|
||||
|
||||
The only difference in gas estimation is that the bucket has changed
|
||||
its name from ``estimate`` to ``estimateGas``.
|
||||
|
||||
_code: Gas Estimation @lang<script>
|
||||
|
||||
// v4
|
||||
contract.estimate.transfer(toAddress, amount)
|
||||
|
||||
// v5
|
||||
contract.estimateGas.transfer(toAddress, amount)
|
||||
|
||||
_heading: Functions
|
||||
|
||||
In a contract in ethers, there is a ``functions`` bucket, which exposes
|
||||
all the methods of a contract.
|
||||
|
||||
All these functions are available on the root contract itself as well
|
||||
and historically there was no difference between ``contact.foo`` and
|
||||
``contract.functions.foo``. The original reason for the ``functions`` bucket
|
||||
was to help when there were method names that collided with other buckets,
|
||||
which is rare.
|
||||
|
||||
In v5, the ``functions`` bucket is now intended to help with frameworks and
|
||||
for the new error recovery API, so most users should use the methods on the
|
||||
root contract.
|
||||
|
||||
The main difference will occur when a contract method only returns a single
|
||||
item. The root method will dereference this automatically while the ``functions``
|
||||
bucket will preserve it as an [[Result]].
|
||||
|
||||
If a method returns multiple items, there is no difference.
|
||||
|
||||
This helps when creating a framework, since the result will always be known to
|
||||
have the same number of components as the [[Fragment]] outputs, without having
|
||||
to handle the special case of a single return value.
|
||||
|
||||
_code: Functions Bucket @lang<script>
|
||||
|
||||
const abi = [
|
||||
|
||||
// Returns a single value
|
||||
"function single() view returns (uint8)",
|
||||
|
||||
// Returns two values
|
||||
"function double() view returns (uint8, uint8)",
|
||||
];
|
||||
|
||||
// v4
|
||||
await contract.single()
|
||||
// 123
|
||||
await contract.functions.single()
|
||||
// 123
|
||||
|
||||
|
||||
// v5 (notice the change in the .function variant)
|
||||
await contract.single()
|
||||
// 123
|
||||
await contract.functions.single()
|
||||
// [ 123 ]
|
||||
|
||||
|
||||
// v4
|
||||
await contract.double()
|
||||
// [ 123, 5 ]
|
||||
await contract.functions.double()
|
||||
// [ 123, 5 ]
|
||||
|
||||
|
||||
// v5 (no difference from v4)
|
||||
await contract.double()
|
||||
// [ 123, 5 ]
|
||||
await contract.functions.double()
|
||||
// [ 123, 5 ]
|
||||
|
||||
|
||||
_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
|
||||
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.
|
||||
Global error functions have been moved to [[Logger]] class methods.
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
@@ -84,7 +186,8 @@ logger.info(...)
|
||||
|
||||
|
||||
_subsection: Interface
|
||||
The [[abi-interface]] object has undergone the most dramatic changes.
|
||||
|
||||
The [[Interface]] object has undergone the most dramatic changes.
|
||||
|
||||
It is no longer a meta-class and now has methods that simplify handling
|
||||
contract interface operations without the need for object inspection and
|
||||
@@ -99,14 +202,14 @@ interface.functions.transfer.encode(to, amount)
|
||||
interface.functions.transfer.decode(callData)
|
||||
|
||||
// v5
|
||||
interface.encodeData("transfer", [ to, amount ])
|
||||
interface.decodeResult("transfer", data)
|
||||
interface.encodeFunctionData("transfer", [ to, amount ])
|
||||
interface.decodeFunctionResult("transfer", data)
|
||||
|
||||
// Or you can use any compatible signature or Fragment objects.
|
||||
// Notice that signature normalization is performed for you,
|
||||
// e.g. "uint" and "uint256" will be automatically converted
|
||||
interface.encodeData("transfer(address,uint)", [ to, amount ])
|
||||
interface.decodeResult("transfer(address to, uint256 amount)", data)
|
||||
interface.encodeFunctionData("transfer(address,uint)", [ to, amount ])
|
||||
interface.decodeFunctionResult("transfer(address to, uint256 amount)", data)
|
||||
|
||||
|
||||
_heading: Events
|
||||
@@ -119,12 +222,12 @@ interface.events.Transfer.decode(data, topics)
|
||||
|
||||
// v5
|
||||
interface.encodeFilterTopics("Transfer", values)
|
||||
interface.encodeEventLog("Transfer", data, topics)
|
||||
interface.decodeEventLog("Transfer", data, topics)
|
||||
|
||||
|
||||
_heading: Inspection
|
||||
Interrogating properties about a function or event can now (mostly) be
|
||||
done directly on the [[abi-fragment]] object.
|
||||
done directly on the [[Fragment]] object.
|
||||
|
||||
_code:
|
||||
|
||||
@@ -178,14 +281,6 @@ const eventSig = eventFragment.format()
|
||||
const topic = interface.getTopic(eventFragment)
|
||||
|
||||
|
||||
_subsection: Utilities
|
||||
|
||||
_heading: Renaming
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// @TODO
|
||||
|
||||
_subsection: Wallet
|
||||
|
||||
_heading: Mnemonic Phrases
|
||||
|
||||
@@ -1,13 +1,198 @@
|
||||
_section: Migration: From Web3.js
|
||||
|
||||
TODO
|
||||
|
||||
_subsection: Contracts
|
||||
This migration guide focuses on migrating web3.js version 1.2.9 to ethers.js v5.
|
||||
|
||||
_subsection: Providers
|
||||
|
||||
In ethers, a provider provides an abstraction for a connection to the Ethereum Network. It can be used to issue read only queries and send signed state changing transactions to the Ethereum Network.
|
||||
|
||||
_heading: Connecting to Ethereum
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// web3
|
||||
var Web3 = require('web3');
|
||||
var web3 = new Web3('http://localhost:8545');
|
||||
|
||||
// ethers
|
||||
var ethers = require('ethers');
|
||||
const url = "http://127.0.0.1:8545";
|
||||
const provider = new ethers.providers.JsonRpcProvider(url);
|
||||
|
||||
|
||||
_heading: Connecting to Ethereum: Metamask
|
||||
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// web3
|
||||
const web3 = new Web3(Web3.givenProvider);
|
||||
|
||||
// ethers
|
||||
const provider = new ethers.providers.Web3Provider(window.ethereum);
|
||||
|
||||
|
||||
_subsection: Signers
|
||||
|
||||
In ethers, a **signer** is an abstraction of an Ethereum Account. It can be used to sign messages and transactions and send signed transactions to the Ethereum Network.
|
||||
|
||||
In web3, an account can be used to sign messages and transactions.
|
||||
|
||||
|
||||
_heading: Creating signer
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// web3
|
||||
const account = web3.eth.accounts.create();
|
||||
|
||||
// ethers (create random new account)
|
||||
const signer = ethers.Wallet.createRandom();
|
||||
|
||||
// ethers (connect to JSON-RPC accounts)
|
||||
const signer = provider.getSigner();
|
||||
|
||||
|
||||
_heading: Signing a message
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// web3 (using a private key)
|
||||
signature = web3.eth.accounts.sign('Some data', privateKey)
|
||||
|
||||
// web3 (using a JSON-RPC account)
|
||||
// @TODO
|
||||
|
||||
// ethers
|
||||
signature = await signer.signMessage('Some data')
|
||||
|
||||
|
||||
_subsection: Contracts
|
||||
|
||||
A contract object is an abstraction of a smart contract on the Ethereum Network. It allows for easy interaction with the smart contact.
|
||||
|
||||
_heading: Deploying a Contract
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// web3
|
||||
const contract = new web3.eth.Contract(abi);
|
||||
contract.deploy({
|
||||
data: bytecode,
|
||||
arguments: ["my string"]
|
||||
})
|
||||
.send({
|
||||
from: "0x12598d2Fd88B420ED571beFDA8dD112624B5E730",
|
||||
gas: 150000,
|
||||
gasPrice: "30000000000000"
|
||||
}), function(error, transactionHash){ ... })
|
||||
.then(function(newContract){
|
||||
console.log('new contract', newContract.options.address)
|
||||
});
|
||||
|
||||
// ethers
|
||||
const signer = provider.getSigner();
|
||||
const factory = new ethers.ContractFactory(abi, bytecode, signer);
|
||||
const contract = await factory.deploy("hello world");
|
||||
console.log('contract address', contract.address);
|
||||
|
||||
// wait for contract creation transaction to be mined
|
||||
await contract.deployTransaction.wait();
|
||||
|
||||
|
||||
_heading: Interacting with a Contract
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// web3
|
||||
const contract = new web3.eth.Contract(abi, contractAddress);
|
||||
// read only query
|
||||
contract.methods.getValue().call();
|
||||
// state changing operation
|
||||
contract.methods.changeValue(42).send({from: ....})
|
||||
.on('receipt', function(){
|
||||
...
|
||||
});
|
||||
|
||||
// ethers
|
||||
// pass a provider when initiating a contract for read only queries
|
||||
const contract = new ethers.Contract(contractAddress, abi, provider);
|
||||
const value = await contract.getValue();
|
||||
|
||||
|
||||
// pass a signer to create a contract instance for state changing operations
|
||||
const contract = new ethers.Contract(contractAddress, abi, signer);
|
||||
const tx = await contract.changeValue(33);
|
||||
|
||||
// wait for the transaction to be mined
|
||||
const receipt = await tx.wait();
|
||||
|
||||
|
||||
_heading: Overloaded Functions
|
||||
|
||||
Overloaded functions are functions that have the same name but different parameter
|
||||
types.
|
||||
|
||||
In ethers, the syntax to call an overloaded contract function is different
|
||||
from the non-overloaded function. This section shows the differences between web3
|
||||
and ethers when calling overloaded functions.
|
||||
|
||||
See [issue #407](link-issue-407) for more details.
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// web3
|
||||
message = await contract.methods.getMessage('nice').call();
|
||||
|
||||
|
||||
// ethers
|
||||
const abi = [
|
||||
"function getMessage(string) public view returns (string)",
|
||||
"function getMessage() public view returns (string)"
|
||||
]
|
||||
const contract = new ethers.Contract(address, abi, signer);
|
||||
|
||||
// for ambiguous functions (two functions with the same
|
||||
// name), the signature must also be specified
|
||||
message = await contract['getMessage(string)']('nice');
|
||||
|
||||
|
||||
_subsection: Numbers
|
||||
|
||||
_heading: BigNumber
|
||||
|
||||
Convert to BigNumber:
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// web3
|
||||
web3.utils.toBN('123456');
|
||||
|
||||
// ethers (from a number; must be within safe range)
|
||||
ethers.BigNumber.from(123456)
|
||||
|
||||
// ethers (from base-10 string)
|
||||
ethers.BigNumber.from("123456")
|
||||
|
||||
// ethers (from hex string)
|
||||
ethers.BigNumber.from("0x1e240")
|
||||
|
||||
|
||||
_subsection: Utilities
|
||||
|
||||
_heading: Hash
|
||||
|
||||
Computing Keccak256 hash of a UTF-8 string in web3 and ethers:
|
||||
|
||||
_code: @lang<script>
|
||||
|
||||
// web3
|
||||
web3.utils.sha3('hello world');
|
||||
web3.utils.keccak256('hello world');
|
||||
|
||||
// ethers (hash of a string)
|
||||
ethers.utils.id('hello world')
|
||||
|
||||
// ethers (hash of binary data)
|
||||
ethers.utils.keccak256('0x4242')
|
||||
|
||||
|
||||
17
docs.wrm/other-resources.wrm
Normal file
17
docs.wrm/other-resources.wrm
Normal file
@@ -0,0 +1,17 @@
|
||||
_section: Other Resources
|
||||
|
||||
There is a lot of documentation on the internet to help you get started,
|
||||
learn more or cover advanced topics. Here are a few resources to check out.
|
||||
|
||||
_subsection: Ethereum Overview
|
||||
|
||||
- Official [Ethereum Developer Documentations](link-other-ethereum-dev-docs)
|
||||
- The [Solidity Documentation](link-solidity), the defactor language for smart
|
||||
contracts as well as a resource for some of the core concepts of Ethereum
|
||||
|
||||
_subsection: Tutorials
|
||||
|
||||
I do not manage or maintain these tutorials, but have happened across them.
|
||||
If a link is dead or outdated, please [let me know](link-mail) and I'll update it.
|
||||
|
||||
- No links yet; send me some
|
||||
960
docs.wrm/redirects.json
Normal file
960
docs.wrm/redirects.json
Normal file
@@ -0,0 +1,960 @@
|
||||
{
|
||||
"ethers.js/html/api-advanced.html":
|
||||
{ "path": "/v5/api/utils/" },
|
||||
"ethers.js/html/api-advanced.html#abi-coder":
|
||||
{ "tag": "AbiCoder" },
|
||||
"ethers.js/html/api-advanced.html#api-interface":
|
||||
{ "tag": "Interface" },
|
||||
"ethers.js/html/api-advanced.html#creating-an-instance":
|
||||
{ "tag": "Interface--creating" },
|
||||
"ethers.js/html/api-advanced.html#creating-instances":
|
||||
{ "tag": "AbiCoder--creating" },
|
||||
"ethers.js/html/api-advanced.html#cryptographic-operations":
|
||||
{ "tag": "SigningKey" },
|
||||
"ethers.js/html/api-advanced.html#deriving-child-and-neutered-nodes":
|
||||
{ "tag": "HDNode--methods" },
|
||||
"ethers.js/html/api-advanced.html#descriptions":
|
||||
{ "tag": "Interface--parsing" },
|
||||
"ethers.js/html/api-advanced.html#hdnode":
|
||||
{ "tag": "HDNode" },
|
||||
"ethers.js/html/api-advanced.html#interface":
|
||||
{ "tag": "Interface" },
|
||||
"ethers.js/html/api-advanced.html#low-level-api":
|
||||
{ "path": "/v5/api/utils/" },
|
||||
"ethers.js/html/api-advanced.html#object-test-functions":
|
||||
{ "tag": "Interface" },
|
||||
"ethers.js/html/api-advanced.html#parsing-objects":
|
||||
{ "tag": "Interface--parsing" },
|
||||
"ethers.js/html/api-advanced.html#prototype":
|
||||
{ "tag": "AbiCoder--methods" },
|
||||
"ethers.js/html/api-advanced.html#id3":
|
||||
{ "tag": "Interface" },
|
||||
"ethers.js/html/api-advanced.html#id5":
|
||||
{ "tag": "Provider" },
|
||||
"ethers.js/html/api-advanced.html#id8":
|
||||
{ "tag": "SigningKey" },
|
||||
"ethers.js/html/api-advanced.html#provider-sub-classing":
|
||||
{ "tag": "Provider" },
|
||||
"ethers.js/html/api-advanced.html#recursive-length-prefixed-encoding-rlp":
|
||||
{ "tag": "rlp--methods" },
|
||||
"ethers.js/html/api-advanced.html#signing-key":
|
||||
{ "tag": "SigningKey" },
|
||||
"ethers.js/html/api-advanced.html#static-methods":
|
||||
{ "tag": "HDNode--methods" },
|
||||
"ethers.js/html/api-advanced.html#id6":
|
||||
{ "tag": "rlp--methods" },
|
||||
"ethers.js/html/api-advanced.html#static-properties":
|
||||
{ "tag": "AbiCoder--creating" },
|
||||
"ethers.js/html/api-contract.html":
|
||||
{ "tag": "Contract" },
|
||||
"ethers.js/html/api-contract.html#api-contract":
|
||||
{ "tag": "Contract" },
|
||||
"ethers.js/html/api-contract.html#application-binary-interface-abi":
|
||||
{ "tag": "abi-formats" },
|
||||
"ethers.js/html/api-contract.html#bytes":
|
||||
{ "tag": "Contract-functionsCall" },
|
||||
"ethers.js/html/api-contract.html#configuring-events":
|
||||
{ "tag": "Contract--events" },
|
||||
"ethers.js/html/api-contract.html#connecting":
|
||||
{ "tag": "ContractFactory-attach" },
|
||||
"ethers.js/html/api-contract.html#connecting-to-a-contract":
|
||||
{ "tag": "Contract--creating" },
|
||||
"ethers.js/html/api-contract.html#connecting-to-existing-contracts":
|
||||
{ "tag": "Contract--creating" },
|
||||
"ethers.js/html/api-contract.html#contract-abi":
|
||||
{ "tag": "abi-formats" },
|
||||
"ethers.js/html/api-contract.html#contract-event-filters":
|
||||
{ "tag": "Contract--filters" },
|
||||
"ethers.js/html/api-contract.html#contract-filter":
|
||||
{ "tag": "Contract--filters" },
|
||||
"ethers.js/html/api-contract.html#contract-metaclass":
|
||||
{ "tag": "Contract--metaclass" },
|
||||
"ethers.js/html/api-contract.html#contract-methods":
|
||||
{ "tag": "Contract--methods" },
|
||||
"ethers.js/html/api-contract.html#contracts":
|
||||
{ "tag": "Contract" },
|
||||
"ethers.js/html/api-contract.html#creating-a-contract-factory":
|
||||
{ "tag": "ContractFactory--creating" },
|
||||
"ethers.js/html/api-contract.html#deploying-a-contract":
|
||||
{ "tag": "ContractFactory-deploy" },
|
||||
"ethers.js/html/api-contract.html#deployment":
|
||||
{ "tag": "ContractFactory--methods" },
|
||||
"ethers.js/html/api-contract.html#event-emitter":
|
||||
{ "tag": "Contract--events" },
|
||||
"ethers.js/html/api-contract.html#event-names":
|
||||
{ "tag": "Contract--events" },
|
||||
"ethers.js/html/api-contract.html#event-object":
|
||||
{ "tag": "Contract--events" },
|
||||
"ethers.js/html/api-contract.html#filtering-events":
|
||||
{ "tag": "Contract--filters" },
|
||||
"ethers.js/html/api-contract.html#integers":
|
||||
{ "tag": "Contract-functionsCall" },
|
||||
"ethers.js/html/api-contract.html#meta-class-properties":
|
||||
{ "tag": "Contract--metaclass" },
|
||||
"ethers.js/html/api-contract.html#overrides":
|
||||
{ "tag": "Contract--metaclass" },
|
||||
"ethers.js/html/api-contract.html#prototype":
|
||||
{ "tag": "Contract--properties" },
|
||||
"ethers.js/html/api-contract.html#providers-vs-signers":
|
||||
{ "tag": "Contract-connect" },
|
||||
"ethers.js/html/api-contract.html#strings":
|
||||
{ "tag": "Bytes32String" },
|
||||
"ethers.js/html/api-contract.html#structs":
|
||||
{ "tag": "Contract--metaclass" },
|
||||
"ethers.js/html/api-contract.html#types":
|
||||
{ "tag": "Contract-functionsCall" },
|
||||
"ethers.js/html/api-contract.html#waiting-for-deployment":
|
||||
{ "tag": "ContractFactory" },
|
||||
"ethers.js/html/api-providers.html":
|
||||
{ "tag": "providers" },
|
||||
"ethers.js/html/api-providers.html#account":
|
||||
{ "tag": "Provider--account-methods" },
|
||||
"ethers.js/html/api-providers.html#api-provider":
|
||||
{ "tag": "Provider" },
|
||||
"ethers.js/html/api-providers.html#block-responses":
|
||||
{ "tag": "Provider--block-methods" },
|
||||
"ethers.js/html/api-providers.html#block-tag":
|
||||
{ "tag": "providers-BlockTag" },
|
||||
"ethers.js/html/api-providers.html#blockchain-status":
|
||||
{ "tag": "Provider--network-methods" },
|
||||
"ethers.js/html/api-providers.html#blockresponse":
|
||||
{ "tag": "providers-Block" },
|
||||
"ethers.js/html/api-providers.html#blocktag":
|
||||
{ "tag": "providers-BlockTag" },
|
||||
"ethers.js/html/api-providers.html#connecting-to-ethereum":
|
||||
{ "tag": "providers-getDefaultProvider" },
|
||||
"ethers.js/html/api-providers.html#contract-execution":
|
||||
{ "tag": "Provider--transaction-methods" },
|
||||
"ethers.js/html/api-providers.html#contract-state":
|
||||
{ "tag": "Provider--account-methods" },
|
||||
"ethers.js/html/api-providers.html#ethereum-naming-service":
|
||||
{ "tag": "Provider--ens-methods" },
|
||||
"ethers.js/html/api-providers.html#etherscan":
|
||||
{ "tag": "EtherscanProvider" },
|
||||
"ethers.js/html/api-providers.html#etherscanprovider-inherits-from-provider":
|
||||
{ "tag": "EtherscanProvider" },
|
||||
"ethers.js/html/api-providers.html#event-types":
|
||||
{ "tag": "Provider--events" },
|
||||
"ethers.js/html/api-providers.html#events":
|
||||
{ "tag": "Provider--events" },
|
||||
"ethers.js/html/api-providers.html#fallbackprovider-inherits-from-provider":
|
||||
{ "tag": "FallbackProvider" },
|
||||
"ethers.js/html/api-providers.html#filter":
|
||||
{ "tag": "Provider--events" },
|
||||
"ethers.js/html/api-providers.html#filters":
|
||||
{ "tag": "Provider--events" },
|
||||
"ethers.js/html/api-providers.html#infuraprovider-inherits-from-jsonrpcprovider":
|
||||
{ "tag": "InfuraProvider" },
|
||||
"ethers.js/html/api-providers.html#ipcprovider-inherits-from-jsonrpcprovider":
|
||||
{ "tag": "IpcProvider" },
|
||||
"ethers.js/html/api-providers.html#jsonrpcprovider":
|
||||
{ "tag": "JsonRpcProvider" },
|
||||
"ethers.js/html/api-providers.html#jsonrpcprovider-inherits-from-provider":
|
||||
{ "tag": "JsonRpcProvider" },
|
||||
"ethers.js/html/api-providers.html#jsonrpcsigner":
|
||||
{ "tag": "JsonRpcSigner" },
|
||||
"ethers.js/html/api-providers.html#log":
|
||||
{ "tag": "Provider--log-methods" },
|
||||
"ethers.js/html/api-providers.html#network":
|
||||
{ "tag": "Provider--network-methods" },
|
||||
"ethers.js/html/api-providers.html#objects-and-types":
|
||||
{ "path": "/v5/api/providers/types/" },
|
||||
"ethers.js/html/api-providers.html#properties":
|
||||
{ "tag": "Provider" },
|
||||
"ethers.js/html/api-providers.html#provider":
|
||||
{ "tag": "Provider" },
|
||||
"ethers.js/html/api-providers.html#provider-connect":
|
||||
{ "tag": "providers-getDefaultProvider" },
|
||||
"ethers.js/html/api-providers.html#provider-etherscan-extra":
|
||||
{ "tag": "EtherscanProvider" },
|
||||
"ethers.js/html/api-providers.html#provider-etherscan-properties":
|
||||
{ "tag": "EtherscanProvider" },
|
||||
"ethers.js/html/api-providers.html#provider-fallback-properties":
|
||||
{ "tag": "FallbackProvider" },
|
||||
"ethers.js/html/api-providers.html#provider-infura-properties":
|
||||
{ "tag": "InfuraProvider" },
|
||||
"ethers.js/html/api-providers.html#provider-ipc-properties":
|
||||
{ "tag": "IpcProvider" },
|
||||
"ethers.js/html/api-providers.html#provider-jsonrpc-extra":
|
||||
{ "tag": "JsonRpcProvider" },
|
||||
"ethers.js/html/api-providers.html#provider-jsonrpc-properties":
|
||||
{ "tag": "JsonRpcProvider" },
|
||||
"ethers.js/html/api-providers.html#provider-specific-extra-api-calls":
|
||||
{ "path": "/api/providers/other/" },
|
||||
"ethers.js/html/api-providers.html#provider-web3-properties":
|
||||
{ "tag": "Web3Provider" },
|
||||
"ethers.js/html/api-providers.html#providers":
|
||||
{ "path": "/v5/api/providers/" },
|
||||
"ethers.js/html/api-providers.html#signer-jsonrpc":
|
||||
{ "tag": "JsonRpcSigner" },
|
||||
"ethers.js/html/api-providers.html#transaction-receipt":
|
||||
{ "tag": "providers-TransactionReceipt" },
|
||||
"ethers.js/html/api-providers.html#transaction-receipts":
|
||||
{ "tag": "providers-TransactionReceipt" },
|
||||
"ethers.js/html/api-providers.html#transaction-request":
|
||||
{ "tag": "providers-TransactionRequest" },
|
||||
"ethers.js/html/api-providers.html#transaction-requests":
|
||||
{ "tag": "providers-TransactionRequest" },
|
||||
"ethers.js/html/api-providers.html#transaction-response":
|
||||
{ "tag": "providers-TransactionResponse" },
|
||||
"ethers.js/html/api-providers.html#waitfortransaction":
|
||||
{ "tag": "Provider-waitForTransaction" },
|
||||
"ethers.js/html/api-providers.html#waiting-for-transactions":
|
||||
{ "tag": "Provider-waitForTransaction" },
|
||||
"ethers.js/html/api-providers.html#web3provider-inherits-from-jsonrpcprovider":
|
||||
{ "tag": "Web3Provider" },
|
||||
"ethers.js/html/api-utils.html":
|
||||
{ "path": "/v5/api/utils/" },
|
||||
"ethers.js/html/api-utils.html#addresses":
|
||||
{ "tag": "addresses" },
|
||||
"ethers.js/html/api-utils.html#arrayish":
|
||||
{ "tag": "Bytes" },
|
||||
"ethers.js/html/api-utils.html#big-numbers":
|
||||
{ "tag": "BigNumber" },
|
||||
"ethers.js/html/api-utils.html#bignumber":
|
||||
{ "tag": "BigNumber" },
|
||||
"ethers.js/html/api-utils.html#bytes32-strings":
|
||||
{ "tag": "Bytes32String" },
|
||||
"ethers.js/html/api-utils.html#bytes32string":
|
||||
{ "tag": "Bytes32String" },
|
||||
"ethers.js/html/api-utils.html#constants":
|
||||
{ "tag": "constants" },
|
||||
"ethers.js/html/api-utils.html#creating-instances":
|
||||
{ "tag": "BigNumber--creating" },
|
||||
"ethers.js/html/api-utils.html#cryptographic-functions":
|
||||
{ "tag": "cryptographic-hash-functions" },
|
||||
"ethers.js/html/api-utils.html#elliptic-curve":
|
||||
{ "tag": "SigningKey" },
|
||||
"ethers.js/html/api-utils.html#ether-strings-and-wei":
|
||||
{ "tag": "unit-conversion" },
|
||||
"ethers.js/html/api-utils.html#formatether":
|
||||
{ "tag": "utils-formatUnits" },
|
||||
"ethers.js/html/api-utils.html#hash-function-helpers":
|
||||
{ "tag": "utils--hashing-helpers" },
|
||||
"ethers.js/html/api-utils.html#hash-functions":
|
||||
{ "tag": "cryptographic-hash-functions" },
|
||||
"ethers.js/html/api-utils.html#hex-strings":
|
||||
{ "tag": "HexString" },
|
||||
"ethers.js/html/api-utils.html#hexstring":
|
||||
{ "tag": "HexString" },
|
||||
"ethers.js/html/api-utils.html#key-derivation":
|
||||
{ "tag": "utils--hashing-helpers" },
|
||||
"ethers.js/html/api-utils.html#namehash":
|
||||
{ "tag": "utils-namehash" },
|
||||
"ethers.js/html/api-utils.html#parseether":
|
||||
{ "tag": "utils-parseUnits" },
|
||||
"ethers.js/html/api-utils.html#random":
|
||||
{ "tag": "utils-randomBytes" },
|
||||
"ethers.js/html/api-utils.html#signature":
|
||||
{ "tag": "Signature" },
|
||||
"ethers.js/html/api-utils.html#signatures":
|
||||
{ "tag": "Signature" },
|
||||
"ethers.js/html/api-utils.html#solidity":
|
||||
{ "tag": "utils--solidity-hashing" },
|
||||
"ethers.js/html/api-utils.html#transactions":
|
||||
{ "tag": "transactions--functions" },
|
||||
"ethers.js/html/api-utils.html#utf-8-strings":
|
||||
{ "tag": "strings-utf8" },
|
||||
"ethers.js/html/api-utils.html#utf8-strings":
|
||||
{ "tag": "strings-utf8" },
|
||||
"ethers.js/html/api-utils.html#utilities":
|
||||
{ "path": "/v5/api/utils/" },
|
||||
"ethers.js/html/api-utils.html#utils-getaddress":
|
||||
{ "tag": "utils-getAddress" },
|
||||
"ethers.js/html/api-utils.html#web":
|
||||
{ "tag": "web" },
|
||||
"ethers.js/html/api-wallet.html":
|
||||
{ "tag": "Wallet" },
|
||||
"ethers.js/html/api-wallet.html#blockchain-operations":
|
||||
{ "tag": "Signer--blockchain-methods" },
|
||||
"ethers.js/html/api-wallet.html#creating-instances":
|
||||
{ "tag": "Wallet" },
|
||||
"ethers.js/html/api-wallet.html#encrypted-json-wallets":
|
||||
{ "tag": "Wallet--methods" },
|
||||
"ethers.js/html/api-wallet.html#fromencryptedjson":
|
||||
{ "tag": "Wallet-fromEncryptedJson" },
|
||||
"ethers.js/html/api-wallet.html#prototype":
|
||||
{ "tag": "Wallet--properties" },
|
||||
"ethers.js/html/api-wallet.html#sendtransaction":
|
||||
{ "tag": "Signer-sendTransaction" },
|
||||
"ethers.js/html/api-wallet.html#signer":
|
||||
{ "tag": "Signer" },
|
||||
"ethers.js/html/api-wallet.html#signer-api":
|
||||
{ "tag": "Signer" },
|
||||
"ethers.js/html/api-wallet.html#signing":
|
||||
{ "tag": "Signer--signing-methods" },
|
||||
"ethers.js/html/api-wallet.html#wallet":
|
||||
{ "tag": "Wallet" },
|
||||
"ethers.js/html/api-wallet.html#wallet-connect":
|
||||
{ "tag": "Signer-connect" },
|
||||
"ethers.js/html/api-wallet.html#wallets-and-signers":
|
||||
{ "tag": "signers" },
|
||||
"ethers.js/html/api.html":
|
||||
{ "tag": "api" },
|
||||
"ethers.js/html/api.html#api":
|
||||
{ "tag": "api" },
|
||||
"ethers.js/html/api.html#application-programming-interface-api":
|
||||
{ "tag": "api" },
|
||||
"ethers.js/html/cookbook-accounts.html":
|
||||
{ "path": "/v5/cookbook/" },
|
||||
"ethers.js/html/cookbook-accounts.html#access-funds-in-a-mnemonic-phrase-wallet":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-accounts.html#accounts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-accounts.html#coalesce-jaxx-wallets":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-accounts.html#dump-all-json-wallet-balances-in-current-directory":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-accounts.html#get-transaction-history":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-accounts.html#random-mnemonic":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-accounts.html#sweep-an-account-into-another":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-contracts.html":
|
||||
{ "path": "/v5/cookbook/" },
|
||||
"ethers.js/html/cookbook-contracts.html#contracts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-contracts.html#economic-incentives-and-economic-value":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-contracts.html#return-a-value-from-a-state-changing-method":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-providers.html":
|
||||
{ "path": "/v5/cookbook/" },
|
||||
"ethers.js/html/cookbook-providers.html#custom-provider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-providers.html#metamask":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-providers.html#providers":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-providers.html#testrpc-ganache":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-react.html":
|
||||
{ "path": "/v5/cookbook/" },
|
||||
"ethers.js/html/cookbook-react.html#other-notes":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-react.html#react-native":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-react.html#shims":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-react.html#wordlists":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-signing.html":
|
||||
{ "path": "/v5/cookbook/" },
|
||||
"ethers.js/html/cookbook-signing.html#signing-a-digest-hash":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-signing.html#signing-a-string-message":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-signing.html#signing-messages":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-testing.html":
|
||||
{ "path": "/v5/cookbook/" },
|
||||
"ethers.js/html/cookbook-testing.html#contract-events":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-testing.html#testing":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook-testing.html#using-multiple-accounts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/cookbook.html":
|
||||
{ "path": "/v5/cookbook/" },
|
||||
"ethers.js/html/cookbook.html#cookbook":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/getting-started.html":
|
||||
{ "tag": "getting-started" },
|
||||
"ethers.js/html/getting-started.html#getting-started":
|
||||
{ "tag": "getting-started" },
|
||||
"ethers.js/html/getting-started.html#importing":
|
||||
{ "tag": "importing" },
|
||||
"ethers.js/html/getting-started.html#including-in-web-applications":
|
||||
{ "tag": "importing" },
|
||||
"ethers.js/html/getting-started.html#installing-in-node-js":
|
||||
{ "tag": "installing" },
|
||||
"ethers.js/html/index.html":
|
||||
{ "path": "/v5/" },
|
||||
"ethers.js/html/index.html#features":
|
||||
{ "tag": "features" },
|
||||
"ethers.js/html/index.html#legacy-documentation":
|
||||
{ "tag": "documentation--legacy" },
|
||||
"ethers.js/html/index.html#what-is-ethers-js":
|
||||
{ "tag": "preamble" },
|
||||
"ethers.js/html/migration.html":
|
||||
{ "path": "/v5/migration/" },
|
||||
"ethers.js/html/migration.html#big-number":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#constants":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#custom-signer":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#default-provider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#deploying-contracts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#encrypted-wallets":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#events":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#fetching-json":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#interfaces":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#jsonrpcprovider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#migrating-from-ethers-v3-to-ethers-v4":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#migrating-from-web3-to-ethers-v4":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#migration-guides":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#networks":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#parsing-transactions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#verifying-messages":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/migration.html#waiting-for-transactions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/notes.html":
|
||||
{ "path": "/v5/" },
|
||||
"ethers.js/html/notes.html#checksum-address":
|
||||
{ "tag": "address-formats" },
|
||||
"ethers.js/html/notes.html#contributing":
|
||||
{ "path": "/v5/contributing/" },
|
||||
"ethers.js/html/notes.html#icap-address":
|
||||
{ "tag": "address-formats" },
|
||||
"ethers.js/html/notes.html#ieee754":
|
||||
{ "tag": "BigNumber--notes-safenumbers" },
|
||||
"ethers.js/html/notes.html#memory-hard-brute-force-encrpyting":
|
||||
{ "tag": "security--pbkdf" },
|
||||
"ethers.js/html/notes.html#notes":
|
||||
{ "tag": "/v5/" },
|
||||
"ethers.js/html/notes.html#promise":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/notes.html#promises":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/notes.html#responsible-disclosure":
|
||||
{ "path": "/v5/contributing/" },
|
||||
"ethers.js/html/notes.html#security":
|
||||
{ "tag": "security" },
|
||||
"ethers.js/html/notes.html#supported-platforms":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/notes.html#the-github-and-npm-package":
|
||||
{ "tag": "" },
|
||||
"ethers.js/html/notes.html#why-can-t-i-just-use-numbers":
|
||||
{ "tag": "BigNumber--notes-safenumbers" },
|
||||
"ethers.js/html/testing.html":
|
||||
{ "path": "/v5/testing/" },
|
||||
"ethers.js/html/testing.html#testing":
|
||||
{ "path": "/v5/testing/" },
|
||||
"ethers.js/v3.0/examples/splitter/index.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/examples/splitter/index.html" },
|
||||
"ethers.js/v3.0/examples/tool/index.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/examples/tool/index.html" },
|
||||
"ethers.js/v3.0/examples/wallet/index.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/examples/wallet/index.html" },
|
||||
"ethers.js/v3.0/html/api-advanced.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/api-advanced.html" },
|
||||
"ethers.js/v3.0/html/api-contract.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/api-contract.html" },
|
||||
"ethers.js/v3.0/html/api-providers.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/api-providers.html" },
|
||||
"ethers.js/v3.0/html/api-utils.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/api-utils.html" },
|
||||
"ethers.js/v3.0/html/api-wallet.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/api-wallet.html" },
|
||||
"ethers.js/v3.0/html/api.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/api.html" },
|
||||
"ethers.js/v3.0/html/cookbook.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/cookbook.html" },
|
||||
"ethers.js/v3.0/html/genindex.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/genindex.html" },
|
||||
"ethers.js/v3.0/html/getting-started.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/getting-started.html" },
|
||||
"ethers.js/v3.0/html/index.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/index.html" },
|
||||
"ethers.js/v3.0/html/notes.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/notes.html" },
|
||||
"ethers.js/v3.0/html/search.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/search.html" },
|
||||
"ethers.js/v3.0/html/testing.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/html/testing.html" },
|
||||
"ethers.js/v3.0/index.html":
|
||||
{ "redirect": "https://docs-legacy.ethers.io/v3/index.html" },
|
||||
"ethers.js/v5-beta/about-ethereum.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/about-ethereum.html#ethereum-basics":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#abi-coder":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#api-interface":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#creating-an-instance":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#creating-instances":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#cryptographic-operations":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#deriving-child-and-neutered-nodes":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#descriptions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#hdnode":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#interface":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#low-level-api":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#object-test-functions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#parsing-objects":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#prototype":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#provider-sub-classing":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#recursive-length-prefixed-encoding-rlp":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#signing-key":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#static-methods":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-advanced.html#static-properties":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#api-contract":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#application-binary-interface-abi":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#bytes":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#configuring-events":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#connecting":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#connecting-to-a-contract":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#connecting-to-existing-contracts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#contract-abi":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#contract-event-filters":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#contract-filter":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#contract-metaclass":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#contract-methods":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#contracts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#creating-a-contract-factory":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#deploying-a-contract":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#deployment":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#event-emitter":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#event-names":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#event-object":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#filtering-events":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#integers":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#meta-class-properties":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#overrides":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#prototype":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#providers-vs-signers":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#strings":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#structs":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#types":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-contract.html#waiting-for-deployment":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#account":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#api-provider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#block-responses":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#block-tag":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#blockchain-status":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#blockresponse":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#blocktag":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#connecting-to-ethereum":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#contract-execution":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#contract-state":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#ethereum-naming-service":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#etherscanprovider-inherits-from-provider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#event-types":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#events":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#fallbackprovider-inherits-from-provider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#filter":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#filters":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#infuraprovider-inherits-from-jsonrpcprovider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#ipcprovider-inherits-from-jsonrpcprovider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#jsonrpcprovider-inherits-from-provider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#jsonrpcsigner":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#log":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#network":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#nodesmithprovider-inherits-from-jsonrpcprovider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#objects-and-types":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#properties":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#provider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#provider-connect":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#provider-jsonrpc":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#provider-specific-properties-and-methods":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#providers":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#signer-jsonrpc":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#signer-uncheckedjsonrpc":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#transaction-receipt":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#transaction-receipts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#transaction-request":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#transaction-requests":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#transaction-response":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#uncheckedjsonrpcsigner":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#waitfortransaction":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#waiting-for-transactions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-providers.html#web3provider-inherits-from-jsonrpcprovider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#addresses":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#arrayish":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#big-numbers":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#bignumber":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#bytes32-strings":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#bytes32string":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#constants":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#creating-instances":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#cryptographic-functions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#elliptic-curve":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#ether-strings-and-wei":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#formatether":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#hash-function-helpers":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#hash-functions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#hex-strings":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#hexstring":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#key-derivation":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#namehash":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#parseether":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#random":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#signature":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#signatures":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#solidity":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#transactions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#utf-8-strings":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#utf8-strings":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#utilities":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#utils-getaddress":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-utils.html#web":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#blockchain-operations":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#creating-instances":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#encrypted-json-wallets":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#fromencryptedjson":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#prototype":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#sendtransaction":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#signer":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#signer-api":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#signing":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#void-signer":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#wallet":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#wallet-connect":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api-wallet.html#wallets-and-signers":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api.html#api":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/api.html#application-programming-interface-api":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/basics.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/basics.html#ethereum-basics":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-accounts.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-accounts.html#access-funds-in-a-mnemonic-phrase-wallet":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-accounts.html#accounts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-accounts.html#coalesce-jaxx-wallets":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-accounts.html#dump-all-json-wallet-balances-in-current-directory":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-accounts.html#get-transaction-history":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-accounts.html#random-mnemonic":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-accounts.html#sweep-an-account-into-another":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-contracts.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-contracts.html#contracts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-contracts.html#economic-incentives-and-economic-value":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-contracts.html#return-a-value-from-a-state-changing-method":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-providers.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-providers.html#custom-provider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-providers.html#metamask":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-providers.html#providers":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-providers.html#testrpc-ganache":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-react.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-react.html#other-notes":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-react.html#react-native":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-react.html#shims":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-react.html#wordlists":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-signing.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-signing.html#signing-a-digest-hash":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-signing.html#signing-a-string-message":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-signing.html#signing-messages":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-testing.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-testing.html#contract-events":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-testing.html#testing":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook-testing.html#using-multiple-accounts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/cookbook.html#cookbook":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/getting-started.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/getting-started.html#getting-started":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/getting-started.html#importing":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/getting-started.html#including-in-web-applications":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/getting-started.html#installing-in-node-js":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/index.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/index.html#features":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/index.html#legacy-documentation":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/index.html#what-is-ethers-js":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#big-number":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#constants":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#custom-signer":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#default-provider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#deploying-contracts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#encrypted-wallets":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#events":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#fetching-json":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#interfaces":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#jsonrpcprovider":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#migrating-from-ethers-v3-to-ethers-v4":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#migrating-from-web3-to-ethers-v4":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#migration-guides":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#networks":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#parsing-transactions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#verifying-messages":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/migration.html#waiting-for-transactions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#checksum-address":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#contributing":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#icap-address":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#ieee754":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#memory-hard-brute-force-encrpyting":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#notes":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#promise":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#promises":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#responsible-disclosure":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#security":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#supported-platforms":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#the-github-and-npm-package":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/notes.html#why-can-t-i-just-use-numbers":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#addresses":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#aion-network":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#api":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#avm-contracts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#differences-from-ethereum":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#elliptic-curve-cryptography":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#fvm-contracts":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#hashing":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#hashing-algorithm":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#serializing-transactions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#transactions":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-aion.html#wallet":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-ganache.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-ganache.html#ganache":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-react.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-react.html#react-native":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-truffle.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms-truffle.html#truffle":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/platforms.html#other-platform":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/testing.html":
|
||||
{ "tag": "" },
|
||||
"ethers.js/v5-beta/testing.html#testing":
|
||||
{ "tag": "" }
|
||||
}
|
||||
BIN
docs.wrm/social.jpg
Normal file
BIN
docs.wrm/social.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
@@ -1,3 +1,385 @@
|
||||
_section: Testing
|
||||
|
||||
Here goes info about testing
|
||||
Testing is a critical part of any library which wishes to remain secure, safe
|
||||
and reliable.
|
||||
|
||||
Ethers currently has **over 23k tests** among its test suites, which are all
|
||||
made available for other projects to use as simple exported GZIP-JSON files.
|
||||
|
||||
The tests are run on every check-in and the results can been seen on the
|
||||
[GitHub CI Action](link-github-ci).
|
||||
|
||||
We also strive to constantly add new test cases, especially when issues
|
||||
arise to ensure the issue is present prior to the fix, corrected after the
|
||||
fix and included to prevent future changes from causing a regression.
|
||||
|
||||
A large number of the test cases were created procedurally by using
|
||||
known correct implementations from various sources (such as Geth) and
|
||||
written in different languages and verified with multiple libraries.
|
||||
|
||||
For example, the ABI test suites were generated by procedurally generating
|
||||
a list of types, for each type choosing a random (valid) value, which then
|
||||
was converted into a Solidity source file, compiled using ``solc`` and
|
||||
deployed to a running Parity node and executed, with its outputs being
|
||||
captured. Similar to the how many of the hashing, event and selector test
|
||||
cases were created.
|
||||
|
||||
|
||||
_subsection: Supported Platforms @<testing-supported>
|
||||
|
||||
While web technologies move quite fast, especially in the Web3 universe, we try
|
||||
to keep ethers as accessible as possible.
|
||||
|
||||
Currently ethers should work on almost any ES3 or better environment and tests
|
||||
are run against:
|
||||
|
||||
- node.js 8.x
|
||||
- node.js 10.x
|
||||
- node.js 12.x
|
||||
- node.js 13.x
|
||||
- Web Browsers (using UMD)
|
||||
- Web Browsers (using ES modules)
|
||||
|
||||
If there is an environment you feel has been overlooked or have suggestions, please feel
|
||||
free to reach out by opening an [issue on Github](link-github-issues).
|
||||
|
||||
We would like to add a test build for Expo and React as those developers often seem
|
||||
to encounter pain points when using ethers, so if you have experience or ideas on this,
|
||||
[bug us](link-github-issues).
|
||||
|
||||
The next Major version (probably summer 2021) will likely drop support for node 8.x
|
||||
and will require ES2015 for [Proxy](link-js-proxy).
|
||||
|
||||
Certain features in JavaScript are also avoided, such as look-behind tokens in regular
|
||||
expressions, since these have caused conflicts (at import time) with certain JavaScript
|
||||
environments such as [Otto](link-otto).
|
||||
|
||||
Basically, the moral of the story is "be inclusive and don't drop people needlessly".
|
||||
|
||||
|
||||
_subsection: Test Suites @<testing-suites>
|
||||
|
||||
The test suites are available as gzipped JSON files in the
|
||||
``@ethersproject/testcases``, which makes it easy to install and import
|
||||
(both GZIP and JSON are quite easy to consume from most languages). Each
|
||||
test suite also has its schema available in this package.
|
||||
|
||||
_table: Test Suites @style<full>
|
||||
|
||||
$Account: Private Keys and addresses in checksum and ICAP formats
|
||||
$ContractEvents: Compiled Solidity, ABI interfaces, input types/values with the
|
||||
output types/values for emitted events; all tests were
|
||||
executed against real Ethereum nodes
|
||||
$ContractAbi: Compiled Solidity, ABI interfaces, input types/values with the
|
||||
output types/values, encoded and decoded binary data and normalized
|
||||
values for function calls executed against real Ethereum nodes.
|
||||
$ContractAbi2: Identical to ``contract-interface``, except with emphasis on
|
||||
the ABIv2 coder which supports nested dynami types and structured
|
||||
data
|
||||
$ContractSignatures: Contract signatures and matching selectors
|
||||
$Hashes: Data and respective hashes against a variety of hash functions
|
||||
$HDNode: HDNodes (BIP-32) with mnemonics, entropy, seed and computed nodes
|
||||
with pathes and addresses
|
||||
$Namehash: ENS names along with computed [namehashes](link-namehash
|
||||
$Nameprep: IDNA and Nameprep representations including official vectors
|
||||
$RLP: Recursive-Length Prefix (RLP) data and encodings
|
||||
$SoliditiyHashes: Hashes based on the Solidity non-standard packed form
|
||||
$Transactions: Signed and unsigned transactions with their serialized formats
|
||||
including both with and without EIP-155 replay protection
|
||||
$Units: Values converted between various units
|
||||
$Wallet: Keystore JSON format wallets, passwords and decrypted values
|
||||
$Wordlist: Fully decompressed BIP-39 official wordlists
|
||||
|
||||
| **Filename** | **Test Cases** <|
|
||||
| accounts.json.gz | $Account <|
|
||||
| contract-events.json.gz | $ContractEvents <|
|
||||
| contract-interface.json.gz | $ContractAbi <|
|
||||
| contract-interface-abi2.json.gz | $ContractAbi2 <|
|
||||
| contract-signatures.json.gz | $ContractSignatures <|
|
||||
| hashes.json.gz | $Hashes <|
|
||||
| hdnode.json.gz | $HDNode <|
|
||||
| namehash.json.gz | $Namehash <|
|
||||
| nameprep.json.gz | $Nameprep <|
|
||||
| rlp-coder.json.gz | $RLP <|
|
||||
| solidity-hashes.json.gz | $SoliditiyHashes <|
|
||||
| transactions.json.gz | $Transactions <|
|
||||
| units.json.gz | $Units <|
|
||||
| wallets.json.gz | $Wallet <|
|
||||
| wordlists.json.gz | $Wordlist <|
|
||||
|
||||
|
||||
_subsection: Test Suite API @<testing-api>
|
||||
|
||||
There are also convenience functions for those developing directly in TypeScript.
|
||||
|
||||
_property: testcases.loadTests(tag) => Array<TestCase>
|
||||
Load all the given testcases for the //tag//.
|
||||
|
||||
A tag is the string in the above list of test case names not including
|
||||
any extension (e.g. ``"solidity-hashes"``)
|
||||
|
||||
_property: testcases.TestCase.TEST_NAME
|
||||
Most testcases have its schema available as a TypeScript type to make testing
|
||||
each property easier.
|
||||
|
||||
_heading: Deterministic Random Numbers (DRNG)
|
||||
|
||||
When creating test cases, often we want want random data from the perspective
|
||||
we do not case what values are used, however we want the values to be consistent
|
||||
across runs. Otherwise it becomes difficult to reproduce an issue.
|
||||
|
||||
In each of the following the seed is used to control the random value returned. Be
|
||||
sure to tweak the seed properly, for example on each iteration change the value and
|
||||
in recursive functions, concatenate to the seed.
|
||||
|
||||
_property: testcases.randomBytes(seed, lower [, upper ]) => Uint8Array
|
||||
Return at least //lower// random bytes, up to //upper// (exclusive) if specified,
|
||||
given //seed//. If //upper// is omitted, exactly ///lower// bytes are returned.
|
||||
|
||||
_property: testcases.randomHexString(seed, lower [, upper ]) => string<[[DataHexString]]>
|
||||
Identical to randomBytes, except returns the value as a [[DataHexString]] instead of a
|
||||
Uint8Array.
|
||||
|
||||
_property: testcases.randomNumber(seed, lower, upper) => number
|
||||
Returns a random number of at least //lower// and less than //upper//
|
||||
given //seed//.
|
||||
|
||||
|
||||
_subsection: Schemas @<testing-schemas>
|
||||
|
||||
This section is still a work in progress, but will outline some of the more nuanced
|
||||
aspects of the test cases and their values.
|
||||
|
||||
There will likely be an overhaul of the test cases in the next major version, to
|
||||
make code coverage testing more straight forward and to collapse some of the redundancy.
|
||||
|
||||
For example, there is no longer a need to separate the ABI and ABIv2 test case and the
|
||||
accounts and transactions suites can be merged into one large collection.
|
||||
|
||||
|
||||
_heading: Accounts
|
||||
|
||||
Basic account information using a private key and computing various address forms.
|
||||
|
||||
Tests were verified against [EthereumJS](https:/\/github.com/ethereumjs) and custom
|
||||
scripts created to directly interact with Geth and cpp implementations.
|
||||
|
||||
//See: ``accounts.json.gz``//
|
||||
|
||||
_table: Properties
|
||||
|
||||
| **Property** | **Meaning** |
|
||||
| name | The testcase name |
|
||||
| privateKey | The private key |
|
||||
| address | The address (lowercase) |
|
||||
| checksumAddress | The address with checksum-adjusted case |
|
||||
| icapAddress | The ICAP address |
|
||||
|
||||
_code: Example @lang<script>
|
||||
{
|
||||
"name": "random-1023",
|
||||
"address": "0x53bff74b9af2e3853f758a8d2bd61cd115d27782",
|
||||
"privateKey": "0x8ab0e165c2ea461b01cdd49aec882d179dccdbdb5c85c3f9c94c448aa65c5ace",
|
||||
"checksumAddress": "0x53bFf74b9Af2E3853f758A8D2Bd61CD115d27782",
|
||||
"icapAddress": "XE709S6NUSJR6SXQERCMYENAYYOZ2Y91M6A"
|
||||
}
|
||||
|
||||
|
||||
_heading: Contract Interface
|
||||
|
||||
Procedurally generated test cases to test ABI coding.
|
||||
|
||||
_code: Example @lang<script>
|
||||
{
|
||||
"name": "random-1999",
|
||||
"source": "contract Test {\n function test() constant returns (address, bool, bytes14[1]) {\n address a = address(0x061C7F399Ee738c97C7b7cD840892B281bf772B5);\n bool b = bool(true);\n bytes14[1] memory c;\n c[0] = bytes14(0x327621c4abe12d4f21804ed40455);\n return (a, b, c);\n }\n}\n",
|
||||
"types": "[\"address\",\"bool\",\"bytes14[1]\"]",
|
||||
"interface": "[{\"constant\":true,\"inputs\":[],\"name\":\"test\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"bytes14[1]\"}],\"type\":\"function\"}]\n",
|
||||
"bytecode": "0x6060604052610175806100126000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063f8a8fd6d1461003957610037565b005b610046600480505061009d565b604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018315158152602001826001602002808383829060006004602084601f0104600f02600301f150905001935050505060405180910390f35b600060006020604051908101604052806001905b60008152602001906001900390816100b157905050600060006020604051908101604052806001905b60008152602001906001900390816100da5790505073061c7f399ee738c97c7b7cd840892b281bf772b59250600191506d327621c4abe12d4f21804ed404557201000000000000000000000000000000000000028160006001811015610002579090602002019071ffffffffffffffffffffffffffffffffffff191690818152602001505082828295509550955061016d565b50505090919256",
|
||||
"result": "0x000000000000000000000000061c7f399ee738c97c7b7cd840892b281bf772b50000000000000000000000000000000000000000000000000000000000000001327621c4abe12d4f21804ed40455000000000000000000000000000000000000",
|
||||
"values": "[{\"type\":\"string\",\"value\":\"0x061C7F399Ee738c97C7b7cD840892B281bf772B5\"},{\"type\":\"boolean\",\"value\":true},[{\"type\":\"buffer\",\"value\":\"0x327621c4abe12d4f21804ed40455\"}]]",
|
||||
"normalizedValues": "[{\"type\":\"string\",\"value\":\"0x061C7F399Ee738c97C7b7cD840892B281bf772B5\"},{\"type\":\"boolean\",\"value\":true},[{\"type\":\"buffer\",\"value\":\"0x327621c4abe12d4f21804ed40455\"}]]",
|
||||
"runtimeBytecode": "0x60606040526000357c010000000000000000000000000000000000000000000000000000000090048063f8a8fd6d1461003957610037565b005b610046600480505061009d565b604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018315158152602001826001602002808383829060006004602084601f0104600f02600301f150905001935050505060405180910390f35b600060006020604051908101604052806001905b60008152602001906001900390816100b157905050600060006020604051908101604052806001905b60008152602001906001900390816100da5790505073061c7f399ee738c97c7b7cd840892b281bf772b59250600191506d327621c4abe12d4f21804ed404557201000000000000000000000000000000000000028160006001811015610002579090602002019071ffffffffffffffffffffffffffffffffffff191690818152602001505082828295509550955061016d565b50505090919256"
|
||||
}
|
||||
|
||||
|
||||
_heading: Contract Signatures
|
||||
|
||||
Computed ABI signatures and the selector hash.
|
||||
|
||||
_code: Example @lang<script>
|
||||
{
|
||||
"name": "random-1999",
|
||||
"sigHash": "0xf51e9244",
|
||||
"abi": "[{\"constant\":false,\"inputs\":[{\"name\":\"r0\",\"type\":\"string[2]\"},{\"name\":\"r1\",\"type\":\"uint128\"},{\"components\":[{\"name\":\"a\",\"type\":\"bytes\"},{\"name\":\"b\",\"type\":\"bytes\"},{\"name\":\"c\",\"type\":\"bytes\"}],\"name\":\"r2\",\"type\":\"tuple\"},{\"name\":\"r3\",\"type\":\"bytes\"}],\"name\":\"testSig\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"test\",\"outputs\":[{\"name\":\"r0\",\"type\":\"string[2]\"},{\"name\":\"r1\",\"type\":\"uint128\"},{\"components\":[{\"name\":\"a\",\"type\":\"bytes\"},{\"name\":\"b\",\"type\":\"bytes\"},{\"name\":\"c\",\"type\":\"bytes\"}],\"name\":\"r2\",\"type\":\"tuple\"},{\"name\":\"r3\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
"signature": "testSig(string[2],uint128,(bytes,bytes,bytes),bytes)"
|
||||
}
|
||||
|
||||
_heading: Hashes
|
||||
|
||||
_code: Examples @lang<script>
|
||||
{
|
||||
"data": "0x3718a88ceb214c1480c32a9d",
|
||||
"keccak256": "0x82d7d2dc3d384ddb289f41917b8280675bb1283f4fe2b601ac7c8f0a2c2824fa",
|
||||
"sha512": "0xe93462bb1de62ba3e6a980c3cb0b61728d3f771cea9680b0fa947b6f8fb2198a2690a3a837495c753b57f936401258dfe333a819e85f958b7d786fb9ab2b066c",
|
||||
"sha256": "0xe761d897e667aa72141dd729264c393c4ddda5c62312bbd21b0f4d954eba1a8d"
|
||||
}
|
||||
|
||||
|
||||
_heading: Hierarchal Deterministic Node (BIP-32)
|
||||
|
||||
Tests for [BIP-32](link-bip-32) HD Wallets.
|
||||
|
||||
_code: Example @lang<script>
|
||||
{
|
||||
"name": "trezor-23",
|
||||
"entropy": "0xf585c11aec520db57dd353c69554b21a89b20fb0650966fa0a9d6f74fd989d8f",
|
||||
"mnemonic": "void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold",
|
||||
"locale": "en",
|
||||
"password": "TREZOR",
|
||||
"hdnodes": [
|
||||
{
|
||||
"path": "m",
|
||||
"address": "0xfd8eb95169ce57eab52fb69bc6922e9b6454d9aa",
|
||||
"privateKey": "0x679bf92c04cf16307053cbed33784f3c4266b362bf5f3d7ee13bed6f2719743c"
|
||||
},
|
||||
{
|
||||
"address": "0xada964e9f10c4fc9787f9e17f00c63fe188722b0",
|
||||
"privateKey": "0xdcbcb48a2b11eef0aab93a8f88d83f60a3aaabb34f9ffdbe939b8f059b30f2b7",
|
||||
"path": "m/8'/8'/2/3/4"
|
||||
},
|
||||
{
|
||||
"privateKey": "0x10fd3776145dbeccb3d6925e4fdc0d58b452fce40cb8760b12f8b4223fafdfa6",
|
||||
"address": "0xf3f6b1ef343d5f5f231a2287e801a46add43eb06",
|
||||
"path": "m/1'/3'"
|
||||
},
|
||||
{
|
||||
"address": "0xb7b0fdb6e0f79f0529e95400903321e8a601b411",
|
||||
"privateKey": "0x093a8ff506c95a2b79d397aed59703f6212ff3084731c2f03089b069ae76e69d",
|
||||
"path": "m/8'/4'/7'"
|
||||
},
|
||||
{
|
||||
"path": "m/7'/5'/11",
|
||||
"privateKey": "0x6bd79da4dfa7dd0abf566a011bdb7cba0d28bba9ca249ba25880d5dabf861b42",
|
||||
"address": "0x1b3ad5fa50ae32875748107f4b2160829cc10536"
|
||||
},
|
||||
{
|
||||
"path": "m/9'/6'/2'/7'/3'",
|
||||
"address": "0x42eb4bed59f3291d02387cf0fb23098c55d82611",
|
||||
"privateKey": "0xfc173acba7bc8bb2c434965d9e99f5a221f81add421bae96a891d08d60be11dd"
|
||||
}
|
||||
],
|
||||
"seed": "0x01f5bced59dec48e362f2c45b5de68b9fd6c92c6634f44d6d40aab69056506f0e35524a518034ddc1192e1dacd32c1ed3eaa3c3b131c88ed8e7e54c49a5d0998"
|
||||
}
|
||||
|
||||
|
||||
_heading: ENS Namehash
|
||||
|
||||
Test cases for the [ENS Namehash Algorithm](link-namehash).
|
||||
|
||||
_code: Examples
|
||||
{
|
||||
"expected": "0x33868cc5c3fd3a9cd3adbc1e868ea133d2218f60dc2660c3bc48d8b1f4961384",
|
||||
"name": "ViTalIk.WALlet.Eth",
|
||||
"test": "mixed case"
|
||||
}
|
||||
|
||||
|
||||
_heading: RLP Coder
|
||||
|
||||
_code: Examples @lang<script>
|
||||
{
|
||||
"name": "arrayWithNullString3",
|
||||
"encoded": "0xc3808080",
|
||||
"decoded": [ "0x", "0x", "0x" ]
|
||||
}
|
||||
|
||||
|
||||
_heading: Solidity Hashes
|
||||
|
||||
Tests for the non-standard packed form of the Solidity hash functions.
|
||||
|
||||
These tests were created by procedurally generating random signatures and
|
||||
values that match those signatures, constructing the equivalent Soldity,
|
||||
compiling it and deploying it to a Parity node then evaluating the response.
|
||||
|
||||
_code: Example @lang<script>
|
||||
{
|
||||
"name": "random-1999",
|
||||
"keccak256": "0x7d98f1144a0cd689f720aa2f11f0a73bd52a2da1117175bc4bacd93c130966a1",
|
||||
"ripemd160": "0x59384617f8a06efd57ab106c9e0c20c3e64137ac000000000000000000000000",
|
||||
"sha256": "0xf9aeea729ff39f8d372d8552bca81eb2a3c5d433dc8f98140040a03b7d81ac92",
|
||||
"values": [
|
||||
"0xcdffcb5242e6",
|
||||
"0xc1e101b60ebe4688",
|
||||
"0x5819f0ef5537796e43bdcd48309f717d6f7ccffa",
|
||||
"0xec3f3f9f",
|
||||
false,
|
||||
true
|
||||
],
|
||||
"types": [
|
||||
"int184",
|
||||
"int176",
|
||||
"address",
|
||||
"int64",
|
||||
"bool",
|
||||
"bool"
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
_heading: Transactions
|
||||
|
||||
Serialized signed and unsigned transactions with both EIP-155 enabled and
|
||||
disabled.
|
||||
|
||||
_code: Examples @lang<script>
|
||||
{
|
||||
"name": "random-998",
|
||||
"privateKey": "0xd16c8076a15f7fb583f05dc12686fe526bc59d298f1eb7b9a237b458133d1dec",
|
||||
"signedTransactionChainId5": "0xf8708391d450848517cfba8736fcf36da03ee4949577303fd4e0acbe72c6c116acab5bf63f0b1e9c8365fdc7827dc82ea059891894eb180cb7c6c45a52f62d2103420d3ad0bc3ba518d0a25ed910842522a0155c0ea2aee2ea82e75843aab297420bad907d46809d046b13d692928f4d78aa",
|
||||
"gasLimit": "0x36fcf36da03ee4",
|
||||
"to": "0x9577303fd4e0acbe72c6c116acab5bf63f0b1e9c",
|
||||
"data": "0x7dc8",
|
||||
"accountAddress": "0x6d4a6aff30ca5ca4b8422eea0ebcb669c7d79859",
|
||||
"unsignedTransaction": "0xed8391d450848517cfba8736fcf36da03ee4949577303fd4e0acbe72c6c116acab5bf63f0b1e9c8365fdc7827dc8",
|
||||
"nonce": "0x91d450",
|
||||
"gasPrice": "0x8517cfba",
|
||||
"signedTransaction": "0xf8708391d450848517cfba8736fcf36da03ee4949577303fd4e0acbe72c6c116acab5bf63f0b1e9c8365fdc7827dc81ba05030832331e6be48c95e1569a1ca9505c495486f72d6009b3a30fadfa05d9686a05cd3116b416d2362da1e9b0ca7fb1856c4e591cc22e63b395bd881ce2d3735e6",
|
||||
"unsignedTransactionChainId5": "0xf08391d450848517cfba8736fcf36da03ee4949577303fd4e0acbe72c6c116acab5bf63f0b1e9c8365fdc7827dc8058080",
|
||||
"value": "0x65fdc7"
|
||||
}
|
||||
|
||||
|
||||
_heading: Units
|
||||
|
||||
Unit conversion.
|
||||
|
||||
_code: Example @lang<script>
|
||||
{
|
||||
"name": "one-two-three-3",
|
||||
"gwei_format": "-1234567890123456.789012345",
|
||||
"ether_format": "-1234567.890123456789012345",
|
||||
"gwei": "-1234567890123456.789012345",
|
||||
"ether": "-1234567.890123456789012345",
|
||||
"finney": "-1234567890.123456789012345",
|
||||
"wei": "-1234567890123456789012345",
|
||||
"finney_format": "-1234567890.123456789012345"
|
||||
}
|
||||
|
||||
|
||||
_heading: Wallets
|
||||
|
||||
Tests for the JSON keystore format.
|
||||
|
||||
_code: Example @lang<script>
|
||||
{
|
||||
"mnemonic": null,
|
||||
"name": "secretstorage_password",
|
||||
"type": "secret-storage",
|
||||
"password": "foo",
|
||||
"privateKey": "0xf03e581353c794928373fb0893bc731aefc4c4e234e643f3a46998b03cd4d7c5",
|
||||
"hasAddress": true,
|
||||
"json": "{\"address\":\"88a5c2d9919e46f883eb62f7b8dd9d0cc45bc290\",\"Crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"10adcc8bcaf49474c6710460e0dc974331f71ee4c7baa7314b4a23d25fd6c406\",\"cipherparams\":{\"iv\":\"1dcdf13e49cea706994ed38804f6d171\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"bbfa53547e3e3bfcc9786a2cbef8504a5031d82734ecef02153e29daeed658fd\"},\"mac\":\"1cf53b5ae8d75f8c037b453e7c3c61b010225d916768a6b145adf5cf9cb3a703\"},\"id\":\"fb1280c0-d646-4e40-9550-7026b1be504a\",\"version\":3}\n",
|
||||
"address": "0x88a5c2d9919e46f883eb62f7b8dd9d0cc45bc290"
|
||||
}
|
||||
|
||||
8
docs/api-keys/_index.html
Normal file
8
docs/api-keys/_index.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>API Keys - ethers</title>
|
||||
</head>
|
||||
<body>
|
||||
Redirect to /v5/api-keys.
|
||||
</body>
|
||||
</html>
|
||||
1
docs/api-keys/redirects.txt
Normal file
1
docs/api-keys/redirects.txt
Normal file
@@ -0,0 +1 @@
|
||||
index.html => /v5/api-keys
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user