Compare commits
1212 Commits
v5.0.0-bet
...
v5.0.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
59239d2f61 | ||
|
|
bf65ddbff0 | ||
|
|
7e56f3d392 | ||
|
|
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 | ||
|
|
1e21eb034b | ||
|
|
83fba3de25 | ||
|
|
54dfb757c4 | ||
|
|
28800d7681 | ||
|
|
9f8025155c | ||
|
|
84c68ac5c1 | ||
|
|
393c0c74a9 | ||
|
|
000aaaf4e8 | ||
|
|
56af4413b1 | ||
|
|
427a78b258 | ||
|
|
5aefb4303d | ||
|
|
d1f3a42c11 | ||
|
|
bda6623091 | ||
|
|
14e6811bf7 | ||
|
|
2e24920d02 | ||
|
|
017ea0d6bd | ||
|
|
47e4655f6b | ||
|
|
8e7751f7df | ||
|
|
6707754580 | ||
|
|
aeeb75f74c | ||
|
|
8bb2a0fd08 | ||
|
|
13862589fa | ||
|
|
fca5ccbc20 | ||
|
|
8cf4b3cf45 | ||
|
|
71d03c6e3c | ||
|
|
427e16826e | ||
|
|
fab14f8f5a | ||
|
|
e8c89d7ca9 | ||
|
|
2aeb4e9a9c | ||
|
|
9712592090 | ||
|
|
9b3f4dfdac | ||
|
|
db604aa6af | ||
|
|
560adeabb0 | ||
|
|
25102d4009 | ||
|
|
3135d7ff6c | ||
|
|
4874419119 | ||
|
|
da3b0bf078 | ||
|
|
9ae6b70efb | ||
|
|
723249d36c | ||
|
|
5b51549437 | ||
|
|
2f30410ddd | ||
|
|
798cafa6fe | ||
|
|
cc72f76695 | ||
|
|
4ef0e4f765 | ||
|
|
51e198aee1 | ||
|
|
54dfaacba3 | ||
|
|
797abb7267 | ||
|
|
39c78f37ce | ||
|
|
284771ea39 | ||
|
|
7dcefcbf71 | ||
|
|
2eb3823de4 | ||
|
|
69f707762e | ||
|
|
7498c18235 | ||
|
|
220e0710a9 | ||
|
|
40fb8b5b5c | ||
|
|
8ad26f0ff4 | ||
|
|
d7c8b355a0 | ||
|
|
6caf7c292c | ||
|
|
2882546351 | ||
|
|
6526de016f | ||
|
|
da412f6607 | ||
|
|
053a2d7fcd | ||
|
|
a656079752 | ||
|
|
0f144c6cc0 | ||
|
|
6c71b51512 | ||
|
|
70cffb6a51 | ||
|
|
ee647d26e3 | ||
|
|
092ce9bcc2 | ||
|
|
75abc0e5f6 | ||
|
|
2692e783b4 | ||
|
|
bd32ee0af5 | ||
|
|
62aad5f8f3 | ||
|
|
030f65e66c | ||
|
|
390497f389 | ||
|
|
72c89922a4 | ||
|
|
9ea16e5172 | ||
|
|
b1c6575a1b | ||
|
|
3b7176f322 | ||
|
|
5f7ddcd5d7 | ||
|
|
3e44aac8f1 | ||
|
|
d2c9214889 | ||
|
|
2c78f0bf26 | ||
|
|
117a5dd7ff | ||
|
|
fe3b3fa1ad | ||
|
|
e52312e783 | ||
|
|
7d34f73769 | ||
|
|
6809c370c0 | ||
|
|
64dccb275c | ||
|
|
0ad94cdf81 | ||
|
|
2ac8c0276d | ||
|
|
1a32990c81 | ||
|
|
8f25e6ab5d | ||
|
|
1cfab3173c | ||
|
|
ad27600c69 | ||
|
|
ac51a88c29 | ||
|
|
f61f34bfb2 | ||
|
|
a5d2ec534f | ||
|
|
4b8e198bf2 | ||
|
|
89ac9f4f29 | ||
|
|
908a33d190 | ||
|
|
8c164ab3d0 | ||
|
|
94db5dbdcf | ||
|
|
311af88cfa | ||
|
|
2fdf995e8a | ||
|
|
067d96062a | ||
|
|
4c9d740cdf | ||
|
|
a930047a10 | ||
|
|
4e41871fa4 | ||
|
|
9947acc349 | ||
|
|
f9c1a24787 | ||
|
|
6628b58561 | ||
|
|
027467ad86 | ||
|
|
6f2e9a7941 | ||
|
|
0e1cd4282d | ||
|
|
ca25c2f13d | ||
|
|
ab5ebd04c3 | ||
|
|
133291e9ba | ||
|
|
fa25e61f77 | ||
|
|
ec198fdb93 | ||
|
|
afa54e356a | ||
|
|
c75bc3daa0 | ||
|
|
90959c679e | ||
|
|
88765d55cc | ||
|
|
f259f9815d | ||
|
|
944600d779 | ||
|
|
b962b59ab7 | ||
|
|
375bd15594 | ||
|
|
f9ab665b52 | ||
|
|
a6b696d8bd | ||
|
|
89615c59d3 | ||
|
|
a33bf0e37f | ||
|
|
e7adc84a97 | ||
|
|
ff9bc2a282 | ||
|
|
b29510e363 | ||
|
|
13dbf1f965 | ||
|
|
5622f703d9 | ||
|
|
edb7c5da91 | ||
|
|
15bb840907 | ||
|
|
f02c7db410 | ||
|
|
bacc440397 | ||
|
|
8eb0190d5e | ||
|
|
acd601e7e7 | ||
|
|
05bfe21caf | ||
|
|
aafa42a32b | ||
|
|
1c85fe95b2 | ||
|
|
1decb13799 | ||
|
|
ba29618896 | ||
|
|
fa317ebc03 | ||
|
|
da8153c877 | ||
|
|
0296594aba | ||
|
|
748f89660a | ||
|
|
2987925fa5 | ||
|
|
0589b3102e | ||
|
|
df51b26fe7 | ||
|
|
bee5944567 | ||
|
|
7428776f75 | ||
|
|
edb49da155 | ||
|
|
99329b013c | ||
|
|
c11e7c348e | ||
|
|
e0d1d3866d | ||
|
|
f92d156f17 | ||
|
|
251882ced4 | ||
|
|
1ff5f5233e | ||
|
|
adf56229c6 | ||
|
|
931da2f774 | ||
|
|
5878b54d6e | ||
|
|
a055edb585 | ||
|
|
2d72c856a2 | ||
|
|
f4bcf24a25 | ||
|
|
ea102ef7c4 | ||
|
|
92a383ff0d | ||
|
|
792afabdc0 | ||
|
|
75e1a37bb5 | ||
|
|
c66d81e96f | ||
|
|
10943fc3ef | ||
|
|
bb9aa808a0 | ||
|
|
90ed07c74e | ||
|
|
245cd0e48e | ||
|
|
72b3bc9909 | ||
|
|
4151c0eacd | ||
|
|
b288ad9ba7 | ||
|
|
6da5c53120 | ||
|
|
26d3271643 | ||
|
|
c84664953d | ||
|
|
6f7fbf3858 | ||
|
|
41740956df | ||
|
|
602e6a8973 | ||
|
|
2e8f5ca7ed | ||
|
|
381a72ddaa | ||
|
|
074eb4ba69 | ||
|
|
c04f9a7fff | ||
|
|
3c184ace21 | ||
|
|
12da07579a | ||
|
|
bd066b8542 | ||
|
|
a7e29d60f7 | ||
|
|
2d5492cd2e | ||
|
|
13f50abd84 | ||
|
|
d0f4642f6d | ||
|
|
1e72fc7d6f | ||
|
|
a21c430c7a | ||
|
|
eb26a6d950 | ||
|
|
a648f2bd1e | ||
|
|
e593aba294 | ||
|
|
4478896ca5 | ||
|
|
5724fa5d9c | ||
|
|
f54f06b5c8 | ||
|
|
f996ec0c32 | ||
|
|
c76e01e61f | ||
|
|
f8087ae39c | ||
|
|
7250cdcd31 | ||
|
|
20f34f1ba9 | ||
|
|
e809eadf8d | ||
|
|
184c459fab | ||
|
|
06cafe3437 | ||
|
|
fdf0980663 | ||
|
|
9c78c7fee6 | ||
|
|
fa9f53def7 | ||
|
|
cf036e1ffa | ||
|
|
4ac08432b8 | ||
|
|
3e3048df81 | ||
|
|
c6199bf52a | ||
|
|
20409c083c | ||
|
|
7a90f18145 | ||
|
|
df1ae611ba | ||
|
|
6009a26c89 | ||
|
|
4470477d7f | ||
|
|
e3752e5986 | ||
|
|
f308ba3540 | ||
|
|
2f0e679f0b | ||
|
|
abab9f6aa2 | ||
|
|
c11c2e2e33 | ||
|
|
3d75c52dac | ||
|
|
30984b6f00 | ||
|
|
29f0e9dd62 | ||
|
|
79ef1e975d | ||
|
|
3ab373334c | ||
|
|
b72ef27b2a | ||
|
|
e518151509 | ||
|
|
19aaade9c6 | ||
|
|
c35ddaf646 | ||
|
|
8316406977 | ||
|
|
01ca35036c | ||
|
|
da8ca2e8bc | ||
|
|
1ec5804bd4 | ||
|
|
75895fa149 | ||
|
|
51e4ef2b45 | ||
|
|
e1509a6326 | ||
|
|
394c36cad4 | ||
|
|
1d4f90a958 | ||
|
|
494381a628 | ||
|
|
76a8e503dd | ||
|
|
d0e0e30532 | ||
|
|
d9d438a119 | ||
|
|
3d514c8dbb | ||
|
|
28339a9c85 | ||
|
|
fea867a206 | ||
|
|
b3f5266e78 | ||
|
|
0609ea9651 | ||
|
|
5b0c15930f | ||
|
|
12cfc59965 | ||
|
|
5af16a6090 | ||
|
|
3c864de612 | ||
|
|
778eb3b425 | ||
|
|
3d25882d6b | ||
|
|
a12030ad29 | ||
|
|
9b65111fc6 | ||
|
|
828c8cfd41 | ||
|
|
4f88c5ba6e | ||
|
|
238fcba83b | ||
|
|
751793ea25 | ||
|
|
8d27286be1 | ||
|
|
023e946072 | ||
|
|
004cb826d2 | ||
|
|
6f4291f65f | ||
|
|
bfcf224b2b | ||
|
|
9c63b4a753 | ||
|
|
c969fe5a68 | ||
|
|
22a26736cc | ||
|
|
8737f12e1b | ||
|
|
f0b2961f08 | ||
|
|
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 |
43
.github/workflows/nodejs.yml
vendored
Normal file
43
.github/workflows/nodejs.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Node.js CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
test-node:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
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 }}
|
||||
- uses: actions/checkout@v2
|
||||
- run: npm ci
|
||||
- run: npm run bootstrap
|
||||
- run: npm run test-node
|
||||
|
||||
test-browser:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
module: [ 'esm', 'umd' ]
|
||||
|
||||
steps:
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 12.x
|
||||
- uses: actions/checkout@v2
|
||||
- run: npm ci
|
||||
- run: npm run bootstrap
|
||||
- run: npm run test-browser-${{ matrix.module }}
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -14,3 +14,7 @@ shims/*.d.ts
|
||||
**/*.tmp-browserify-*
|
||||
|
||||
lerna-debug.log
|
||||
|
||||
packages/*/tsconfig.tsbuildinfo
|
||||
|
||||
packages/testcases/input/nameprep/**
|
||||
|
||||
175
CHANGELOG.md
175
CHANGELOG.md
@@ -3,158 +3,47 @@ Changelog
|
||||
|
||||
This change log is managed by `scripts/cmds/update-versions` but may be manually updated.
|
||||
|
||||
ethers/v5.0.0-beta.155 (2019-08-22 17:11)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.5 (2020-07-07 23:18)
|
||||
--------------------------------
|
||||
|
||||
- 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))
|
||||
- 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.0-beta.154 (2019-08-21 01:51)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.4 (2020-07-04 23:46)
|
||||
--------------------------------
|
||||
|
||||
- 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))
|
||||
- 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.0-beta.153 (2019-08-06 19:15)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.3 (2020-06-29 00:50)
|
||||
--------------------------------
|
||||
|
||||
- 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))
|
||||
- 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.0-beta.152 (2019-08-05 14:37)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.2 (2020-06-13 21:36)
|
||||
--------------------------------
|
||||
|
||||
- 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))
|
||||
- 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.0-beta.151 (2019-08-05 14:29)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.1 (2020-06-12 23:09)
|
||||
--------------------------------
|
||||
|
||||
- Added package name prefix to all _version for Logger. ([692589d](https://github.com/ethers-io/ethers.js/commit/692589db54cbca10a2a453e9a1801a8612056559))
|
||||
- Fixed embedded package version strings. ([5a69e9c](https://github.com/ethers-io/ethers.js/commit/5a69e9caa882aa5f1b44c4453d67cde43254eafe))
|
||||
|
||||
ethers/v5.0.0-beta.150 (2019-08-03 01:07)
|
||||
-----------------------------------------
|
||||
ethers/v5.0.0 (2020-06-12 19:58)
|
||||
--------------------------------
|
||||
|
||||
- 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))
|
||||
- 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))
|
||||
|
||||
103
README.md
103
README.md
@@ -1,11 +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 is just a development version to experiment with lerna.
|
||||
A complete Ethereum wallet implementation and utilities in JavaScript (and TypeScript).
|
||||
|
||||
**Do NOT use**
|
||||
**Features:**
|
||||
|
||||
- Keep your private keys in your client, **safe** and sound
|
||||
- Import and export **JSON wallets** (Geth, Parity and crowdsale)
|
||||
- Import and export BIP 39 **mnemonic phrases** (12 word backup phrases) and **HD Wallets** (English as well as Czech, French, Italian, Japanese, Korean, Simplified Chinese, Spanish, Traditional Chinese)
|
||||
- Meta-classes create JavaScript objects from any contract ABI, including **ABIv2** and **Human-Readable ABI**
|
||||
- Connect to Ethereum nodes over [JSON-RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC), [INFURA](https://infura.io), [Etherscan](https://etherscan.io), [Alchemy](https://alchemyapi.io) 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/ethers.js/html/)
|
||||
- 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
|
||||
@@ -14,68 +38,51 @@ Installing
|
||||
**node.js**
|
||||
|
||||
```
|
||||
/home/ricmoo/some_project> npm install --save ethers@next
|
||||
/home/ricmoo/some_project> npm install --save ethers
|
||||
```
|
||||
|
||||
**browser**
|
||||
**browser (UMD)**
|
||||
|
||||
```
|
||||
<script src="https://cdn.ethers.io/lib/ethers-5.0.min.js" type="text/javasctipt">
|
||||
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js" type="text/javascript">
|
||||
</script>
|
||||
```
|
||||
|
||||
**browser (ESM)**
|
||||
|
||||
```
|
||||
<script type="module">
|
||||
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.0.umd.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/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
|
||||
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))
|
||||
- `@ethersproject/cli` ([documentation](https://docs.ethers.io))
|
||||
- `@ethersproject/hardware-wallets` ([documentation](https://docs.ethers.io))
|
||||
|
||||
|
||||
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.
|
||||
@@ -36,7 +36,7 @@ function run(progname, args, ignoreErrorStream) {
|
||||
console.log("ERROR");
|
||||
console.log(stderr.toString());
|
||||
|
||||
let error = new Error("stderr not empty");
|
||||
let error = new Error(`stderr not empty: ${ progname } ${ JSON.stringify(args) }`);
|
||||
error.stderr = stderr.toString();
|
||||
error.stdout = stdout.toString();
|
||||
error.statusCode = code;
|
||||
@@ -49,13 +49,6 @@ function run(progname, args, ignoreErrorStream) {
|
||||
}
|
||||
|
||||
function setupConfig(outDir, moduleType, targetType) {
|
||||
function update(value) {
|
||||
let comps = value.split("/");
|
||||
if (comps.length >= 3 && comps[0] === "." && comps[1].match(/^lib(\.esm)?$/)) {
|
||||
return outDir + comps.slice(2).join("/");
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
// Configure the tsconfit.package.json...
|
||||
const path = resolve(__dirname, "../tsconfig.package.json");
|
||||
@@ -64,19 +57,23 @@ function setupConfig(outDir, moduleType, targetType) {
|
||||
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 (info.browser) {
|
||||
if (typeof(info.browser) === "string") {
|
||||
info.browser = update(info.browser);
|
||||
} else {
|
||||
for (let key in info.browser) {
|
||||
info.browser[key] = update(info.browser[key]);
|
||||
}
|
||||
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);
|
||||
|
||||
@@ -103,7 +100,7 @@ function runBuild(buildModule) {
|
||||
}
|
||||
|
||||
function runDist() {
|
||||
return run("npm", [ "run", "_dist_ethers" ], true);
|
||||
return run("npm", [ "run", "_dist" ], true);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
||||
@@ -105,9 +105,41 @@ async function generate() {
|
||||
return formatted.join("\n") + "\n";
|
||||
}
|
||||
|
||||
function getChanges() {
|
||||
const changes = [ ];
|
||||
|
||||
let lastLine = null;
|
||||
fs.readFileSync(ChangelogPath).toString().split("\n").forEach((line) => {
|
||||
line = line.trim();
|
||||
if (line === "") { return; }
|
||||
|
||||
if (line.substring(0, 5) === "-----") {
|
||||
changes.push({ title: lastLine, lines: [ ] });
|
||||
} else if (line.substring(0, 1) === "-" && changes.length) {
|
||||
changes[changes.length - 1].lines.push(line);
|
||||
}
|
||||
lastLine = line;
|
||||
});
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
function latestChange() {
|
||||
const recent = getChanges()[0];
|
||||
|
||||
const match = recent.title.match(/ethers\/([^\(]*)\(([^\)]*)\)/);
|
||||
|
||||
return {
|
||||
title: recent.title,
|
||||
version: match[1].trim(),
|
||||
data: match[2].trim(),
|
||||
content: recent.lines.join("\n")
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
generate: generate,
|
||||
latestChange: latestChange,
|
||||
ChangelogPath: ChangelogPath,
|
||||
}
|
||||
|
||||
|
||||
|
||||
10
admin/cmds/cache-github.js
Normal file
10
admin/cmds/cache-github.js
Normal file
@@ -0,0 +1,10 @@
|
||||
"use strict";
|
||||
|
||||
const config = require("../config");
|
||||
const { syncIssues } = require("../github");
|
||||
|
||||
(async function() {
|
||||
const user = await config.get("github-user");
|
||||
const password = await config.get("github-readonly");
|
||||
await syncIssues(user, password);
|
||||
})();
|
||||
142
admin/cmds/grep-github.js
Normal file
142
admin/cmds/grep-github.js
Normal file
@@ -0,0 +1,142 @@
|
||||
"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);
|
||||
});
|
||||
@@ -23,15 +23,23 @@ const { log } = require("../log");
|
||||
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; }
|
||||
// Not a package in this monorepoa
|
||||
const version = versions[name];
|
||||
if (version == null) { return; }
|
||||
|
||||
const value = ((version.indexOf("beta") !== -1) ? ">=": "^") + version;
|
||||
|
||||
// No change
|
||||
if (value === deps[name]) { return; }
|
||||
|
||||
// Show a header for the first change
|
||||
if (!shown) {
|
||||
log(`<bold:Locking ${ info.name }:>`);
|
||||
shown = true;
|
||||
}
|
||||
log(` <green:${ name }>: ${ deps[name] } => <bold:${ value.substring(2) }>`);
|
||||
|
||||
// Show the locked version
|
||||
log(` <green:${ name }>: ${ deps[name] } => <bold:${ value.replace(">", ">") }>`);
|
||||
deps[name] = value;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -2,12 +2,16 @@
|
||||
|
||||
const config = require("../config");
|
||||
|
||||
const { ChangelogPath, latestChange } = require("../changelog");
|
||||
const { getOrdered, loadPackage } = require("../depgraph");
|
||||
const { getGitTag } = require("../git");
|
||||
const { createRelease } = require("../github");
|
||||
const { getPackageVersion, publish } = require("../npm");
|
||||
const { log } = require("../log");
|
||||
|
||||
const USER_AGENT = "ethers-dist@0.0.0";
|
||||
const TAG = "next";
|
||||
const TAG = "latest";
|
||||
|
||||
|
||||
let dirnames = getOrdered();
|
||||
|
||||
@@ -32,11 +36,15 @@ if (process.argv.length > 2) {
|
||||
(async function() {
|
||||
let token = null;
|
||||
|
||||
const gitCommit = await getGitTag(ChangelogPath);
|
||||
|
||||
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("token");
|
||||
token = await config.get("npm-token");
|
||||
} catch (error) {
|
||||
switch (error.message) {
|
||||
case "wrong password":
|
||||
@@ -67,9 +75,7 @@ if (process.argv.length > 2) {
|
||||
let dirname = dirnames[i];
|
||||
|
||||
if (dirname === "ethers") {
|
||||
options.tag = "next";
|
||||
} else {
|
||||
options.tag = "latest";
|
||||
includeEthers = true;
|
||||
}
|
||||
|
||||
let info = loadPackage(dirname);
|
||||
@@ -89,4 +95,30 @@ if (process.argv.length > 2) {
|
||||
log(" <green:Done.>");
|
||||
}
|
||||
|
||||
// Publish the GitHub release
|
||||
const beta = false;
|
||||
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, gitCommit);
|
||||
log(`<bold:Published Release:> ${ link }`);
|
||||
}
|
||||
|
||||
/*
|
||||
{
|
||||
const accessKey = await config.get("aws-upload-scripts-accesskey");
|
||||
const secretKey = await config.get("aws-upload-scripts-secretkey");
|
||||
const s3 =
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
})();
|
||||
|
||||
100
admin/cmds/serve-docs.js
Normal file
100
admin/cmds/serve-docs.js
Normal file
@@ -0,0 +1,100 @@
|
||||
const fs = require("fs");
|
||||
const http = require("http");
|
||||
const path = require("path");
|
||||
|
||||
function getMime(filename) {
|
||||
const comps = filename.split('.');
|
||||
const ext = comps[comps.length - 1];
|
||||
switch (ext.toLowerCase()) {
|
||||
case 'css': return 'text/css';
|
||||
case 'doctree': return 'application/x-doctree';
|
||||
case 'eot': return 'application/vnd.ms-fontobject';
|
||||
case 'gif': return 'image/gif';
|
||||
case 'html': return 'text/html';
|
||||
case 'js': return 'application/javascript';
|
||||
case 'jpg': return 'image/jpeg';
|
||||
case 'jpeg': return 'image/jpeg';
|
||||
case 'md': return 'text/markdown';
|
||||
case 'pickle': return 'application/x-pickle';
|
||||
case 'png': return 'image/png';
|
||||
case 'svg': return 'image/svg+xml';
|
||||
case 'ttf': return 'application/x-font-ttf';
|
||||
case 'txt': return 'text/plain';
|
||||
case 'woff': return 'application/font-woff';
|
||||
}
|
||||
console.log('NO MIME', filename);
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function start(root, options) {
|
||||
if (root == null) { throw new Error("root required"); }
|
||||
if (options == null) { options = { }; }
|
||||
if (options.port == null) { options.port = 8000; }
|
||||
root = path.resolve(root);
|
||||
|
||||
const server = http.createServer((req, resp) => {
|
||||
|
||||
// Follow redirects in options
|
||||
if (options.redirects && options.redirects[req.url]) {
|
||||
resp.writeHead(301, { Location: options.redirects[req.url] });
|
||||
resp.end();
|
||||
return;
|
||||
}
|
||||
|
||||
let filename = path.resolve(root, "." + req.url);
|
||||
|
||||
// Make sure we aren't crawling out of our sandbox
|
||||
if (req.url[0] !== "/" || filename.substring(0, filename.length) !== filename) {
|
||||
resp.writeHead(403);
|
||||
resp.end();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const stat = fs.statSync(filename);
|
||||
if (stat.isDirectory()) {
|
||||
|
||||
// Redirect bare directory to its path (i.e. "/foo" => "/foo/")
|
||||
if (req.url[req.url.length - 1] !== "/") {
|
||||
resp.writeHead(301, { Location: req.url + "/" });
|
||||
resp.end();
|
||||
return;
|
||||
}
|
||||
|
||||
filename += "/index.html";
|
||||
}
|
||||
|
||||
const content = fs.readFileSync(filename);
|
||||
|
||||
resp.writeHead(200, {
|
||||
"Content-Length": content.length,
|
||||
"Content-Type": getMime(filename)
|
||||
});
|
||||
resp.end(content);
|
||||
return;
|
||||
|
||||
} catch (error) {
|
||||
if (error.code === "ENOENT") {
|
||||
resp.writeHead(404, { });
|
||||
resp.end();
|
||||
return;
|
||||
}
|
||||
|
||||
resp.writeHead(500, { });
|
||||
resp.end();
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
server.listen(options.port, () => {
|
||||
console.log(`Listening on port: ${ options.port }`);
|
||||
});
|
||||
|
||||
return server;
|
||||
}
|
||||
|
||||
start(path.resolve(__dirname, "../../docs"), {
|
||||
redirects: {
|
||||
"/": "/v5/"
|
||||
}
|
||||
});
|
||||
16
admin/cmds/set-config.js
Normal file
16
admin/cmds/set-config.js
Normal file
@@ -0,0 +1,16 @@
|
||||
"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);
|
||||
})();
|
||||
37
admin/cmds/set-option.js
Executable file
37
admin/cmds/set-option.js
Executable file
@@ -0,0 +1,37 @@
|
||||
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);
|
||||
});
|
||||
211
admin/cmds/spell-check.js
Normal file
211
admin/cmds/spell-check.js
Normal file
@@ -0,0 +1,211 @@
|
||||
"use strict";
|
||||
|
||||
const { resolve } = require("path");
|
||||
const fs = require("fs");
|
||||
|
||||
const Words = fs.readFileSync("/usr/share/dict/words").toString().split("\n").reduce((accum, word) => {
|
||||
accum[word.toLowerCase()] = true;
|
||||
return accum;
|
||||
}, { });
|
||||
|
||||
`
|
||||
// Words missing from the dictionary
|
||||
accessing addresses aligned autofill called cancelled changed censored
|
||||
compiled computed configured consumed creating decoded decoding
|
||||
decrypt decrypted decrypting deployed deploying deprecated detected
|
||||
discontinued earliest email enabled encoded encoding encrypt
|
||||
encrypted encrypting entries euro exceeded existing expected
|
||||
expired failed fetches formatted formatting funding generated
|
||||
has ignoring implemented implementer imported including instantiate
|
||||
keyword labelled larger lookup matches mined modified modifies multi
|
||||
named needed nested neutered numeric offline optimizer overriding owned packed
|
||||
padded parsed parsing passed placeholder processing properties reached
|
||||
recommended recovered redacted remaining replaced required
|
||||
serializes shared signed signing skipped stored supported tagging targetted
|
||||
transactions uninstall unstake unsubscribe using verifies website
|
||||
|
||||
// Overly Specific Words
|
||||
BIP BIP39 BIP44 crypto eip hashes hmac icap
|
||||
keccak namehash ripemd RLP scrypt secp sha
|
||||
|
||||
blockhash
|
||||
|
||||
bitcoin ethereum finney gwei kwei mwei satoshi szabo wei weth
|
||||
|
||||
crowdsale hexlify hd hdnode underpriced
|
||||
|
||||
boolean int struct tuple uint
|
||||
nonpayable
|
||||
jumpdest mstore shr shl xor
|
||||
|
||||
// Classes
|
||||
ABIEncoder testcase numberish Wordlist
|
||||
|
||||
// Common Code Strings
|
||||
abi addr api app arg arrayify asm basex bigint bignumber bn byte
|
||||
bytecode callback calldata checksum ciphertext cli codepoint config
|
||||
contenthash ctr ctrl debug dd dklen eexist encseed eof ethaddr
|
||||
ethseed ethers eval exec filename func gz hid http https hw iv
|
||||
info init ipc json kdf kdfparams labelhash lang lib mm multihash nfc
|
||||
nfkc nfd nfkd nodehash nullish oob opcode pbkdf pc plugin pragma pre prf
|
||||
repl rpc sighash topichash solc stdin stdout subclasses subnode
|
||||
timeout todo txt ufixed utc utf util url uuid vm vs websocket
|
||||
wikipedia wx xe yyyy zlib
|
||||
|
||||
// AbiV2
|
||||
abiv
|
||||
|
||||
// Query parameters
|
||||
apikey asc endblock startblock
|
||||
|
||||
alchemyapi Cloudflare Etherscan INFURA IPFS MetaMask Nodesmith
|
||||
Trezor ledgerhq axic bitcoinjs browserify easyseed ethereumjs
|
||||
goerli homestead kotti kovan mainnet morden mordor rinkeby
|
||||
ropsten testnet
|
||||
|
||||
// Demo words
|
||||
args foo eth foo foobar ll localhost passwd ricmoo tx xxx yna
|
||||
|
||||
// nameprep tags
|
||||
ALCat BiDi LCat nameprep
|
||||
|
||||
// Lanauge Codes (and short binary data)
|
||||
cn cz en es fr it ja tw zh zh_cn zh_tw
|
||||
OYAa IJBEJqXZJ
|
||||
|
||||
`.split("\n").filter((l) => (l.substring(0, 2) != "/\/")).join("\n").split(/\s+/g,).forEach((word) => {
|
||||
word = word.trim();
|
||||
if (word === "") { return; }
|
||||
Words[word.toLowerCase()] = true;
|
||||
});
|
||||
|
||||
const ts = require("typescript");
|
||||
|
||||
function getStrings(source) {
|
||||
const sourceFile = ts.createSourceFile("filename.ts", source);
|
||||
|
||||
const result = [ ];
|
||||
|
||||
function add(value, pos) {
|
||||
const lineNo = sourceFile.getLineAndCharacterOfPosition(pos).line + 1;
|
||||
result.push({ value, lineNo });
|
||||
}
|
||||
|
||||
let lastClass = null, lastEnum = null;
|
||||
function visit(node, depth) {
|
||||
switch (node.kind) {
|
||||
//case ts.SyntaxKind.TemplateExpression:
|
||||
// if (node.head) { visit(node.head); }
|
||||
// console.dir(node, { depth: null });
|
||||
// break;
|
||||
case ts.SyntaxKind.TemplateHead:
|
||||
case ts.SyntaxKind.TemplateMiddle:
|
||||
case ts.SyntaxKind.TemplateTail:
|
||||
case ts.SyntaxKind.StringLiteral:
|
||||
case ts.SyntaxKind.NoSubstitutionTemplateLiteral:
|
||||
add(node.text, node.pos);
|
||||
break;
|
||||
}
|
||||
|
||||
ts.forEachChild(node, (node) => { return visit(node, depth + 1); });
|
||||
}
|
||||
|
||||
visit(sourceFile, 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
const Include = new RegExp("packages/.*/src.ts/.*\.ts$");
|
||||
const Exclude = new RegExp("/node_modules/|src.ts/.*browser.*");
|
||||
|
||||
function getAllStrings(path) {
|
||||
const Root = resolve(__dirname, path);
|
||||
|
||||
const readdir = function(path) {
|
||||
if (path.match(Exclude)) { return [ ]; }
|
||||
|
||||
const stat = fs.statSync(path);
|
||||
if (stat.isDirectory()) {
|
||||
return fs.readdirSync(path).reduce((result, filename) => {
|
||||
readdir(resolve(path, filename)).forEach((file) => {
|
||||
result.push(file);
|
||||
});
|
||||
return result;
|
||||
}, [ ]);
|
||||
}
|
||||
|
||||
if (path.match(Include)) {
|
||||
const source = fs.readFileSync(path).toString();
|
||||
return [ { filename: path.substring(Root.length), values: getStrings(source) } ]
|
||||
}
|
||||
|
||||
return [ ];
|
||||
}
|
||||
|
||||
return readdir(Root);
|
||||
}
|
||||
|
||||
function checkWord(word) {
|
||||
word = word.toLowerCase();
|
||||
|
||||
// A word
|
||||
if (Words[word]) { return true; }
|
||||
|
||||
// Simple Plural
|
||||
if (word.match(/.*s$/) && Words[word.substring(0, word.length - 1)]) { return true; }
|
||||
|
||||
// Hex string
|
||||
if (word.match(/^(0x)?[0-9a-f]*$/i)) { return true; }
|
||||
}
|
||||
|
||||
function starts(text, prefix) {
|
||||
return (text.substring(0, prefix.length) === prefix);
|
||||
}
|
||||
|
||||
(async function() {
|
||||
let count = 0;
|
||||
getAllStrings(resolve(__dirname, "../../packages")).forEach((file) => {
|
||||
if (starts(file.filename, "/testcases/src.ts/generation-scripts")) { return; }
|
||||
if (starts(file.filename, "/asm/src.ts/opcodes.ts")) { return; }
|
||||
|
||||
file.values.forEach((entry) => {
|
||||
function problem(word) {
|
||||
count++;
|
||||
console.log({
|
||||
filename: file.filename,
|
||||
word: JSON.stringify(word),
|
||||
sentence: JSON.stringify(entry.value.substring(0, 80)),
|
||||
line: entry.lineNo
|
||||
});
|
||||
}
|
||||
|
||||
const value = entry.value.trim();
|
||||
|
||||
// Emptry space
|
||||
if (value === "") { return; }
|
||||
|
||||
// Prolly a require
|
||||
if (value.match(/^@ethersproject\/[a-z0-9-]+$/)) { return; }
|
||||
if (value.substring(0, 2) === "./") { return; }
|
||||
|
||||
// Prolly encoded binary data
|
||||
if (value.indexOf(" ") === -1 && value.length > 20) { return; }
|
||||
|
||||
if (checkWord(value)) { return; }
|
||||
|
||||
value.replace(/([a-z+])([A-Z])/g, (all, first, secondLetter) => {
|
||||
return first + " " + secondLetter;
|
||||
}).replace(/((?:0x)?[A-Za-z]+)/gi, (all, word) => {
|
||||
if (checkWord(word)) { return; }
|
||||
problem(word);
|
||||
return "";
|
||||
});;
|
||||
});
|
||||
});
|
||||
if (count) {
|
||||
console.log(`Found ${ count } typos.`);
|
||||
process.exit(1)
|
||||
}
|
||||
process.exit(0)
|
||||
})();
|
||||
|
||||
@@ -8,8 +8,18 @@ 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 {
|
||||
|
||||
@@ -60,7 +60,7 @@ if (process.argv.length > 2) {
|
||||
|
||||
// Bump the version if necessary
|
||||
if (info.version === npmInfo.version) {
|
||||
let newVersion = semver.inc(info.version, "prerelease", "beta");
|
||||
let newVersion = semver.inc(info.version, "patch");
|
||||
|
||||
// Write out the _version.ts
|
||||
if (!info._ethers_nobuild) {
|
||||
|
||||
180
admin/cmds/upload-docs.js
Normal file
180
admin/cmds/upload-docs.js
Normal file
@@ -0,0 +1,180 @@
|
||||
"use strict";
|
||||
|
||||
const crypto = require('crypto');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const AWS = require('aws-sdk');
|
||||
|
||||
const config = require("../config");
|
||||
|
||||
|
||||
const Bucket = "docs.ethers.io";
|
||||
|
||||
|
||||
function _getKeys(s3, result, nextToken, callback) {
|
||||
const params = {
|
||||
Bucket: Bucket,
|
||||
MaxKeys: 1000,
|
||||
ContinuationToken: nextToken,
|
||||
};
|
||||
s3.listObjectsV2(params, function(error, data) {
|
||||
if (error) {
|
||||
console.log(error);
|
||||
callback(error);
|
||||
return;
|
||||
}
|
||||
data.Contents.forEach(function(item) {
|
||||
result[item.Key] = item.ETag.replace(/"/g,'');
|
||||
});
|
||||
callback(null, data.IsTruncated ? data.NextContinuationToken: null);
|
||||
});
|
||||
}
|
||||
|
||||
function getKeys(s3) {
|
||||
const result = {};
|
||||
return new Promise(function(resolve, reject) {
|
||||
function handleBlock(error, nextToken) {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else if (nextToken) {
|
||||
nextBlock(nextToken);
|
||||
} else {
|
||||
resolve(result);
|
||||
}
|
||||
}
|
||||
function nextBlock(nextToken) {
|
||||
_getKeys(s3, result, nextToken, handleBlock);
|
||||
}
|
||||
nextBlock(undefined);
|
||||
});
|
||||
}
|
||||
|
||||
function getMime(filename) {
|
||||
const comps = filename.split('.');
|
||||
const ext = comps[comps.length - 1];
|
||||
switch (ext.toLowerCase()) {
|
||||
case 'css': return 'text/css';
|
||||
case 'doctree': return 'application/x-doctree';
|
||||
case 'eot': return 'application/vnd.ms-fontobject';
|
||||
case 'gif': return 'image/gif';
|
||||
case 'html': return 'text/html';
|
||||
case 'js': return 'application/javascript';
|
||||
case 'jpg': return 'image/jpeg';
|
||||
case 'jpeg': return 'image/jpeg';
|
||||
case 'md': return 'text/markdown';
|
||||
case 'pickle': return 'application/x-pickle';
|
||||
case 'png': return 'image/png';
|
||||
case 'svg': return 'image/svg+xml';
|
||||
case 'ttf': return 'application/x-font-ttf';
|
||||
case 'txt': return 'text/plain';
|
||||
case 'woff': return 'application/font-woff';
|
||||
}
|
||||
console.log('NO MIME', filename);
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function putObject(s3, name, content) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
s3.putObject({
|
||||
ACL: 'public-read',
|
||||
Body: content,
|
||||
Bucket: Bucket,
|
||||
ContentType: getMime(name),
|
||||
Key: name
|
||||
}, function(error, data) {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
console.log(" Done.")
|
||||
resolve({
|
||||
name: name,
|
||||
hash: data.ETag.replace(/"/g, '')
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function hash(filename) {
|
||||
const hasher = crypto.createHash('md5');
|
||||
hasher.update(fs.readFileSync(filename));
|
||||
return hasher.digest().toString('hex');
|
||||
}
|
||||
|
||||
function _getFiles(result, root) {
|
||||
fs.readdirSync(root).forEach(function(filename) {
|
||||
|
||||
// We don't need to upload junk
|
||||
if (filename === '.DS_Store') { return; }
|
||||
|
||||
const fullFilename = path.join(root, filename)
|
||||
const stat = fs.statSync(fullFilename);
|
||||
if (stat.isDirectory()) {
|
||||
_getFiles(result, fullFilename);
|
||||
} else {
|
||||
result[fullFilename] = hash(fullFilename);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getFiles(basedir) {
|
||||
// Make sure we have a trailing slash
|
||||
if (!basedir.match(/\/$/)) { basedir += "/"; }
|
||||
|
||||
// Fetch all the file hashes
|
||||
const hashes = { };
|
||||
_getFiles(hashes, basedir);
|
||||
|
||||
return Object.keys(hashes).reduce((accum, key) => {
|
||||
accum[key.substring(basedir.length)] = hashes[key];
|
||||
return accum;
|
||||
}, { });
|
||||
}
|
||||
|
||||
(async function() {
|
||||
const awsAccessId = await config.get("aws-upload-docs-accesskey");
|
||||
const awsSecretKey = await config.get("aws-upload-docs-secretkey");
|
||||
|
||||
const s3 = new AWS.S3({
|
||||
apiVersion: '2006-03-01',
|
||||
accessKeyId: awsAccessId,
|
||||
secretAccessKey: awsSecretKey
|
||||
});
|
||||
|
||||
const added = [], removed = [], changed = [], upload = [];
|
||||
|
||||
const basedir = path.resolve(__dirname, "../../docs");
|
||||
|
||||
const local = await getFiles(basedir);
|
||||
const remote = await getKeys(s3);
|
||||
|
||||
Object.keys(local).forEach((filename) => {
|
||||
if (!remote[filename]) {
|
||||
added.push(filename);
|
||||
upload.push(filename);
|
||||
} else if (remote[filename] != local[filename]) {
|
||||
changed.push(filename);
|
||||
upload.push(filename);
|
||||
}
|
||||
});
|
||||
|
||||
Object.keys(remote).forEach((filename) => {
|
||||
if (!local[filename]) {
|
||||
removed.push(filename);
|
||||
} else if (!local[filename] && remote[filename] != local[filename]) {
|
||||
changed.push(filename);
|
||||
upload.push(filename);
|
||||
}
|
||||
});
|
||||
|
||||
console.log('Added: ', added.length);
|
||||
console.log('Removed: ', removed.length);
|
||||
console.log('Changed: ', changed.length);
|
||||
|
||||
for (let i = 0; i < upload.length; i++) {
|
||||
const filename = upload[i];
|
||||
const content = fs.readFileSync(path.resolve(basedir, filename));
|
||||
console.log(`Uploading: ${ filename } (${ content.length } bytes)`);
|
||||
await putObject(s3, filename, content);
|
||||
}
|
||||
})();
|
||||
131
admin/config.js
131
admin/config.js
@@ -13,75 +13,108 @@ const computeHmac = require("../packages/sha2").computeHmac;
|
||||
|
||||
const colorify = require("./log").colorify;
|
||||
|
||||
function getConfigFilename() {
|
||||
return resolve(os.homedir(), ".ethers-dist");
|
||||
}
|
||||
|
||||
function getScrypt(message, password, salt) {
|
||||
let progressBar = prompt.getProgressBar(message);
|
||||
return new Promise((resolve, reject) => {
|
||||
scrypt(Buffer.from(password), Buffer.from(salt), (1 << 17), 8, 1, 64, (error, progress, key) => {
|
||||
if (error) { return reject(error); }
|
||||
progressBar(progress);
|
||||
if (key) { resolve(key); }
|
||||
});
|
||||
});
|
||||
return scrypt.scrypt(Buffer.from(password), Buffer.from(salt), (1 << 17), 8, 1, 64, progressBar);
|
||||
}
|
||||
|
||||
async function loadConfig(dkey) {
|
||||
let config = { };
|
||||
function Config(filename) {
|
||||
this.salt = null;
|
||||
this.dkey = null;
|
||||
this.values = { };
|
||||
this.canary = "";
|
||||
this.filename = filename;
|
||||
}
|
||||
|
||||
let filename = getConfigFilename();
|
||||
if (fs.existsSync(filename)) {
|
||||
let data = JSON.parse(fs.readFileSync(filename));
|
||||
let ciphertext = Buffer.from(data.ciphertext, "base64");
|
||||
let iv = Buffer.from(data.iv, "base64");
|
||||
let aes = new AES.ModeOfOperation.ctr(dkey.slice(0, 32), new AES.Counter(iv));
|
||||
let plaintext = aes.decrypt(ciphertext);
|
||||
let hmac = computeHmac("sha512", dkey.slice(32, 64), plaintext);
|
||||
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.canary = data.canary || "";
|
||||
|
||||
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");
|
||||
}
|
||||
config = JSON.parse(Buffer.from(plaintext).toString());
|
||||
|
||||
this.values = JSON.parse(Buffer.from(plaintext).toString());
|
||||
}
|
||||
};
|
||||
|
||||
return config;
|
||||
Config.prototype.keys = async function() {
|
||||
await this.load();
|
||||
return Object.keys(this.values);
|
||||
}
|
||||
|
||||
async function getConfig(key) {
|
||||
let password = await prompt.getPassword(colorify("Password (seesion-store): ", "bold"));
|
||||
let dkey = await getScrypt(colorify("Decrypting", "bold"), password, key);
|
||||
Config.prototype.save = function() {
|
||||
this.values._junk = Buffer.from(randomBytes(16 + parseInt(Math.random() * 48))).toString("base64")
|
||||
|
||||
let config = await loadConfig(dkey);
|
||||
return config[key];
|
||||
}
|
||||
const plaintext = Buffer.from(JSON.stringify(this.values));
|
||||
|
||||
async function setConfig(key, value) {
|
||||
let password = await prompt.getPassword(colorify("Password (seesion-store): ", "bold"));
|
||||
let dkey = await getScrypt("Encrypting", password, key);
|
||||
const iv = Buffer.from(randomBytes(16));
|
||||
const hmac = computeHmac("sha512", this.dkey.slice(32, 64), plaintext);
|
||||
|
||||
let config = await loadConfig(dkey);
|
||||
config[key] = value;
|
||||
config._junk = Buffer.from(randomBytes(16 + parseInt(Math.random() * 48))).toString("base64")
|
||||
const aes = new AES.ModeOfOperation.ctr(this.dkey.slice(0, 32), new AES.Counter(iv));
|
||||
const ciphertext = Buffer.from(aes.encrypt(plaintext));
|
||||
|
||||
let plaintext = Buffer.from(JSON.stringify(config));
|
||||
|
||||
let iv = Buffer.from(randomBytes(16));
|
||||
let hmac = computeHmac("sha512", dkey.slice(32, 64), plaintext);
|
||||
|
||||
let aes = new AES.ModeOfOperation.ctr(dkey.slice(0, 32), new AES.Counter(iv));
|
||||
let ciphertext = Buffer.from(aes.encrypt(plaintext));
|
||||
|
||||
let data = {
|
||||
const data = {
|
||||
ciphertext: ciphertext.toString("base64"),
|
||||
iv: iv.toString("base64"),
|
||||
hmac: hmac
|
||||
salt: this.salt,
|
||||
hmac: hmac,
|
||||
canary: this.canary
|
||||
};
|
||||
|
||||
fs.writeFileSync(getConfigFilename(), JSON.stringify(data, null, 2));
|
||||
fs.writeFileSync(this.filename, JSON.stringify(data, null, 2));
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
get: getConfig,
|
||||
set: setConfig
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
162
admin/github.js
Normal file
162
admin/github.js
Normal file
@@ -0,0 +1,162 @@
|
||||
"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,
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ async function runDiff(dirnames) {
|
||||
|
||||
// Bump the version if necessary
|
||||
if (info.version === npmInfo.version) {
|
||||
info.version = semver.inc(info.version, "prerelease", "beta");
|
||||
info.version = semver.inc(info.version, "patch");
|
||||
}
|
||||
|
||||
console.log(colorify("<bold:Package>: ") + info.name);
|
||||
@@ -176,7 +176,7 @@ async function runUpdate(dirnames) {
|
||||
|
||||
// Bump the version if necessary
|
||||
if (info.version === npmInfo.version) {
|
||||
let newVersion = semver.inc(info.version, "prerelease", "beta");
|
||||
let newVersion = semver.inc(info.version, "patch");
|
||||
|
||||
// Write out the _version.ts
|
||||
if (!info._ethers_skipPrepare) {
|
||||
|
||||
@@ -15,8 +15,20 @@ const keccak256 = (function() {
|
||||
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"), info);
|
||||
return saveJson(resolve(ROOT, dirname, "package.json"), sorted(info));
|
||||
}
|
||||
|
||||
async function createTarball(dirname) {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
const resolve = require("path").resolve;
|
||||
|
||||
const npm = require("libnpm");
|
||||
const npmpub = require("libnpmpublish");
|
||||
const semver = require("semver");
|
||||
|
||||
const local = require("./local");
|
||||
@@ -60,7 +60,7 @@ async function getTarballHash(name, version) {
|
||||
|
||||
async function _publish(info, tarball, options) {
|
||||
try {
|
||||
let result = await npm.publish(info, tarball, options);
|
||||
let result = await npmpub.publish(info, tarball, options);
|
||||
return result;
|
||||
} catch (error) {
|
||||
|
||||
|
||||
50
admin/test-parity/parity-dev.json
Normal file
50
admin/test-parity/parity-dev.json
Normal file
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"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
admin/test-parity/parity-dev.pwds
Normal file
1
admin/test-parity/parity-dev.pwds
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{"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":"{}"}
|
||||
@@ -25,7 +25,7 @@ function getDate(date) {
|
||||
|
||||
function getDateTime(date) {
|
||||
return getDate(date) + " " + [
|
||||
date.getHours(),
|
||||
zpad(date.getHours()) ,
|
||||
zpad(date.getMinutes() + 1)
|
||||
].join(":");
|
||||
}
|
||||
|
||||
1
docs.wrm/.gitignore
vendored
Normal file
1
docs.wrm/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
**.bak
|
||||
@@ -11,6 +11,13 @@ Building
|
||||
--------
|
||||
|
||||
```
|
||||
/home/ricmoo/ethers.js> npm run build-docs
|
||||
/home/ricmoo/ethers.js> npm run build-docs
|
||||
```
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
All documentation for ethers.js and Flatworm is released under the
|
||||
[Creative Commons Attribution 4.0 International License](https://choosealicense.com/licenses/cc-by-4.0/)
|
||||
license.
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
_title: Contracts
|
||||
|
||||
_null: Contract @<contract>
|
||||
_section: Contracts
|
||||
|
||||
Explain what contracts are...
|
||||
|
||||
_subsection: Buckets
|
||||
78
docs.wrm/api/contract/contract-factory.wrm
Normal file
78
docs.wrm/api/contract/contract-factory.wrm
Normal file
@@ -0,0 +1,78 @@
|
||||
_section: ContractFactory @<ContractFactory> @SRC<contracts:class.ContractFactory>
|
||||
|
||||
@TODO: Fill this in, including @SRC links
|
||||
|
||||
_subsection: Creating Instances @<ContractFactory--creating>
|
||||
|
||||
_property: new ethers.ContractFactory(interface, bydecode [ , signer ]) @SRC<contracts:constructor.ContractFactory>
|
||||
|
||||
_property: ContractFactory.fromSolidity(compilerOutput [ , signer ]) => [[ContractFactory]]
|
||||
|
||||
_property: contractFactory.connect(signer) => [[Contract]] @<ContractFactory-connect>
|
||||
|
||||
|
||||
_subsection: Properties @<ContractFactory--properties>
|
||||
|
||||
_property: contractFactory.interface => [[Interface]]
|
||||
|
||||
_property: contractFactory.bytecode => string<[[DataHexString]]>
|
||||
|
||||
_property: contractFactory.signer => [[Signer]]
|
||||
|
||||
|
||||
_subsection: Methods @<ContractFactory--methods>
|
||||
|
||||
_property: contractFactory.attach(address) => [[Contract]] @<ContractFactory-attach>
|
||||
|
||||
Return an instance of a [[Contract]] attched to //address//. This is the
|
||||
same as using the [Contract constructor](Contract--creating) with
|
||||
//address// and this the the //interface// and //signerOrProvider// passed
|
||||
in when creating the ContractFactory.
|
||||
|
||||
_property: contractFactory.getDeployTransaction(...args) => [[UnsignedTransaction]]
|
||||
|
||||
Returns the unsigned transaction which would deploy this Contract with //args// passed
|
||||
to the Contract's constructor.
|
||||
|
||||
_property: contractFactory.deploy(...args) => Promise<[[Contract]]> @<ContractFactory-deploy>
|
||||
|
||||
Uses the signer to deploy the Contract with //args// passed into the constructor and
|
||||
retruns 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.
|
||||
|
||||
_code: Deploying a Contract
|
||||
|
||||
// <hide>
|
||||
const signer = ethers.LocalSigner();
|
||||
const ContractFactory = ethers.ContractFactory;
|
||||
// </hide>
|
||||
|
||||
// If your contract constructor requires parameters, the ABI
|
||||
// must include the constructor
|
||||
const abi = [
|
||||
"constructor(address owner, uint256 initialValue)"
|
||||
];
|
||||
|
||||
const factory = new ContractFactory(abi, bytecode, signer)
|
||||
|
||||
const contract = await factory.deploy("ricmoo.eth", 42);
|
||||
|
||||
// The address is available immediately, but the contract
|
||||
// is NOT deployed yet
|
||||
contract.address
|
||||
//!
|
||||
|
||||
// The transaction that the signer sent to deploy
|
||||
contract.deployTransaction
|
||||
//!
|
||||
|
||||
// Wait until the transaction is mined
|
||||
contract.deployTransaction.wait()
|
||||
//!
|
||||
|
||||
// Now the contract is safe to interact with
|
||||
contract.value()
|
||||
//!
|
||||
185
docs.wrm/api/contract/contract.wrm
Normal file
185
docs.wrm/api/contract/contract.wrm
Normal file
@@ -0,0 +1,185 @@
|
||||
_section: Contract @<Contract> @SRC<contracts:class.Contract>
|
||||
|
||||
Explain contract here...
|
||||
|
||||
_subsection: Creating Instances @<Contract--creating>
|
||||
|
||||
_property: new ethers.Contract(address, abi, signerOrProvider) @src<contracts:constructor.Contract>
|
||||
|
||||
_property: contract.attach(addressOrName) => [[Contract]] @<Contract-attach> @SRC<contracts:Contract.attach>
|
||||
Returns a new instance of the **Contract** attached to a new
|
||||
address. This is useful if there are multiple similar or identical
|
||||
copies of a Contract on the network and you wish to interact with
|
||||
each of them.
|
||||
|
||||
_property: contract.connect(providerOrSigner) => [[Contract]] @<Contract-connect> @SRC<contracts:Contract.connect>
|
||||
Returns a new instance of the Contract, but connected to
|
||||
//providerOrSigner//.
|
||||
|
||||
By passing in a [[Provider]], this will return a downgraded
|
||||
**Contract** which only has read-only access (i.e. constant calls).
|
||||
|
||||
By passing in a [[Signer]]. this will return a **Contract** which
|
||||
will act on behalf of that signer.
|
||||
|
||||
|
||||
_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: Methods @<Contract--methods>
|
||||
|
||||
_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>
|
||||
Return the number of listeners that are subscribed to //event//. If
|
||||
no event is provided, returns the total count of all events.
|
||||
|
||||
_property: contract.listeners(event) => Array<Listener> @<Contract-listeners> @SRC<contracts:Contract.listeners>
|
||||
Return a list of listeners that are subscribed to //event//.
|
||||
|
||||
_property: contract.off(event, listener) => this @<Contract-off> @SRC<contracts>
|
||||
Unsubscribe //listener// to //event//.
|
||||
|
||||
_property: contract.on(event, listener) => this @<Contract-on> @SRC<contracts>
|
||||
Subscribe to //event// calling //listener// when the event occurs.
|
||||
|
||||
_property: contract.once(event, listener) => this @<Contract-once> @SRC<contracts>
|
||||
Subscribe once to //event// calling //listener// when the event
|
||||
occurs.
|
||||
|
||||
_property: contract.removeAllListeners([ event ]) => this @<Contract-removeAllListeners> @SRC<contracts:Contract.removeAllListeners>
|
||||
Unsubscribe all listeners for //event//. If no event is provided,
|
||||
all events are unsubscribed.
|
||||
|
||||
|
||||
_subsection: Meta-Class @<Contract--metaclass>
|
||||
|
||||
A Meta-Class is a Class which has any of its properties determined
|
||||
at run-time. The **Contract** object uses a Contract's ABI to
|
||||
determine what methods are available, so the following sections
|
||||
describe the generic ways to interact with the properties added
|
||||
at run-time during the **Contract** constructor.
|
||||
|
||||
|
||||
_heading: Read-Only Methods (constant) @<Contract--readonly>
|
||||
|
||||
A constant method is read-only and evaluates a small amount of EVM
|
||||
code against the current blockchain state and can be computed by
|
||||
asking a single node, which can return a result. It is therefore
|
||||
free and does not require any ether, but **cannot make changes** to
|
||||
the blockchain state..
|
||||
|
||||
_property: contract.METHOD_NAME(...args [, overrides ]) => Promise<any> @<Contract-functionsCall>
|
||||
The type of the result depends on the ABI.
|
||||
|
||||
For values that have a simple meaning in JavaScript, the types are fairly
|
||||
straight forward; strings and booleans are returned as JavaScript strings
|
||||
and booleans.
|
||||
|
||||
For numbers, if the **type** is in the 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.
|
||||
|
||||
For bytes (both fixed length and dynamic), a [[DataHexString]] is returned.
|
||||
|
||||
_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.
|
||||
|
||||
_heading: Write Methods (non-constant) @<Contract--write>
|
||||
|
||||
A non-constant method requires a transaction to be signed and requires
|
||||
payment in the form of a fee to be paid to a miner. This transaction
|
||||
will be verified by every node on the entire network as well by the
|
||||
miner who will compute the new state of the blockchain after executing
|
||||
it against the current state.
|
||||
|
||||
It cannot return a result. If a result is required, it should be logged
|
||||
using a Solidity event (or EVM log), which can then be queried from the
|
||||
transaction receipt.
|
||||
|
||||
_property: contract.METHOD_NAME(...args [ , overrides ]) => Promise<[[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.
|
||||
|
||||
|
||||
_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>
|
||||
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](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.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 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).
|
||||
|
||||
_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.
|
||||
|
||||
_property: contract.filters.EVENT_NAME(...args) => Filter
|
||||
Return a filter for //EVENT_NAME//, optionally filtering by additional
|
||||
constraints.
|
||||
|
||||
Only ``indexed`` event parameters may be filtered. If a parameter is
|
||||
null (or not provided) then any value in that field matches.
|
||||
186
docs.wrm/api/contract/example.wrm
Normal file
186
docs.wrm/api/contract/example.wrm
Normal file
@@ -0,0 +1,186 @@
|
||||
_section: Example: ERC-20 Contract
|
||||
|
||||
_subsection: Connecting to a Contract
|
||||
|
||||
_code: A simple ERC-20 contract @lang<javascript>
|
||||
|
||||
// A Human-Readable ABI; any supported ABI format could be used
|
||||
const abi = [
|
||||
// Read-Only Functions
|
||||
"function balanceOf(address owner) view returns (uint256)",
|
||||
"function decimals() view returns (uint8)",
|
||||
"function symbol() view returns (string)",
|
||||
|
||||
// Authenticated Functions
|
||||
"function transfer(address to, uint amount) returns (boolean)",
|
||||
|
||||
// Events
|
||||
"event Transfer(address indexed from, address indexed to, uint amount)"
|
||||
];
|
||||
|
||||
// This can be an address or an ENS name
|
||||
const address = "dai.tokens.ethers.eth";
|
||||
|
||||
// An example Provider
|
||||
const provider = ethers.getDefaultProvider();
|
||||
|
||||
// An example Signer
|
||||
const signer = ethers.Wallet.createRandom().connect(provider);
|
||||
|
||||
// Read-Only; By connecting to a Provider, allows:
|
||||
// - Any constant function
|
||||
// - Querying Filters
|
||||
// - Populating Unsigned Transactions for non-constant methods
|
||||
// - Estimating Gas for non-constant (as an anonymous sender)
|
||||
// - Static Calling non-constant methods (as anonymous sender)
|
||||
const erc20 = new ethers.Contract(address, abi, provider);
|
||||
|
||||
// Read-Write; By connecting to a Signer, allows:
|
||||
// - Everything from Read-Only (except as Signer, not anonymous)
|
||||
// - Sending transactions for non-constant functions
|
||||
const erc20_rw = new ethers.Contract(address, abi, signer)
|
||||
|
||||
|
||||
_heading: ERC20Contract @INHERIT<[[Contract]]>
|
||||
|
||||
_property: new ethers.Contract(address, abi, providerOrSigner)
|
||||
See the above code example for creating an Instance which will
|
||||
(in addition to the Contact methods and properties) automatically
|
||||
add the additional properties defined in //abi// to a **Contract**
|
||||
connected to //address// using the //providerOrSigner//.
|
||||
|
||||
|
||||
_subsection: Properties @NOTE<(inheritted from [[Contract]])>
|
||||
|
||||
_property: erc20.address => string<[[address]]>
|
||||
This is the address (or ENS name) the contract was constructed with.
|
||||
|
||||
_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 => [[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 => [[Interface]]
|
||||
This is the ABI as an [[Interface]].
|
||||
|
||||
_property: erc20.provider => [[Provider]]
|
||||
If a provider was provided to the constructor, this is that provider. If
|
||||
a signer was provided that had a [[Provider]], this is that provider.
|
||||
|
||||
_property: erc20.signer => [[Signer]]
|
||||
If a signer was provided to the constructor, this is that signer.
|
||||
|
||||
|
||||
_subsection: Methods @NOTE<(inheritted from [[Contract]])>
|
||||
|
||||
_property: erc20.attach(addressOrName) => [[Contract]]
|
||||
Returns a new instance of the **Contract** attached to a new
|
||||
address. This is useful if there are multiple similar or identical
|
||||
copies of a Contract on the network and you wish to interact with
|
||||
each of them.
|
||||
|
||||
_property: erc20.connect(providerOrSigner) => [[Contract]]
|
||||
Returns a new instance of the Contract, but connected to
|
||||
//providerOrSigner//.
|
||||
|
||||
By passing in a [[Provider]], this will return a downgraded
|
||||
**Contract** which only has read-only access (i.e. constant calls).
|
||||
|
||||
By passing in a [[Signer]]. this will return a **Contract** which
|
||||
will act on behalf of that signer.
|
||||
|
||||
_property: erc20.deployed() => Promise<Contract>
|
||||
|
||||
_property: Contract.isIndexed(value) => boolean
|
||||
|
||||
|
||||
_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//.
|
||||
|
||||
_property: erc20.listenerCount([ event ]) => number
|
||||
Return the number of listeners that are subscribed to //event//. If
|
||||
no event is provided, returns the total count of all events.
|
||||
|
||||
_property: erc20.listeners(event) => Array<Listener>
|
||||
Return a list of listeners that are subscribed to //event//.
|
||||
|
||||
_property: erc20.off(event, listener) => this
|
||||
Unsubscribe //listener// to //event//.
|
||||
|
||||
_property: erc20.on(event, listener) => this
|
||||
Subscribe to //event// calling //listener// when the event occurs.
|
||||
|
||||
_property: erc20.once(event, listener) => this
|
||||
Subscribe once to //event// calling //listener// when the event
|
||||
occurs.
|
||||
|
||||
_property: erc20.removeAllListeners([ event ]) => this
|
||||
Unsubscribe all listeners for //event//. If no event is provided,
|
||||
all events are unsubscribed.
|
||||
|
||||
|
||||
_subsection: Meta-Class Methods @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.decimals([ overrides ]) => Promise<number>
|
||||
Returns the number of decimal places used by this ERC-20 token. This can be
|
||||
used with [parseUnits](utils-parseUnits) when taking input from the user or
|
||||
[formatUnits](utils-formatunits] when displaying the token amounts in the UI.
|
||||
|
||||
_property: erc20.getBalance(owner [, overrides ]) => Promise<[[BigNumber]]>
|
||||
Returns the balance of //owner// for this ERC-20 token.
|
||||
|
||||
_property: erc20.symbol([ overrides ]) => Promise<string>
|
||||
Returns the symbol of the token.
|
||||
|
||||
_property: erc20_rw.transfer(target, amount [, overrides ]) => Promise<[[providers-TransactionResponse]]>
|
||||
Transfers //amount// tokens to //target// from the current signer.
|
||||
The return value (a boolean) is inaccessible during a write operation
|
||||
using a transaction. Other techniques (such as events) are required
|
||||
if this value is required. On-chain contracts calling the ``transfer``
|
||||
function have access to this result, which is why it is possible.
|
||||
|
||||
_property: erc20.callStatic.transfer(target, amount [, overrides ]) => Promise<boolean>
|
||||
Performs a dry-run of transferring //amount// tokens to //target// from
|
||||
the current signer, without actually signing or sending a transaction.
|
||||
|
||||
This can be used to preflight check that a transaction will be successful.
|
||||
|
||||
_property: erc20.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](UnsignedTransaction)>
|
||||
Returns an [[UnsignedTransaction]] which could be signed and submitted
|
||||
to the network to transaction //amount// tokens to //target//.
|
||||
|
||||
|
||||
_note: Note on Estimating and Static Calling
|
||||
|
||||
When you perform a static call, the current state is taken into account as
|
||||
best as Ethereum can determine. There are many cases where this can provide
|
||||
false positives and false negatives. The eventually consistent model of the
|
||||
blockchain also means there are certain consistency modes that cannot be
|
||||
known until an actual transaction is attempted.
|
||||
|
||||
|
||||
_subsection: Meta-Class Filters @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
|
||||
Returns a new Filter which can be used to [query](erc20-queryfilter) or
|
||||
to [subscribe/unsubscribe to events](erc20-events).
|
||||
|
||||
If //fromAddress// is null or not provided, then any from address matches.
|
||||
If //toAddress// is null or not provided, then any to address matches.
|
||||
14
docs.wrm/api/contract/index.wrm
Normal file
14
docs.wrm/api/contract/index.wrm
Normal file
@@ -0,0 +1,14 @@
|
||||
_section: Contract Interaction @<contracts>
|
||||
|
||||
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
|
||||
65
docs.wrm/api/experimental.wrm
Normal file
65
docs.wrm/api/experimental.wrm
Normal file
@@ -0,0 +1,65 @@
|
||||
_section: Experimental
|
||||
|
||||
The **Experimental** package is used for features that are not ready
|
||||
to be included in the base library. The API should not be considered
|
||||
stable and does not follow [[link-semver]] versioning, so applications
|
||||
requiring it should specify the //exact version// needed.
|
||||
|
||||
_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
|
||||
class is offered to ensure older systems which used brain wallets can
|
||||
still recover their funds and assets.
|
||||
|
||||
_property: BrainWallet.generate(username, password [ , progressCallback ]) => [[experimental-brainwallet]]
|
||||
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.
|
||||
|
||||
|
||||
_subsection: EIP1193Bridge @<experimental-eip1193bridge> @INHERIT<[[link-npm-events]]>
|
||||
|
||||
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]]>
|
||||
|
||||
The **NonceManager** is designed to manage the nonce for a Signer,
|
||||
automatically increasing it as it sends transactions.
|
||||
|
||||
Currently the NonceManager does not handle re-broadcast. If you attempt
|
||||
to send a lot of transactions to the network on a node that does not
|
||||
control that account, the transaction pool may drop your transactions.
|
||||
|
||||
In the future, it'd be nice if the **NonceManager** remembered transactions
|
||||
and watched for them on the network, rebroadcasting transactions that
|
||||
appear to have been dropped.
|
||||
|
||||
Another future feature will be some sort of failure mode. For example, often
|
||||
a transaction is dependent on another transaction being mined first.
|
||||
|
||||
_property: new NonceManager(signer)
|
||||
Create a new NonceManager.
|
||||
|
||||
_property: nonceManager.signer => [[Signer]]
|
||||
The signer whose nonce is being managed.
|
||||
|
||||
_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 class.
|
||||
|
||||
_property: nonceManager.increaseTransactionCount( [ count = 1 ]) => void
|
||||
Bump the current transaction count (nonce) by //count//.
|
||||
|
||||
This may be useful it interacting with the signer outside of using
|
||||
this class.
|
||||
@@ -1,11 +1,12 @@
|
||||
_title: Application Programming Interface
|
||||
_section: Application Programming Interface @<api> @NAV<API>
|
||||
|
||||
_section: Application Programming Interface (API)
|
||||
|
||||
Here...
|
||||
An Application Programming Interface (API) is the formal
|
||||
specification of the library.
|
||||
|
||||
_toc:
|
||||
contract
|
||||
signer
|
||||
providers
|
||||
utils
|
||||
other
|
||||
experimental
|
||||
|
||||
86
docs.wrm/api/other/assembly/api.wrm
Normal file
86
docs.wrm/api/other/assembly/api.wrm
Normal file
@@ -0,0 +1,86 @@
|
||||
_section: Utilities @<asm-utilities>
|
||||
|
||||
_subsection: Assembler
|
||||
|
||||
The assembler utilities allow parsing and assembling an
|
||||
[Ethers ASM Dialect](asm-dialect) source file.
|
||||
|
||||
_property: asm.parse(code) => [[asm-node]] @<asm-parse> @SRC<asm/assembler>
|
||||
Parse an ethers-format assembly file and return the [[asm-ast]].
|
||||
|
||||
_property: asm.assemble(node) => string<[[DataHexString]]> @SRC<asm/assembler:function.assemble>
|
||||
Performs assembly of the [[asm-ast]] //node// and return the
|
||||
resulting bytecode representation.
|
||||
|
||||
|
||||
_subsection: Disassembler
|
||||
|
||||
The **Disassembler** utilities make it easy to convert bytecode
|
||||
into an object which can easily be examined for program structure.
|
||||
|
||||
_property: asm.disassemble(bytecode) => [[asm-bytecode]] @SRC<asm/assembler>
|
||||
Returns an array of Operations given //bytecode//.
|
||||
|
||||
_property: asm.formatBytecode(operations) => string @SRC<asm/assembler>
|
||||
Create a formatted output of an array of [[asm-operation]].
|
||||
|
||||
_heading: Bytecode @<asm-bytecode> @INHERIT<Array\<[[asm-operation]]\>>
|
||||
|
||||
Each arary index represents an operation, collapsing multi-byte operations
|
||||
(i.e. ``PUSH``) into a single operation.
|
||||
|
||||
_property: bytecode.getOperation(offset) => [[asm-operation]]
|
||||
Get the operation at a given //offset// into the bytecode. This ensures that
|
||||
the byte at //offset// is an operation and not data contained within a ``PUSH``,
|
||||
in which case null it returned.
|
||||
|
||||
_heading: Operation @<asm-operation>
|
||||
|
||||
An **Operation** is a single command from a disassembled bytecode
|
||||
stream.
|
||||
|
||||
_property: operation.opcode => [[asm-opcode]]
|
||||
The opcode for this Operation.
|
||||
|
||||
_property: operation.offset => number
|
||||
The offset into the bytecode for this Operation.
|
||||
|
||||
_property: operation.pushValue => string<[[DataHexString]]>
|
||||
If the opcode is a ``PUSH``, this is the value of that push
|
||||
|
||||
|
||||
_subsection: Opcode @<asm-opcode> @SRC<asm/opcodes:class.Opcode>
|
||||
|
||||
_property: asm.Opcode.from(valueOrMnemonic) => [[asm-opcode]]
|
||||
Create a new instnace of an Opcode for a given numeric value
|
||||
(e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1").
|
||||
|
||||
_heading: Properties
|
||||
|
||||
_property: opcode.value => number
|
||||
The value (bytecode as a number) of this opcode.
|
||||
|
||||
_property: opcode.mnemonic => string
|
||||
The mnemonic string of this opcode.
|
||||
|
||||
_property: opcode.delta => number
|
||||
The number of items this opcode will consume from the stack.
|
||||
|
||||
_property: opcode.alpha => number
|
||||
The number of items this opcode will push onto the stack.
|
||||
|
||||
_property: opcode.doc => string
|
||||
A short description of what this opcode does.
|
||||
|
||||
_property: opcode.isMemory() => "read" | "write" | "full"
|
||||
Returns true if the opcode accesses memory.
|
||||
|
||||
_property: opcode.isStatic() => boolean
|
||||
Returns true if the opcode cannot change state.
|
||||
|
||||
_property: opcode.isJump() => boolean
|
||||
Returns true if the opcode is a jumper operation.
|
||||
|
||||
_property: opcode.isPush() => number
|
||||
Returns 0 if the opcode is not a ``PUSH*``, or the number
|
||||
of bytes this opcode will push if it is.
|
||||
150
docs.wrm/api/other/assembly/ast.wrm
Normal file
150
docs.wrm/api/other/assembly/ast.wrm
Normal file
@@ -0,0 +1,150 @@
|
||||
_section: Abstract Syntax Tree @<asm-ast>
|
||||
|
||||
Parsing a file using the [Ethers ASM Dialect](asm-dialect) will
|
||||
generate an Abstract Syntax Tree. The root node will always
|
||||
be a [[asm-scopenode]] whose name is ``_``.
|
||||
|
||||
To parse a file into an Abstract Syntax tree, use the [parse](asm-parse)
|
||||
function.
|
||||
|
||||
|
||||
_subsection: Types
|
||||
|
||||
_heading: Location @<asm-location>
|
||||
|
||||
_property: offset => number
|
||||
The offset into the source code to the start of this node.
|
||||
|
||||
_property: length => number
|
||||
The length of characters in the source code to the end of this node.
|
||||
|
||||
_property: source => string
|
||||
The source code of this node.
|
||||
|
||||
|
||||
_subsection: Nodes
|
||||
|
||||
@TODO: Place a diagram here showing the hierarchy
|
||||
|
||||
_heading: Node @<asm-node> @SRC<asm:class.Node>
|
||||
|
||||
_property: node.tag => string
|
||||
A unique tag for this node for the lifetime of the process.
|
||||
|
||||
_property: node.location => [[asm-location]]
|
||||
The source code and location within the source code that this
|
||||
node represents.
|
||||
|
||||
|
||||
_heading: ValueNode @<asm-valuenode> @INHERIT<[[asm-node]]> @SRC<asm:class.ValueNode>
|
||||
|
||||
A **ValueNode** is a node which may manipulate the stack.
|
||||
|
||||
|
||||
_heading: LiteralNode @<asm-literalnode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.LiteralNode>
|
||||
|
||||
_property: literalNode.value => string
|
||||
The literal value of this node, which may be a [[DataHexString]] or
|
||||
string of a decimal number.
|
||||
|
||||
_property: literalNode.verbatim => boolean
|
||||
This is true in a [[asm-datanode]] context, since in that case the
|
||||
value should be taken verbatim and no ``PUSH`` operation shoud be
|
||||
added, otherwise false.
|
||||
|
||||
|
||||
_heading: PopNode @<asm-popnode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.PopNode>
|
||||
|
||||
A **PopNode** is used to store a place-holder for an implicit pop from the
|
||||
stack. It represents the code for an implicit place-holder (i.e. ``$$``) or an
|
||||
explicit place-holder (e.g. ``$1``), which indicates the expect stack position
|
||||
to consume.
|
||||
|
||||
_property: literalNode.index => number
|
||||
|
||||
The index this **PopNode** is representing. For an implicit place-holder
|
||||
this is ``0``.
|
||||
|
||||
|
||||
_heading: LinkNode @<asm-linknode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.LinkNode>
|
||||
|
||||
A **LinkNode** represents a link to another [[asm-node]]'s data,
|
||||
for example ``$foo`` or ``#bar``.
|
||||
|
||||
_property: linkNode.label => string
|
||||
Te name of the target node.
|
||||
|
||||
_property: linkNode.type => "offset" | "length"
|
||||
Whether this node is for an offset or a length value of the
|
||||
target node.
|
||||
|
||||
|
||||
_heading: OpcodeNode @<asm-opcodenode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.OpcodeNode>
|
||||
|
||||
_property: opcodeNode.opcode => [[asm-opcode]]
|
||||
The opcode for this Node.
|
||||
|
||||
_property: opcodeNode.operands => Array<[[asm-valuenode]]>
|
||||
A list of all operands passed into this Node.
|
||||
|
||||
|
||||
_heading: EvaluationNode @<asm-evaluationnode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.EvaluationNode>
|
||||
|
||||
An **EvaluationNode** is used to execute code and insert the results
|
||||
but does not generate
|
||||
any output assembly, using the ``{{! code here }}`` syntax.
|
||||
|
||||
_property: literalNode.verbatim => boolean
|
||||
This is true in a [[asm-datanode]] context, since in that case the
|
||||
value should be taken verbatim and no ``PUSH`` operation shoud be
|
||||
added, otherwise false.
|
||||
|
||||
_property: evaluationNode.script => string
|
||||
The code to evaluate and produce the result to use as a literal.
|
||||
|
||||
|
||||
_heading: ExecutionNode @<asm-executionnode> @INHERIT<[[asm-node]]> @SRC<asm:class.ExecutionNode>
|
||||
|
||||
An **ExecutionNode** is used to execute code but does not generate
|
||||
any output assembly, using the ``{{! code here }}`` syntax.
|
||||
|
||||
_property: evaluationNode.script => string
|
||||
The code to execute. Any result is ignored.
|
||||
|
||||
|
||||
_heading: LabelledNode @<asm-labellednode> @INHERIT<[[asm-node]]> @SRC<asm:class.LabelledNode>
|
||||
|
||||
A **LabelledNode** is used for any Node that has a name, and can therefore
|
||||
be targetted by a [[asm-linknode]].
|
||||
|
||||
_property: labelledNode.name => string
|
||||
The name of this node.
|
||||
|
||||
|
||||
_heading: LabelNode @<asm-labelnode> @INHERIT<[[asm-labellednode]]> @SRC<asm:class.LabelNode>
|
||||
|
||||
A **LabelNode** is used as a place to ``JUMP`` to by referencing it
|
||||
name, using ``@myLabel:``. A ``JUMPDEST`` is automatically inserted
|
||||
at the bytecode offset.
|
||||
|
||||
|
||||
_heading: DataNode @<asm-datanode> @INHERIT<[[asm-labellednode]]> @SRC<asm:class.DataNode>
|
||||
|
||||
A **DataNode** allows for data to be inserted directly into the output
|
||||
assembly, using ``@myData[ ... ]``. The data is padded if needed to ensure
|
||||
values that would otherwise be regarded as a ``PUSH`` value does not impact
|
||||
anything past the data.
|
||||
|
||||
_property: dataNode.data => Array<[[asm-valuenode]]>
|
||||
The child nodes, which each represent a verbatim piece of data in insert.
|
||||
|
||||
_heading: ScopeNode @<asm-scopenode> @INHERIT<[[asm-labellednode]]> @SRC<asm:class.ScopeNode>
|
||||
|
||||
|
||||
A **ScopeNode** allows a new frame of reference that all [[asm-linknode]]'s
|
||||
will use when resolving offset locations, using ``@myScope{ ... }``.
|
||||
|
||||
_property: scopeNode.statements => Array<[[asm-node]]>
|
||||
The list of child nodes for this scope.
|
||||
|
||||
|
||||
115
docs.wrm/api/other/assembly/dialect.wrm
Normal file
115
docs.wrm/api/other/assembly/dialect.wrm
Normal file
@@ -0,0 +1,115 @@
|
||||
_section: Ethers ASM Dialect @<asm-dialect>
|
||||
|
||||
This provides a quick, high-level overcview of the **Ethers ASM Dialect**
|
||||
for EVM, which is defined by the [Ethers ASM Dialect Grammar](link-ethers-asm-grammar)
|
||||
|
||||
Once a program is compiled by a higher level langauge into ASM (assembly),
|
||||
or hand-coded directly in ASM, it needs to be assembled into bytecode.
|
||||
|
||||
The assembly process performs a very small set of operations and is
|
||||
intentionally simple and closely related to the underlying EVM bytecode.
|
||||
|
||||
Operations include embedding programs within programs (for example the
|
||||
deployment bootstrap has the runtime embedded in it) and computing the
|
||||
necessary offsets for jump operations.
|
||||
|
||||
The [Command-Line Assembler](cli-asm) can be used to assemble an
|
||||
//Ethers ASM Dialect// file or to disassemble bytecode into its
|
||||
human-readable (ish) opcodes and literals.
|
||||
|
||||
|
||||
_subsection: Opcodes @<asm-dialect-opcode>
|
||||
|
||||
An **Opcode** may be provided in either a //functional// or
|
||||
//instructional// syntax. For Opcodes that require parameters,
|
||||
the //functional// syntax is recommended and the //instructional//
|
||||
syntax will raise a warning.
|
||||
|
||||
@TODO: Examples
|
||||
|
||||
|
||||
_subsection: Labels @<asm-dialect-label>
|
||||
|
||||
A **Label** is a position in the program which can be jumped to. A
|
||||
``JUMPDEST`` is automatically added to this point in the assembled
|
||||
output.
|
||||
|
||||
@TODO: Exmaples
|
||||
|
||||
|
||||
_subsection: Literals @<asm-dialect-literal>
|
||||
|
||||
A **Literal** puts data on the stack when executed using a ``PUSH``
|
||||
operation.
|
||||
|
||||
A **Literal** can be provided using a [[DataHexString]] or a decimal
|
||||
byte value.
|
||||
|
||||
@TODO: exmples
|
||||
|
||||
|
||||
_subsection: Comments @<asm-dialect-comment>
|
||||
|
||||
To enter a comment in the **Ethers ASM Dialect**, any text following
|
||||
a semi-colon (i.e. ``;``) is ignored by the assembler.
|
||||
|
||||
|
||||
_subsection: Scopes @<asm-dialect-scope>
|
||||
|
||||
A common case in Ethereum is to have one program embedded in another.
|
||||
|
||||
The most common use of this is embedding a Contract **runtime bytecode**
|
||||
within a **deployment bytecode**, which can be used as **init code**.
|
||||
|
||||
When deploying a program to Ethereum, an **init transaction** is used. An
|
||||
//init transaction// has a null ``to`` address and contains bytecode in
|
||||
the ``data``. This ``data`` bytecode is a program, that when executed
|
||||
returns some other bytecode as a result, this restul is the bytecode
|
||||
to be installed.
|
||||
|
||||
Therefore it is important that embedded code uses jumps relative to itself,
|
||||
not the entire program it is embedded in, which also means that a jump
|
||||
can **only** target its own scope, no parent or child scopes. This is
|
||||
enforced by the assembler.
|
||||
|
||||
A scope may access the offset of any child [[asm-dialect-datasegment]] or
|
||||
child [[asm-dialect-scope]] (with respect to itself) and may access the length
|
||||
of any [[asm-dialect-datasegment]] or [[asm-dialect-scope]] anywhere in the program.
|
||||
|
||||
Every program in the **Ethers ASM Dialect** has a top-leve scope named ``_``.
|
||||
|
||||
|
||||
_subsection: Data Segment @<asm-dialect-datasegment>
|
||||
|
||||
A **Data Segment** allows arbitrary data to be embedded into a program,
|
||||
which can be useful for lookup tables or deploy-time constants.
|
||||
|
||||
An emtpty **Data Segment** can also be used when a labelled location is
|
||||
required, but without the ``JUMPDEST`` which a [[asm-dialect-label]] adds.
|
||||
|
||||
@TODO: Example
|
||||
|
||||
|
||||
_subsection: Links @<asm-dialect-links>
|
||||
|
||||
A **Link** allows access to a [[asm-dialect-scope]], [[asm-dialect-datasegment]] or [[asm-dialect-label]].
|
||||
|
||||
To access the byte offset of a labelled item, use ``$foobar``.
|
||||
|
||||
For a [[asm-dialect-label]], the target must be directly reachable within this scope. For
|
||||
a [[asm-dialect-datasegment]] or a [[asm-dialect-scope]], it can be inside the same scope or any
|
||||
child scope.
|
||||
|
||||
For a [[asm-dialect-datasegment]] or a [[asm-dialect-label]], there is an additional type of
|
||||
**Link**, which provides the length of the data or bytecode respectively. A
|
||||
**Length Link** is accessed by ``#foobar`` and is pushed on the stack as a
|
||||
literal.
|
||||
|
||||
|
||||
_subsection: Stack Placeholders @<asm-dialect-placeholder>
|
||||
|
||||
@TODO: exampl
|
||||
|
||||
|
||||
_subsection: Evaluation and Excution @<asm-dialect-scripting>
|
||||
|
||||
8
docs.wrm/api/other/assembly/index.wrm
Normal file
8
docs.wrm/api/other/assembly/index.wrm
Normal file
@@ -0,0 +1,8 @@
|
||||
_section: Assembly
|
||||
|
||||
This module should still be considered fairly experimental.
|
||||
|
||||
_toc:
|
||||
dialect
|
||||
api
|
||||
ast
|
||||
20
docs.wrm/api/other/hardware/index.wrm
Normal file
20
docs.wrm/api/other/hardware/index.wrm
Normal file
@@ -0,0 +1,20 @@
|
||||
_section: Hardware Wallets
|
||||
|
||||
|
||||
_subsection: LedgerSigner @<hw-ledger> @INHERIT<[[Signer]]> @SRC<hardware-wallets:class.LedgerSigner>
|
||||
|
||||
The [Ledger Hardware Wallets](link-ledger) are a fairly
|
||||
popular brand.
|
||||
|
||||
|
||||
_code: Importing in ES6 or TypeScript @lang<script>
|
||||
|
||||
import { LedgerSigner } from "@ethersproject/hardware-wallets";
|
||||
|
||||
|
||||
_heading: API
|
||||
|
||||
_property: new LedgerSigner([provider [, type [ , path ] ] ]) => [[hw-ledger]]
|
||||
Connects to a Ledger Hardware Wallet. The //type// if left unspecified is
|
||||
determined by the environment; in node the default is "hid" and in the browser
|
||||
"u2f" is the default. The default Ethereum path is used if //path// is left unspecified.
|
||||
9
docs.wrm/api/other/index.wrm
Normal file
9
docs.wrm/api/other/index.wrm
Normal file
@@ -0,0 +1,9 @@
|
||||
_section: Other Libraries
|
||||
|
||||
Now that ethers is more modular, it is possible to have additional
|
||||
ancillary packages, which are not part of the core but optionally
|
||||
add functionality only needed in certain situations.
|
||||
|
||||
_toc:
|
||||
assembly
|
||||
hardware
|
||||
@@ -1,6 +1,4 @@
|
||||
_title: API Providers
|
||||
|
||||
_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
|
||||
@@ -10,45 +8,211 @@ to run your own instance or cluster of Ethereum nodes.
|
||||
However, this reliance on third-party services can reduce
|
||||
resiliance, security and increase the amount of required trust.
|
||||
To mitigate these issues, it is recommended you use a
|
||||
[Default Provider](get-default-provider).
|
||||
[Default Provider](providers-getDefaultProvider).
|
||||
|
||||
|
||||
_subsection: EtherscanProvider
|
||||
_subsection: EtherscanProvider @<EtherscanProvider> @inherit<[[Provider]]> @src<providers:class.EtherscanProvider>
|
||||
|
||||
The **EtherscanProvider** is backed by a combination of the various
|
||||
[Etherscan APIs](https://etherscan.io/apis).
|
||||
[Etherscan APIs](link-etherscan-api).
|
||||
|
||||
_property: provider.getHistory(address) => Array<History>
|
||||
_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 **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.
|
||||
|
||||
|
||||
_subsection: InfuraProvider
|
||||
_definition: **Supported Networks**
|
||||
|
||||
The **InfuraProvider** is backed by the popular [INFURA](https://infura.io)
|
||||
- Homestead (Mainnet)
|
||||
- Ropsten (proof-of-work testnet)
|
||||
- Rinkeby (proof-of-authority testnet)
|
||||
- Görli (clique testnet)
|
||||
- Kovan (proof-of-authority testnet)
|
||||
|
||||
_code: Etherscan Examples @lang<javascript>
|
||||
|
||||
// <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.
|
||||
|
||||
It supports Mainnet (homestead) and all common testnets (Ropsten, Rinkeby,
|
||||
Görli and Kovan).
|
||||
_property: new ethers.providers.InfuraProvider([ network = "homestead", [ apiKey ] ]) @SRC<providers>
|
||||
Create a new **InfuraProvider** connected to //network// with
|
||||
the optional //apiKey//.
|
||||
|
||||
The //network// may be specified as **string** for a common
|
||||
network name, a **number** for a common chain ID or a
|
||||
[Network Object]provider-(network).
|
||||
|
||||
The //apiKey// can be a **string** Project ID or an **object**
|
||||
with the properties ``projectId`` and ``projectSecret`` to
|
||||
specify a [Project Secret](link-infura-secret) which can be used
|
||||
on non-public sources (like on a server) to further secure your
|
||||
API access and quotas.
|
||||
|
||||
_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 //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**
|
||||
|
||||
- Homestead (Mainnet)
|
||||
- Ropsten (proof-of-work testnet)
|
||||
- Rinkeby (proof-of-authority testnet)
|
||||
- Görli (clique testnet)
|
||||
- Kovan (proof-of-authority testnet)
|
||||
|
||||
_code: INFURA Examples @lang<javascript>
|
||||
|
||||
// <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._websocket.onopen = function(){
|
||||
provider._websocket.close();
|
||||
};
|
||||
// </hide>
|
||||
|
||||
|
||||
_subsection: NodesmithProvider
|
||||
_subsection: AlchemyProvider @<AlchemyProvider> @inherit<[[UrlJsonRpcProvider]]> @src<providers:class.AlchemyProvider>
|
||||
|
||||
The **NodesmithProvider** is backed by [Nodesmith](https://nodesmith.io).
|
||||
The **AlchemyProvider** is backed by [Alchemy](link-alchemy).
|
||||
|
||||
It supports Mainnet (homestead) and all common testnets (Ropsten, Rinkeby,
|
||||
Görli and Kovan), as well as the Ethereum-like network [Aion](https://aion.network).
|
||||
_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 **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);
|
||||
|
||||
|
||||
_subsection: AlchemyProvider
|
||||
_subsection: CloudflareProvider @<CloudflareProvider> @inherit<[[UrlJsonRpcProvider]]> @src<providers:class.CloudflareProvider>
|
||||
|
||||
The **AlchemtProvider** is backed by [Alchemy](https://alchemyapi.io).
|
||||
The CloudflareProvider is backed by the [Cloudflare Ethereum Gateway](link-cloudflare).
|
||||
|
||||
It supports Mainnet (homestead) and all common testnets (Ropsten, Rinkeby,
|
||||
Görli and Kovan).
|
||||
_property: new ethers.providers.CloudflareProvider()
|
||||
Create a new **CloudflareProvider** connected to mainnet (i.e. "homestead").
|
||||
|
||||
_definition: **Supported Networks**
|
||||
|
||||
_subsection: CloudfrontProvider
|
||||
- Homestead (Mainnet)
|
||||
|
||||
The CloudfrontProvider is backed by the
|
||||
[Cloudflare Ethereum Gateway](https://developers.cloudflare.com/distributed-web/ethereum-gateway/).
|
||||
_code: Cloudflare Examples @lang<javascript>
|
||||
|
||||
It only supports Mainnet (homestead).
|
||||
// <hide>
|
||||
const CloudflareProvider = ethers.providers.CloudflareProvider;
|
||||
// </hide>
|
||||
|
||||
// Connect to mainnet (homestead)
|
||||
provider = new CloudflareProvider();
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
// <hide>
|
||||
|
||||
const { ethers } = require("./packages/ethers");
|
||||
const provider = ethers.getDefaultProvider()
|
||||
|
||||
function _inspect(result) {
|
||||
if (ethers.BigNumber.isBigNumber(result)) {
|
||||
return `{ BigNumber: ${ JSON.stringify(result.toString()) } }`;
|
||||
}
|
||||
return JSON.stringify(result);
|
||||
}
|
||||
|
||||
// </hide>
|
||||
|
||||
// Get the balance for an account...
|
||||
provider.getBalance("ricmoo.firefly.eth");
|
||||
//!
|
||||
|
||||
// Get the code for a contract...
|
||||
provider.getCode("registrar.firefly.eth");
|
||||
//!
|
||||
|
||||
// Get the storage value at position 0...
|
||||
provider.getStorageAt("registrar.firefly.eth", 0)
|
||||
//!
|
||||
|
||||
// Get transaction count of an account...
|
||||
provider.getTransactionCount("ricmoo.firefly.eth");
|
||||
//!
|
||||
@@ -1,15 +0,0 @@
|
||||
// <hide>
|
||||
|
||||
const { ethers } = require("./packages/ethers");
|
||||
const provider = ethers.getDefaultProvider()
|
||||
|
||||
// </hide>
|
||||
|
||||
// Reverse lookup of an ENS by address...
|
||||
provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c");
|
||||
//!
|
||||
|
||||
// Lookup an address of an ENS name...
|
||||
provider.resolveName("ricmoo.firefly.eth");
|
||||
//!
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
_title: Providers
|
||||
|
||||
_section: Providers
|
||||
_section: Providers @<providers>
|
||||
|
||||
A **Provider** is an abstraction of a connection to the
|
||||
Ethereum network, providing a concise, consistent interface
|
||||
@@ -11,16 +9,16 @@ 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 be able to simply 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
|
||||
are returned, they are checked that they agree. Once a quorum
|
||||
@@ -31,11 +29,45 @@ 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**
|
||||
(i.e. mainnet) is used.
|
||||
|
||||
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 and Project Secret
|
||||
$Quorum: The number of backends that must agree
|
||||
//(default: 2 for mainnet, 1 for testnets)//
|
||||
|
||||
| **Property** | **Description** |
|
||||
| //alchemy// | $Alchemy |
|
||||
| //etherscan// | $Etherscan |
|
||||
| //infura// | $Infura |
|
||||
| //quorum// | $Quorum |
|
||||
|
||||
_note: Note: API Keys
|
||||
|
||||
It is highly recommended for production services that to acquire
|
||||
and specify an API Key for each sercice.
|
||||
|
||||
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: Provider Documentation
|
||||
|
||||
_toc:
|
||||
|
||||
@@ -1,22 +1,92 @@
|
||||
_title: JSON-RPC Provider
|
||||
_section: JsonRpcProvider @<JsonRpcProvider> @INHERIT<[[Provider]]> @SRC<providers:class.JsonRpcProvider>
|
||||
|
||||
_section: JSON-RPC Provider
|
||||
The [JSON-RPC API](link-jsonrpc) is a very popular method for interacting
|
||||
with Ethereum and is available in all major Ethereum node implementations
|
||||
(e.g. [[link-geth]] and [[link-parity]]) as well as many
|
||||
third-party web services (e.g. [[link-infura]])
|
||||
|
||||
Explain here...
|
||||
_property: new ethers.providers.JsonRpcProvider([ url [ , aNetworkish ] ]) @SRC<providers:constructor.JsonRpcProvider>
|
||||
Connect to a JSON-RPC API located at //url// using the //aNetworkish// network.
|
||||
If //url// is not specified, the default (i.e. ``http:/\/localhost:8545``) is used
|
||||
and if no network is specified, it will be determined automatically by
|
||||
querying the node.
|
||||
|
||||
_subsection: JsonRpcProvider @<jsonrpc-provider>
|
||||
_note: Note: Connecting to a Local Node
|
||||
Each node implementation is slightly different and may require specific
|
||||
command-line flags, configuration or settings in their UI to enable
|
||||
JSON-RPC, unlock accounts or expose specific APIs. Please consult
|
||||
their documentation.
|
||||
|
||||
TODO...
|
||||
|
||||
_property: provider.getSigner([ addressOrIndex ]) => [[jsonrpc-signer]]
|
||||
Returns a [[jsonrpc-signer]] 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: provider.getUncheckSigner([ addressOrIndex ]) => [[jsonrpc-uncheckedsigner]]
|
||||
_property: jsonRpcProvider.getUncheckedSigner([ addressOrIndex ]) => [[UncheckedJsonRpcSigner]] @<JsonRpcProvider-getUncheckedSigner> @SRC<providers/json-rpc-provider>
|
||||
|
||||
_subsection: JsonRpcSigner @<jsonrpc-signer>
|
||||
TODO... Explain
|
||||
_property: jsonRpcProvider.listAccounts() => Array<string> @<JsonRpcProvider-listAccounts> @SRC<providers/json-rpc-provider>
|
||||
Returns a list of all account addresses managed by this provider.
|
||||
|
||||
_subsection: JsonRpcUncheckedSigner @<jsonrpc-uncheckedsigner>
|
||||
TODO... Explain
|
||||
_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 @<JsonRpcSigner> @INHERIT<[[Signer]]> @SRC<providers:class.JsonRpcSigner>
|
||||
A **JsonRpcSigner** is a simple Signer which is backed by a connected
|
||||
[[JsonRpcProvider]].
|
||||
|
||||
_property: signer.provider => [[JsonRpcProvider]]
|
||||
The provider this signer was established from.
|
||||
|
||||
_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>\>> @<JsonRpcSigner-sendUncheckedTransaction> @SRC<providers>
|
||||
Sends the //transaction// and returns a Promise which resolves to the
|
||||
opaque transaction hash.
|
||||
|
||||
_property: signer.unlock(password) => Promise<boolean> @<JsonRpcSigner-unlock> @SRC<providers>
|
||||
Request the node unlock the account (if locked) using //password//.
|
||||
|
||||
|
||||
_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 [[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 [[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,27 +1,163 @@
|
||||
_title: Other Providers
|
||||
|
||||
_section: Other Providers
|
||||
|
||||
Others...
|
||||
|
||||
_subsection: FallbackProvider @<provider-fallback>
|
||||
_subsection: FallbackProvider @<FallbackProvider> @INHERIT<[[Provider]]> @SRC<providers/fallback-provider:class.FallbackProvider>
|
||||
|
||||
Explain...
|
||||
The **FallbackProvider** is the most advanced [[Provider]] available in
|
||||
ethers.
|
||||
|
||||
_heading: Properties
|
||||
It uses a quorum and connects to multiple [Providers](Provider) as backends,
|
||||
each configured with a //priority// and a //weight// .
|
||||
|
||||
_property: provider.providers => Array<[[provider]]>
|
||||
The list of Providers this is connected to.
|
||||
When a request is made, the request is dispatched to multiple backends, randomly
|
||||
choosen (higher prioirty backends are always selected first) and the results from
|
||||
each are compared against the others. Only once the quorum has been reached will that
|
||||
result be accepted and returned to the caller.
|
||||
|
||||
By default the quorum requires 50% (rounded up) of the backends to agree. The //weight//
|
||||
can be used to give a backend Provider more influence.
|
||||
|
||||
_property: new ethers.providers.FallbackProvider(providers [ , quorum ])
|
||||
Creates a new instance of a FallbackProvider connected to //providers//. If
|
||||
quorum is not specified, half of the total sum of the provider weights is
|
||||
used.
|
||||
|
||||
The //providers// can be either an array of [[Provider]] or [[FallbackProviderConfig]].
|
||||
If a [[Provider]] is provided, the defaults are a priority of 1 and a weight of 1.
|
||||
|
||||
_property: provider.providerConfigs => Array<[[FallbackProviderConfig]]>
|
||||
The list of Provider Configurations that describe the backends.
|
||||
|
||||
_property: provider.quorum => number
|
||||
The quorum the backend responses must agree upon before a result will be
|
||||
resolved. By default this is //half the sum of the weights//.
|
||||
|
||||
_property: provider.weights => Array<number>
|
||||
The weight each of the Providers adds to a results acceptance.
|
||||
|
||||
_heading: FallbackProviderConfig @<FallbackProviderConfig>
|
||||
|
||||
_property: fallbackProviderConfig.provider => [[Provider]]
|
||||
The provider for this configuration.
|
||||
|
||||
_property: fallbackProviderConfig.priority => number
|
||||
The priority used for the provider. Higher priorities are favoured over lower
|
||||
priorities. If multiple providers share the same prioirty, they are choosen
|
||||
at random.
|
||||
|
||||
_property: fallbackProviderConfig.stallTimeout => number
|
||||
The timeout (in ms) after which another [[Provider]] will be attempted. This
|
||||
does not affect the current Provider; if it returns a result it is counted
|
||||
as part of the quorum.
|
||||
|
||||
Lower values will result in more network traffic, but may reduce the response
|
||||
time of requests.
|
||||
|
||||
_property: fallbackProviderConfig.weight => number
|
||||
The weight a response from this provider provides. This can be used if a given
|
||||
[[Provider]] is more trusted, for example.
|
||||
|
||||
|
||||
_subsection: IpcProvider @<provider-ipc>
|
||||
_subsection: IpcProvider @<IpcProvider> @INHERIT<[[JsonRpcProvider]]> @SRC<providers:class.IpcProvider>
|
||||
|
||||
Explain...
|
||||
The **IpcProvider** allows the JSON-RPC API to be used over a local
|
||||
filename on the file system, exposed by Geth, Parity and other nodes.
|
||||
|
||||
This is only available in //node.js// (as it requires file system access,
|
||||
and may have additional complications due to file permissions. See any
|
||||
related notes on the documentation for the actual node implementation websites.
|
||||
|
||||
_property: ipcProvider.path => string
|
||||
The path this [[Provider]] is connected to.
|
||||
|
||||
|
||||
_subsection: UrlJsonRpcProvider @<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 [[JsonRpcProvider]]
|
||||
would suffice, with a little extra effort needed to generate the JSON-RPC
|
||||
URL.
|
||||
|
||||
_property: new ethers.providers.UrlJsonRpcProvider([ network [ , apiKey ] ])
|
||||
Sub-classes do not need to override this. Instead they should override the
|
||||
static method ``getUrl`` and optionally ``getApiKey``.
|
||||
|
||||
_property: urlJsonRpcProvider.apiKey => any
|
||||
The value of the apiKey that was returned from ``InheritedClass.getApiKey``.
|
||||
|
||||
_property: InheritingClass.getApiKey(apiKey) => any
|
||||
This function should examine the //apiKey// to ensure it is valid and
|
||||
return a (possible modified) value to use in ``getUrl``.
|
||||
|
||||
_property: InheritingClass.getUrl(network, apiKey) => string
|
||||
The URL to use for the JsonRpcProvider instance.
|
||||
|
||||
|
||||
|
||||
_subsection: Web3Provider @<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]]
|
||||
which can then be used with the rest of the library.
|
||||
|
||||
This may also be used to wrap a standard [EIP-1193 Provider](link-eip-1193].
|
||||
|
||||
_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 resourses, 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.provider.WebSockerProvider([ 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,92 +1,154 @@
|
||||
_title: Abstract Provider
|
||||
|
||||
|
||||
_section: Provider @<provider>
|
||||
_section: Provider @<Provider>
|
||||
|
||||
Explain what a provider is...
|
||||
|
||||
|
||||
_subsection: Accounts Methods
|
||||
_subsection: Accounts Methods @<Provider--account-methods>
|
||||
|
||||
_property: provider.getBalance(address [ , blockTag = "latest" ]) => Promise<[[bignumber]]>
|
||||
_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<[[hexstring]]>
|
||||
_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(address, position [ , blockTag = "latest" ]) => Promise<[[hexstring]]>
|
||||
Returns the ``Bytes32`` value of the //position// at //address//, as of the //blockTag//.
|
||||
_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>
|
||||
_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: Account Examples @lang<javascript>
|
||||
|
||||
_code: example-account.js
|
||||
// Get the balance for an account...
|
||||
provider.getBalance("ricmoo.firefly.eth");
|
||||
//!
|
||||
|
||||
// Get the code for a contract...
|
||||
provider.getCode("registrar.firefly.eth");
|
||||
//!
|
||||
|
||||
// Get the storage value at position 0...
|
||||
provider.getStorageAt("registrar.firefly.eth", 0)
|
||||
//!
|
||||
|
||||
// Get transaction count of an account...
|
||||
provider.getTransactionCount("ricmoo.firefly.eth");
|
||||
//!
|
||||
|
||||
|
||||
_subsection: Blocks Methods
|
||||
_subsection: Blocks Methods @<Provider--block-methods>
|
||||
|
||||
_property: provider.getBlock(block) => Promise<[[provider-block]]>
|
||||
_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]]>
|
||||
_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>
|
||||
_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.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.resovleName(name) => Promise<string>
|
||||
_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: ENS Examples @lang<javascript>
|
||||
|
||||
_code: example-ens.js
|
||||
// Reverse lookup of an ENS by address...
|
||||
provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c");
|
||||
//!
|
||||
|
||||
_subsection: Logs Methods
|
||||
// Lookup an address of an ENS name...
|
||||
provider.resolveName("ricmoo.firefly.eth");
|
||||
//!
|
||||
|
||||
_property: provider.getLogs(filter) => Promise<Array<[[provider-log]]>>
|
||||
Returns the Array of [[provider-log]] matching the //filter//.
|
||||
|
||||
_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]]>
|
||||
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>
|
||||
_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]]>
|
||||
_property: provider.getGasPrice() => Promise<[[BigNumber]]> @<Provider-getGasPrice> @SRC<providers/base-provider>
|
||||
Returns a //best guess// of the [[gas-price]] to use in a transaction.
|
||||
|
||||
_code: Network Status Examples @lang<javascript>
|
||||
|
||||
_subsection: Transactions Methods
|
||||
// The network information
|
||||
provider.getNetwork()
|
||||
// <hide>
|
||||
//!
|
||||
network = utils.shallowCopy(_)
|
||||
delete network._defaultProvider
|
||||
network
|
||||
// </hide>
|
||||
//!
|
||||
|
||||
_property: provider.call(transaction [ , blockTag = "latest" ]) => Promise<[[hexstring]]>
|
||||
Returns the result of executing the //transaction//, using //call//. A call
|
||||
// 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.
|
||||
|
||||
_property: provider.estimateGas(transaction) => Promise<[[bignumber]]>
|
||||
_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.
|
||||
|
||||
@@ -94,48 +156,171 @@ 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]]>
|
||||
_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(transactionHash) => Promise<[[provider-transactionreceipt]]>
|
||||
_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.
|
||||
|
||||
|
||||
_subsection: Event Emitter Methods
|
||||
_subsection: Event Emitter Methods @<Provider--event-methods>
|
||||
|
||||
Explain events here...
|
||||
|
||||
_property: provider.on(eventName, listener) => this
|
||||
_property: provider.on(eventName, listener) => this @<Provider-on> @SRC<providers/base-provider>
|
||||
Add a //listener// to be triggered for each //eventName//.
|
||||
|
||||
_property: provider.once(eventName, listener) => this
|
||||
_property: provider.once(eventName, listener) => this @<Provider-once> @SRC<providers/base-provider>
|
||||
Add a //listener// to be triggered for only the next //eventName//,
|
||||
at which time it be removed.
|
||||
|
||||
_property: provider.emit(eventName, ...args) => boolean
|
||||
_property: provider.emit(eventName, ...args) => boolean @<Provider-emit> @SRC<providers/base-provider>
|
||||
Notify all listeners of //eventName//, passing //args// to each listener. This
|
||||
is generally only used internally.
|
||||
|
||||
_property: provider.off(eventName [ , listener ]) => this
|
||||
_property: provider.off(eventName [ , listener ]) => this @<Provider-off> @SRC<providers/base-provider>
|
||||
Remove a //listener// for //eventName//. If no //listener// is provided,
|
||||
all listeners for //eventName// are removed.
|
||||
|
||||
_property: provider.removeAllListeners([ eventName ]) => this
|
||||
_property: provider.removeAllListeners([ eventName ]) => this @<Provider-removeAllListeners> @SRC<providers/base-provider>
|
||||
Remove all the listeners for //eventName//. If no //eventName// is provided,
|
||||
**all** events are removed.
|
||||
|
||||
_property: provider.listenerCount([ eventName ]) => number
|
||||
_property: provider.listenerCount([ eventName ]) => number @<Provider-listenerCount> @SRC<providers/base-provider>
|
||||
Returns the number of listeners for //eventName//. If no //eventName// is
|
||||
provided, the total number of listeners is returned.
|
||||
|
||||
_property: provider.listeners(eventName) => Array<Listener>
|
||||
_property: provider.listeners(eventName) => Array<Listener> @<Provider-listeners> @SRC<providers/base-provider>
|
||||
Returns the list of Listeners for //eventName//.
|
||||
|
||||
|
||||
_subsection: Inspection Methods
|
||||
_heading: Events @<Provider--events>
|
||||
|
||||
_property: Provider.isProvider(object) => boolean
|
||||
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 events for more information on how to specify topic-sets.
|
||||
|
||||
_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).
|
||||
|
||||
_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,75 +1,301 @@
|
||||
_title: Types
|
||||
|
||||
_section: Types
|
||||
|
||||
_heading: BlockTag @<provider-blocktag>
|
||||
_subsection: BlockTag @<providers-BlockTag>
|
||||
A **BlockTag** specifies a specific location in the Blockchain.
|
||||
|
||||
- **``"latest"``** -- The most recently mined block
|
||||
- **``"earliest"``** -- Block #0
|
||||
- **``"pending"``** -- The block currently being prepared for mining; not all
|
||||
operations support this BlockTag
|
||||
operations and backends support this BlockTag
|
||||
- **//number//** -- The block at this height
|
||||
- **//a negative number//** -- The block this many blocks ago
|
||||
|
||||
_heading: Network @<provider-network>
|
||||
_heading: EventType @<providers-EventType>
|
||||
|
||||
And **EventType** can be any of the following.
|
||||
|
||||
- **//string//** -- TODO...
|
||||
- **//Array<string<[[DataHexString]]<32>> | Array<string<[[DataHexString]]<32>>>>//** -- TODO...
|
||||
- **//[[providers-EventFilter]]//** -- TODO...
|
||||
|
||||
|
||||
_subsection: Network @<providers-Network>
|
||||
A **Network** represents an Etherem network.
|
||||
|
||||
- **name** -- The human-readable name of the network
|
||||
- **chainId** -- The Chain ID of the network
|
||||
- **ensAddress** -- The address at which the ENS registry is deployed
|
||||
_property: network.name => string
|
||||
The human-readable name of the network, such as ``homestead``. If the network
|
||||
name is unknown, this will be ``"unknown"``.
|
||||
|
||||
_property: network.chainId => number
|
||||
The Chain ID of the network.
|
||||
|
||||
_property: network.ensAddress => string<[[address]]>
|
||||
The address at which the ENS registry is deployed on this network.
|
||||
|
||||
|
||||
_subsection: Blocks
|
||||
_subsection: Block @<providers-Block>
|
||||
|
||||
_heading: Block @<provider-block>
|
||||
TODO
|
||||
_property: block.hash => string<[[DataHexString]]<32>>
|
||||
The hash of this block.
|
||||
|
||||
_heading: BlockWithTransactions @<provider-blocktxs>
|
||||
TODO
|
||||
_property: block.parentHash => string<[[DataHexString]]<32>>
|
||||
The hash of the previous block.
|
||||
|
||||
_property: block.number => number
|
||||
The height (number) of this block.
|
||||
|
||||
_property: block.timestamp => number
|
||||
The timestamp of this block.
|
||||
|
||||
_property: block.nonce => string<[[DataHexString]]>
|
||||
The nonce used as part of the proof-of-work to mine this block.
|
||||
|
||||
This property is generally of little interest developers.
|
||||
|
||||
_property: block.difficulty => number
|
||||
The difficulty target required to be met by the miner of the block.
|
||||
|
||||
This property is generally of little interest developers.
|
||||
|
||||
_property: block.gasLimit => [[BigNumber]]
|
||||
The maximum amount of gas that this block was permitted to use. This
|
||||
is a value that can be voted up or voted down by miners and is used
|
||||
to automatically adjust the bandwidth requirements of the network.
|
||||
|
||||
This property is generally of little interest developers.
|
||||
|
||||
_property: block.gasUsed => [[BigNumber]]
|
||||
The total amount of gas used by all transactions in this block.
|
||||
|
||||
_property: block.miner => string
|
||||
The coinbase address of this block, which indicates the address the
|
||||
miner that mined this block would like the subsidy reward to go to.
|
||||
|
||||
_property: block.extraData => string
|
||||
This is extra data a miner may choose to include when mining a block.
|
||||
|
||||
This property is generally of little interest developers.
|
||||
|
||||
_heading: Block (with transaction hashes)
|
||||
|
||||
Often only the hashes of the transactions included in a block are needed,
|
||||
so by default a block only contains this information, as it is
|
||||
substantially less data.
|
||||
|
||||
_property: block.transactions => Array<string<[[DataHexString]]<32>>>
|
||||
A list of the transactions hashes for each transaction this block
|
||||
includes.
|
||||
|
||||
_heading: BlockWithTransactions @<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<[[providers-TransactionResponse]]>
|
||||
A list of the transactions this block includes.
|
||||
|
||||
|
||||
_subsection: Events and Logs
|
||||
|
||||
_heading: EventFilter
|
||||
TODO
|
||||
_heading: EventFilter @<providers-EventFilter>
|
||||
|
||||
_heading: EventType
|
||||
TODO
|
||||
_property: filter.address => string<[[address]]>
|
||||
The address to filter by, or ``null`` to match any address.
|
||||
|
||||
_heading: Filter
|
||||
TODO
|
||||
_property: filter.topics => Array<string<[[DataHexString]]<32>> | Array<string<[[DataHexString]]<32>>>>
|
||||
The topics to filter by, or ``null`` to match any topics. Each entry represents an
|
||||
**AND** condition that must match, or may be ``null`` to match anything. If a given
|
||||
entry is an Array, then that entry is treated as an **OR** for any value in the entry.
|
||||
|
||||
_heading: FilterByBlockHash
|
||||
TODO
|
||||
_heading: Filter @<providers-Filter> @INHERIT<[[providers-EventFilter]]>
|
||||
|
||||
_heading: Log @<provider-log>
|
||||
A network...
|
||||
_property: filter.fromBlock => [[providers-BlockTag]]
|
||||
The starting block (inclusive) to search for logs matching the filter criteria.
|
||||
|
||||
_property: filter.toBlock => [[providers-BlockTag]]
|
||||
The end block (inclusive) to search for logs matching the filter criteria.
|
||||
|
||||
_heading: FilterByBlockHash @<providers-FilterByBlockHash> @INHERIT<[[providers-EventFilter]]>
|
||||
|
||||
_property: filter.blockHash => string<[[DataHexString]]<32>>
|
||||
The specific block (by its block hash) to search for logs matching the filter criteria.
|
||||
|
||||
|
||||
_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>>
|
||||
The block hash of the block including the transaction of this log.
|
||||
|
||||
_property: log.removed => boolean
|
||||
During a re-org, if a transaction is orphaned, this will be set to true
|
||||
to indicate the Log entry has been removed; it will likely be emitted
|
||||
again in the near future when another block is mined with the transaction
|
||||
that triggered this log, but keep in mind the values may change.
|
||||
|
||||
_property: log.transactionLogIndex => number
|
||||
The index of this log in the transaction.
|
||||
|
||||
_property: log.address => string<[[address]]>
|
||||
The address of the contract that generated this log.
|
||||
|
||||
_property: log.data => string<[[DataHexString]]>
|
||||
The data included in this log.
|
||||
|
||||
_property: log.topics => Array<string<[[DataHexString]]<32> > >
|
||||
The list of topics (indexed properties) for this log.
|
||||
|
||||
_property: log.transactionHash => string<[[DataHexString]]<32>>
|
||||
The transaction hash of the transaction of this log.
|
||||
|
||||
_property: log.transactionIndex => number
|
||||
The index of the transaction in the block of the transaction of this log.
|
||||
|
||||
_property: log.logIndex => number
|
||||
The index of this log across all logs in the entire **block**.
|
||||
|
||||
|
||||
_subsection: Transactions
|
||||
|
||||
_heading: TransactionRequest @<provider-transactionrequest>
|
||||
_heading: TransactionRequest @<providers-TransactionRequest>
|
||||
|
||||
A transaction request describes a transaction that is to
|
||||
be sent to the network or otherwise processed.
|
||||
|
||||
It contains the fields:
|
||||
- **to** --- target address
|
||||
- **from** --- target address
|
||||
- **nonce** --- target address
|
||||
- **gasLimit** --- target address
|
||||
- **gasPrice** --- target address
|
||||
- **data** --- target address
|
||||
- **value** --- target address
|
||||
- **chainId** --- target address
|
||||
|
||||
All fields are optional and may be a promise which resolves
|
||||
to the required type.
|
||||
|
||||
_heading: TransactionResponse @<provider-transactionresponse>
|
||||
_property: transactionRequest.to => string | Promise<string>
|
||||
The address (or ENS name) this transaction it to.
|
||||
|
||||
A **TransactionResponse** ..
|
||||
_property: transactionRequest.from => string<[[address]]> | Promise<string<[[address]]>>
|
||||
The address this transaction is from.
|
||||
|
||||
_heading: TransactionReceipt @<provider-transactionreceipt>
|
||||
TODO
|
||||
_property: transactionRequest.nonce => number | Promise<number>
|
||||
The nonce for this transaction. This should be set to the number of
|
||||
transactions ever sent **from** this address.
|
||||
|
||||
_property: transactionRequest.gasLimit => [[BigNumber]] | Promise<[[BigNumber]]>
|
||||
The maximum amount of gas this transaction is permitted to use.
|
||||
|
||||
_property: transactionRequest.gasPrice => [[BigNumber]] | Promise<[[BigNumber]]>
|
||||
The price (in wei) per unit of gas this transaction will pay.
|
||||
|
||||
_property: transactionRequest.data => [[DataHexString]] | Promise<[[DataHexString]]>
|
||||
The transaction data.
|
||||
|
||||
_property: transactionRequest.value => [[BigNumber]] | Promise<[[BigNumber]]>
|
||||
The amount (in wei) this transaction is sending.
|
||||
|
||||
_property: transactionRequest.chainId => number | Promise<number>
|
||||
The chain ID this transaction is authorized on, as specified by
|
||||
[EIP-155](link-eip-155).
|
||||
|
||||
If the chain ID is 0 will disable EIP-155 and the transaction will be valid
|
||||
on any network. This can be **dangerous** and care should be taken, since it
|
||||
allows transactions to be replayed on networks that were possibly not
|
||||
intended.
|
||||
|
||||
_heading: TransactionResponse @<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>>
|
||||
The hash of the block this transaction was mined in. If the block has not been mined,
|
||||
this is ``null``.
|
||||
|
||||
_property: transaction.timestamp => number
|
||||
The timestamp of the block this transaction was mined in. If the block has not been mined,
|
||||
this is ``null``.
|
||||
|
||||
_property: transaction.confirmations => number
|
||||
The number of blocks that have been mined (including the initial block) since this
|
||||
transaction was mined.
|
||||
|
||||
_property: transaction.raw => string<[[DataHexString]]>
|
||||
The serialized transaction.
|
||||
|
||||
_property: transaction.wait([ confirmations = 1 ]) => Promise<[[providers-TransactionReceipt]]>
|
||||
Wait for //confirmations//. If 0, and the transaction has not been mined,
|
||||
``null`` is returned.
|
||||
|
||||
_heading: TransactionReceipt @<providers-TransactionReceipt>
|
||||
|
||||
_property: receipt.to => string<[[address]]>
|
||||
The address this transaction is to. This is ``null`` if the the
|
||||
transaction was an **init transaction**, used to deploy a contract.
|
||||
|
||||
_property: receipt.from => string<[[address]]>
|
||||
The address this transaction is from.
|
||||
|
||||
_property: receipt.contractAddress => string<[[address]]>
|
||||
If this transaction has a ``null`` to address, it is an **init transaction**
|
||||
used to deploy a contract, in which case this is the address created by that
|
||||
contract.
|
||||
|
||||
To compute a contract address, the [getContractAddress](utils-getContractAddress)
|
||||
utility function can also be used with a [[providers-TransactionResponse]]
|
||||
object, which requires the transaction nonce and the address of the sender.
|
||||
|
||||
_property: receipt.transactionIndex => number
|
||||
The index of this transaction in the list of transactions included in
|
||||
the block this transaction was mined in.
|
||||
|
||||
_property: receipt.root => string
|
||||
The intermediate state root of a receipt.
|
||||
|
||||
Only transactions included in blocks **before** the [Byzantium Hard Fork](link-eip-609)
|
||||
have this property, as it was replaced by the ``status`` property.
|
||||
|
||||
The property is generally of little use to developers. At the time
|
||||
it could be used to verify a state transition with a fraud-proof
|
||||
only considering the single transaction; without it the full block
|
||||
must be considered.
|
||||
|
||||
_property: receipt.gasUsed => [[BigNumber]]
|
||||
The amount of gas actually used by this transaction.
|
||||
|
||||
_property: receipt.logsBloom => string<[[DataHexString]]>
|
||||
A [bloom-filter](link-wiki-bloomfilter), which
|
||||
incldues all the addresses and topics included in any log in this
|
||||
transaction.
|
||||
|
||||
_property: receipt.blockHash => string<[[DataHexString]]<32>>
|
||||
The block hash of the block that this transaction was included in.
|
||||
|
||||
_property: receipt.transactionHash => string<[[DataHexString]]<32>>
|
||||
The transaction hash of this transaction.
|
||||
|
||||
_property: receipt.logs => Array<[[providers-Log]]>
|
||||
All the logs emitted by this transaction.
|
||||
|
||||
_property: receipt.blockNumber => number
|
||||
The block height (number) of the block that this transaction was
|
||||
included in.
|
||||
|
||||
_property: receipt.confirmations => number
|
||||
The number of blocks that have been mined since this transaction,
|
||||
including the actual block it was mined in.
|
||||
|
||||
_property: receipt.cumulativeGasUsed => [[BigNumber]]
|
||||
For the block this transaction was included in, this is the sum of the
|
||||
gas used used by each transaction in the ordered list of transactions
|
||||
up to (and including) this transaction.
|
||||
|
||||
This is generally of little interest to developers.
|
||||
|
||||
_property: receipt.byzantium => boolean
|
||||
This is true if the block is in a [post-Byzantium Hard Fork](link-eip-609)
|
||||
block.
|
||||
|
||||
_property: receipt.status => boolean
|
||||
The status of a transaction is 1 is successful or 0 if it was
|
||||
reverted. Only transactions included in blocks [post-Byzantium Hard Fork](link-eip-609)
|
||||
have this property.
|
||||
|
||||
@@ -1,33 +1,356 @@
|
||||
_title: Signer
|
||||
|
||||
_section: Signers
|
||||
_section: Signers @<signers>
|
||||
|
||||
Tra la la...
|
||||
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.
|
||||
|
||||
_subsection: Signer @<signer>
|
||||
The available operations depends largely on the sub-class used.
|
||||
|
||||
_property: signer.connect(provider) => [[signer]]
|
||||
TODO
|
||||
For example, a Signer from MetaMask can send transactions and sign
|
||||
messages but cannot sign a transaction (without broadcasting it).
|
||||
|
||||
_heading: Blockchain Methods
|
||||
The most common Signers you will encounter are:
|
||||
|
||||
_property: signer.getBalance([ blockTag = "latest" ]) => Promise<[[bignumber]]>
|
||||
TODO
|
||||
- [[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)
|
||||
|
||||
_property: signer.getTransactionCount([ blockTag = "latest" ]) => Promise<number>
|
||||
TODO
|
||||
_subsection: Signer @<Signer> @SRC<abstract-signer:class.Signer>
|
||||
|
||||
The **Signer** class is abstract and cannot be directly instaniated.
|
||||
|
||||
Instead use one of the concreate sub-classes, such as the [[Wallet]],
|
||||
[[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]]>> @<Signer-getaddress> @SRC<abstract-signer:Signer.connect>
|
||||
Returns a Promise that resolves to the account address.
|
||||
|
||||
This is a Promise so that a **Signer** can be designed around an
|
||||
asynchronous source, such as hardware wallets.
|
||||
|
||||
Sub-classes **must** implement this.
|
||||
|
||||
_property: Signer.isSigner(object) => boolean @<Signer-isSigner> @SRC<abstract-signer>
|
||||
Returns true if an only if //object// is a **Signer**.
|
||||
|
||||
_heading: Blockchain Methods @<Signer--blockchain-methods>
|
||||
|
||||
_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 the chain ID this wallet is connected to.
|
||||
|
||||
_property: signer.getGasPrice() => Promise<[[BigNumber]]> @<Signer-getGasPrice> @SRC<abstract-signer>
|
||||
Returns the current gas price.
|
||||
|
||||
_property: signer.getTransactionCount([ blockTag = "latest" ]) => Promise<number> @<Signer-getTransactionCount> @SRC<abstract-signer>
|
||||
Returns the number of transactions this account has ever sent. This
|
||||
is the value required to be included in transactions as the ``nonce``.
|
||||
|
||||
_property: signer.call(transactionRequest) => Promise<string<[[DataHexString]]>> @<Signer-call> @SRC<abstract-signer>
|
||||
Returns the result of calling using the //transactionRequest//, with this
|
||||
account address being used as the ``from`` field.
|
||||
|
||||
_property: signer.estimateGas(transactionRequest) => Promise<[[BigNumber]]> @<Signer-estimateGas> @SRC<abstract-signer>
|
||||
Returns the result of estimating the cost to send the //transactionRequest//,
|
||||
with this account address being used as the ``from`` field.
|
||||
|
||||
_property: signer.resolveName(ensName) => Promise<string<[[address]]>> @<Signer-resolveName> @SRC<abstract-signer>
|
||||
Returns the address associated with the //ensName//.
|
||||
|
||||
|
||||
_subsection: Wallet inherits Signer
|
||||
_heading: Signing @<Signer--signing-methods>
|
||||
|
||||
The Wallet class inherits [[signer]] and can sign transactions and messages
|
||||
_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, 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
|
||||
binary data.
|
||||
|
||||
For example, the string ``"0x1234"`` is 6 characters long (and in
|
||||
this case 6 bytes long). This is **not** equivalent to the array
|
||||
``[ 0x12, 0x34 ]``, which is 2 bytes long.
|
||||
|
||||
A common case is to sign a hash. In this case, if the hash is a
|
||||
string, it **must** be converted to an array first, using the
|
||||
[arrayify](utils-arrayify) utility function.
|
||||
|
||||
_null:
|
||||
|
||||
_property: signer.signTransaction(transactionRequest) => Promise<string<[[DataHexString]]>> @<Signer-signTransaction>
|
||||
Returns a Promise which resolves to the signed transaction of the
|
||||
//transactionRequest//. This method does not populate any missing fields.
|
||||
|
||||
Sub-classes **must** implement this, however they may throw if signing a
|
||||
transaction is not supported, which is common for security reasons in many
|
||||
clients.
|
||||
|
||||
_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.
|
||||
|
||||
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>
|
||||
|
||||
It is very important that all important properties of a **Signer** are
|
||||
**immutable**. Since Ethereum is very asynchronous and deals with critical
|
||||
data (such as ether and other potentially valuable crypto assets), keeping
|
||||
properties such as the //provider// and //address// static throughout the
|
||||
life-cycle of the Signer helps prevent serious issues and many other classes
|
||||
and libraries make this assumption.
|
||||
|
||||
A sub-class **must** extend Signer and **must** call ``super()``.
|
||||
|
||||
_property: signer.checkTransaction(transactionRequest) => [[providers-TransactionRequest]] @<Signer-checkTransaction> @SRC<abstract-signer>
|
||||
This is generally not required to be overridden, but may needed to provide
|
||||
custom behaviour in sub-classes.
|
||||
|
||||
This should return a **copy** of the //transactionRequest//, with any properties
|
||||
needed by ``call``, ``estimateGas`` and ``populateTransaction`` (which is used
|
||||
by sendTransaction). It should also throw an error if any unknown key is specified.
|
||||
|
||||
The default implementation checks only valid [[providers-TransactionRequest]] properties
|
||||
exist and adds ``from`` to the transaction if it does not exist.
|
||||
|
||||
If there is a ``from`` field it **must** be verified to be equal to the Signer's address.
|
||||
|
||||
_property: signer.populateTransaction(transactionRequest) => Promise<[[providers-TransactionRequest]]> @<Signer-populateTransaction> @SRC<abstract-signer>
|
||||
This is generally not required to be overridden, but may needed to provide
|
||||
custom behaviour in sub-classes.
|
||||
|
||||
This should return a **copy** of //transactionRequest//, follow the same procedure
|
||||
as ``checkTransaction`` and fill in any properties required for sending a transaction.
|
||||
The result should have all promises resolved; if needed the [resolveProperties](utils-resolveproperties)
|
||||
utility function can be used for this.
|
||||
|
||||
The default implementation calls ``checkTransaction`` and resolves to if it is an
|
||||
ENS name, adds ``gasPrice``, ``nonce``, ``gasLimit`` and ``chainId`` based on the
|
||||
related operations on Signer.
|
||||
|
||||
|
||||
_subsection: Wallet @<Wallet> @INHERIT<[[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).
|
||||
|
||||
_heading: Creating an Instance
|
||||
_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: new ethers.Wallet(privateKey [ , provider ])
|
||||
TODO
|
||||
_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: Wallet.fromEncryptedJson(json, password)
|
||||
TODO
|
||||
Wallets created using this method will have a mnemonic.
|
||||
|
||||
_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]] @<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 wordlist is not specified, the English Wordlist is used.
|
||||
|
||||
_heading: Properties @<Wallet--properties>
|
||||
|
||||
_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-methods]]
|
||||
methods. This can be null.
|
||||
|
||||
_note: Note
|
||||
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>>
|
||||
The uncompressed public key for this Wallet represents.
|
||||
|
||||
_heading: Methods @<Wallet--methods>
|
||||
|
||||
_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.
|
||||
|
||||
_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.
|
||||
|
||||
It is useful as a read-only signer, when an API requires a
|
||||
Signer as a parameter, but it is known only read-only operations
|
||||
will be carried.
|
||||
|
||||
For example, the ``call`` operation will automatically have the
|
||||
provided address passed along during the execution.
|
||||
|
||||
_property: new ethers.VoidSigner(address [ , provider ]) => [[VoidSigner]]
|
||||
Create a new instance of a **VoidSigner** for //address//.
|
||||
|
||||
_property: voidSigner.address => string<[[address]]>
|
||||
The address of this **VoidSigner**.
|
||||
|
||||
_code: VoidSigner Pre-flight Example @lang<javascript>
|
||||
|
||||
address = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"
|
||||
signer = new ethers.VoidSigner(address, provider)
|
||||
|
||||
// The DAI token contract
|
||||
abi = [
|
||||
"function balanceOf(address) view returns (uint)",
|
||||
"function transfer(address, uint) returns (bool)"
|
||||
]
|
||||
contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer)
|
||||
|
||||
// <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]]>
|
||||
|
||||
The [[address]] of this EOA.
|
||||
|
||||
_property: eoa.privateKey => string<[[DataHexString]]<32>>
|
||||
|
||||
The privateKey of this EOA
|
||||
|
||||
_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
|
||||
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 coersion 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 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).
|
||||
241
docs.wrm/api/utils/abi/fragments.wrm
Normal file
241
docs.wrm/api/utils/abi/fragments.wrm
Normal file
@@ -0,0 +1,241 @@
|
||||
_section: Fragments @<fragments>
|
||||
|
||||
Explain an ABI.
|
||||
|
||||
_subsection: Formats
|
||||
|
||||
_heading: JSON String ABI (Solidity Output JSON)
|
||||
|
||||
The **JSON ABI Format** is the format that is
|
||||
[output from the Solidity compiler](link-solc-output).
|
||||
|
||||
A JSON serialized object is always a string, which represents an Array
|
||||
of Objects, where each Object has various properties describing the [[Fragment]] of the ABI.
|
||||
|
||||
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 @TODO
|
||||
|
||||
[article](link-ricmoo-humanreadableabi)
|
||||
|
||||
|
||||
_heading: Output Formats @<fragments--output-formats> @SRC<abi/fragments:FormatTypes>
|
||||
|
||||
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.
|
||||
|
||||
_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](Fragment-from).
|
||||
|
||||
_property: ethers.utils.FragmentTypes.json => string
|
||||
|
||||
This returns a JavaScript Object which is safe to call ``JSON.stringify``
|
||||
on to create a JSON string.
|
||||
|
||||
_property: ethers.utils.FragmentTypes.sighash => string
|
||||
|
||||
This is a minimal output format, which is used by Solidity when computing a
|
||||
signature hash or an event topic hash.
|
||||
|
||||
_warning: Note
|
||||
|
||||
The ``sighash`` format is **insufficient** to re-create the original [[Fragment]],
|
||||
since it discards modifiers such as indexed, anonymous, stateMutability, etc.
|
||||
|
||||
|
||||
_subsection: Fragment @<Fragment> @SRC<abi/fragments:class.Fragment>
|
||||
|
||||
An ABI is a collection of **Fragments**, where each fragment specifies:
|
||||
|
||||
- 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 [[ConstructorFragment]].
|
||||
|
||||
_property: fragment.type => string
|
||||
|
||||
This is a string which indicates the type of the [[Fragment]]. This
|
||||
will be one of:
|
||||
|
||||
- ``constructor``
|
||||
- ``event``
|
||||
- ``function``
|
||||
|
||||
_property: fragment.inputs => Array<[[ParamType]]>
|
||||
|
||||
This is an array of of each [[ParamType]] for the input parameters to
|
||||
the Constructor, Event of Function.
|
||||
|
||||
_heading: Methods
|
||||
|
||||
_property: ethers.utils.Fragment.from(objectOrString) => [[Fragment]] @<Fragment-from> @SRC<abi/fragments:Fragment.from>
|
||||
|
||||
Returns a
|
||||
|
||||
_property: ethers.utils.Fragment.isFragment(object) => boolean @<Fragment-isFragment> @SRC<abi/fragments:Fragment.isFragment>
|
||||
|
||||
Tra lal al
|
||||
|
||||
|
||||
_subsection: ConstructorFragment @<ConstructorFragment> @INHERIT<[[Fragment]]> @SRC<abi/fragments:class.ConstructorFragment>
|
||||
|
||||
_heading: Properties
|
||||
|
||||
_property: fragment.gas => [[BigNumber]]
|
||||
|
||||
This is the gas limit that should be used during deployment. It may be
|
||||
null.
|
||||
|
||||
_property: fragment.payable => boolean
|
||||
|
||||
This is whether the constructor may receive ether during deployment as
|
||||
an endowment (i.e. msg.value != 0).
|
||||
|
||||
_property: fragment.stateMutability => string
|
||||
|
||||
This is the state mutability of the constructor. It can be any of:
|
||||
|
||||
- ``nonpayable``
|
||||
- ``payable``
|
||||
|
||||
_heading: Methods
|
||||
|
||||
_property: ethers.utils.ConstructorFragment.from(objectOrString) => [[ConstructorFragment]] @<ConstructorFragment-from> @SRC<abi/fragments:ConstructorFragment.from>
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.ConstructorFragment.isConstructorFragment(object) => boolean @<ConstructorFragment-isConstructorFragment> @SRC<abi/fragments:ConstructorFragment.isConstructorFragment>
|
||||
|
||||
Tra lal al
|
||||
|
||||
|
||||
_subsection: EventFragment @<EventFragment> @INHERIT<[[Fragment]]> @SRC<abi/fragments:class.EventFragment>
|
||||
|
||||
_heading: Properties
|
||||
|
||||
_property: fragment.anonymous => boolean
|
||||
|
||||
This is whether the event is anonymous. An anonymous Event does not inject its
|
||||
topic hash as topic0 when creating a log.
|
||||
|
||||
_heading: Methods
|
||||
|
||||
_property: ethers.utils.EventFragment.from(objectOrString) => [[EventFragment]] @<EventFragment-from> @SRC<abi/fragments:EventFragment.from>
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.EventFragment.isEventFragment(object) => boolean @<EventFragment-isEventFragment> @SRC<abi/fragments:EventFragment.isEventFragment>
|
||||
|
||||
Tra lal al
|
||||
|
||||
|
||||
_subsection: FunctionFragment @<FunctionFragment> @INHERIT<[[ConstructorFragment]]> @SRC<abi/fragments:class.FunctionFragment>
|
||||
|
||||
_heading: Properties
|
||||
|
||||
_property: fragment.constant => boolean
|
||||
|
||||
This is whether the function is constant (i.e. does not change state). This
|
||||
is true if the state mutability is ``pure`` or ``view``.
|
||||
|
||||
_property: fragment.stateMutability => string
|
||||
|
||||
This is the state mutability of the constructor. It can be any of:
|
||||
|
||||
- ``nonpayable``
|
||||
- ``payable``
|
||||
- ``pure``
|
||||
- ``view``
|
||||
|
||||
_property: fragment.outputs => Array<[[ParamType]]>
|
||||
|
||||
A list of the Function output parameters.
|
||||
|
||||
_heading: Method
|
||||
|
||||
_property: ethers.utils.FunctionFragment.from(objectOrString) => [[FunctionFragment]] @<FunctionFragment-from> @SRC<abi/fragments:ConstructorFragment.from>
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.FunctionFragment.isFunctionFragment(object) => boolean @<FunctionFragment-isFunctionFragment> @SRC<abi/fragments:FunctionFragment.isFunctionFragment>
|
||||
|
||||
Tra lal al
|
||||
|
||||
|
||||
_subsection: ParamType @<ParamType> @SRC<abi/fragments:class.ParamType>
|
||||
|
||||
The following examples will represent the Solidity parameter:
|
||||
|
||||
``string foobar``
|
||||
|
||||
_heading: Properties
|
||||
|
||||
_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 @<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 @<ParamType-baseType>
|
||||
|
||||
The base type of the parameter. For primitive types (e.g. ``address``, ``uint256``, etc)
|
||||
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 @<ParamType-indexed>
|
||||
|
||||
Whether the parameter has been marked as indexed. This **only** applies
|
||||
to parameters which are part of an [[EventFragment]].
|
||||
|
||||
_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.
|
||||
|
||||
_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.
|
||||
|
||||
_property: paramType.components => Array<[[ParamType]]> @<ParamType-components>
|
||||
|
||||
The components of a tuple. This is null for non-tuple parameters.
|
||||
|
||||
|
||||
_heading: Methods
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: paramType.format([ outputType = sighash ])
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.ParamType.from(objectOrString) => [[ParamType]] @<ParamType-from> @SRC<abi/fragments:ParamType.from>
|
||||
|
||||
Tra la la...
|
||||
|
||||
_property: ethers.utils.ParamType.isParamType(object) => boolean @<ParamType-isParamType> @SRC<abi/fragments:ParamType.isParamType>
|
||||
|
||||
Tra la la...
|
||||
21
docs.wrm/api/utils/abi/index.wrm
Normal file
21
docs.wrm/api/utils/abi/index.wrm
Normal file
@@ -0,0 +1,21 @@
|
||||
_section: Application Binary Interface @NAV<ABI>
|
||||
|
||||
An **Application Binary Interface** (ABI) is a collection of
|
||||
[Fragments](Fragment) which specify how to interact with
|
||||
various components of a Contract.
|
||||
|
||||
An [[Interface]] helps organize Fragments by type as well
|
||||
as provides the functionality required to encode, decode and
|
||||
work with each component.
|
||||
|
||||
Most developers will not require this low-level access to encoding
|
||||
and decoding the binary data on the network and will most likely
|
||||
use a [[Contract]] which provides a more convenient interface. Some
|
||||
framework, tool developers or developers using advanced techniques
|
||||
may find these classes and utilities useful.
|
||||
|
||||
_toc:
|
||||
coder
|
||||
formats
|
||||
fragments
|
||||
interface
|
||||
196
docs.wrm/api/utils/abi/interface.wrm
Normal file
196
docs.wrm/api/utils/abi/interface.wrm
Normal file
@@ -0,0 +1,196 @@
|
||||
_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
|
||||
existing deployed contracts.
|
||||
|
||||
The EVM itself does not understand what the ABI is. It is simply an agreed
|
||||
upon set of formats to encode various types of data which each contract can
|
||||
expect so they can interoperate with each other.
|
||||
|
||||
|
||||
_subsection: Creating Instances @<Interface--creating>
|
||||
|
||||
_property: new ethers.utils.Interface(abi) @SRC<abi/interface:constructor.Interface>
|
||||
Create a new **Interface** from a JSON string or object representing
|
||||
//abi//.
|
||||
|
||||
The //abi// may be a JSON string or the parsed Object (using JSON.parse)
|
||||
which is emitted by the [Solidity compiler](link-solc-output) (or compatible languages).
|
||||
|
||||
The //abi// may also be a [Human-Readable Abi](link-ricmoo-humanreadableabi),
|
||||
which is a format the Ethers created to simplify manually typing the ABI
|
||||
into the source and so that a Contract ABI can also be referenced easily
|
||||
within the same source file.
|
||||
|
||||
_subsection: Properties @<Interface--properties>
|
||||
|
||||
_property: interface.fragments => Array<[[Fragment]]>
|
||||
All the [Fragments](Fragment) in the interface.
|
||||
|
||||
_property: interface.events => Array<[[EventFragment]]>
|
||||
All the [Event Fragments](EventFragment) in the interface.
|
||||
|
||||
_property: interface.functions => Array<[[FunctionFragment]]>
|
||||
All the [Function Fragments](FunctionFragment) in the interface.
|
||||
|
||||
_property: interface.deploy => [[ConstructorFragment]]
|
||||
The [Constructor Fragments](ConstructorFragment) for the interface.
|
||||
|
||||
|
||||
_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
|
||||
single string is returned, otherwise an Array of the human-readable
|
||||
strings is returned.
|
||||
|
||||
|
||||
_subsection: Fragment Access @<Interface--fragments>
|
||||
|
||||
_property: interface.getFunction(fragment) => [[FunctionFragment]] @SRC<abi/interface>
|
||||
Returns the [[FunctionFragment]] for //fragment// (see [[Interface--specifying-fragments]]).
|
||||
|
||||
_property: interface.getEvent(fragment) => [[EventFragment]] @SRC<abi/interface>
|
||||
Returns the [[EventFragment]] for //fragment// (see [[Interface--specifying-fragments]]).
|
||||
|
||||
|
||||
_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 [[Interface--specifying-fragments]]).
|
||||
|
||||
_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 @<Interface--encoding>
|
||||
|
||||
_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 [[Interface--specifying-fragments]]) for the given //values//.
|
||||
|
||||
Each //topic// is a 32 byte (64 nibble) [[DataHexString]].
|
||||
|
||||
_property: interface.encodeFunctionData(fragment [ , values ]) => string<[[DataHexString]]> @SRC<abi/interface>
|
||||
Returns the encoded data, which can be used as the data for a transaction for
|
||||
//fragment// (see [[Interface--specifying-fragments]]) for the given //values//.
|
||||
|
||||
_property: interface.encodeFunctionResult(fragment [ , values ]) => string<[[DataHexString]]> @SRC<abi/interface>
|
||||
Returns the encoded result, which would normally be the response from a call for
|
||||
//fragment// (see [[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 @<Interface--decoding>
|
||||
|
||||
_property: interface.decodeEventLog(fragment, data [ , topics ]) => [[Result]] @SRC<abi/interface>
|
||||
Returns the decoded event values from an event log for
|
||||
//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) => [[Result]] @SRC<abi/interface>
|
||||
Returns the decoded values from transaction data for
|
||||
//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) => [[Result]] @SRC<abi/interface>
|
||||
Returns the decoded values from the result of a call for
|
||||
//fragment// (see [[Interface--specifying-fragments]]) for the given //data//.
|
||||
|
||||
|
||||
_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) => [[LogDescription]] @SRC<abi/interface>
|
||||
Search the event that matches the //log// topic hash and parse the values
|
||||
the log represents.
|
||||
|
||||
_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 @<Interface--types>
|
||||
|
||||
_heading: Result @<Result> @INHERIT<Array\<any\>>
|
||||
|
||||
A **Result** is an array, so each value can be accessed as a positional
|
||||
argument.
|
||||
|
||||
Additionally, if values are named, the identical object as its positional
|
||||
value can be accessed by its name.
|
||||
|
||||
The name ``length`` is however reserved as it is part of the Array, so
|
||||
any named value for this key is renamed to ``_length``. If there is a
|
||||
name collision, only the first is available by its key.
|
||||
|
||||
|
||||
_heading: LogDescription @<LogDescription>
|
||||
|
||||
_property: logDescription.args => [[Result]]
|
||||
The values of the input parameters of the event.
|
||||
|
||||
_property: logDescription.eventFragment => [[EventFragment]]
|
||||
The [[EventFragment]] which matches the topic in the Log.
|
||||
|
||||
_property: logDescription.name => string
|
||||
The event name. (e.g. ``Transfer``)
|
||||
|
||||
_property: logDescription.signature => string
|
||||
The event signature. (e.g. ``Transfer(address,address,uint256)``)
|
||||
|
||||
_property: logDescription.topic => string
|
||||
The topic hash.
|
||||
|
||||
|
||||
_heading: TransactionDescription @<TransactionDescription>
|
||||
|
||||
_property: transactionDescription.args => [[Result]]
|
||||
The decoded values from the transaction data which were passed
|
||||
as the input parameters.
|
||||
|
||||
_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``)
|
||||
|
||||
_property: transactionDescription.sighash => string
|
||||
The sighash (or function selector) that matched the transaction data.
|
||||
|
||||
_property: transactionDescription.signature => string
|
||||
The signature of the function. (e.g. ``transfer(address,uint256)``)
|
||||
|
||||
_property: transactionDescription.value => [[BigNumber]]
|
||||
The value from the transaction.
|
||||
|
||||
|
||||
_subsection: Specifying Fragments @<Interface--specifying-fragments>
|
||||
|
||||
When specifying a fragment to any of the functions in an **Interface**,
|
||||
any of the following may be used:
|
||||
|
||||
- The **name** of the event or function, if it is unique and non-ambiguous
|
||||
within the ABI (e.g. ``transfer``)
|
||||
- The **signature** of the event or function. The signature is normalized,
|
||||
so, for example, ``uint`` and ``uint256`` are equivalent (e.g. ``transfer(address, uint)``)
|
||||
- The **sighash** or **topichash** of the function. The sighash is often referred
|
||||
to the function selector in Solidity (e.g. ``0xa9059cbb``)
|
||||
- A [[Fragment]]
|
||||
@@ -1,21 +1,83 @@
|
||||
_title: Addresses
|
||||
|
||||
_section: Addresses
|
||||
_section: Addresses @<addresses>
|
||||
|
||||
Explain addresses,formats and checksumming here.
|
||||
|
||||
Also see: [Constants.AddressZero](constants)
|
||||
Also see: [constants.AddressZero](constants)
|
||||
|
||||
_heading: Functions
|
||||
_subsection: Address Formats @<address-formats>
|
||||
|
||||
_property: utils.getAddress(address) => string
|
||||
TODO
|
||||
|
||||
_property: utils.isAddress(address) => boolean
|
||||
TODO
|
||||
_heading: Address @<address>
|
||||
|
||||
An **Address** is a [[DataHexString]] of 20 bytes (40 nibbles), with optional
|
||||
mixed case.
|
||||
|
||||
If the case is mixed, it is a **Checksum Address**, which uses a specific pattern
|
||||
of uppercase and lowercase letters within a given address to reduce the risk
|
||||
of errors introduced from typing an address or cut and paste issues.
|
||||
|
||||
All functions that return an Address will return a Checksum Address.
|
||||
|
||||
|
||||
_heading: ICAP Address @<address-icap>
|
||||
|
||||
The **ICAP Address Format** was an early attempt to introduce a checksum
|
||||
into Ethereum addresses using the popular banking industry's
|
||||
[IBAN](link-wiki-iban)
|
||||
format with the country code specified as **XE**.
|
||||
|
||||
Due to the way IBAN encodes address, only addresses that fit into 30 base-36
|
||||
characters are actually compatible, so the format was adapted to support 31
|
||||
base-36 characters which is large enough for a full Ethereum address, however
|
||||
the preferred method was to select a private key whose address has a ``0`` as
|
||||
the first byte, which allows the address to be formatted as a fully compatibly
|
||||
standard IBAN address with 30 base-36 characters.
|
||||
|
||||
In general this format is no longer widely supported anymore, however any function that
|
||||
accepts an address can receive an ICAP address, and it will be converted internally.
|
||||
|
||||
To convert an address into the ICAP format, see [getIcapAddress](utils-getIcapAddress).
|
||||
|
||||
|
||||
_subsection: 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 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).
|
||||
|
||||
_property: ethers.utils.isAddress(address) => boolean @<utils-isAddress> @SRC<address>
|
||||
Returns true if //address// is valid (in any supported format).
|
||||
|
||||
|
||||
_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
|
||||
compressed or uncompressed, and a private key will be converted
|
||||
automatically to a public key for the derivation.
|
||||
|
||||
_property: ethers.utils.recoverAddress(digest, signature) => string<[[address]]> @<utils-recoverAddress> @SRC<transactions>
|
||||
Use [[link-wiki-ecrecover]] to determine the address that signed //digest// to
|
||||
which generated //signature//.
|
||||
|
||||
|
||||
_subsection: Contracts Addresses @<utils--contract-addresses>
|
||||
|
||||
_property: ethers.utils.getContractAddress(transaction) => string<[[address]]> @<utils-getContractAddress> @SRC<address>
|
||||
Returns the contract address that would result if //transaction// was
|
||||
used to deploy a contract.
|
||||
|
||||
_property: ethers.utils.getCreate2Address(from, salt, initCodeHash) => string<[[address]]> @<utils-getCreate2Address> @SRC<address>
|
||||
Returns the contract address that would result from the given
|
||||
[CREATE2](link-eip-1014) call.
|
||||
|
||||
|
||||
_property: utils.getIcapAddress(address) => string
|
||||
TODO
|
||||
|
||||
_property: utils.getContractAddress(transaction) => string
|
||||
TODO
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
// <hide>
|
||||
const { BigNumber } = require("./packages/ethers");
|
||||
const { constants } = require("./packages/ethers");
|
||||
|
||||
function _inspect(result) {
|
||||
if (BigNumber.isBigNumber(result)) {
|
||||
return `{ BigNumber: ${ JSON.stringify(result.toString()) } }`;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
// </hide>
|
||||
|
||||
// From a decimal string...
|
||||
BigNumber.from("42")
|
||||
//!
|
||||
|
||||
// From a hexstring...
|
||||
BigNumber.from("0x2a")
|
||||
//!
|
||||
|
||||
// From a negative hexstring...
|
||||
BigNumber.from("-0x2a")
|
||||
//!
|
||||
|
||||
// From an Array (or Uint8Array)...
|
||||
BigNumber.from([ 42 ])
|
||||
//!
|
||||
|
||||
// From an existing BigNumber...
|
||||
let one1 = constants.One;
|
||||
let one2 = BigNumber.from(one1)
|
||||
|
||||
one2
|
||||
//!
|
||||
|
||||
// ...which returns the same instance
|
||||
one1 === one2
|
||||
//!
|
||||
|
||||
// From a (safe) number...
|
||||
BigNumber.from(42)
|
||||
//!
|
||||
|
||||
// From a ES2015 BigInt... (only on platforms with BigInt support)
|
||||
BigNumber.from(42n)
|
||||
//!
|
||||
|
||||
// Numbers outside the safe range fail:
|
||||
BigNumber.from(Number.MAX_SAFE_INTEGER);
|
||||
//! error
|
||||
@@ -1,16 +0,0 @@
|
||||
// <hide>
|
||||
const { BigNumber } = require("./packages/ethers");
|
||||
|
||||
function _inspect(result) {
|
||||
if (BigNumber.isBigNumber(result)) {
|
||||
return `{ BigNumber: ${ JSON.stringify(result.toString()) } }`;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
// </hide>
|
||||
|
||||
let a = BigNumber.from(42);
|
||||
let b = BigNumber.from("91");
|
||||
|
||||
a.mul(b);
|
||||
//!
|
||||
@@ -1,2 +0,0 @@
|
||||
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER)
|
||||
//!
|
||||
@@ -1,18 +0,0 @@
|
||||
/////
|
||||
// CommonJS:
|
||||
|
||||
// From the Umbrella ethers package...
|
||||
const { BigNumber } = require("ethers");
|
||||
|
||||
// From the bignumber pacakge...
|
||||
const { BigNumber } = require("@ethersproject/bignumber");
|
||||
|
||||
|
||||
/////
|
||||
// ES6 and TypeScript:
|
||||
|
||||
// From the Umbrella ethers package...
|
||||
import { BigNumber } from "ethers";
|
||||
|
||||
// From the bignumber pacakge...
|
||||
import { BigNumber } from "@ethersproject/bignumber";
|
||||
@@ -1,53 +1,94 @@
|
||||
_title: Big Number
|
||||
_section: BigNumber @<BigNumber>
|
||||
|
||||
Many operations in Ethereum operation on numbers which are
|
||||
[outside the range of safe values](BigNumber--notes-safenumbers) to use
|
||||
in JavaScript.
|
||||
|
||||
A **BigNumber** is an object which safely allows mathematic operations
|
||||
on numbers of any magnitude.
|
||||
|
||||
Most operations which need to return a value will return a **BigNumber**
|
||||
and parameters which accept values will generally accept them.
|
||||
|
||||
|
||||
_section: BigNumber @<bignumber>
|
||||
_subsection: Types @<BigNumber--types>
|
||||
|
||||
Explain about BigNumber here...
|
||||
|
||||
_heading: Importing
|
||||
|
||||
_code: bignumber-import.source
|
||||
|
||||
_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:
|
||||
|
||||
_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 for JavaScript numbers.
|
||||
A number that is within the [safe range](link-js-maxsafe) for JavaScript numbers.
|
||||
|
||||
_definition: **//BigInt//**
|
||||
A JavaScript [BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt)
|
||||
A JavaScript [BigInt](link-js-bigint)
|
||||
object, on environments that support BigInt.
|
||||
|
||||
|
||||
_subsection: Creating Instances
|
||||
_subsection: Creating Instances @<BigNumber--creating>
|
||||
|
||||
The constructor of BigNumber cannot be called directly. Instead, Use the static ``BigNumber.from``.
|
||||
|
||||
_property: BigNumber.from(aBigNumberish) => [[bignumber]]
|
||||
_property: ethers.BigNumber.from(aBigNumberish) => [[BigNumber]]
|
||||
Returns an instance of a **BigNumber** for //aBigNumberish//.
|
||||
|
||||
_heading: Examples:
|
||||
_heading: Examples: @<>
|
||||
|
||||
_code: bignumber-create.js
|
||||
_code: @lang<javascript>
|
||||
|
||||
// From a decimal string...
|
||||
BigNumber.from("42")
|
||||
//!
|
||||
|
||||
// From a HexString...
|
||||
BigNumber.from("0x2a")
|
||||
//!
|
||||
|
||||
// From a negative HexString...
|
||||
BigNumber.from("-0x2a")
|
||||
//!
|
||||
|
||||
// From an Array (or Uint8Array)...
|
||||
BigNumber.from([ 42 ])
|
||||
//!
|
||||
|
||||
// From an existing BigNumber...
|
||||
let one1 = constants.One;
|
||||
let one2 = BigNumber.from(one1)
|
||||
|
||||
one2
|
||||
//!
|
||||
|
||||
// ...which returns the same instance
|
||||
one1 === one2
|
||||
//!
|
||||
|
||||
// From a (safe) number...
|
||||
BigNumber.from(42)
|
||||
//!
|
||||
|
||||
// From a ES2015 BigInt... (only on platforms with BigInt support)
|
||||
BigNumber.from(42n)
|
||||
//!
|
||||
|
||||
// Numbers outside the safe range fail:
|
||||
BigNumber.from(Number.MAX_SAFE_INTEGER);
|
||||
//! error
|
||||
|
||||
|
||||
_subsection: Methods
|
||||
_subsection: Methods @<BigNumber--methods>
|
||||
|
||||
The BigNumber class is immutable, so no operations can change the value
|
||||
it represents.
|
||||
@@ -55,98 +96,106 @@ it represents.
|
||||
|
||||
_heading: Math Operations
|
||||
|
||||
_property: bignumber.add(otherValue) => [[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]]
|
||||
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]]
|
||||
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]]
|
||||
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]]
|
||||
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]]
|
||||
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]]
|
||||
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.maskn(bitcount) => [[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
|
||||
|
||||
[Two's Complicment](https://en.wikipedia.org/wiki/Two%27s_complement)
|
||||
[Two's Complicment](link-wiki-twoscomplement)
|
||||
is an elegant method used to encode and decode fixed-width signed values
|
||||
while efficiently preserving mathematic operations.
|
||||
Most users will not need to interact with these.
|
||||
|
||||
_property: bignumber.fromTwos(bitwidth) => [[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-compliment with //bitwidth//.
|
||||
|
||||
_property: bignumber.toTwos(bitwidth) => [[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-compliment with //bitwidth//.
|
||||
|
||||
|
||||
_heading: Comparison and Equivalence
|
||||
|
||||
_property: bignumber.eq(otherValue) => boolean
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
Returns the value of //bignumber// as a base-16, `0x`-prefixed [hexstring](hexstring).
|
||||
_property: BigNumber.toHexString() => string<[[DataHexString]]> @SRC<bignumber:BigNumber.toHexString>
|
||||
Returns the value of //BigNumber// as a base-16, ``0x``-prefixed [[DataHexString]].
|
||||
|
||||
|
||||
_heading: Inspection
|
||||
|
||||
_property: BigNumnber.isBigNumber(object) => boolean
|
||||
_property: ethers.BigNumnber.isBigNumber(object) => boolean @SRC<bignumber>
|
||||
Returns true if and only if the //object// is a BigNumber object.
|
||||
|
||||
|
||||
_heading: Examples
|
||||
|
||||
_code: bignumber-examples.js
|
||||
_code: @lang<javascript>
|
||||
|
||||
_subsection: Notes
|
||||
let a = BigNumber.from(42);
|
||||
let b = BigNumber.from("91");
|
||||
|
||||
A few short notes on numbers...
|
||||
a.mul(b);
|
||||
//!
|
||||
|
||||
_heading: Why can't I just use numbers?
|
||||
|
||||
_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? @<BigNumber--notes-safenumbers>
|
||||
|
||||
The first problem many encounter when dealing with Ethereum is
|
||||
the concept of numbers. Most common currencies are broken down
|
||||
@@ -154,7 +203,7 @@ with very little granularity. For example, there are only 100
|
||||
cents in a single dollar. However, there are 10^^18^^ **wei** in a
|
||||
single **ether**.
|
||||
|
||||
JavaScript uses [IEEE 754 double-precision binary floating point](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)
|
||||
JavaScript uses [IEEE 754 double-precision binary floating point](link-wiki-ieee754)
|
||||
numbers to represent numeric values. As a result, there are //holes//
|
||||
in the integer set after 9,007,199,254,740,991; which is
|
||||
problematic for //Ethereum// because that is only around 0.009
|
||||
@@ -163,13 +212,76 @@ experience rounding errors.
|
||||
|
||||
To demonstrate how this may be an issue in your code, consider:
|
||||
|
||||
_code: bignumber-ieee754.js
|
||||
_code: @lang<javascript>
|
||||
|
||||
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER)
|
||||
//!
|
||||
|
||||
_null:
|
||||
|
||||
To remedy this, all numbers (which can be large) are stored
|
||||
and manipulated as [Big Numbers](bignumber).
|
||||
and manipulated as [Big Numbers](BigNumber).
|
||||
|
||||
The functions [parseEther( etherString )](http://linkto) and
|
||||
[formatEther( wei )](http://linkto) 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.
|
||||
|
||||
|
||||
_heading: Why not BigNumber.js, BN.js, BigDecimal, etc?
|
||||
|
||||
Everyone has their own favourite Big Number library, and once someone
|
||||
has choosen one, it becomes part of their identity, like their editor,
|
||||
vi vs emacs. There are over 100 Big Number libraries on [npm](link-npm-query-bignumber).
|
||||
|
||||
One of the biggest differences between the Ethers [[BigNumber]] object and
|
||||
other libraries is that it is immutable, which is very important when
|
||||
dealing with the asynchronous nature of the blockchain.
|
||||
|
||||
Capturing the value is not safe in async functions, so immutability
|
||||
protects us from easy to make mistakes, which is not possible on the
|
||||
low-level library's objects which supports myriad in-place operations.
|
||||
|
||||
Second, the Ethers [[BigNumber]] provides all the functionality required
|
||||
internally and should generally be sufficient for most developers while
|
||||
not exposing some of the more advanced and rare functionality. So it will
|
||||
be eaiser to swap out the underlying library without impacting consumers.
|
||||
|
||||
For example, if [[link-npm-bnjs]] was exposed, someone may use the
|
||||
greatest-common-denominator functions, which would then be functionality
|
||||
the replacing library should also provide to ensure anyone depending on
|
||||
that functionality is not broken.
|
||||
|
||||
|
||||
_heading: Why BN.js??
|
||||
|
||||
The reason why [[link-npm-bnjs]] is used internally as the big
|
||||
number is because that is the library used by [[link-npm-elliptic]].
|
||||
|
||||
Therefore it **must** be included regardless, so we leverage that
|
||||
library rather than adding another Big Number library, which would
|
||||
mean two different libraries offering the same functionality.
|
||||
|
||||
This has saved about 85kb (80% of this library size) of library size
|
||||
over other libraries which include separate Big Number libraries for
|
||||
various purposes.
|
||||
|
||||
|
||||
_heading: Allow us to set a global Big Number library?
|
||||
|
||||
Another comment that comes up frequently is tha desire to specify a
|
||||
global user-defined Big Number library, which all functions would
|
||||
return.
|
||||
|
||||
This becomes problematic since your code may live along side other
|
||||
libraries or code that use Ethers. In fact, even Ethers uses a lot
|
||||
of the public functions internally.
|
||||
|
||||
If you, for example, used a library that used ``a.plus(b)`` instead
|
||||
of ``a.add(b)``, this would break Ethers when it tries to compute
|
||||
fees internally, and other libraries likely have similar logic.
|
||||
|
||||
But, the [[BigNumber]] prototype is exposed, so you can always add a
|
||||
``toMyCustomBigNumber()`` method to all [[BigNumber]]'s globally
|
||||
which is safe.
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
// <hide>
|
||||
|
||||
const { ethers } = require("./packages/ethers");
|
||||
const { arrayify, hexlify, hexValue } = ethers.utils;
|
||||
|
||||
function _inspect(result) {
|
||||
if (result && typeof(result.length) === "number" && typeof(result) !== "string") {
|
||||
return "[ " + Array.prototype.map.call(result, (i) => _inspect(i)).join(", ") + " ]";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// </hide>
|
||||
|
||||
// Convert a hexstring to a Uint8Array
|
||||
arrayify("0x1234")
|
||||
//!
|
||||
|
||||
// Convert an Array to a hexstring
|
||||
hexlify([1, 2, 3, 4])
|
||||
//!
|
||||
|
||||
// Convert an Object to a hexstring
|
||||
hexlify({ length: 2, "0": 1, "1": 2 })
|
||||
//!
|
||||
|
||||
// Convert an Array to a hexstring
|
||||
hexlify([ 1 ])
|
||||
//!
|
||||
|
||||
// Convert a number to a stripped hex value
|
||||
hexValue(1)
|
||||
//!
|
||||
|
||||
// Convert an Array to a stripped hex value
|
||||
hexValue([ 1, 2 ])
|
||||
//!
|
||||
@@ -1,121 +1,177 @@
|
||||
_title: Byte Manipulation
|
||||
|
||||
_section: Byte Manipulation
|
||||
|
||||
Tra la la...
|
||||
|
||||
_subsection: Types
|
||||
|
||||
_heading: Bytes @<bytes>
|
||||
_heading: Bytes @<Bytes>
|
||||
|
||||
A Bytes object is any object which is an
|
||||
[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) or
|
||||
[TypedArray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) with
|
||||
A **Bytes** is any object which is an
|
||||
[Array](link-js-array) or [TypedArray](link-js-typedarray) with
|
||||
each value in the valid byte range (i.e. between 0 and 255 inclusive),
|
||||
or is an Object with a ``length`` property where each indexed property
|
||||
is in the valid byte range.
|
||||
|
||||
_heading: BytesLike @<byteslike>
|
||||
_heading: BytesLike @<BytesLike>
|
||||
|
||||
A **BytesLike** can be either a [[bytes]] or a [[hexstring]].
|
||||
A **BytesLike** can be either a [[Bytes]] or a [[DataHexString]].
|
||||
|
||||
_heading: Hexstring @<hexstring>
|
||||
_heading: DataHexString @<DataHexString>
|
||||
|
||||
A **hexstring** is a string which has a ``0x`` prefix followed by
|
||||
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: Signature @<signature>
|
||||
_heading: HexString @<HexString>
|
||||
|
||||
A **Hexstring** is a string which has a ``0x`` prefix followed by any
|
||||
number of nibbles (i.e. case-insensitive hexidecumal characters, ``0-9`` and ``a-f``).
|
||||
|
||||
_heading: Signature @<Signature>
|
||||
|
||||
- **r** and **s** --- The x co-ordinate of **r** and the **s** value of the signature
|
||||
- **v** --- The parity of the y co-ordinate of **r**
|
||||
- **_vs** --- The [compact representation](https://link_here) of the **(r, s)** and **v**
|
||||
- **_vs** --- The [compact representation](link-eip-2098) of the **s** and **v**
|
||||
- **recoveryParam** --- The normalized (i.e. 0 or 1) value of **v**
|
||||
|
||||
_heading: SignatureLike @<signaturelike>
|
||||
_heading: Raw Signature @<signature-raw> @inherit<string\<[[DataHexString]]\<65\>\>>
|
||||
|
||||
A **SignatureLike** is similar to a [[signature]], except redundant properties
|
||||
may be omitted.
|
||||
A **Raw Signature** is a common Signature format where the r, s and v are
|
||||
concanenated into a 65 byte (130 nibble) [[DataHexString]].
|
||||
|
||||
For example, if *_vs* is specified, **(r, s)** and **v** can be omitted. Likewise,
|
||||
if **recoverParam** is provided, **v** can be omitted (as it can be computed).
|
||||
|
||||
_heading: SignatureLike @<SignatureLike>
|
||||
|
||||
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
|
||||
missing values can be computed).
|
||||
|
||||
|
||||
_subsection: Inspection
|
||||
|
||||
_property: utils.isBytes(object) => boolean
|
||||
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: utils.isBytesLike(object) => boolean
|
||||
Returns true if and only if //object// is a [[bytes]] or an Array or TypedArray
|
||||
where each value is a valid byte (i.e. between 0 and 255 inclusive).
|
||||
_property: ethers.utils.isBytesLike(object) => boolean @<utils-isBytesLike> @SRC<bytes>
|
||||
Returns true if and only if //object// is a [[Bytes]] or [[DataHexString]].
|
||||
|
||||
_property: utils.isHexString(object, [ length ] ) => boolean
|
||||
Returns true if and only if //object// is a valid hex string;
|
||||
if //length// is specified the length (in bytes) is also verified.
|
||||
_property: ethers.utils.isHexString(object, [ length ] ) => boolean @<utils-isHexString> @SRC<bytes>
|
||||
Returns true if and only if //object// is a valid hex string.
|
||||
If //length// is specified and //object// is not a valid [[DataHexString]] of
|
||||
//length// bytes, an InvalidArgument error is thrown.
|
||||
|
||||
|
||||
_subsection: Converting between Arrays and Hexstrings
|
||||
|
||||
_property: utils.arrayify(hexstringOrArrayish [ , options ]) => Uint8Array
|
||||
Converts //hexstringOrArrayish// to a Uint8Array. If a [[hexstring]]
|
||||
is passed in, the length must be even.
|
||||
_property: ethers.utils.arrayify(DataHexStringOrArrayish [ , options ]) => Uint8Array @<utils-arrayify> @SRC<bytes>
|
||||
Converts //DataHexStringOrArrayish// to a Uint8Array.
|
||||
|
||||
_property: utils.hexlify(hexstringOrArrayish) => string
|
||||
Converts //hexstringOrArrayish// to a [[hexstring]]. The result
|
||||
will always be zero-padded to even length.
|
||||
_property: ethers.utils.hexlify(hexstringOrArrayish) => string<[[DataHexString]]> @<utils-hexlify> @SRC<bytes>
|
||||
Converts //hexstringOrArrayish// to a [[DataHexString]].
|
||||
|
||||
_property: utils.hexValue(aBigNumberish) => string
|
||||
Converts //aBigNumberish// to a [[hexstring]], with no unecessary leading
|
||||
zeros. The result of this function can be of odd-length.
|
||||
_property: ethers.utils.hexValue(aBigNumberish) => string<[[HexString]]> @<utils-hexValue> @SRC<bytes>
|
||||
Converts //aBigNumberish// to a [[HexString]], with no __unnecessary__ leading
|
||||
zeros.
|
||||
|
||||
_heading: Examples
|
||||
_code: Examples @lang<javascript>
|
||||
|
||||
_code: bytes-conversion.js
|
||||
// Convert a hexstring to a Uint8Array
|
||||
arrayify("0x1234")
|
||||
//!
|
||||
|
||||
// Convert an Array to a hexstring
|
||||
hexlify([1, 2, 3, 4])
|
||||
//!
|
||||
|
||||
// Convert an Object to a hexstring
|
||||
hexlify({ length: 2, "0": 1, "1": 2 })
|
||||
//!
|
||||
|
||||
// Convert an Array to a hexstring
|
||||
hexlify([ 1 ])
|
||||
//!
|
||||
|
||||
// Convert a number to a stripped hex value
|
||||
hexValue(1)
|
||||
//!
|
||||
|
||||
// Convert an Array to a stripped hex value
|
||||
hexValue([ 1, 2 ])
|
||||
//!
|
||||
|
||||
|
||||
_subsection: Array Manipulation
|
||||
|
||||
_property: utils.concat(arrayOfBytesLike) => Uint8Array
|
||||
Concatenates all the [[byteslike]] in //arrayOfBytesLike//
|
||||
into a single Uint8Array.
|
||||
_property: ethers.utils.concat(arrayOfBytesLike) => Uint8Array @<utils-concat> @SRC<bytes>
|
||||
Concatenates all the [[BytesLike]] in //arrayOfBytesLike// into a single Uint8Array.
|
||||
|
||||
_property: utils.stripZeros(aBytesLike) => Uint8Array
|
||||
Concatenates all the [[byteslike]] in //arrayOfBytesLike//
|
||||
_property: ethers.utils.stripZeros(aBytesLike) => Uint8Array @<utils-stripZeros> @SRC<bytes>
|
||||
Returns a Uint8Array with all leading ``0`` bytes of //aBtyesLike// removed.
|
||||
|
||||
_property: utils.zeroPad(aBytesLike, length) => Uint8Array
|
||||
Concatenates all the [[byteslike]] in //arrayOfBytesLike//
|
||||
_property: ethers.utils.zeroPad(aBytesLike, length) => Uint8Array @<utils-zeroPad> @SRC<bytes>
|
||||
Retutns a Uint8Array of the data in //aBytesLike// with ``0`` bytes prepended to
|
||||
//length// bytes long.
|
||||
|
||||
If //aBytesLike// is already longer than //length// bytes long, an InvalidArgument
|
||||
error will be thrown.
|
||||
|
||||
|
||||
_subsection: Hexstring Manipulation
|
||||
|
||||
_property: utils.hexConcat(arrayOfBytesLike) => string
|
||||
Concatenates all the [[byteslike]] in //arrayOfBytesLike//
|
||||
into a single [[hexstring]]
|
||||
_property: ethers.utils.hexConcat(arrayOfBytesLike) => string<[[DataHexString]]> @<utils-hexConcat> @SRC<bytes>
|
||||
Concatenates all the [[BytesLike]] in //arrayOfBytesLike// into a single [[DataHexString]]
|
||||
|
||||
_property: utils.hexDataLength(aBytesLike) => number
|
||||
_property: ethers.utils.hexDataLength(aBytesLike) => string<[[DataHexString]]> @<utils-hexDataLength> @SRC<bytes>
|
||||
Returns the length (in bytes) of //aBytesLike//.
|
||||
|
||||
This will **throw and error** if //aBytesLike// is a [[hexstring]]
|
||||
but is of odd-length.
|
||||
_property: ethers.utils.hexDataSlice(aBytesLike, offset [ , endOffset ] ) => string<[[DataHexString]]> @<utils-hexDataSlice> @SRC<bytes>
|
||||
Returns a [[DataHexString]] representation of a slice of //aBytesLike//, from
|
||||
//offset// (in bytes) to //endOffset// (in bytes). If //endOffset// is
|
||||
omitted, the length of //aBytesLike// is used.
|
||||
|
||||
_property: utils.hexDataSlice(aBytesLike, offset [ , endOffset ] ) => string
|
||||
Returns the length (in bytes) of //aBytesLike//.
|
||||
_property: ethers.utils.hexStripZeros(aBytesLike) => string<[[HexString]]> @<utils-hexStripZeros> @SRC<bytes>
|
||||
Returns a [[HexString]] representation of //aBytesLike// with all
|
||||
leading zeros removed.
|
||||
|
||||
_property: utils.hexStripZeros(aBytesLike) => string
|
||||
@TODO
|
||||
_property: ethers.utils.hexZeroPad(aBytesLike, length) => string<[[DataHexString]]> @<utils-hexZeroPad> @SRC<bytes>
|
||||
Returns a [[DataHexString]] representation of //aBytesLike// padded to //length// bytes.
|
||||
|
||||
_property: utils.hexZeroPad(aBytesLike, length) => string
|
||||
@TODO
|
||||
If //aBytesLike// is already longer than //length// bytes long, an InvalidArgument
|
||||
error will be thrown.
|
||||
|
||||
|
||||
_subsection: Signature Conversion
|
||||
|
||||
_property: utils.joinSignature(aSignatureLike) => string
|
||||
Return the flat-format of a [[signaturelike]], which is
|
||||
65 bytes (130 nibbles) long, concatenating the **r**, **s** and **v**
|
||||
of a Signature.
|
||||
_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: utils.splitSignature(aSignatureLikeOrBytesLike) => Signature
|
||||
Return the full expanded-format of a [[signaturelike]] or
|
||||
a flat-format [[hexstring]]. Any missing properties will be
|
||||
computed.
|
||||
_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>
|
||||
Return a new Uint8Array of //length// random bytes.
|
||||
|
||||
_property: ethers.utils.shuffled(array) => Array<any> @<utils-shuffled> @SRC<random>
|
||||
Return a copy of //array// shuffled using [[link-wiki-shuffle]].
|
||||
|
||||
_code: Examples @lang<javascript>
|
||||
|
||||
utils.randomBytes(8)
|
||||
//!
|
||||
|
||||
const data = [ 1, 2, 3, 4, 5, 6, 7 ];
|
||||
|
||||
// Returns a new Array
|
||||
utils.shuffled(data);
|
||||
//!
|
||||
|
||||
// The Original is unscathed...
|
||||
data
|
||||
//!
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
|
||||
//const { constants } = require("ethers");
|
||||
// const { constants } = require("@ethersproject/constants");
|
||||
@@ -1,48 +1,42 @@
|
||||
_title: Constants
|
||||
|
||||
_section: Constants @<constants>
|
||||
|
||||
The **ethers.contants** Object contains commonly used values.
|
||||
|
||||
_heading: Importing
|
||||
|
||||
_code: constants-import.js
|
||||
|
||||
|
||||
_subsection: Bytes
|
||||
|
||||
_property: constants.AddressZero
|
||||
_property: ethers.constants.AddressZero => string<[Address](address)> @<constants-AddressZero> @SRC<constants>
|
||||
The Address Zero, which is 20 bytes (40 nibbles) of zero.
|
||||
|
||||
_property: constants.HashZero
|
||||
_property: ethers.constants.HashZero => string<[[DataHexString]]<32>> @<constants-HashZero> @SRC<constants>
|
||||
The Hash Zero, which is 32 bytes (64 nibbles) of zero.
|
||||
|
||||
|
||||
_subsection: Strings
|
||||
|
||||
_property: constants.EtherSymbol
|
||||
_property: ethers.constants.EtherSymbol => string @<constants-EtherSymbol> @SRC<constants>
|
||||
The Ether symbol, **Ξ**.
|
||||
|
||||
|
||||
_subsection: BigNumber
|
||||
|
||||
_property: constants.NegativeOne
|
||||
_property: ethers.constants.NegativeOne => [[BigNumber]] @<constants-NegativeOne> @SRC<constants>
|
||||
The BigNumber value representing ``"-1"``.
|
||||
|
||||
_property: constants.Zero
|
||||
_property: ethers.constants.Zero => [[BigNumber]] @<constants-Zero> @SRC<constants>
|
||||
The BigNumber value representing ``"0"``.
|
||||
|
||||
_property: constants.One
|
||||
_property: ethers.constants.One => [[BigNumber]] @<constants-One> @SRC<constants>
|
||||
The BigNumber value representing ``"1"``.
|
||||
|
||||
_property: constants.Two
|
||||
_property: ethers.constants.Two => [[BigNumber]] @<constants-Two> @SRC<constants>
|
||||
The BigNumber value representing ``"2"``.
|
||||
|
||||
_property: constants.WeiPerEther
|
||||
_property: ethers.constants.WeiPerEther => [[BigNumber]] @<constants-WeiPerEther> @SRC<constants>
|
||||
The BigNumber value representing ``"1000000000000000000"``, which is the
|
||||
number of Wei per Ether.
|
||||
|
||||
_property: constants.MaxUint256
|
||||
_property: ethers.constants.MaxUint256 => [[BigNumber]] @<constants-MaxUint256> @SRC<constants>
|
||||
The BigNumber value representing the maximum ``uint256`` value.
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
_title: Display Logic and Input
|
||||
|
||||
_section: Display Logic and Input
|
||||
|
||||
When creating an Application, it is useful to convert between
|
||||
@@ -12,10 +10,10 @@ 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.
|
||||
|
||||
|
||||
@@ -23,46 +21,52 @@ _subsection: Units
|
||||
|
||||
_heading: Decimal Count
|
||||
|
||||
The //unit// specified may be an integer, which indicates how
|
||||
many decimal place the unit has. For example, 1 ether has 18 decimal
|
||||
places for wei, and if this library were used with Bitcoin, 1 BTC
|
||||
has 8 decimal places for satoshis.
|
||||
A **Unit** can be specified as an number, which indicates the
|
||||
number of decimal places that should be used.
|
||||
|
||||
**Examples:**
|
||||
|
||||
- 1 ether in wei, has **18** decimal places (i.e. 1 ether represents 10^^18^^ wei)
|
||||
- 1 bitcoin in Satoshi, has **8** decimal places (i.e. 1 bitcoin represents 10^^8^^ satoshi)
|
||||
|
||||
_heading: Named Units
|
||||
|
||||
In addition to specifying //unit// as a number of decimals, there
|
||||
are several common units, which can be passed in as a string:
|
||||
There are also several common **Named Units**, in which case their name (as
|
||||
a string) may be used.
|
||||
|
||||
- **wei** --- 0
|
||||
- **kwei** --- 3
|
||||
- **mwei** --- 6
|
||||
- **gwei** --- 9
|
||||
- **szabo** --- 12
|
||||
- **finney** --- 15
|
||||
- **ether** --- 18
|
||||
_table: @STYLE<compact>
|
||||
|
||||
| **Name** | **Decimals** |
|
||||
| //wei// | 0 |
|
||||
| //kwei// | 3 |
|
||||
| //mwei// | 6 |
|
||||
| //gwei// | 9 |
|
||||
| //szabo// | 12 |
|
||||
| //finney// | 15 |
|
||||
| //ether// | 18 |
|
||||
|
||||
|
||||
_subsection: Functions
|
||||
|
||||
_heading: Formatting
|
||||
|
||||
_property: utils.commify(value) => string
|
||||
_property: ethers.utils.commify(value) => string @<utils-commify> @SRC<units>
|
||||
Returns a string with value grouped by 3 digits, separated by ``,``.
|
||||
|
||||
|
||||
_heading: Conversion @<unit-conversion>
|
||||
|
||||
_property: utils.formatUnits(value [ , unit = "ether" ] ) => string
|
||||
_property: ethers.utils.formatUnits(value [ , unit = "ether" ] ) => string @<utils-formatUnits> @SRC<units>
|
||||
Returns a string representation of //value// formatted with //unit//
|
||||
digits (if it is a number) or to the unit specified (if a string).
|
||||
|
||||
_property: utils.formatEther(value) => string
|
||||
_property: ethers.utils.formatEther(value) => string @<utils-formatEther> @SRC<units>
|
||||
The equivalent to calling ``formatUnits(value, "ether")``.
|
||||
|
||||
_property: utils.parseUnits(value [ , unit = "ether" ] ) => [BigNumber](bignumber)
|
||||
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: utils.parseEther(value) => [BigNumber](bignumber)
|
||||
_property: ethers.utils.parseEther(value) => [BigNumber](BigNumber) @<utils-parseEther> @SRC<units>
|
||||
The equivalent to calling ``parseUnits(value, "ether")``.
|
||||
|
||||
49
docs.wrm/api/utils/encoding.wrm
Normal file
49
docs.wrm/api/utils/encoding.wrm
Normal file
@@ -0,0 +1,49 @@
|
||||
_section: Encoding Utilities @<encoding>
|
||||
|
||||
_subsection: Base58 @<Bse58> @SRC<basex:Base58>
|
||||
|
||||
_property: ethers.utils.base58.decode(textData) => Uin8Array
|
||||
Return a typed Uint8Array representation of //textData// decoded using
|
||||
base-58 encoding.
|
||||
|
||||
_property: ethers.utils.base58.encode(aBytesLike) => string
|
||||
Return //aBytesLike// encoded as a string using the base-58 encoding.
|
||||
|
||||
|
||||
_subsection: Base64 @<Base64>
|
||||
|
||||
_property: ethers.utils.base64.decode(textData) => Uin8Array @SRC<base64>
|
||||
Return a typed Uint8Array representation of //textData// decoded using
|
||||
base-64 encoding.
|
||||
|
||||
_property: ethers.utils.base64.encode(aBytesLike) => string @SRC<base64>
|
||||
Return //aBytesLike// encoded as a string using the base-64 encoding.
|
||||
|
||||
|
||||
_subsection: Recursive-Length Prefix @<rlp--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]]> @<utils-rlpEncode> @SRC<rlp>
|
||||
Encode a structured Data Object into its RLP-encoded representation.
|
||||
|
||||
Each Data component may be an valid [[BytesLike]].
|
||||
|
||||
_property: ethers.utils.RLP.decode(aBytesLike) => [DataObject](rlp--dataobject) @<utils.rlpDecode> @SRC<rlp>
|
||||
Decode an RLP-encoded //aBytesLike// into its structured Data Object.
|
||||
|
||||
All Data components will be returned as a [[DataHexString]].
|
||||
|
||||
_heading: Data Object @<rlp--dataobject>
|
||||
|
||||
A **Data Object** is a recursive structure which is used to serialize many
|
||||
internal structures in Ethereum. Each **Data Object** can either be:
|
||||
|
||||
- Binary Data
|
||||
- An Array of **Data Objects** (i.e. this recursively includes Nesting)
|
||||
|
||||
_definition: **Examples**
|
||||
|
||||
- ``"0x1234"``
|
||||
- ``[ "0x1234", [ "0xdead", "0xbeef" ], [ ] ]``
|
||||
@@ -1,80 +1,132 @@
|
||||
_title: Fixed Number
|
||||
_section: FixedNumber @<FixedNumber>
|
||||
|
||||
_section: FixedNumber @<fixednumber>
|
||||
|
||||
|
||||
_subsection: Types
|
||||
|
||||
|
||||
_heading: FixedFormat @<fixedformat>
|
||||
TODO
|
||||
|
||||
_definition: **//"fixed"//**
|
||||
A shorthand for ``fixed128x80``.
|
||||
A **FixedNumber** is a fixed-width (in bits) number with an internal
|
||||
base-10 divisor, which allows it to represent a decimal fractional
|
||||
component.
|
||||
|
||||
_subsection: Creating Instances
|
||||
|
||||
The FixedNumber constructor cannot be called directly. There are several
|
||||
static methods for creating a FixedNumber.
|
||||
|
||||
_property: BigNumber.from(value [ , format = "fixed" ] ) => [[fixednumber]]
|
||||
_property: FixedNumber.from(value [ , format = "fixed" ] ) => [[FixedNumber]] @SRC<bignumber:FixedNumber.from>
|
||||
Returns an instance of a **FixedNumber** for //value// as a //format//.
|
||||
|
||||
_property: BigNumber.fromBytes(aBytesLike [ , format = "fixed" ] ) => [[fixednumber]]
|
||||
_property: FixedNumber.fromBytes(aBytesLike [ , format = "fixed" ] ) => [[FixedNumber]] @SRC<bignumber>
|
||||
Returns an instance of a **FixedNumber** for //value// as a //format//.
|
||||
|
||||
_property: BigNumber.fromString(value [ , format = "fixed" ] ) => [[fixednumber]]
|
||||
_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: BigNumber.fromValue(value [ , decimals = 0 [ , format = "fixed" ] ] ) => [[fixednumber]]
|
||||
_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]]
|
||||
_property: fixednumber.addUnsafe(otherValue) => [[FixedNumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// **+** //otherValue//.
|
||||
|
||||
_property: fixednumber.subUnsafe(otherValue) => [[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]]
|
||||
_property: fixednumber.mulUnsafe(otherValue) => [[FixedNumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// **×** //otherValue//.
|
||||
|
||||
_property: fixednumber.divUnsafe(otherValue) => [[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]]
|
||||
_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]]
|
||||
_property: fixednumber.toFormat(format) => [[FixedNumber]] @SRC<bignumber/fixednumber>
|
||||
Returns a new FixedNumber with the value of //fixedvalue// with //format//.
|
||||
|
||||
_property: fixednumber.toHexString() => string
|
||||
Returns a [Hexstring](hexstring) representation of //fixednumber//.
|
||||
_property: fixednumber.toHexString() => string @SRC<bignumber/fixednumber>
|
||||
Returns a [[HexString]] representation of //fixednumber//.
|
||||
|
||||
_property: fixednumber.toString() => string
|
||||
_property: fixednumber.toString() => string @SRC<bignumber/fixednumber>
|
||||
Returns a string representation of //fixednumber//.
|
||||
|
||||
_property: fixednumber.toUnsafeFloat() => float
|
||||
_property: fixednumber.toUnsafeFloat() => float @SRC<bignumber/fixednumber>
|
||||
Returns a floating-point JavaScript number value of //fixednumber//.
|
||||
Due to rounding in JavaScript numbers, the value is only approximate.
|
||||
|
||||
|
||||
_heading: Inspection
|
||||
|
||||
_property: BigNumber.isFixedNumber(value) => boolean
|
||||
_property: FixedNumber.isFixedNumber(value) => boolean @SRC<bignumber/fixednumber>
|
||||
Returns true if and only if //value// is a **FixedNumber**.
|
||||
|
||||
|
||||
_subsection: FixedFormat @<FixedFormat>
|
||||
|
||||
A **FixedFormat** is a simple object which represents a decimal
|
||||
(base-10) Fixed-Point data representation. Usually using this
|
||||
class directly is uneccessary, as passing in a [[FixedFormat--strings]]
|
||||
directly into the [[FixedNumber]] will automatically create this.
|
||||
|
||||
_heading: Format Strings @<FixedFormat--strings>
|
||||
|
||||
A format string is composed of three components, including signed-ness,
|
||||
bit-width and number of decimals.
|
||||
|
||||
A signed format string begins with ``fixed``, which an unsigned format
|
||||
string begins with ``ufixed``, followed by the width (in bits) and the
|
||||
number of decimals.
|
||||
|
||||
The width must be conguent to 0 mod 8 (i.e. ``(width % 8) == 0``) and no
|
||||
larger than 256 bits and the number of decimals must be no larger than 80.
|
||||
|
||||
For example:
|
||||
|
||||
- **fixed128x18** is signed, 128 bits wide and has 18 decimals; this is useful for most purposes
|
||||
- **fixed32x0** is signed, 32 bits wide and has 0 decimals; this would be the same as a ``int32_t`` in C
|
||||
- **ufixed32x0** is unsigned, 32 bits wide and has 0 decimals; this would be the same as a ``uint32_t`` in C
|
||||
- **fixed** is shorthand for ``fixed128x18``
|
||||
- **ufixed** is shorthand for ``ufixed128x18``
|
||||
|
||||
_heading: Creating Instances
|
||||
|
||||
_property: FixedFormat.from(value = "fixed128x18") => [[FixedFormat]] @<FixedNumber-from> @SRC<bignumber/fixednumber:FixedFormat.from>
|
||||
|
||||
Returns a new instance of a **FixedFormat** defined by //value//. Any valid [[FixedFormat--strings]]
|
||||
may be passed in as well as any object which has any of ``signed``, ``width`` and ``decimals``
|
||||
defined, including a [[FixedFormat]] object.
|
||||
|
||||
_heading: Properties
|
||||
|
||||
_property: fixedFormat.signed => boolean
|
||||
The signed-ness of //fixedFormat//, true if negative values are supported.
|
||||
|
||||
_property: fixedFormat.width => number
|
||||
The width (in bits) of //fixedFormat//.
|
||||
|
||||
_property: fixedFormat.decimals => number
|
||||
The number of decimal points of //fixedFormat//.
|
||||
|
||||
_property: fixedFormat.name => string
|
||||
The name of the //fixedFormat//, which can be used to recreate the format
|
||||
and is the string that the Solidity language uses to represent this format.
|
||||
|
||||
_definition: **//"fixed"//**
|
||||
A shorthand for ``fixed128x80``.
|
||||
|
||||
|
||||
@@ -1,71 +1,189 @@
|
||||
_title: Hashing
|
||||
|
||||
_section: Hashing Algorithms
|
||||
_section: Hashing Algorithms @<hashing-algorithms>
|
||||
|
||||
Explain what hash functions are?
|
||||
|
||||
|
||||
_subsection: Cryptographic Hashing
|
||||
_subsection: Cryptographic Hash Functions @<cryptographic-hash-functions>
|
||||
|
||||
The [Cryptographic Hash Functions](https://en.wikipedia.org/wiki/Cryptographic_hash_function)
|
||||
The [Cryptographic Hash Functions](link-wiki-cryptographichash)
|
||||
are a specific family of hash functions.
|
||||
|
||||
_property: utils.keccak256(aBytesLike) => string
|
||||
Returns the [KECCAK256](https://en.wikipedia.org/wiki/SHA-3) digest //aBytesLike//.
|
||||
_property: ethers.utils.id(text) => string<[[DataHexString]]<32>> @<utils-id> @SRC<hash>
|
||||
The Ethereum Identity function computs the [KECCAK256](link-wiki-sha3) hash of the //text// bytes.
|
||||
|
||||
_property: utils.ripemd160(aBytesLike) => string
|
||||
Returns the [RIPEMD-160](https://en.m.wikipedia.org/wiki/RIPEMD) digest of //aBytesLike//.
|
||||
_property: ethers.utils.keccak256(aBytesLike) => string<[[DataHexString]]<32>> @<utils-keccak256> @SRC<keccak256>
|
||||
Returns the [KECCAK256](link-wiki-sha3) digest //aBytesLike//.
|
||||
|
||||
_property: utils.sha256(aBytesLike) => string
|
||||
Returns the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) digest of //aBytesLike//.
|
||||
_property: ethers.utils.ripemd160(aBytesLike) => string<[[DataHexString]]<20>> @<utils-ripemd160> @SRC<sha2>
|
||||
Returns the [RIPEMD-160](link-wiki-ripemd) digest of //aBytesLike//.
|
||||
|
||||
_property: utils.sha512(aBytesLike) => string
|
||||
Returns the [SHA2-512](https://en.wikipedia.org/wiki/SHA-2) digest of //aBytesLike//.
|
||||
_property: ethers.utils.sha256(aBytesLike) => string<[[DataHexString]]<32>> @<utils-sha256> @SRC<sha2:function.sha256>
|
||||
Returns the [SHA2-256](link-wiki-sha2) digest of //aBytesLike//.
|
||||
|
||||
_property: utils.computeHmac(algorithm, key, data) => string
|
||||
Returns the [HMAC](https://en.wikipedia.org/wiki/HMAC) of //data// with //key//
|
||||
using the [Algorithm](supported-algorithm) //algorithm//.
|
||||
_property: ethers.utils.sha512(aBytesLike) => string<[[DataHexString]]<64>> @<utils-sha512> @SRC<sha2:function.sha512>
|
||||
Returns the [SHA2-512](link-wiki-sha2) digest of //aBytesLike//.
|
||||
|
||||
_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")
|
||||
//!
|
||||
|
||||
|
||||
_heading: HMAC Supported Algorithms @<supported-algorithm>
|
||||
_subsection: HMAC @<utils--hmac>
|
||||
|
||||
_property: utils.SupportedAlgorithms.sha256
|
||||
Use the [SHA2-256](https://en.wikipedia.org/wiki/SHA-2) hash algorithm.
|
||||
_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](utils--hmac-supported-algorithm) //algorithm//.
|
||||
|
||||
_property: utils.SupportedAlgorithms.sha512
|
||||
Use the [SHA2-512](https://en.wikipedia.org/wiki/SHA-2) hash algorithm.
|
||||
_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.
|
||||
|
||||
_property: ethers.utils.SupportedAlgorithm.sha512 => string
|
||||
Use the [SHA2-512](link-wiki-sha2) hash algorithm.
|
||||
|
||||
_code: HMAC @lang<javascript>
|
||||
|
||||
const key = "0x0102";
|
||||
const data = "0x1234";
|
||||
utils.computeHmac("sha256", key, data)
|
||||
//!
|
||||
|
||||
|
||||
_subsection: Common Hashing Helpers
|
||||
_subsection: Hashing Helpers @<utils--hashing-helpers>
|
||||
|
||||
_property: utils.hashMessage(message) => string
|
||||
Computes the Ethereum message digest of //message//. Ethereum messages are
|
||||
converted to UTF-8 bytes and prefixed with ``\x19Ethereum Signed Message:``
|
||||
_property: ethers.utils.hashMessage(message) => string<[[DataHexString]]<32>> @<utils-hashMessage> @SRC<hash>
|
||||
Computes the [[link-eip-191]] personal message digest of //message//. Personal messages are
|
||||
converted to UTF-8 bytes and prefixed with ``\\x19Ethereum Signed Message:``
|
||||
and the length of //message//.
|
||||
|
||||
_property: utils.id(text) => string
|
||||
The Ethereum Identity function computs the keccak256 hash of the //text// bytes.
|
||||
_property: ethers.utils.namehash(name) => string<[[DataHexString]]<32>> @<utils-namehash> @SRC<hash>
|
||||
Returns the [ENS Namehash](link-namehash) of //name//.
|
||||
|
||||
_property: utils.namehash(name) => string
|
||||
Returns the [ENS Namehash](https://docs.ens.domains/contract-api-reference/name-processing#hashing-names) of //name//.
|
||||
_code: Hashing Messages @lang<javascript>
|
||||
|
||||
// @TODO: include examples of hashMessage; it can be complex. :)
|
||||
|
||||
|
||||
_subsection: Solidity Hashing Algorithms
|
||||
_code: Namehash @lang<javascript>
|
||||
|
||||
utils.namehash("")
|
||||
//!
|
||||
|
||||
utils.namehash("eth")
|
||||
//!
|
||||
|
||||
utils.namehash("ricmoo.firefly.eth")
|
||||
//!
|
||||
|
||||
utils.namehash("ricmoo.xyz")
|
||||
//!
|
||||
|
||||
|
||||
_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: utils.solidityPack(arrayOfTypes, arrayOfValues) => string
|
||||
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 respecive type in //types//.
|
||||
|
||||
_property: utils.solidityKeccak256(arrayOfTypes, arrayOfValues) => string
|
||||
Returns the KECCAK256 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: utils.soliditySha256(arrayOfTypes, arrayOfValues) => string
|
||||
Returns the SHA2-256 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 ])
|
||||
//!
|
||||
|
||||
|
||||
125
docs.wrm/api/utils/hdnode.wrm
Normal file
125
docs.wrm/api/utils/hdnode.wrm
Normal file
@@ -0,0 +1,125 @@
|
||||
_section: HD Wallet @<hdnodes>
|
||||
|
||||
TODO: Explain [BIP32](link-bip-32) [BIP-39](link-bip-39) and whatnot here...
|
||||
|
||||
_subsection: Types
|
||||
|
||||
_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 @<Mnemonic>
|
||||
|
||||
_property: mnemonic.phrase => string
|
||||
The mnemonic phrase for this mnemonic. It is 12, 15, 18, 21 or 24 words long
|
||||
and separated by the whitespace specified by the ``locale``.
|
||||
|
||||
_property: mnemonic.path => string
|
||||
The HD path for this mnemonic.
|
||||
|
||||
_property: mnemonic.locale => string
|
||||
The language of the wordlist this mnemonic is using.
|
||||
|
||||
|
||||
_subsection: HDNode @<HDNode> @SRC<hdnode:class.HDNode>
|
||||
|
||||
_heading: Creating Instances @<HDNode--creating>
|
||||
|
||||
_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]] @<HDNode-fromSeed> @SRC<hdnode>
|
||||
Return the [[HDNode]] for the seed //aBytesLike//.
|
||||
|
||||
_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 @<HDNode--properties>
|
||||
|
||||
_property: hdNode.privateKey => string<[[DataHexString]]<32>>
|
||||
The private key for this HDNode.
|
||||
|
||||
_property: hdNode.publicKey => string<[[DataHexString]]<33>>
|
||||
The (compresses) public key for this HDNode.
|
||||
|
||||
_property: hdNode.fingerprint => string<[[DataHexString]]<4>>
|
||||
The fingerprint is meant as an index to quickly match parent and
|
||||
children nodes together, however collisions may occur and software
|
||||
should verify matching nodes.
|
||||
|
||||
Most developers will not need to use this.
|
||||
|
||||
_property: hdNode.parentFingerprint => string<[[DataHexString]]<4>>
|
||||
The fingerprint of the parent node. See //fingerprint// for more
|
||||
details.
|
||||
|
||||
Most developers will not need to use this.
|
||||
|
||||
_property: hdNode.address => string<[[address]]>
|
||||
The address of this HDNode.
|
||||
|
||||
_property: hdNode.mnemonic => [[Mnemonic]]
|
||||
The mnemonic of this HDNode, if known.
|
||||
|
||||
_property: hdNode.path => string
|
||||
The path of this HDNode, if known. If the //mnemonic// is also known,
|
||||
this will match ``mnemonic.path``.
|
||||
|
||||
_property: hdNode.chainCode => string<[[DataHexString]]<32>>
|
||||
The chain code is used as a non-secret private key which is then used
|
||||
with EC-multiply to provide the ability to derive addresses without
|
||||
the private key of child non-hardened nodes.
|
||||
|
||||
Most developers will not need to use this.
|
||||
|
||||
_property: hdNode.index => number
|
||||
The index of this HDNode. This will match the last component of
|
||||
the //path//.
|
||||
|
||||
Most developers will not need to use this.
|
||||
|
||||
_property: hdNode.depth => number
|
||||
The depth of this HDNode. This will match the number of components
|
||||
(less one, the ``m/``) of the //path//.
|
||||
|
||||
Most developers will not need to use this.
|
||||
|
||||
_property: hdNode.extendedKey => string
|
||||
A serialized string representation of this HDNode. Not all properties
|
||||
are included in the serialization, such as the mnemonic and path, so
|
||||
serializing and deserializing (using the ``fromExtendedKey`` class
|
||||
method) will result in reduced information.
|
||||
|
||||
|
||||
_heading: Methods @<HDNode--methods>
|
||||
|
||||
_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
|
||||
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]] @<HDNode-derivePath> @SRC<hdnode>
|
||||
Return a new [[HDNode]] which is the child of //hdNode// found
|
||||
by deriving //path//.
|
||||
|
||||
|
||||
|
||||
_subsection: Other Functions @<HDNode--utilities>
|
||||
|
||||
_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]]> @<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 @<utils-isValidMnemonic> @SRC<hdnode>
|
||||
Returns true if //phrase// is a valid mnemonic phrase, by
|
||||
testing the checksum.
|
||||
@@ -1,16 +1,23 @@
|
||||
_title: Utilities
|
||||
|
||||
_section: Utilities
|
||||
|
||||
These utilities are used extensively within the library, but
|
||||
are also quite useful for application developers.
|
||||
|
||||
_toc:
|
||||
abi
|
||||
address
|
||||
bignumber
|
||||
bytes
|
||||
constants
|
||||
display-logic
|
||||
encoding
|
||||
fixednumber
|
||||
hashing
|
||||
hdnode
|
||||
logger
|
||||
properties
|
||||
signing-key
|
||||
strings
|
||||
transactions
|
||||
web
|
||||
wordlists
|
||||
|
||||
208
docs.wrm/api/utils/logger.wrm
Normal file
208
docs.wrm/api/utils/logger.wrm
Normal file
@@ -0,0 +1,208 @@
|
||||
_section: Logging @<logging>
|
||||
|
||||
These are just a few simple logging utilities provided to simplify
|
||||
and standardize the error facilities across the Ethers library.
|
||||
|
||||
The [[Logger]] library has zero dependencies and is intentionally
|
||||
very light so it can be easily included in each library.
|
||||
|
||||
The [Censorship](Logger--censorship) functionality relies on one instance
|
||||
of the Ethers library being included. In large bundled packages or when
|
||||
``npm link`` is used, this may not be the case. If you require this
|
||||
functionality, ensure that your bundling is configured properly.
|
||||
|
||||
|
||||
_subsection: Logger @<Logger> @SRC<logger:class.Logger>
|
||||
|
||||
_property: new ethers.utils.Logger(version) @SRC<logger:constructor.Logger>
|
||||
Create a new logger which will include //version// in all errors thrown.
|
||||
|
||||
_property: Logger.globalLogger() => [[Logger]] @SRC<logger>
|
||||
Returns the singleton global logger.
|
||||
|
||||
|
||||
_heading: Logging Output
|
||||
|
||||
_property: logger.debug(...args) => void @SRC<logger>
|
||||
Log debugging information.
|
||||
|
||||
_property: logger.info(...args) => void @SRC<logger>
|
||||
Log generic information.
|
||||
|
||||
_property: logger.warn(...args) => void @SRC<logger>
|
||||
Log warnings.
|
||||
|
||||
|
||||
_heading: Errors
|
||||
|
||||
These functions honor the current [Censorship](Logger--censorship) and help create
|
||||
a standard error model for detecting and processing errors within Ethers.
|
||||
|
||||
_property: logger.makeError(message [ , code = UNKNOWN_ERROR [ , params ] ]) => Error @SRC<logger>
|
||||
Create an Error object with //message// and an optional //code// and
|
||||
additional //params// set. This is useful when an error is needed to be
|
||||
rejected instead of thrown.
|
||||
|
||||
_property: logger.throwError(message [ , code = UNKNOWN_ERROR [ , params ] ]) => never @SRC<logger>
|
||||
Throw an Error with //message// and an optional //code// and
|
||||
additional //params// set.
|
||||
|
||||
_property: logger.throwArgumentError(message, name, value) => never @SRC<logger>
|
||||
Throw an [INVALID_ARGUMENT](errors-InvalidArgument) Error with //name// and //value//.
|
||||
|
||||
|
||||
_heading: Usage Validation
|
||||
|
||||
There can be used to ensure various properties and actions are safe.
|
||||
|
||||
_property: logger.checkAbstract(target, kind) => void @SRC<logger>
|
||||
Checks that //target// is not //kind// and performs the same operatons
|
||||
as ``checkNew``. This is useful for ensuring abstract classes are not
|
||||
being instantiated.
|
||||
|
||||
_property: logger.checkArgumentCount(count, expectedCound [ , message) => void @SRC<logger>
|
||||
If //count// is not equal to //expectedCount//, throws a [MISSING_ARGUMENT](errors-MissingArgument)
|
||||
or [UNEXPECTED_ARGUMENT](errors-UnexpectedArgument) error.
|
||||
|
||||
_property: logger.checkNew(target, kind) => void @SRC<logger>
|
||||
If //target// is not a valid ``this`` or ``target`` value, throw a
|
||||
[MISSING_NEW](errors-MissingNew) error. This is useful to ensure
|
||||
callers of a Class are using ``new``.
|
||||
|
||||
_property: logger.checkNormalize(message) => void @SRC<logger>
|
||||
Check that the environment has a correctly functioning [[link-js-normalize]]. If not, a
|
||||
[UNSUPPORTED_OPERATION](errors-UnsupportedOperation) error is thrown.
|
||||
|
||||
_property: logger.checkSafeUint53(value [, message ]) => void @SRC<logger>
|
||||
If //value// is not safe as a [JavaScript number](link-wiki-ieee754), throws a
|
||||
[NUMERIC_FAULT](errors-NumericFault) error.
|
||||
|
||||
|
||||
_heading: Censorship @<Logger--censorship>
|
||||
|
||||
_property: Logger.setCensorship(censor [ , permanent = false ]) => void @SRC<logger>
|
||||
Set error censorship, optionally preventing errors from being uncensored.
|
||||
|
||||
In production applications, this prevents any error from leaking information
|
||||
by masking the message and values of errors.
|
||||
|
||||
This can impact debugging, making it substantially more difficult.
|
||||
|
||||
_property: Logger.setLogLevel(logLevel) => void @SRC<logger>
|
||||
Set the log level, to suppress logging output below a [particular log level](Logger-levels).
|
||||
|
||||
|
||||
_subsection: Errors @<errors>
|
||||
|
||||
Every error in Ethers has a ``code`` value, which is a string that will
|
||||
match one of the following error codes.
|
||||
|
||||
|
||||
_heading: Generic Error Codes
|
||||
|
||||
_property: Logger.errors.NOT_IMPLEMENTED
|
||||
The operation is not implemented.
|
||||
|
||||
_property: Logger.errors.SERVER_ERROR
|
||||
There was an error communicating with a server.
|
||||
|
||||
_property: Logger.errors.TIMEOUT @<errors-Timeout>
|
||||
A timeout occurred.
|
||||
|
||||
_property: Logger.errors.UNKNOWN_ERROR @<errors-UnknownError>
|
||||
A generic unknown error.
|
||||
|
||||
_property: Logger.errors.UNSUPPORTED_OPERATION @<errors-UnsupportedOperation>
|
||||
The operation is not supported.
|
||||
|
||||
|
||||
_heading: Safety Error Codes
|
||||
|
||||
_property: Logger.errors.BUFFER_OVERRUN
|
||||
The amount of data needed is more than the amount of data required,
|
||||
which would cause the data buffer to read past its end.
|
||||
|
||||
_property: Logger.errors.NUMERIC_FAULT @<errors-NumericFault>
|
||||
There was an invalid operation done on numeric values.
|
||||
|
||||
Common cases of this occur when there is [[link-wiki-overflow]],
|
||||
[[link-wiki-underflow]] in fixed numeric types or division by zero.
|
||||
|
||||
|
||||
_heading: Usage Error Codes
|
||||
|
||||
_property: Logger.errors.INVALID_ARGUMENT @<errors-InvalidArgument>
|
||||
The type or value of an argument is invalid. This will generally also
|
||||
include the ``name`` and ``value`` of the argument. Any function which
|
||||
accepts sensitive data (such as a private key) will include the string
|
||||
``[\[REDACTED]\]`` instead of the value passed in.
|
||||
|
||||
_property: Logger.errors.MISSING_ARGUMENT @<errors-MissingArgument>
|
||||
An expected parameter was not specified.
|
||||
|
||||
_property: Logger.errors.MISSING_NEW @<errors-MissingNew>
|
||||
An object is a Class, but is now being called with ``new``.
|
||||
|
||||
_property: Logger.errors.UNEXPECTED_ARGUMENT @<errors-UnexpectedArgument>
|
||||
Too many parameters we passed into a function.
|
||||
|
||||
|
||||
_heading: Ethereum Error Codes
|
||||
|
||||
_property: Logger.errors.CALL_EXCEPTION
|
||||
An attempt to call a blockchain contract (getter) resulted in a
|
||||
revert or other error.
|
||||
|
||||
_property: Logger.errors.INSUFFICIENT_FUNDS
|
||||
The account is attempting to make a transaction which costs more than is
|
||||
available.
|
||||
|
||||
A sending account must have enough ether to pay for the value, the gas limit
|
||||
(at the gas price) as well as the intrinsic cost of data. The intrinsic cost
|
||||
of data is 4 gas for each zero byte and 68 gas for each non-zero byte.
|
||||
|
||||
_property: Logger.errors.NETWORK_ERROR
|
||||
An Ethereum network validation error, such as an invalid chain ID.
|
||||
|
||||
_property: Logger.errors.NONCE_EXPIRED
|
||||
The nonce being specified has already been used in a mined transaction.
|
||||
|
||||
_property: Logger.errors.REPLACEMENT_UNDERPRICED
|
||||
When replacing a transaction, by using a nonce which has already been sent to
|
||||
the network, but which has not been mined yet the new transaction must specify
|
||||
a higher gas price.
|
||||
|
||||
This error occurs when the gas price is insufficient to //bribe// the transaction
|
||||
pool to prefer the new transaction over the old one. Generally, the new gas price
|
||||
should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the
|
||||
replacement should be 15.000000001 gwei.
|
||||
|
||||
_property: Logger.errors.UNPREDICTABLE_GAS_LIMIT
|
||||
When estimating the required amount of gas for a transaction, a node is queried for
|
||||
its best guess.
|
||||
|
||||
If a node is unable (or unwilling) to predict the cost, this error occurs.
|
||||
|
||||
The best remedy for this situation is to specify a gas limit in the transaction
|
||||
manually.
|
||||
|
||||
This error can also indicate that the transaction is expected to fail regardless,
|
||||
if for example an account with no tokens is attempting to send a token.
|
||||
|
||||
|
||||
_subsection: Log Levels @<Logger-levels>
|
||||
|
||||
_property: Logger.levels.DEBUG
|
||||
Log all output, including debugging information.
|
||||
|
||||
_property: Logger.levels.INFO
|
||||
Only log output for infomational, warnings and errors.
|
||||
|
||||
_property: Logger.levels.WARNING
|
||||
Only log output for warnings and errors.
|
||||
|
||||
_property: Logger.levels.ERROR
|
||||
Only log output for errors.
|
||||
|
||||
_property: Logger.levels.OFF
|
||||
Do not output any logs.
|
||||
9
docs.wrm/api/utils/properties.wrm
Normal file
9
docs.wrm/api/utils/properties.wrm
Normal file
@@ -0,0 +1,9 @@
|
||||
_section: Property Utilities
|
||||
|
||||
_property: ethers.utils.checkProperties() => void
|
||||
|
||||
_property: ethers.utils.deepCopy(anObject) => any
|
||||
_property: ethers.utils.defineReadOnly(anObject, name, value) => void
|
||||
_property: ethers.utils.getStatic(aConstructor, key) => any
|
||||
_property: ethers.utils.resolveProperties(anObject) => Promise<any> @<utils-resolveproperties> @SRC<properties>
|
||||
_property: ethers.utils.shallowCopy(anObject) => any
|
||||
47
docs.wrm/api/utils/signing-key.wrm
Normal file
47
docs.wrm/api/utils/signing-key.wrm
Normal file
@@ -0,0 +1,47 @@
|
||||
_section: Signing Key @<SigningKey>
|
||||
|
||||
_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>>
|
||||
The private key for this Signing Key.
|
||||
|
||||
_property: signingKey.publicKey => string<[[DataHexString]]<65>>
|
||||
The uncompressed public key for this Signing Key. It will always be
|
||||
65 bytes (130 nibbles) and begine with ``0x04``.
|
||||
|
||||
_property: signingKey.compressedPublicKey => string<[[DataHexString]]<33>>
|
||||
The compressed public key for this Signing Key. It will always be
|
||||
33 bytes (66 nibbles) and begine with either ``0x02`` or ``0x03``.
|
||||
|
||||
_property: signingKey.signDigest(digest) => [[Signature]]
|
||||
Sign the //digest// and return the signature.
|
||||
|
||||
_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.
|
||||
|
||||
It is best practice that each party computes the hash of this before using it
|
||||
as a symmetric key.
|
||||
|
||||
_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>
|
||||
Returns the address that signed //message// producing //signature//. The
|
||||
signature may have a non-canonical v (i.e. does not need to be 27 or 28),
|
||||
in which case it will be normalized to compute the `recoveryParam` which
|
||||
will then be used to compute the address; this allows systems which use
|
||||
the v to encode additional data (such as [EIP-155](link-eip-155))
|
||||
to be used since the v parameter is still completely non-ambiguous.
|
||||
|
||||
_property: ethers.utils.recoverPublicKey(digest, signature) => string<[[DataHexString]]<65>> @<utils-recoverPublicKey>
|
||||
|
||||
_property: ethers.utils.computePublicKey(key [, compressed = false ]) => string<[[DataHexString]]> @<utils-computePublicKey>
|
||||
Computes the public key of //key//, optionally compressing it. The //key//
|
||||
can be any form of public key (compressed or uncompressed) or a private
|
||||
key.
|
||||
@@ -1,11 +1,9 @@
|
||||
_title: Strings
|
||||
|
||||
_section: Strings
|
||||
_section: Strings @<strings>
|
||||
|
||||
Tra la la
|
||||
|
||||
|
||||
_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)
|
||||
@@ -17,55 +15,57 @@ single word (32 bytes). Since we need only a single byte for the
|
||||
null termination, we can store strings up to 31 bytes long in a
|
||||
word.
|
||||
|
||||
_definition: **Note:**
|
||||
_note: Note
|
||||
Strings that are 31 __//bytes//__ long may contain fewer than 31 __//characters//__,
|
||||
since UTF-8 requires multiple bytes to encode international characters.
|
||||
|
||||
_property: utils.parseBytes32String(aBytesLike) => string
|
||||
_property: ethers.utils.parseBytes32String(aBytesLike) => string @<utils-parseBytes32> @SRC<strings>
|
||||
Returns the decoded string represented by the ``Bytes32`` encoded data.
|
||||
|
||||
_property: utils.formatBytes32String(text) => string
|
||||
_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: utils.toUtf8Bytes(text [ , form = current ] ) => Uint8Array
|
||||
_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: utils.toUtf8CodePoints(aBytesLike [ , form = current ] ) => Array<number>
|
||||
Returns the Array of codepoints of //aBytesLike//, optionally normalizing it using the
|
||||
[[unicode-normalization-form]] //form//.
|
||||
_property: ethers.utils.toUtf8CodePoints(text [ , form = current ] ) => Array<number> @<utils-toUtf8CodePoints> @SRC<strings>
|
||||
Returns the Array of codepoints of //text//, optionally normalized using the
|
||||
[[strings--unicode-normalization-form]] //form//.
|
||||
|
||||
**Note:** This function correctly splits each user-perceived character into
|
||||
_note: Note
|
||||
This function correctly splits each **user-perceived character** into
|
||||
its codepoint, accounting for surrogate pairs. This should not be confused with
|
||||
``string.split("")``, which destroys surrogate pairs, spliting between each UTF-16
|
||||
codeunit instead.
|
||||
|
||||
_property: utils.toUtf8String(aBytesLike [ , ignoreErrors = false ] ) => string
|
||||
Returns the string represented by the UTF-8 bytes of //aBytesLike//. This will
|
||||
throw an error for invalid surrogates, overlong sequences or other UTF-8 issues,
|
||||
unless //ignoreErrors// is specified.
|
||||
_property: ethers.utils.toUtf8String(aBytesLike [ , onError = error ] ) => string @<utils-toUtf8String> @SRC<strings>
|
||||
Returns the string represented by the UTF-8 bytes of //aBytesLike//.
|
||||
|
||||
The //onError// is a [Custom UTF-8 Error function](strings--error-handling) and if not specified
|
||||
it defaults to the [error](strings--Utf8Error) function, which throws an error
|
||||
on **any** UTF-8 error.
|
||||
|
||||
_heading: UnicodeNormalizationForm @<unicode-normalization-form>
|
||||
_subsection: UnicodeNormalizationForm @<strings--unicode-normalization-form> @SRC<strings/utf8:enum.UnicodeNormalizationForm>
|
||||
|
||||
There are several [commonly used forms](https://en.wikipedia.org/wiki/Unicode_equivalence)
|
||||
There are several [commonly used forms](link-wiki-unicode-equivalence)
|
||||
when normalizing UTF-8 data, which allow strings to be compared or hashed in a stable
|
||||
way.
|
||||
|
||||
_property: utils.UnicodeNormalizationForm.current
|
||||
_property: ethers.utils.UnicodeNormalizationForm.current
|
||||
Maintain the current normalization form.
|
||||
|
||||
_property: utils.UnicodeNormalizationForm.NFC
|
||||
_property: ethers.utils.UnicodeNormalizationForm.NFC
|
||||
The Composed Normalization Form. This form uses single codepoints
|
||||
which represent the fully composed character.
|
||||
|
||||
For example, the **é** is a single codepoint, ``0x00e9``.
|
||||
|
||||
_property: utils.UnicodeNormalizationForm.NFD
|
||||
_property: ethers.utils.UnicodeNormalizationForm.NFD
|
||||
The Decomposed Normalization Form. This form uses multiple codepoints
|
||||
(when necessary) to compose a character.
|
||||
|
||||
@@ -74,7 +74,7 @@ is made up of two codepoints, ``"0x0065"`` (which is the letter ``"e"``)
|
||||
and ``"0x0301"`` which is a special diacritic UTF-8 codepoint which
|
||||
indicates the previous character should have an acute accent.
|
||||
|
||||
_property: utils.UnicodeNormalizationForm.NFKC
|
||||
_property: ethers.utils.UnicodeNormalizationForm.NFKC
|
||||
The Composed Normalization Form with Canonical Equivalence. The Canonical
|
||||
representation folds characters which have the same syntactic representation
|
||||
but different semantic meaning.
|
||||
@@ -82,11 +82,103 @@ but different semantic meaning.
|
||||
For example, the Roman Numeral **I**, which has a UTF-8
|
||||
codepoint ``"0x2160"``, is folded into the capital letter I, ``"0x0049"``.
|
||||
|
||||
_property: utils.UnicodeNormalizationForm.NFKD
|
||||
_property: ethers.utils.UnicodeNormalizationForm.NFKD
|
||||
The Decomposed Normalization Form with Canonical Equivalence.
|
||||
See NFKC for more an example.
|
||||
|
||||
_definition: **Note:**
|
||||
_note: Note
|
||||
Only certain specified characters are folded in Canonical Equivalence, and thus
|
||||
it should not be considered a method to acheive //any// level of security from
|
||||
[homoglyph attacks](https://en.wikipedia.org/wiki/IDN_homograph_attack).
|
||||
it should **not** be considered a method to acheive //any// level of security from
|
||||
[homoglyph attacks](link-wiki-homoglyph).
|
||||
|
||||
|
||||
_subsection: Custom UTF-8 Error Handling @<strings--error-handling>
|
||||
|
||||
When converting a string to its codepoints, there is the possibility
|
||||
of invalid byte sequences. Since certain situations may need specific
|
||||
ways to handle UTF-8 errors, a custom error handling function can be used,
|
||||
which has the signature:
|
||||
|
||||
_property: errorFunction(reason, offset, bytes, output [ , badCodepoint ]) => number
|
||||
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,
|
||||
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 @<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
|
||||
sequence with.
|
||||
|
||||
_property: ethers.utils.Utf8ErrorReason.MISSING_CONTINUE
|
||||
A UTF-8 sequence was begun, but did not have enough continuation
|
||||
bytes for the sequence. For this error the //ofset// is the index
|
||||
at which a continuation byte was expected.
|
||||
|
||||
_property: ethers.utils.Utf8ErrorReason.OUT_OF_RANGE
|
||||
The computed codepoint is outside the range for valid UTF-8
|
||||
codepoints (i.e. the codepoint is greater than 0x10ffff).
|
||||
This reason will pass the computed //badCountpoint// into
|
||||
the custom error function.
|
||||
|
||||
_property: ethers.utils.Utf8ErrorReason.OVERLONG
|
||||
Due to the way UTF-8 allows variable length byte sequences
|
||||
to be used, it is possible to have multiple representations
|
||||
of the same character, which means
|
||||
[overlong sequences](link-wiki-utf8-overlong)
|
||||
allow for a non-distinguished string to be formed, which can
|
||||
impact security as multiple strings that are otherwise
|
||||
equal can have different hashes.
|
||||
|
||||
Generally, overlong sequences are an attempt to circumvent
|
||||
some part of security, but in rare cases may be produced by
|
||||
lazy libraries or used to encode the null terminating
|
||||
character in a way that is safe to include in a ``char*``.
|
||||
|
||||
This reason will pass the computed //badCountpoint// into the
|
||||
custom error function, which is actually a valid codepoint, just
|
||||
one that was arrived at through unsafe methods.
|
||||
|
||||
_property: ethers.utils.Utf8ErrorReason.OVERRUN
|
||||
The string does not have enough characters remaining for the
|
||||
length of this sequence.
|
||||
|
||||
_property: ethers.utils.Utf8ErrorReason.UNEXPECTED_CONTINUE
|
||||
This error is similar to BAD_PREFIX, since a continuation byte
|
||||
cannot begin a valid sequence, but many may wish to process this
|
||||
differently. However, most developers would want to trap this
|
||||
and perform the same operation as a BAD_PREFIX.
|
||||
|
||||
_property: ethers.utils.Utf8ErrorReason.UTF16_SURROGATE
|
||||
The computed codepoint represents a value reserved for
|
||||
UTF-16 surrogate pairs.
|
||||
This reason will pass the computed surrogate half
|
||||
//badCountpoint// into the custom error function.
|
||||
|
||||
|
||||
|
||||
_heading: Provided UTF-8 Error Handling Functions
|
||||
|
||||
There are already several functions available for the most common
|
||||
situations.
|
||||
|
||||
_property: ethers.utils.Utf8ErrorFuncs.error @<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 @<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 @<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),
|
||||
(i.e. U+FFFD).
|
||||
|
||||
118
docs.wrm/api/utils/transactions.wrm
Normal file
118
docs.wrm/api/utils/transactions.wrm
Normal file
@@ -0,0 +1,118 @@
|
||||
_section: Transactions @<transactions>
|
||||
|
||||
_subsection: Types @<transactions--types>
|
||||
|
||||
_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.
|
||||
|
||||
_property: unsignedTransaction.nonce => number
|
||||
The nonce of this transaction.
|
||||
|
||||
_property: unsignedTransaction.gasLimit => [[BigNumberish]]
|
||||
The gas limit for this transaction.
|
||||
|
||||
_property: unsignedTransaction.gasPrice => [[BigNumberish]]
|
||||
The gas price for this transaction.
|
||||
|
||||
_property: unsignedTransaction.data => [[BytesLike]]
|
||||
The data for this transaction.
|
||||
|
||||
_property: unsignedTransaction.value => [[BigNumberish]]
|
||||
The value (in wei) for this transaction.
|
||||
|
||||
_property: unsignedTransaction.chainId => number
|
||||
The chain ID for this transaction. If the chain ID is 0 or null,
|
||||
then [[link-eip-155]] is disabled and legacy signing is
|
||||
used, unless overridden in a signature.
|
||||
|
||||
|
||||
_heading: Transaction @<Transaction>
|
||||
A generic object to represent a transaction.
|
||||
|
||||
_property: transaction.hash => string<[[DataHexString]]<32>>
|
||||
The transaction hash, which can be used as an identifier for
|
||||
//transaction//. This is the keccak256 of the serialized RLP encoded
|
||||
representation of //transaction//.
|
||||
|
||||
_property: unsignedTransaction.to => string<[Address](address)>
|
||||
The address //transaction// is to.
|
||||
|
||||
_property: transaction.from => string<[Address](address)>
|
||||
The address //transaction// is from.
|
||||
|
||||
_property: transaction.nonce => number
|
||||
The nonce for //transaction//. Each transaction sent to the network
|
||||
from an account includes this, which ensures the order and
|
||||
non-replayability of a transaction. This must be equal to the current
|
||||
number of transactions ever sent to the network by the **from** address.
|
||||
|
||||
_property: transaction.gasLimit => [[BigNumber]]
|
||||
The gas limit for //transaction//. An account must have enough ether to
|
||||
cover the gas (at the specified **gasPrice**). Any unused gas is
|
||||
refunded at the end of the transaction, and if there is insufficient gas
|
||||
to complete execution, the effects of the trasaction are reverted, but
|
||||
the gas is **fully consumed** and an out-of-gas error occurs.
|
||||
|
||||
_property: transaction.gasPrice => [[BigNumber]]
|
||||
The price (in wei) per unit of gas for //transaction//.
|
||||
|
||||
_property: transaction.data => [[BytesLike]]
|
||||
The data for //transaction//. In a contract this is the call data.
|
||||
|
||||
_property: transaction.value => [[BigNumber]]
|
||||
The value (in wei) for //transaction//.
|
||||
|
||||
_property: transaction.chainId => number
|
||||
The chain ID for //transaction//. This is used as part of
|
||||
[[link-eip-155]] to prevent replay attacks on different
|
||||
networks.
|
||||
|
||||
For example, if a transaction was made on ropsten with an account
|
||||
also used on homestead, it would be possible for a transaction
|
||||
signed on ropsten to be executed on homestead, which is likely
|
||||
unintended.
|
||||
|
||||
There are situations where replay may be desired, however these
|
||||
are very rare and it is almost always recommended to specify the
|
||||
chain ID.
|
||||
|
||||
_property: transaction.r => string<[[DataHexString]]<32>>
|
||||
The r portion of the elliptic curve signatures for //transaction//.
|
||||
This is more accurately, the x coordinate of the point r (from
|
||||
which the y can be computed, along with v).
|
||||
|
||||
_property: transaction.s => string<[[DataHexString]]<32>>
|
||||
The s portion of the elliptic curve signatures for //transaction//.
|
||||
|
||||
_property: transaction.v => number
|
||||
The v portion of the elliptic curve signatures for //transaction//.
|
||||
This is used to refine which of the two possible points a given
|
||||
x-coordinate can have, and in [[link-eip-155]] is additionally
|
||||
used to encode the chain ID into the serialized transaction.
|
||||
|
||||
|
||||
_subsection: Functions @<transactions--functions>
|
||||
|
||||
_property: ethers.utils.parseTransaction(aBytesLike) => [[Transaction]] @<utils-parseTransaction> @SRC<transactions:parse>
|
||||
Parses the transaction properties from a serialized 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
|
||||
hash necessary to sign.
|
||||
|
||||
This function uses [[link-eip-155]] if a chainId is provided,
|
||||
otherwise legacy serialization is used. It is **highly** recommended
|
||||
to always specify a //chainId//.
|
||||
|
||||
If //signature// includes a chain ID (explicitly or implicitly by using an
|
||||
[[link-eip-155]] ``v`` or ``_vs``) it will be used to compute the
|
||||
chain ID.
|
||||
|
||||
If there is a mismatch between the chain ID of //transaction// and //signature//
|
||||
an error is thrown.
|
||||
69
docs.wrm/api/utils/web.wrm
Normal file
69
docs.wrm/api/utils/web.wrm
Normal file
@@ -0,0 +1,69 @@
|
||||
_section: Web Utilities @<web>
|
||||
|
||||
|
||||
_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//
|
||||
before returning it.
|
||||
|
||||
_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: ConnectionInfo @<ConnectionInfo>
|
||||
|
||||
_property: connection.url => string
|
||||
The URL to connect to.
|
||||
|
||||
_property: connection.user => string
|
||||
The username to use for [[link-wiki-basicauth]].
|
||||
The default is null (i.e. do not use basic authentication)
|
||||
|
||||
_property: connection.password => string
|
||||
The password to use for [[link-wiki-basicauth]].
|
||||
The default is null (i.e. do not use basic authentication)
|
||||
|
||||
_property: connection.allowInsecureAuthentication => boolean
|
||||
Allow [[link-wiki-basicauth]] over non-secure HTTP. The default is false.
|
||||
|
||||
_property: connection.timeout => number
|
||||
How long to wait before rejecting with a //timeout// error.
|
||||
|
||||
_property: connection.headers => { [ key: string]: string }
|
||||
Additional headers to include in the connection.
|
||||
|
||||
|
||||
_heading: PollOptions @<PollOptions>
|
||||
|
||||
_property: options.timeout => number
|
||||
The amount of time allowed to ellapse before triggering a timeout
|
||||
error.
|
||||
|
||||
_property: options.floor => number
|
||||
The minimum time limit to allow for [[link-wiki-backoff]].
|
||||
|
||||
The default is 0s.
|
||||
|
||||
_property: options.ceiling => number
|
||||
The maximum time limit to allow for [[link-wiki-backoff]].
|
||||
|
||||
The default is 10s.
|
||||
|
||||
_property: options.interval => number
|
||||
The interval used during [[link-wiki-backoff]] calculation.
|
||||
|
||||
The default is 250ms.
|
||||
|
||||
_property: options.retryLimit => number
|
||||
The number of times to retry in the event of an error or //undefined// is
|
||||
returned.
|
||||
|
||||
_property: options.onceBlock => [[Provider]]
|
||||
If this is specified, the polling will wait on new blocks from
|
||||
//provider// before attempting the //pollFunc// again.
|
||||
|
||||
_property: options.oncePoll => [[Provider]]
|
||||
If this is specified, the polling will occur on each poll
|
||||
cycle of //provider// before attempting the //pollFunc//
|
||||
again.
|
||||
63
docs.wrm/api/utils/wordlists.wrm
Normal file
63
docs.wrm/api/utils/wordlists.wrm
Normal file
@@ -0,0 +1,63 @@
|
||||
_section: Wordlists @<wordlists>
|
||||
|
||||
_subsection: Wordlist @<Wordlist>
|
||||
|
||||
_property: wordlist.locale => string
|
||||
The locale for this wordlist.
|
||||
|
||||
_property: wordlist.getWord(index) => string
|
||||
Returns the word at //index//.
|
||||
|
||||
_property: wordlist.getWordIndex(word) => number
|
||||
Returns the index of //word// within the wordlist.
|
||||
|
||||
_property: wordlist.split(mnemonic) => Array<string>
|
||||
Returns the mnemonic split into each individual word, according to a
|
||||
locale's valid whitespace character set.
|
||||
|
||||
_property: wordlist.join(words) => string
|
||||
Returns the mnemonic by joining //words// together using the
|
||||
whitespace that is standard for the locale.
|
||||
|
||||
_property: Wordlist.check(wordlists) => string<[[DataHexString]]<32>>
|
||||
Checks that all words map both directions correctly and return the
|
||||
hash of the lists. Sub-classes should use this to validate the wordlist
|
||||
is correct against the official wordlist hash.
|
||||
|
||||
_property: Wordlist.register(wordlist [ , name ]) => void
|
||||
Register a wordlist with the list of wordlists, optionally overriding
|
||||
the registered //name//.
|
||||
|
||||
_subsection: Languages @<wordlists--languages>
|
||||
|
||||
The [official wordlists](link-bip39-wordlists) availalbe in at
|
||||
`ethers.wordlists`. In the browser, only the english langauge is
|
||||
available by default; to include the others (which increases the
|
||||
size of the library), see the dist files in the `ethers` package.
|
||||
|
||||
_property: ethers.wordlists.cz => Wordlist
|
||||
The Czech [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.en => Wordlist
|
||||
The English [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.es => Wordlist
|
||||
The Spanish [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.fr => Wordlist
|
||||
The French [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.it => Wordlist
|
||||
The Italian [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.ja => Wordlist
|
||||
The Japanese [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.ko => Wordlist
|
||||
The Korean [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.zh_cn => Wordlist
|
||||
The Simplified Chinese [[Wordlist]].
|
||||
|
||||
_property: ethers.wordlists.zh_tw => Wordlist
|
||||
The Traditional Chinese [[Wordlist]].
|
||||
220
docs.wrm/cli/asm.wrm
Normal file
220
docs.wrm/cli/asm.wrm
Normal file
@@ -0,0 +1,220 @@
|
||||
_section: Assembler @<cli-asm>
|
||||
|
||||
The assembler Command-Line utility allows you to assemble the
|
||||
[Ethers ASM Dialect](asm-dialect) into deployable EVM bytecode
|
||||
and disassemle EVM bytecode into human-readable mnemonics.
|
||||
|
||||
|
||||
_subsection: Help
|
||||
|
||||
_code: @lang<text>
|
||||
|
||||
Usage:
|
||||
ethers-asm [ FILENAME ] [ OPTIONS ]
|
||||
|
||||
OPTIONS
|
||||
--define KEY=VALUE provide assembler defines
|
||||
--disassemble Disassemble input bytecode
|
||||
--ignore-warnings Ignore warnings
|
||||
--pic generate position independent code
|
||||
--target LABEL output LABEL bytecode (default: _)
|
||||
|
||||
OTHER OPTIONS
|
||||
--debug Show stack traces for errors
|
||||
--help Show this usage and exit
|
||||
--version Show this version and exit
|
||||
|
||||
|
||||
_subsection: Example Input Files
|
||||
|
||||
_code: SimpleStore.asm @lang<asm>
|
||||
|
||||
; SimpleStore (uint)
|
||||
|
||||
; Set the inital value of 42
|
||||
sstore(0, 42)
|
||||
|
||||
; Init code to deploy myContract
|
||||
codecopy(0, $myContract, #myContract)
|
||||
return(0, #myContract)
|
||||
|
||||
@myContract {
|
||||
; Non-payable
|
||||
jumpi($error, callvalue)
|
||||
|
||||
; Get the Sighash
|
||||
shr({{= 256 - 32 }}, calldataload(0))
|
||||
|
||||
; getValue()
|
||||
dup1
|
||||
{{= sighash("getValue()") }}
|
||||
jumpi($getValue, eq)
|
||||
|
||||
; setValue(uint)
|
||||
dup1
|
||||
{{= sighash("setValue(uint)") }}
|
||||
jumpi($setValue, eq)
|
||||
|
||||
; No matching signature
|
||||
@error:
|
||||
revert(0, 0)
|
||||
|
||||
@getValue:
|
||||
mstore(0, sload(0))
|
||||
return (0, 32)
|
||||
|
||||
@setValue:
|
||||
; Make sure we have exactly a uint
|
||||
jumpi($error, iszero(eq(calldatasize, 36)))
|
||||
|
||||
; Store the value
|
||||
sstore(0, calldataload(4))
|
||||
return (0, 0)
|
||||
|
||||
; There is no *need* for the PUSH32, it just makes
|
||||
; decompiled code look nicer
|
||||
@checksum[
|
||||
{{= (defines.checksum ? concat([
|
||||
Opcode.from("PUSH32"),
|
||||
id(myContract.source)
|
||||
]): "0x")
|
||||
}}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
_code: SimpleStore.bin @lang<text>
|
||||
|
||||
0x602a6000556044601160003960446000f334601e5760003560e01c8063209652
|
||||
0x5514602457806355241077146030575b60006000fd5b60005460005260206000
|
||||
0xf35b6024361415601e5760043560005560006000f3
|
||||
|
||||
|
||||
_note: Note: Bytecode File Syntax
|
||||
A bin file may be made up of multiple blocks of bytecode, each may
|
||||
optionally begin with a ``0x`` prefix, all of which **must** be of
|
||||
even length (since bytes are required, with 2 nibbles per byte)
|
||||
|
||||
All whitespace is ignored.
|
||||
|
||||
_subsection: Assembler Examples
|
||||
|
||||
The assembler converts an [Ethers ASM Dialect](asm-dialect) into
|
||||
bytecode by running multiple passes of an assemble stage, each pass
|
||||
more closely approximating the final result.
|
||||
|
||||
This allows small portions of the bytecode to be massaged and tweaked
|
||||
until the bytecode stablizes. This allows for more compact jump
|
||||
destinations and for code to be include more advanced meta-programming
|
||||
techniques.
|
||||
|
||||
_code: @lang<shell>
|
||||
|
||||
/home/ethers> ethers-asm SimpleStore.asm
|
||||
0x602a6000556044601160003960446000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f3
|
||||
|
||||
# Piping in ASM source code
|
||||
/home/ethers> cat SimpleStore.asm | ethers-asm
|
||||
# Same as above
|
||||
|
||||
# Setting a define which the ASM file checks and adds a checksum
|
||||
/home/ethers> ethers-asm --define checksum SimpleStore.asm
|
||||
0x602a6000556065601160003960656000f334601e5760003560e01c80632096525514602457806355241077146030575b60006000fd5b60005460005260206000f35b6024361415601e5760043560005560006000f37f10358310d664c9aeb4bf4ce7a10a6a03176bd23194c8ccbd3160a6dac90774d6
|
||||
|
||||
|
||||
_heading: Options
|
||||
|
||||
_definition: **-\-define KEY=VALUE** //or// **-\-define FLAG**
|
||||
This allows key/value pairs (where the value is a string) and
|
||||
flags (which the value is ``true``) to be passed along to the
|
||||
assembler, which can be accessed in
|
||||
[Scripting Blocks](asm-dialect-scripting), such as ``{{= defined.someKey }}``.
|
||||
|
||||
_definition: **-\-ignore-warnings**
|
||||
By default any warning will be treated like an error. This enabled
|
||||
by-passing warnings.
|
||||
|
||||
_definition: **-\-pic**
|
||||
When a program is assembled, the labels are usually given as an
|
||||
absolute byte position, which can be jumped to for loops and
|
||||
control flow. This means that a program must be installed at a specific
|
||||
location.
|
||||
|
||||
Byt specifying the **Position Independent Code** flag, code
|
||||
will be generated in a way such that all offsets are relative, allowing
|
||||
the program to be moved without any impact to its logic.
|
||||
|
||||
This does incur an additional gsas cost of 8 gas per offset access though.
|
||||
|
||||
_definition: **-\-target LABEL**
|
||||
All programs have a root scope named ``_`` which is by default
|
||||
assembled. This option allows another labelled target (either a
|
||||
[[asm-dialect-scope]] or a [[asm-dialect-datasegment]] to be
|
||||
assembled instead. The entire program is still assembled per usual,
|
||||
so this only impacts which part of the program is output.
|
||||
|
||||
_subsection: Disassembler Examples
|
||||
|
||||
A disassembled program shows offsets and mnemonics for the given
|
||||
bytecode. This format may change in the future to be more
|
||||
human-readable.
|
||||
|
||||
_code: @lang<shell>
|
||||
|
||||
/home/ethers> ethers-asm --disassemble SimpleStore.bin
|
||||
0000 : 0x2a ; #1
|
||||
0002 : 0x00 ; #1
|
||||
0004 : SSTORE
|
||||
0005 : 0x44 ; #1
|
||||
0007 : 0x11 ; #1
|
||||
0009 : 0x00 ; #1
|
||||
000b : CODECOPY
|
||||
000c : 0x44 ; #1
|
||||
000e : 0x00 ; #1
|
||||
0010 : RETURN
|
||||
0011 : CALLVALUE
|
||||
0012 : 0x1e ; #1
|
||||
0014 : JUMPI
|
||||
0015 : 0x00 ; #1
|
||||
0017 : CALLDATALOAD
|
||||
0018 : 0xe0 ; #1
|
||||
001a : SHR
|
||||
001b : DUP1
|
||||
001c : 0x20965255 ; #4
|
||||
0021 : EQ
|
||||
0022 : 0x24 ; #1
|
||||
0024 : JUMPI
|
||||
0025 : DUP1
|
||||
0026 : 0x55241077 ; #4
|
||||
002b : EQ
|
||||
002c : 0x30 ; #1
|
||||
002e : JUMPI
|
||||
002f*: JUMPDEST
|
||||
0030 : 0x00 ; #1
|
||||
0032 : 0x00 ; #1
|
||||
0034 : REVERT
|
||||
0035*: JUMPDEST
|
||||
0036 : 0x00 ; #1
|
||||
0038 : SLOAD
|
||||
0039 : 0x00 ; #1
|
||||
003b : MSTORE
|
||||
003c : 0x20 ; #1
|
||||
003e : 0x00 ; #1
|
||||
0040 : RETURN
|
||||
0041*: JUMPDEST
|
||||
0042 : 0x24 ; #1
|
||||
0044 : CALLDATASIZE
|
||||
0045 : EQ
|
||||
0046 : ISZERO
|
||||
0047 : 0x1e ; #1
|
||||
0049 : JUMPI
|
||||
004a : 0x04 ; #1
|
||||
004c : CALLDATALOAD
|
||||
004d : 0x00 ; #1
|
||||
004f : SSTORE
|
||||
0050 : 0x00 ; #1
|
||||
0052 : 0x00 ; #1
|
||||
0054 : RETURN
|
||||
|
||||
/home/ethers> cat SimpleStore.bin | ethers-asm --disassemble
|
||||
# Same as above
|
||||
82
docs.wrm/cli/ens.wrm
Normal file
82
docs.wrm/cli/ens.wrm
Normal file
@@ -0,0 +1,82 @@
|
||||
_section: Ethereum Naming Service @NAV<ENS>
|
||||
|
||||
_subsection: Help
|
||||
|
||||
_code: @lang<text>
|
||||
|
||||
Usage:
|
||||
ethers-ens COMMAND [ ARGS ] [ OPTIONS ]
|
||||
|
||||
COMMANDS
|
||||
lookup [ NAME | ADDRESS [ ... ] ]
|
||||
Lookup a name or address
|
||||
commit NAME Submit a pre-commitment
|
||||
[ --duration DAYS ] Register duration (default: 365 days)
|
||||
[ --salt SALT ] SALT to blind the commit with
|
||||
[ --secret SECRET ] Use id(SECRET) as the salt
|
||||
[ --owner OWNER ] The target owner (default: current account)
|
||||
reveal NAME Reveal a previous pre-commitment
|
||||
[ --duration DAYS ] Register duration (default: 365 days)
|
||||
[ --salt SALT ] SALT to blind the commit with
|
||||
[ --secret SECRET ] Use id(SECRET) as the salt
|
||||
[ --owner OWNER ] The target owner (default: current account)
|
||||
set-controller NAME Set the controller (default: current account)
|
||||
[ --address ADDRESS ] Specify another address
|
||||
set-subnode NAME Set a subnode owner (default: current account)
|
||||
[ --address ADDRESS ] Specify another address
|
||||
set-resolver NAME Set the resolver (default: resolver.eth)
|
||||
[ --address ADDRESS ] Specify another address
|
||||
set-addr NAME Set the addr record (default: current account)
|
||||
[ --address ADDRESS ] Specify another address
|
||||
set-text NAME KEY VALUE Set a text record
|
||||
set-email NAME EMAIL Set the email text record
|
||||
set-website NAME URL Set the website text record
|
||||
set-content NAME HASH Set the IPFS Content Hash
|
||||
migrate-registrar NAME Migrate from the Legacy to the Permanent Registrar
|
||||
transfer NAME NEW_OWNER Transfer registrant ownership
|
||||
reclaim NAME Reset the controller by the registrant
|
||||
[ --address ADDRESS ] Specify another address
|
||||
|
||||
ACCOUNT OPTIONS
|
||||
--account FILENAME Load from a file (JSON, RAW or mnemonic)
|
||||
--account RAW_KEY Use a private key (insecure *)
|
||||
--account 'MNEMONIC' Use a mnemonic (insecure *)
|
||||
--account - Use secure entry for a raw key or mnemonic
|
||||
--account-void ADDRESS Use an address as a void signer
|
||||
--account-void ENS_NAME Add the resolved address as a void signer
|
||||
--account-rpc ADDRESS Add the address from a JSON-RPC provider
|
||||
--account-rpc INDEX Add the index from a JSON-RPC provider
|
||||
--mnemonic-password Prompt for a password for mnemonics
|
||||
--xxx-mnemonic-password Prompt for a (experimental) hard password
|
||||
|
||||
PROVIDER OPTIONS (default: all + homestead)
|
||||
--alchemy Include Alchemy
|
||||
--etherscan Include Etherscan
|
||||
--infura Include INFURA
|
||||
--nodesmith Include nodesmith
|
||||
--rpc URL Include a custom JSON-RPC
|
||||
--offline Dump signed transactions (no send)
|
||||
--network NETWORK Network to connect to (default: homestead)
|
||||
|
||||
TRANSACTION OPTIONS (default: query network)
|
||||
--gasPrice GWEI Default gas price for transactions(in wei)
|
||||
--gasLimit GAS Default gas limit for transactions
|
||||
--nonce NONCE Initial nonce for the first transaction
|
||||
--yes Always accept Siging and Sending
|
||||
|
||||
OTHER OPTIONS
|
||||
--wait Wait until transactions are mined
|
||||
--debug Show stack traces for errors
|
||||
--help Show this usage and exit
|
||||
--version Show this version and exit
|
||||
|
||||
(*) By including mnemonics or private keys on the command line they are
|
||||
possibly readable by other users on your system and may get stored in
|
||||
your bash history file. This is NOT recommended.
|
||||
|
||||
|
||||
_subsection: Examples
|
||||
|
||||
TODO examples
|
||||
|
||||
|
||||
254
docs.wrm/cli/ethers.wrm
Normal file
254
docs.wrm/cli/ethers.wrm
Normal file
@@ -0,0 +1,254 @@
|
||||
_section: Sandbox Utility
|
||||
|
||||
The sandbox utility provides a simple way to use the most common
|
||||
ethers utilities required during learning, debuging and managing
|
||||
interactions with the Ethereum network.
|
||||
|
||||
If no command is given, it will enter a REPL interface with many
|
||||
of the ethers utilities already exposed.
|
||||
|
||||
_subsection: Help
|
||||
|
||||
_code: @lang<text>
|
||||
Usage:
|
||||
ethers [ COMMAND ] [ ARGS ] [ OPTIONS ]
|
||||
|
||||
COMMANDS (default: sandbox)
|
||||
sandbox Run a REPL VM environment with ethers
|
||||
init FILENAME Create a new JSON wallet
|
||||
[ --force ] Overwrite any existing files
|
||||
fund TARGET Fund TARGET with testnet ether
|
||||
info [ TARGET ... ] Dump info for accounts, addresses and ENS names
|
||||
send TARGET ETHER Send ETHER ether to TARGET form accounts[0]
|
||||
[ --allow-zero ] Allow sending to the address zero
|
||||
[ --data DATA ] Include data in the transaction
|
||||
sweep TARGET Send all ether from accounts[0] to TARGET
|
||||
sign-message MESSAGE Sign a MESSAGE with accounts[0]
|
||||
[ --hex ] The message content is hex encoded
|
||||
eval CODE Run CODE in a VM with ethers
|
||||
run FILENAME Run FILENAME in a VM with ethers
|
||||
wait HASH Wait for a transaction HASH to be mined
|
||||
wrap-ether VALUE Deposit VALUE into Wrapped Ether (WETH)
|
||||
unwrap-ether VALUE Withdraw VALUE from Wrapped Ether (WETH)
|
||||
send-token TOKEN ADDRESS VALUE
|
||||
Send VALUE tokens (at TOKEN) to ADDRESS
|
||||
compile FILENAME Compiles a Solidity contract
|
||||
[ --no-optimize ] Do not optimize the compiled output
|
||||
[ --warnings ] Error on any warning
|
||||
deploy FILENAME Compile and deploy a Solidity contract
|
||||
[ --no-optimize ] Do not optimize the compiled output
|
||||
[ --contract NAME ] Specify the contract to deploy
|
||||
|
||||
ACCOUNT OPTIONS
|
||||
--account FILENAME Load from a file (JSON, RAW or mnemonic)
|
||||
--account RAW_KEY Use a private key (insecure *)
|
||||
--account 'MNEMONIC' Use a mnemonic (insecure *)
|
||||
--account - Use secure entry for a raw key or mnemonic
|
||||
--account-void ADDRESS Use an address as a void signer
|
||||
--account-void ENS_NAME Add the resolved address as a void signer
|
||||
--account-rpc ADDRESS Add the address from a JSON-RPC provider
|
||||
--account-rpc INDEX Add the index from a JSON-RPC provider
|
||||
--mnemonic-password Prompt for a password for mnemonics
|
||||
--xxx-mnemonic-password Prompt for a (experimental) hard password
|
||||
|
||||
PROVIDER OPTIONS (default: all + homestead)
|
||||
--alchemy Include Alchemy
|
||||
--etherscan Include Etherscan
|
||||
--infura Include INFURA
|
||||
--nodesmith Include nodesmith
|
||||
--rpc URL Include a custom JSON-RPC
|
||||
--offline Dump signed transactions (no send)
|
||||
--network NETWORK Network to connect to (default: homestead)
|
||||
|
||||
TRANSACTION OPTIONS (default: query network)
|
||||
--gasPrice GWEI Default gas price for transactions(in wei)
|
||||
--gasLimit GAS Default gas limit for transactions
|
||||
--nonce NONCE Initial nonce for the first transaction
|
||||
--yes Always accept Siging and Sending
|
||||
|
||||
OTHER OPTIONS
|
||||
--wait Wait until transactions are mined
|
||||
--debug Show stack traces for errors
|
||||
--help Show this usage and exit
|
||||
--version Show this version and exit
|
||||
|
||||
(*) By including mnemonics or private keys on the command line they are
|
||||
possibly readable by other users on your system and may get stored in
|
||||
your bash history file. This is NOT recommended.
|
||||
|
||||
_subsection: Examples
|
||||
|
||||
_code: Creating New Wallets @lang<shell> @<cliex-init>
|
||||
|
||||
/home/ethers> ethers init wallet.json
|
||||
Creating a new JSON Wallet - wallet.json
|
||||
Keep this password and file SAFE!! If lost or forgotten
|
||||
it CANNOT be recovered, by ANYone, EVER.
|
||||
Choose a password: ******
|
||||
Confirm password: ******
|
||||
Encrypting... 100%
|
||||
New account address: 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003
|
||||
Saved: wallet.json
|
||||
|
||||
|
||||
# If you are planning to try out the Ropsten testnet...
|
||||
/home/ethers> ethers --network ropsten fund 0x485bcC23ae2E5038ec7ec9b8DCB2A6A6291cC003
|
||||
Transaction Hash: 0x8dc55b8f8dc8076acded97f9e3ed7d6162460c0221e2769806006b6d7d1156e0
|
||||
|
||||
|
||||
_code: Sending Ether and Tokens @<cliex-send> @lang<shell>
|
||||
|
||||
# Sending ether
|
||||
/home/ricmoo> ethers --account wallet.json send ricmoo.firefly.eth 0.123
|
||||
Password (wallet.json): ******
|
||||
Decrypting... 100%
|
||||
Transaction:
|
||||
To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72
|
||||
From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C
|
||||
Value: 0.123 ether
|
||||
Nonce: 96
|
||||
Data: 0x
|
||||
Gas Limit: 21000
|
||||
Gas Price: 1.2 gwei
|
||||
Chain ID: 1
|
||||
Network: homestead
|
||||
Send Transaction? (y/N/a) y
|
||||
Response:
|
||||
Hash: 0xc4adf8b379033d7ab679d199aa35e6ceee9a802ca5ab0656af067e911c4a589a
|
||||
|
||||
|
||||
# Sending a token (SAI)
|
||||
# NOTE: the contract address could be used instead but
|
||||
# popular token contract addresses are also managed
|
||||
# by ethers
|
||||
/home/ricmoo> ethers --account wallet.json send-token sai.tokens.ethers.eth ricmoo.firefly.eth 1.0
|
||||
Sending Tokens:
|
||||
To: 0x8ba1f109551bD432803012645Ac136ddd64DBA72
|
||||
Token Contract: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359
|
||||
Value: 1.0
|
||||
Password (wallet.json): ******
|
||||
Decrypting... 100%
|
||||
Transaction:
|
||||
To: 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359
|
||||
From: 0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C
|
||||
Value: 0.0 ether
|
||||
Nonce: 95
|
||||
Data: 0xa9059cbb0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000
|
||||
Gas Limit: 37538
|
||||
Gas Price: 1.0 gwei
|
||||
Chain ID: 1
|
||||
Network: homestead
|
||||
Send Transaction? (y/N/a) y
|
||||
Response:
|
||||
Hash: 0xd609ecb7e3b5e8d36fd781dffceede3975ece6774b6322ea56cf1e4d0a17e3a1
|
||||
|
||||
|
||||
_code: Signing Messages @<cliex-signing> @lang<shell>
|
||||
|
||||
/home/ethers> ethers --account wallet.json sign-message 'Hello World'
|
||||
Password (wallet.json): ******
|
||||
Decrypting... 100%
|
||||
Message:
|
||||
Message: "Hello World"
|
||||
Message (hex): 0x48656c6c6f20576f726c64
|
||||
Sign Message? (y/N/a) y
|
||||
Signature
|
||||
Flat: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a161b
|
||||
r: 0xca3f0b32a22a5ab97ca8be7e4a36b1e81d565c6822465d769f4faa4aa24539fb
|
||||
s: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16
|
||||
vs: 0x122ee5649c8a37c9f5fc8446593674159e3a7b039997cd6ee697a24b787b1a16
|
||||
v: 27
|
||||
recid: 0
|
||||
|
||||
|
||||
_heading: Scripting @<cliex-scripting>
|
||||
|
||||
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: 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
|
||||
|
||||
_code: Get the current block number @lang<shell>
|
||||
/home/ethers> ethers --network rinkeby \
|
||||
eval "provider.getBlockNumber()"
|
||||
5761009
|
||||
|
||||
_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
|
||||
}
|
||||
|
||||
|
||||
_code: Compute a topic hash @lang<shell>
|
||||
/home/ricmoo> ethers eval 'id("Transfer(address,address,uint256")'
|
||||
0xd99659a21de82e379975ce8df556f939a4ccb95e92144f38bb0dd35730ffcdd5
|
||||
|
||||
_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
|
||||
|
||||
|
||||
_heading: Using Mnemonics (with a password) @<cliex-mnemonicpassword>
|
||||
|
||||
All mnemonic phrases have a password, but the default is to use the empty
|
||||
string (i.e. ``""``) as the password. If you have a password on your
|
||||
mnemonic, the ``-\-mnemonic-password`` will prompt for the password to
|
||||
use to decrypt the account.
|
||||
|
||||
_code: @lang<shell>
|
||||
|
||||
/home/ricmoo> ethers --account mnemonic.txt --mnemonic-password
|
||||
Password (mnemonic): ******
|
||||
network: homestead (chainId: 1)
|
||||
homestead> accounts[0].getAddress()
|
||||
<Promise id=0 resolved>
|
||||
'0x6d3F723EC1B73141AA4aC248c3ab34A5a1DAD776'
|
||||
homestead>
|
||||
|
||||
|
||||
_heading: Using Mnemonics (with experimental memory-hard passwords) @<cliex-mnemonicpassword-xxx>
|
||||
|
||||
The ``-\-xxx-mnemonic-password`` is similar to the ``-\-mnemonic-password`` options,
|
||||
which uses a password to decrypt the account for a mnemonic, however it passes
|
||||
the password through the [scrypt](link-wiki-scrypt)
|
||||
//password-based key derivation function// first, which is intentionally slow and makes
|
||||
a brute-force attack far more difficult.
|
||||
|
||||
_code: @lang<shell>
|
||||
|
||||
/home/ricmoo> ethers --account mnemonic.txt --xxx-mnemonic-password
|
||||
Password (mnemonic; experimental - hard): ******
|
||||
Decrypting... 100%
|
||||
network: homestead (chainId: 1)
|
||||
homestead> accounts[0].getAddress()
|
||||
<Promise id=0 resolved>
|
||||
'0x56FC8792cC17971C19bEC4Ced978beEA44711EeD'
|
||||
homestead>
|
||||
|
||||
_warning: Note
|
||||
This is still an experimental feature (hence the ``xxx``).
|
||||
|
||||
8
docs.wrm/cli/index.wrm
Normal file
8
docs.wrm/cli/index.wrm
Normal file
@@ -0,0 +1,8 @@
|
||||
_section: Command Line Interfaces
|
||||
|
||||
_toc:
|
||||
ethers
|
||||
asm
|
||||
ens
|
||||
typescript
|
||||
plugin
|
||||
159
docs.wrm/cli/plugin.wrm
Normal file
159
docs.wrm/cli/plugin.wrm
Normal file
@@ -0,0 +1,159 @@
|
||||
_section: Making Your Own @<cli-diy>
|
||||
|
||||
The //cli// library is meant to make it easy to create command
|
||||
line utilities of your own.
|
||||
|
||||
_subsection: CLI @<cli-cli> @SRC<cli:class.CLI>
|
||||
|
||||
A **CLI** handles parsing all the command-line flags, options and arguments
|
||||
and instantiates a [[cli-plugin]] to process the command.
|
||||
|
||||
A **CLI** may support multiple [[cli-plugin]]'s in which case the first
|
||||
argument is used to determine which to run (or if no arguments, the default
|
||||
plugin will be selected) or may be designed to be standalone, in which case
|
||||
exactly one [[cli-plugin]] will be used and no command argument is allowed.
|
||||
|
||||
|
||||
_property: addPlugin(command, pluginClass) => void @<cli-addplugin> @SRC<cli/cli>
|
||||
Add a //plugin// class for the //command//. After all options and flags
|
||||
have been consumed, the first argument will be consumed and the
|
||||
associated plugin class will be instantiated and run.
|
||||
|
||||
_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
|
||||
accept a command from the arguments.
|
||||
|
||||
_property: showUsage([ message = "" [ , status = 0 ] ]) => never @<cli-showusage> @SRC<cli/cli>
|
||||
Shows the usage help screen for the CLI and terminates.
|
||||
|
||||
_property: run(args) => Promise<void> @<cli-run> @SRC<cli/cli:CLI.run>
|
||||
Usually the value of //args// passed in will be ``process.argv.slice(2)``.
|
||||
|
||||
|
||||
_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.
|
||||
|
||||
Otherwise, a plugin is instantiated and the ``prepareOptions`` is called. Each
|
||||
plugin **must** call ``super.prepareOptions``, otherwise the basic options are
|
||||
not yet processed. During this time a Plugin should consume all the flags and
|
||||
options it understands, since any left over flags or options will cause the
|
||||
CLI to bail and issue an //unknown option// error. This should throw if a value
|
||||
for a given option is invalid or some combination of options and flags is not
|
||||
allowed.
|
||||
|
||||
Once the prepareOptions is complete (the returned promise is resolved), the ``prepareArguments``
|
||||
is called. This should validate the number of arguments is expected and throw
|
||||
and error if there are too many or too few arguments or if any arguments do not
|
||||
make sense.
|
||||
|
||||
Once the prepareArguments is complete (the returned promise is resolved), the ``run``
|
||||
is called.
|
||||
|
||||
_property: plugin.network => [[providers-Network]]
|
||||
The network this plugin is running for.
|
||||
|
||||
_property: plugin.provider => [[Provider]]
|
||||
The provider for this plugin is running for.
|
||||
|
||||
_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]]
|
||||
The gas limit this plugin should use. This is null if unspecified.
|
||||
|
||||
_property: plugin.gasPrice => [[BigNumber]]
|
||||
The gas price this plugin should use. This is null if unspecified.
|
||||
|
||||
_property: plugin.nonce => number
|
||||
The initial nonce for the account this plugin should use.
|
||||
|
||||
|
||||
_heading: Methods
|
||||
|
||||
_property: plugin.prepareOptions(argParser [ , verifyOnly = false ]) => Promise<void> @<plugin-prepareoptions> @SRC<cli/cli:Plugin.prepareOptions>
|
||||
|
||||
_property: plugin.prepareArgs(args) => Promise<void> @<plugin-prepareargs> @SRC<cli/cli>
|
||||
|
||||
_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
|
||||
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>
|
||||
Dumps the contents of //info// to the console with a //header// in a nicely
|
||||
formatted style. In the future, plugins may support a JSON output format
|
||||
which will automatically work with this method.
|
||||
|
||||
_property: plugin.throwUsageError([ message = "" ]) => never @<plugin-throwusageerror> @SRC<cli/cli>
|
||||
Stops exectuion 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>
|
||||
Stops execution of the plugin and shows //message//.
|
||||
|
||||
_heading: Static Methods
|
||||
|
||||
_property: Plugin.getHelp => Help @<plugin-gethelp> @SRC<cli/cli>
|
||||
Each subclass should implement this static method which is used to
|
||||
generate the help screen.
|
||||
|
||||
_property: Plugin.getOptionHelp => Array<Help> @<plugin-getoptionshelp> @SRC<cli/cli>
|
||||
Each subclass should implement this static method if it supports
|
||||
additional options which is used to generate the help screen.
|
||||
|
||||
|
||||
_subsection: ArgParser @<cli-argparser> @SRC<cli:class.ArgParser>
|
||||
|
||||
The **ArgParser** is used to parse a command line into flags, options
|
||||
and arguments.
|
||||
|
||||
_code: @lang<shell>
|
||||
|
||||
/home/ethers> ethers --account wallet.json --yes send ricmoo.eth 1.0
|
||||
# An Option ----------^ ^ ^
|
||||
# - name = "account" | |
|
||||
# - value = "wallet.json" | |
|
||||
# A Flag -----------------------------------+ |
|
||||
# - name = "yes" |
|
||||
# - value = true |
|
||||
# Arguments ------------------------------------+
|
||||
# - count = 3
|
||||
# - [ "send", "ricmoo.eth", "1.0" ]
|
||||
|
||||
_null:
|
||||
|
||||
Flags are simple binary options (such as the ``--yes``), which are true if present
|
||||
otherwise false.
|
||||
|
||||
Options require a single parameter follow them on the command line
|
||||
(such as ``--account wallet.json``, which nhas the name ``account`` and the value
|
||||
``wallet.json``)
|
||||
|
||||
Arguments are all other values on the command line, and are not accessed through
|
||||
the **ArgParser** directly.
|
||||
|
||||
When a CLI is run, an **ArgParser** is used to validate the command line by using
|
||||
prepareOptions, which consumes all flags and options leaving only the arguments
|
||||
behind, which are then passed into prepareArgs.
|
||||
|
||||
_property: argParser.consumeFlag(name) => boolean @<argparser-consumeflag> @SRC<cli/cli>
|
||||
Remove the flag //name// and return true if it is present.
|
||||
|
||||
_property: argParser.consumeMultiOptions(names) => Array<{ name: string, value: string}> @<argparser-consumemultioptions> @SRC<cli/cli>
|
||||
Remove all options which match any name in the Array of //names//
|
||||
with their values returning the list (in order) of values.
|
||||
|
||||
_property: argParser.consumeOption(name) => string @<argparser-consumeoption> @SRC<cli/cli>
|
||||
Remove the option with its value for //name// and return the value. This
|
||||
will throw a UsageError if the option is included multiple times.
|
||||
|
||||
_property: argParser.consumeOptions(name) => Array<string> @<argparser-consumeoptions> @SRC<cli/cli>
|
||||
Remove all options with their values for //name// and return the list
|
||||
(in order) of values.
|
||||
28
docs.wrm/cli/typescript.wrm
Normal file
28
docs.wrm/cli/typescript.wrm
Normal file
@@ -0,0 +1,28 @@
|
||||
_section: TypeScript
|
||||
|
||||
_subsection: Help
|
||||
|
||||
_code: @lang<text>
|
||||
|
||||
Usage:
|
||||
ethers-ts FILENAME [ ... ] [ OPTIONS ]
|
||||
|
||||
OPTIONS
|
||||
--output FILENAME Write the output to FILENAME (default: stdout)
|
||||
--force Overwrite files if they already exist
|
||||
--no-optimize Do not run the solc optimizer
|
||||
--no-bytecode Do not include bytecode and Factory methods
|
||||
|
||||
OTHER OPTIONS
|
||||
--debug Show stack traces for errors
|
||||
--help Show this usage and exit
|
||||
--version Show this version and exit
|
||||
|
||||
(*) By including mnemonics or private keys on the command line they are
|
||||
possibly readable by other users on your system and may get stored in
|
||||
your bash history file. This is NOT recommended.
|
||||
|
||||
|
||||
_subsection: Examples
|
||||
|
||||
TODO
|
||||
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 acomplished 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,5 +1,157 @@
|
||||
_title: Events
|
||||
|
||||
_section: Events
|
||||
|
||||
Explain how topics and such work
|
||||
|
||||
_subsection: Solidity Topics
|
||||
|
||||
How to compute the topic...
|
||||
|
||||
_subsection: Logs and Filtering
|
||||
|
||||
Example hog logs are used.
|
||||
|
||||
Link to provider.getLogs and contract.on
|
||||
|
||||
_heading: Filters
|
||||
|
||||
Filter are used as a way to query ... efficient, explain bloom filters lightly
|
||||
|
||||
A filter may have up to 4 topic-sets, where each topic-set refers
|
||||
to a condition that must match the log topic in that position (i.e. each
|
||||
condition is ``AND``-ed together).
|
||||
|
||||
If a topic-set is ``null``, a log topic in that position is not filtered
|
||||
at all and **any value** matches.
|
||||
|
||||
If a topic-set is a single topic, a log topic in that position must match
|
||||
**that topic**.
|
||||
|
||||
If a topic-set is an array of topics, a log topic in that position must
|
||||
match any **one** of the topics (i.e. the topic in this position are ``OR``-ed).
|
||||
|
||||
|
||||
_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 ])
|
||||
//!
|
||||
|
||||
_heading: Other Things? TODO
|
||||
|
||||
Explain what happens to strings and bytes, how to filter and retain the value
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
_title: Gas
|
||||
_section: Gas @<gas>
|
||||
|
||||
_section: Gas
|
||||
Explain attack vectors
|
||||
|
||||
_subsection: Gas Price @<gas-price>
|
||||
|
||||
@@ -10,4 +10,3 @@ processed.
|
||||
|
||||
_subsection: Gas Limit @<gas-limit>
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
_title: Concepts
|
||||
|
||||
_section: Concepts
|
||||
_section: Ethereum Basics
|
||||
|
||||
This is a very breif overview of some aspects of //Ethereum//
|
||||
which developers can make use of or should be aware of.
|
||||
and blockchains which developers can make use of or should
|
||||
be aware of.
|
||||
|
||||
This section is fairly sparse at the moment, but will be expanded
|
||||
as time goes on.
|
||||
|
||||
_toc:
|
||||
events
|
||||
gas
|
||||
security
|
||||
|
||||
85
docs.wrm/concepts/security/index.wrm
Normal file
85
docs.wrm/concepts/security/index.wrm
Normal file
@@ -0,0 +1,85 @@
|
||||
_section: Security @<security>
|
||||
|
||||
_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.
|
||||
|
||||
Many people are concerned that encrypting and decrypting an
|
||||
Ethereum wallet is quite slow and can take quite some time.
|
||||
It is important to understand this is intentional and provides
|
||||
much stronger security.
|
||||
|
||||
The algorithm usually used for this process is [scrypt](link-wiki-scrypt),
|
||||
which is a memory and CPU intensive algorithm which computes
|
||||
a key (fixed-length pseudo-random series of bytes) for a given
|
||||
password.
|
||||
|
||||
|
||||
_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,
|
||||
increasing the cost to [brute-force attack](link-wiki-bruteforce)
|
||||
to guess the password.
|
||||
|
||||
For example, if a user knows their correct password, this process
|
||||
may take 10 seconds for them to unlock their own wallet and proceed.
|
||||
|
||||
But since an attacker does not know the password, they must guess; and
|
||||
each guess also requires 10 seconds. So, if they wish to try guessing 1
|
||||
million passwords, their computer would be completely tied up for 10
|
||||
million seconds, or around 115 days.
|
||||
|
||||
Without using an algorithm like this, a user would be able
|
||||
to log in instantly, however, 1 million passwords would only
|
||||
take a few seconds to attempt. Even secure passwords would
|
||||
likely be broken within a short period of time. There is no way
|
||||
the algorithm can be faster for a legitimate user without also
|
||||
being faster for an attacker.
|
||||
|
||||
_heading: Mitigating the User Experience
|
||||
|
||||
Rather than reducing the security (see below), a better practice is to make
|
||||
the user feel better about waiting. The Ethers encryption and decryption
|
||||
API allows the developer to incorporate a progress bar, by passing in a
|
||||
progress callback which will be periodically called with a number between
|
||||
0 and 1 indication percent completion.
|
||||
|
||||
In general a progress bar makes the experience feel faster, as well as
|
||||
more comfortable since there is a clear indication how much (relative) time
|
||||
is remaining. Additionally, using language like //"decrypting..."// in
|
||||
a progress bar makes a user feel like there time is not being //needlessly//
|
||||
wasted.
|
||||
|
||||
_heading: Work-Arounds (not recommended)
|
||||
|
||||
There are ways to reduce the time required to decrypt an Ethereum JSON
|
||||
Wallet, but please keep in mind that doing so **discards nearly all security**
|
||||
on that wallet.
|
||||
|
||||
The scrypt algorithm is designed to be tuned. The main purpose of this is
|
||||
to increase the difficulty as time goes on and computers get faster, but
|
||||
it can also be tuned down in situations where the security is less important.
|
||||
|
||||
_code: @LANG<javascript>
|
||||
|
||||
// Our wallet object
|
||||
const wallet = Wallet.createRandom();
|
||||
|
||||
// The password to encrypt with
|
||||
const password = "password123";
|
||||
|
||||
// WARNING: Doing this substantially reduces the security
|
||||
// of the wallet. This is highly NOT recommended.
|
||||
|
||||
// We override the default scrypt.N value, which is used
|
||||
// to indicate the difficulty to crack this wallet.
|
||||
const json = wallet.encrypt(password, {
|
||||
scrypt: {
|
||||
// The number must be a power of 2 (default: 131072)
|
||||
N: 64
|
||||
}
|
||||
});
|
||||
266
docs.wrm/config.js
Normal file
266
docs.wrm/config.js
Normal file
@@ -0,0 +1,266 @@
|
||||
"use strict";
|
||||
|
||||
const { resolve } = require("path");
|
||||
const fs = require("fs");
|
||||
|
||||
const ts = require("typescript");
|
||||
|
||||
function getDefinitions(source) {
|
||||
const sourceFile = ts.createSourceFile("filename.ts", source);
|
||||
|
||||
const defs = [ ];
|
||||
|
||||
function add(type, name, pos) {
|
||||
const lineNo = sourceFile.getLineAndCharacterOfPosition(pos).line + 1;
|
||||
name = type + "." + name
|
||||
defs.push({ type, name, lineNo });
|
||||
}
|
||||
|
||||
let lastClass = null, lastEnum = null;
|
||||
function visit(node, depth) {
|
||||
if (ts.isConstructorDeclaration(node)) {
|
||||
add("constructor", lastClass, node.body.pos);
|
||||
} else if (ts.isFunctionDeclaration(node)) {
|
||||
add("function", node.name.text, node.name.end);
|
||||
} else if (ts.isConstructorDeclaration(node)) {
|
||||
add("constructor", lastClass, node.pos);
|
||||
} else if (ts.isClassDeclaration(node)) {
|
||||
lastClass = node.name.escapedText;
|
||||
add("class", lastClass, node.name.end);
|
||||
} else if (ts.isMethodDeclaration(node)) {
|
||||
if (lastClass == null) { throw new Error("missing class"); }
|
||||
if (ts.hasStaticModifier(node)) {
|
||||
add("staticmethod", (lastClass + "." + node.name.text), node.name.end);
|
||||
} else {
|
||||
add("method", (lastClass + "." + node.name.text), node.name.end);
|
||||
}
|
||||
} else if (ts.isEnumDeclaration(node)) {
|
||||
lastEnum = node.name.escapedText;
|
||||
add("enum", lastEnum, node.name.end);
|
||||
} else if (ts.isEnumMember(node)) {
|
||||
add("enum", (lastEnum + "." + node.name.escapedText), node.name.end);
|
||||
} else if (ts.isVariableDeclaration(node)) {
|
||||
if (depth === 3) {
|
||||
add("var", node.name.escapedText, node.name.end);
|
||||
}
|
||||
}
|
||||
ts.forEachChild(node, (node) => { return visit(node, depth + 1); });
|
||||
}
|
||||
|
||||
visit(sourceFile, 0);
|
||||
|
||||
return defs;
|
||||
}
|
||||
|
||||
const getSourceUrl = (function(path, include, exclude) {
|
||||
console.log("Scanning TypeScript Sources...");
|
||||
const Link = "https://github.com/ethers-io/ethers.js/blob/master/packages$FILENAME#L$LINE";
|
||||
const Root = resolve(__dirname, path);
|
||||
|
||||
const readdir = function(path) {
|
||||
if (path.match(exclude)) { return [ ]; }
|
||||
|
||||
const stat = fs.statSync(path);
|
||||
if (stat.isDirectory()) {
|
||||
return fs.readdirSync(path).reduce((result, filename) => {
|
||||
readdir(resolve(path, filename)).forEach((file) => {
|
||||
result.push(file);
|
||||
});
|
||||
return result;
|
||||
}, [ ]);
|
||||
}
|
||||
|
||||
if (path.match(include)) {
|
||||
const source = fs.readFileSync(path).toString();
|
||||
return [ { filename: path.substring(Root.length), defs: getDefinitions(source) } ]
|
||||
}
|
||||
|
||||
return [ ];
|
||||
}
|
||||
|
||||
const defs = readdir(Root);
|
||||
|
||||
return function getSourceUrl(key) {
|
||||
const comps = key.split(":");
|
||||
if (comps.length !== 2) { throw new Error("unsupported key"); }
|
||||
|
||||
const pathCheck = new RegExp("(^|[^a-zA-Z0-9_])" + comps[0].split("/").join("/(.*/)*") + "($|[^a-zA-Z0-9_])");
|
||||
|
||||
let match = comps[1];
|
||||
if (match.indexOf("(" /* fix: )*/)) {
|
||||
match = new RegExp("(^|\\.)" + match.split("(" /* fix: ) */)[0] + "$");
|
||||
} else if (match[0] === "=") {
|
||||
match = new RegExp("^" + match.substring(1) + "$");
|
||||
} else {
|
||||
match = new RegExp("(^|\\.)" + match + "$");
|
||||
}
|
||||
|
||||
const result = [ ];
|
||||
defs.forEach((def) => {
|
||||
if (!def.filename.match(pathCheck)) { return; }
|
||||
def.defs.forEach((d) => {
|
||||
if (!d.name.match(match)) { return; }
|
||||
result.push({ filename: def.filename, lineNo: d.lineNo, name: d.name });
|
||||
});
|
||||
});
|
||||
if (result.length > 1) {
|
||||
throw new Error(`Ambiguous TypeScript link: ${ key } in [ ${ result.map((r) => JSON.stringify(r.filename + ":" + r.lineNo + "@" + r.name)).join(", ") }]`);
|
||||
} else if (result.length === 0) {
|
||||
throw new Error(`No matching TypeScript link: ${ key }`);
|
||||
}
|
||||
|
||||
return Link
|
||||
.replace("$LINE", String(result[0].lineNo))
|
||||
.replace("$FILENAME", result[0].filename);
|
||||
}
|
||||
})("../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;
|
||||
context.BigNumber = ethers.BigNumber;
|
||||
context.constants = ethers.constants;
|
||||
context.utils = ethers.utils;
|
||||
context.arrayify = ethers.utils.arrayify;
|
||||
context.hexlify = ethers.utils.hexlify;
|
||||
context.hexValue = ethers.utils.hexValue;
|
||||
context.Wallet = ethers.Wallet;
|
||||
context.provider = new ethers.providers.InfuraProvider();
|
||||
|
||||
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, ", ") } ]`;
|
||||
}
|
||||
|
||||
//return JSON.stringify(value);
|
||||
return inspect(value, {
|
||||
compact: false,
|
||||
breakLength: Infinity,
|
||||
sorted: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
title: "ethers",
|
||||
subtitle: "v5.0",
|
||||
logo: "logo.svg",
|
||||
|
||||
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.ethers.io/)\n\n-----\n\n"
|
||||
},
|
||||
|
||||
codeContextify: codeContextify,
|
||||
|
||||
getSourceUrl: getSourceUrl,
|
||||
|
||||
codeRoot: "../",
|
||||
|
||||
externalLinks: {
|
||||
"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-etherscan-api": "https:/\/etherscan.io/apis",
|
||||
"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-ledger": "https:/\/www.ledger.com",
|
||||
"link-metamask": { name: "Metamask", url: "https:/\/metamask.io/" },
|
||||
"link-parity": { name: "Parity", url: "https:/\/www.parity.io" },
|
||||
"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": { name: "Sphinx", url: "https:/\/www.sphinx-doc.org/" },
|
||||
|
||||
"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-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",
|
||||
"link-web3-ipc": "https:/\/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ipc",
|
||||
"link-web3-ws": "https:/\/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ws",
|
||||
|
||||
"link-solc-output": "https:/\/solidity.readthedocs.io/en/v0.6.0/using-the-compiler.html#output-description",
|
||||
"link-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": { 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-npm": "https:/\/www.npmjs.com/search?q=%40ethersproject%2F",
|
||||
"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": { name: "EIP-609", url: "https:/\/eips.ethereum.org/EIPS/eip-609" },
|
||||
"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": { name: "EIP-2098", url: "https:/\/eips.ethereum.org/EIPS/eip-2098" },
|
||||
"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-npm-elliptic": { name: "elliptic", url: "https:/\/www.npmjs.com/package/elliptic" },
|
||||
"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-js-array": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array",
|
||||
"link-js-bigint": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt",
|
||||
"link-js-normalize": { name: "String.normalize", url: "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize" },
|
||||
"link-js-maxsafe": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER#Description",
|
||||
"link-js-typedarray": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray",
|
||||
|
||||
"link-ricmoo-humanreadableabi": "https:/\/blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917",
|
||||
|
||||
"link-wiki-basicauth": { name: "Basic Authentication", url: "https:/\/en.wikipedia.org/wiki/Basic_access_authentication" },
|
||||
"link-wiki-backoff": { name: "Exponential Backoff", url: "https:/\/en.wikipedia.org/wiki/Exponential_backoff" },
|
||||
"link-wiki-bloomfilter": { name: "Bloom Filter", url: "https:/\/en.wikipedia.org/wiki/Bloom_filter" },
|
||||
"link-wiki-bruteforce": "https:/\/en.wikipedia.org/wiki/Brute-force_attack",
|
||||
"link-wiki-cryptographichash": "https:/\/en.wikipedia.org/wiki/Cryptographic_hash_function",
|
||||
"link-wiki-ecrecover": { name: "ECDSA Public Key Recovery", url: "https:/\/en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Public_key_recovery" },
|
||||
"link-wiki-homoglyph": "https:/\/en.wikipedia.org/wiki/IDN_homograph_attack",
|
||||
"link-wiki-hmac": "https:/\/en.wikipedia.org/wiki/HMAC",
|
||||
"link-wiki-iban": "https:/\/en.wikipedia.org/wiki/International_Bank_Account_Number",
|
||||
"link-wiki-ieee754": "https:/\/en.wikipedia.org/wiki/Double-precision_floating-point_format",
|
||||
"link-wiki-ripemd": "https:/\/en.m.wikipedia.org/wiki/RIPEMD",
|
||||
"link-wiki-sha2": "https:/\/en.wikipedia.org/wiki/SHA-2",
|
||||
"link-wiki-twoscomplement": "https:/\/en.wikipedia.org/wiki/Two%27s_complement",
|
||||
"link-wiki-unicode-equivalence": "https:/\/en.wikipedia.org/wiki/Unicode_equivalence",
|
||||
"link-wiki-utf8-overlong": "https:/\/en.wikipedia.org/wiki/UTF-8#Overlong_encodings",
|
||||
"link-wiki-utf8-replacement": "https:/\/en.wikipedia.org/wiki/Specials_%28Unicode_block%29#Replacement_character",
|
||||
"link-wiki-scrypt": "https:/\/en.wikipedia.org/wiki/Scrypt",
|
||||
"link-wiki-sha3": "https:/\/en.wikipedia.org/wiki/SHA-3",
|
||||
"link-wiki-shuffle": { name: "Fisher-Yates Shuffle", url: "https:/\/en.wikipedia.org/wiki/Fisher-Yates_shuffle" },
|
||||
"link-wiki-overflow": { name: "overflow", url: "https:/\/en.wikipedia.org/wiki/Integer_overflow" },
|
||||
"link-wiki-underflow": { name: "arithmetic underflow", url: "https:/\/en.wikipedia.org/wiki/Arithmetic_underflow" },
|
||||
},
|
||||
};
|
||||
@@ -5,5 +5,11 @@
|
||||
"link": "https://docs-beta.ethers.io",
|
||||
"markdown": {
|
||||
"banner": "-----\n\nDocumentation: [html](https://docs-beta.ethers.io/)\n\n-----\n\n"
|
||||
},
|
||||
"source": {
|
||||
"path": "../packages/",
|
||||
"include": "packages/.*/src.ts/",
|
||||
"exclude": "/node_modules/|src.ts/.*browser.*",
|
||||
"link": "https://github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages$FILENAME#L$LINE"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
_title: Contributing and Hacking
|
||||
|
||||
_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.
|
||||
@@ -27,9 +25,121 @@ have a public discussion and figure out the best way to address to problem/featu
|
||||
**:)**
|
||||
|
||||
|
||||
_subsection: Building
|
||||
_subsection: Building @<contributing--building>
|
||||
|
||||
use npm run auto-build
|
||||
If you wish to modify the source code, there are a few steps involved in
|
||||
setting up your environment.
|
||||
|
||||
use npm run update-version
|
||||
Since the library uses a monorepo, you must install an initial required
|
||||
set of libraries, which can then be used to install the remaining libraries
|
||||
used within each package, as well as link all the packages within the repo
|
||||
with each other.
|
||||
|
||||
_code: Preparing for builds @lang<shell>
|
||||
|
||||
# Clone the repository
|
||||
/home/ricmoo> git clone git@github.com:ethers-io/ethers.js.git
|
||||
/home/ricmoo> cd ethers.js
|
||||
|
||||
# Install the base dependencies
|
||||
/home/ricmoo/ethers.js> npm install
|
||||
|
||||
# Install each module's dependencies and link the libraries
|
||||
# internally, so they reference each other
|
||||
/home/ricmoo/ethers.js> npm run bootstrap
|
||||
|
||||
|
||||
_subsection: Making your changes @<contributing--updating>
|
||||
|
||||
TODO: Add more information here.
|
||||
|
||||
_code: Watching and Building @lang<shell>
|
||||
|
||||
# Begin watching the files and re-building whenever they change
|
||||
/home/ricmoo/ethers.js> npm run auto-build
|
||||
|
||||
|
||||
# Sometimes the issue only affects the ESM modules
|
||||
/home/ricmoo/ethers.js> npm run auto-build-esm
|
||||
|
||||
|
||||
# Or if you only need to run a single build
|
||||
/home/ricmoo/ethers.js> npm run _build-cjs
|
||||
/home/ricmoo/ethers.js> npm run _build-esm
|
||||
|
||||
|
||||
_code: Testing @lang<shell>
|
||||
|
||||
# Rebuilds all files and bundles testcases up for testing
|
||||
/home/ricmoo/ethers.js> npm test
|
||||
|
||||
# Often you don't need the full CI experience
|
||||
/home/ricmoo/ethers.js> npm run _test-node
|
||||
|
||||
|
||||
_code: Preparing the Distribution @lang<shell>
|
||||
|
||||
/home/ricmoo/ethers.js> npm run update-version
|
||||
|
||||
|
||||
_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 symblinks in the future
|
||||
- In general, I aim for xonsistency; 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,3 @@
|
||||
_title: Cookbook
|
||||
|
||||
_section: Cookbook
|
||||
|
||||
Cooking...
|
||||
|
||||
470
docs.wrm/documentation.wrm
Normal file
470
docs.wrm/documentation.wrm
Normal file
@@ -0,0 +1,470 @@
|
||||
_section: Flatworm Docs @<flatworm>
|
||||
|
||||
The //Flatworm Docs// rendering engine is designed to be **very**
|
||||
simple, but provide enough formatting necessary for documenting
|
||||
JavaScript libraries.
|
||||
|
||||
A lot of its inspiration came from [Read the Docs](link-rtd) and
|
||||
the [Sphinx](link-sphinx) project.
|
||||
|
||||
|
||||
_subsection: Fragments @<flatworm-fragments>
|
||||
|
||||
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
|
||||
|
||||
_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
|
||||
EXTENSION: Optional; extended directive functionality
|
||||
PARAMETER: Optional; value to pass to extended directive functions
|
||||
BODY: Optional; the directive body (certain directives only)
|
||||
|
||||
|
||||
_heading: Flatworm Directives @<flatworm-directive>
|
||||
|
||||
_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.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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** in normal text and the body is
|
||||
indented.
|
||||
|
||||
The title and body support markdown.
|
||||
|
||||
_definition: **_property:** //SIGNATURE//
|
||||
A //property// has its JavaScript **SIGNATURE** formatted.
|
||||
|
||||
The body supports markdown and the return portion of the signature
|
||||
support markdown links.
|
||||
|
||||
**Extensions:** [@src](flatworm--ext-src)
|
||||
|
||||
_definition: **_note:** //BANNER//
|
||||
A //note// is placed in a blue bordered-box to draw attention to it.
|
||||
|
||||
The body supports markdown.
|
||||
|
||||
_definition: **_warning:** //BANNER//
|
||||
A //warning// is placed in an orange bordered-box to draw attention to it.
|
||||
|
||||
The body supports markdown.
|
||||
|
||||
_definition: **_code:** //CAPTION//
|
||||
Creates a [Code](flatworm--code) block.
|
||||
|
||||
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.
|
||||
|
||||
_code: Example @lang<text>
|
||||
|
||||
\_section: Hello World @<link-main>
|
||||
Body for section...
|
||||
|
||||
|
||||
\_subsection: Some Example @<link-secondary>
|
||||
Body for subsection...
|
||||
|
||||
|
||||
\_heading: Large Bold Text @<link-here>
|
||||
Body for heading...
|
||||
|
||||
|
||||
\_definition: Flatworm
|
||||
A phylum of relatively **simple** bilaterian, unsegmented,
|
||||
soft-bodied invertebrates.
|
||||
|
||||
|
||||
\_property: String.fromCharCode(code) => string
|
||||
Returns a string created from //code//, a sequence of
|
||||
UTF-16 code units.
|
||||
|
||||
|
||||
\_code: heading
|
||||
|
||||
// Some code goes here
|
||||
while(1);
|
||||
|
||||
|
||||
\_table: Table Footer
|
||||
|
||||
| **Name** | **Color** |
|
||||
| Apple | Red |
|
||||
| Banana | Yellow |
|
||||
| Grape | Purple |
|
||||
|
||||
|
||||
\_toc:
|
||||
some-file
|
||||
some-directory
|
||||
|
||||
|
||||
\_note: Title
|
||||
This is placed in a blue box.
|
||||
|
||||
|
||||
\_warning: Title
|
||||
This is placed in an orange box.
|
||||
|
||||
|
||||
\_null:
|
||||
This breaks out of a directive. For example, to end
|
||||
a ``_note:`` or ``_code:``.
|
||||
|
||||
|
||||
_subsection: Markdown @<flatworm-markdown>
|
||||
|
||||
The markdown is simple and does not have the flexibility of
|
||||
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**
|
||||
|
||||
//italic text//
|
||||
|
||||
__underlined text__
|
||||
|
||||
``monospace code``
|
||||
|
||||
^^superscript text^^
|
||||
|
||||
~~strikeout text~~
|
||||
|
||||
- This is a list
|
||||
- With bullet points
|
||||
- With a total of three items
|
||||
|
||||
This is a [Link to Ethereum](https://ethereum.org) and this
|
||||
is an [Internal Link](some-link).
|
||||
|
||||
This is a self-titled link [[https://ethereumorg]] and this
|
||||
[[some-link]] will use the title from its directives value.
|
||||
|
||||
|
||||
_subsection: 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 JavaScipt |
|
||||
| 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 varaible
|
||||
name must being with a letter and must only contain letters and numbers.
|
||||
|
||||
Variables are also useful when content is repeated throughout a table.
|
||||
|
||||
A variable is declared by starting a line with ``"$NAME:"``, which
|
||||
consumes all lines until the next variable declaration or until the
|
||||
next table row line.
|
||||
|
||||
A variable name must start with a letter and may consist of letters and
|
||||
numbers. (i.e. ``/[a-z][a-z0-9]*/i``)
|
||||
|
||||
_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
|
||||
a simple JSON file (config.json) or a JS file (config.js) placed in
|
||||
the top of the source folder.
|
||||
|
||||
TODO: example JSON and example JS
|
||||
|
||||
|
||||
_subsection: Extensions @<flatworm-extensions>
|
||||
|
||||
_heading: @inherit\< //markdown// > @<flatworm--ext-inherit>
|
||||
|
||||
Adds an inherits description to a directive. The //markdown// may contain links.
|
||||
|
||||
|
||||
_heading: @lang\< //text// > @<flatworm--ext-lang>
|
||||
|
||||
Set the language a [code directive](flatworm--code) should be
|
||||
syntax-highlighted for. If "javascript", the code will be evaluated.
|
||||
|
||||
|
||||
_heading: @nav\< //text// > @<flatworm--ext-nav>
|
||||
|
||||
Sets the name in the breadcrumbs when not the current node.
|
||||
|
||||
|
||||
_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\< //key// > @<flatworm--ext-src>
|
||||
|
||||
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.
|
||||
@@ -1,23 +0,0 @@
|
||||
_section: Hello World @<link-to-this-section>
|
||||
|
||||
_subsection: Some Example @<link-to-this-subsection>
|
||||
|
||||
_heading: Large Bold Text @<link-to-this-heading>
|
||||
|
||||
_definition: Flatworm
|
||||
A phylum of relatively **simple** bilaterian, unsegmented,
|
||||
soft-bodied invertebrates.
|
||||
|
||||
_property: String.fromCharCode(code) => string
|
||||
Returns a string created from //code//, a sequence of
|
||||
UTF-16 code units.
|
||||
|
||||
_code: filename.js
|
||||
|
||||
_toc:
|
||||
some-file
|
||||
some-directory
|
||||
|
||||
_null:
|
||||
This breaks out of a directive. For example, to end a
|
||||
_definition and reset the indentation.
|
||||
@@ -1,7 +0,0 @@
|
||||
_DIRECTIVE: VALUE @<LINK>
|
||||
BODY
|
||||
|
||||
DIRECTIVE: The directive name
|
||||
VALUE: Optional; the value to pass to the directive
|
||||
LINK: Optional; a name for internal linking
|
||||
BODY: Optional; the directive body (certain directives only)
|
||||
@@ -1,85 +0,0 @@
|
||||
_title: Flatworm Docs
|
||||
|
||||
_section: Flatworm Docs
|
||||
|
||||
The //Flatworm Docs// rendering script is designed to be **very**
|
||||
simple, but provide enough formatting necessary for documenting
|
||||
JavaScript libraries.
|
||||
|
||||
A lot of its inspiration came from [Read the Docs](https://github.com/readthedocs/sphinx_rtd_theme) and
|
||||
the [Sphinx](https://www.sphinx-doc.org/) project.
|
||||
|
||||
|
||||
_subsection: 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.
|
||||
|
||||
|
||||
_heading: Directive Format
|
||||
|
||||
_code: fragment.txt
|
||||
|
||||
|
||||
_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.
|
||||
|
||||
_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.
|
||||
|
||||
_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.
|
||||
|
||||
_definition: **_definition:** //TERM//
|
||||
A //definition// has its **TERM** bolded and the markdown body is
|
||||
indented.
|
||||
|
||||
_definition: **_property:** //SIGNATURE//
|
||||
A //property// has its JavaScript **SIGNATURE** formatted and the
|
||||
markdown body is indented.
|
||||
|
||||
_definition: **_code:** //FILENAME//
|
||||
A //code// reads the **FILENAME** and depending on the extension
|
||||
adjusts it.
|
||||
|
||||
For JavaScript files, the file is executed, with ``\/\/!`` replaced
|
||||
with the result of the last statement and ``\/\/!error`` is replaced
|
||||
with the throw error. If the error state does not agree, rendering
|
||||
fails.
|
||||
|
||||
_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//.
|
||||
|
||||
_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.
|
||||
|
||||
|
||||
_heading: Examples
|
||||
|
||||
_code: examples.txt
|
||||
|
||||
|
||||
_subsection: Markdown @<flatworm-markdown>
|
||||
|
||||
The markdown is simple and does not have the flexibility of
|
||||
other dialects, but allows for **bold**, //italic//,
|
||||
__underlined__, ``monospaced``, ^^super-scripted^^ text,
|
||||
supporting [links](flatworm-markdown) and lists.
|
||||
|
||||
_code: markdown.txt
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
**bold text**
|
||||
|
||||
//italic text//
|
||||
|
||||
__underlined text__
|
||||
|
||||
``monospace code``
|
||||
|
||||
^^superscript text^^
|
||||
|
||||
- This is a list
|
||||
- With bullet points
|
||||
- With a total of three items
|
||||
|
||||
This is separated by -- an en-dash.
|
||||
|
||||
This is separated by --- an em-dash.
|
||||
|
||||
This is a [Link to Ethereum](https://ethereum.org) and this
|
||||
is an [Internal Link](some-link).
|
||||
|
||||
This is a self-titled link [[https://ethereumorg]] and this
|
||||
[[some-link]] will use the title from its directives value.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user