Compare commits
862 Commits
contracts@
...
@0xproject
Author | SHA1 | Date | |
---|---|---|---|
|
631e7e9c58 | ||
|
c44f9e56ad | ||
|
2fe209d5ff | ||
|
7d8badc86e | ||
|
854d65b51b | ||
|
df773d07f3 | ||
|
efdbc1ff6c | ||
|
a9b5faa787 | ||
|
49a54c0ff6 | ||
|
70d403e6f8 | ||
|
eecf09f515 | ||
|
61fc3346c2 | ||
|
b7e98abc43 | ||
|
073bf738dd | ||
|
68e8d6f304 | ||
|
524e4707d2 | ||
|
a0fac663f7 | ||
|
277e58c2e5 | ||
|
774ab8a8ef | ||
|
21dc94b709 | ||
|
d6176872f7 | ||
|
c396be42b9 | ||
|
7f7ddee0f9 | ||
|
b99c797945 | ||
|
59edca4166 | ||
|
fbba5e054a | ||
|
ea47613d90 | ||
|
9d18f751c8 | ||
|
9745dfe2f4 | ||
|
29d38593d6 | ||
|
d76bc18bb7 | ||
|
cbe61ac315 | ||
|
250d97a7c4 | ||
|
249bf0163d | ||
|
674e56cea6 | ||
|
61809130a6 | ||
|
f5e6e0eaf7 | ||
|
b2c423dd84 | ||
|
4a9752d7cd | ||
|
7db9a01639 | ||
|
e9cb5c069a | ||
|
03e4205700 | ||
|
fd9278ac02 | ||
|
1b7c7037b8 | ||
|
913264c811 | ||
|
e70b6630f9 | ||
|
6d53947fd8 | ||
|
1c0d982398 | ||
|
a88b4040ff | ||
|
e8073cd6f2 | ||
|
8281be235c | ||
|
9ce03e3515 | ||
|
667938696d | ||
|
a165281dcf | ||
|
185f70f2dd | ||
|
cd3e14f45a | ||
|
dd87588dfe | ||
|
29042e1939 | ||
|
4dbf6559aa | ||
|
b987b5988d | ||
|
6ba6bec105 | ||
|
d95b1e2db4 | ||
|
c1d6c7ff66 | ||
|
6e12794765 | ||
|
0f4b05e374 | ||
|
695b697cdf | ||
|
3aea0e3b2f | ||
|
c0e92d511e | ||
|
51f2a20b2a | ||
|
333a23f222 | ||
|
3bf3f479f5 | ||
|
6241d06f27 | ||
|
9e81d3c87b | ||
|
a9b2838c5f | ||
|
fbc39614c0 | ||
|
b2d6ac8dba | ||
|
b090b7b1f2 | ||
|
ba0696a0d7 | ||
|
b57850a225 | ||
|
4d9029bb0e | ||
|
bc49dde4d5 | ||
|
afe07b2926 | ||
|
2411bfc20f | ||
|
4d4ea8a4d0 | ||
|
595517e68b | ||
|
40ab2de393 | ||
|
723276ae3f | ||
|
76c5945017 | ||
|
01c6fd92e8 | ||
|
3f230a8fdb | ||
|
2a6a71ea6c | ||
|
cd23f220a0 | ||
|
fab88ea2cc | ||
|
688f8615ff | ||
|
d187a31e38 | ||
|
c6f85464ce | ||
|
a220b56736 | ||
|
0e33f45f3d | ||
|
ff7c3012a5 | ||
|
20fec2943b | ||
|
08b30b0706 | ||
|
bf52ce7e72 | ||
|
1bac5019e8 | ||
|
19454a92dc | ||
|
cdbb3a015f | ||
|
644da2b0cb | ||
|
57446d78f1 | ||
|
3e285c0ef1 | ||
|
a322148631 | ||
|
33ec9fdf47 | ||
|
323826111a | ||
|
ddd3d284d9 | ||
|
f55a300f43 | ||
|
08a69ebd6e | ||
|
ddb8e26bec | ||
|
57ca611e12 | ||
|
1eff120f49 | ||
|
4bc6096ec0 | ||
|
95eb114051 | ||
|
9c856de49c | ||
|
d502f79303 | ||
|
5224337323 | ||
|
ef49192170 | ||
|
c9df388731 | ||
|
870da2ab22 | ||
|
6122840241 | ||
|
03b00ef8da | ||
|
84b820abc6 | ||
|
cc4ff568a9 | ||
|
665011174b | ||
|
37f210e9f0 | ||
|
9c01e3a8a0 | ||
|
c4dd9658e7 | ||
|
29aa09e448 | ||
|
1337b6928a | ||
|
ac35d8127e | ||
|
a6ae1efadb | ||
|
bd7b5c51b2 | ||
|
397cd77ef9 | ||
|
743c3dbe01 | ||
|
9f1c212596 | ||
|
defd249565 | ||
|
8926dac78c | ||
|
18cac3f092 | ||
|
01e27426d6 | ||
|
0b09cc36b0 | ||
|
f3cb484f82 | ||
|
0053762760 | ||
|
d72b7299c6 | ||
|
eb89ef79eb | ||
|
066d13f5b7 | ||
|
ec06d8d606 | ||
|
a2e4aaa9a3 | ||
|
26e9696ddb | ||
|
343191e936 | ||
|
3e3b667366 | ||
|
3b45d4727b | ||
|
b4f3450d4a | ||
|
0a8b7cb494 | ||
|
125ace3519 | ||
|
109fc41474 | ||
|
f30353087f | ||
|
d106079d9b | ||
|
dc3be992a3 | ||
|
bed7d87b7f | ||
|
05daab5dea | ||
|
170e5589f9 | ||
|
538914aa52 | ||
|
81deb68c8e | ||
|
36986fe9c9 | ||
|
5791632933 | ||
|
289359bf0d | ||
|
81f6487865 | ||
|
21b797c3f9 | ||
|
de8450d5c9 | ||
|
bcb9ee4cc2 | ||
|
7c87447241 | ||
|
b39d87f357 | ||
|
552b14b1fa | ||
|
5779ffd01b | ||
|
a7c24a17f4 | ||
|
8743c40911 | ||
|
7ef6bd4b14 | ||
|
6af0f08dfc | ||
|
54ae94dde0 | ||
|
c570f3865f | ||
|
ed9d1da297 | ||
|
beb483ea85 | ||
|
46b7fecafe | ||
|
e476682922 | ||
|
8478dc8d6d | ||
|
9f8e41cbfa | ||
|
3916383dd0 | ||
|
a60c8f7d8c | ||
|
4e5cd472c2 | ||
|
e1341bc6d9 | ||
|
d437a66019 | ||
|
542b46a22f | ||
|
6fef533fff | ||
|
ec219fc395 | ||
|
a555a8a374 | ||
|
78e9c48803 | ||
|
18d3e5458a | ||
|
ac25764d12 | ||
|
c55e7fa91a | ||
|
e31ba2e12e | ||
|
73f8ae9a47 | ||
|
32b85625c1 | ||
|
629edd3108 | ||
|
ee77b81551 | ||
|
2c7fdac5cd | ||
|
d118116548 | ||
|
8d01956c3e | ||
|
1dda8c1468 | ||
|
111f7e917e | ||
|
477daf4168 | ||
|
8b52793f2f | ||
|
18b9fe5256 | ||
|
439e864085 | ||
|
f45191d0e8 | ||
|
32feadee42 | ||
|
c4b4bb9e8e | ||
|
8fd705d2af | ||
|
3c36135d6c | ||
|
02ede26893 | ||
|
af21ad1615 | ||
|
07fa01528b | ||
|
38f716bd77 | ||
|
6a410b03ff | ||
|
3cd7bce0a3 | ||
|
6693540f43 | ||
|
647bc5a63e | ||
|
4f76bb2a12 | ||
|
9991ddecc2 | ||
|
3cf2cb89bb | ||
|
2875cfa8c7 | ||
|
87cbbdad72 | ||
|
07de3a1d94 | ||
|
27880a6059 | ||
|
0367e4117a | ||
|
ec582d6e46 | ||
|
4ca706d4e6 | ||
|
72671c1014 | ||
|
a3c31f4f4a | ||
|
db8be4a66e | ||
|
2f7c19e80d | ||
|
7d9c357409 | ||
|
abf41b073c | ||
|
c9b07107f3 | ||
|
773be348a3 | ||
|
b7bb8d9b2a | ||
|
c7c12371ef | ||
|
fb40b10501 | ||
|
d4dce41d3a | ||
|
293b55e51f | ||
|
11bac66046 | ||
|
2a438419ab | ||
|
0f0aca7de5 | ||
|
f699b9a73f | ||
|
214096de9e | ||
|
a0ccb609cd | ||
|
4e05554b3e | ||
|
04c08b9fc8 | ||
|
86c1c8082d | ||
|
c5afc5feb5 | ||
|
8392ee4625 | ||
|
ac881d149c | ||
|
cc4e390c91 | ||
|
26c726da45 | ||
|
358f3d9b42 | ||
|
3337625fa0 | ||
|
ae2daa5a6f | ||
|
79f521b555 | ||
|
fffcb98ac4 | ||
|
5468358f21 | ||
|
87044313c2 | ||
|
794b155827 | ||
|
4941ffd354 | ||
|
aa8a3ee055 | ||
|
c1d17c83f8 | ||
|
db030016fa | ||
|
ae04f55882 | ||
|
b40fab35f6 | ||
|
644deee8b5 | ||
|
c7302c46e5 | ||
|
4948551703 | ||
|
d4c1b3b0bd | ||
|
bbdb072634 | ||
|
d7bf003d51 | ||
|
5a827eb3d4 | ||
|
b37076136b | ||
|
3574ab253f | ||
|
312a30578b | ||
|
8243e73413 | ||
|
5175fe8107 | ||
|
2acb767640 | ||
|
a9b1dcb32a | ||
|
8f8577b7c6 | ||
|
0225d34b74 | ||
|
8d1e27a1a5 | ||
|
e4ea6e1ec3 | ||
|
8137d41ce5 | ||
|
4b7f0bd374 | ||
|
f9ad97b978 | ||
|
b145a17d11 | ||
|
3430e2bdac | ||
|
cdcf925378 | ||
|
76029cbf09 | ||
|
b9c1653c1c | ||
|
f6c01520ae | ||
|
0fb4de85c4 | ||
|
ffe7363776 | ||
|
4a27a7dc58 | ||
|
3b3d5b12bc | ||
|
380e51ca50 | ||
|
aea7207b9f | ||
|
9593739938 | ||
|
40ebb533b3 | ||
|
7fe26ee719 | ||
|
28d63ad8e1 | ||
|
56eeea1e63 | ||
|
642a2cf165 | ||
|
e16feb27f4 | ||
|
83ae7ba08d | ||
|
a86f8a81a2 | ||
|
28abcef1ca | ||
|
32d15d79f1 | ||
|
538ac604a8 | ||
|
009b70f5b2 | ||
|
f7c1e10b5a | ||
|
3f3e8be004 | ||
|
cb612360ca | ||
|
6a8c2cb717 | ||
|
c8a8b851d8 | ||
|
ba9a734ba7 | ||
|
b08374f0ba | ||
|
c2f8858aab | ||
|
1f81fa1c6c | ||
|
db44a5bca7 | ||
|
53e1815c1d | ||
|
20985d515f | ||
|
0334004b11 | ||
|
95e2b37d62 | ||
|
dba1b8a7e9 | ||
|
ee29ed26ff | ||
|
a08ae722c1 | ||
|
b3c1c0ccad | ||
|
e1fa65f5ef | ||
|
a2e848a7fa | ||
|
67fbffc964 | ||
|
c3b4359e87 | ||
|
11ed5d62ba | ||
|
5827170815 | ||
|
ca25b816fa | ||
|
a9db0e8ebe | ||
|
a0791455e1 | ||
|
efb0ee4c02 | ||
|
df1968157c | ||
|
355aac2a1a | ||
|
b93b66edfb | ||
|
92a4e77288 | ||
|
7ac646ff94 | ||
|
ef6aa9f41b | ||
|
df9e7385ad | ||
|
e065ac45dc | ||
|
745af5309d | ||
|
952f1cf8d0 | ||
|
86a55fe55a | ||
|
88c6694ffc | ||
|
20826e0f08 | ||
|
e474096119 | ||
|
075f286130 | ||
|
32e3cab116 | ||
|
49ff4299c6 | ||
|
4d18a4802d | ||
|
d613791104 | ||
|
44f7f79bd9 | ||
|
1cdfbbadaa | ||
|
76a31b6fd6 | ||
|
0ad3d06ef9 | ||
|
fb0fd8ddc4 | ||
|
2a9913b8fb | ||
|
9b8d2ed469 | ||
|
17148df06d | ||
|
d93089fcc0 | ||
|
870995933a | ||
|
d6c2e47bbd | ||
|
e2b2bf1e0d | ||
|
c4a18ee64b | ||
|
7143996d26 | ||
|
22f78a2c52 | ||
|
bd7517cfd4 | ||
|
9bffce9dc5 | ||
|
10f6a17857 | ||
|
2197c2481a | ||
|
8d90e640b0 | ||
|
368870a2fc | ||
|
945a19bb61 | ||
|
b0abc384bc | ||
|
8f45e9a518 | ||
|
b06f1d1982 | ||
|
4365350430 | ||
|
3b158cb726 | ||
|
2298a34c37 | ||
|
633039c528 | ||
|
ee31d5e24d | ||
|
f590aa11f7 | ||
|
6b7f48644c | ||
|
21aac75533 | ||
|
95b02a3197 | ||
|
be7c444959 | ||
|
f02d3f689d | ||
|
981752059c | ||
|
6c87ebac01 | ||
|
a9479b3c01 | ||
|
c5afca53a4 | ||
|
b4cb88ab26 | ||
|
ad4f607643 | ||
|
c7d340e822 | ||
|
2c501d2380 | ||
|
3787e4a83c | ||
|
3b77e4ebf1 | ||
|
6eebf717d5 | ||
|
98f32d6f1f | ||
|
62f45f7b41 | ||
|
a7d8f6599a | ||
|
4da6db8418 | ||
|
d991291f2a | ||
|
392fb42973 | ||
|
13299158d1 | ||
|
a6571b09d2 | ||
|
870ba445b8 | ||
|
caaa70f630 | ||
|
56a8e0a09a | ||
|
4c08667a07 | ||
|
4ac6b6828c | ||
|
c050186014 | ||
|
63f2606863 | ||
|
5160e0ba18 | ||
|
0aad2ee005 | ||
|
8a58ffda86 | ||
|
cea8dcae3d | ||
|
fc7e7d9331 | ||
|
494bff4bc0 | ||
|
824ee8a3dc | ||
|
47af38ecb8 | ||
|
654c790c3d | ||
|
7ebebb5bd9 | ||
|
8f921a61da | ||
|
cfd734d84f | ||
|
342a697e42 | ||
|
918f3cde94 | ||
|
7b82a8669d | ||
|
7116f100ee | ||
|
42fce45585 | ||
|
9da57daa7f | ||
|
e302d23317 | ||
|
0edfa83951 | ||
|
a5ba049427 | ||
|
adba69a589 | ||
|
cc73f72d13 | ||
|
e4f90996af | ||
|
974c0d2b95 | ||
|
d1fc2a115e | ||
|
a9373c7fb0 | ||
|
8b604462ac | ||
|
51e4a73439 | ||
|
d42cdcfd43 | ||
|
c18acd0859 | ||
|
9699ee4eff | ||
|
c78e504bfb | ||
|
0eeaac1f2b | ||
|
b578517f91 | ||
|
c009e9979e | ||
|
22b6097e95 | ||
|
8e3446a389 | ||
|
1747d7a1bb | ||
|
8e5a876b37 | ||
|
c71b710d7e | ||
|
7440b87596 | ||
|
583a17d627 | ||
|
caf1a22084 | ||
|
29abc5e921 | ||
|
098dae9a7e | ||
|
aaa7affa46 | ||
|
40ca846cdc | ||
|
da277f5b27 | ||
|
2a24f6e2ea | ||
|
98e8105ec5 | ||
|
4a94a2b4e8 | ||
|
2011349eb1 | ||
|
8057f4a678 | ||
|
f9ec8a0828 | ||
|
a0030c7bdb | ||
|
0e4448fd3f | ||
|
21d2d59b50 | ||
|
295f177271 | ||
|
f3154313a8 | ||
|
e37f3b4fa3 | ||
|
7e5c35d06e | ||
|
60756aa02b | ||
|
3779ab90de | ||
|
5b5037a844 | ||
|
03902b0b26 | ||
|
883feabb8b | ||
|
5fb79e3253 | ||
|
c44811fbc2 | ||
|
c3eaa694dd | ||
|
bd8b8abfea | ||
|
1a6c2e2bac | ||
|
e2e6ae937d | ||
|
5b9c5d2790 | ||
|
896a57d4ed | ||
|
c3de8d3a67 | ||
|
d1a92a0a2e | ||
|
5f626495fd | ||
|
238f3c89a7 | ||
|
6e724eb8a5 | ||
|
9aec1feae3 | ||
|
8517de128b | ||
|
a3e15c910c | ||
|
a6303de4d1 | ||
|
5356b0e118 | ||
|
e31309f213 | ||
|
6f8a70834b | ||
|
327cc307b3 | ||
|
f191ba6e69 | ||
|
a2b89411b0 | ||
|
f66efed777 | ||
|
f61b59fa89 | ||
|
6288a72036 | ||
|
a941f0ffb6 | ||
|
d7373a5c04 | ||
|
2ff485d2e0 | ||
|
5a67068348 | ||
|
d39af6c9eb | ||
|
1789025da9 | ||
|
696f49497b | ||
|
e88eba1877 | ||
|
f8b8a10b8f | ||
|
01e505a5f4 | ||
|
5b2d9a4668 | ||
|
71008dc819 | ||
|
f27e943258 | ||
|
9301173f7d | ||
|
60d95475eb | ||
|
c8ace2edc0 | ||
|
0b1ba9f997 | ||
|
f3026e33fd | ||
|
f014a97e9a | ||
|
ddad09a936 | ||
|
5dd0654105 | ||
|
b4b664e97a | ||
|
551771235b | ||
|
eb201c4084 | ||
|
7bfc499ec8 | ||
|
71e7e9c9c3 | ||
|
8521775389 | ||
|
61ad8d4c10 | ||
|
38a4ccd9f2 | ||
|
cf342dd00e | ||
|
08ab81c54c | ||
|
d355382f70 | ||
|
d171ce4fba | ||
|
5a90fece80 | ||
|
994935b5da | ||
|
874e667849 | ||
|
1817f6eaf6 | ||
|
2e19930178 | ||
|
2b01461748 | ||
|
24b9df475c | ||
|
011bab3c80 | ||
|
699c0c3e05 | ||
|
5f4b28960e | ||
|
3837913855 | ||
|
65eb3997d9 | ||
|
47411b406d | ||
|
f710026a8f | ||
|
925e133f50 | ||
|
2bdd60ed72 | ||
|
9ac1cce26f | ||
|
0a597c94d6 | ||
|
02f82be094 | ||
|
86e26240a1 | ||
|
82c5be2564 | ||
|
42f4f07268 | ||
|
df4db8fa4c | ||
|
bd85fe0af3 | ||
|
aee15e5dff | ||
|
d7a803d9fd | ||
|
839e5895e4 | ||
|
49a4f0c74c | ||
|
5bea8e63de | ||
|
e64be284dd | ||
|
e11e26a352 | ||
|
bee90abbc4 | ||
|
8782559c33 | ||
|
223ddc0f68 | ||
|
4445d1d5a0 | ||
|
b7d001da88 | ||
|
3592ebef08 | ||
|
a783d21409 | ||
|
a716e3de74 | ||
|
c797c720be | ||
|
1b5742fbf0 | ||
|
5794349d97 | ||
|
456f094913 | ||
|
abb9eb0df4 | ||
|
9e7b45ea4c | ||
|
6c6bd60a48 | ||
|
cef82e72dc | ||
|
45b9647ba0 | ||
|
160f74d53e | ||
|
3ab6139522 | ||
|
9aa54257e7 | ||
|
8eafa62bbe | ||
|
968c24f0bc | ||
|
e5c755b1fc | ||
|
6d56f01c40 | ||
|
eefce48e68 | ||
|
c7d97c733a | ||
|
3db42deb42 | ||
|
02603e8926 | ||
|
c5003554f4 | ||
|
eb223805ca | ||
|
244c148a80 | ||
|
4dbb2ed167 | ||
|
212d680a47 | ||
|
a853e35dec | ||
|
fdaf9f0bfc | ||
|
0afe45b3a8 | ||
|
f9a37168b0 | ||
|
52232e98c7 | ||
|
0fbb443e4b | ||
|
8021694b81 | ||
|
a2b262c9df | ||
|
5906f4c995 | ||
|
da8edd2226 | ||
|
406aedfdc2 | ||
|
67c834841e | ||
|
edaa0b0e34 | ||
|
31f03fcf3a | ||
|
4a57f2a762 | ||
|
92b9dbd706 | ||
|
6edd7682a9 | ||
|
447891b396 | ||
|
89bfcafb80 | ||
|
a74a04c5d5 | ||
|
0c16f0ea22 | ||
|
003d43b03a | ||
|
6323496945 | ||
|
fd5e231a93 | ||
|
ae209677de | ||
|
d5ca00de95 | ||
|
7be84c6ad3 | ||
|
425039e4d3 | ||
|
6c5333180d | ||
|
cb47a51b70 | ||
|
e36fb654b0 | ||
|
6325fac020 | ||
|
c6358d5f22 | ||
|
413e8b6062 | ||
|
e113a8e7af | ||
|
e42891ae5b | ||
|
c90770472e | ||
|
45df9de5b5 | ||
|
2d0940589e | ||
|
5908f189a7 | ||
|
17328bce53 | ||
|
451a0dacbe | ||
|
a46199e37d | ||
|
e25cc301fd | ||
|
5bbb0d1f60 | ||
|
a5b8875356 | ||
|
3e86df311d | ||
|
002f9ebde7 | ||
|
72e6e1ce8b | ||
|
a3c7af95e1 | ||
|
0987c9a7cf | ||
|
bbd87daf6d | ||
|
30e4613d0a | ||
|
79593f52b0 | ||
|
bab8c1eeff | ||
|
8b6cc95c1b | ||
|
90236b87de | ||
|
b6a133cc64 | ||
|
7aa070f9ea | ||
|
c2ec2291e8 | ||
|
97fcfb7f6c | ||
|
ce677fd55a | ||
|
e48a3edacb | ||
|
ce0b92d681 | ||
|
29c5ba5639 | ||
|
cdea618457 | ||
|
425a519f97 | ||
|
c07d64c6ff | ||
|
c07e3a76bb | ||
|
8fe844bcc9 | ||
|
a0390956a9 | ||
|
4f1e6296ca | ||
|
0ef372e531 | ||
|
06e2894750 | ||
|
10e2d4b99c | ||
|
ef40cb9687 | ||
|
758604fc1a | ||
|
34c1134b55 | ||
|
a5ef1db0c5 | ||
|
748ed40321 | ||
|
42063f785e | ||
|
1657451f37 | ||
|
0bb0bff0b3 | ||
|
747732118c | ||
|
2aec1501d0 | ||
|
39c6bc1106 | ||
|
4e451479f8 | ||
|
93b2736d65 | ||
|
34274a1042 | ||
|
fa822caa62 | ||
|
ddc30cc2c0 | ||
|
9d9cab1711 | ||
|
fe8f2d8d89 | ||
|
2d561bc8a0 | ||
|
f5275d3ad7 | ||
|
5fbdf9cfb9 | ||
|
0409c9c1e5 | ||
|
42a5da1df4 | ||
|
0b326a8bbe | ||
|
9c8501a84e | ||
|
2da7f82171 | ||
|
593474031d | ||
|
fce10548d2 | ||
|
addca63938 | ||
|
6961169f89 | ||
|
3d66feb89f | ||
|
bb157eefc6 | ||
|
7f8f4df0a0 | ||
|
4b325676f7 | ||
|
ecba95250d | ||
|
dd116b3cd6 | ||
|
eabe96fd19 | ||
|
7dd9ce2e32 | ||
|
fffaafe4c9 | ||
|
0b9646136a | ||
|
55f38b9c35 | ||
|
709fa9e02e | ||
|
f42bdb8bab | ||
|
10aed46062 | ||
|
6e43e89b2d | ||
|
10c0c0b6d2 | ||
|
e13924cd2d | ||
|
7afe00f06a | ||
|
87b9caa7dc | ||
|
f689d335c0 | ||
|
31f9a848f9 | ||
|
3d2c5d67af | ||
|
63f8f469b0 | ||
|
9929f1acf0 | ||
|
42ecc087cb | ||
|
93adee36b0 | ||
|
0e95fd0b9b | ||
|
611ddfeeb8 | ||
|
dfe2579eeb | ||
|
66b36f6d8f | ||
|
1b3a9102f1 | ||
|
9993a50903 | ||
|
c226509be0 | ||
|
ef6f52e722 | ||
|
7d8cad8e3a | ||
|
15507d3827 | ||
|
e2d17d122e | ||
|
0d7bf50581 | ||
|
a50618fcb0 | ||
|
fc2a9a756a | ||
|
07721eb99f | ||
|
13fed15e0c | ||
|
38a308ce5b | ||
|
be19316dfb | ||
|
c4f65681a1 | ||
|
f600226aa9 | ||
|
67f2864501 | ||
|
c1bbcaba73 | ||
|
6685cb3fba | ||
|
d770e46208 | ||
|
665636e642 | ||
|
0028e71ab2 | ||
|
7fb66bf71a | ||
|
3120d854f8 | ||
|
c85c14210f | ||
|
0fb81a11a8 | ||
|
7b67afae06 | ||
|
fe9e319a61 | ||
|
097fc477a2 | ||
|
f60b00d116 | ||
|
3a36e0621f | ||
|
b482473e23 | ||
|
9a5fd3f784 | ||
|
b703ccde9b | ||
|
80eca30725 | ||
|
7dbc14dc43 | ||
|
b3f9010eb5 | ||
|
f62d72e548 | ||
|
d12352972e | ||
|
03d3d84db3 | ||
|
6d818c25c7 | ||
|
6a8f624e75 | ||
|
0801b1ddf9 | ||
|
4fd64ca492 | ||
|
c4bcf24640 | ||
|
0114fc9608 | ||
|
8db098eaec | ||
|
05c3a66543 | ||
|
9349752baa | ||
|
974fab7284 | ||
|
8a52ffe7b7 | ||
|
c6ecdbd86e | ||
|
03797545f9 | ||
|
2778f96483 | ||
|
6cd4e7a17e | ||
|
5c91b4bfc6 | ||
|
e2b51c5dc4 | ||
|
b610b7c192 | ||
|
b75fdd6b66 | ||
|
060b02eaed | ||
|
003e5da00d | ||
|
02951d4813 | ||
|
db52ed9941 | ||
|
af333b1838 | ||
|
f62762bd0e | ||
|
4b67352278 | ||
|
76afb6b116 | ||
|
db52e87740 | ||
|
e22788abe8 | ||
|
bbfbfcda85 | ||
|
0dfb36e675 | ||
|
95a9d77301 | ||
|
ab1f070901 | ||
|
8201d5d1f8 | ||
|
8704c34a0f | ||
|
599adaf1bf | ||
|
778e399438 | ||
|
485ae4d997 | ||
|
8cd2ba3ad6 | ||
|
dbad7d1869 | ||
|
4d482438f5 | ||
|
b53a1b51d6 | ||
|
49375c73d4 | ||
|
98b78c56c5 | ||
|
f3e6ef0fa9 | ||
|
18e1c2dea5 | ||
|
91ae01e484 | ||
|
2897b72967 | ||
|
3510985cf4 | ||
|
5927e65045 | ||
|
13e2041d50 | ||
|
4bf530ed9e | ||
|
4c797405ad | ||
|
713c922e35 | ||
|
7f1e789264 | ||
|
07d00cc515 | ||
|
cd55e346af | ||
|
6746428fb1 | ||
|
ba57c34adb |
@@ -27,6 +27,15 @@ jobs:
|
|||||||
key: repo-{{ .Environment.CIRCLE_SHA1 }}
|
key: repo-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
paths:
|
paths:
|
||||||
- ~/repo
|
- ~/repo
|
||||||
|
test-installation:
|
||||||
|
docker:
|
||||||
|
- image: circleci/node:6.12
|
||||||
|
working_directory: ~/repo
|
||||||
|
steps:
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- run: yarn test:installation
|
||||||
test-0xjs:
|
test-0xjs:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:6.12
|
- image: circleci/node:6.12
|
||||||
@@ -40,6 +49,10 @@ jobs:
|
|||||||
command: npm run testrpc -- --db testrpc_snapshot
|
command: npm run testrpc -- --db testrpc_snapshot
|
||||||
background: true
|
background: true
|
||||||
- run: yarn lerna:run --scope 0x.js test:circleci
|
- run: yarn lerna:run --scope 0x.js test:circleci
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-0xjs-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/packages/0x.js/coverage/lcov.info
|
||||||
test-contracts:
|
test-contracts:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:6.12
|
- image: circleci/node:6.12
|
||||||
@@ -53,6 +66,10 @@ jobs:
|
|||||||
command: npm run testrpc -- --db testrpc_snapshot
|
command: npm run testrpc -- --db testrpc_snapshot
|
||||||
background: true
|
background: true
|
||||||
- run: yarn lerna:run --scope contracts test:circleci
|
- run: yarn lerna:run --scope contracts test:circleci
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-contracts-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/packages/contracts/coverage/lcov.info
|
||||||
test-deployer:
|
test-deployer:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:6.12
|
- image: circleci/node:6.12
|
||||||
@@ -66,6 +83,10 @@ jobs:
|
|||||||
command: npm run testrpc -- --db testrpc_snapshot
|
command: npm run testrpc -- --db testrpc_snapshot
|
||||||
background: true
|
background: true
|
||||||
- run: yarn lerna:run --scope @0xproject/deployer test:circleci
|
- run: yarn lerna:run --scope @0xproject/deployer test:circleci
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-deployer-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/packages/deployer/coverage/lcov.info
|
||||||
test-rest:
|
test-rest:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:6.12
|
- image: circleci/node:6.12
|
||||||
@@ -79,6 +100,30 @@ jobs:
|
|||||||
command: npm run testrpc -- --db testrpc_snapshot
|
command: npm run testrpc -- --db testrpc_snapshot
|
||||||
background: true
|
background: true
|
||||||
- run: yarn lerna:run --ignore contracts --ignore 0x.js --ignore @0xproject/deployer test:circleci
|
- run: yarn lerna:run --ignore contracts --ignore 0x.js --ignore @0xproject/deployer test:circleci
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-assert-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/packages/assert/coverage/lcov.info
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-connect-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/packages/connect/coverage/lcov.info
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-dev-utils-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/packages/dev-utils/coverage/lcov.info
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-json-schemas-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/packages/json-schemas/coverage/lcov.info
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-subproviders-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/packages/subproviders/coverage/lcov.info
|
||||||
|
- save_cache:
|
||||||
|
key: coverage-sol-cov-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
paths:
|
||||||
|
- ~/repo/packages/sol-cov/coverage/lcov.info
|
||||||
lint:
|
lint:
|
||||||
working_directory: ~/repo
|
working_directory: ~/repo
|
||||||
docker:
|
docker:
|
||||||
@@ -97,11 +142,50 @@ jobs:
|
|||||||
keys:
|
keys:
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
- run: yarn prettier:ci
|
- run: yarn prettier:ci
|
||||||
|
submit-coverage:
|
||||||
|
docker:
|
||||||
|
- image: circleci/node:6.12
|
||||||
|
working_directory: ~/repo
|
||||||
|
steps:
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-contracts-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-assert-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-connect-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-dev-utils-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-json-schemas-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-subproviders-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-sol-cov-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-deployer-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- coverage-0xjs-{{ .Environment.CIRCLE_SHA1 }}
|
||||||
|
- run: yarn report_coverage
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
version: 2
|
||||||
main:
|
main:
|
||||||
jobs:
|
jobs:
|
||||||
- build
|
- build
|
||||||
|
# - test-installation:
|
||||||
|
# requires:
|
||||||
|
# - build
|
||||||
- test-0xjs:
|
- test-0xjs:
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
@@ -120,3 +204,9 @@ workflows:
|
|||||||
- lint:
|
- lint:
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
|
- submit-coverage:
|
||||||
|
requires:
|
||||||
|
- test-0xjs
|
||||||
|
- test-deployer
|
||||||
|
- test-rest
|
||||||
|
- test-contracts
|
||||||
|
15
.gitignore
vendored
15
.gitignore
vendored
@@ -68,6 +68,21 @@ generated_docs/
|
|||||||
TODO.md
|
TODO.md
|
||||||
|
|
||||||
packages/website/public/bundle*
|
packages/website/public/bundle*
|
||||||
|
packages/react-docs/example/public/bundle*
|
||||||
|
|
||||||
# generated binaries
|
# generated binaries
|
||||||
bin/
|
bin/
|
||||||
|
|
||||||
|
# generated contract artifacts
|
||||||
|
packages/contracts/src/artifacts
|
||||||
|
|
||||||
|
# generated contract wrappers
|
||||||
|
packages/0x.js/src/contract_wrappers/generated/
|
||||||
|
packages/contracts/src/contract_wrappers/generated/
|
||||||
|
packages/metacoin/src/contract_wrappers
|
||||||
|
|
||||||
|
# solc-bin in deployer
|
||||||
|
packages/deployer/solc_bin/
|
||||||
|
|
||||||
|
# Monorepo scripts
|
||||||
|
packages/*/scripts/
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
lib
|
lib
|
||||||
generated
|
|
||||||
.nyc_output
|
.nyc_output
|
||||||
/packages/contracts/build/contracts
|
/packages/contracts/src/artifacts
|
||||||
package.json
|
package.json
|
||||||
|
scripts/postpublish_utils.js
|
||||||
|
@@ -8,9 +8,9 @@ If you'd like to contribute to 0x protocol, please fork the repo, fix, commit an
|
|||||||
|
|
||||||
We encourage a “PR early” approach so create the PR as early as possible even without the fix/feature ready, so that devs and other contributors know you have picked up the issue. These early PRs should indicate an 'in progress' status by adding the '[WIP]' prefix to the PR title. Please make sure your contributions adhere to our coding guidelines:
|
We encourage a “PR early” approach so create the PR as early as possible even without the fix/feature ready, so that devs and other contributors know you have picked up the issue. These early PRs should indicate an 'in progress' status by adding the '[WIP]' prefix to the PR title. Please make sure your contributions adhere to our coding guidelines:
|
||||||
|
|
||||||
* Pull requests adding features or refactoring should be opened against the `development` branch
|
* Pull requests adding features or refactoring should be opened against the `development` branch
|
||||||
* Pull requests fixing bugs in the latest release version should be opened again the `master` branch
|
* Pull requests fixing bugs in the latest release version should be opened again the `master` branch
|
||||||
* Write [good commit messages](https://chris.beams.io/posts/git-commit/)
|
* Write [good commit messages](https://chris.beams.io/posts/git-commit/)
|
||||||
|
|
||||||
### Code quality
|
### Code quality
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ If the sub-package you are modifying has a `CHANGELOG.md` file, make sure to add
|
|||||||
|
|
||||||
### Styleguide
|
### Styleguide
|
||||||
|
|
||||||
We use [TSLint](https://palantir.github.io/tslint/) with [custom configs](https://github.com/0xProject/0x.js/tree/development/packages/tslint-config) to keep our code style consistent.
|
We use [TSLint](https://palantir.github.io/tslint/) with [custom configs](https://github.com/0xProject/0x-monorepo/tree/development/packages/tslint-config) to keep our code style consistent.
|
||||||
|
|
||||||
To lint your code just run: `yarn lint`
|
To lint your code just run: `yarn lint`
|
||||||
|
|
||||||
@@ -31,10 +31,10 @@ We also use [Prettier](https://prettier.io/) to auto-format our code. Be sure to
|
|||||||
|
|
||||||
If using the Atom text editor, we recommend you install the following packages:
|
If using the Atom text editor, we recommend you install the following packages:
|
||||||
|
|
||||||
* [atom-typescript](https://atom.io/packages/atom-typescript)
|
* [atom-typescript](https://atom.io/packages/atom-typescript)
|
||||||
* [linter-tslint](https://atom.io/packages/linter-tslint)
|
* [linter-tslint](https://atom.io/packages/linter-tslint)
|
||||||
* [prettier-atom](https://atom.io/packages/prettier-atom)
|
* [prettier-atom](https://atom.io/packages/prettier-atom)
|
||||||
* [language-ethereum](https://atom.io/packages/language-ethereum)
|
* [language-ethereum](https://atom.io/packages/language-ethereum)
|
||||||
|
|
||||||
Our CI will also run TSLint and Prettier as a part of the test run when you submit your PR. Make sure that the CI tests pass for your contribution.
|
Our CI will also run TSLint and Prettier as a part of the test run when you submit your PR. Make sure that the CI tests pass for your contribution.
|
||||||
|
|
||||||
|
@@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
|
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
|
||||||
|
|
||||||
* [ ] Bug fix (non-breaking change which fixes an issue)
|
* [ ] Bug fix (non-breaking change which fixes an issue)
|
||||||
* [ ] New feature (non-breaking change which adds functionality)
|
* [ ] New feature (non-breaking change which adds functionality)
|
||||||
* [ ] Breaking change (fix or feature that would cause existing functionality to change)
|
* [ ] Breaking change (fix or feature that would cause existing functionality to change)
|
||||||
|
|
||||||
## Checklist:
|
## Checklist:
|
||||||
|
|
||||||
@@ -34,9 +34,9 @@
|
|||||||
|
|
||||||
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
||||||
|
|
||||||
* [ ] Change requires a change to the documentation.
|
* [ ] Change requires a change to the documentation.
|
||||||
* [ ] Added tests to cover my changes.
|
* [ ] Added tests to cover my changes.
|
||||||
* [ ] Added new entries to the relevant CHANGELOGs.
|
* [ ] Added new entries to the relevant CHANGELOGs.
|
||||||
* [ ] Updated the new versions of the changed packages in the relevant CHANGELOGs.
|
* [ ] Updated the new versions of the changed packages in the relevant CHANGELOGs.
|
||||||
* [ ] Labeled this PR with the 'WIP' label if it is a work in progress.
|
* [ ] Labeled this PR with the 'WIP' label if it is a work in progress.
|
||||||
* [ ] Labeled this PR with the labels corresponding to the changed package.
|
* [ ] Labeled this PR with the labels corresponding to the changed package.
|
||||||
|
87
README.md
87
README.md
@@ -4,54 +4,71 @@
|
|||||||
|
|
||||||
[0x][website-url] is an open protocol that facilitates trustless, low friction exchange of Ethereum-based assets. A full description of the protocol may be found in our [whitepaper][whitepaper-url].
|
[0x][website-url] is an open protocol that facilitates trustless, low friction exchange of Ethereum-based assets. A full description of the protocol may be found in our [whitepaper][whitepaper-url].
|
||||||
|
|
||||||
This repository contains all the 0x developer tools written in TypeScript. Our hope is that these tools make it easy to build Relayers and other DApps that use the 0x protocol.
|
This repository is a monorepo including the 0x protocol smart contracts and numerous developer tools. Each public sub-package is independently published to NPM.
|
||||||
|
|
||||||
[website-url]: https://0xproject.com/
|
[website-url]: https://0xproject.com/
|
||||||
[whitepaper-url]: https://0xproject.com/pdfs/0x_white_paper.pdf
|
[whitepaper-url]: https://0xproject.com/pdfs/0x_white_paper.pdf
|
||||||
|
|
||||||
[](https://circleci.com/gh/0xProject/0x.js)
|
[](https://circleci.com/gh/0xProject/0x-monorepo)
|
||||||
[](https://coveralls.io/github/0xProject/0x.js?branch=master)
|
[](https://coveralls.io/github/0xProject/0x-monorepo?branch=development)
|
||||||
[](https://chat.0xproject.com)
|
[](https://chat.0xproject.com)
|
||||||
[](https://gitter.im/0xProject/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[](https://gitter.im/0xProject/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
[](https://opensource.org/licenses/Apache-2.0)
|
[](https://opensource.org/licenses/Apache-2.0)
|
||||||
[](https://greenkeeper.io/)
|
[](https://greenkeeper.io/)
|
||||||
|
|
||||||
### Published Packages
|
### Published Packages
|
||||||
|
|
||||||
| Package | Version | Description |
|
| Package | Version | Description |
|
||||||
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
|
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
|
||||||
| [`0x.js`](/packages/0x.js) | [](https://www.npmjs.com/package/0x.js) | A Javascript library for interacting with the 0x protocol |
|
| [`0x.js`](/packages/0x.js) | [](https://www.npmjs.com/package/0x.js) | A Javascript library for interacting with the 0x protocol |
|
||||||
| [`chai-as-promised-typescript-typings`](/packages/chai-as-promised-typescript-typings) | [](https://www.npmjs.com/package/chai-as-promised-typescript-typings) | Chai as promised typescript typings |
|
| [`@0xproject/abi-gen`](/packages/abi-gen) | [](https://www.npmjs.com/package/@0xproject/abi-gen) | Tool to generate TS wrappers from smart contract ABIs |
|
||||||
| [`chai-typescript-typings`](/packages/chai-typescript-typings) | [](https://www.npmjs.com/package/chai-typescript-typings) | Chai typescript typings |
|
| [`@0xproject/assert`](/packages/assert) | [](https://www.npmjs.com/package/@0xproject/assert) | Type and schema assertions used by our packages |
|
||||||
| [`web3-typescript-typings`](/packages/web3-typescript-typings) | [](https://www.npmjs.com/package/web3-typescript-typings) | Web3 typescript typings |
|
| [`@0xproject/base-contract`](/packages/base-contract) | [](https://www.npmjs.com/package/@0xproject/base-contract) | BaseContract used by auto-generated `abi-gen` wrapper contracts |
|
||||||
| [`@0xproject/abi-gen`](/packages/abi-gen) | [](https://www.npmjs.com/package/@0xproject/abi-gen) | Tool to generate TS wrappers from smart contract ABIs |
|
| [`@0xproject/connect`](/packages/connect) | [](https://www.npmjs.com/package/@0xproject/connect) | A Javascript library for interacting with the Standard Relayer API |
|
||||||
| [`@0xproject/assert`](/packages/assert) | [](https://www.npmjs.com/package/@0xproject/assert) | Type and schema assertions used by our packages |
|
| [`@0xproject/deployer`](/packages/deployer) | [](https://www.npmjs.com/package/@0xproject/deployer) | Solidity project compiler and deployer framework |
|
||||||
| [`@0xproject/connect`](/packages/connect) | [](https://www.npmjs.com/package/@0xproject/connect) | A Javascript library for interacting with the standard relayer api |
|
| [`@0xproject/dev-utils`](/packages/dev-utils) | [](https://www.npmjs.com/package/@0xproject/dev-utils) | Dev utils to be shared across 0x projects and packages |
|
||||||
| [`@0xproject/dev-utils`](/packages/dev-utils) | [](https://www.npmjs.com/package/@0xproject/dev-utils) | Dev utils to be shared across 0x projects and packages |
|
| [`@0xproject/json-schemas`](/packages/json-schemas) | [](https://www.npmjs.com/package/@0xproject/json-schemas) | 0x-related json schemas |
|
||||||
| [`@0xproject/json-schemas`](/packages/json-schemas) | [](https://www.npmjs.com/package/@0xproject/json-schemas) | 0x-related json schemas |
|
| [`@0xproject/monorepo-scripts`](/packages/monorepo-scripts) | [](https://www.npmjs.com/package/@0xproject/monorepo-scripts) | Monorepo scripts |
|
||||||
| [`@0xproject/subproviders`](/packages/subproviders) | [](https://www.npmjs.com/package/@0xproject/subproviders) | Useful web3 subproviders (e.g LedgerSubprovider) |
|
| [`@0xproject/react-docs`](/packages/react-docs) | [](https://www.npmjs.com/package/@0xproject/react-docs) | React documentation component for rendering TypeDoc & Doxity generated JSON |
|
||||||
| [`@0xproject/tslint-config`](/packages/tslint-config) | [](https://www.npmjs.com/package/@0xproject/tslint-config) | Custom 0x development TSLint rules |
|
| [`@0xproject/react-shared`](/packages/react-shared) | [](https://www.npmjs.com/package/@0xproject/react-shared) | 0x shared react components |
|
||||||
| [`@0xproject/types`](/packages/types) | [](https://www.npmjs.com/package/@0xproject/types) | Shared type declarations |
|
| [`@0xproject/sra-report`](/packages/sra-report) | [](https://www.npmjs.com/package/@0xproject/sra-report) | Generate reports for standard relayer API compliance |
|
||||||
| [`@0xproject/utils`](/packages/utils) | [](https://www.npmjs.com/package/@0xproject/utils) | Shared utilities |
|
| [`@0xproject/sol-cov`](/packages/sol-cov) | [](https://www.npmjs.com/package/@0xproject/sol-cov) | Solidity test coverage tool tool |
|
||||||
| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper |
|
| [`@0xproject/subproviders`](/packages/subproviders) | [](https://www.npmjs.com/package/@0xproject/subproviders) | Useful web3 subproviders (e.g LedgerSubprovider) |
|
||||||
|
| [`@0xproject/tslint-config`](/packages/tslint-config) | [](https://www.npmjs.com/package/@0xproject/tslint-config) | Custom 0x development TSLint rules |
|
||||||
|
| [`@0xproject/types`](/packages/types) | [](https://www.npmjs.com/package/@0xproject/types) | Shared type declarations |
|
||||||
|
| [`@0xproject/typescript-typings`](/packages/typescript-typings) | [](https://www.npmjs.com/package/@0xproject/typescript-typings) | Repository of types for external packages |
|
||||||
|
| [`@0xproject/utils`](/packages/utils) | [](https://www.npmjs.com/package/@0xproject/utils) | Shared utilities |
|
||||||
|
| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper |
|
||||||
|
|
||||||
### Private Packages
|
### Private Packages
|
||||||
|
|
||||||
| Package | Description |
|
| Package | Description |
|
||||||
| ----------------------------------------------------------- | ---------------------------------------------------------------- |
|
| --------------------------------------------------------------- | ---------------------------------------------------------------- |
|
||||||
| [`@0xproject/contracts`](/packages/contracts) | 0x solidity smart contracts & tests |
|
| [`@0xproject/contracts`](/packages/contracts) | 0x solidity smart contracts & tests |
|
||||||
| [`@0xproject/monorepo-scripts`](/packages/monorepo-scripts) | Shared monorepo scripts |
|
| [`@0xproject/react-docs-example`](/packages/react-docs-example) | Example documentation site created with `@0xproject/react-docs` |
|
||||||
| [`@0xproject/testnet-faucets`](/packages/testnet-faucets) | A faucet micro-service that dispenses test ERC20 tokens or Ether |
|
| [`@0xproject/testnet-faucets`](/packages/testnet-faucets) | A faucet micro-service that dispenses test ERC20 tokens or Ether |
|
||||||
| [`@0xproject/website`](/packages/website) | 0x website & Portal DApp |
|
| [`@0xproject/website`](/packages/website) | 0x website & Portal DApp |
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Dedicated documentation pages:
|
Dedicated documentation pages:
|
||||||
|
|
||||||
* [0x.js Library](https://0xproject.com/docs/0xjs)
|
* [0x.js Library](https://0xproject.com/docs/0xjs)
|
||||||
* [0x Connect](https://0xproject.com/docs/connect)
|
* [0x Connect](https://0xproject.com/docs/connect)
|
||||||
* [Smart contracts](https://0xproject.com/docs/contracts)
|
* [Smart contracts](https://0xproject.com/docs/contracts)
|
||||||
* [Standard Relayer API](https://github.com/0xProject/standard-relayer-api/blob/master/README.md)
|
* [Subproviders](https://0xproject.com/docs/subproviders)
|
||||||
|
* [Deployer](https://0xproject.com/docs/deployer)
|
||||||
|
* [Web3-wrapper](https://0xproject.com/docs/web3-wrapper)
|
||||||
|
* [JSON-schemas](https://0xproject.com/docs/json-schemas)
|
||||||
|
* [Sol-cov](https://0xproject.com/docs/sol-cov)
|
||||||
|
* [Standard Relayer API](https://github.com/0xProject/standard-relayer-api/blob/master/README.md)
|
||||||
|
|
||||||
|
Most of the packages require additional typings for external dependencies.
|
||||||
|
You can include those by prepending @0xproject/typescript-typings package to your [`typeRoots`](http://www.typescriptlang.org/docs/handbook/tsconfig-json.html) config.
|
||||||
|
|
||||||
|
```json
|
||||||
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
@@ -75,13 +92,17 @@ yarn install
|
|||||||
|
|
||||||
### Build
|
### Build
|
||||||
|
|
||||||
Build all packages
|
Build all packages. You need to do this before working on any given package. Although these packages
|
||||||
|
as independent, when run from within the monorepo, they are internally symlinked, to make development
|
||||||
|
easier. You can change several packages and run the changes without publishing them first to NPM. When
|
||||||
|
running `rebuild`, Lerna will figure out the dependency order of all the packages, and build them in
|
||||||
|
this order.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn lerna:run build
|
yarn lerna:rebuild
|
||||||
```
|
```
|
||||||
|
|
||||||
Continuously rebuild on exchange
|
Or continuously rebuild on change:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn dev
|
yarn dev
|
||||||
|
@@ -1,6 +1,11 @@
|
|||||||
{
|
{
|
||||||
"lerna": "2.5.1",
|
"lerna": "2.5.1",
|
||||||
"packages": ["packages/*"],
|
"packages": ["packages/*"],
|
||||||
|
"commands": {
|
||||||
|
"publish": {
|
||||||
|
"allowBranch": "development"
|
||||||
|
}
|
||||||
|
},
|
||||||
"version": "independent",
|
"version": "independent",
|
||||||
"commands": {
|
"commands": {
|
||||||
"publish": {
|
"publish": {
|
||||||
|
28
package.json
28
package.json
@@ -1,27 +1,37 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "0x.js",
|
"name": "0x-monorepo",
|
||||||
"workspaces": ["packages/*"],
|
"workspaces": [
|
||||||
|
"packages/*"
|
||||||
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "lerna run --parallel build:watch",
|
"dev": "lerna run --parallel build:watch",
|
||||||
"testrpc": "testrpc -p 8545 --networkId 50 -m \"${npm_package_config_mnemonic}\"",
|
"testrpc": "testrpc -p 8545 --networkId 50 -m \"${npm_package_config_mnemonic}\"",
|
||||||
"prettier": "prettier --write '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
"prettier": "prettier --write '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
||||||
"prettier:ci": "prettier --list-different '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
"prettier:ci": "prettier --list-different '**/*.{ts,tsx,json,md}' --config .prettierrc",
|
||||||
|
"report_coverage": "lcov-result-merger 'packages/*/coverage/lcov.info' | coveralls",
|
||||||
|
"test:installation": "node ./packages/monorepo-scripts/lib/test_installation.js",
|
||||||
|
"lerna:install": "yarn install",
|
||||||
"lerna:run": "lerna run",
|
"lerna:run": "lerna run",
|
||||||
"lerna:rebuild": "lerna run clean; lerna run build;",
|
"lerna:clean": "lerna run clean",
|
||||||
"lerna:publish":
|
"lerna:build": "lerna run build",
|
||||||
"yarn install; lerna run clean; lerna run build; lerna publish --registry=https://registry.npmjs.org/"
|
"lerna:rebuild": "run-s lerna:clean lerna:build",
|
||||||
|
"lerna:publish": "run-s lerna:install lerna:rebuild script:publish",
|
||||||
|
"lerna:publish:dry": "run-s lerna:install lerna:rebuild script:publish:dry",
|
||||||
|
"lerna:stage_docs": "lerna run docs:stage",
|
||||||
|
"script:publish": "node ./packages/monorepo-scripts/lib/publish.js",
|
||||||
|
"script:publish:dry": "IS_DRY_RUN=true yarn script:publish"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"mnemonic": "concert load couple harbor equip island argue ramp clarify fence smart topic"
|
"mnemonic": "concert load couple harbor equip island argue ramp clarify fence smart topic"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/utils": "^0.3.1",
|
|
||||||
"async-child-process": "^1.1.1",
|
"async-child-process": "^1.1.1",
|
||||||
|
"coveralls": "^3.0.0",
|
||||||
"ethereumjs-testrpc": "^6.0.3",
|
"ethereumjs-testrpc": "^6.0.3",
|
||||||
|
"lcov-result-merger": "^2.0.0",
|
||||||
"lerna": "^2.5.1",
|
"lerna": "^2.5.1",
|
||||||
"prettier": "1.9.2",
|
"npm-run-all": "^4.1.2",
|
||||||
"publish-release": "0xproject/publish-release",
|
"prettier": "^1.11.1"
|
||||||
"semver-sort": "^0.0.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -8,3 +8,4 @@ test/
|
|||||||
/contract_templates/
|
/contract_templates/
|
||||||
/generated_docs/
|
/generated_docs/
|
||||||
/scripts/
|
/scripts/
|
||||||
|
/lib/src/monorepo_scripts/
|
||||||
|
977
packages/0x.js/CHANGELOG.json
Normal file
977
packages/0x.js/CHANGELOG.json
Normal file
@@ -0,0 +1,977 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"version": "0.36.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Moved Web3.Provider to `@0xproject/types:Provider`",
|
||||||
|
"pr": 501
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1523462196
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.35.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Removed `ZeroExError.TransactionMiningTimeout` and moved it to '@0xproject/web3_wrapper' `Web3WrapperErrors.TransactionMiningTimeout`",
|
||||||
|
"pr": 485
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1522673609
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.34.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Fix the bug causing `zeroEx.exchange.fillOrdersUpToAsync` validation to fail if there were some extra orders passed",
|
||||||
|
"pr": 470
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Remove automatic instantiation of `zeroEx.orderStateWatcher`",
|
||||||
|
"pr": 488
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add `zeroEx.createOrderStateWatcher` to allow creating arbitrary number of OrderStateWatchers",
|
||||||
|
"pr": 488
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Added `stateLayer` setting to `OrderStateWatcherConfig` so OrderStateWatcher can be set to monitor different blockchain state layers",
|
||||||
|
"pr": 488
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1522658513
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.33.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package",
|
||||||
|
"pr": 452
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package",
|
||||||
|
"pr": 456
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1521298800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.33.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add missing EthersJs typescript typings as dependency"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520434800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.33.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Validate and lowercase all addresses in public methods",
|
||||||
|
"pr": 373
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Improve validation to force passing contract addresses on private networks",
|
||||||
|
"pr": 385
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Change `LogErrorContractEventArgs.errorId` type from `BigNumber` to `number`",
|
||||||
|
"pr": 413
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Rename all public `_unsubscribeAll` methods to `unsubscribeAll`",
|
||||||
|
"pr": 415
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Move web3 typings from devDep to dep since cannot use this package without it",
|
||||||
|
"pr": 429
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520089200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.32.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
|
||||||
|
"pr": 389
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1518102000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.32.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Reorganized `BlockParamLiteral` export into `@0xproject/types` package",
|
||||||
|
"pr": 355
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Now using `abi-gen` package to generate ContractEventArgs types",
|
||||||
|
"pr": 371
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1517929200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.32.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add `zeroEx.etherToken.getContractAddressIfExists`",
|
||||||
|
"pr": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Fixed the bug causing order watcher to throw if there is an event with the same signature but different indexed fields",
|
||||||
|
"pr": 366
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1517756400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.31.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix the bug causing order watcher to throw if makerToken === zrx",
|
||||||
|
"pr": 357
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1517410800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.31.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add the `shouldAddPersonalMessagePrefix` parameter to `signOrderHashAsync` so that the caller can decide on whether to add the personalMessage prefix before relaying the request to the signer. Parity Signer, Ledger and TestRPC add the prefix themselves, Metamask expects it to have already been added.",
|
||||||
|
"pr": 349
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1517238000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.30.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add Rinkeby testnet addresses to artifacts ",
|
||||||
|
"pr": 337
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Move @0xproject/types to dependencies from devDependencies fixing missing type errors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1517151600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.30.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix a bug allowing negative fill values ",
|
||||||
|
"pr": 212
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fix a bug that made it impossible to pass a custom ZRX address ",
|
||||||
|
"pr": 341
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1516719600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.30.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add an error parameter to the order watcher callback",
|
||||||
|
"pr": 312
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fix a bug making it impossible to catch some errors from awaitTransactionMinedAsync",
|
||||||
|
"pr": 312
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Fix a bug in fillOrdersUpTo validation making it impossible to fill up to if user doesn't have enough balance to fully fill all the orders",
|
||||||
|
"pr": 321
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1516114800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.29.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed bignumber config issue #301",
|
||||||
|
"pr": 305
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1515596400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.29.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Assert baseUnit amount supplied to `toUnitAmount` is integer amount.",
|
||||||
|
"pr": 287
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "`toBaseUnitAmount` throws if amount supplied has too many decimals",
|
||||||
|
"pr": 287
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1514386800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.28.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add `etherTokenAddress` arg to `depositAsync` and `withdrawAsync` methods on `zeroEx.etherToken`",
|
||||||
|
"pr": 267
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Removed accidentally included `unsubscribeAll` method from `zeroEx.proxy`, `zeroEx.etherToken` and `zeroEx.tokenRegistry`",
|
||||||
|
"pr": 267
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Removed `etherTokenContractAddress` from `ZeroEx` constructor arg `ZeroExConfig`",
|
||||||
|
"pr": 267
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Rename `SubscriptionOpts` to `BlockRange`",
|
||||||
|
"pr": 272
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add `zeroEx.etherToken.subscribe`, `zeroEx.etherToken.unsubscribe`, `zeroEx.etherToken.unsubscribeAll`",
|
||||||
|
"pr": 277
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add `zeroEx.etherToken.getLogsAsync`",
|
||||||
|
"pr": 277
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add new public types `BlockParamLiteral`, `EtherTokenEvents`, `EtherTokenContractEventArgs`, `DepositContractEventArgs`, `WithdrawalContractEventArgs`",
|
||||||
|
"pr": 277
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Support `Deposit` and `Withdraw` events on etherToken",
|
||||||
|
"pr": 277
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Improve the error message when taker is not a string",
|
||||||
|
"pr": 278
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1513695600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.27.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Export `TransactionOpts` type"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1511794800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.27.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Make `ZeroExConfig` required parameter of `ZeroEx` constructor",
|
||||||
|
"pr": 233
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add a required property `networkId` to `ZeroExConfig`",
|
||||||
|
"pr": 233
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Make all `getContractAddress` functions, `zeroEx.exchange.subscribe`, `zeroEx.exchange.getZRXTokenAddress` sync",
|
||||||
|
"pr": 233
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Remove `ZeroExError.ContractNotFound` and replace it with contract-specific errors",
|
||||||
|
"pr": 233
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Make `DecodedLogEvent<A>` contain `LogWithDecodedArgs<A>` under log key instead of merging it in like web3 does",
|
||||||
|
"pr": 234
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Rename `removed` to `isRemoved` in `DecodedLogEvent<A>`",
|
||||||
|
"pr": 234
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add config allowing to specify gasPrice and gasLimit for every transaction sending method",
|
||||||
|
"pr": 235
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "All transaction sending methods now call `estimateGas` if no gas amount was supplied",
|
||||||
|
"pr": 235
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Modify order validation methods to validate against the `latest` block, not against the `pending` block",
|
||||||
|
"pr": 236
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1511794800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.26.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add post-formatter for logs converting `blockNumber`, `logIndex`, `transactionIndex` from hexes to numbers",
|
||||||
|
"pr": 231
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Remove support for Async callback types when used in Subscribe functions",
|
||||||
|
"pr": 222
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"In OrderWatcher subscribe to ZRX Token Transfer and Approval events when maker token is different",
|
||||||
|
"pr": 225
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1511190000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.25.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Standardise on Cancelled over Canceled",
|
||||||
|
"pr": 217
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add missing `DecodedLogEvent` type to exported types",
|
||||||
|
"pr": 205
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Normalized the transactionReceipt status to be `null|0|1`, 1 meaning transaction execution successful, 0 unsuccessful and `null` if it is a pre-byzantinium transaction.",
|
||||||
|
"pr": 200
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1510498800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.23.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed unhandled promise rejection error in subscribe methods",
|
||||||
|
"pr": 209
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Subscribe callbacks now receive an error object as their first argument"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1510412400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.22.6",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add a timeout parameter to transaction awaiting",
|
||||||
|
"pr": 206
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1510239600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.22.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Re-publish v0.22.4 to fix publishing issue"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1509980400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.22.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Upgraded bignumber.js to a new version that ships with native typings"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1508857200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.22.3",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed an issue with new version of testrpc and unlimited proxy allowance",
|
||||||
|
"pr": 199
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1508857200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.22.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed rounding of maker fill amount and incorrect validation of partial fees",
|
||||||
|
"pr": 197
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1508770800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.22.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Started using `OrderFillRequest` interface instead of `OrderFillOrKillRequest` interface for `zeroEx.exchange.batchFillOrKill`",
|
||||||
|
"pr": 187
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Removed `OrderFillOrKillRequest`",
|
||||||
|
"pr": 187
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1508079600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.21.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Made 0x.js more type-safe by making `getLogsAsync` and `subscribe/subscribeAsync` generics parametrized with arg type",
|
||||||
|
"pr": 194
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1507820400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.21.3",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed a bug causing order fills to throw `INSUFFICIENT_TAKER_ALLOWANCE`",
|
||||||
|
"pr": 193
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1507734000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.21.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Exported `ContractEventArg` as a public type",
|
||||||
|
"pr": 190
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1507647600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.21.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed a bug in subscriptions",
|
||||||
|
"pr": 189
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1507647600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.21.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Complete rewrite of subscription logic",
|
||||||
|
"pr": 182
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Subscriptions no longer return historical logs. If you want them - use `getLogsAsync`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Subscriptions now use [ethereumjs-blockstream](https://github.com/ethereumjs/ethereumjs-blockstream) under the hood"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Subscriptions correctly handle block re-orgs (forks)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Subscriptions correctly backfill logs (connection problems)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"They no longer setup filters on the underlying nodes, so you can use them with infura without a filter Subprovider"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Removed `ContractEventEmitter` and added `LogEvent`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Renamed `zeroEx.token.subscribeAsync` to `zeroEx.token.subscribe`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.token.unsubscribe` and `zeroEx.exchange.unsubscribe`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Renamed `zeroEx.exchange.stopWatchingAllEventsAsync` to `zeroEx.exhange.unsubscribeAll`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Renamed `zeroEx.token.stopWatchingAllEventsAsync` to `zeroEx.token.unsubscribeAll`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fixed the batch fills validation by emulating all balance & proxy allowance changes",
|
||||||
|
"pr": 185
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1507561200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.20.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add `zeroEx.token.getLogsAsync`",
|
||||||
|
"pr": 178
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add `zeroEx.exchange.getLogsAsync`",
|
||||||
|
"pr": 178
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fixed fees validation when one of the tokens transferred is ZRX",
|
||||||
|
"pr": 181
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1507129200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.19.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Made order validation optional ",
|
||||||
|
"pr": 172
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added Ropsten testnet support",
|
||||||
|
"pr": 173
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fixed a bug causing awaitTransactionMinedAsync to DDos backend nodes",
|
||||||
|
"pr": 175
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1506610800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.18.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.exchange.validateOrderFillableOrThrowAsync` to simplify orderbook pruning",
|
||||||
|
"pr": 170
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1506351600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.17.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Made `zeroEx.exchange.getZRXTokenAddressAsync` public",
|
||||||
|
"pr": 171
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1506351600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.16.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added the ability to specify custom contract addresses to be used with 0x.js",
|
||||||
|
"pr": 165
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "ZeroExConfig.exchangeContractAddress"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "ZeroExConfig.tokenRegistryContractAddress"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "ZeroExConfig.etherTokenContractAddress"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.tokenRegistry.getContractAddressAsync`",
|
||||||
|
"pr": 165
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1505833200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.15.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Added the ability to specify a historical `blockNumber` at which to query the blockchain's state when calling a token or exchange method",
|
||||||
|
"pr": 161
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1504796400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.14.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed an issue with bignumber.js types not found",
|
||||||
|
"pr": 160
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1504710000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.14.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed an issue with Artifact type not found",
|
||||||
|
"pr": 159
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1504710000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.14.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.exchange.throwLogErrorsAsErrors` method to public interface",
|
||||||
|
"pr": 157
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fixed an issue with overlapping async intervals in `zeroEx.awaitTransactionMinedAsync`",
|
||||||
|
"pr": 157
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fixed an issue with log decoder returning `BigNumber`s as `strings`",
|
||||||
|
"pr": 157
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1504623600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.13.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Made all the functions submitting transactions to the network to immediately return transaction hash",
|
||||||
|
"pr": 151
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.awaitTransactionMinedAsync`",
|
||||||
|
"pr": 151
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Added `TransactionReceiptWithDecodedLogs`, `LogWithDecodedArgs`, `DecodedLogArgs` to public types",
|
||||||
|
"pr": 151
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added signature validation to `validateFillOrderThrowIfInvalidAsync`",
|
||||||
|
"pr": 152
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1504623600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.12.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added the support for web3@1.x.x provider",
|
||||||
|
"pr": 142
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added the optional `zeroExConfig` parameter to the constructor of `ZeroEx`",
|
||||||
|
"pr": 139
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added the ability to specify `gasPrice` when instantiating `ZeroEx`",
|
||||||
|
"pr": 139
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1504278000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.11.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.token.setUnlimitedProxyAllowanceAsync`",
|
||||||
|
"pr": 137
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.token.setUnlimitedAllowanceAsync`",
|
||||||
|
"pr": 137
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS`",
|
||||||
|
"pr": 137
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1503500400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.10.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed a bug where checksummed addresses were being pulled from artifacts and not lower-cased.",
|
||||||
|
"pr": 135
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1503500400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.10.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.exchange.validateFillOrderThrowIfInvalidAsync`",
|
||||||
|
"pr": 128
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.exchange.validateFillOrKillOrderThrowIfInvalidAsync`",
|
||||||
|
"pr": 128
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.exchange.validateCancelOrderThrowIfInvalidAsync`",
|
||||||
|
"pr": 128
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.exchange.isRoundingErrorAsync`",
|
||||||
|
"pr": 128
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.proxy.getContractAddressAsync`",
|
||||||
|
"pr": 130
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.tokenRegistry.getTokenAddressesAsync`",
|
||||||
|
"pr": 132
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.tokenRegistry.getTokenAddressBySymbolIfExistsAsync`",
|
||||||
|
"pr": 132
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.tokenRegistry.getTokenAddressByNameIfExistsAsync`",
|
||||||
|
"pr": 132
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.tokenRegistry.getTokenBySymbolIfExistsAsync`",
|
||||||
|
"pr": 132
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.tokenRegistry.getTokenByNameIfExistsAsync`",
|
||||||
|
"pr": 132
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added clear error message when checksummed address is passed to a public method",
|
||||||
|
"pr": 124
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fixes the description of `shouldThrowOnInsufficientBalanceOrAllowance` in docs",
|
||||||
|
"pr": 127
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1503500400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.9.3",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Update contract artifacts to include latest Kovan and Mainnet deploys",
|
||||||
|
"pr": 118
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1503327600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.9.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "*This version was unpublished because of a publishing issue.*"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Update contract artifacts to include latest Kovan and Mainnet deploys",
|
||||||
|
"pr": 118
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1503241200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.9.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed the bug causing `zeroEx.token.getBalanceAsync()` to fail if no addresses available",
|
||||||
|
"pr": 120
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1502809200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.9.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Migrated to the new version of smart contracts",
|
||||||
|
"pr": 101
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Removed the ability to call methods on multiple authorized Exchange smart contracts",
|
||||||
|
"pr": 106
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Made `zeroEx.getOrderHashHex` a static method",
|
||||||
|
"pr": 107
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Cached `net_version` requests and invalidate the cache on calls to `setProvider`",
|
||||||
|
"pr": 95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Renamed `zeroEx.exchange.batchCancelOrderAsync` to `zeroEx.exchange.batchCancelOrdersAsync`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Renamed `zeroEx.exchange.batchFillOrderAsync` to `zeroEx.exchange.batchFillOrdersAsync`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Updated to typescript v2.4",
|
||||||
|
"pr": 104
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Fixed an issue with incorrect balance/allowance validation when ZRX is one of the tokens traded",
|
||||||
|
"pr": 109
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1500994800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.8.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Added the ability to call methods on different authorized versions of the Exchange smart contract",
|
||||||
|
"pr": 82
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Updated contract artifacts to reflect latest changes to the smart contracts (0xproject/contracts#59)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.proxy.isAuthorizedAsync` and `zeroEx.proxy.getAuthorizedAddressesAsync`",
|
||||||
|
"pr": 89
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added `zeroEx.token.subscribeAsync`",
|
||||||
|
"pr": 90
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Made contract invalidation functions private",
|
||||||
|
"pr": 90
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "`zeroEx.token.invalidateContractInstancesAsync`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "`zeroEx.exchange.invalidateContractInstancesAsync`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "`zeroEx.proxy.invalidateContractInstance`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "`zeroEx.tokenRegistry.invalidateContractInstance`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fixed the bug where `zeroEx.setProviderAsync` didn't invalidate etherToken contract's instance"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1499094000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.7.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Added the ability to convert Ether to wrapped Ether tokens and back via `zeroEx.etherToken.depostAsync` and `zeroEx.etherToken.withdrawAsync`",
|
||||||
|
"pr": 81
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1498402800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.7.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added Kovan smart contract artifacts",
|
||||||
|
"pr": 78
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Started returning fillAmount from `fillOrderAsync` and `fillUpToAsync`",
|
||||||
|
"pr": 72
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Started returning cancelledAmount from `cancelOrderAsync`",
|
||||||
|
"pr": 72
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Renamed type `LogCancelArgs` to `LogCancelContractEventArgs` and `LogFillArgs` to `LogFillContractEventArgs`"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1498057200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.6.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Reduced bundle size"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Improved documentation"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1497970800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.6.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Improved documentation"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1497798000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.6.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Made `ZeroEx` class accept `Web3Provider` instance instead of `Web3` instance"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Added types for contract event arguments"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1497798000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.5.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Fixed the bug in `postpublish` script that caused that only unminified UMD bundle was uploaded to release page"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1497452400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.5.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added `postpublish` script to publish to Github Releases with assets."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1497452400
|
||||||
|
}
|
||||||
|
]
|
@@ -1,56 +1,90 @@
|
|||||||
# CHANGELOG
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
## v0.32.2 - _February 9, 2018_
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.36.0 - _April 11, 2018_
|
||||||
|
|
||||||
|
* Moved Web3.Provider to `@0xproject/types:Provider` (#501)
|
||||||
|
|
||||||
|
## v0.35.0 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Removed `ZeroExError.TransactionMiningTimeout` and moved it to '@0xproject/web3_wrapper' `Web3WrapperErrors.TransactionMiningTimeout` (#485)
|
||||||
|
|
||||||
|
## v0.34.0 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Fix the bug causing `zeroEx.exchange.fillOrdersUpToAsync` validation to fail if there were some extra orders passed (#470)
|
||||||
|
* Remove automatic instantiation of `zeroEx.orderStateWatcher` (#488)
|
||||||
|
* Add `zeroEx.createOrderStateWatcher` to allow creating arbitrary number of OrderStateWatchers (#488)
|
||||||
|
* Added `stateLayer` setting to `OrderStateWatcherConfig` so OrderStateWatcher can be set to monitor different blockchain state layers (#488)
|
||||||
|
|
||||||
|
## v0.33.2 - _March 17, 2018_
|
||||||
|
|
||||||
|
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
|
||||||
|
* Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package (#456)
|
||||||
|
|
||||||
|
## v0.33.1 - _March 7, 2018_
|
||||||
|
|
||||||
|
* Add missing EthersJs typescript typings as dependency
|
||||||
|
|
||||||
|
## v0.33.0 - _March 3, 2018_
|
||||||
|
|
||||||
|
* Validate and lowercase all addresses in public methods (#373)
|
||||||
|
* Improve validation to force passing contract addresses on private networks (#385)
|
||||||
|
* Change `LogErrorContractEventArgs.errorId` type from `BigNumber` to `number` (#413)
|
||||||
|
* Rename all public `_unsubscribeAll` methods to `unsubscribeAll` (#415)
|
||||||
|
* Move web3 typings from devDep to dep since cannot use this package without it (#429)
|
||||||
|
|
||||||
|
## v0.32.2 - _February 8, 2018_
|
||||||
|
|
||||||
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
||||||
|
|
||||||
## v0.32.1 - _February 7, 2018_
|
## v0.32.1 - _February 6, 2018_
|
||||||
|
|
||||||
* Reorganized `BlockParamLiteral` export into `@0xproject/types` package (#355)
|
* Reorganized `BlockParamLiteral` export into `@0xproject/types` package (#355)
|
||||||
* Now using `abi-gen` package to generate ContractEventArgs types (#371)
|
* Now using `abi-gen` package to generate ContractEventArgs types (#371)
|
||||||
|
|
||||||
## v0.32.0 - _February 5, 2018_
|
## v0.32.0 - _February 4, 2018_
|
||||||
|
|
||||||
* Add `zeroEx.etherToken.getContractAddressIfExists` (#350)
|
* Add `zeroEx.etherToken.getContractAddressIfExists` (#350)
|
||||||
* Fixed the bug causing order watcher to throw if there is an event with the same signature but different indexed fields (#366)
|
* Fixed the bug causing order watcher to throw if there is an event with the same signature but different indexed fields (#366)
|
||||||
|
|
||||||
## v0.31.1 - _February 1, 2018_
|
## v0.31.1 - _January 31, 2018_
|
||||||
|
|
||||||
* Fix the bug causing order watcher to throw if makerToken === zrx (#357)
|
* Fix the bug causing order watcher to throw if makerToken === zrx (#357)
|
||||||
|
|
||||||
## v0.31.0 - _January 30, 2018_
|
## v0.31.0 - _January 29, 2018_
|
||||||
|
|
||||||
* Add the `shouldAddPersonalMessagePrefix` parameter to `signOrderHashAsync` so that the
|
* Add the `shouldAddPersonalMessagePrefix` parameter to `signOrderHashAsync` so that the caller can decide on whether to add the personalMessage prefix before relaying the request to the signer. Parity Signer, Ledger and TestRPC add the prefix themselves, Metamask expects it to have already been added. (#349)
|
||||||
caller can decide on whether to add the personalMessage prefix before relaying the request
|
|
||||||
to the signer. Parity Signer, Ledger and TestRPC add the prefix themselves, Metamask expects
|
|
||||||
it to have already been added. (#349)
|
|
||||||
|
|
||||||
## v0.30.2 - _January 29, 2018_
|
## v0.30.2 - _January 28, 2018_
|
||||||
|
|
||||||
* Add Rinkeby testnet addresses to artifacts (#337)
|
* Add Rinkeby testnet addresses to artifacts (#337)
|
||||||
* Move @0xproject/types to dependencies from devDependencies fixing missing type errors
|
* Move @0xproject/types to dependencies from devDependencies fixing missing type errors
|
||||||
|
|
||||||
## v0.30.1 - _January 24, 2018_
|
## v0.30.1 - _January 23, 2018_
|
||||||
|
|
||||||
* Fix a bug allowing negative fill values (#212)
|
* Fix a bug allowing negative fill values (#212)
|
||||||
* Fix a bug that made it impossible to pass a custom ZRX address (#341)
|
* Fix a bug that made it impossible to pass a custom ZRX address (#341)
|
||||||
|
|
||||||
## v0.30.0 - _January 17, 2018_
|
## v0.30.0 - _January 16, 2018_
|
||||||
|
|
||||||
* Add an error parameter to the order watcher callback (#312)
|
* Add an error parameter to the order watcher callback (#312)
|
||||||
* Fix a bug making it impossible to catch some errors from awaitTransactionMinedAsync (#312)
|
* Fix a bug making it impossible to catch some errors from awaitTransactionMinedAsync (#312)
|
||||||
* Fix a bug in fillOrdersUpTo validation making it impossible to fill up to if user doesn't have enough balance to fully fill all the orders (#321)
|
* Fix a bug in fillOrdersUpTo validation making it impossible to fill up to if user doesn't have enough balance to fully fill all the orders (#321)
|
||||||
|
|
||||||
## v0.29.1 - _January 11, 2018_
|
## v0.29.1 - _January 10, 2018_
|
||||||
|
|
||||||
* Fixed bignumber config issue #301 (#305)
|
* Fixed bignumber config issue #301 (#305)
|
||||||
|
|
||||||
## v0.29.0 - _December 28, 2017_
|
## v0.29.0 - _December 27, 2017_
|
||||||
|
|
||||||
* Assert baseUnit amount supplied to `toUnitAmount` is integer amount. (#287)
|
* Assert baseUnit amount supplied to `toUnitAmount` is integer amount. (#287)
|
||||||
* `toBaseUnitAmount` throws if amount supplied has too many decimals (#287)
|
* `toBaseUnitAmount` throws if amount supplied has too many decimals (#287)
|
||||||
|
|
||||||
## v0.28.0 - _December 20, 2017_
|
## v0.28.0 - _December 19, 2017_
|
||||||
|
|
||||||
* Add `etherTokenAddress` arg to `depositAsync` and `withdrawAsync` methods on `zeroEx.etherToken` (#267)
|
* Add `etherTokenAddress` arg to `depositAsync` and `withdrawAsync` methods on `zeroEx.etherToken` (#267)
|
||||||
* Removed accidentally included `unsubscribeAll` method from `zeroEx.proxy`, `zeroEx.etherToken` and `zeroEx.tokenRegistry` (#267)
|
* Removed accidentally included `unsubscribeAll` method from `zeroEx.proxy`, `zeroEx.etherToken` and `zeroEx.tokenRegistry` (#267)
|
||||||
@@ -62,11 +96,11 @@
|
|||||||
* Support `Deposit` and `Withdraw` events on etherToken (#277)
|
* Support `Deposit` and `Withdraw` events on etherToken (#277)
|
||||||
* Improve the error message when taker is not a string (#278)
|
* Improve the error message when taker is not a string (#278)
|
||||||
|
|
||||||
## v0.27.1 - _November 28, 2017_
|
## v0.27.1 - _November 27, 2017_
|
||||||
|
|
||||||
* Export `TransactionOpts` type
|
* Export `TransactionOpts` type
|
||||||
|
|
||||||
## v0.27.0 - _November 28, 2017_
|
## v0.27.0 - _November 27, 2017_
|
||||||
|
|
||||||
* Make `ZeroExConfig` required parameter of `ZeroEx` constructor (#233)
|
* Make `ZeroExConfig` required parameter of `ZeroEx` constructor (#233)
|
||||||
* Add a required property `networkId` to `ZeroExConfig` (#233)
|
* Add a required property `networkId` to `ZeroExConfig` (#233)
|
||||||
@@ -78,149 +112,149 @@
|
|||||||
* All transaction sending methods now call `estimateGas` if no gas amount was supplied (#235)
|
* All transaction sending methods now call `estimateGas` if no gas amount was supplied (#235)
|
||||||
* Modify order validation methods to validate against the `latest` block, not against the `pending` block (#236)
|
* Modify order validation methods to validate against the `latest` block, not against the `pending` block (#236)
|
||||||
|
|
||||||
## v0.26.0 - _November 21, 2017_
|
## v0.26.0 - _November 20, 2017_
|
||||||
|
|
||||||
* Add post-formatter for logs converting `blockNumber`, `logIndex`, `transactionIndex` from hexes to numbers (#231)
|
* Add post-formatter for logs converting `blockNumber`, `logIndex`, `transactionIndex` from hexes to numbers (#231)
|
||||||
* Remove support for Async callback types when used in Subscribe functions (#222)
|
* Remove support for Async callback types when used in Subscribe functions (#222)
|
||||||
* In OrderWatcher subscribe to ZRX Token Transfer and Approval events when maker token is different (#225)
|
* In OrderWatcher subscribe to ZRX Token Transfer and Approval events when maker token is different (#225)
|
||||||
|
|
||||||
## v0.25.1 - _November 13, 2017_
|
## v0.25.1 - _November 12, 2017_
|
||||||
|
|
||||||
* Standardise on Cancelled over Canceled (#217)
|
* Standardise on Cancelled over Canceled (#217)
|
||||||
* Add missing `DecodedLogEvent` type to exported types (#205)
|
* Add missing `DecodedLogEvent` type to exported types (#205)
|
||||||
* Normalized the transactionReceipt status to be `null|0|1`, 1 meaning transaction execution successful, 0 unsuccessful and `null` if it is a pre-byzantinium transaction. (#200)
|
* Normalized the transactionReceipt status to be `null|0|1`, 1 meaning transaction execution successful, 0 unsuccessful and `null` if it is a pre-byzantinium transaction. (#200)
|
||||||
|
|
||||||
## v0.23.0 - _November 12, 2017_
|
## v0.23.0 - _November 11, 2017_
|
||||||
|
|
||||||
* Fixed unhandled promise rejection error in subscribe methods (#209)
|
* Fixed unhandled promise rejection error in subscribe methods (#209)
|
||||||
* Subscribe callbacks now receive an error object as their first argument
|
* Subscribe callbacks now receive an error object as their first argument
|
||||||
|
|
||||||
## v0.22.6 - _November 10, 2017_
|
## v0.22.6 - _November 9, 2017_
|
||||||
|
|
||||||
* Add a timeout parameter to transaction awaiting (#206)
|
* Add a timeout parameter to transaction awaiting (#206)
|
||||||
|
|
||||||
## v0.22.5 - _November 7, 2017_
|
## v0.22.5 - _November 6, 2017_
|
||||||
|
|
||||||
* Re-publish v0.22.4 to fix publishing issue
|
* Re-publish v0.22.4 to fix publishing issue
|
||||||
|
|
||||||
## v0.22.4 - _October 25, 2017_
|
## v0.22.4 - _October 24, 2017_
|
||||||
|
|
||||||
* Upgraded bignumber.js to a new version that ships with native typings
|
* Upgraded bignumber.js to a new version that ships with native typings
|
||||||
|
|
||||||
## v0.22.3 - _October 25, 2017_
|
## v0.22.3 - _October 24, 2017_
|
||||||
|
|
||||||
* Fixed an issue with new version of testrpc and unlimited proxy allowance (#199)
|
* Fixed an issue with new version of testrpc and unlimited proxy allowance (#199)
|
||||||
|
|
||||||
## v0.22.2 - _October 24, 2017_
|
## v0.22.2 - _October 23, 2017_
|
||||||
|
|
||||||
* Fixed rounding of maker fill amount and incorrect validation of partial fees (#197)
|
* Fixed rounding of maker fill amount and incorrect validation of partial fees (#197)
|
||||||
|
|
||||||
## v0.22.0 - _October 16, 2017_
|
## v0.22.0 - _October 15, 2017_
|
||||||
|
|
||||||
* Started using `OrderFillRequest` interface instead of `OrderFillOrKillRequest` interface for `zeroEx.exchange.batchFillOrKill` (#187)
|
* Started using `OrderFillRequest` interface instead of `OrderFillOrKillRequest` interface for `zeroEx.exchange.batchFillOrKill` (#187)
|
||||||
* Removed `OrderFillOrKillRequest` (#187)
|
* Removed `OrderFillOrKillRequest` (#187)
|
||||||
|
|
||||||
## v0.21.4 - _October 13, 2017_
|
## v0.21.4 - _October 12, 2017_
|
||||||
|
|
||||||
* Made 0x.js more type-safe by making `getLogsAsync` and `subscribe/subscribeAsync` generics parametrized with arg type (#194)
|
* Made 0x.js more type-safe by making `getLogsAsync` and `subscribe/subscribeAsync` generics parametrized with arg type (#194)
|
||||||
|
|
||||||
## v0.21.3 - _October 12, 2017_
|
## v0.21.3 - _October 11, 2017_
|
||||||
|
|
||||||
* Fixed a bug causing order fills to throw `INSUFFICIENT_TAKER_ALLOWANCE` (#193)
|
* Fixed a bug causing order fills to throw `INSUFFICIENT_TAKER_ALLOWANCE` (#193)
|
||||||
|
|
||||||
## v0.21.2 - _October 11, 2017_
|
## v0.21.2 - _October 10, 2017_
|
||||||
|
|
||||||
* Exported `ContractEventArg` as a public type (#190)
|
* Exported `ContractEventArg` as a public type (#190)
|
||||||
|
|
||||||
## v0.21.1 - _October 11, 2017_
|
## v0.21.1 - _October 10, 2017_
|
||||||
|
|
||||||
* Fixed a bug in subscriptions (#189)
|
* Fixed a bug in subscriptions (#189)
|
||||||
|
|
||||||
## v0.21.0 - _October 10, 2017_
|
## v0.21.0 - _October 9, 2017_
|
||||||
|
|
||||||
* Complete rewrite of subscription logic (#182)
|
* Complete rewrite of subscription logic (#182)
|
||||||
* Subscriptions no longer return historical logs. If you want them - use `getLogsAsync`
|
* Subscriptions no longer return historical logs. If you want them - use `getLogsAsync`
|
||||||
* Subscriptions now use [ethereumjs-blockstream](https://github.com/ethereumjs/ethereumjs-blockstream) under the hood
|
* Subscriptions now use [ethereumjs-blockstream](https://github.com/ethereumjs/ethereumjs-blockstream) under the hood
|
||||||
* Subscriptions correctly handle block re-orgs (forks)
|
* Subscriptions correctly handle block re-orgs (forks)
|
||||||
* Subscriptions correctly backfill logs (connection problems)
|
* Subscriptions correctly backfill logs (connection problems)
|
||||||
* They no longer setup filters on the underlying nodes, so you can use them with infura without a filter Subprovider
|
* They no longer setup filters on the underlying nodes, so you can use them with infura without a filter Subprovider
|
||||||
* Removed `ContractEventEmitter` and added `LogEvent`
|
* Removed `ContractEventEmitter` and added `LogEvent`
|
||||||
* Renamed `zeroEx.token.subscribeAsync` to `zeroEx.token.subscribe`
|
* Renamed `zeroEx.token.subscribeAsync` to `zeroEx.token.subscribe`
|
||||||
* Added `zeroEx.token.unsubscribe` and `zeroEx.exchange.unsubscribe`
|
* Added `zeroEx.token.unsubscribe` and `zeroEx.exchange.unsubscribe`
|
||||||
* Renamed `zeroEx.exchange.stopWatchingAllEventsAsync` to `zeroEx.exhange.unsubscribeAll`
|
* Renamed `zeroEx.exchange.stopWatchingAllEventsAsync` to `zeroEx.exhange.unsubscribeAll`
|
||||||
* Renamed `zeroEx.token.stopWatchingAllEventsAsync` to `zeroEx.token.unsubscribeAll`
|
* Renamed `zeroEx.token.stopWatchingAllEventsAsync` to `zeroEx.token.unsubscribeAll`
|
||||||
* Fixed the batch fills validation by emulating all balance & proxy allowance changes (#185)
|
* Fixed the batch fills validation by emulating all balance & proxy allowance changes (#185)
|
||||||
|
|
||||||
## v0.20.0 - _October 5, 2017_
|
## v0.20.0 - _October 4, 2017_
|
||||||
|
|
||||||
* Add `zeroEx.token.getLogsAsync` (#178)
|
* Add `zeroEx.token.getLogsAsync` (#178)
|
||||||
* Add `zeroEx.exchange.getLogsAsync` (#178)
|
* Add `zeroEx.exchange.getLogsAsync` (#178)
|
||||||
* Fixed fees validation when one of the tokens transferred is ZRX (#181)
|
* Fixed fees validation when one of the tokens transferred is ZRX (#181)
|
||||||
|
|
||||||
## v0.19.0 - _September 29, 2017_
|
## v0.19.0 - _September 28, 2017_
|
||||||
|
|
||||||
* Made order validation optional (#172)
|
* Made order validation optional (#172)
|
||||||
* Added Ropsten testnet support (#173)
|
* Added Ropsten testnet support (#173)
|
||||||
* Fixed a bug causing awaitTransactionMinedAsync to DDos backend nodes (#175)
|
* Fixed a bug causing awaitTransactionMinedAsync to DDos backend nodes (#175)
|
||||||
|
|
||||||
## v0.18.0 - _September 26, 2017_
|
## v0.18.0 - _September 25, 2017_
|
||||||
|
|
||||||
* Added `zeroEx.exchange.validateOrderFillableOrThrowAsync` to simplify orderbook pruning (#170)
|
* Added `zeroEx.exchange.validateOrderFillableOrThrowAsync` to simplify orderbook pruning (#170)
|
||||||
|
|
||||||
## v0.17.0 - _September 26, 2017_
|
## v0.17.0 - _September 25, 2017_
|
||||||
|
|
||||||
* Made `zeroEx.exchange.getZRXTokenAddressAsync` public (#171)
|
* Made `zeroEx.exchange.getZRXTokenAddressAsync` public (#171)
|
||||||
|
|
||||||
## v0.16.0 - _September 20, 2017_
|
## v0.16.0 - _September 19, 2017_
|
||||||
|
|
||||||
* Added the ability to specify custom contract addresses to be used with 0x.js (#165)
|
* Added the ability to specify custom contract addresses to be used with 0x.js (#165)
|
||||||
* ZeroExConfig.exchangeContractAddress
|
* ZeroExConfig.exchangeContractAddress
|
||||||
* ZeroExConfig.tokenRegistryContractAddress
|
* ZeroExConfig.tokenRegistryContractAddress
|
||||||
* ZeroExConfig.etherTokenContractAddress
|
* ZeroExConfig.etherTokenContractAddress
|
||||||
* Added `zeroEx.tokenRegistry.getContractAddressAsync` (#165)
|
* Added `zeroEx.tokenRegistry.getContractAddressAsync` (#165)
|
||||||
|
|
||||||
## v0.15.0 - _September 8, 2017_
|
## v0.15.0 - _September 7, 2017_
|
||||||
|
|
||||||
* Added the ability to specify a historical `blockNumber` at which to query the blockchain's state when calling a token or exchange method (#161)
|
* Added the ability to specify a historical `blockNumber` at which to query the blockchain's state when calling a token or exchange method (#161)
|
||||||
|
|
||||||
## v0.14.2 - _September 7, 2017_
|
## v0.14.2 - _September 6, 2017_
|
||||||
|
|
||||||
* Fixed an issue with bignumber.js types not found (#160)
|
* Fixed an issue with bignumber.js types not found (#160)
|
||||||
|
|
||||||
## v0.14.1 - _September 7, 2017_
|
## v0.14.1 - _September 6, 2017_
|
||||||
|
|
||||||
* Fixed an issue with Artifact type not found (#159)
|
* Fixed an issue with Artifact type not found (#159)
|
||||||
|
|
||||||
## v0.14.0 - _September 6, 2017_
|
## v0.14.0 - _September 5, 2017_
|
||||||
|
|
||||||
* Added `zeroEx.exchange.throwLogErrorsAsErrors` method to public interface (#157)
|
* Added `zeroEx.exchange.throwLogErrorsAsErrors` method to public interface (#157)
|
||||||
* Fixed an issue with overlapping async intervals in `zeroEx.awaitTransactionMinedAsync` (#157)
|
* Fixed an issue with overlapping async intervals in `zeroEx.awaitTransactionMinedAsync` (#157)
|
||||||
* Fixed an issue with log decoder returning `BigNumber`s as `strings` (#157)
|
* Fixed an issue with log decoder returning `BigNumber`s as `strings` (#157)
|
||||||
|
|
||||||
## v0.13.0 - _September 6, 2017_
|
## v0.13.0 - _September 5, 2017_
|
||||||
|
|
||||||
* Made all the functions submitting transactions to the network to immediately return transaction hash (#151)
|
* Made all the functions submitting transactions to the network to immediately return transaction hash (#151)
|
||||||
* Added `zeroEx.awaitTransactionMinedAsync` (#151)
|
* Added `zeroEx.awaitTransactionMinedAsync` (#151)
|
||||||
* Added `TransactionReceiptWithDecodedLogs`, `LogWithDecodedArgs`, `DecodedLogArgs` to public types (#151)
|
* Added `TransactionReceiptWithDecodedLogs`, `LogWithDecodedArgs`, `DecodedLogArgs` to public types (#151)
|
||||||
* Added signature validation to `validateFillOrderThrowIfInvalidAsync` (#152)
|
* Added signature validation to `validateFillOrderThrowIfInvalidAsync` (#152)
|
||||||
|
|
||||||
## v0.12.1 - _September 2, 2017_
|
## v0.12.1 - _September 1, 2017_
|
||||||
|
|
||||||
* Added the support for web3@1.x.x provider (#142)
|
* Added the support for web3@1.x.x provider (#142)
|
||||||
* Added the optional `zeroExConfig` parameter to the constructor of `ZeroEx` (#139)
|
* Added the optional `zeroExConfig` parameter to the constructor of `ZeroEx` (#139)
|
||||||
* Added the ability to specify `gasPrice` when instantiating `ZeroEx` (#139)
|
* Added the ability to specify `gasPrice` when instantiating `ZeroEx` (#139)
|
||||||
|
|
||||||
## v0.11.0 - _August 24, 2017_
|
## v0.11.0 - _August 23, 2017_
|
||||||
|
|
||||||
* Added `zeroEx.token.setUnlimitedProxyAllowanceAsync` (#137)
|
* Added `zeroEx.token.setUnlimitedProxyAllowanceAsync` (#137)
|
||||||
* Added `zeroEx.token.setUnlimitedAllowanceAsync` (#137)
|
* Added `zeroEx.token.setUnlimitedAllowanceAsync` (#137)
|
||||||
* Added `zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS` (#137)
|
* Added `zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS` (#137)
|
||||||
|
|
||||||
## v0.10.4 - _Aug 24, 2017_
|
## v0.10.4 - _August 23, 2017_
|
||||||
|
|
||||||
* Fixed a bug where checksummed addresses were being pulled from artifacts and not lower-cased. (#135)
|
* Fixed a bug where checksummed addresses were being pulled from artifacts and not lower-cased. (#135)
|
||||||
|
|
||||||
## v0.10.1 - _Aug 24, 2017_
|
## v0.10.1 - _August 23, 2017_
|
||||||
|
|
||||||
* Added `zeroEx.exchange.validateFillOrderThrowIfInvalidAsync` (#128)
|
* Added `zeroEx.exchange.validateFillOrderThrowIfInvalidAsync` (#128)
|
||||||
* Added `zeroEx.exchange.validateFillOrKillOrderThrowIfInvalidAsync` (#128)
|
* Added `zeroEx.exchange.validateFillOrKillOrderThrowIfInvalidAsync` (#128)
|
||||||
@@ -235,20 +269,20 @@
|
|||||||
* Added clear error message when checksummed address is passed to a public method (#124)
|
* Added clear error message when checksummed address is passed to a public method (#124)
|
||||||
* Fixes the description of `shouldThrowOnInsufficientBalanceOrAllowance` in docs (#127)
|
* Fixes the description of `shouldThrowOnInsufficientBalanceOrAllowance` in docs (#127)
|
||||||
|
|
||||||
## v0.9.3 - _Aug 22, 2017_
|
## v0.9.3 - _August 21, 2017_
|
||||||
|
|
||||||
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
|
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
|
||||||
|
|
||||||
## v0.9.2 - _Aug 21, 2017_
|
## v0.9.2 - _August 20, 2017_
|
||||||
|
|
||||||
* *This version was unpublished because of a publishing issue.*
|
* *This version was unpublished because of a publishing issue.*
|
||||||
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
|
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
|
||||||
|
|
||||||
## v0.9.1 - _Aug. 16, 2017_
|
## v0.9.1 - _August 15, 2017_
|
||||||
|
|
||||||
* Fixed the bug causing `zeroEx.token.getBalanceAsync()` to fail if no addresses available (#120)
|
* Fixed the bug causing `zeroEx.token.getBalanceAsync()` to fail if no addresses available (#120)
|
||||||
|
|
||||||
## v0.9.0 - _Jul. 26, 2017_
|
## v0.9.0 - _July 25, 2017_
|
||||||
|
|
||||||
* Migrated to the new version of smart contracts (#101)
|
* Migrated to the new version of smart contracts (#101)
|
||||||
* Removed the ability to call methods on multiple authorized Exchange smart contracts (#106)
|
* Removed the ability to call methods on multiple authorized Exchange smart contracts (#106)
|
||||||
@@ -259,48 +293,48 @@
|
|||||||
* Updated to typescript v2.4 (#104)
|
* Updated to typescript v2.4 (#104)
|
||||||
* Fixed an issue with incorrect balance/allowance validation when ZRX is one of the tokens traded (#109)
|
* Fixed an issue with incorrect balance/allowance validation when ZRX is one of the tokens traded (#109)
|
||||||
|
|
||||||
## v0.8.0 - _Jul. 4, 2017_
|
## v0.8.0 - _July 3, 2017_
|
||||||
|
|
||||||
* Added the ability to call methods on different authorized versions of the Exchange smart contract (#82)
|
* Added the ability to call methods on different authorized versions of the Exchange smart contract (#82)
|
||||||
* Updated contract artifacts to reflect latest changes to the smart contracts (0xproject/contracts#59)
|
* Updated contract artifacts to reflect latest changes to the smart contracts (0xproject/contracts#59)
|
||||||
* Added `zeroEx.proxy.isAuthorizedAsync` and `zeroEx.proxy.getAuthorizedAddressesAsync` (#89)
|
* Added `zeroEx.proxy.isAuthorizedAsync` and `zeroEx.proxy.getAuthorizedAddressesAsync` (#89)
|
||||||
* Added `zeroEx.token.subscribeAsync` (#90)
|
* Added `zeroEx.token.subscribeAsync` (#90)
|
||||||
* Made contract invalidation functions private (#90)
|
* Made contract invalidation functions private (#90)
|
||||||
* `zeroEx.token.invalidateContractInstancesAsync`
|
* `zeroEx.token.invalidateContractInstancesAsync`
|
||||||
* `zeroEx.exchange.invalidateContractInstancesAsync`
|
* `zeroEx.exchange.invalidateContractInstancesAsync`
|
||||||
* `zeroEx.proxy.invalidateContractInstance`
|
* `zeroEx.proxy.invalidateContractInstance`
|
||||||
* `zeroEx.tokenRegistry.invalidateContractInstance`
|
* `zeroEx.tokenRegistry.invalidateContractInstance`
|
||||||
* Fixed the bug where `zeroEx.setProviderAsync` didn't invalidate etherToken contract's instance
|
* Fixed the bug where `zeroEx.setProviderAsync` didn't invalidate etherToken contract's instance
|
||||||
|
|
||||||
## v0.7.1 - _Jun. 26, 2017_
|
## v0.7.1 - _June 25, 2017_
|
||||||
|
|
||||||
* Added the ability to convert Ether to wrapped Ether tokens and back via `zeroEx.etherToken.depostAsync` and `zeroEx.etherToken.withdrawAsync` (#81)
|
* Added the ability to convert Ether to wrapped Ether tokens and back via `zeroEx.etherToken.depostAsync` and `zeroEx.etherToken.withdrawAsync` (#81)
|
||||||
|
|
||||||
## v0.7.0 - _Jun. 22, 2017_
|
## v0.7.0 - _June 21, 2017_
|
||||||
|
|
||||||
* Added Kovan smart contract artifacts (#78)
|
* Added Kovan smart contract artifacts (#78)
|
||||||
* Started returning fillAmount from `fillOrderAsync` and `fillUpToAsync` (#72)
|
* Started returning fillAmount from `fillOrderAsync` and `fillUpToAsync` (#72)
|
||||||
* Started returning cancelledAmount from `cancelOrderAsync` (#72)
|
* Started returning cancelledAmount from `cancelOrderAsync` (#72)
|
||||||
* Renamed type `LogCancelArgs` to `LogCancelContractEventArgs` and `LogFillArgs` to `LogFillContractEventArgs`
|
* Renamed type `LogCancelArgs` to `LogCancelContractEventArgs` and `LogFillArgs` to `LogFillContractEventArgs`
|
||||||
|
|
||||||
## v0.6.2 - _Jun. 21, 2017_
|
## v0.6.2 - _June 20, 2017_
|
||||||
|
|
||||||
* Reduced bundle size
|
* Reduced bundle size
|
||||||
* Improved documentation
|
* Improved documentation
|
||||||
|
|
||||||
## v0.6.1 - _Jun. 19, 2017_
|
## v0.6.1 - _June 18, 2017_
|
||||||
|
|
||||||
* Improved documentation
|
* Improved documentation
|
||||||
|
|
||||||
## v0.6.0 - _Jun. 19, 2017_
|
## v0.6.0 - _June 18, 2017_
|
||||||
|
|
||||||
* Made `ZeroEx` class accept `Web3Provider` instance instead of `Web3` instance
|
* Made `ZeroEx` class accept `Web3Provider` instance instead of `Web3` instance
|
||||||
* Added types for contract event arguments
|
* Added types for contract event arguments
|
||||||
|
|
||||||
## v0.5.2 - _Jun. 15, 2017_
|
## v0.5.2 - _June 14, 2017_
|
||||||
|
|
||||||
* Fixed the bug in `postpublish` script that caused that only unminified UMD bundle was uploaded to release page
|
* Fixed the bug in `postpublish` script that caused that only unminified UMD bundle was uploaded to release page
|
||||||
|
|
||||||
## v0.5.1 - _Jun. 15, 2017_
|
## v0.5.1 - _June 14, 2017_
|
||||||
|
|
||||||
* Added `postpublish` script to publish to Github Releases with assets.
|
* Added `postpublish` script to publish to Github Releases with assets.
|
||||||
|
@@ -1,5 +1,9 @@
|
|||||||
## 0x.js
|
## 0x.js
|
||||||
|
|
||||||
|
A TypeScript/Javascript library for interacting with the 0x protocol.
|
||||||
|
|
||||||
|
### Read the [Documentation](https://0xproject.com/docs/0xjs).
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
0x.js ships as both a [UMD](https://github.com/umdjs/umd) module and a [CommonJS](https://en.wikipedia.org/wiki/CommonJS) package.
|
0x.js ships as both a [UMD](https://github.com/umdjs/umd) module and a [CommonJS](https://en.wikipedia.org/wiki/CommonJS) package.
|
||||||
@@ -18,11 +22,19 @@ npm install 0x.js --save
|
|||||||
import { ZeroEx } from '0x.js';
|
import { ZeroEx } from '0x.js';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"compilerOptions": {
|
||||||
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
#### UMD:
|
#### UMD:
|
||||||
|
|
||||||
**Install**
|
**Install**
|
||||||
|
|
||||||
Download the UMD module from our [releases page](https://github.com/0xProject/0x.js/releases) and add it to your project.
|
Download the UMD module from our [releases page](https://github.com/0xProject/0x-monorepo/releases) and add it to your project.
|
||||||
|
|
||||||
**Import**
|
**Import**
|
||||||
|
|
||||||
@@ -30,10 +42,66 @@ Download the UMD module from our [releases page](https://github.com/0xProject/0x
|
|||||||
<script type="text/javascript" src="0x.js"></script>
|
<script type="text/javascript" src="0x.js"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
## Documentation
|
## Contributing
|
||||||
|
|
||||||
Extensive documentation of 0x.js can be found on [our website][docs-url].
|
We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
|
||||||
|
|
||||||
[website-url]: https://0xproject.com/
|
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
||||||
[whitepaper-url]: https://0xproject.com/pdfs/0x_white_paper.pdf
|
|
||||||
[docs-url]: https://0xproject.com/docs/0xjs
|
### Install dependencies
|
||||||
|
|
||||||
|
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn config set workspaces-experimental true
|
||||||
|
```
|
||||||
|
|
||||||
|
Then install dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn lerna:rebuild
|
||||||
|
```
|
||||||
|
|
||||||
|
Or continuously rebuild on change:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also build this specific package by running the following from within its directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
or continuously rebuild on change:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:watch
|
||||||
|
```
|
||||||
|
|
||||||
|
### Clean
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn clean
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lint
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn lint
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run Tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn test
|
||||||
|
```
|
||||||
|
@@ -1,15 +0,0 @@
|
|||||||
public {{this.name}} = {
|
|
||||||
async callAsync(
|
|
||||||
{{> typed_params inputs=inputs}}
|
|
||||||
defaultBlock?: Web3.BlockParam,
|
|
||||||
): Promise<{{> return_type outputs=outputs}}> {
|
|
||||||
const self = this as {{contractName}}Contract;
|
|
||||||
const result = await promisify<{{> return_type outputs=outputs}}>(
|
|
||||||
self._web3ContractInstance.{{this.name}}.call,
|
|
||||||
self._web3ContractInstance,
|
|
||||||
)(
|
|
||||||
{{> params inputs=inputs}}
|
|
||||||
);
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
};
|
|
@@ -1,6 +0,0 @@
|
|||||||
{{#singleReturnValue}}
|
|
||||||
{{#returnType outputs.0.type}}{{/returnType}}
|
|
||||||
{{/singleReturnValue}}
|
|
||||||
{{^singleReturnValue}}
|
|
||||||
[{{#each outputs}}{{#returnType type}}{{/returnType}}{{#unless @last}}, {{/unless}}{{/each}}]
|
|
||||||
{{/singleReturnValue}}
|
|
@@ -1,51 +0,0 @@
|
|||||||
public {{this.name}} = {
|
|
||||||
async sendTransactionAsync(
|
|
||||||
{{> typed_params inputs=inputs}}
|
|
||||||
{{#this.payable}}
|
|
||||||
txData: TxDataPayable = {},
|
|
||||||
{{/this.payable}}
|
|
||||||
{{^this.payable}}
|
|
||||||
txData: TxData = {},
|
|
||||||
{{/this.payable}}
|
|
||||||
): Promise<string> {
|
|
||||||
const self = this as {{contractName}}Contract;
|
|
||||||
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
||||||
txData,
|
|
||||||
self.{{this.name}}.estimateGasAsync.bind(
|
|
||||||
self,
|
|
||||||
{{> params inputs=inputs}}
|
|
||||||
),
|
|
||||||
);
|
|
||||||
const txHash = await promisify<string>(
|
|
||||||
self._web3ContractInstance.{{this.name}}, self._web3ContractInstance,
|
|
||||||
)(
|
|
||||||
{{> params inputs=inputs}}
|
|
||||||
txDataWithDefaults,
|
|
||||||
);
|
|
||||||
return txHash;
|
|
||||||
},
|
|
||||||
async estimateGasAsync(
|
|
||||||
{{> typed_params inputs=inputs}}
|
|
||||||
txData: TxData = {},
|
|
||||||
): Promise<number> {
|
|
||||||
const self = this as {{contractName}}Contract;
|
|
||||||
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
||||||
txData,
|
|
||||||
);
|
|
||||||
const gas = await promisify<number>(
|
|
||||||
self._web3ContractInstance.{{this.name}}.estimateGas, self._web3ContractInstance,
|
|
||||||
)(
|
|
||||||
{{> params inputs=inputs}}
|
|
||||||
txDataWithDefaults,
|
|
||||||
);
|
|
||||||
return gas;
|
|
||||||
},
|
|
||||||
getABIEncodedTransactionData(
|
|
||||||
{{> typed_params inputs=inputs}}
|
|
||||||
txData: TxData = {},
|
|
||||||
): string {
|
|
||||||
const self = this as {{contractName}}Contract;
|
|
||||||
const abiEncodedTransactionData = self._web3ContractInstance.{{this.name}}.getData();
|
|
||||||
return abiEncodedTransactionData;
|
|
||||||
},
|
|
||||||
};
|
|
@@ -1,3 +0,0 @@
|
|||||||
{{#each inputs}}
|
|
||||||
{{name}}: {{#parameterType type}}{{/parameterType}},
|
|
||||||
{{/each}}
|
|
0
packages/0x.js/coverage/.gitkeep
Normal file
0
packages/0x.js/coverage/.gitkeep
Normal file
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "0x.js",
|
"name": "0x.js",
|
||||||
"version": "0.32.2",
|
"version": "0.35.0",
|
||||||
"description": "A javascript library for interacting with the 0x protocol",
|
"description": "A javascript library for interacting with the 0x protocol",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"0x.js",
|
"0x.js",
|
||||||
@@ -15,85 +15,103 @@
|
|||||||
"build:watch": "tsc -w",
|
"build:watch": "tsc -w",
|
||||||
"prebuild": "run-s clean generate_contract_wrappers",
|
"prebuild": "run-s clean generate_contract_wrappers",
|
||||||
"build": "run-p build:umd:prod build:commonjs; exit 0;",
|
"build": "run-p build:umd:prod build:commonjs; exit 0;",
|
||||||
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_DIR",
|
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry|DummyToken).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
|
||||||
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json",
|
|
||||||
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry|DummyToken).json' --template contract_templates/contract.handlebars --partials 'contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated",
|
|
||||||
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
||||||
"test:circleci": "run-s test:coverage report_test_coverage",
|
"test:circleci": "run-s test:coverage",
|
||||||
"test": "run-s clean test:commonjs",
|
"test": "run-s clean test:commonjs",
|
||||||
"test:coverage": "nyc npm run test --all",
|
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
||||||
"report_test_coverage": "nyc report --reporter=text-lcov | coveralls",
|
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
||||||
"update_contracts": "for i in ${npm_package_config_artifacts}; do copyfiles -u 4 ../contracts/build/contracts/$i.json ../0x.js/src/artifacts; done;",
|
"update_contracts": "for i in ${npm_package_config_artifacts}; do copyfiles -u 4 ../contracts/build/contracts/$i.json ../0x.js/src/artifacts; done;",
|
||||||
"clean": "shx rm -rf _bundles lib test_temp",
|
"clean": "shx rm -rf _bundles lib test_temp scripts",
|
||||||
"build:umd:prod": "NODE_ENV=production webpack",
|
"build:umd:prod": "NODE_ENV=production webpack",
|
||||||
"build:commonjs": "tsc && copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts;",
|
"build:commonjs": "tsc && copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
||||||
"test:commonjs": "run-s build:commonjs run_mocha",
|
"test:commonjs": "run-s build:commonjs run_mocha",
|
||||||
"run_mocha": "mocha lib/test/**/*_test.js --timeout 10000 --bail --exit"
|
"run_mocha": "mocha lib/test/**/*_test.js --timeout 10000 --bail --exit",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
|
||||||
|
"docs:stage": "yarn build && node ./scripts/stage_docs.js",
|
||||||
|
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
|
||||||
|
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"artifacts": "TokenTransferProxy Exchange TokenRegistry Token EtherToken"
|
"artifacts": "TokenTransferProxy Exchange TokenRegistry Token EtherToken",
|
||||||
|
"postpublish": {
|
||||||
|
"assets": [
|
||||||
|
"packages/0x.js/_bundles/index.js",
|
||||||
|
"packages/0x.js/_bundles/index.min.js"
|
||||||
|
],
|
||||||
|
"docPublishConfigs": {
|
||||||
|
"extraFileIncludes": [
|
||||||
|
"../types/src/index.ts",
|
||||||
|
"./src/contract_wrappers/generated/ether_token.ts",
|
||||||
|
"./src/contract_wrappers/generated/token.ts",
|
||||||
|
"./src/contract_wrappers/generated/exchange.ts"
|
||||||
|
],
|
||||||
|
"s3BucketPath": "s3://doc-jsons/0x.js/",
|
||||||
|
"s3StagingBucketPath": "s3://staging-doc-jsons/0x.js/"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/0xProject/0x.js"
|
"url": "https://github.com/0xProject/0x-monorepo"
|
||||||
},
|
},
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.0.0"
|
"node": ">=6.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/abi-gen": "^0.2.1",
|
"@0xproject/dev-utils": "^0.3.4",
|
||||||
"@0xproject/dev-utils": "^0.0.12",
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
"@0xproject/tslint-config": "^0.4.8",
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
"@types/bintrees": "^1.0.2",
|
"@types/bintrees": "^1.0.2",
|
||||||
"@types/jsonschema": "^1.1.1",
|
"@types/lodash": "4.14.104",
|
||||||
"@types/lodash": "^4.14.86",
|
|
||||||
"@types/mocha": "^2.2.42",
|
"@types/mocha": "^2.2.42",
|
||||||
"@types/node": "^8.0.53",
|
"@types/node": "^8.0.53",
|
||||||
|
"@types/request": "2.47.0",
|
||||||
"@types/sinon": "^2.2.2",
|
"@types/sinon": "^2.2.2",
|
||||||
"@types/uuid": "^3.4.2",
|
"@types/uuid": "^3.4.2",
|
||||||
"awesome-typescript-loader": "^3.1.3",
|
"awesome-typescript-loader": "^3.1.3",
|
||||||
"chai": "^4.0.1",
|
"chai": "^4.0.1",
|
||||||
"chai-as-promised": "^7.1.0",
|
"chai-as-promised": "^7.1.0",
|
||||||
"chai-as-promised-typescript-typings": "^0.0.9",
|
|
||||||
"chai-bignumber": "^2.0.1",
|
"chai-bignumber": "^2.0.1",
|
||||||
"chai-typescript-typings": "^0.0.3",
|
|
||||||
"copyfiles": "^1.2.0",
|
"copyfiles": "^1.2.0",
|
||||||
"coveralls": "^3.0.0",
|
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
"json-loader": "^0.5.4",
|
"json-loader": "^0.5.4",
|
||||||
"mocha": "^4.0.1",
|
"mocha": "^4.0.1",
|
||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
"nyc": "^11.0.1",
|
"nyc": "^11.0.1",
|
||||||
"opn-cli": "^3.1.0",
|
"opn-cli": "^3.1.0",
|
||||||
|
"prettier": "^1.11.1",
|
||||||
"request": "^2.81.0",
|
"request": "^2.81.0",
|
||||||
"request-promise-native": "^1.0.5",
|
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"sinon": "^4.0.0",
|
"sinon": "^4.0.0",
|
||||||
"source-map-support": "^0.5.0",
|
"source-map-support": "^0.5.0",
|
||||||
"truffle-hdwallet-provider": "^0.0.3",
|
"truffle-hdwallet-provider": "^0.0.3",
|
||||||
"tslint": "5.8.0",
|
"tslint": "5.8.0",
|
||||||
"typedoc": "~0.8.0",
|
"typedoc": "0xProject/typedoc",
|
||||||
"types-bn": "^0.0.1",
|
|
||||||
"typescript": "2.7.1",
|
"typescript": "2.7.1",
|
||||||
"web3-provider-engine": "^13.0.1",
|
|
||||||
"web3-typescript-typings": "^0.9.10",
|
|
||||||
"webpack": "^3.1.0"
|
"webpack": "^3.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0xproject/assert": "^0.0.18",
|
"@0xproject/assert": "^0.2.5",
|
||||||
"@0xproject/json-schemas": "^0.7.10",
|
"@0xproject/base-contract": "^0.1.0",
|
||||||
"@0xproject/types": "^0.2.1",
|
"@0xproject/json-schemas": "^0.7.19",
|
||||||
"@0xproject/utils": "^0.3.2",
|
"@0xproject/types": "^0.5.0",
|
||||||
"@0xproject/web3-wrapper": "^0.1.12",
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
|
"@0xproject/utils": "^0.5.0",
|
||||||
|
"@0xproject/web3-wrapper": "^0.5.0",
|
||||||
"bintrees": "^1.0.2",
|
"bintrees": "^1.0.2",
|
||||||
"bn.js": "^4.11.8",
|
"bn.js": "^4.11.8",
|
||||||
"ethereumjs-abi": "^0.6.4",
|
"ethereumjs-abi": "^0.6.4",
|
||||||
"ethereumjs-blockstream": "^2.0.6",
|
"ethereumjs-blockstream": "^2.0.6",
|
||||||
"ethereumjs-util": "^5.1.1",
|
"ethereumjs-util": "^5.1.1",
|
||||||
|
"ethers-contracts": "^2.2.1",
|
||||||
"js-sha3": "^0.7.0",
|
"js-sha3": "^0.7.0",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"uuid": "^3.1.0",
|
"uuid": "^3.1.0",
|
||||||
"web3": "^0.20.0"
|
"web3": "^0.20.0"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,40 +0,0 @@
|
|||||||
const execAsync = require('async-child-process').execAsync;
|
|
||||||
const postpublish_utils = require('../../../scripts/postpublish_utils');
|
|
||||||
const packageJSON = require('../package.json');
|
|
||||||
|
|
||||||
const cwd = __dirname + '/..';
|
|
||||||
const subPackageName = packageJSON.name;
|
|
||||||
const S3BucketPath = 's3://0xjs-docs-jsons/';
|
|
||||||
|
|
||||||
let tag;
|
|
||||||
let version;
|
|
||||||
postpublish_utils
|
|
||||||
.getLatestTagAndVersionAsync(subPackageName)
|
|
||||||
.then(function(result) {
|
|
||||||
tag = result.tag;
|
|
||||||
version = result.version;
|
|
||||||
const releaseName = postpublish_utils.getReleaseName(subPackageName, version);
|
|
||||||
const assets = [__dirname + '/../_bundles/index.js', __dirname + '/../_bundles/index.min.js'];
|
|
||||||
return postpublish_utils.publishReleaseNotesAsync(tag, releaseName, assets);
|
|
||||||
})
|
|
||||||
.then(function(release) {
|
|
||||||
console.log('POSTPUBLISH: Release successful, generating docs...');
|
|
||||||
const jsonFilePath = __dirname + '/../' + postpublish_utils.generatedDocsDirectoryName + '/index.json';
|
|
||||||
return execAsync('JSON_FILE_PATH=' + jsonFilePath + ' PROJECT_DIR=' + __dirname + '/.. yarn docs:json', {
|
|
||||||
cwd,
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.then(function(result) {
|
|
||||||
if (result.stderr !== '') {
|
|
||||||
throw new Error(result.stderr);
|
|
||||||
}
|
|
||||||
const fileName = 'v' + version + '.json';
|
|
||||||
console.log('POSTPUBLISH: Doc generation successful, uploading docs... as ', fileName);
|
|
||||||
const s3Url = S3BucketPath + fileName;
|
|
||||||
return execAsync('S3_URL=' + s3Url + ' yarn upload_docs_json', {
|
|
||||||
cwd,
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(function(err) {
|
|
||||||
throw err;
|
|
||||||
});
|
|
@@ -1,5 +1,5 @@
|
|||||||
import { schemas, SchemaValidator } from '@0xproject/json-schemas';
|
import { schemas, SchemaValidator } from '@0xproject/json-schemas';
|
||||||
import { TransactionReceiptWithDecodedLogs } from '@0xproject/types';
|
import { ECSignature, Order, Provider, SignedOrder, TransactionReceiptWithDecodedLogs } from '@0xproject/types';
|
||||||
import { AbiDecoder, BigNumber, intervalUtils } from '@0xproject/utils';
|
import { AbiDecoder, BigNumber, intervalUtils } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as ethUtil from 'ethereumjs-util';
|
import * as ethUtil from 'ethereumjs-util';
|
||||||
@@ -13,7 +13,9 @@ import { TokenTransferProxyWrapper } from './contract_wrappers/token_transfer_pr
|
|||||||
import { TokenWrapper } from './contract_wrappers/token_wrapper';
|
import { TokenWrapper } from './contract_wrappers/token_wrapper';
|
||||||
import { OrderStateWatcher } from './order_watcher/order_state_watcher';
|
import { OrderStateWatcher } from './order_watcher/order_state_watcher';
|
||||||
import { zeroExConfigSchema } from './schemas/zero_ex_config_schema';
|
import { zeroExConfigSchema } from './schemas/zero_ex_config_schema';
|
||||||
import { ECSignature, Order, SignedOrder, Web3Provider, ZeroExConfig, ZeroExError } from './types';
|
import { zeroExPrivateNetworkConfigSchema } from './schemas/zero_ex_private_network_config_schema';
|
||||||
|
import { zeroExPublicNetworkConfigSchema } from './schemas/zero_ex_public_network_config_schema';
|
||||||
|
import { OrderStateWatcherConfig, ZeroExConfig, ZeroExError } from './types';
|
||||||
import { assert } from './utils/assert';
|
import { assert } from './utils/assert';
|
||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
import { decorators } from './utils/decorators';
|
import { decorators } from './utils/decorators';
|
||||||
@@ -55,13 +57,7 @@ export class ZeroEx {
|
|||||||
* tokenTransferProxy smart contract.
|
* tokenTransferProxy smart contract.
|
||||||
*/
|
*/
|
||||||
public proxy: TokenTransferProxyWrapper;
|
public proxy: TokenTransferProxyWrapper;
|
||||||
/**
|
|
||||||
* An instance of the OrderStateWatcher class containing methods for watching a set of orders for relevant
|
|
||||||
* blockchain state changes.
|
|
||||||
*/
|
|
||||||
public orderStateWatcher: OrderStateWatcher;
|
|
||||||
private _web3Wrapper: Web3Wrapper;
|
private _web3Wrapper: Web3Wrapper;
|
||||||
private _abiDecoder: AbiDecoder;
|
|
||||||
/**
|
/**
|
||||||
* Verifies that the elliptic curve signature `signature` was generated
|
* Verifies that the elliptic curve signature `signature` was generated
|
||||||
* by signing `data` with the private key corresponding to the `signerAddress` address.
|
* by signing `data` with the private key corresponding to the `signerAddress` address.
|
||||||
@@ -74,13 +70,14 @@ export class ZeroEx {
|
|||||||
assert.isHexString('data', data);
|
assert.isHexString('data', data);
|
||||||
assert.doesConformToSchema('signature', signature, schemas.ecSignatureSchema);
|
assert.doesConformToSchema('signature', signature, schemas.ecSignatureSchema);
|
||||||
assert.isETHAddressHex('signerAddress', signerAddress);
|
assert.isETHAddressHex('signerAddress', signerAddress);
|
||||||
|
const normalizedSignerAddress = signerAddress.toLowerCase();
|
||||||
|
|
||||||
const isValidSignature = signatureUtils.isValidSignature(data, signature, signerAddress);
|
const isValidSignature = signatureUtils.isValidSignature(data, signature, normalizedSignerAddress);
|
||||||
return isValidSignature;
|
return isValidSignature;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Generates a pseudo-random 256-bit salt.
|
* Generates a pseudo-random 256-bit salt.
|
||||||
* The salt can be included in an 0x order, ensuring that the order generates a unique orderHash
|
* The salt can be included in a 0x order, ensuring that the order generates a unique orderHash
|
||||||
* and will not collide with other outstanding orders that are identical in all other parameters.
|
* and will not collide with other outstanding orders that are identical in all other parameters.
|
||||||
* @return A pseudo-random 256-bit number that can be used as a salt.
|
* @return A pseudo-random 256-bit number that can be used as a salt.
|
||||||
*/
|
*/
|
||||||
@@ -118,10 +115,8 @@ export class ZeroEx {
|
|||||||
public static toUnitAmount(amount: BigNumber, decimals: number): BigNumber {
|
public static toUnitAmount(amount: BigNumber, decimals: number): BigNumber {
|
||||||
assert.isValidBaseUnitAmount('amount', amount);
|
assert.isValidBaseUnitAmount('amount', amount);
|
||||||
assert.isNumber('decimals', decimals);
|
assert.isNumber('decimals', decimals);
|
||||||
|
const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals);
|
||||||
const aUnit = new BigNumber(10).pow(decimals);
|
return unitAmount;
|
||||||
const unit = amount.div(aUnit);
|
|
||||||
return unit;
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* A baseUnit is defined as the smallest denomination of a token. An amount expressed in baseUnits
|
* A baseUnit is defined as the smallest denomination of a token. An amount expressed in baseUnits
|
||||||
@@ -134,13 +129,7 @@ export class ZeroEx {
|
|||||||
public static toBaseUnitAmount(amount: BigNumber, decimals: number): BigNumber {
|
public static toBaseUnitAmount(amount: BigNumber, decimals: number): BigNumber {
|
||||||
assert.isBigNumber('amount', amount);
|
assert.isBigNumber('amount', amount);
|
||||||
assert.isNumber('decimals', decimals);
|
assert.isNumber('decimals', decimals);
|
||||||
|
const baseUnitAmount = Web3Wrapper.toBaseUnitAmount(amount, decimals);
|
||||||
const unit = new BigNumber(10).pow(decimals);
|
|
||||||
const baseUnitAmount = amount.times(unit);
|
|
||||||
const hasDecimals = baseUnitAmount.decimalPlaces() !== 0;
|
|
||||||
if (hasDecimals) {
|
|
||||||
throw new Error(`Invalid unit amount: ${amount.toString()} - Too many decimal places`);
|
|
||||||
}
|
|
||||||
return baseUnitAmount;
|
return baseUnitAmount;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -156,31 +145,35 @@ export class ZeroEx {
|
|||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Instantiates a new ZeroEx instance that provides the public interface to the 0x.js library.
|
* Instantiates a new ZeroEx instance that provides the public interface to the 0x.js library.
|
||||||
* @param provider The Web3.js Provider instance you would like the 0x.js library to use for interacting with
|
* @param provider The Provider instance you would like the 0x.js library to use for interacting with
|
||||||
* the Ethereum network.
|
* the Ethereum network.
|
||||||
* @param config The configuration object. Look up the type for the description.
|
* @param config The configuration object. Look up the type for the description.
|
||||||
* @return An instance of the 0x.js ZeroEx class.
|
* @return An instance of the 0x.js ZeroEx class.
|
||||||
*/
|
*/
|
||||||
constructor(provider: Web3Provider, config: ZeroExConfig) {
|
constructor(provider: Provider, config: ZeroExConfig) {
|
||||||
assert.isWeb3Provider('provider', provider);
|
assert.isWeb3Provider('provider', provider);
|
||||||
assert.doesConformToSchema('config', config, zeroExConfigSchema);
|
assert.doesConformToSchema('config', config, zeroExConfigSchema, [
|
||||||
|
zeroExPrivateNetworkConfigSchema,
|
||||||
|
zeroExPublicNetworkConfigSchema,
|
||||||
|
]);
|
||||||
const artifactJSONs = _.values(artifacts);
|
const artifactJSONs = _.values(artifacts);
|
||||||
const abiArrays = _.map(artifactJSONs, artifact => artifact.abi);
|
const abiArrays = _.map(artifactJSONs, artifact => artifact.abi);
|
||||||
this._abiDecoder = new AbiDecoder(abiArrays);
|
|
||||||
const defaults = {
|
const defaults = {
|
||||||
gasPrice: config.gasPrice,
|
gasPrice: config.gasPrice,
|
||||||
};
|
};
|
||||||
this._web3Wrapper = new Web3Wrapper(provider, defaults);
|
this._web3Wrapper = new Web3Wrapper(provider, defaults);
|
||||||
|
_.forEach(abiArrays, abi => {
|
||||||
|
this._web3Wrapper.abiDecoder.addABI(abi);
|
||||||
|
});
|
||||||
this.proxy = new TokenTransferProxyWrapper(
|
this.proxy = new TokenTransferProxyWrapper(
|
||||||
this._web3Wrapper,
|
this._web3Wrapper,
|
||||||
config.networkId,
|
config.networkId,
|
||||||
config.tokenTransferProxyContractAddress,
|
config.tokenTransferProxyContractAddress,
|
||||||
);
|
);
|
||||||
this.token = new TokenWrapper(this._web3Wrapper, config.networkId, this._abiDecoder, this.proxy);
|
this.token = new TokenWrapper(this._web3Wrapper, config.networkId, this.proxy);
|
||||||
this.exchange = new ExchangeWrapper(
|
this.exchange = new ExchangeWrapper(
|
||||||
this._web3Wrapper,
|
this._web3Wrapper,
|
||||||
config.networkId,
|
config.networkId,
|
||||||
this._abiDecoder,
|
|
||||||
this.token,
|
this.token,
|
||||||
config.exchangeContractAddress,
|
config.exchangeContractAddress,
|
||||||
config.zrxContractAddress,
|
config.zrxContractAddress,
|
||||||
@@ -190,14 +183,7 @@ export class ZeroEx {
|
|||||||
config.networkId,
|
config.networkId,
|
||||||
config.tokenRegistryContractAddress,
|
config.tokenRegistryContractAddress,
|
||||||
);
|
);
|
||||||
this.etherToken = new EtherTokenWrapper(this._web3Wrapper, config.networkId, this._abiDecoder, this.token);
|
this.etherToken = new EtherTokenWrapper(this._web3Wrapper, config.networkId, this.token);
|
||||||
this.orderStateWatcher = new OrderStateWatcher(
|
|
||||||
this._web3Wrapper,
|
|
||||||
this._abiDecoder,
|
|
||||||
this.token,
|
|
||||||
this.exchange,
|
|
||||||
config.orderWatcherConfig,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Sets a new web3 provider for 0x.js. Updating the provider will stop all
|
* Sets a new web3 provider for 0x.js. Updating the provider will stop all
|
||||||
@@ -205,7 +191,7 @@ export class ZeroEx {
|
|||||||
* @param provider The Web3Provider you would like the 0x.js library to use from now on.
|
* @param provider The Web3Provider you would like the 0x.js library to use from now on.
|
||||||
* @param networkId The id of the network your provider is connected to
|
* @param networkId The id of the network your provider is connected to
|
||||||
*/
|
*/
|
||||||
public setProvider(provider: Web3Provider, networkId: number): void {
|
public setProvider(provider: Provider, networkId: number): void {
|
||||||
this._web3Wrapper.setProvider(provider);
|
this._web3Wrapper.setProvider(provider);
|
||||||
(this.exchange as any)._invalidateContractInstances();
|
(this.exchange as any)._invalidateContractInstances();
|
||||||
(this.exchange as any)._setNetworkId(networkId);
|
(this.exchange as any)._setNetworkId(networkId);
|
||||||
@@ -231,7 +217,7 @@ export class ZeroEx {
|
|||||||
* This method currently supports TestRPC, Geth and Parity above and below V1.6.6
|
* This method currently supports TestRPC, Geth and Parity above and below V1.6.6
|
||||||
* @param orderHash Hex encoded orderHash to sign.
|
* @param orderHash Hex encoded orderHash to sign.
|
||||||
* @param signerAddress The hex encoded Ethereum address you wish to sign it with. This address
|
* @param signerAddress The hex encoded Ethereum address you wish to sign it with. This address
|
||||||
* must be available via the Web3.Provider supplied to 0x.js.
|
* must be available via the Provider supplied to 0x.js.
|
||||||
* @param shouldAddPersonalMessagePrefix Some signers add the personal message prefix `\x19Ethereum Signed Message`
|
* @param shouldAddPersonalMessagePrefix Some signers add the personal message prefix `\x19Ethereum Signed Message`
|
||||||
* themselves (e.g Parity Signer, Ledger, TestRPC) and others expect it to already be done by the client
|
* themselves (e.g Parity Signer, Ledger, TestRPC) and others expect it to already be done by the client
|
||||||
* (e.g Metamask). Depending on which signer this request is going to, decide on whether to add the prefix
|
* (e.g Metamask). Depending on which signer this request is going to, decide on whether to add the prefix
|
||||||
@@ -245,6 +231,7 @@ export class ZeroEx {
|
|||||||
): Promise<ECSignature> {
|
): Promise<ECSignature> {
|
||||||
assert.isHexString('orderHash', orderHash);
|
assert.isHexString('orderHash', orderHash);
|
||||||
await assert.isSenderAddressAsync('signerAddress', signerAddress, this._web3Wrapper);
|
await assert.isSenderAddressAsync('signerAddress', signerAddress, this._web3Wrapper);
|
||||||
|
const normalizedSignerAddress = signerAddress.toLowerCase();
|
||||||
|
|
||||||
let msgHashHex = orderHash;
|
let msgHashHex = orderHash;
|
||||||
if (shouldAddPersonalMessagePrefix) {
|
if (shouldAddPersonalMessagePrefix) {
|
||||||
@@ -253,7 +240,7 @@ export class ZeroEx {
|
|||||||
msgHashHex = ethUtil.bufferToHex(msgHashBuff);
|
msgHashHex = ethUtil.bufferToHex(msgHashBuff);
|
||||||
}
|
}
|
||||||
|
|
||||||
const signature = await this._web3Wrapper.signTransactionAsync(signerAddress, msgHashHex);
|
const signature = await this._web3Wrapper.signMessageAsync(normalizedSignerAddress, msgHashHex);
|
||||||
|
|
||||||
// HACK: There is no consensus on whether the signatureHex string should be formatted as
|
// HACK: There is no consensus on whether the signatureHex string should be formatted as
|
||||||
// v + r + s OR r + s + v, and different clients (even different versions of the same client)
|
// v + r + s OR r + s + v, and different clients (even different versions of the same client)
|
||||||
@@ -262,7 +249,7 @@ export class ZeroEx {
|
|||||||
const validVParamValues = [27, 28];
|
const validVParamValues = [27, 28];
|
||||||
const ecSignatureVRS = signatureUtils.parseSignatureHexAsVRS(signature);
|
const ecSignatureVRS = signatureUtils.parseSignatureHexAsVRS(signature);
|
||||||
if (_.includes(validVParamValues, ecSignatureVRS.v)) {
|
if (_.includes(validVParamValues, ecSignatureVRS.v)) {
|
||||||
const isValidVRSSignature = ZeroEx.isValidSignature(orderHash, ecSignatureVRS, signerAddress);
|
const isValidVRSSignature = ZeroEx.isValidSignature(orderHash, ecSignatureVRS, normalizedSignerAddress);
|
||||||
if (isValidVRSSignature) {
|
if (isValidVRSSignature) {
|
||||||
return ecSignatureVRS;
|
return ecSignatureVRS;
|
||||||
}
|
}
|
||||||
@@ -270,7 +257,7 @@ export class ZeroEx {
|
|||||||
|
|
||||||
const ecSignatureRSV = signatureUtils.parseSignatureHexAsRSV(signature);
|
const ecSignatureRSV = signatureUtils.parseSignatureHexAsRSV(signature);
|
||||||
if (_.includes(validVParamValues, ecSignatureRSV.v)) {
|
if (_.includes(validVParamValues, ecSignatureRSV.v)) {
|
||||||
const isValidRSVSignature = ZeroEx.isValidSignature(orderHash, ecSignatureRSV, signerAddress);
|
const isValidRSVSignature = ZeroEx.isValidSignature(orderHash, ecSignatureRSV, normalizedSignerAddress);
|
||||||
if (isValidRSVSignature) {
|
if (isValidRSVSignature) {
|
||||||
return ecSignatureRSV;
|
return ecSignatureRSV;
|
||||||
}
|
}
|
||||||
@@ -290,44 +277,21 @@ export class ZeroEx {
|
|||||||
pollingIntervalMs = 1000,
|
pollingIntervalMs = 1000,
|
||||||
timeoutMs?: number,
|
timeoutMs?: number,
|
||||||
): Promise<TransactionReceiptWithDecodedLogs> {
|
): Promise<TransactionReceiptWithDecodedLogs> {
|
||||||
let timeoutExceeded = false;
|
const transactionReceiptWithDecodedLogs = await this._web3Wrapper.awaitTransactionMinedAsync(
|
||||||
if (timeoutMs) {
|
txHash,
|
||||||
setTimeout(() => (timeoutExceeded = true), timeoutMs);
|
pollingIntervalMs,
|
||||||
}
|
timeoutMs,
|
||||||
|
|
||||||
const txReceiptPromise = new Promise(
|
|
||||||
(resolve: (receipt: TransactionReceiptWithDecodedLogs) => void, reject) => {
|
|
||||||
const intervalId = intervalUtils.setAsyncExcludingInterval(
|
|
||||||
async () => {
|
|
||||||
if (timeoutExceeded) {
|
|
||||||
intervalUtils.clearAsyncExcludingInterval(intervalId);
|
|
||||||
return reject(ZeroExError.TransactionMiningTimeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
const transactionReceipt = await this._web3Wrapper.getTransactionReceiptAsync(txHash);
|
|
||||||
if (!_.isNull(transactionReceipt)) {
|
|
||||||
intervalUtils.clearAsyncExcludingInterval(intervalId);
|
|
||||||
const logsWithDecodedArgs = _.map(
|
|
||||||
transactionReceipt.logs,
|
|
||||||
this._abiDecoder.tryToDecodeLogOrNoop.bind(this._abiDecoder),
|
|
||||||
);
|
|
||||||
const transactionReceiptWithDecodedLogArgs: TransactionReceiptWithDecodedLogs = {
|
|
||||||
...transactionReceipt,
|
|
||||||
logs: logsWithDecodedArgs,
|
|
||||||
};
|
|
||||||
resolve(transactionReceiptWithDecodedLogArgs);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
pollingIntervalMs,
|
|
||||||
(err: Error) => {
|
|
||||||
intervalUtils.clearAsyncExcludingInterval(intervalId);
|
|
||||||
reject(err);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
const txReceipt = await txReceiptPromise;
|
return transactionReceiptWithDecodedLogs;
|
||||||
return txReceipt;
|
}
|
||||||
|
/**
|
||||||
|
* Instantiates and returns a new OrderStateWatcher instance.
|
||||||
|
* Defaults to watching the pending state.
|
||||||
|
* @param config The configuration object. Look up the type for the description.
|
||||||
|
* @return An instance of the 0x.js OrderStateWatcher class.
|
||||||
|
*/
|
||||||
|
public createOrderStateWatcher(config?: OrderStateWatcherConfig) {
|
||||||
|
return new OrderStateWatcher(this._web3Wrapper, this.token, this.exchange, config);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* HACK: `TokenWrapper` needs a token transfer proxy address. `TokenTransferProxy` address is fetched from
|
* HACK: `TokenWrapper` needs a token transfer proxy address. `TokenTransferProxy` address is fetched from
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { BlockParamLiteral, LogWithDecodedArgs, RawLog } from '@0xproject/types';
|
import { BlockParamLiteral, ContractAbi, FilterObject, LogEntry, LogWithDecodedArgs, RawLog } from '@0xproject/types';
|
||||||
import { AbiDecoder, intervalUtils } from '@0xproject/utils';
|
import { AbiDecoder, intervalUtils } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import { Block, BlockAndLogStreamer } from 'ethereumjs-blockstream';
|
import { Block, BlockAndLogStreamer } from 'ethereumjs-blockstream';
|
||||||
@@ -32,19 +32,17 @@ const CONTRACT_NAME_TO_NOT_FOUND_ERROR: {
|
|||||||
export class ContractWrapper {
|
export class ContractWrapper {
|
||||||
protected _web3Wrapper: Web3Wrapper;
|
protected _web3Wrapper: Web3Wrapper;
|
||||||
protected _networkId: number;
|
protected _networkId: number;
|
||||||
private _abiDecoder?: AbiDecoder;
|
|
||||||
private _blockAndLogStreamerIfExists?: BlockAndLogStreamer;
|
private _blockAndLogStreamerIfExists?: BlockAndLogStreamer;
|
||||||
private _blockAndLogStreamIntervalIfExists?: NodeJS.Timer;
|
private _blockAndLogStreamIntervalIfExists?: NodeJS.Timer;
|
||||||
private _filters: { [filterToken: string]: Web3.FilterObject };
|
private _filters: { [filterToken: string]: FilterObject };
|
||||||
private _filterCallbacks: {
|
private _filterCallbacks: {
|
||||||
[filterToken: string]: EventCallback<ContractEventArgs>;
|
[filterToken: string]: EventCallback<ContractEventArgs>;
|
||||||
};
|
};
|
||||||
private _onLogAddedSubscriptionToken: string | undefined;
|
private _onLogAddedSubscriptionToken: string | undefined;
|
||||||
private _onLogRemovedSubscriptionToken: string | undefined;
|
private _onLogRemovedSubscriptionToken: string | undefined;
|
||||||
constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder?: AbiDecoder) {
|
constructor(web3Wrapper: Web3Wrapper, networkId: number) {
|
||||||
this._web3Wrapper = web3Wrapper;
|
this._web3Wrapper = web3Wrapper;
|
||||||
this._networkId = networkId;
|
this._networkId = networkId;
|
||||||
this._abiDecoder = abiDecoder;
|
|
||||||
this._filters = {};
|
this._filters = {};
|
||||||
this._filterCallbacks = {};
|
this._filterCallbacks = {};
|
||||||
this._blockAndLogStreamerIfExists = undefined;
|
this._blockAndLogStreamerIfExists = undefined;
|
||||||
@@ -75,7 +73,7 @@ export class ContractWrapper {
|
|||||||
address: string,
|
address: string,
|
||||||
eventName: ContractEvents,
|
eventName: ContractEvents,
|
||||||
indexFilterValues: IndexedFilterValues,
|
indexFilterValues: IndexedFilterValues,
|
||||||
abi: Web3.ContractAbi,
|
abi: ContractAbi,
|
||||||
callback: EventCallback<ArgsType>,
|
callback: EventCallback<ArgsType>,
|
||||||
): string {
|
): string {
|
||||||
const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi);
|
const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi);
|
||||||
@@ -92,7 +90,7 @@ export class ContractWrapper {
|
|||||||
eventName: ContractEvents,
|
eventName: ContractEvents,
|
||||||
blockRange: BlockRange,
|
blockRange: BlockRange,
|
||||||
indexFilterValues: IndexedFilterValues,
|
indexFilterValues: IndexedFilterValues,
|
||||||
abi: Web3.ContractAbi,
|
abi: ContractAbi,
|
||||||
): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
|
): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
|
||||||
const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi, blockRange);
|
const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi, blockRange);
|
||||||
const logs = await this._web3Wrapper.getLogsAsync(filter);
|
const logs = await this._web3Wrapper.getLogsAsync(filter);
|
||||||
@@ -100,18 +98,18 @@ export class ContractWrapper {
|
|||||||
return logsWithDecodedArguments;
|
return logsWithDecodedArguments;
|
||||||
}
|
}
|
||||||
protected _tryToDecodeLogOrNoop<ArgsType extends ContractEventArgs>(
|
protected _tryToDecodeLogOrNoop<ArgsType extends ContractEventArgs>(
|
||||||
log: Web3.LogEntry,
|
log: LogEntry,
|
||||||
): LogWithDecodedArgs<ArgsType> | RawLog {
|
): LogWithDecodedArgs<ArgsType> | RawLog {
|
||||||
if (_.isUndefined(this._abiDecoder)) {
|
if (_.isUndefined(this._web3Wrapper.abiDecoder)) {
|
||||||
throw new Error(InternalZeroExError.NoAbiDecoder);
|
throw new Error(InternalZeroExError.NoAbiDecoder);
|
||||||
}
|
}
|
||||||
const logWithDecodedArgs = this._abiDecoder.tryToDecodeLogOrNoop(log);
|
const logWithDecodedArgs = this._web3Wrapper.abiDecoder.tryToDecodeLogOrNoop(log);
|
||||||
return logWithDecodedArgs;
|
return logWithDecodedArgs;
|
||||||
}
|
}
|
||||||
protected async _instantiateContractIfExistsAsync(
|
protected async _getContractAbiAndAddressFromArtifactsAsync(
|
||||||
artifact: Artifact,
|
artifact: Artifact,
|
||||||
addressIfExists?: string,
|
addressIfExists?: string,
|
||||||
): Promise<Web3.ContractInstance> {
|
): Promise<[ContractAbi, string]> {
|
||||||
let contractAddress: string;
|
let contractAddress: string;
|
||||||
if (_.isUndefined(addressIfExists)) {
|
if (_.isUndefined(addressIfExists)) {
|
||||||
if (_.isUndefined(artifact.networks[this._networkId])) {
|
if (_.isUndefined(artifact.networks[this._networkId])) {
|
||||||
@@ -125,8 +123,8 @@ export class ContractWrapper {
|
|||||||
if (!doesContractExist) {
|
if (!doesContractExist) {
|
||||||
throw new Error(CONTRACT_NAME_TO_NOT_FOUND_ERROR[artifact.contract_name]);
|
throw new Error(CONTRACT_NAME_TO_NOT_FOUND_ERROR[artifact.contract_name]);
|
||||||
}
|
}
|
||||||
const contractInstance = this._web3Wrapper.getContractInstance(artifact.abi, contractAddress);
|
const abiAndAddress: [ContractAbi, string] = [artifact.abi, contractAddress];
|
||||||
return contractInstance;
|
return abiAndAddress;
|
||||||
}
|
}
|
||||||
protected _getContractAddress(artifact: Artifact, addressIfExists?: string): string {
|
protected _getContractAddress(artifact: Artifact, addressIfExists?: string): string {
|
||||||
if (_.isUndefined(addressIfExists)) {
|
if (_.isUndefined(addressIfExists)) {
|
||||||
@@ -139,8 +137,8 @@ export class ContractWrapper {
|
|||||||
return addressIfExists;
|
return addressIfExists;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private _onLogStateChanged<ArgsType extends ContractEventArgs>(isRemoved: boolean, log: Web3.LogEntry): void {
|
private _onLogStateChanged<ArgsType extends ContractEventArgs>(isRemoved: boolean, log: LogEntry): void {
|
||||||
_.forEach(this._filters, (filter: Web3.FilterObject, filterToken: string) => {
|
_.forEach(this._filters, (filter: FilterObject, filterToken: string) => {
|
||||||
if (filterUtils.matchesFilter(log, filter)) {
|
if (filterUtils.matchesFilter(log, filter)) {
|
||||||
const decodedLog = this._tryToDecodeLogOrNoop(log) as LogWithDecodedArgs<ArgsType>;
|
const decodedLog = this._tryToDecodeLogOrNoop(log) as LogWithDecodedArgs<ArgsType>;
|
||||||
const logEvent = {
|
const logEvent = {
|
||||||
|
@@ -21,8 +21,8 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
[address: string]: EtherTokenContract;
|
[address: string]: EtherTokenContract;
|
||||||
} = {};
|
} = {};
|
||||||
private _tokenWrapper: TokenWrapper;
|
private _tokenWrapper: TokenWrapper;
|
||||||
constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder, tokenWrapper: TokenWrapper) {
|
constructor(web3Wrapper: Web3Wrapper, networkId: number, tokenWrapper: TokenWrapper) {
|
||||||
super(web3Wrapper, networkId, abiDecoder);
|
super(web3Wrapper, networkId);
|
||||||
this._tokenWrapper = tokenWrapper;
|
this._tokenWrapper = tokenWrapper;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -41,15 +41,18 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
depositor: string,
|
depositor: string,
|
||||||
txOpts: TransactionOpts = {},
|
txOpts: TransactionOpts = {},
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
|
assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
|
||||||
assert.isValidBaseUnitAmount('amountInWei', amountInWei);
|
assert.isValidBaseUnitAmount('amountInWei', amountInWei);
|
||||||
await assert.isSenderAddressAsync('depositor', depositor, this._web3Wrapper);
|
await assert.isSenderAddressAsync('depositor', depositor, this._web3Wrapper);
|
||||||
|
const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
|
||||||
|
const normalizedDepositorAddress = depositor.toLowerCase();
|
||||||
|
|
||||||
const ethBalanceInWei = await this._web3Wrapper.getBalanceInWeiAsync(depositor);
|
const ethBalanceInWei = await this._web3Wrapper.getBalanceInWeiAsync(normalizedDepositorAddress);
|
||||||
assert.assert(ethBalanceInWei.gte(amountInWei), ZeroExError.InsufficientEthBalanceForDeposit);
|
assert.assert(ethBalanceInWei.gte(amountInWei), ZeroExError.InsufficientEthBalanceForDeposit);
|
||||||
|
|
||||||
const wethContract = await this._getEtherTokenContractAsync(etherTokenAddress);
|
const wethContract = await this._getEtherTokenContractAsync(normalizedEtherTokenAddress);
|
||||||
const txHash = await wethContract.deposit.sendTransactionAsync({
|
const txHash = await wethContract.deposit.sendTransactionAsync({
|
||||||
from: depositor,
|
from: normalizedDepositorAddress,
|
||||||
value: amountInWei,
|
value: amountInWei,
|
||||||
gas: txOpts.gasLimit,
|
gas: txOpts.gasLimit,
|
||||||
gasPrice: txOpts.gasPrice,
|
gasPrice: txOpts.gasPrice,
|
||||||
@@ -61,7 +64,7 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
* equivalent number of wrapped ETH tokens.
|
* equivalent number of wrapped ETH tokens.
|
||||||
* @param etherTokenAddress EtherToken address you wish to withdraw from.
|
* @param etherTokenAddress EtherToken address you wish to withdraw from.
|
||||||
* @param amountInWei Amount of ETH in Wei the caller wishes to withdraw.
|
* @param amountInWei Amount of ETH in Wei the caller wishes to withdraw.
|
||||||
* @param withdrawer The hex encoded user Ethereum address that would like to make the withdrawl.
|
* @param withdrawer The hex encoded user Ethereum address that would like to make the withdrawal.
|
||||||
* @param txOpts Transaction parameters.
|
* @param txOpts Transaction parameters.
|
||||||
* @return Transaction hash.
|
* @return Transaction hash.
|
||||||
*/
|
*/
|
||||||
@@ -72,14 +75,20 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
txOpts: TransactionOpts = {},
|
txOpts: TransactionOpts = {},
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
assert.isValidBaseUnitAmount('amountInWei', amountInWei);
|
assert.isValidBaseUnitAmount('amountInWei', amountInWei);
|
||||||
|
assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
|
||||||
await assert.isSenderAddressAsync('withdrawer', withdrawer, this._web3Wrapper);
|
await assert.isSenderAddressAsync('withdrawer', withdrawer, this._web3Wrapper);
|
||||||
|
const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
|
||||||
|
const normalizedWithdrawerAddress = withdrawer.toLowerCase();
|
||||||
|
|
||||||
const WETHBalanceInBaseUnits = await this._tokenWrapper.getBalanceAsync(etherTokenAddress, withdrawer);
|
const WETHBalanceInBaseUnits = await this._tokenWrapper.getBalanceAsync(
|
||||||
|
normalizedEtherTokenAddress,
|
||||||
|
normalizedWithdrawerAddress,
|
||||||
|
);
|
||||||
assert.assert(WETHBalanceInBaseUnits.gte(amountInWei), ZeroExError.InsufficientWEthBalanceForWithdrawal);
|
assert.assert(WETHBalanceInBaseUnits.gte(amountInWei), ZeroExError.InsufficientWEthBalanceForWithdrawal);
|
||||||
|
|
||||||
const wethContract = await this._getEtherTokenContractAsync(etherTokenAddress);
|
const wethContract = await this._getEtherTokenContractAsync(normalizedEtherTokenAddress);
|
||||||
const txHash = await wethContract.withdraw.sendTransactionAsync(amountInWei, {
|
const txHash = await wethContract.withdraw.sendTransactionAsync(amountInWei, {
|
||||||
from: withdrawer,
|
from: normalizedWithdrawerAddress,
|
||||||
gas: txOpts.gasLimit,
|
gas: txOpts.gasLimit,
|
||||||
gasPrice: txOpts.gasPrice,
|
gasPrice: txOpts.gasPrice,
|
||||||
});
|
});
|
||||||
@@ -87,7 +96,7 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Gets historical logs without creating a subscription
|
* Gets historical logs without creating a subscription
|
||||||
* @param etherTokenAddress An address of the ether token that emmited the logs.
|
* @param etherTokenAddress An address of the ether token that emitted the logs.
|
||||||
* @param eventName The ether token contract event you would like to subscribe to.
|
* @param eventName The ether token contract event you would like to subscribe to.
|
||||||
* @param blockRange Block range to get logs from.
|
* @param blockRange Block range to get logs from.
|
||||||
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
||||||
@@ -101,11 +110,12 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
indexFilterValues: IndexedFilterValues,
|
indexFilterValues: IndexedFilterValues,
|
||||||
): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
|
): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
|
||||||
assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
|
assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
|
||||||
|
const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
|
||||||
assert.doesBelongToStringEnum('eventName', eventName, EtherTokenEvents);
|
assert.doesBelongToStringEnum('eventName', eventName, EtherTokenEvents);
|
||||||
assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
|
assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
|
||||||
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
||||||
const logs = await this._getLogsAsync<ArgsType>(
|
const logs = await this._getLogsAsync<ArgsType>(
|
||||||
etherTokenAddress,
|
normalizedEtherTokenAddress,
|
||||||
eventName,
|
eventName,
|
||||||
blockRange,
|
blockRange,
|
||||||
indexFilterValues,
|
indexFilterValues,
|
||||||
@@ -129,11 +139,12 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
callback: EventCallback<ArgsType>,
|
callback: EventCallback<ArgsType>,
|
||||||
): string {
|
): string {
|
||||||
assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
|
assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
|
||||||
|
const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
|
||||||
assert.doesBelongToStringEnum('eventName', eventName, EtherTokenEvents);
|
assert.doesBelongToStringEnum('eventName', eventName, EtherTokenEvents);
|
||||||
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
||||||
assert.isFunction('callback', callback);
|
assert.isFunction('callback', callback);
|
||||||
const subscriptionToken = this._subscribe<ArgsType>(
|
const subscriptionToken = this._subscribe<ArgsType>(
|
||||||
etherTokenAddress,
|
normalizedEtherTokenAddress,
|
||||||
eventName,
|
eventName,
|
||||||
indexFilterValues,
|
indexFilterValues,
|
||||||
artifacts.EtherTokenArtifact.abi,
|
artifacts.EtherTokenArtifact.abi,
|
||||||
@@ -151,7 +162,7 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
/**
|
/**
|
||||||
* Cancels all existing subscriptions
|
* Cancels all existing subscriptions
|
||||||
*/
|
*/
|
||||||
public _unsubscribeAll(): void {
|
public unsubscribeAll(): void {
|
||||||
super._unsubscribeAll();
|
super._unsubscribeAll();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -168,7 +179,7 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
return contractAddressIfExists;
|
return contractAddressIfExists;
|
||||||
}
|
}
|
||||||
private _invalidateContractInstance(): void {
|
private _invalidateContractInstance(): void {
|
||||||
this._unsubscribeAll();
|
this.unsubscribeAll();
|
||||||
this._etherTokenContractsByAddress = {};
|
this._etherTokenContractsByAddress = {};
|
||||||
}
|
}
|
||||||
private async _getEtherTokenContractAsync(etherTokenAddress: string): Promise<EtherTokenContract> {
|
private async _getEtherTokenContractAsync(etherTokenAddress: string): Promise<EtherTokenContract> {
|
||||||
@@ -176,11 +187,16 @@ export class EtherTokenWrapper extends ContractWrapper {
|
|||||||
if (!_.isUndefined(etherTokenContract)) {
|
if (!_.isUndefined(etherTokenContract)) {
|
||||||
return etherTokenContract;
|
return etherTokenContract;
|
||||||
}
|
}
|
||||||
const web3ContractInstance = await this._instantiateContractIfExistsAsync(
|
const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
|
||||||
artifacts.EtherTokenArtifact,
|
artifacts.EtherTokenArtifact,
|
||||||
etherTokenAddress,
|
etherTokenAddress,
|
||||||
);
|
);
|
||||||
const contractInstance = new EtherTokenContract(web3ContractInstance, this._web3Wrapper.getContractDefaults());
|
const contractInstance = new EtherTokenContract(
|
||||||
|
abi,
|
||||||
|
address,
|
||||||
|
this._web3Wrapper.getProvider(),
|
||||||
|
this._web3Wrapper.getContractDefaults(),
|
||||||
|
);
|
||||||
etherTokenContract = contractInstance;
|
etherTokenContract = contractInstance;
|
||||||
this._etherTokenContractsByAddress[etherTokenAddress] = etherTokenContract;
|
this._etherTokenContractsByAddress[etherTokenAddress] = etherTokenContract;
|
||||||
return etherTokenContract;
|
return etherTokenContract;
|
||||||
|
@@ -1,26 +1,30 @@
|
|||||||
import { schemas } from '@0xproject/json-schemas';
|
import { schemas } from '@0xproject/json-schemas';
|
||||||
import { BlockParamLiteral, DecodedLogArgs, LogWithDecodedArgs } from '@0xproject/types';
|
import {
|
||||||
|
BlockParamLiteral,
|
||||||
|
DecodedLogArgs,
|
||||||
|
ECSignature,
|
||||||
|
LogEntry,
|
||||||
|
LogWithDecodedArgs,
|
||||||
|
Order,
|
||||||
|
SignedOrder,
|
||||||
|
} from '@0xproject/types';
|
||||||
import { AbiDecoder, BigNumber } from '@0xproject/utils';
|
import { AbiDecoder, BigNumber } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { artifacts } from '../artifacts';
|
import { artifacts } from '../artifacts';
|
||||||
import {
|
import {
|
||||||
BlockRange,
|
BlockRange,
|
||||||
ECSignature,
|
|
||||||
EventCallback,
|
EventCallback,
|
||||||
ExchangeContractErrCodes,
|
ExchangeContractErrCodes,
|
||||||
ExchangeContractErrs,
|
ExchangeContractErrs,
|
||||||
IndexedFilterValues,
|
IndexedFilterValues,
|
||||||
MethodOpts,
|
MethodOpts,
|
||||||
Order,
|
|
||||||
OrderAddresses,
|
OrderAddresses,
|
||||||
OrderCancellationRequest,
|
OrderCancellationRequest,
|
||||||
OrderFillRequest,
|
OrderFillRequest,
|
||||||
OrderTransactionOpts,
|
OrderTransactionOpts,
|
||||||
OrderValues,
|
OrderValues,
|
||||||
SignedOrder,
|
|
||||||
ValidateOrderFillableOpts,
|
ValidateOrderFillableOpts,
|
||||||
} from '../types';
|
} from '../types';
|
||||||
import { assert } from '../utils/assert';
|
import { assert } from '../utils/assert';
|
||||||
@@ -83,12 +87,11 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
constructor(
|
constructor(
|
||||||
web3Wrapper: Web3Wrapper,
|
web3Wrapper: Web3Wrapper,
|
||||||
networkId: number,
|
networkId: number,
|
||||||
abiDecoder: AbiDecoder,
|
|
||||||
tokenWrapper: TokenWrapper,
|
tokenWrapper: TokenWrapper,
|
||||||
contractAddressIfExists?: string,
|
contractAddressIfExists?: string,
|
||||||
zrxContractAddressIfExists?: string,
|
zrxContractAddressIfExists?: string,
|
||||||
) {
|
) {
|
||||||
super(web3Wrapper, networkId, abiDecoder);
|
super(web3Wrapper, networkId);
|
||||||
this._tokenWrapper = tokenWrapper;
|
this._tokenWrapper = tokenWrapper;
|
||||||
this._orderValidationUtils = new OrderValidationUtils(this);
|
this._orderValidationUtils = new OrderValidationUtils(this);
|
||||||
this._contractAddressIfExists = contractAddressIfExists;
|
this._contractAddressIfExists = contractAddressIfExists;
|
||||||
@@ -108,8 +111,10 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
|
|
||||||
const exchangeContract = await this._getExchangeContractAsync();
|
const exchangeContract = await this._getExchangeContractAsync();
|
||||||
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
||||||
|
const txData = {};
|
||||||
let unavailableTakerTokenAmount = await exchangeContract.getUnavailableTakerTokenAmount.callAsync(
|
let unavailableTakerTokenAmount = await exchangeContract.getUnavailableTakerTokenAmount.callAsync(
|
||||||
orderHash,
|
orderHash,
|
||||||
|
txData,
|
||||||
defaultBlock,
|
defaultBlock,
|
||||||
);
|
);
|
||||||
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
||||||
@@ -127,7 +132,8 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
|
|
||||||
const exchangeContract = await this._getExchangeContractAsync();
|
const exchangeContract = await this._getExchangeContractAsync();
|
||||||
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
||||||
let fillAmountInBaseUnits = await exchangeContract.filled.callAsync(orderHash, defaultBlock);
|
const txData = {};
|
||||||
|
let fillAmountInBaseUnits = await exchangeContract.filled.callAsync(orderHash, txData, defaultBlock);
|
||||||
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
||||||
fillAmountInBaseUnits = new BigNumber(fillAmountInBaseUnits);
|
fillAmountInBaseUnits = new BigNumber(fillAmountInBaseUnits);
|
||||||
return fillAmountInBaseUnits;
|
return fillAmountInBaseUnits;
|
||||||
@@ -144,7 +150,8 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
|
|
||||||
const exchangeContract = await this._getExchangeContractAsync();
|
const exchangeContract = await this._getExchangeContractAsync();
|
||||||
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
||||||
let cancelledAmountInBaseUnits = await exchangeContract.cancelled.callAsync(orderHash, defaultBlock);
|
const txData = {};
|
||||||
|
let cancelledAmountInBaseUnits = await exchangeContract.cancelled.callAsync(orderHash, txData, defaultBlock);
|
||||||
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
||||||
cancelledAmountInBaseUnits = new BigNumber(cancelledAmountInBaseUnits);
|
cancelledAmountInBaseUnits = new BigNumber(cancelledAmountInBaseUnits);
|
||||||
return cancelledAmountInBaseUnits;
|
return cancelledAmountInBaseUnits;
|
||||||
@@ -163,7 +170,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
* @param shouldThrowOnInsufficientBalanceOrAllowance Whether or not you wish for the contract call to throw
|
* @param shouldThrowOnInsufficientBalanceOrAllowance Whether or not you wish for the contract call to throw
|
||||||
* if upon execution the tokens cannot be transferred.
|
* if upon execution the tokens cannot be transferred.
|
||||||
* @param takerAddress The user Ethereum address who would like to fill this order.
|
* @param takerAddress The user Ethereum address who would like to fill this order.
|
||||||
* Must be available via the supplied Web3.Provider
|
* Must be available via the supplied Provider
|
||||||
* passed to 0x.js.
|
* passed to 0x.js.
|
||||||
* @param orderTransactionOpts Optional arguments this method accepts.
|
* @param orderTransactionOpts Optional arguments this method accepts.
|
||||||
* @return Transaction hash.
|
* @return Transaction hash.
|
||||||
@@ -180,6 +187,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
||||||
assert.isBoolean('shouldThrowOnInsufficientBalanceOrAllowance', shouldThrowOnInsufficientBalanceOrAllowance);
|
assert.isBoolean('shouldThrowOnInsufficientBalanceOrAllowance', shouldThrowOnInsufficientBalanceOrAllowance);
|
||||||
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
||||||
|
const normalizedTakerAddress = takerAddress.toLowerCase();
|
||||||
|
|
||||||
const exchangeInstance = await this._getExchangeContractAsync();
|
const exchangeInstance = await this._getExchangeContractAsync();
|
||||||
const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
|
const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
|
||||||
@@ -192,7 +200,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
exchangeTradeEmulator,
|
exchangeTradeEmulator,
|
||||||
signedOrder,
|
signedOrder,
|
||||||
fillTakerTokenAmount,
|
fillTakerTokenAmount,
|
||||||
takerAddress,
|
normalizedTakerAddress,
|
||||||
zrxTokenAddress,
|
zrxTokenAddress,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -208,7 +216,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
signedOrder.ecSignature.r,
|
signedOrder.ecSignature.r,
|
||||||
signedOrder.ecSignature.s,
|
signedOrder.ecSignature.s,
|
||||||
{
|
{
|
||||||
from: takerAddress,
|
from: normalizedTakerAddress,
|
||||||
gas: orderTransactionOpts.gasLimit,
|
gas: orderTransactionOpts.gasLimit,
|
||||||
gasPrice: orderTransactionOpts.gasPrice,
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
},
|
},
|
||||||
@@ -227,7 +235,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
* If set to false, the call will continue to fill subsequent
|
* If set to false, the call will continue to fill subsequent
|
||||||
* signedOrders even when some cannot be filled.
|
* signedOrders even when some cannot be filled.
|
||||||
* @param takerAddress The user Ethereum address who would like to fill these
|
* @param takerAddress The user Ethereum address who would like to fill these
|
||||||
* orders. Must be available via the supplied Web3.Provider
|
* orders. Must be available via the supplied Provider
|
||||||
* passed to 0x.js.
|
* passed to 0x.js.
|
||||||
* @param orderTransactionOpts Optional arguments this method accepts.
|
* @param orderTransactionOpts Optional arguments this method accepts.
|
||||||
* @return Transaction hash.
|
* @return Transaction hash.
|
||||||
@@ -254,6 +262,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
||||||
assert.isBoolean('shouldThrowOnInsufficientBalanceOrAllowance', shouldThrowOnInsufficientBalanceOrAllowance);
|
assert.isBoolean('shouldThrowOnInsufficientBalanceOrAllowance', shouldThrowOnInsufficientBalanceOrAllowance);
|
||||||
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
||||||
|
const normalizedTakerAddress = takerAddress.toLowerCase();
|
||||||
|
|
||||||
const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
|
const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
|
||||||
? SHOULD_VALIDATE_BY_DEFAULT
|
? SHOULD_VALIDATE_BY_DEFAULT
|
||||||
@@ -267,10 +276,13 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
exchangeTradeEmulator,
|
exchangeTradeEmulator,
|
||||||
signedOrder,
|
signedOrder,
|
||||||
fillTakerTokenAmount.minus(filledTakerTokenAmount),
|
fillTakerTokenAmount.minus(filledTakerTokenAmount),
|
||||||
takerAddress,
|
normalizedTakerAddress,
|
||||||
zrxTokenAddress,
|
zrxTokenAddress,
|
||||||
);
|
);
|
||||||
filledTakerTokenAmount = filledTakerTokenAmount.plus(singleFilledTakerTokenAmount);
|
filledTakerTokenAmount = filledTakerTokenAmount.plus(singleFilledTakerTokenAmount);
|
||||||
|
if (filledTakerTokenAmount.eq(fillTakerTokenAmount)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,7 +313,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
rArray,
|
rArray,
|
||||||
sArray,
|
sArray,
|
||||||
{
|
{
|
||||||
from: takerAddress,
|
from: normalizedTakerAddress,
|
||||||
gas: orderTransactionOpts.gasLimit,
|
gas: orderTransactionOpts.gasLimit,
|
||||||
gasPrice: orderTransactionOpts.gasPrice,
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
},
|
},
|
||||||
@@ -323,7 +335,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
* cannot be filled.
|
* cannot be filled.
|
||||||
* @param takerAddress The user Ethereum address who would like to fill
|
* @param takerAddress The user Ethereum address who would like to fill
|
||||||
* these orders. Must be available via the supplied
|
* these orders. Must be available via the supplied
|
||||||
* Web3.Provider passed to 0x.js.
|
* Provider passed to 0x.js.
|
||||||
* @param orderTransactionOpts Optional arguments this method accepts.
|
* @param orderTransactionOpts Optional arguments this method accepts.
|
||||||
* @return Transaction hash.
|
* @return Transaction hash.
|
||||||
*/
|
*/
|
||||||
@@ -345,6 +357,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
);
|
);
|
||||||
assert.isBoolean('shouldThrowOnInsufficientBalanceOrAllowance', shouldThrowOnInsufficientBalanceOrAllowance);
|
assert.isBoolean('shouldThrowOnInsufficientBalanceOrAllowance', shouldThrowOnInsufficientBalanceOrAllowance);
|
||||||
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
||||||
|
const normalizedTakerAddress = takerAddress.toLowerCase();
|
||||||
const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
|
const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
|
||||||
? SHOULD_VALIDATE_BY_DEFAULT
|
? SHOULD_VALIDATE_BY_DEFAULT
|
||||||
: orderTransactionOpts.shouldValidate;
|
: orderTransactionOpts.shouldValidate;
|
||||||
@@ -356,7 +369,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
exchangeTradeEmulator,
|
exchangeTradeEmulator,
|
||||||
orderFillRequest.signedOrder,
|
orderFillRequest.signedOrder,
|
||||||
orderFillRequest.takerTokenFillAmount,
|
orderFillRequest.takerTokenFillAmount,
|
||||||
takerAddress,
|
normalizedTakerAddress,
|
||||||
zrxTokenAddress,
|
zrxTokenAddress,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -389,7 +402,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
rArray,
|
rArray,
|
||||||
sArray,
|
sArray,
|
||||||
{
|
{
|
||||||
from: takerAddress,
|
from: normalizedTakerAddress,
|
||||||
gas: orderTransactionOpts.gasLimit,
|
gas: orderTransactionOpts.gasLimit,
|
||||||
gasPrice: orderTransactionOpts.gasPrice,
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
},
|
},
|
||||||
@@ -403,7 +416,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
* signedOrder you wish to fill.
|
* signedOrder you wish to fill.
|
||||||
* @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
|
* @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
|
||||||
* @param takerAddress The user Ethereum address who would like to fill this order.
|
* @param takerAddress The user Ethereum address who would like to fill this order.
|
||||||
* Must be available via the supplied Web3.Provider passed to 0x.js.
|
* Must be available via the supplied Provider passed to 0x.js.
|
||||||
* @param orderTransactionOpts Optional arguments this method accepts.
|
* @param orderTransactionOpts Optional arguments this method accepts.
|
||||||
* @return Transaction hash.
|
* @return Transaction hash.
|
||||||
*/
|
*/
|
||||||
@@ -417,6 +430,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
|
assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
|
||||||
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
||||||
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
||||||
|
const normalizedTakerAddress = takerAddress.toLowerCase();
|
||||||
|
|
||||||
const exchangeInstance = await this._getExchangeContractAsync();
|
const exchangeInstance = await this._getExchangeContractAsync();
|
||||||
|
|
||||||
@@ -430,7 +444,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
exchangeTradeEmulator,
|
exchangeTradeEmulator,
|
||||||
signedOrder,
|
signedOrder,
|
||||||
fillTakerTokenAmount,
|
fillTakerTokenAmount,
|
||||||
takerAddress,
|
normalizedTakerAddress,
|
||||||
zrxTokenAddress,
|
zrxTokenAddress,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -444,7 +458,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
signedOrder.ecSignature.r,
|
signedOrder.ecSignature.r,
|
||||||
signedOrder.ecSignature.s,
|
signedOrder.ecSignature.s,
|
||||||
{
|
{
|
||||||
from: takerAddress,
|
from: normalizedTakerAddress,
|
||||||
gas: orderTransactionOpts.gasLimit,
|
gas: orderTransactionOpts.gasLimit,
|
||||||
gasPrice: orderTransactionOpts.gasPrice,
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
},
|
},
|
||||||
@@ -456,7 +470,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
* filled (each to the specified fillAmount) or aborted.
|
* filled (each to the specified fillAmount) or aborted.
|
||||||
* @param orderFillRequests An array of objects that conform to the OrderFillRequest interface.
|
* @param orderFillRequests An array of objects that conform to the OrderFillRequest interface.
|
||||||
* @param takerAddress The user Ethereum address who would like to fill there orders.
|
* @param takerAddress The user Ethereum address who would like to fill there orders.
|
||||||
* Must be available via the supplied Web3.Provider passed to 0x.js.
|
* Must be available via the supplied Provider passed to 0x.js.
|
||||||
* @param orderTransactionOpts Optional arguments this method accepts.
|
* @param orderTransactionOpts Optional arguments this method accepts.
|
||||||
* @return Transaction hash.
|
* @return Transaction hash.
|
||||||
*/
|
*/
|
||||||
@@ -476,6 +490,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
ExchangeContractErrs.BatchOrdersMustHaveSameExchangeAddress,
|
ExchangeContractErrs.BatchOrdersMustHaveSameExchangeAddress,
|
||||||
);
|
);
|
||||||
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
||||||
|
const normalizedTakerAddress = takerAddress.toLowerCase();
|
||||||
if (_.isEmpty(orderFillRequests)) {
|
if (_.isEmpty(orderFillRequests)) {
|
||||||
throw new Error(ExchangeContractErrs.BatchOrdersMustHaveAtLeastOneItem);
|
throw new Error(ExchangeContractErrs.BatchOrdersMustHaveAtLeastOneItem);
|
||||||
}
|
}
|
||||||
@@ -492,7 +507,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
exchangeTradeEmulator,
|
exchangeTradeEmulator,
|
||||||
orderFillRequest.signedOrder,
|
orderFillRequest.signedOrder,
|
||||||
orderFillRequest.takerTokenFillAmount,
|
orderFillRequest.takerTokenFillAmount,
|
||||||
takerAddress,
|
normalizedTakerAddress,
|
||||||
zrxTokenAddress,
|
zrxTokenAddress,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -520,7 +535,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
rParams,
|
rParams,
|
||||||
sParams,
|
sParams,
|
||||||
{
|
{
|
||||||
from: takerAddress,
|
from: normalizedTakerAddress,
|
||||||
gas: orderTransactionOpts.gasLimit,
|
gas: orderTransactionOpts.gasLimit,
|
||||||
gasPrice: orderTransactionOpts.gasPrice,
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
},
|
},
|
||||||
@@ -544,6 +559,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
assert.doesConformToSchema('order', order, schemas.orderSchema);
|
assert.doesConformToSchema('order', order, schemas.orderSchema);
|
||||||
assert.isValidBaseUnitAmount('takerTokenCancelAmount', cancelTakerTokenAmount);
|
assert.isValidBaseUnitAmount('takerTokenCancelAmount', cancelTakerTokenAmount);
|
||||||
await assert.isSenderAddressAsync('order.maker', order.maker, this._web3Wrapper);
|
await assert.isSenderAddressAsync('order.maker', order.maker, this._web3Wrapper);
|
||||||
|
const normalizedMakerAddress = order.maker.toLowerCase();
|
||||||
|
|
||||||
const exchangeInstance = await this._getExchangeContractAsync();
|
const exchangeInstance = await this._getExchangeContractAsync();
|
||||||
|
|
||||||
@@ -566,7 +582,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
orderValues,
|
orderValues,
|
||||||
cancelTakerTokenAmount,
|
cancelTakerTokenAmount,
|
||||||
{
|
{
|
||||||
from: order.maker,
|
from: normalizedMakerAddress,
|
||||||
gas: orderTransactionOpts.gasLimit,
|
gas: orderTransactionOpts.gasLimit,
|
||||||
gasPrice: orderTransactionOpts.gasPrice,
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
},
|
},
|
||||||
@@ -603,6 +619,8 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
assert.hasAtMostOneUniqueValue(makers, ExchangeContractErrs.MultipleMakersInSingleCancelBatchDisallowed);
|
assert.hasAtMostOneUniqueValue(makers, ExchangeContractErrs.MultipleMakersInSingleCancelBatchDisallowed);
|
||||||
const maker = makers[0];
|
const maker = makers[0];
|
||||||
await assert.isSenderAddressAsync('maker', maker, this._web3Wrapper);
|
await assert.isSenderAddressAsync('maker', maker, this._web3Wrapper);
|
||||||
|
const normalizedMakerAddress = maker.toLowerCase();
|
||||||
|
|
||||||
const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
|
const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
|
||||||
? SHOULD_VALIDATE_BY_DEFAULT
|
? SHOULD_VALIDATE_BY_DEFAULT
|
||||||
: orderTransactionOpts.shouldValidate;
|
: orderTransactionOpts.shouldValidate;
|
||||||
@@ -636,7 +654,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
orderValues,
|
orderValues,
|
||||||
cancelTakerTokenAmounts,
|
cancelTakerTokenAmounts,
|
||||||
{
|
{
|
||||||
from: maker,
|
from: normalizedMakerAddress,
|
||||||
gas: orderTransactionOpts.gasLimit,
|
gas: orderTransactionOpts.gasLimit,
|
||||||
gasPrice: orderTransactionOpts.gasPrice,
|
gasPrice: orderTransactionOpts.gasPrice,
|
||||||
},
|
},
|
||||||
@@ -679,7 +697,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
/**
|
/**
|
||||||
* Cancels all existing subscriptions
|
* Cancels all existing subscriptions
|
||||||
*/
|
*/
|
||||||
public _unsubscribeAll(): void {
|
public unsubscribeAll(): void {
|
||||||
super._unsubscribeAll();
|
super._unsubscribeAll();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -747,7 +765,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
* signedOrder you wish to fill.
|
* signedOrder you wish to fill.
|
||||||
* @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
|
* @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
|
||||||
* @param takerAddress The user Ethereum address who would like to fill this order.
|
* @param takerAddress The user Ethereum address who would like to fill this order.
|
||||||
* Must be available via the supplied Web3.Provider passed to 0x.js.
|
* Must be available via the supplied Provider passed to 0x.js.
|
||||||
*/
|
*/
|
||||||
public async validateFillOrderThrowIfInvalidAsync(
|
public async validateFillOrderThrowIfInvalidAsync(
|
||||||
signedOrder: SignedOrder,
|
signedOrder: SignedOrder,
|
||||||
@@ -757,13 +775,14 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
|
assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
|
||||||
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
||||||
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
||||||
|
const normalizedTakerAddress = takerAddress.toLowerCase();
|
||||||
const zrxTokenAddress = this.getZRXTokenAddress();
|
const zrxTokenAddress = this.getZRXTokenAddress();
|
||||||
const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
|
const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
|
||||||
await this._orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
|
await this._orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
|
||||||
exchangeTradeEmulator,
|
exchangeTradeEmulator,
|
||||||
signedOrder,
|
signedOrder,
|
||||||
fillTakerTokenAmount,
|
fillTakerTokenAmount,
|
||||||
takerAddress,
|
normalizedTakerAddress,
|
||||||
zrxTokenAddress,
|
zrxTokenAddress,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -793,7 +812,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
* signedOrder you wish to fill.
|
* signedOrder you wish to fill.
|
||||||
* @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
|
* @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
|
||||||
* @param takerAddress The user Ethereum address who would like to fill this order.
|
* @param takerAddress The user Ethereum address who would like to fill this order.
|
||||||
* Must be available via the supplied Web3.Provider passed to 0x.js.
|
* Must be available via the supplied Provider passed to 0x.js.
|
||||||
*/
|
*/
|
||||||
public async validateFillOrKillOrderThrowIfInvalidAsync(
|
public async validateFillOrKillOrderThrowIfInvalidAsync(
|
||||||
signedOrder: SignedOrder,
|
signedOrder: SignedOrder,
|
||||||
@@ -803,13 +822,14 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
|
assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
|
||||||
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
|
||||||
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
|
||||||
|
const normalizedTakerAddress = takerAddress.toLowerCase();
|
||||||
const zrxTokenAddress = this.getZRXTokenAddress();
|
const zrxTokenAddress = this.getZRXTokenAddress();
|
||||||
const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
|
const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
|
||||||
await this._orderValidationUtils.validateFillOrKillOrderThrowIfInvalidAsync(
|
await this._orderValidationUtils.validateFillOrKillOrderThrowIfInvalidAsync(
|
||||||
exchangeTradeEmulator,
|
exchangeTradeEmulator,
|
||||||
signedOrder,
|
signedOrder,
|
||||||
fillTakerTokenAmount,
|
fillTakerTokenAmount,
|
||||||
takerAddress,
|
normalizedTakerAddress,
|
||||||
zrxTokenAddress,
|
zrxTokenAddress,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -839,16 +859,16 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
return isRoundingError;
|
return isRoundingError;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Checks if logs contain LogError, which is emmited by Exchange contract on transaction failure.
|
* Checks if logs contain LogError, which is emitted by Exchange contract on transaction failure.
|
||||||
* @param logs Transaction logs as returned by `zeroEx.awaitTransactionMinedAsync`
|
* @param logs Transaction logs as returned by `zeroEx.awaitTransactionMinedAsync`
|
||||||
*/
|
*/
|
||||||
public throwLogErrorsAsErrors(logs: Array<LogWithDecodedArgs<DecodedLogArgs> | Web3.LogEntry>): void {
|
public throwLogErrorsAsErrors(logs: Array<LogWithDecodedArgs<DecodedLogArgs> | LogEntry>): void {
|
||||||
const errLog = _.find(logs, {
|
const errLog = _.find(logs, {
|
||||||
event: ExchangeEvents.LogError,
|
event: ExchangeEvents.LogError,
|
||||||
});
|
});
|
||||||
if (!_.isUndefined(errLog)) {
|
if (!_.isUndefined(errLog)) {
|
||||||
const logArgs = (errLog as LogWithDecodedArgs<LogErrorContractEventArgs>).args;
|
const logArgs = (errLog as LogWithDecodedArgs<LogErrorContractEventArgs>).args;
|
||||||
const errCode = logArgs.errorId.toNumber();
|
const errCode = logArgs.errorId;
|
||||||
const errMessage = this._exchangeContractErrCodesToMsg[errCode];
|
const errMessage = this._exchangeContractErrCodesToMsg[errCode];
|
||||||
throw new Error(errMessage);
|
throw new Error(errMessage);
|
||||||
}
|
}
|
||||||
@@ -862,7 +882,7 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
return contractAddress;
|
return contractAddress;
|
||||||
}
|
}
|
||||||
private _invalidateContractInstances(): void {
|
private _invalidateContractInstances(): void {
|
||||||
this._unsubscribeAll();
|
this.unsubscribeAll();
|
||||||
delete this._exchangeContractIfExists;
|
delete this._exchangeContractIfExists;
|
||||||
}
|
}
|
||||||
private async _isValidSignatureUsingContractCallAsync(
|
private async _isValidSignatureUsingContractCallAsync(
|
||||||
@@ -873,11 +893,12 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
assert.isHexString('dataHex', dataHex);
|
assert.isHexString('dataHex', dataHex);
|
||||||
assert.doesConformToSchema('ecSignature', ecSignature, schemas.ecSignatureSchema);
|
assert.doesConformToSchema('ecSignature', ecSignature, schemas.ecSignatureSchema);
|
||||||
assert.isETHAddressHex('signerAddressHex', signerAddressHex);
|
assert.isETHAddressHex('signerAddressHex', signerAddressHex);
|
||||||
|
const normalizedSignerAddress = signerAddressHex.toLowerCase();
|
||||||
|
|
||||||
const exchangeInstance = await this._getExchangeContractAsync();
|
const exchangeInstance = await this._getExchangeContractAsync();
|
||||||
|
|
||||||
const isValidSignature = await exchangeInstance.isValidSignature.callAsync(
|
const isValidSignature = await exchangeInstance.isValidSignature.callAsync(
|
||||||
signerAddressHex,
|
normalizedSignerAddress,
|
||||||
dataHex,
|
dataHex,
|
||||||
ecSignature.v,
|
ecSignature.v,
|
||||||
ecSignature.r,
|
ecSignature.r,
|
||||||
@@ -895,11 +916,16 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
if (!_.isUndefined(this._exchangeContractIfExists)) {
|
if (!_.isUndefined(this._exchangeContractIfExists)) {
|
||||||
return this._exchangeContractIfExists;
|
return this._exchangeContractIfExists;
|
||||||
}
|
}
|
||||||
const web3ContractInstance = await this._instantiateContractIfExistsAsync(
|
const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
|
||||||
artifacts.ExchangeArtifact,
|
artifacts.ExchangeArtifact,
|
||||||
this._contractAddressIfExists,
|
this._contractAddressIfExists,
|
||||||
);
|
);
|
||||||
const contractInstance = new ExchangeContract(web3ContractInstance, this._web3Wrapper.getContractDefaults());
|
const contractInstance = new ExchangeContract(
|
||||||
|
abi,
|
||||||
|
address,
|
||||||
|
this._web3Wrapper.getProvider(),
|
||||||
|
this._web3Wrapper.getContractDefaults(),
|
||||||
|
);
|
||||||
this._exchangeContractIfExists = contractInstance;
|
this._exchangeContractIfExists = contractInstance;
|
||||||
return this._exchangeContractIfExists;
|
return this._exchangeContractIfExists;
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +0,0 @@
|
|||||||
dummy_token.ts
|
|
||||||
ether_token.ts
|
|
||||||
exchange.ts
|
|
||||||
token_registry.ts
|
|
||||||
token_transfer_proxy.ts
|
|
||||||
token.ts
|
|
@@ -1,33 +0,0 @@
|
|||||||
import {TxData, TxDataPayable} from '@0xproject/types';
|
|
||||||
import * as _ from 'lodash';
|
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
export class BaseContract {
|
|
||||||
protected _web3ContractInstance: Web3.ContractInstance;
|
|
||||||
protected _defaults: Partial<TxData>;
|
|
||||||
protected async _applyDefaultsToTxDataAsync<T extends TxData|TxDataPayable>(
|
|
||||||
txData: T,
|
|
||||||
estimateGasAsync?: (txData: T) => Promise<number>,
|
|
||||||
): Promise<TxData> {
|
|
||||||
// Gas amount sourced with the following priorities:
|
|
||||||
// 1. Optional param passed in to public method call
|
|
||||||
// 2. Global config passed in at library instantiation
|
|
||||||
// 3. Gas estimate calculation + safety margin
|
|
||||||
const removeUndefinedProperties = _.pickBy;
|
|
||||||
const txDataWithDefaults = {
|
|
||||||
...removeUndefinedProperties(this._defaults),
|
|
||||||
...removeUndefinedProperties(txData as any),
|
|
||||||
// HACK: TS can't prove that T is spreadable.
|
|
||||||
// Awaiting https://github.com/Microsoft/TypeScript/pull/13288 to be merged
|
|
||||||
};
|
|
||||||
if (_.isUndefined(txDataWithDefaults.gas) && !_.isUndefined(estimateGasAsync)) {
|
|
||||||
const estimatedGas = await estimateGasAsync(txData);
|
|
||||||
txDataWithDefaults.gas = estimatedGas;
|
|
||||||
}
|
|
||||||
return txDataWithDefaults;
|
|
||||||
}
|
|
||||||
constructor(web3ContractInstance: Web3.ContractInstance, defaults: Partial<TxData>) {
|
|
||||||
this._web3ContractInstance = web3ContractInstance;
|
|
||||||
this._defaults = defaults;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -23,7 +23,7 @@ export class TokenRegistryWrapper extends ContractWrapper {
|
|||||||
address: metadata[0],
|
address: metadata[0],
|
||||||
name: metadata[1],
|
name: metadata[1],
|
||||||
symbol: metadata[2],
|
symbol: metadata[2],
|
||||||
decimals: metadata[3].toNumber(),
|
decimals: metadata[3],
|
||||||
};
|
};
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,8 @@ export class TokenRegistryWrapper extends ContractWrapper {
|
|||||||
public async getTokenAddressesAsync(): Promise<string[]> {
|
public async getTokenAddressesAsync(): Promise<string[]> {
|
||||||
const tokenRegistryContract = await this._getTokenRegistryContractAsync();
|
const tokenRegistryContract = await this._getTokenRegistryContractAsync();
|
||||||
const addresses = await tokenRegistryContract.getTokenAddresses.callAsync();
|
const addresses = await tokenRegistryContract.getTokenAddresses.callAsync();
|
||||||
return addresses;
|
const lowerCaseAddresses = _.map(addresses, address => address.toLowerCase());
|
||||||
|
return lowerCaseAddresses;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Retrieves a token by address currently listed in the Token Registry smart contract
|
* Retrieves a token by address currently listed in the Token Registry smart contract
|
||||||
@@ -58,9 +59,10 @@ export class TokenRegistryWrapper extends ContractWrapper {
|
|||||||
*/
|
*/
|
||||||
public async getTokenIfExistsAsync(address: string): Promise<Token | undefined> {
|
public async getTokenIfExistsAsync(address: string): Promise<Token | undefined> {
|
||||||
assert.isETHAddressHex('address', address);
|
assert.isETHAddressHex('address', address);
|
||||||
|
const normalizedAddress = address.toLowerCase();
|
||||||
|
|
||||||
const tokenRegistryContract = await this._getTokenRegistryContractAsync();
|
const tokenRegistryContract = await this._getTokenRegistryContractAsync();
|
||||||
const metadata = await tokenRegistryContract.getTokenMetaData.callAsync(address);
|
const metadata = await tokenRegistryContract.getTokenMetaData.callAsync(normalizedAddress);
|
||||||
const token = TokenRegistryWrapper._createTokenFromMetadata(metadata);
|
const token = TokenRegistryWrapper._createTokenFromMetadata(metadata);
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
@@ -115,12 +117,14 @@ export class TokenRegistryWrapper extends ContractWrapper {
|
|||||||
if (!_.isUndefined(this._tokenRegistryContractIfExists)) {
|
if (!_.isUndefined(this._tokenRegistryContractIfExists)) {
|
||||||
return this._tokenRegistryContractIfExists;
|
return this._tokenRegistryContractIfExists;
|
||||||
}
|
}
|
||||||
const web3ContractInstance = await this._instantiateContractIfExistsAsync(
|
const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
|
||||||
artifacts.TokenRegistryArtifact,
|
artifacts.TokenRegistryArtifact,
|
||||||
this._contractAddressIfExists,
|
this._contractAddressIfExists,
|
||||||
);
|
);
|
||||||
const contractInstance = new TokenRegistryContract(
|
const contractInstance = new TokenRegistryContract(
|
||||||
web3ContractInstance,
|
abi,
|
||||||
|
address,
|
||||||
|
this._web3Wrapper.getProvider(),
|
||||||
this._web3Wrapper.getContractDefaults(),
|
this._web3Wrapper.getContractDefaults(),
|
||||||
);
|
);
|
||||||
this._tokenRegistryContractIfExists = contractInstance;
|
this._tokenRegistryContractIfExists = contractInstance;
|
||||||
|
@@ -2,6 +2,7 @@ import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
|||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
import { artifacts } from '../artifacts';
|
import { artifacts } from '../artifacts';
|
||||||
|
import { assert } from '../utils/assert';
|
||||||
|
|
||||||
import { ContractWrapper } from './contract_wrapper';
|
import { ContractWrapper } from './contract_wrapper';
|
||||||
import { TokenTransferProxyContract } from './generated/token_transfer_proxy';
|
import { TokenTransferProxyContract } from './generated/token_transfer_proxy';
|
||||||
@@ -22,8 +23,12 @@ export class TokenTransferProxyWrapper extends ContractWrapper {
|
|||||||
* @return Whether the exchangeContractAddress is authorized.
|
* @return Whether the exchangeContractAddress is authorized.
|
||||||
*/
|
*/
|
||||||
public async isAuthorizedAsync(exchangeContractAddress: string): Promise<boolean> {
|
public async isAuthorizedAsync(exchangeContractAddress: string): Promise<boolean> {
|
||||||
|
assert.isETHAddressHex('exchangeContractAddress', exchangeContractAddress);
|
||||||
|
const normalizedExchangeContractAddress = exchangeContractAddress.toLowerCase();
|
||||||
const tokenTransferProxyContractInstance = await this._getTokenTransferProxyContractAsync();
|
const tokenTransferProxyContractInstance = await this._getTokenTransferProxyContractAsync();
|
||||||
const isAuthorized = await tokenTransferProxyContractInstance.authorized.callAsync(exchangeContractAddress);
|
const isAuthorized = await tokenTransferProxyContractInstance.authorized.callAsync(
|
||||||
|
normalizedExchangeContractAddress,
|
||||||
|
);
|
||||||
return isAuthorized;
|
return isAuthorized;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -54,12 +59,14 @@ export class TokenTransferProxyWrapper extends ContractWrapper {
|
|||||||
if (!_.isUndefined(this._tokenTransferProxyContractIfExists)) {
|
if (!_.isUndefined(this._tokenTransferProxyContractIfExists)) {
|
||||||
return this._tokenTransferProxyContractIfExists;
|
return this._tokenTransferProxyContractIfExists;
|
||||||
}
|
}
|
||||||
const web3ContractInstance = await this._instantiateContractIfExistsAsync(
|
const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
|
||||||
artifacts.TokenTransferProxyArtifact,
|
artifacts.TokenTransferProxyArtifact,
|
||||||
this._contractAddressIfExists,
|
this._contractAddressIfExists,
|
||||||
);
|
);
|
||||||
const contractInstance = new TokenTransferProxyContract(
|
const contractInstance = new TokenTransferProxyContract(
|
||||||
web3ContractInstance,
|
abi,
|
||||||
|
address,
|
||||||
|
this._web3Wrapper.getProvider(),
|
||||||
this._web3Wrapper.getContractDefaults(),
|
this._web3Wrapper.getContractDefaults(),
|
||||||
);
|
);
|
||||||
this._tokenTransferProxyContractIfExists = contractInstance;
|
this._tokenTransferProxyContractIfExists = contractInstance;
|
||||||
|
@@ -22,13 +22,8 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
|
public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
|
||||||
private _tokenContractsByAddress: { [address: string]: TokenContract };
|
private _tokenContractsByAddress: { [address: string]: TokenContract };
|
||||||
private _tokenTransferProxyWrapper: TokenTransferProxyWrapper;
|
private _tokenTransferProxyWrapper: TokenTransferProxyWrapper;
|
||||||
constructor(
|
constructor(web3Wrapper: Web3Wrapper, networkId: number, tokenTransferProxyWrapper: TokenTransferProxyWrapper) {
|
||||||
web3Wrapper: Web3Wrapper,
|
super(web3Wrapper, networkId);
|
||||||
networkId: number,
|
|
||||||
abiDecoder: AbiDecoder,
|
|
||||||
tokenTransferProxyWrapper: TokenTransferProxyWrapper,
|
|
||||||
) {
|
|
||||||
super(web3Wrapper, networkId, abiDecoder);
|
|
||||||
this._tokenContractsByAddress = {};
|
this._tokenContractsByAddress = {};
|
||||||
this._tokenTransferProxyWrapper = tokenTransferProxyWrapper;
|
this._tokenTransferProxyWrapper = tokenTransferProxyWrapper;
|
||||||
}
|
}
|
||||||
@@ -46,10 +41,13 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
): Promise<BigNumber> {
|
): Promise<BigNumber> {
|
||||||
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
||||||
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
const normalizedOwnerAddress = ownerAddress.toLowerCase();
|
||||||
|
|
||||||
const tokenContract = await this._getTokenContractAsync(tokenAddress);
|
const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
|
||||||
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
||||||
let balance = await tokenContract.balanceOf.callAsync(ownerAddress, defaultBlock);
|
const txData = {};
|
||||||
|
let balance = await tokenContract.balanceOf.callAsync(normalizedOwnerAddress, txData, defaultBlock);
|
||||||
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
||||||
balance = new BigNumber(balance);
|
balance = new BigNumber(balance);
|
||||||
return balance;
|
return balance;
|
||||||
@@ -72,14 +70,17 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
amountInBaseUnits: BigNumber,
|
amountInBaseUnits: BigNumber,
|
||||||
txOpts: TransactionOpts = {},
|
txOpts: TransactionOpts = {},
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
await assert.isSenderAddressAsync('ownerAddress', ownerAddress, this._web3Wrapper);
|
|
||||||
assert.isETHAddressHex('spenderAddress', spenderAddress);
|
assert.isETHAddressHex('spenderAddress', spenderAddress);
|
||||||
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
|
await assert.isSenderAddressAsync('ownerAddress', ownerAddress, this._web3Wrapper);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
const normalizedSpenderAddress = spenderAddress.toLowerCase();
|
||||||
|
const normalizedOwnerAddress = ownerAddress.toLowerCase();
|
||||||
assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
|
assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
|
||||||
|
|
||||||
const tokenContract = await this._getTokenContractAsync(tokenAddress);
|
const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
|
||||||
const txHash = await tokenContract.approve.sendTransactionAsync(spenderAddress, amountInBaseUnits, {
|
const txHash = await tokenContract.approve.sendTransactionAsync(normalizedSpenderAddress, amountInBaseUnits, {
|
||||||
from: ownerAddress,
|
from: normalizedOwnerAddress,
|
||||||
gas: txOpts.gasLimit,
|
gas: txOpts.gasLimit,
|
||||||
gasPrice: txOpts.gasPrice,
|
gasPrice: txOpts.gasPrice,
|
||||||
});
|
});
|
||||||
@@ -103,10 +104,16 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
spenderAddress: string,
|
spenderAddress: string,
|
||||||
txOpts: TransactionOpts = {},
|
txOpts: TransactionOpts = {},
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
|
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
||||||
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
|
assert.isETHAddressHex('spenderAddress', spenderAddress);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
const normalizedOwnerAddress = ownerAddress.toLowerCase();
|
||||||
|
const normalizedSpenderAddress = spenderAddress.toLowerCase();
|
||||||
const txHash = await this.setAllowanceAsync(
|
const txHash = await this.setAllowanceAsync(
|
||||||
tokenAddress,
|
normalizedTokenAddress,
|
||||||
ownerAddress,
|
normalizedOwnerAddress,
|
||||||
spenderAddress,
|
normalizedSpenderAddress,
|
||||||
this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
|
this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
|
||||||
txOpts,
|
txOpts,
|
||||||
);
|
);
|
||||||
@@ -128,10 +135,20 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
): Promise<BigNumber> {
|
): Promise<BigNumber> {
|
||||||
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
||||||
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
|
assert.isETHAddressHex('spenderAddress', spenderAddress);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
const normalizedOwnerAddress = ownerAddress.toLowerCase();
|
||||||
|
const normalizedSpenderAddress = spenderAddress.toLowerCase();
|
||||||
|
|
||||||
const tokenContract = await this._getTokenContractAsync(tokenAddress);
|
const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
|
||||||
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
|
||||||
let allowanceInBaseUnits = await tokenContract.allowance.callAsync(ownerAddress, spenderAddress, defaultBlock);
|
const txData = {};
|
||||||
|
let allowanceInBaseUnits = await tokenContract.allowance.callAsync(
|
||||||
|
normalizedOwnerAddress,
|
||||||
|
normalizedSpenderAddress,
|
||||||
|
txData,
|
||||||
|
defaultBlock,
|
||||||
|
);
|
||||||
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
// Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
|
||||||
allowanceInBaseUnits = new BigNumber(allowanceInBaseUnits);
|
allowanceInBaseUnits = new BigNumber(allowanceInBaseUnits);
|
||||||
return allowanceInBaseUnits;
|
return allowanceInBaseUnits;
|
||||||
@@ -149,9 +166,16 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
): Promise<BigNumber> {
|
): Promise<BigNumber> {
|
||||||
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
||||||
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
const normalizedOwnerAddress = ownerAddress.toLowerCase();
|
||||||
|
|
||||||
const proxyAddress = this._tokenTransferProxyWrapper.getContractAddress();
|
const proxyAddress = this._tokenTransferProxyWrapper.getContractAddress();
|
||||||
const allowanceInBaseUnits = await this.getAllowanceAsync(tokenAddress, ownerAddress, proxyAddress, methodOpts);
|
const allowanceInBaseUnits = await this.getAllowanceAsync(
|
||||||
|
normalizedTokenAddress,
|
||||||
|
normalizedOwnerAddress,
|
||||||
|
proxyAddress,
|
||||||
|
methodOpts,
|
||||||
|
);
|
||||||
return allowanceInBaseUnits;
|
return allowanceInBaseUnits;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -172,12 +196,14 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
||||||
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
const normalizedOwnerAddress = ownerAddress.toLowerCase();
|
||||||
assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
|
assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
|
||||||
|
|
||||||
const proxyAddress = this._tokenTransferProxyWrapper.getContractAddress();
|
const proxyAddress = this._tokenTransferProxyWrapper.getContractAddress();
|
||||||
const txHash = await this.setAllowanceAsync(
|
const txHash = await this.setAllowanceAsync(
|
||||||
tokenAddress,
|
normalizedTokenAddress,
|
||||||
ownerAddress,
|
normalizedOwnerAddress,
|
||||||
proxyAddress,
|
proxyAddress,
|
||||||
amountInBaseUnits,
|
amountInBaseUnits,
|
||||||
txOpts,
|
txOpts,
|
||||||
@@ -200,9 +226,13 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
ownerAddress: string,
|
ownerAddress: string,
|
||||||
txOpts: TransactionOpts = {},
|
txOpts: TransactionOpts = {},
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
|
assert.isETHAddressHex('ownerAddress', ownerAddress);
|
||||||
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
const normalizedOwnerAddress = ownerAddress.toLowerCase();
|
||||||
const txHash = await this.setProxyAllowanceAsync(
|
const txHash = await this.setProxyAllowanceAsync(
|
||||||
tokenAddress,
|
normalizedTokenAddress,
|
||||||
ownerAddress,
|
normalizedOwnerAddress,
|
||||||
this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
|
this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
|
||||||
txOpts,
|
txOpts,
|
||||||
);
|
);
|
||||||
@@ -225,19 +255,22 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
txOpts: TransactionOpts = {},
|
txOpts: TransactionOpts = {},
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
await assert.isSenderAddressAsync('fromAddress', fromAddress, this._web3Wrapper);
|
|
||||||
assert.isETHAddressHex('toAddress', toAddress);
|
assert.isETHAddressHex('toAddress', toAddress);
|
||||||
|
await assert.isSenderAddressAsync('fromAddress', fromAddress, this._web3Wrapper);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
const normalizedFromAddress = fromAddress.toLowerCase();
|
||||||
|
const normalizedToAddress = toAddress.toLowerCase();
|
||||||
assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
|
assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
|
||||||
|
|
||||||
const tokenContract = await this._getTokenContractAsync(tokenAddress);
|
const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
|
||||||
|
|
||||||
const fromAddressBalance = await this.getBalanceAsync(tokenAddress, fromAddress);
|
const fromAddressBalance = await this.getBalanceAsync(normalizedTokenAddress, normalizedFromAddress);
|
||||||
if (fromAddressBalance.lessThan(amountInBaseUnits)) {
|
if (fromAddressBalance.lessThan(amountInBaseUnits)) {
|
||||||
throw new Error(ZeroExError.InsufficientBalanceForTransfer);
|
throw new Error(ZeroExError.InsufficientBalanceForTransfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
const txHash = await tokenContract.transfer.sendTransactionAsync(toAddress, amountInBaseUnits, {
|
const txHash = await tokenContract.transfer.sendTransactionAsync(normalizedToAddress, amountInBaseUnits, {
|
||||||
from: fromAddress,
|
from: normalizedFromAddress,
|
||||||
gas: txOpts.gasLimit,
|
gas: txOpts.gasLimit,
|
||||||
gasPrice: txOpts.gasPrice,
|
gasPrice: txOpts.gasPrice,
|
||||||
});
|
});
|
||||||
@@ -265,30 +298,38 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
amountInBaseUnits: BigNumber,
|
amountInBaseUnits: BigNumber,
|
||||||
txOpts: TransactionOpts = {},
|
txOpts: TransactionOpts = {},
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
|
||||||
assert.isETHAddressHex('fromAddress', fromAddress);
|
|
||||||
assert.isETHAddressHex('toAddress', toAddress);
|
assert.isETHAddressHex('toAddress', toAddress);
|
||||||
|
assert.isETHAddressHex('fromAddress', fromAddress);
|
||||||
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
|
await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
|
||||||
|
const normalizedToAddress = toAddress.toLowerCase();
|
||||||
|
const normalizedFromAddress = fromAddress.toLowerCase();
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
const normalizedSenderAddress = senderAddress.toLowerCase();
|
||||||
assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
|
assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
|
||||||
|
|
||||||
const tokenContract = await this._getTokenContractAsync(tokenAddress);
|
const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
|
||||||
|
|
||||||
const fromAddressAllowance = await this.getAllowanceAsync(tokenAddress, fromAddress, senderAddress);
|
const fromAddressAllowance = await this.getAllowanceAsync(
|
||||||
|
normalizedTokenAddress,
|
||||||
|
normalizedFromAddress,
|
||||||
|
normalizedSenderAddress,
|
||||||
|
);
|
||||||
if (fromAddressAllowance.lessThan(amountInBaseUnits)) {
|
if (fromAddressAllowance.lessThan(amountInBaseUnits)) {
|
||||||
throw new Error(ZeroExError.InsufficientAllowanceForTransfer);
|
throw new Error(ZeroExError.InsufficientAllowanceForTransfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
const fromAddressBalance = await this.getBalanceAsync(tokenAddress, fromAddress);
|
const fromAddressBalance = await this.getBalanceAsync(normalizedTokenAddress, normalizedFromAddress);
|
||||||
if (fromAddressBalance.lessThan(amountInBaseUnits)) {
|
if (fromAddressBalance.lessThan(amountInBaseUnits)) {
|
||||||
throw new Error(ZeroExError.InsufficientBalanceForTransfer);
|
throw new Error(ZeroExError.InsufficientBalanceForTransfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
const txHash = await tokenContract.transferFrom.sendTransactionAsync(
|
const txHash = await tokenContract.transferFrom.sendTransactionAsync(
|
||||||
fromAddress,
|
normalizedFromAddress,
|
||||||
toAddress,
|
normalizedToAddress,
|
||||||
amountInBaseUnits,
|
amountInBaseUnits,
|
||||||
{
|
{
|
||||||
from: senderAddress,
|
from: normalizedSenderAddress,
|
||||||
gas: txOpts.gasLimit,
|
gas: txOpts.gasLimit,
|
||||||
gasPrice: txOpts.gasPrice,
|
gasPrice: txOpts.gasPrice,
|
||||||
},
|
},
|
||||||
@@ -311,11 +352,12 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
callback: EventCallback<ArgsType>,
|
callback: EventCallback<ArgsType>,
|
||||||
): string {
|
): string {
|
||||||
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
assert.doesBelongToStringEnum('eventName', eventName, TokenEvents);
|
assert.doesBelongToStringEnum('eventName', eventName, TokenEvents);
|
||||||
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
||||||
assert.isFunction('callback', callback);
|
assert.isFunction('callback', callback);
|
||||||
const subscriptionToken = this._subscribe<ArgsType>(
|
const subscriptionToken = this._subscribe<ArgsType>(
|
||||||
tokenAddress,
|
normalizedTokenAddress,
|
||||||
eventName,
|
eventName,
|
||||||
indexFilterValues,
|
indexFilterValues,
|
||||||
artifacts.TokenArtifact.abi,
|
artifacts.TokenArtifact.abi,
|
||||||
@@ -333,12 +375,12 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
/**
|
/**
|
||||||
* Cancels all existing subscriptions
|
* Cancels all existing subscriptions
|
||||||
*/
|
*/
|
||||||
public _unsubscribeAll(): void {
|
public unsubscribeAll(): void {
|
||||||
super._unsubscribeAll();
|
super._unsubscribeAll();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Gets historical logs without creating a subscription
|
* Gets historical logs without creating a subscription
|
||||||
* @param tokenAddress An address of the token that emmited the logs.
|
* @param tokenAddress An address of the token that emitted the logs.
|
||||||
* @param eventName The token contract event you would like to subscribe to.
|
* @param eventName The token contract event you would like to subscribe to.
|
||||||
* @param blockRange Block range to get logs from.
|
* @param blockRange Block range to get logs from.
|
||||||
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
||||||
@@ -352,11 +394,12 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
indexFilterValues: IndexedFilterValues,
|
indexFilterValues: IndexedFilterValues,
|
||||||
): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
|
): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
|
||||||
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
assert.isETHAddressHex('tokenAddress', tokenAddress);
|
||||||
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
assert.doesBelongToStringEnum('eventName', eventName, TokenEvents);
|
assert.doesBelongToStringEnum('eventName', eventName, TokenEvents);
|
||||||
assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
|
assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
|
||||||
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
||||||
const logs = await this._getLogsAsync<ArgsType>(
|
const logs = await this._getLogsAsync<ArgsType>(
|
||||||
tokenAddress,
|
normalizedTokenAddress,
|
||||||
eventName,
|
eventName,
|
||||||
blockRange,
|
blockRange,
|
||||||
indexFilterValues,
|
indexFilterValues,
|
||||||
@@ -365,21 +408,27 @@ export class TokenWrapper extends ContractWrapper {
|
|||||||
return logs;
|
return logs;
|
||||||
}
|
}
|
||||||
private _invalidateContractInstances(): void {
|
private _invalidateContractInstances(): void {
|
||||||
this._unsubscribeAll();
|
this.unsubscribeAll();
|
||||||
this._tokenContractsByAddress = {};
|
this._tokenContractsByAddress = {};
|
||||||
}
|
}
|
||||||
private async _getTokenContractAsync(tokenAddress: string): Promise<TokenContract> {
|
private async _getTokenContractAsync(tokenAddress: string): Promise<TokenContract> {
|
||||||
let tokenContract = this._tokenContractsByAddress[tokenAddress];
|
const normalizedTokenAddress = tokenAddress.toLowerCase();
|
||||||
|
let tokenContract = this._tokenContractsByAddress[normalizedTokenAddress];
|
||||||
if (!_.isUndefined(tokenContract)) {
|
if (!_.isUndefined(tokenContract)) {
|
||||||
return tokenContract;
|
return tokenContract;
|
||||||
}
|
}
|
||||||
const web3ContractInstance = await this._instantiateContractIfExistsAsync(
|
const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
|
||||||
artifacts.TokenArtifact,
|
artifacts.TokenArtifact,
|
||||||
tokenAddress,
|
normalizedTokenAddress,
|
||||||
|
);
|
||||||
|
const contractInstance = new TokenContract(
|
||||||
|
abi,
|
||||||
|
address,
|
||||||
|
this._web3Wrapper.getProvider(),
|
||||||
|
this._web3Wrapper.getContractDefaults(),
|
||||||
);
|
);
|
||||||
const contractInstance = new TokenContract(web3ContractInstance, this._web3Wrapper.getContractDefaults());
|
|
||||||
tokenContract = contractInstance;
|
tokenContract = contractInstance;
|
||||||
this._tokenContractsByAddress[tokenAddress] = tokenContract;
|
this._tokenContractsByAddress[normalizedTokenAddress] = tokenContract;
|
||||||
return tokenContract;
|
return tokenContract;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
37
packages/0x.js/src/globals.d.ts
vendored
37
packages/0x.js/src/globals.d.ts
vendored
@@ -1,43 +1,6 @@
|
|||||||
declare module 'web3_beta';
|
|
||||||
declare module 'chai-bignumber';
|
|
||||||
declare module 'dirty-chai';
|
|
||||||
declare module 'request-promise-native';
|
|
||||||
declare module 'web3-provider-engine';
|
|
||||||
declare module 'web3-provider-engine/subproviders/rpc';
|
|
||||||
|
|
||||||
// HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
|
|
||||||
// interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
|
|
||||||
// disallow `namespace`, we disable tslint for the following.
|
|
||||||
/* tslint:disable */
|
|
||||||
declare namespace Chai {
|
|
||||||
interface Assertion {
|
|
||||||
bignumber: Assertion;
|
|
||||||
// HACK: In order to comply with chai-as-promised we make eventually a `PromisedAssertion` not an `Assertion`
|
|
||||||
eventually: PromisedAssertion;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* tslint:enable */
|
|
||||||
|
|
||||||
declare module '*.json' {
|
declare module '*.json' {
|
||||||
const json: any;
|
const json: any;
|
||||||
/* tslint:disable */
|
/* tslint:disable */
|
||||||
export default json;
|
export default json;
|
||||||
/* tslint:enable */
|
/* tslint:enable */
|
||||||
}
|
}
|
||||||
|
|
||||||
declare module 'ethereumjs-abi' {
|
|
||||||
const soliditySHA3: (argTypes: string[], args: any[]) => Buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
// truffle-hdwallet-provider declarations
|
|
||||||
declare module 'truffle-hdwallet-provider' {
|
|
||||||
import * as Web3 from 'web3';
|
|
||||||
class HDWalletProvider implements Web3.Provider {
|
|
||||||
constructor(mnemonic: string, rpcUrl: string);
|
|
||||||
public sendAsync(
|
|
||||||
payload: Web3.JSONRPCRequestPayload,
|
|
||||||
callback: (err: Error, result: Web3.JSONRPCResponsePayload) => void,
|
|
||||||
): void;
|
|
||||||
}
|
|
||||||
export = HDWalletProvider;
|
|
||||||
}
|
|
||||||
|
23
packages/0x.js/src/globalsAugment.d.ts
vendored
23
packages/0x.js/src/globalsAugment.d.ts
vendored
@@ -1,23 +0,0 @@
|
|||||||
import { BigNumber } from '@0xproject/utils';
|
|
||||||
|
|
||||||
// HACK: This module overrides the Chai namespace so that we can use BigNumber types inside.
|
|
||||||
// Source: https://github.com/Microsoft/TypeScript/issues/7352#issuecomment-191547232
|
|
||||||
declare global {
|
|
||||||
// HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
|
|
||||||
// interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
|
|
||||||
// disallow `namespace`, we disable tslint for the following.
|
|
||||||
/* tslint:disable */
|
|
||||||
namespace Chai {
|
|
||||||
interface NumberComparer {
|
|
||||||
(value: number | BigNumber, message?: string): Assertion;
|
|
||||||
}
|
|
||||||
interface NumericComparison {
|
|
||||||
greaterThan: NumberComparer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* tslint:enable */
|
|
||||||
interface DecodedLogArg {
|
|
||||||
name: string;
|
|
||||||
value: string | BigNumber;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,9 +1,6 @@
|
|||||||
export { ZeroEx } from './0x';
|
export { ZeroEx } from './0x';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
Order,
|
|
||||||
SignedOrder,
|
|
||||||
ECSignature,
|
|
||||||
ZeroExError,
|
ZeroExError,
|
||||||
EventCallback,
|
EventCallback,
|
||||||
ExchangeContractErrs,
|
ExchangeContractErrs,
|
||||||
@@ -14,12 +11,10 @@ export {
|
|||||||
OrderCancellationRequest,
|
OrderCancellationRequest,
|
||||||
OrderFillRequest,
|
OrderFillRequest,
|
||||||
ContractEventArgs,
|
ContractEventArgs,
|
||||||
Web3Provider,
|
|
||||||
ZeroExConfig,
|
ZeroExConfig,
|
||||||
MethodOpts,
|
MethodOpts,
|
||||||
OrderTransactionOpts,
|
OrderTransactionOpts,
|
||||||
TransactionOpts,
|
TransactionOpts,
|
||||||
FilterObject,
|
|
||||||
LogEvent,
|
LogEvent,
|
||||||
DecodedLogEvent,
|
DecodedLogEvent,
|
||||||
EventWatcherCallback,
|
EventWatcherCallback,
|
||||||
@@ -31,9 +26,15 @@ export {
|
|||||||
|
|
||||||
export {
|
export {
|
||||||
BlockParamLiteral,
|
BlockParamLiteral,
|
||||||
|
FilterObject,
|
||||||
BlockParam,
|
BlockParam,
|
||||||
ContractEventArg,
|
ContractEventArg,
|
||||||
LogWithDecodedArgs,
|
LogWithDecodedArgs,
|
||||||
|
Order,
|
||||||
|
Provider,
|
||||||
|
SignedOrder,
|
||||||
|
ECSignature,
|
||||||
|
TransactionReceipt,
|
||||||
TransactionReceiptWithDecodedLogs,
|
TransactionReceiptWithDecodedLogs,
|
||||||
} from '@0xproject/types';
|
} from '@0xproject/types';
|
||||||
|
|
||||||
@@ -58,5 +59,3 @@ export {
|
|||||||
ExchangeContractEventArgs,
|
ExchangeContractEventArgs,
|
||||||
ExchangeEvents,
|
ExchangeEvents,
|
||||||
} from './contract_wrappers/generated/exchange';
|
} from './contract_wrappers/generated/exchange';
|
||||||
|
|
||||||
export { TransactionReceipt } from '@0xproject/types';
|
|
||||||
|
8
packages/0x.js/src/monorepo_scripts/postpublish.ts
Normal file
8
packages/0x.js/src/monorepo_scripts/postpublish.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { postpublishUtils } from '@0xproject/monorepo-scripts';
|
||||||
|
|
||||||
|
import * as packageJSON from '../package.json';
|
||||||
|
import * as tsConfigJSON from '../tsconfig.json';
|
||||||
|
|
||||||
|
const cwd = `${__dirname}/..`;
|
||||||
|
// tslint:disable-next-line:no-floating-promises
|
||||||
|
postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
|
8
packages/0x.js/src/monorepo_scripts/stage_docs.ts
Normal file
8
packages/0x.js/src/monorepo_scripts/stage_docs.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { postpublishUtils } from '@0xproject/monorepo-scripts';
|
||||||
|
|
||||||
|
import * as packageJSON from '../package.json';
|
||||||
|
import * as tsConfigJSON from '../tsconfig.json';
|
||||||
|
|
||||||
|
const cwd = `${__dirname}/..`;
|
||||||
|
// tslint:disable-next-line:no-floating-promises
|
||||||
|
postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd);
|
@@ -1,9 +1,7 @@
|
|||||||
|
import { BlockParamLiteral, LogEntry } from '@0xproject/types';
|
||||||
import { intervalUtils } from '@0xproject/utils';
|
import { intervalUtils } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { BlockParamLiteral } from '@0xproject/types';
|
|
||||||
|
|
||||||
import { EventWatcherCallback, ZeroExError } from '../types';
|
import { EventWatcherCallback, ZeroExError } from '../types';
|
||||||
import { assert } from '../utils/assert';
|
import { assert } from '../utils/assert';
|
||||||
@@ -23,9 +21,15 @@ export class EventWatcher {
|
|||||||
private _web3Wrapper: Web3Wrapper;
|
private _web3Wrapper: Web3Wrapper;
|
||||||
private _pollingIntervalMs: number;
|
private _pollingIntervalMs: number;
|
||||||
private _intervalIdIfExists?: NodeJS.Timer;
|
private _intervalIdIfExists?: NodeJS.Timer;
|
||||||
private _lastEvents: Web3.LogEntry[] = [];
|
private _lastEvents: LogEntry[] = [];
|
||||||
constructor(web3Wrapper: Web3Wrapper, pollingIntervalIfExistsMs: undefined | number) {
|
private _stateLayer: BlockParamLiteral;
|
||||||
|
constructor(
|
||||||
|
web3Wrapper: Web3Wrapper,
|
||||||
|
pollingIntervalIfExistsMs: undefined | number,
|
||||||
|
stateLayer: BlockParamLiteral = BlockParamLiteral.Latest,
|
||||||
|
) {
|
||||||
this._web3Wrapper = web3Wrapper;
|
this._web3Wrapper = web3Wrapper;
|
||||||
|
this._stateLayer = stateLayer;
|
||||||
this._pollingIntervalMs = _.isUndefined(pollingIntervalIfExistsMs)
|
this._pollingIntervalMs = _.isUndefined(pollingIntervalIfExistsMs)
|
||||||
? DEFAULT_EVENT_POLLING_INTERVAL_MS
|
? DEFAULT_EVENT_POLLING_INTERVAL_MS
|
||||||
: pollingIntervalIfExistsMs;
|
: pollingIntervalIfExistsMs;
|
||||||
@@ -69,16 +73,16 @@ export class EventWatcher {
|
|||||||
await this._emitDifferencesAsync(newEvents, LogEventState.Added, callback);
|
await this._emitDifferencesAsync(newEvents, LogEventState.Added, callback);
|
||||||
this._lastEvents = pendingEvents;
|
this._lastEvents = pendingEvents;
|
||||||
}
|
}
|
||||||
private async _getEventsAsync(): Promise<Web3.LogEntry[]> {
|
private async _getEventsAsync(): Promise<LogEntry[]> {
|
||||||
const eventFilter = {
|
const eventFilter = {
|
||||||
fromBlock: BlockParamLiteral.Pending,
|
fromBlock: this._stateLayer,
|
||||||
toBlock: BlockParamLiteral.Pending,
|
toBlock: this._stateLayer,
|
||||||
};
|
};
|
||||||
const events = await this._web3Wrapper.getLogsAsync(eventFilter);
|
const events = await this._web3Wrapper.getLogsAsync(eventFilter);
|
||||||
return events;
|
return events;
|
||||||
}
|
}
|
||||||
private async _emitDifferencesAsync(
|
private async _emitDifferencesAsync(
|
||||||
logs: Web3.LogEntry[],
|
logs: LogEntry[],
|
||||||
logEventState: LogEventState,
|
logEventState: LogEventState,
|
||||||
callback: EventWatcherCallback,
|
callback: EventWatcherCallback,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { schemas } from '@0xproject/json-schemas';
|
import { schemas } from '@0xproject/json-schemas';
|
||||||
import { BlockParamLiteral, LogWithDecodedArgs } from '@0xproject/types';
|
import { BlockParamLiteral, LogWithDecodedArgs, SignedOrder } from '@0xproject/types';
|
||||||
import { AbiDecoder, intervalUtils } from '@0xproject/utils';
|
import { AbiDecoder, intervalUtils } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
@@ -31,7 +31,6 @@ import {
|
|||||||
OnOrderStateChangeCallback,
|
OnOrderStateChangeCallback,
|
||||||
OrderState,
|
OrderState,
|
||||||
OrderStateWatcherConfig,
|
OrderStateWatcherConfig,
|
||||||
SignedOrder,
|
|
||||||
ZeroExError,
|
ZeroExError,
|
||||||
} from '../types';
|
} from '../types';
|
||||||
import { assert } from '../utils/assert';
|
import { assert } from '../utils/assert';
|
||||||
@@ -60,7 +59,7 @@ const DEFAULT_CLEANUP_JOB_INTERVAL_MS = 1000 * 60 * 60; // 1h
|
|||||||
/**
|
/**
|
||||||
* This class includes all the functionality related to watching a set of orders
|
* This class includes all the functionality related to watching a set of orders
|
||||||
* for potential changes in order validity/fillability. The orderWatcher notifies
|
* for potential changes in order validity/fillability. The orderWatcher notifies
|
||||||
* the subscriber of these changes so that a final decison can be made on whether
|
* the subscriber of these changes so that a final decision can be made on whether
|
||||||
* the order should be deemed invalid.
|
* the order should be deemed invalid.
|
||||||
*/
|
*/
|
||||||
export class OrderStateWatcher {
|
export class OrderStateWatcher {
|
||||||
@@ -70,7 +69,6 @@ export class OrderStateWatcher {
|
|||||||
private _callbackIfExists?: OnOrderStateChangeCallback;
|
private _callbackIfExists?: OnOrderStateChangeCallback;
|
||||||
private _eventWatcher: EventWatcher;
|
private _eventWatcher: EventWatcher;
|
||||||
private _web3Wrapper: Web3Wrapper;
|
private _web3Wrapper: Web3Wrapper;
|
||||||
private _abiDecoder: AbiDecoder;
|
|
||||||
private _expirationWatcher: ExpirationWatcher;
|
private _expirationWatcher: ExpirationWatcher;
|
||||||
private _orderStateUtils: OrderStateUtils;
|
private _orderStateUtils: OrderStateUtils;
|
||||||
private _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
|
private _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
|
||||||
@@ -79,19 +77,16 @@ export class OrderStateWatcher {
|
|||||||
private _cleanupJobIntervalIdIfExists?: NodeJS.Timer;
|
private _cleanupJobIntervalIdIfExists?: NodeJS.Timer;
|
||||||
constructor(
|
constructor(
|
||||||
web3Wrapper: Web3Wrapper,
|
web3Wrapper: Web3Wrapper,
|
||||||
abiDecoder: AbiDecoder,
|
|
||||||
token: TokenWrapper,
|
token: TokenWrapper,
|
||||||
exchange: ExchangeWrapper,
|
exchange: ExchangeWrapper,
|
||||||
config?: OrderStateWatcherConfig,
|
config?: OrderStateWatcherConfig,
|
||||||
) {
|
) {
|
||||||
this._abiDecoder = abiDecoder;
|
|
||||||
this._web3Wrapper = web3Wrapper;
|
this._web3Wrapper = web3Wrapper;
|
||||||
const pollingIntervalIfExistsMs = _.isUndefined(config) ? undefined : config.eventPollingIntervalMs;
|
const pollingIntervalIfExistsMs = _.isUndefined(config) ? undefined : config.eventPollingIntervalMs;
|
||||||
this._eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalIfExistsMs);
|
const stateLayer =
|
||||||
this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(
|
_.isUndefined(config) || _.isUndefined(config.stateLayer) ? BlockParamLiteral.Latest : config.stateLayer;
|
||||||
token,
|
this._eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalIfExistsMs, stateLayer);
|
||||||
BlockParamLiteral.Pending,
|
this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(token, stateLayer);
|
||||||
);
|
|
||||||
this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(exchange);
|
this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(exchange);
|
||||||
this._orderStateUtils = new OrderStateUtils(
|
this._orderStateUtils = new OrderStateUtils(
|
||||||
this._balanceAndProxyAllowanceLazyStore,
|
this._balanceAndProxyAllowanceLazyStore,
|
||||||
@@ -232,7 +227,7 @@ export class OrderStateWatcher {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const log = logIfExists as LogEvent; // At this moment we are sure that no error occured and log is defined.
|
const log = logIfExists as LogEvent; // At this moment we are sure that no error occured and log is defined.
|
||||||
const maybeDecodedLog = this._abiDecoder.tryToDecodeLogOrNoop<ContractEventArgs>(log);
|
const maybeDecodedLog = this._web3Wrapper.abiDecoder.tryToDecodeLogOrNoop<ContractEventArgs>(log);
|
||||||
const isLogDecoded = !_.isUndefined(((maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>).event);
|
const isLogDecoded = !_.isUndefined(((maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>).event);
|
||||||
if (!isLogDecoded) {
|
if (!isLogDecoded) {
|
||||||
return; // noop
|
return; // noop
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
|
import { SignedOrder } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
|
|
||||||
import { SignedOrder } from '../types';
|
|
||||||
|
|
||||||
export class RemainingFillableCalculator {
|
export class RemainingFillableCalculator {
|
||||||
private _signedOrder: SignedOrder;
|
private _signedOrder: SignedOrder;
|
||||||
private _isMakerTokenZRX: boolean;
|
private _isMakerTokenZRX: boolean;
|
||||||
|
@@ -1,27 +1,5 @@
|
|||||||
export const zeroExConfigSchema = {
|
export const zeroExConfigSchema = {
|
||||||
id: '/ZeroExConfig',
|
id: '/ZeroExConfig',
|
||||||
properties: {
|
oneOf: [{ $ref: '/ZeroExPrivateNetworkConfig' }, { $ref: '/ZeroExPublicNetworkConfig' }],
|
||||||
networkId: {
|
|
||||||
type: 'number',
|
|
||||||
minimum: 0,
|
|
||||||
},
|
|
||||||
gasPrice: { $ref: '/Number' },
|
|
||||||
exchangeContractAddress: { $ref: '/Address' },
|
|
||||||
tokenRegistryContractAddress: { $ref: '/Address' },
|
|
||||||
orderWatcherConfig: {
|
|
||||||
type: 'object',
|
|
||||||
properties: {
|
|
||||||
pollingIntervalMs: {
|
|
||||||
type: 'number',
|
|
||||||
minimum: 0,
|
|
||||||
},
|
|
||||||
numConfirmations: {
|
|
||||||
type: 'number',
|
|
||||||
minimum: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
type: 'object',
|
type: 'object',
|
||||||
required: ['networkId'],
|
|
||||||
};
|
};
|
||||||
|
@@ -0,0 +1,35 @@
|
|||||||
|
export const zeroExPrivateNetworkConfigSchema = {
|
||||||
|
id: '/ZeroExPrivateNetworkConfig',
|
||||||
|
properties: {
|
||||||
|
networkId: {
|
||||||
|
type: 'number',
|
||||||
|
minimum: 1,
|
||||||
|
},
|
||||||
|
gasPrice: { $ref: '/Number' },
|
||||||
|
zrxContractAddress: { $ref: '/Address' },
|
||||||
|
exchangeContractAddress: { $ref: '/Address' },
|
||||||
|
tokenRegistryContractAddress: { $ref: '/Address' },
|
||||||
|
tokenTransferProxyContractAddress: { $ref: '/Address' },
|
||||||
|
orderWatcherConfig: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
pollingIntervalMs: {
|
||||||
|
type: 'number',
|
||||||
|
minimum: 0,
|
||||||
|
},
|
||||||
|
numConfirmations: {
|
||||||
|
type: 'number',
|
||||||
|
minimum: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
type: 'object',
|
||||||
|
required: [
|
||||||
|
'networkId',
|
||||||
|
'zrxContractAddress',
|
||||||
|
'exchangeContractAddress',
|
||||||
|
'tokenRegistryContractAddress',
|
||||||
|
'tokenTransferProxyContractAddress',
|
||||||
|
],
|
||||||
|
};
|
@@ -0,0 +1,29 @@
|
|||||||
|
export const zeroExPublicNetworkConfigSchema = {
|
||||||
|
id: '/ZeroExPublicNetworkConfig',
|
||||||
|
properties: {
|
||||||
|
networkId: {
|
||||||
|
type: 'number',
|
||||||
|
enum: [1, 3, 4, 42, 50],
|
||||||
|
},
|
||||||
|
gasPrice: { $ref: '/Number' },
|
||||||
|
zrxContractAddress: { $ref: '/Address' },
|
||||||
|
exchangeContractAddress: { $ref: '/Address' },
|
||||||
|
tokenRegistryContractAddress: { $ref: '/Address' },
|
||||||
|
tokenTransferProxyContractAddress: { $ref: '/Address' },
|
||||||
|
orderWatcherConfig: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
pollingIntervalMs: {
|
||||||
|
type: 'number',
|
||||||
|
minimum: 0,
|
||||||
|
},
|
||||||
|
numConfirmations: {
|
||||||
|
type: 'number',
|
||||||
|
minimum: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
type: 'object',
|
||||||
|
required: ['networkId'],
|
||||||
|
};
|
@@ -1,6 +1,16 @@
|
|||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
|
|
||||||
import { BlockParam, BlockParamLiteral, ContractEventArg, LogWithDecodedArgs } from '@0xproject/types';
|
import {
|
||||||
|
BlockParam,
|
||||||
|
BlockParamLiteral,
|
||||||
|
ContractAbi,
|
||||||
|
ContractEventArg,
|
||||||
|
FilterObject,
|
||||||
|
LogEntryEvent,
|
||||||
|
LogWithDecodedArgs,
|
||||||
|
Order,
|
||||||
|
SignedOrder,
|
||||||
|
} from '@0xproject/types';
|
||||||
|
|
||||||
import * as Web3 from 'web3';
|
import * as Web3 from 'web3';
|
||||||
|
|
||||||
@@ -28,7 +38,6 @@ export enum ZeroExError {
|
|||||||
NoNetworkId = 'NO_NETWORK_ID',
|
NoNetworkId = 'NO_NETWORK_ID',
|
||||||
SubscriptionNotFound = 'SUBSCRIPTION_NOT_FOUND',
|
SubscriptionNotFound = 'SUBSCRIPTION_NOT_FOUND',
|
||||||
SubscriptionAlreadyPresent = 'SUBSCRIPTION_ALREADY_PRESENT',
|
SubscriptionAlreadyPresent = 'SUBSCRIPTION_ALREADY_PRESENT',
|
||||||
TransactionMiningTimeout = 'TRANSACTION_MINING_TIMEOUT',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum InternalZeroExError {
|
export enum InternalZeroExError {
|
||||||
@@ -37,20 +46,11 @@ export enum InternalZeroExError {
|
|||||||
WethNotInTokenRegistry = 'WETH_NOT_IN_TOKEN_REGISTRY',
|
WethNotInTokenRegistry = 'WETH_NOT_IN_TOKEN_REGISTRY',
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Elliptic Curve signature
|
|
||||||
*/
|
|
||||||
export interface ECSignature {
|
|
||||||
v: number;
|
|
||||||
r: string;
|
|
||||||
s: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type OrderAddresses = [string, string, string, string, string];
|
export type OrderAddresses = [string, string, string, string, string];
|
||||||
|
|
||||||
export type OrderValues = [BigNumber, BigNumber, BigNumber, BigNumber, BigNumber, BigNumber];
|
export type OrderValues = [BigNumber, BigNumber, BigNumber, BigNumber, BigNumber, BigNumber];
|
||||||
|
|
||||||
export type LogEvent = Web3.LogEntryEvent;
|
export type LogEvent = LogEntryEvent;
|
||||||
export interface DecodedLogEvent<ArgsType> {
|
export interface DecodedLogEvent<ArgsType> {
|
||||||
isRemoved: boolean;
|
isRemoved: boolean;
|
||||||
log: LogWithDecodedArgs<ArgsType>;
|
log: LogWithDecodedArgs<ArgsType>;
|
||||||
@@ -107,27 +107,8 @@ export interface ContractEvent {
|
|||||||
|
|
||||||
export type ContractEventArgs = ExchangeContractEventArgs | TokenContractEventArgs | EtherTokenContractEventArgs;
|
export type ContractEventArgs = ExchangeContractEventArgs | TokenContractEventArgs | EtherTokenContractEventArgs;
|
||||||
|
|
||||||
export interface Order {
|
|
||||||
maker: string;
|
|
||||||
taker: string;
|
|
||||||
makerFee: BigNumber;
|
|
||||||
takerFee: BigNumber;
|
|
||||||
makerTokenAmount: BigNumber;
|
|
||||||
takerTokenAmount: BigNumber;
|
|
||||||
makerTokenAddress: string;
|
|
||||||
takerTokenAddress: string;
|
|
||||||
salt: BigNumber;
|
|
||||||
exchangeContractAddress: string;
|
|
||||||
feeRecipient: string;
|
|
||||||
expirationUnixTimestampSec: BigNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SignedOrder extends Order {
|
|
||||||
ecSignature: ECSignature;
|
|
||||||
}
|
|
||||||
|
|
||||||
// [address, name, symbol, decimals, ipfsHash, swarmHash]
|
// [address, name, symbol, decimals, ipfsHash, swarmHash]
|
||||||
export type TokenMetadata = [string, string, string, BigNumber, string, string];
|
export type TokenMetadata = [string, string, string, number, string, string];
|
||||||
|
|
||||||
export interface Token {
|
export interface Token {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -173,30 +154,24 @@ export interface OrderFillRequest {
|
|||||||
export type AsyncMethod = (...args: any[]) => Promise<any>;
|
export type AsyncMethod = (...args: any[]) => Promise<any>;
|
||||||
export type SyncMethod = (...args: any[]) => any;
|
export type SyncMethod = (...args: any[]) => any;
|
||||||
|
|
||||||
/**
|
|
||||||
* We re-export the `Web3.Provider` type specified in the Web3 Typescript typings
|
|
||||||
* since it is the type of the `provider` argument to the `ZeroEx` constructor.
|
|
||||||
* It is however a `Web3` library type, not a native `0x.js` type. To learn more
|
|
||||||
* about providers, visit https://0xproject.com/wiki#Web3-Provider-Explained
|
|
||||||
*/
|
|
||||||
export type Web3Provider = Web3.Provider;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* orderExpirationCheckingIntervalMs: How often to check for expired orders. Default: 50
|
* orderExpirationCheckingIntervalMs: How often to check for expired orders. Default: 50
|
||||||
* eventPollingIntervalMs: How often to poll the Ethereum node for new events. Defaults: 200
|
* eventPollingIntervalMs: How often to poll the Ethereum node for new events. Default: 200
|
||||||
* expirationMarginMs: Amount of time before order expiry that you'd like to be notified
|
* expirationMarginMs: Amount of time before order expiry that you'd like to be notified
|
||||||
* of an orders expiration. Defaults: 0
|
* of an orders expiration. Default: 0
|
||||||
* cleanupJobIntervalMs: How often to run a cleanup job which revalidates all the orders. Defaults: 1h
|
* cleanupJobIntervalMs: How often to run a cleanup job which revalidates all the orders. Defaults: 1h
|
||||||
|
* stateLayer: Optional blockchain state layer OrderWatcher will monitor for new events. Default: latest
|
||||||
*/
|
*/
|
||||||
export interface OrderStateWatcherConfig {
|
export interface OrderStateWatcherConfig {
|
||||||
orderExpirationCheckingIntervalMs?: number;
|
orderExpirationCheckingIntervalMs?: number;
|
||||||
eventPollingIntervalMs?: number;
|
eventPollingIntervalMs?: number;
|
||||||
expirationMarginMs?: number;
|
expirationMarginMs?: number;
|
||||||
cleanupJobIntervalMs?: number;
|
cleanupJobIntervalMs?: number;
|
||||||
|
stateLayer: BlockParamLiteral;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* networkId: The id of the underlying ethereum network your provider is connected to. (1-mainnet, 42-kovan, 50-testrpc)
|
* networkId: The id of the underlying ethereum network your provider is connected to. (1-mainnet, 3-ropsten, 4-rinkeby, 42-kovan, 50-testrpc)
|
||||||
* gasPrice: Gas price to use with every transaction
|
* gasPrice: Gas price to use with every transaction
|
||||||
* exchangeContractAddress: The address of an exchange contract to use
|
* exchangeContractAddress: The address of an exchange contract to use
|
||||||
* zrxContractAddress: The address of the ZRX contract to use
|
* zrxContractAddress: The address of the ZRX contract to use
|
||||||
@@ -218,7 +193,7 @@ export type ArtifactContractName = 'ZRX' | 'TokenTransferProxy' | 'TokenRegistry
|
|||||||
|
|
||||||
export interface Artifact {
|
export interface Artifact {
|
||||||
contract_name: ArtifactContractName;
|
contract_name: ArtifactContractName;
|
||||||
abi: Web3.ContractAbi;
|
abi: ContractAbi;
|
||||||
networks: {
|
networks: {
|
||||||
[networkId: number]: {
|
[networkId: number]: {
|
||||||
address: string;
|
address: string;
|
||||||
@@ -243,7 +218,7 @@ export interface ValidateOrderFillableOpts {
|
|||||||
* flag when running Parity).
|
* flag when running Parity).
|
||||||
*/
|
*/
|
||||||
export interface MethodOpts {
|
export interface MethodOpts {
|
||||||
defaultBlock?: Web3.BlockParam;
|
defaultBlock?: BlockParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -263,8 +238,6 @@ export interface OrderTransactionOpts extends TransactionOpts {
|
|||||||
shouldValidate?: boolean;
|
shouldValidate?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type FilterObject = Web3.FilterObject;
|
|
||||||
|
|
||||||
export enum TradeSide {
|
export enum TradeSide {
|
||||||
Maker = 'maker',
|
Maker = 'maker',
|
||||||
Taker = 'taker',
|
Taker = 'taker',
|
||||||
|
@@ -3,11 +3,11 @@ import { assert as sharedAssert } from '@0xproject/assert';
|
|||||||
// tslint:disable-next-line:no-unused-variable
|
// tslint:disable-next-line:no-unused-variable
|
||||||
import { Schema } from '@0xproject/json-schemas';
|
import { Schema } from '@0xproject/json-schemas';
|
||||||
// tslint:disable-next-line:no-unused-variable
|
// tslint:disable-next-line:no-unused-variable
|
||||||
|
import { ECSignature } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
import { ECSignature } from '../types';
|
|
||||||
import { signatureUtils } from '../utils/signature_utils';
|
import { signatureUtils } from '../utils/signature_utils';
|
||||||
|
|
||||||
export const assert = {
|
export const assert = {
|
||||||
|
@@ -1,8 +1,16 @@
|
|||||||
|
import {
|
||||||
|
ConstructorAbi,
|
||||||
|
ContractAbi,
|
||||||
|
EventAbi,
|
||||||
|
FallbackAbi,
|
||||||
|
FilterObject,
|
||||||
|
LogEntry,
|
||||||
|
MethodAbi,
|
||||||
|
} from '@0xproject/types';
|
||||||
import * as ethUtil from 'ethereumjs-util';
|
import * as ethUtil from 'ethereumjs-util';
|
||||||
import * as jsSHA3 from 'js-sha3';
|
import * as jsSHA3 from 'js-sha3';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as uuid from 'uuid/v4';
|
import * as uuid from 'uuid/v4';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { BlockRange, ContractEvents, IndexedFilterValues } from '../types';
|
import { BlockRange, ContractEvents, IndexedFilterValues } from '../types';
|
||||||
|
|
||||||
@@ -16,15 +24,15 @@ export const filterUtils = {
|
|||||||
address: string,
|
address: string,
|
||||||
eventName: ContractEvents,
|
eventName: ContractEvents,
|
||||||
indexFilterValues: IndexedFilterValues,
|
indexFilterValues: IndexedFilterValues,
|
||||||
abi: Web3.ContractAbi,
|
abi: ContractAbi,
|
||||||
blockRange?: BlockRange,
|
blockRange?: BlockRange,
|
||||||
): Web3.FilterObject {
|
): FilterObject {
|
||||||
const eventAbi = _.find(abi, { name: eventName }) as Web3.EventAbi;
|
const eventAbi = _.find(abi, { name: eventName }) as EventAbi;
|
||||||
const eventSignature = filterUtils.getEventSignatureFromAbiByName(eventAbi, eventName);
|
const eventSignature = filterUtils.getEventSignatureFromAbiByName(eventAbi, eventName);
|
||||||
const topicForEventSignature = ethUtil.addHexPrefix(jsSHA3.keccak256(eventSignature));
|
const topicForEventSignature = ethUtil.addHexPrefix(jsSHA3.keccak256(eventSignature));
|
||||||
const topicsForIndexedArgs = filterUtils.getTopicsForIndexedArgs(eventAbi, indexFilterValues);
|
const topicsForIndexedArgs = filterUtils.getTopicsForIndexedArgs(eventAbi, indexFilterValues);
|
||||||
const topics = [topicForEventSignature, ...topicsForIndexedArgs];
|
const topics = [topicForEventSignature, ...topicsForIndexedArgs];
|
||||||
let filter: Web3.FilterObject = {
|
let filter: FilterObject = {
|
||||||
address,
|
address,
|
||||||
topics,
|
topics,
|
||||||
};
|
};
|
||||||
@@ -36,12 +44,12 @@ export const filterUtils = {
|
|||||||
}
|
}
|
||||||
return filter;
|
return filter;
|
||||||
},
|
},
|
||||||
getEventSignatureFromAbiByName(eventAbi: Web3.EventAbi, eventName: ContractEvents): string {
|
getEventSignatureFromAbiByName(eventAbi: EventAbi, eventName: ContractEvents): string {
|
||||||
const types = _.map(eventAbi.inputs, 'type');
|
const types = _.map(eventAbi.inputs, 'type');
|
||||||
const signature = `${eventAbi.name}(${types.join(',')})`;
|
const signature = `${eventAbi.name}(${types.join(',')})`;
|
||||||
return signature;
|
return signature;
|
||||||
},
|
},
|
||||||
getTopicsForIndexedArgs(abi: Web3.EventAbi, indexFilterValues: IndexedFilterValues): Array<string | null> {
|
getTopicsForIndexedArgs(abi: EventAbi, indexFilterValues: IndexedFilterValues): Array<string | null> {
|
||||||
const topics: Array<string | null> = [];
|
const topics: Array<string | null> = [];
|
||||||
for (const eventInput of abi.inputs) {
|
for (const eventInput of abi.inputs) {
|
||||||
if (!eventInput.indexed) {
|
if (!eventInput.indexed) {
|
||||||
@@ -60,7 +68,7 @@ export const filterUtils = {
|
|||||||
}
|
}
|
||||||
return topics;
|
return topics;
|
||||||
},
|
},
|
||||||
matchesFilter(log: Web3.LogEntry, filter: Web3.FilterObject): boolean {
|
matchesFilter(log: LogEntry, filter: FilterObject): boolean {
|
||||||
if (!_.isUndefined(filter.address) && log.address !== filter.address) {
|
if (!_.isUndefined(filter.address) && log.address !== filter.address) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import { SignedOrder } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
@@ -6,14 +7,7 @@ import { ExchangeWrapper } from '../contract_wrappers/exchange_wrapper';
|
|||||||
import { RemainingFillableCalculator } from '../order_watcher/remaining_fillable_calculator';
|
import { RemainingFillableCalculator } from '../order_watcher/remaining_fillable_calculator';
|
||||||
import { BalanceAndProxyAllowanceLazyStore } from '../stores/balance_proxy_allowance_lazy_store';
|
import { BalanceAndProxyAllowanceLazyStore } from '../stores/balance_proxy_allowance_lazy_store';
|
||||||
import { OrderFilledCancelledLazyStore } from '../stores/order_filled_cancelled_lazy_store';
|
import { OrderFilledCancelledLazyStore } from '../stores/order_filled_cancelled_lazy_store';
|
||||||
import {
|
import { ExchangeContractErrs, OrderRelevantState, OrderState, OrderStateInvalid, OrderStateValid } from '../types';
|
||||||
ExchangeContractErrs,
|
|
||||||
OrderRelevantState,
|
|
||||||
OrderState,
|
|
||||||
OrderStateInvalid,
|
|
||||||
OrderStateValid,
|
|
||||||
SignedOrder,
|
|
||||||
} from '../types';
|
|
||||||
|
|
||||||
const ACCEPTABLE_RELATIVE_ROUNDING_ERROR = 0.0001;
|
const ACCEPTABLE_RELATIVE_ROUNDING_ERROR = 0.0001;
|
||||||
|
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
|
import { Order, SignedOrder } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
import { ZeroEx } from '../0x';
|
import { ZeroEx } from '../0x';
|
||||||
import { ExchangeWrapper } from '../contract_wrappers/exchange_wrapper';
|
import { ExchangeWrapper } from '../contract_wrappers/exchange_wrapper';
|
||||||
import { ExchangeContractErrs, Order, SignedOrder, TradeSide, TransferType, ZeroExError } from '../types';
|
import { ExchangeContractErrs, TradeSide, TransferType, ZeroExError } from '../types';
|
||||||
import { constants } from '../utils/constants';
|
import { constants } from '../utils/constants';
|
||||||
import { utils } from '../utils/utils';
|
import { utils } from '../utils/utils';
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
|
import { ECSignature } from '@0xproject/types';
|
||||||
import * as ethUtil from 'ethereumjs-util';
|
import * as ethUtil from 'ethereumjs-util';
|
||||||
|
|
||||||
import { ECSignature } from '../types';
|
|
||||||
|
|
||||||
export const signatureUtils = {
|
export const signatureUtils = {
|
||||||
isValidSignature(data: string, signature: ECSignature, signerAddress: string): boolean {
|
isValidSignature(data: string, signature: ECSignature, signerAddress: string): boolean {
|
||||||
const dataBuff = ethUtil.toBuffer(data);
|
const dataBuff = ethUtil.toBuffer(data);
|
||||||
|
@@ -1,12 +1,10 @@
|
|||||||
import { SolidityTypes } from '@0xproject/types';
|
import { Order, SignedOrder, SolidityTypes } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import BN = require('bn.js');
|
import BN = require('bn.js');
|
||||||
import * as ethABI from 'ethereumjs-abi';
|
import * as ethABI from 'ethereumjs-abi';
|
||||||
import * as ethUtil from 'ethereumjs-util';
|
import * as ethUtil from 'ethereumjs-util';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
import { Order, SignedOrder } from '../types';
|
|
||||||
|
|
||||||
export const utils = {
|
export const utils = {
|
||||||
/**
|
/**
|
||||||
* Converts BigNumber instance to BN
|
* Converts BigNumber instance to BN
|
||||||
@@ -17,10 +15,6 @@ export const utils = {
|
|||||||
bigNumberToBN(value: BigNumber) {
|
bigNumberToBN(value: BigNumber) {
|
||||||
return new BN(value.toString(), 10);
|
return new BN(value.toString(), 10);
|
||||||
},
|
},
|
||||||
consoleLog(message: string): void {
|
|
||||||
// tslint:disable-next-line: no-console
|
|
||||||
console.log(message);
|
|
||||||
},
|
|
||||||
spawnSwitchErr(name: string, value: any): Error {
|
spawnSwitchErr(name: string, value: any): Error {
|
||||||
return new Error(`Unexpected switch value: ${value} encountered for ${name}`);
|
return new Error(`Unexpected switch value: ${value} encountered for ${name}`);
|
||||||
},
|
},
|
||||||
|
@@ -10,15 +10,15 @@ import { ApprovalContractEventArgs, LogWithDecodedArgs, Order, TokenEvents, Zero
|
|||||||
import { chaiSetup } from './utils/chai_setup';
|
import { chaiSetup } from './utils/chai_setup';
|
||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
import { TokenUtils } from './utils/token_utils';
|
import { TokenUtils } from './utils/token_utils';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
|
|
||||||
const SHOULD_ADD_PERSONAL_MESSAGE_PREFIX = false;
|
const SHOULD_ADD_PERSONAL_MESSAGE_PREFIX = false;
|
||||||
|
|
||||||
describe('ZeroEx library', () => {
|
describe('ZeroEx library', () => {
|
||||||
const web3 = web3Factory.create();
|
|
||||||
const config = {
|
const config = {
|
||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
@@ -41,11 +41,11 @@ describe('ZeroEx library', () => {
|
|||||||
expect((zeroEx.tokenRegistry as any)._tokenRegistryContractIfExists).to.be.undefined();
|
expect((zeroEx.tokenRegistry as any)._tokenRegistryContractIfExists).to.be.undefined();
|
||||||
|
|
||||||
// Check that all nested web3 wrapper instances return the updated provider
|
// Check that all nested web3 wrapper instances return the updated provider
|
||||||
const nestedWeb3WrapperProvider = (zeroEx as any)._web3Wrapper.getCurrentProvider();
|
const nestedWeb3WrapperProvider = (zeroEx as any)._web3Wrapper.getProvider();
|
||||||
expect(nestedWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
expect(nestedWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
||||||
const exchangeWeb3WrapperProvider = (zeroEx.exchange as any)._web3Wrapper.getCurrentProvider();
|
const exchangeWeb3WrapperProvider = (zeroEx.exchange as any)._web3Wrapper.getProvider();
|
||||||
expect(exchangeWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
expect(exchangeWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
||||||
const tokenRegistryWeb3WrapperProvider = (zeroEx.tokenRegistry as any)._web3Wrapper.getCurrentProvider();
|
const tokenRegistryWeb3WrapperProvider = (zeroEx.tokenRegistry as any)._web3Wrapper.getProvider();
|
||||||
expect(tokenRegistryWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
expect(tokenRegistryWeb3WrapperProvider.zeroExTestId).to.be.a('number');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -216,7 +216,7 @@ describe('ZeroEx library', () => {
|
|||||||
s: '0x050aa3cc1f2c435e67e114cdce54b9527b4f50548342401bc5d2b77adbdacb02',
|
s: '0x050aa3cc1f2c435e67e114cdce54b9527b4f50548342401bc5d2b77adbdacb02',
|
||||||
};
|
};
|
||||||
stubs = [
|
stubs = [
|
||||||
Sinon.stub((zeroEx as any)._web3Wrapper, 'signTransactionAsync').returns(Promise.resolve(signature)),
|
Sinon.stub((zeroEx as any)._web3Wrapper, 'signMessageAsync').returns(Promise.resolve(signature)),
|
||||||
Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
|
Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -237,7 +237,7 @@ describe('ZeroEx library', () => {
|
|||||||
s: '0x2dea66f25a608bbae457e020fb6decb763deb8b7192abab624997242da248960',
|
s: '0x2dea66f25a608bbae457e020fb6decb763deb8b7192abab624997242da248960',
|
||||||
};
|
};
|
||||||
stubs = [
|
stubs = [
|
||||||
Sinon.stub((zeroEx as any)._web3Wrapper, 'signTransactionAsync').returns(Promise.resolve(signature)),
|
Sinon.stub((zeroEx as any)._web3Wrapper, 'signMessageAsync').returns(Promise.resolve(signature)),
|
||||||
Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
|
Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
|
import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
import 'mocha';
|
import 'mocha';
|
||||||
import * as Web3 from 'web3';
|
import * as Web3 from 'web3';
|
||||||
@@ -23,10 +24,11 @@ import { chaiSetup } from './utils/chai_setup';
|
|||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
|
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
|
||||||
import { TokenUtils } from './utils/token_utils';
|
import { TokenUtils } from './utils/token_utils';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
// Since the address depositing/withdrawing ETH/WETH also needs to pay gas costs for the transaction,
|
// Since the address depositing/withdrawing ETH/WETH also needs to pay gas costs for the transaction,
|
||||||
// a small amount of ETH will be used to pay this gas cost. We therefore check that the difference between
|
// a small amount of ETH will be used to pay this gas cost. We therefore check that the difference between
|
||||||
@@ -35,7 +37,6 @@ const blockchainLifecycle = new BlockchainLifecycle();
|
|||||||
const MAX_REASONABLE_GAS_COST_IN_WEI = 62517;
|
const MAX_REASONABLE_GAS_COST_IN_WEI = 62517;
|
||||||
|
|
||||||
describe('EtherTokenWrapper', () => {
|
describe('EtherTokenWrapper', () => {
|
||||||
let web3: Web3;
|
|
||||||
let zeroEx: ZeroEx;
|
let zeroEx: ZeroEx;
|
||||||
let tokens: Token[];
|
let tokens: Token[];
|
||||||
let userAddresses: string[];
|
let userAddresses: string[];
|
||||||
@@ -54,13 +55,12 @@ describe('EtherTokenWrapper', () => {
|
|||||||
const depositAmount = new BigNumber(42);
|
const depositAmount = new BigNumber(42);
|
||||||
const withdrawalAmount = new BigNumber(42);
|
const withdrawalAmount = new BigNumber(42);
|
||||||
before(async () => {
|
before(async () => {
|
||||||
web3 = web3Factory.create();
|
|
||||||
zeroEx = new ZeroEx(web3.currentProvider, zeroExConfig);
|
zeroEx = new ZeroEx(web3.currentProvider, zeroExConfig);
|
||||||
tokens = await zeroEx.tokenRegistry.getTokensAsync();
|
tokens = await zeroEx.tokenRegistry.getTokensAsync();
|
||||||
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
||||||
addressWithETH = userAddresses[0];
|
addressWithETH = userAddresses[0];
|
||||||
wethContractAddress = zeroEx.etherToken.getContractAddressIfExists() as string;
|
wethContractAddress = zeroEx.etherToken.getContractAddressIfExists() as string;
|
||||||
depositWeiAmount = (zeroEx as any)._web3Wrapper.toWei(new BigNumber(5));
|
depositWeiAmount = Web3Wrapper.toWei(new BigNumber(5));
|
||||||
decimalPlaces = 7;
|
decimalPlaces = 7;
|
||||||
addressWithoutFunds = userAddresses[1];
|
addressWithoutFunds = userAddresses[1];
|
||||||
});
|
});
|
||||||
@@ -75,11 +75,14 @@ describe('EtherTokenWrapper', () => {
|
|||||||
const contractAddressIfExists = zeroEx.etherToken.getContractAddressIfExists();
|
const contractAddressIfExists = zeroEx.etherToken.getContractAddressIfExists();
|
||||||
expect(contractAddressIfExists).to.not.be.undefined();
|
expect(contractAddressIfExists).to.not.be.undefined();
|
||||||
});
|
});
|
||||||
it('should return undefined if connected to an unknown network', () => {
|
it('should throw if connected to a private network and contract addresses are not specified', () => {
|
||||||
const UNKNOWN_NETWORK_NETWORK_ID = 10;
|
const UNKNOWN_NETWORK_NETWORK_ID = 10;
|
||||||
const unknownNetworkZeroEx = new ZeroEx(web3.currentProvider, { networkId: UNKNOWN_NETWORK_NETWORK_ID });
|
expect(
|
||||||
const contractAddressIfExists = unknownNetworkZeroEx.etherToken.getContractAddressIfExists();
|
() =>
|
||||||
expect(contractAddressIfExists).to.be.undefined();
|
new ZeroEx(web3.currentProvider, {
|
||||||
|
networkId: UNKNOWN_NETWORK_NETWORK_ID,
|
||||||
|
} as any),
|
||||||
|
).to.throw();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('#depositAsync', () => {
|
describe('#depositAsync', () => {
|
||||||
@@ -103,7 +106,7 @@ describe('EtherTokenWrapper', () => {
|
|||||||
it('should throw if user has insufficient ETH balance for deposit', async () => {
|
it('should throw if user has insufficient ETH balance for deposit', async () => {
|
||||||
const preETHBalance = await (zeroEx as any)._web3Wrapper.getBalanceInWeiAsync(addressWithETH);
|
const preETHBalance = await (zeroEx as any)._web3Wrapper.getBalanceInWeiAsync(addressWithETH);
|
||||||
|
|
||||||
const extraETHBalance = (zeroEx as any)._web3Wrapper.toWei(5, 'ether');
|
const extraETHBalance = Web3Wrapper.toWei(new BigNumber(5));
|
||||||
const overETHBalanceinWei = preETHBalance.add(extraETHBalance);
|
const overETHBalanceinWei = preETHBalance.add(extraETHBalance);
|
||||||
|
|
||||||
return expect(
|
return expect(
|
||||||
@@ -135,7 +138,7 @@ describe('EtherTokenWrapper', () => {
|
|||||||
gasCost = expectedETHBalance.minus(postETHBalance);
|
gasCost = expectedETHBalance.minus(postETHBalance);
|
||||||
expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
|
expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
|
||||||
});
|
});
|
||||||
it('should throw if user has insufficient WETH balance for withdrawl', async () => {
|
it('should throw if user has insufficient WETH balance for withdrawal', async () => {
|
||||||
const preWETHBalance = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH);
|
const preWETHBalance = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH);
|
||||||
expect(preWETHBalance).to.be.bignumber.equal(0);
|
expect(preWETHBalance).to.be.bignumber.equal(0);
|
||||||
|
|
||||||
@@ -155,7 +158,7 @@ describe('EtherTokenWrapper', () => {
|
|||||||
etherTokenAddress = etherToken.address;
|
etherTokenAddress = etherToken.address;
|
||||||
});
|
});
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
zeroEx.etherToken._unsubscribeAll();
|
zeroEx.etherToken.unsubscribeAll();
|
||||||
});
|
});
|
||||||
// Hack: Mocha does not allow a test to be both async and have a `done` callback
|
// Hack: Mocha does not allow a test to be both async and have a `done` callback
|
||||||
// Since we need to await the receipt of the event in the `subscribe` callback,
|
// Since we need to await the receipt of the event in the `subscribe` callback,
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import { web3Factory } from '@0xproject/dev-utils';
|
import { web3Factory } from '@0xproject/dev-utils';
|
||||||
|
import { LogEntry } from '@0xproject/types';
|
||||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
@@ -21,7 +22,7 @@ describe('EventWatcher', () => {
|
|||||||
let stubs: Sinon.SinonStub[] = [];
|
let stubs: Sinon.SinonStub[] = [];
|
||||||
let eventWatcher: EventWatcher;
|
let eventWatcher: EventWatcher;
|
||||||
let web3Wrapper: Web3Wrapper;
|
let web3Wrapper: Web3Wrapper;
|
||||||
const logA: Web3.LogEntry = {
|
const logA: LogEntry = {
|
||||||
address: '0x71d271f8b14adef568f8f28f1587ce7271ac4ca5',
|
address: '0x71d271f8b14adef568f8f28f1587ce7271ac4ca5',
|
||||||
blockHash: null,
|
blockHash: null,
|
||||||
blockNumber: null,
|
blockNumber: null,
|
||||||
@@ -31,7 +32,7 @@ describe('EventWatcher', () => {
|
|||||||
transactionHash: '0x004881d38cd4a8f72f1a0d68c8b9b8124504706041ff37019c1d1ed6bfda8e17',
|
transactionHash: '0x004881d38cd4a8f72f1a0d68c8b9b8124504706041ff37019c1d1ed6bfda8e17',
|
||||||
transactionIndex: 0,
|
transactionIndex: 0,
|
||||||
};
|
};
|
||||||
const logB: Web3.LogEntry = {
|
const logB: LogEntry = {
|
||||||
address: '0x8d12a197cb00d4747a1fe03395095ce2a5cc6819',
|
address: '0x8d12a197cb00d4747a1fe03395095ce2a5cc6819',
|
||||||
blockHash: null,
|
blockHash: null,
|
||||||
blockNumber: null,
|
blockNumber: null,
|
||||||
@@ -41,7 +42,7 @@ describe('EventWatcher', () => {
|
|||||||
transactionHash: '0x01ef3c048b18d9b09ea195b4ed94cf8dd5f3d857a1905ff886b152cfb1166f25',
|
transactionHash: '0x01ef3c048b18d9b09ea195b4ed94cf8dd5f3d857a1905ff886b152cfb1166f25',
|
||||||
transactionIndex: 0,
|
transactionIndex: 0,
|
||||||
};
|
};
|
||||||
const logC: Web3.LogEntry = {
|
const logC: LogEntry = {
|
||||||
address: '0x1d271f8b174adef58f1587ce68f8f27271ac4ca5',
|
address: '0x1d271f8b174adef58f1587ce68f8f27271ac4ca5',
|
||||||
blockHash: null,
|
blockHash: null,
|
||||||
blockNumber: null,
|
blockNumber: null,
|
||||||
@@ -64,7 +65,7 @@ describe('EventWatcher', () => {
|
|||||||
eventWatcher.unsubscribe();
|
eventWatcher.unsubscribe();
|
||||||
});
|
});
|
||||||
it('correctly emits initial log events', (done: DoneCallback) => {
|
it('correctly emits initial log events', (done: DoneCallback) => {
|
||||||
const logs: Web3.LogEntry[] = [logA, logB];
|
const logs: LogEntry[] = [logA, logB];
|
||||||
const expectedLogEvents = [
|
const expectedLogEvents = [
|
||||||
{
|
{
|
||||||
removed: false,
|
removed: false,
|
||||||
@@ -89,8 +90,8 @@ describe('EventWatcher', () => {
|
|||||||
eventWatcher.subscribe(callback);
|
eventWatcher.subscribe(callback);
|
||||||
});
|
});
|
||||||
it('correctly computes the difference and emits only changes', (done: DoneCallback) => {
|
it('correctly computes the difference and emits only changes', (done: DoneCallback) => {
|
||||||
const initialLogs: Web3.LogEntry[] = [logA, logB];
|
const initialLogs: LogEntry[] = [logA, logB];
|
||||||
const changedLogs: Web3.LogEntry[] = [logA, logC];
|
const changedLogs: LogEntry[] = [logA, logC];
|
||||||
const expectedLogEvents = [
|
const expectedLogEvents = [
|
||||||
{
|
{
|
||||||
removed: false,
|
removed: false,
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
|
import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
|
||||||
import { BlockParamLiteral } from '@0xproject/types';
|
import { BlockParamLiteral } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
@@ -9,13 +9,13 @@ import { ExchangeTransferSimulator } from '../src/utils/exchange_transfer_simula
|
|||||||
|
|
||||||
import { chaiSetup } from './utils/chai_setup';
|
import { chaiSetup } from './utils/chai_setup';
|
||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
describe('ExchangeTransferSimulator', () => {
|
describe('ExchangeTransferSimulator', () => {
|
||||||
const web3 = web3Factory.create();
|
|
||||||
const config = {
|
const config = {
|
||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
|
@@ -26,15 +26,15 @@ import { constants } from './utils/constants';
|
|||||||
import { FillScenarios } from './utils/fill_scenarios';
|
import { FillScenarios } from './utils/fill_scenarios';
|
||||||
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
|
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
|
||||||
import { TokenUtils } from './utils/token_utils';
|
import { TokenUtils } from './utils/token_utils';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
const NON_EXISTENT_ORDER_HASH = '0x79370342234e7acd6bbeac335bd3bb1d368383294b64b8160a00f4060e4d3777';
|
const NON_EXISTENT_ORDER_HASH = '0x79370342234e7acd6bbeac335bd3bb1d368383294b64b8160a00f4060e4d3777';
|
||||||
|
|
||||||
describe('ExchangeWrapper', () => {
|
describe('ExchangeWrapper', () => {
|
||||||
let web3: Web3;
|
|
||||||
let zeroEx: ZeroEx;
|
let zeroEx: ZeroEx;
|
||||||
let tokenUtils: TokenUtils;
|
let tokenUtils: TokenUtils;
|
||||||
let tokens: Token[];
|
let tokens: Token[];
|
||||||
@@ -46,7 +46,6 @@ describe('ExchangeWrapper', () => {
|
|||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
before(async () => {
|
before(async () => {
|
||||||
web3 = web3Factory.create();
|
|
||||||
zeroEx = new ZeroEx(web3.currentProvider, config);
|
zeroEx = new ZeroEx(web3.currentProvider, config);
|
||||||
exchangeContractAddress = zeroEx.exchange.getContractAddress();
|
exchangeContractAddress = zeroEx.exchange.getContractAddress();
|
||||||
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
||||||
@@ -597,6 +596,19 @@ describe('ExchangeWrapper', () => {
|
|||||||
const remainingFillAmount = fillableAmount.minus(1);
|
const remainingFillAmount = fillableAmount.minus(1);
|
||||||
expect(anotherFilledAmount).to.be.bignumber.equal(remainingFillAmount);
|
expect(anotherFilledAmount).to.be.bignumber.equal(remainingFillAmount);
|
||||||
});
|
});
|
||||||
|
it('should successfully fill up to specified amount and leave the rest of the orders untouched', async () => {
|
||||||
|
const txHash = await zeroEx.exchange.fillOrdersUpToAsync(
|
||||||
|
signedOrders,
|
||||||
|
fillableAmount,
|
||||||
|
shouldThrowOnInsufficientBalanceOrAllowance,
|
||||||
|
takerAddress,
|
||||||
|
);
|
||||||
|
await zeroEx.awaitTransactionMinedAsync(txHash);
|
||||||
|
const filledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(signedOrderHashHex);
|
||||||
|
const zeroAmount = await zeroEx.exchange.getFilledTakerAmountAsync(anotherOrderHashHex);
|
||||||
|
expect(filledAmount).to.be.bignumber.equal(fillableAmount);
|
||||||
|
expect(zeroAmount).to.be.bignumber.equal(0);
|
||||||
|
});
|
||||||
it('should successfully fill up to specified amount even if filling all orders would fail', async () => {
|
it('should successfully fill up to specified amount even if filling all orders would fail', async () => {
|
||||||
const missingBalance = new BigNumber(1); // User will still have enough balance to fill up to 9,
|
const missingBalance = new BigNumber(1); // User will still have enough balance to fill up to 9,
|
||||||
// but won't have 10 to fully fill all orders in a batch.
|
// but won't have 10 to fully fill all orders in a batch.
|
||||||
@@ -922,7 +934,7 @@ describe('ExchangeWrapper', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
zeroEx.exchange._unsubscribeAll();
|
zeroEx.exchange.unsubscribeAll();
|
||||||
});
|
});
|
||||||
// Hack: Mocha does not allow a test to be both async and have a `done` callback
|
// Hack: Mocha does not allow a test to be both async and have a `done` callback
|
||||||
// Since we need to await the receipt of the event in the `subscribe` callback,
|
// Since we need to await the receipt of the event in the `subscribe` callback,
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
|
import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
@@ -9,20 +9,20 @@ import * as Web3 from 'web3';
|
|||||||
import { ZeroEx } from '../src/0x';
|
import { ZeroEx } from '../src/0x';
|
||||||
import { ExpirationWatcher } from '../src/order_watcher/expiration_watcher';
|
import { ExpirationWatcher } from '../src/order_watcher/expiration_watcher';
|
||||||
import { DoneCallback, Token } from '../src/types';
|
import { DoneCallback, Token } from '../src/types';
|
||||||
import { constants } from '../src/utils/constants';
|
|
||||||
import { utils } from '../src/utils/utils';
|
import { utils } from '../src/utils/utils';
|
||||||
|
|
||||||
import { chaiSetup } from './utils/chai_setup';
|
import { chaiSetup } from './utils/chai_setup';
|
||||||
|
import { constants } from './utils/constants';
|
||||||
import { FillScenarios } from './utils/fill_scenarios';
|
import { FillScenarios } from './utils/fill_scenarios';
|
||||||
import { reportNoErrorCallbackErrors } from './utils/report_callback_errors';
|
import { reportNoErrorCallbackErrors } from './utils/report_callback_errors';
|
||||||
import { TokenUtils } from './utils/token_utils';
|
import { TokenUtils } from './utils/token_utils';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
describe('ExpirationWatcher', () => {
|
describe('ExpirationWatcher', () => {
|
||||||
let web3: Web3;
|
|
||||||
let zeroEx: ZeroEx;
|
let zeroEx: ZeroEx;
|
||||||
let tokenUtils: TokenUtils;
|
let tokenUtils: TokenUtils;
|
||||||
let tokens: Token[];
|
let tokens: Token[];
|
||||||
@@ -41,7 +41,6 @@ describe('ExpirationWatcher', () => {
|
|||||||
let timer: Sinon.SinonFakeTimers;
|
let timer: Sinon.SinonFakeTimers;
|
||||||
let expirationWatcher: ExpirationWatcher;
|
let expirationWatcher: ExpirationWatcher;
|
||||||
before(async () => {
|
before(async () => {
|
||||||
web3 = web3Factory.create();
|
|
||||||
const config = {
|
const config = {
|
||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
|
import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
@@ -15,6 +15,7 @@ import {
|
|||||||
ZeroEx,
|
ZeroEx,
|
||||||
ZeroExError,
|
ZeroExError,
|
||||||
} from '../src';
|
} from '../src';
|
||||||
|
import { OrderStateWatcher } from '../src/order_watcher/order_state_watcher';
|
||||||
import { DoneCallback } from '../src/types';
|
import { DoneCallback } from '../src/types';
|
||||||
|
|
||||||
import { chaiSetup } from './utils/chai_setup';
|
import { chaiSetup } from './utils/chai_setup';
|
||||||
@@ -22,15 +23,15 @@ import { constants } from './utils/constants';
|
|||||||
import { FillScenarios } from './utils/fill_scenarios';
|
import { FillScenarios } from './utils/fill_scenarios';
|
||||||
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
|
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
|
||||||
import { TokenUtils } from './utils/token_utils';
|
import { TokenUtils } from './utils/token_utils';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
const TIMEOUT_MS = 150;
|
const TIMEOUT_MS = 150;
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
describe('OrderStateWatcher', () => {
|
describe('OrderStateWatcher', () => {
|
||||||
let web3: Web3;
|
|
||||||
let zeroEx: ZeroEx;
|
let zeroEx: ZeroEx;
|
||||||
let tokens: Token[];
|
let tokens: Token[];
|
||||||
let tokenUtils: TokenUtils;
|
let tokenUtils: TokenUtils;
|
||||||
@@ -43,14 +44,15 @@ describe('OrderStateWatcher', () => {
|
|||||||
let maker: string;
|
let maker: string;
|
||||||
let taker: string;
|
let taker: string;
|
||||||
let signedOrder: SignedOrder;
|
let signedOrder: SignedOrder;
|
||||||
|
let orderStateWatcher: OrderStateWatcher;
|
||||||
const config = {
|
const config = {
|
||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
const decimals = constants.ZRX_DECIMALS;
|
const decimals = constants.ZRX_DECIMALS;
|
||||||
const fillableAmount = ZeroEx.toBaseUnitAmount(new BigNumber(5), decimals);
|
const fillableAmount = ZeroEx.toBaseUnitAmount(new BigNumber(5), decimals);
|
||||||
before(async () => {
|
before(async () => {
|
||||||
web3 = web3Factory.create();
|
|
||||||
zeroEx = new ZeroEx(web3.currentProvider, config);
|
zeroEx = new ZeroEx(web3.currentProvider, config);
|
||||||
|
orderStateWatcher = zeroEx.createOrderStateWatcher();
|
||||||
exchangeContractAddress = zeroEx.exchange.getContractAddress();
|
exchangeContractAddress = zeroEx.exchange.getContractAddress();
|
||||||
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
||||||
[, maker, taker] = userAddresses;
|
[, maker, taker] = userAddresses;
|
||||||
@@ -77,17 +79,17 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
expect((zeroEx.orderStateWatcher as any)._orderByOrderHash).to.include({
|
expect((orderStateWatcher as any)._orderByOrderHash).to.include({
|
||||||
[orderHash]: signedOrder,
|
[orderHash]: signedOrder,
|
||||||
});
|
});
|
||||||
let dependentOrderHashes = (zeroEx.orderStateWatcher as any)._dependentOrderHashes;
|
let dependentOrderHashes = (orderStateWatcher as any)._dependentOrderHashes;
|
||||||
expect(dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress]).to.have.keys(orderHash);
|
expect(dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress]).to.have.keys(orderHash);
|
||||||
zeroEx.orderStateWatcher.removeOrder(orderHash);
|
orderStateWatcher.removeOrder(orderHash);
|
||||||
expect((zeroEx.orderStateWatcher as any)._orderByOrderHash).to.not.include({
|
expect((orderStateWatcher as any)._orderByOrderHash).to.not.include({
|
||||||
[orderHash]: signedOrder,
|
[orderHash]: signedOrder,
|
||||||
});
|
});
|
||||||
dependentOrderHashes = (zeroEx.orderStateWatcher as any)._dependentOrderHashes;
|
dependentOrderHashes = (orderStateWatcher as any)._dependentOrderHashes;
|
||||||
expect(dependentOrderHashes[signedOrder.maker]).to.be.undefined();
|
expect(dependentOrderHashes[signedOrder.maker]).to.be.undefined();
|
||||||
});
|
});
|
||||||
it('should no-op when removing a non-existing order', async () => {
|
it('should no-op when removing a non-existing order', async () => {
|
||||||
@@ -104,23 +106,23 @@ describe('OrderStateWatcher', () => {
|
|||||||
.split('')
|
.split('')
|
||||||
.reverse()
|
.reverse()
|
||||||
.join('')}`;
|
.join('')}`;
|
||||||
zeroEx.orderStateWatcher.removeOrder(nonExistentOrderHash);
|
orderStateWatcher.removeOrder(nonExistentOrderHash);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('#subscribe', async () => {
|
describe('#subscribe', async () => {
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
zeroEx.orderStateWatcher.unsubscribe();
|
orderStateWatcher.unsubscribe();
|
||||||
});
|
});
|
||||||
it('should fail when trying to subscribe twice', async () => {
|
it('should fail when trying to subscribe twice', async () => {
|
||||||
zeroEx.orderStateWatcher.subscribe(_.noop);
|
orderStateWatcher.subscribe(_.noop);
|
||||||
expect(() => zeroEx.orderStateWatcher.subscribe(_.noop)).to.throw(ZeroExError.SubscriptionAlreadyPresent);
|
expect(() => orderStateWatcher.subscribe(_.noop)).to.throw(ZeroExError.SubscriptionAlreadyPresent);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('tests with cleanup', async () => {
|
describe('tests with cleanup', async () => {
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
zeroEx.orderStateWatcher.unsubscribe();
|
orderStateWatcher.unsubscribe();
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.removeOrder(orderHash);
|
orderStateWatcher.removeOrder(orderHash);
|
||||||
});
|
});
|
||||||
it('should emit orderStateInvalid when maker allowance set to 0 for watched order', (done: DoneCallback) => {
|
it('should emit orderStateInvalid when maker allowance set to 0 for watched order', (done: DoneCallback) => {
|
||||||
(async () => {
|
(async () => {
|
||||||
@@ -132,14 +134,14 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
const invalidOrderState = orderState as OrderStateInvalid;
|
const invalidOrderState = orderState as OrderStateInvalid;
|
||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, new BigNumber(0));
|
await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, new BigNumber(0));
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -152,11 +154,11 @@ describe('OrderStateWatcher', () => {
|
|||||||
taker,
|
taker,
|
||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
throw new Error('OrderState callback fired for irrelevant order');
|
throw new Error('OrderState callback fired for irrelevant order');
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
const notTheMaker = userAddresses[0];
|
const notTheMaker = userAddresses[0];
|
||||||
const anyRecipient = taker;
|
const anyRecipient = taker;
|
||||||
const transferAmount = new BigNumber(2);
|
const transferAmount = new BigNumber(2);
|
||||||
@@ -176,14 +178,14 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
const invalidOrderState = orderState as OrderStateInvalid;
|
const invalidOrderState = orderState as OrderStateInvalid;
|
||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerBalance);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerBalance);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
const anyRecipient = taker;
|
const anyRecipient = taker;
|
||||||
const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
|
const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
|
||||||
await zeroEx.token.transferAsync(makerToken.address, maker, anyRecipient, makerBalance);
|
await zeroEx.token.transferAsync(makerToken.address, maker, anyRecipient, makerBalance);
|
||||||
@@ -199,7 +201,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
@@ -207,7 +209,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
|
|
||||||
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
||||||
await zeroEx.exchange.fillOrderAsync(
|
await zeroEx.exchange.fillOrderAsync(
|
||||||
@@ -231,7 +233,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
|
const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
|
||||||
const fillAmountInBaseUnits = new BigNumber(2);
|
const fillAmountInBaseUnits = new BigNumber(2);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
@@ -248,7 +250,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
);
|
);
|
||||||
expect(orderRelevantState.makerBalance).to.be.bignumber.equal(remainingMakerBalance);
|
expect(orderRelevantState.makerBalance).to.be.bignumber.equal(remainingMakerBalance);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
||||||
await zeroEx.exchange.fillOrderAsync(
|
await zeroEx.exchange.fillOrderAsync(
|
||||||
signedOrder,
|
signedOrder,
|
||||||
@@ -273,8 +275,8 @@ describe('OrderStateWatcher', () => {
|
|||||||
taker,
|
taker,
|
||||||
);
|
);
|
||||||
const callback = reportNodeCallbackErrors(done)();
|
const callback = reportNodeCallbackErrors(done)();
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, new BigNumber(0));
|
await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, new BigNumber(0));
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -293,7 +295,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
);
|
);
|
||||||
const fillAmountInBaseUnits = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
|
const fillAmountInBaseUnits = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
const validOrderState = orderState as OrderStateValid;
|
const validOrderState = orderState as OrderStateValid;
|
||||||
@@ -306,7 +308,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
ZeroEx.toBaseUnitAmount(new BigNumber(8), decimals),
|
ZeroEx.toBaseUnitAmount(new BigNumber(8), decimals),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
const shouldThrowOnInsufficientBalanceOrAllowance = true;
|
||||||
await zeroEx.exchange.fillOrderAsync(
|
await zeroEx.exchange.fillOrderAsync(
|
||||||
signedOrder,
|
signedOrder,
|
||||||
@@ -327,7 +329,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const changedMakerApprovalAmount = ZeroEx.toBaseUnitAmount(new BigNumber(3), decimals);
|
const changedMakerApprovalAmount = ZeroEx.toBaseUnitAmount(new BigNumber(3), decimals);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
const validOrderState = orderState as OrderStateValid;
|
const validOrderState = orderState as OrderStateValid;
|
||||||
@@ -339,7 +341,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
changedMakerApprovalAmount,
|
changedMakerApprovalAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, changedMakerApprovalAmount);
|
await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, changedMakerApprovalAmount);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -357,7 +359,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
|
|
||||||
const remainingAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), decimals);
|
const remainingAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), decimals);
|
||||||
const transferAmount = makerBalance.sub(remainingAmount);
|
const transferAmount = makerBalance.sub(remainingAmount);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
@@ -370,7 +372,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
remainingAmount,
|
remainingAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.transferAsync(makerToken.address, maker, ZeroEx.NULL_ADDRESS, transferAmount);
|
await zeroEx.token.transferAsync(makerToken.address, maker, ZeroEx.NULL_ADDRESS, transferAmount);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -392,7 +394,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
|
|
||||||
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
|
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
|
||||||
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
|
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
@@ -402,7 +404,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
remainingTokenAmount,
|
remainingTokenAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.exchange.cancelOrderAsync(signedOrder, transferTokenAmount);
|
await zeroEx.exchange.cancelOrderAsync(signedOrder, transferTokenAmount);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
@@ -426,7 +428,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
|
|
||||||
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
|
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
|
||||||
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
|
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
const validOrderState = orderState as OrderStateValid;
|
const validOrderState = orderState as OrderStateValid;
|
||||||
@@ -435,7 +437,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
remainingFeeAmount,
|
remainingFeeAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, remainingFeeAmount);
|
await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, remainingFeeAmount);
|
||||||
await zeroEx.token.transferAsync(
|
await zeroEx.token.transferAsync(
|
||||||
makerToken.address,
|
makerToken.address,
|
||||||
@@ -461,7 +463,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
feeRecipient,
|
feeRecipient,
|
||||||
);
|
);
|
||||||
|
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
const validOrderState = orderState as OrderStateValid;
|
const validOrderState = orderState as OrderStateValid;
|
||||||
@@ -470,7 +472,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.token.setProxyAllowanceAsync(
|
await zeroEx.token.setProxyAllowanceAsync(
|
||||||
makerToken.address,
|
makerToken.address,
|
||||||
maker,
|
maker,
|
||||||
@@ -489,7 +491,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
@@ -497,7 +499,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
|
|
||||||
await zeroEx.exchange.cancelOrderAsync(signedOrder, fillableAmount);
|
await zeroEx.exchange.cancelOrderAsync(signedOrder, fillableAmount);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
@@ -513,7 +515,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
fillableAmount,
|
fillableAmount,
|
||||||
);
|
);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.false();
|
expect(orderState.isValid).to.be.false();
|
||||||
@@ -521,7 +523,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
expect(invalidOrderState.orderHash).to.be.equal(orderHash);
|
||||||
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderFillRoundingError);
|
expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderFillRoundingError);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.exchange.cancelOrderAsync(
|
await zeroEx.exchange.cancelOrderAsync(
|
||||||
signedOrder,
|
signedOrder,
|
||||||
fillableAmount.minus(remainingFillableAmountInBaseUnits),
|
fillableAmount.minus(remainingFillableAmountInBaseUnits),
|
||||||
@@ -540,7 +542,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
|
|
||||||
const cancelAmountInBaseUnits = new BigNumber(2);
|
const cancelAmountInBaseUnits = new BigNumber(2);
|
||||||
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
zeroEx.orderStateWatcher.addOrder(signedOrder);
|
orderStateWatcher.addOrder(signedOrder);
|
||||||
|
|
||||||
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
|
||||||
expect(orderState.isValid).to.be.true();
|
expect(orderState.isValid).to.be.true();
|
||||||
@@ -549,7 +551,7 @@ describe('OrderStateWatcher', () => {
|
|||||||
const orderRelevantState = validOrderState.orderRelevantState;
|
const orderRelevantState = validOrderState.orderRelevantState;
|
||||||
expect(orderRelevantState.cancelledTakerTokenAmount).to.be.bignumber.equal(cancelAmountInBaseUnits);
|
expect(orderRelevantState.cancelledTakerTokenAmount).to.be.bignumber.equal(cancelAmountInBaseUnits);
|
||||||
});
|
});
|
||||||
zeroEx.orderStateWatcher.subscribe(callback);
|
orderStateWatcher.subscribe(callback);
|
||||||
await zeroEx.exchange.cancelOrderAsync(signedOrder, cancelAmountInBaseUnits);
|
await zeroEx.exchange.cancelOrderAsync(signedOrder, cancelAmountInBaseUnits);
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
|
import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
|
||||||
import { BlockParamLiteral } from '@0xproject/types';
|
import { BlockParamLiteral } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
@@ -14,13 +14,13 @@ import { chaiSetup } from './utils/chai_setup';
|
|||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
import { FillScenarios } from './utils/fill_scenarios';
|
import { FillScenarios } from './utils/fill_scenarios';
|
||||||
import { TokenUtils } from './utils/token_utils';
|
import { TokenUtils } from './utils/token_utils';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
describe('OrderValidation', () => {
|
describe('OrderValidation', () => {
|
||||||
let web3: Web3;
|
|
||||||
let zeroEx: ZeroEx;
|
let zeroEx: ZeroEx;
|
||||||
let userAddresses: string[];
|
let userAddresses: string[];
|
||||||
let tokens: Token[];
|
let tokens: Token[];
|
||||||
@@ -40,7 +40,6 @@ describe('OrderValidation', () => {
|
|||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
before(async () => {
|
before(async () => {
|
||||||
web3 = web3Factory.create();
|
|
||||||
zeroEx = new ZeroEx(web3.currentProvider, config);
|
zeroEx = new ZeroEx(web3.currentProvider, config);
|
||||||
exchangeContractAddress = zeroEx.exchange.getContractAddress();
|
exchangeContractAddress = zeroEx.exchange.getContractAddress();
|
||||||
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
|
import { ECSignature, SignedOrder } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
import 'mocha';
|
import 'mocha';
|
||||||
|
|
||||||
import { ZeroEx } from '../src/0x';
|
import { ZeroEx } from '../src/0x';
|
||||||
import { RemainingFillableCalculator } from '../src/order_watcher/remaining_fillable_calculator';
|
import { RemainingFillableCalculator } from '../src/order_watcher/remaining_fillable_calculator';
|
||||||
import { ECSignature, SignedOrder } from '../src/types';
|
|
||||||
|
|
||||||
import { chaiSetup } from './utils/chai_setup';
|
import { chaiSetup } from './utils/chai_setup';
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
|
import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import 'mocha';
|
import 'mocha';
|
||||||
@@ -11,12 +11,12 @@ import { DoneCallback } from '../src/types';
|
|||||||
import { chaiSetup } from './utils/chai_setup';
|
import { chaiSetup } from './utils/chai_setup';
|
||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
import { assertNodeCallbackError } from './utils/report_callback_errors';
|
import { assertNodeCallbackError } from './utils/report_callback_errors';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
describe('SubscriptionTest', () => {
|
describe('SubscriptionTest', () => {
|
||||||
let web3: Web3;
|
|
||||||
let zeroEx: ZeroEx;
|
let zeroEx: ZeroEx;
|
||||||
let userAddresses: string[];
|
let userAddresses: string[];
|
||||||
let tokens: Token[];
|
let tokens: Token[];
|
||||||
@@ -26,7 +26,6 @@ describe('SubscriptionTest', () => {
|
|||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
before(async () => {
|
before(async () => {
|
||||||
web3 = web3Factory.create();
|
|
||||||
zeroEx = new ZeroEx(web3.currentProvider, config);
|
zeroEx = new ZeroEx(web3.currentProvider, config);
|
||||||
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
||||||
tokens = await zeroEx.tokenRegistry.getTokensAsync();
|
tokens = await zeroEx.tokenRegistry.getTokensAsync();
|
||||||
@@ -49,7 +48,7 @@ describe('SubscriptionTest', () => {
|
|||||||
tokenAddress = token.address;
|
tokenAddress = token.address;
|
||||||
});
|
});
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
zeroEx.token._unsubscribeAll();
|
zeroEx.token.unsubscribeAll();
|
||||||
_.each(stubs, s => s.restore());
|
_.each(stubs, s => s.restore());
|
||||||
stubs = [];
|
stubs = [];
|
||||||
});
|
});
|
||||||
@@ -76,7 +75,7 @@ describe('SubscriptionTest', () => {
|
|||||||
const callback = (err: Error | null, logEvent?: DecodedLogEvent<ApprovalContractEventArgs>) => _.noop;
|
const callback = (err: Error | null, logEvent?: DecodedLogEvent<ApprovalContractEventArgs>) => _.noop;
|
||||||
zeroEx.token.subscribe(tokenAddress, TokenEvents.Approval, indexFilterValues, callback);
|
zeroEx.token.subscribe(tokenAddress, TokenEvents.Approval, indexFilterValues, callback);
|
||||||
stubs = [Sinon.stub((zeroEx as any)._web3Wrapper, 'getBlockAsync').throws(new Error('JSON RPC error'))];
|
stubs = [Sinon.stub((zeroEx as any)._web3Wrapper, 'getBlockAsync').throws(new Error('JSON RPC error'))];
|
||||||
zeroEx.token._unsubscribeAll();
|
zeroEx.token.unsubscribeAll();
|
||||||
done();
|
done();
|
||||||
})().catch(done);
|
})().catch(done);
|
||||||
});
|
});
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
|
import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
|
||||||
import { schemas, SchemaValidator } from '@0xproject/json-schemas';
|
import { schemas, SchemaValidator } from '@0xproject/json-schemas';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
@@ -8,10 +8,11 @@ import { Token, ZeroEx } from '../src';
|
|||||||
|
|
||||||
import { chaiSetup } from './utils/chai_setup';
|
import { chaiSetup } from './utils/chai_setup';
|
||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
const TOKEN_REGISTRY_SIZE_AFTER_MIGRATION = 7;
|
const TOKEN_REGISTRY_SIZE_AFTER_MIGRATION = 7;
|
||||||
|
|
||||||
@@ -30,7 +31,6 @@ describe('TokenRegistryWrapper', () => {
|
|||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
before(async () => {
|
before(async () => {
|
||||||
const web3 = web3Factory.create();
|
|
||||||
zeroEx = new ZeroEx(web3.currentProvider, config);
|
zeroEx = new ZeroEx(web3.currentProvider, config);
|
||||||
tokens = await zeroEx.tokenRegistry.getTokensAsync();
|
tokens = await zeroEx.tokenRegistry.getTokensAsync();
|
||||||
_.map(tokens, token => {
|
_.map(tokens, token => {
|
||||||
|
@@ -8,6 +8,7 @@ import { constants } from './utils/constants';
|
|||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
|
const web3 = web3Factory.create();
|
||||||
|
|
||||||
describe('TokenTransferProxyWrapper', () => {
|
describe('TokenTransferProxyWrapper', () => {
|
||||||
let zeroEx: ZeroEx;
|
let zeroEx: ZeroEx;
|
||||||
@@ -15,7 +16,6 @@ describe('TokenTransferProxyWrapper', () => {
|
|||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
before(async () => {
|
before(async () => {
|
||||||
const web3 = web3Factory.create();
|
|
||||||
zeroEx = new ZeroEx(web3.currentProvider, config);
|
zeroEx = new ZeroEx(web3.currentProvider, config);
|
||||||
});
|
});
|
||||||
describe('#isAuthorizedAsync', () => {
|
describe('#isAuthorizedAsync', () => {
|
||||||
|
@@ -22,27 +22,24 @@ import { chaiSetup } from './utils/chai_setup';
|
|||||||
import { constants } from './utils/constants';
|
import { constants } from './utils/constants';
|
||||||
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
|
import { reportNodeCallbackErrors } from './utils/report_callback_errors';
|
||||||
import { TokenUtils } from './utils/token_utils';
|
import { TokenUtils } from './utils/token_utils';
|
||||||
|
import { web3, web3Wrapper } from './utils/web3_wrapper';
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
const blockchainLifecycle = new BlockchainLifecycle();
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
describe('TokenWrapper', () => {
|
describe('TokenWrapper', () => {
|
||||||
let web3: Web3;
|
|
||||||
let zeroEx: ZeroEx;
|
let zeroEx: ZeroEx;
|
||||||
let userAddresses: string[];
|
let userAddresses: string[];
|
||||||
let tokens: Token[];
|
let tokens: Token[];
|
||||||
let tokenUtils: TokenUtils;
|
let tokenUtils: TokenUtils;
|
||||||
let coinbase: string;
|
let coinbase: string;
|
||||||
let addressWithoutFunds: string;
|
let addressWithoutFunds: string;
|
||||||
let web3Wrapper: Web3Wrapper;
|
|
||||||
const config = {
|
const config = {
|
||||||
networkId: constants.TESTRPC_NETWORK_ID,
|
networkId: constants.TESTRPC_NETWORK_ID,
|
||||||
};
|
};
|
||||||
before(async () => {
|
before(async () => {
|
||||||
web3 = web3Factory.create();
|
|
||||||
zeroEx = new ZeroEx(web3.currentProvider, config);
|
zeroEx = new ZeroEx(web3.currentProvider, config);
|
||||||
web3Wrapper = new Web3Wrapper(web3.currentProvider);
|
|
||||||
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
userAddresses = await zeroEx.getAvailableAddressesAsync();
|
||||||
tokens = await zeroEx.tokenRegistry.getTokensAsync();
|
tokens = await zeroEx.tokenRegistry.getTokensAsync();
|
||||||
tokenUtils = new TokenUtils(tokens);
|
tokenUtils = new TokenUtils(tokens);
|
||||||
@@ -194,7 +191,7 @@ describe('TokenWrapper', () => {
|
|||||||
let zeroExWithoutAccounts: ZeroEx;
|
let zeroExWithoutAccounts: ZeroEx;
|
||||||
before(async () => {
|
before(async () => {
|
||||||
const hasAddresses = false;
|
const hasAddresses = false;
|
||||||
const web3WithoutAccounts = web3Factory.create(hasAddresses);
|
const web3WithoutAccounts = web3Factory.create({ hasAddresses });
|
||||||
zeroExWithoutAccounts = new ZeroEx(web3WithoutAccounts.currentProvider, config);
|
zeroExWithoutAccounts = new ZeroEx(web3WithoutAccounts.currentProvider, config);
|
||||||
});
|
});
|
||||||
it('should return balance even when called with Web3 provider instance without addresses', async () => {
|
it('should return balance even when called with Web3 provider instance without addresses', async () => {
|
||||||
@@ -306,7 +303,7 @@ describe('TokenWrapper', () => {
|
|||||||
let zeroExWithoutAccounts: ZeroEx;
|
let zeroExWithoutAccounts: ZeroEx;
|
||||||
before(async () => {
|
before(async () => {
|
||||||
const hasAddresses = false;
|
const hasAddresses = false;
|
||||||
const web3WithoutAccounts = web3Factory.create(hasAddresses);
|
const web3WithoutAccounts = web3Factory.create({ hasAddresses });
|
||||||
zeroExWithoutAccounts = new ZeroEx(web3WithoutAccounts.currentProvider, config);
|
zeroExWithoutAccounts = new ZeroEx(web3WithoutAccounts.currentProvider, config);
|
||||||
});
|
});
|
||||||
it('should get the proxy allowance', async () => {
|
it('should get the proxy allowance', async () => {
|
||||||
@@ -377,7 +374,7 @@ describe('TokenWrapper', () => {
|
|||||||
tokenAddress = token.address;
|
tokenAddress = token.address;
|
||||||
});
|
});
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
zeroEx.token._unsubscribeAll();
|
zeroEx.token.unsubscribeAll();
|
||||||
});
|
});
|
||||||
// Hack: Mocha does not allow a test to be both async and have a `done` callback
|
// Hack: Mocha does not allow a test to be both async and have a `done` callback
|
||||||
// Since we need to await the receipt of the event in the `subscribe` callback,
|
// Since we need to await the receipt of the event in the `subscribe` callback,
|
||||||
|
@@ -35,12 +35,13 @@ export class FillScenarios {
|
|||||||
const web3Wrapper = (this._zeroEx as any)._web3Wrapper as Web3Wrapper;
|
const web3Wrapper = (this._zeroEx as any)._web3Wrapper as Web3Wrapper;
|
||||||
for (const token of this._tokens) {
|
for (const token of this._tokens) {
|
||||||
if (token.symbol !== 'ZRX' && token.symbol !== 'WETH') {
|
if (token.symbol !== 'ZRX' && token.symbol !== 'WETH') {
|
||||||
const contractInstance = web3Wrapper.getContractInstance(
|
const defaults = {};
|
||||||
|
const dummyToken = new DummyTokenContract(
|
||||||
artifacts.DummyTokenArtifact.abi,
|
artifacts.DummyTokenArtifact.abi,
|
||||||
token.address,
|
token.address,
|
||||||
|
web3Wrapper.getProvider(),
|
||||||
|
web3Wrapper.getContractDefaults(),
|
||||||
);
|
);
|
||||||
const defaults = {};
|
|
||||||
const dummyToken = new DummyTokenContract(contractInstance, defaults);
|
|
||||||
const tokenSupply = ZeroEx.toBaseUnitAmount(INITIAL_COINBASE_TOKEN_SUPPLY_IN_UNITS, token.decimals);
|
const tokenSupply = ZeroEx.toBaseUnitAmount(INITIAL_COINBASE_TOKEN_SUPPLY_IN_UNITS, token.decimals);
|
||||||
const txHash = await dummyToken.setBalance.sendTransactionAsync(this._coinbase, tokenSupply, {
|
const txHash = await dummyToken.setBalance.sendTransactionAsync(this._coinbase, tokenSupply, {
|
||||||
from: this._coinbase,
|
from: this._coinbase,
|
||||||
|
6
packages/0x.js/test/utils/web3_wrapper.ts
Normal file
6
packages/0x.js/test/utils/web3_wrapper.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import { web3Factory } from '@0xproject/dev-utils';
|
||||||
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
|
import * as Web3 from 'web3';
|
||||||
|
|
||||||
|
export const web3 = web3Factory.create();
|
||||||
|
export const web3Wrapper = new Web3Wrapper(web3.currentProvider);
|
@@ -1,16 +1,7 @@
|
|||||||
{
|
{
|
||||||
"extends": "../../tsconfig",
|
"extends": "../../tsconfig",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "lib",
|
"outDir": "lib"
|
||||||
"noImplicitThis": false
|
|
||||||
},
|
},
|
||||||
"include": [
|
"include": ["./src/**/*", "./test/**/*"]
|
||||||
"./src/**/*",
|
|
||||||
"./test/**/*",
|
|
||||||
"../../node_modules/types-bn/index.d.ts",
|
|
||||||
"../../node_modules/types-ethereumjs-util/index.d.ts",
|
|
||||||
"../../node_modules/web3-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/chai-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/chai-as-promised-typescript-typings/index.d.ts"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
@@ -3,3 +3,4 @@ yarn-error.log
|
|||||||
/src/
|
/src/
|
||||||
/scripts/
|
/scripts/
|
||||||
tsconfig.json
|
tsconfig.json
|
||||||
|
/lib/monorepo_scripts/
|
||||||
|
102
packages/abi-gen/CHANGELOG.json
Normal file
102
packages/abi-gen/CHANGELOG.json
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1523462196,
|
||||||
|
"version": "0.2.10",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1522673609,
|
||||||
|
"version": "0.2.9",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1522658513,
|
||||||
|
"version": "0.2.8",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package",
|
||||||
|
"pr": 452
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1521298800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add a `backend` parameter that allows you to specify the Ethereum library you use in your templates (`web3` or `ethers`). Ethers auto-converts small ints to numbers whereas Web3 doesn't. Defaults to `web3`",
|
||||||
|
"pr": 413
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Add support for [tuple types](https://solidity.readthedocs.io/en/develop/abi-spec.html#handling-tuple-types)",
|
||||||
|
"pr": 413
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add `hasReturnValue` to context data",
|
||||||
|
"pr": 413
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520089200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
|
||||||
|
"pr": 389
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1518102000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Added CLI options for explicit specifying location of partials and main template",
|
||||||
|
"pr": 346
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Added CLI option to specify networkId, adding support for the JSON artifact format found in @0xproject/contracts",
|
||||||
|
"pr": 388
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1517929200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fixed array typings with union types",
|
||||||
|
"pr": 295
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add event ABIs to context data passed to templates",
|
||||||
|
"pr": 302
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add constructor ABIs to context data passed to templates",
|
||||||
|
"pr": 304
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1515596400
|
||||||
|
}
|
||||||
|
]
|
@@ -1,15 +1,42 @@
|
|||||||
# CHANGELOG
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
## v0.2.1 - _February 9, 2018_
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.2.10 - _April 11, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.9 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.8 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.5 - _March 17, 2018_
|
||||||
|
|
||||||
|
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
|
||||||
|
|
||||||
|
## v0.2.4 - _March 3, 2018_
|
||||||
|
|
||||||
|
* Add a `backend` parameter that allows you to specify the Ethereum library you use in your templates (`web3` or `ethers`). Ethers auto-converts small ints to numbers whereas Web3 doesn't. Defaults to `web3` (#413)
|
||||||
|
* Add support for [tuple types](https://solidity.readthedocs.io/en/develop/abi-spec.html#handling-tuple-types) (#413)
|
||||||
|
* Add `hasReturnValue` to context data (#413)
|
||||||
|
|
||||||
|
## v0.2.1 - _February 8, 2018_
|
||||||
|
|
||||||
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
||||||
|
|
||||||
## v0.2.0 - _February 7, 2018_
|
## v0.2.0 - _February 6, 2018_
|
||||||
|
|
||||||
* Added CLI options for explicit specifying location of partials and main template (#346)
|
* Added CLI options for explicit specifying location of partials and main template (#346)
|
||||||
* Added CLI option to specify networkId, adding support for the JSON artifact format found in @0xproject/contracts (#388)
|
* Added CLI option to specify networkId, adding support for the JSON artifact format found in @0xproject/contracts (#388)
|
||||||
|
|
||||||
## v0.1.0 - _January 11, 2018_
|
## v0.1.0 - _January 10, 2018_
|
||||||
|
|
||||||
* Fixed array typings with union types (#295)
|
* Fixed array typings with union types (#295)
|
||||||
* Add event ABIs to context data passed to templates (#302)
|
* Add event ABIs to context data passed to templates (#302)
|
||||||
|
@@ -4,8 +4,8 @@ This package allows you to generate TypeScript contract wrappers from ABI files.
|
|||||||
It's heavily inspired by [Geth abigen](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) but takes a different approach.
|
It's heavily inspired by [Geth abigen](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) but takes a different approach.
|
||||||
You can write your custom handlebars templates which will allow you to seamlessly integrate the generated code into your existing codebase with existing conventions.
|
You can write your custom handlebars templates which will allow you to seamlessly integrate the generated code into your existing codebase with existing conventions.
|
||||||
|
|
||||||
For an example of the generated [wrapper files](https://github.com/0xProject/0x.js/tree/development/packages/0x.js/src/contract_wrappers/generated) check out 0x.js.
|
For an example of the generated [wrapper files](https://github.com/0xProject/0x-monorepo/tree/development/packages/0x.js/src/contract_wrappers/generated) check out 0x.js.
|
||||||
[Here](https://github.com/0xProject/0x.js/tree/development/packages/0x.js/contract_templates) are the templates used to generate those files.
|
[Here](https://github.com/0xProject/0x-monorepo/tree/development/packages/0x.js/contract_templates) are the templates used to generate those files.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -16,35 +16,102 @@ For an example of the generated [wrapper files](https://github.com/0xProject/0x.
|
|||||||
```
|
```
|
||||||
abi-gen
|
abi-gen
|
||||||
Options:
|
Options:
|
||||||
--help Show help [boolean]
|
--help Show help [boolean]
|
||||||
--version Show version number [boolean]
|
--version Show version number [boolean]
|
||||||
--abiGlob Glob pattern to search for ABI JSON files [string] [required]
|
--abis Glob pattern to search for ABI JSON files
|
||||||
--templates Folder where to search for templates [string] [required]
|
[string] [required]
|
||||||
--output Folder where to put the output files [string] [required]
|
--output, -o, --out Folder where to put the output files [string] [required]
|
||||||
|
--partials Glob pattern for the partial template files [string]
|
||||||
|
--template Path for the main template file that will be used to
|
||||||
|
generate each contract [string] [required]
|
||||||
|
--backend The backing Ethereum library your app uses. Either 'web3'
|
||||||
|
or 'ethers'. Ethers auto-converts small ints to numbers
|
||||||
|
whereas Web3 doesn't.
|
||||||
|
[string] [choices: "web3", "ethers"] [default: "web3"]
|
||||||
|
--network-id ID of the network where contract ABIs are nested in
|
||||||
|
artifacts [number] [default: 50]
|
||||||
```
|
```
|
||||||
|
|
||||||
## ABI files
|
|
||||||
|
|
||||||
You're required to pass a [glob](<https://en.wikipedia.org/wiki/Glob_(programming)>) template where your abi files are located.
|
You're required to pass a [glob](<https://en.wikipedia.org/wiki/Glob_(programming)>) template where your abi files are located.
|
||||||
TL;DR - here is the example from 0x.js.
|
TL;DR - here is the example from 0x.js.
|
||||||
|
|
||||||
`--abiGlob 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry).json`
|
`--abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry).json`
|
||||||
|
|
||||||
We could've just used `--abiGlob 'src/artifacts/*.json` but we wanted to exclude some of the abi files.
|
We could've just used `--abis 'src/artifacts/*.json` but we wanted to exclude some of the abi files.
|
||||||
|
|
||||||
The abi file should be either a [Truffle](http://truffleframework.com/) contract artifact (a JSON object with an abi key) or a JSON abi array.
|
The abi file should be either a [Truffle](http://truffleframework.com/) contract artifact (a JSON object with an abi key) or a JSON abi array.
|
||||||
|
|
||||||
|
You need to also specify the location of your main template used for every contract `--template` as well as the partial templates `--partials` that can later be used from the main one.
|
||||||
|
|
||||||
## How to write custom templates?
|
## How to write custom templates?
|
||||||
|
|
||||||
The best way to get started is to copy [0x.js templates](https://github.com/0xProject/0x.js/tree/development/packages/0x.js/contract_templates) and start adjusting them for your needs.
|
The best way to get started is to copy [0x.js templates](https://github.com/0xProject/0x-monorepo/tree/development/packages/0x.js/contract_templates) and start adjusting them for your needs.
|
||||||
We use [handlebars](http://handlebarsjs.com/) template engine under the hood.
|
We use [handlebars](http://handlebarsjs.com/) template engine under the hood.
|
||||||
You need to have a master template called `contract.mustache`. it will be used to generate each contract wrapper. Although - you don't need and probably shouldn't write all your logic in a single template file. You can write [partial templates](http://handlebarsjs.com/partials.html) and as long as they are within a partials folder - they will be registered and available.
|
You need to have a master template called `contract.mustache`. it will be used to generate each contract wrapper. Although - you don't need and probably shouldn't write all your logic in a single template file. You can write [partial templates](http://handlebarsjs.com/partials.html) and as long as they are within a partials folder - they will be registered and available.
|
||||||
|
|
||||||
## Which data/context do I get in my templates?
|
## Which data/context do I get in my templates?
|
||||||
|
|
||||||
For now you don't get much on top of methods abi, some useful helpers and a contract name because it was enough for our use-case, but if you need something else - create a PR.
|
For now you don't get much on top of methods abi, some useful helpers and a contract name because it was enough for our use-case, but if you need something else - create a PR.
|
||||||
See the [type definition](https://github.com/0xProject/0x.js/tree/development/packages/abi-gen/src/types.ts) of what we pass to the render method.
|
See the [type definition](https://github.com/0xProject/0x-monorepo/tree/development/packages/abi-gen/src/types.ts) of what we pass to the render method.
|
||||||
|
|
||||||
## Output files
|
## Output files
|
||||||
|
|
||||||
Output files will be generated within an output folder with names converted to camel case and taken from abi file names. If you already have some files in that folder they will be overwritten.
|
Output files will be generated within an output folder with names converted to camel case and taken from abi file names. If you already have some files in that folder they will be overwritten.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
|
||||||
|
|
||||||
|
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
||||||
|
|
||||||
|
### Install dependencies
|
||||||
|
|
||||||
|
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn config set workspaces-experimental true
|
||||||
|
```
|
||||||
|
|
||||||
|
Then install dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn lerna:rebuild
|
||||||
|
```
|
||||||
|
|
||||||
|
Or continuously rebuild on change:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also build this specific package by running the following from within its directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
or continuously rebuild on change:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:watch
|
||||||
|
```
|
||||||
|
|
||||||
|
### Clean
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn clean
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lint
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn lint
|
||||||
|
```
|
||||||
|
@@ -1,49 +1,55 @@
|
|||||||
{
|
{
|
||||||
"name": "@0xproject/abi-gen",
|
"name": "@0xproject/abi-gen",
|
||||||
"version": "0.2.1",
|
"version": "0.2.9",
|
||||||
"description": "Generate contract wrappers from ABI and handlebars templates",
|
"description": "Generate contract wrappers from ABI and handlebars templates",
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
"types": "lib/index.d.ts",
|
"types": "lib/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build:watch": "tsc -w",
|
"build:watch": "tsc -w",
|
||||||
"lint": "tslint --project . 'src/**/*.ts'",
|
"lint": "tslint --project . 'src/**/*.ts'",
|
||||||
"clean": "shx rm -rf lib",
|
"clean": "shx rm -rf lib scripts",
|
||||||
"build": "tsc"
|
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"abi-gen": "lib/index.js"
|
"abi-gen": "lib/index.js"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/0xProject/0x.js.git"
|
"url": "https://github.com/0xProject/0x-monorepo.git"
|
||||||
},
|
},
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/0xProject/0x.js/issues"
|
"url": "https://github.com/0xProject/0x-monorepo/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x.js/packages/abi-gen/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen/README.md",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0xproject/utils": "^0.3.2",
|
"@0xproject/types": "^0.5.0",
|
||||||
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
|
"@0xproject/utils": "^0.5.0",
|
||||||
"chalk": "^2.3.0",
|
"chalk": "^2.3.0",
|
||||||
"glob": "^7.1.2",
|
"glob": "^7.1.2",
|
||||||
"handlebars": "^4.0.11",
|
"handlebars": "^4.0.11",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"to-snake-case": "^1.0.0",
|
"to-snake-case": "^1.0.0",
|
||||||
"web3": "^0.20.0",
|
|
||||||
"yargs": "^10.0.3"
|
"yargs": "^10.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/tslint-config": "^0.4.8",
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
"@types/glob": "^5.0.33",
|
"@types/glob": "^5.0.33",
|
||||||
"@types/handlebars": "^4.0.36",
|
"@types/handlebars": "^4.0.36",
|
||||||
"@types/mkdirp": "^0.5.1",
|
"@types/mkdirp": "^0.5.1",
|
||||||
"@types/node": "^8.0.53",
|
"@types/node": "^8.0.53",
|
||||||
"@types/yargs": "^10.0.0",
|
"@types/yargs": "^10.0.0",
|
||||||
|
"copyfiles": "^1.2.0",
|
||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"tslint": "5.8.0",
|
"tslint": "5.8.0",
|
||||||
"typescript": "2.7.1",
|
"typescript": "2.7.1"
|
||||||
"web3-typescript-typings": "^0.9.10"
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +0,0 @@
|
|||||||
const postpublish_utils = require('../../../scripts/postpublish_utils');
|
|
||||||
const packageJSON = require('../package.json');
|
|
||||||
|
|
||||||
const subPackageName = packageJSON.name;
|
|
||||||
postpublish_utils.standardPostPublishAsync(subPackageName);
|
|
8
packages/abi-gen/src/globals.d.ts
vendored
8
packages/abi-gen/src/globals.d.ts
vendored
@@ -1,4 +1,6 @@
|
|||||||
declare function toSnakeCase(str: string): string;
|
declare module '*.json' {
|
||||||
declare module 'to-snake-case' {
|
const json: any;
|
||||||
export = toSnakeCase;
|
/* tslint:disable */
|
||||||
|
export default json;
|
||||||
|
/* tslint:enable */
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
import { AbiDefinition, ConstructorAbi, EventAbi, MethodAbi } from '@0xproject/types';
|
||||||
|
import { abiUtils, logUtils } from '@0xproject/utils';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import { sync as globSync } from 'glob';
|
import { sync as globSync } from 'glob';
|
||||||
@@ -9,15 +11,15 @@ import * as mkdirp from 'mkdirp';
|
|||||||
import * as yargs from 'yargs';
|
import * as yargs from 'yargs';
|
||||||
|
|
||||||
import toSnakeCase = require('to-snake-case');
|
import toSnakeCase = require('to-snake-case');
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { ContextData, ParamKind } from './types';
|
import { ContextData, ContractsBackend, Method, ParamKind } from './types';
|
||||||
import { utils } from './utils';
|
import { utils } from './utils';
|
||||||
|
|
||||||
const ABI_TYPE_CONSTRUCTOR = 'constructor';
|
const ABI_TYPE_CONSTRUCTOR = 'constructor';
|
||||||
const ABI_TYPE_METHOD = 'function';
|
const ABI_TYPE_METHOD = 'function';
|
||||||
const ABI_TYPE_EVENT = 'event';
|
const ABI_TYPE_EVENT = 'event';
|
||||||
const DEFAULT_NETWORK_ID = 50;
|
const DEFAULT_NETWORK_ID = 50;
|
||||||
|
const DEFAULT_BACKEND = 'web3';
|
||||||
|
|
||||||
const args = yargs
|
const args = yargs
|
||||||
.option('abis', {
|
.option('abis', {
|
||||||
@@ -43,6 +45,12 @@ const args = yargs
|
|||||||
demandOption: true,
|
demandOption: true,
|
||||||
normalize: true,
|
normalize: true,
|
||||||
})
|
})
|
||||||
|
.option('backend', {
|
||||||
|
describe: `The backing Ethereum library your app uses. Either 'web3' or 'ethers'. Ethers auto-converts small ints to numbers whereas Web3 doesn't.`,
|
||||||
|
type: 'string',
|
||||||
|
choices: [ContractsBackend.Web3, ContractsBackend.Ethers],
|
||||||
|
default: DEFAULT_BACKEND,
|
||||||
|
})
|
||||||
.option('network-id', {
|
.option('network-id', {
|
||||||
describe: 'ID of the network where contract ABIs are nested in artifacts',
|
describe: 'ID of the network where contract ABIs are nested in artifacts',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
@@ -55,7 +63,7 @@ const args = yargs
|
|||||||
|
|
||||||
function registerPartials(partialsGlob: string) {
|
function registerPartials(partialsGlob: string) {
|
||||||
const partialTemplateFileNames = globSync(partialsGlob);
|
const partialTemplateFileNames = globSync(partialsGlob);
|
||||||
utils.log(`Found ${chalk.green(`${partialTemplateFileNames.length}`)} ${chalk.bold('partial')} templates`);
|
logUtils.log(`Found ${chalk.green(`${partialTemplateFileNames.length}`)} ${chalk.bold('partial')} templates`);
|
||||||
for (const partialTemplateFileName of partialTemplateFileNames) {
|
for (const partialTemplateFileName of partialTemplateFileNames) {
|
||||||
const namedContent = utils.getNamedContent(partialTemplateFileName);
|
const namedContent = utils.getNamedContent(partialTemplateFileName);
|
||||||
Handlebars.registerPartial(namedContent.name, namedContent.content);
|
Handlebars.registerPartial(namedContent.name, namedContent.content);
|
||||||
@@ -70,12 +78,11 @@ function writeOutputFile(name: string, renderedTsCode: string): void {
|
|||||||
}
|
}
|
||||||
const filePath = `${args.output}/${fileName}.ts`;
|
const filePath = `${args.output}/${fileName}.ts`;
|
||||||
fs.writeFileSync(filePath, renderedTsCode);
|
fs.writeFileSync(filePath, renderedTsCode);
|
||||||
utils.log(`Created: ${chalk.bold(filePath)}`);
|
logUtils.log(`Created: ${chalk.bold(filePath)}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
Handlebars.registerHelper('parameterType', utils.solTypeToTsType.bind(utils, ParamKind.Input));
|
Handlebars.registerHelper('parameterType', utils.solTypeToTsType.bind(utils, ParamKind.Input, args.backend));
|
||||||
Handlebars.registerHelper('returnType', utils.solTypeToTsType.bind(utils, ParamKind.Output));
|
Handlebars.registerHelper('returnType', utils.solTypeToTsType.bind(utils, ParamKind.Output, args.backend));
|
||||||
|
|
||||||
if (args.partials) {
|
if (args.partials) {
|
||||||
registerPartials(args.partials);
|
registerPartials(args.partials);
|
||||||
}
|
}
|
||||||
@@ -84,17 +91,17 @@ const template = Handlebars.compile<ContextData>(mainTemplate.content);
|
|||||||
const abiFileNames = globSync(args.abis);
|
const abiFileNames = globSync(args.abis);
|
||||||
|
|
||||||
if (_.isEmpty(abiFileNames)) {
|
if (_.isEmpty(abiFileNames)) {
|
||||||
utils.log(`${chalk.red(`No ABI files found.`)}`);
|
logUtils.log(`${chalk.red(`No ABI files found.`)}`);
|
||||||
utils.log(`Please make sure you've passed the correct folder name and that the files have
|
logUtils.log(`Please make sure you've passed the correct folder name and that the files have
|
||||||
${chalk.bold('*.json')} extensions`);
|
${chalk.bold('*.json')} extensions`);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
} else {
|
} else {
|
||||||
utils.log(`Found ${chalk.green(`${abiFileNames.length}`)} ${chalk.bold('ABI')} files`);
|
logUtils.log(`Found ${chalk.green(`${abiFileNames.length}`)} ${chalk.bold('ABI')} files`);
|
||||||
mkdirp.sync(args.output);
|
mkdirp.sync(args.output);
|
||||||
}
|
}
|
||||||
for (const abiFileName of abiFileNames) {
|
for (const abiFileName of abiFileNames) {
|
||||||
const namedContent = utils.getNamedContent(abiFileName);
|
const namedContent = utils.getNamedContent(abiFileName);
|
||||||
utils.log(`Processing: ${chalk.bold(namedContent.name)}...`);
|
logUtils.log(`Processing: ${chalk.bold(namedContent.name)}...`);
|
||||||
const parsedContent = JSON.parse(namedContent.content);
|
const parsedContent = JSON.parse(namedContent.content);
|
||||||
let ABI;
|
let ABI;
|
||||||
if (_.isArray(parsedContent)) {
|
if (_.isArray(parsedContent)) {
|
||||||
@@ -105,35 +112,39 @@ for (const abiFileName of abiFileNames) {
|
|||||||
ABI = parsedContent.networks[args.networkId].abi; // 0x contracts package artifact
|
ABI = parsedContent.networks[args.networkId].abi; // 0x contracts package artifact
|
||||||
}
|
}
|
||||||
if (_.isUndefined(ABI)) {
|
if (_.isUndefined(ABI)) {
|
||||||
utils.log(`${chalk.red(`ABI not found in ${abiFileName}.`)}`);
|
logUtils.log(`${chalk.red(`ABI not found in ${abiFileName}.`)}`);
|
||||||
utils.log(
|
logUtils.log(
|
||||||
`Please make sure your ABI file is either an array with ABI entries or a truffle artifact or 0x deployer artifact`,
|
`Please make sure your ABI file is either an array with ABI entries or a truffle artifact or 0x deployer artifact`,
|
||||||
);
|
);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
let ctor = ABI.find((abi: Web3.AbiDefinition) => abi.type === ABI_TYPE_CONSTRUCTOR) as Web3.ConstructorAbi;
|
let ctor = ABI.find((abi: AbiDefinition) => abi.type === ABI_TYPE_CONSTRUCTOR) as ConstructorAbi;
|
||||||
if (_.isUndefined(ctor)) {
|
if (_.isUndefined(ctor)) {
|
||||||
ctor = utils.getEmptyConstructor(); // The constructor exists, but it's implicit in JSON's ABI definition
|
ctor = utils.getEmptyConstructor(); // The constructor exists, but it's implicit in JSON's ABI definition
|
||||||
}
|
}
|
||||||
|
|
||||||
const methodAbis = ABI.filter((abi: Web3.AbiDefinition) => abi.type === ABI_TYPE_METHOD) as Web3.MethodAbi[];
|
const methodAbis = ABI.filter((abi: AbiDefinition) => abi.type === ABI_TYPE_METHOD) as MethodAbi[];
|
||||||
const methodsData = _.map(methodAbis, methodAbi => {
|
const sanitizedMethodAbis = abiUtils.renameOverloadedMethods(methodAbis) as MethodAbi[];
|
||||||
_.map(methodAbi.inputs, (input, i: number) => {
|
const methodsData = _.map(methodAbis, (methodAbi, methodAbiIndex: number) => {
|
||||||
|
_.forEach(methodAbi.inputs, (input, inputIndex: number) => {
|
||||||
if (_.isEmpty(input.name)) {
|
if (_.isEmpty(input.name)) {
|
||||||
// Auto-generated getters don't have parameter names
|
// Auto-generated getters don't have parameter names
|
||||||
input.name = `index_${i}`;
|
input.name = `index_${inputIndex}`;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// This will make templates simpler
|
// This will make templates simpler
|
||||||
const methodData = {
|
const methodData = {
|
||||||
...methodAbi,
|
...methodAbi,
|
||||||
singleReturnValue: methodAbi.outputs.length === 1,
|
singleReturnValue: methodAbi.outputs.length === 1,
|
||||||
|
hasReturnValue: methodAbi.outputs.length !== 0,
|
||||||
|
tsName: sanitizedMethodAbis[methodAbiIndex].name,
|
||||||
|
functionSignature: abiUtils.getFunctionSignature(methodAbi),
|
||||||
};
|
};
|
||||||
return methodData;
|
return methodData;
|
||||||
});
|
});
|
||||||
|
|
||||||
const eventAbis = ABI.filter((abi: Web3.AbiDefinition) => abi.type === ABI_TYPE_EVENT) as Web3.EventAbi[];
|
const eventAbis = ABI.filter((abi: AbiDefinition) => abi.type === ABI_TYPE_EVENT) as EventAbi[];
|
||||||
|
|
||||||
const contextData = {
|
const contextData = {
|
||||||
contractName: namedContent.name,
|
contractName: namedContent.name,
|
||||||
|
8
packages/abi-gen/src/monorepo_scripts/postpublish.ts
Normal file
8
packages/abi-gen/src/monorepo_scripts/postpublish.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { postpublishUtils } from '@0xproject/monorepo-scripts';
|
||||||
|
|
||||||
|
import * as packageJSON from '../package.json';
|
||||||
|
import * as tsConfigJSON from '../tsconfig.json';
|
||||||
|
|
||||||
|
const cwd = `${__dirname}/..`;
|
||||||
|
// tslint:disable-next-line:no-floating-promises
|
||||||
|
postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
|
@@ -1,23 +1,24 @@
|
|||||||
import * as Web3 from 'web3';
|
import { EventAbi, MethodAbi } from '@0xproject/types';
|
||||||
|
|
||||||
export enum ParamKind {
|
export enum ParamKind {
|
||||||
Input = 'input',
|
Input = 'input',
|
||||||
Output = 'output',
|
Output = 'output',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum AbiType {
|
export enum ContractsBackend {
|
||||||
Function = 'function',
|
Web3 = 'web3',
|
||||||
Constructor = 'constructor',
|
Ethers = 'ethers',
|
||||||
Event = 'event',
|
|
||||||
Fallback = 'fallback',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Method extends Web3.MethodAbi {
|
export interface Method extends MethodAbi {
|
||||||
singleReturnValue: boolean;
|
singleReturnValue: boolean;
|
||||||
|
hasReturnValue: boolean;
|
||||||
|
tsName: string;
|
||||||
|
functionSignature: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ContextData {
|
export interface ContextData {
|
||||||
contractName: string;
|
contractName: string;
|
||||||
methods: Method[];
|
methods: Method[];
|
||||||
events: Web3.EventAbi[];
|
events: EventAbi[];
|
||||||
}
|
}
|
||||||
|
@@ -1,19 +1,20 @@
|
|||||||
|
import { AbiType, ConstructorAbi, DataItem } from '@0xproject/types';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as Web3 from 'web3';
|
|
||||||
|
|
||||||
import { AbiType, ParamKind } from './types';
|
import { ContractsBackend, ParamKind } from './types';
|
||||||
|
|
||||||
export const utils = {
|
export const utils = {
|
||||||
solTypeToTsType(paramKind: ParamKind, solType: string): string {
|
solTypeToTsType(paramKind: ParamKind, backend: ContractsBackend, solType: string, components?: DataItem[]): string {
|
||||||
const trailingArrayRegex = /\[\d*\]$/;
|
const trailingArrayRegex = /\[\d*\]$/;
|
||||||
if (solType.match(trailingArrayRegex)) {
|
if (solType.match(trailingArrayRegex)) {
|
||||||
const arrayItemSolType = solType.replace(trailingArrayRegex, '');
|
const arrayItemSolType = solType.replace(trailingArrayRegex, '');
|
||||||
const arrayItemTsType = utils.solTypeToTsType(paramKind, arrayItemSolType);
|
const arrayItemTsType = utils.solTypeToTsType(paramKind, backend, arrayItemSolType, components);
|
||||||
const arrayTsType = utils.isUnionType(arrayItemTsType)
|
const arrayTsType =
|
||||||
? `Array<${arrayItemTsType}>`
|
utils.isUnionType(arrayItemTsType) || utils.isObjectType(arrayItemTsType)
|
||||||
: `${arrayItemTsType}[]`;
|
? `Array<${arrayItemTsType}>`
|
||||||
|
: `${arrayItemTsType}[]`;
|
||||||
return arrayTsType;
|
return arrayTsType;
|
||||||
} else {
|
} else {
|
||||||
const solTypeRegexToTsType = [
|
const solTypeRegexToTsType = [
|
||||||
@@ -24,27 +25,48 @@ export const utils = {
|
|||||||
{ regex: '^bytes\\d*$', tsType: 'string' },
|
{ regex: '^bytes\\d*$', tsType: 'string' },
|
||||||
];
|
];
|
||||||
if (paramKind === ParamKind.Input) {
|
if (paramKind === ParamKind.Input) {
|
||||||
// web3 allows to pass those an non-bignumbers and that's nice
|
// web3 and ethers allow to pass those as numbers instead of bignumbers
|
||||||
// but it always returns stuff as BigNumbers
|
|
||||||
solTypeRegexToTsType.unshift({
|
solTypeRegexToTsType.unshift({
|
||||||
regex: '^u?int(8|16|32)?$',
|
regex: '^u?int(8|16|32)?$',
|
||||||
tsType: 'number|BigNumber',
|
tsType: 'number|BigNumber',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (backend === ContractsBackend.Ethers && paramKind === ParamKind.Output) {
|
||||||
|
// ethers-contracts automatically converts small BigNumbers to numbers
|
||||||
|
solTypeRegexToTsType.unshift({
|
||||||
|
regex: '^u?int(8|16|32|48)?$',
|
||||||
|
tsType: 'number',
|
||||||
|
});
|
||||||
|
}
|
||||||
for (const regexAndTxType of solTypeRegexToTsType) {
|
for (const regexAndTxType of solTypeRegexToTsType) {
|
||||||
const { regex, tsType } = regexAndTxType;
|
const { regex, tsType } = regexAndTxType;
|
||||||
if (solType.match(regex)) {
|
if (solType.match(regex)) {
|
||||||
return tsType;
|
return tsType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const TUPLE_TYPE_REGEX = '^tuple$';
|
||||||
|
if (solType.match(TUPLE_TYPE_REGEX)) {
|
||||||
|
const componentsType = _.map(components, component => {
|
||||||
|
const componentValueType = utils.solTypeToTsType(
|
||||||
|
paramKind,
|
||||||
|
backend,
|
||||||
|
component.type,
|
||||||
|
component.components,
|
||||||
|
);
|
||||||
|
const componentType = `${component.name}: ${componentValueType}`;
|
||||||
|
return componentType;
|
||||||
|
});
|
||||||
|
const tsType = `{${componentsType}}`;
|
||||||
|
return tsType;
|
||||||
|
}
|
||||||
throw new Error(`Unknown Solidity type found: ${solType}`);
|
throw new Error(`Unknown Solidity type found: ${solType}`);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
isUnionType(tsType: string): boolean {
|
isUnionType(tsType: string): boolean {
|
||||||
return tsType === 'number|BigNumber';
|
return tsType === 'number|BigNumber';
|
||||||
},
|
},
|
||||||
log(...args: any[]): void {
|
isObjectType(tsType: string): boolean {
|
||||||
console.log(...args); // tslint:disable-line:no-console
|
return /^{.*}$/.test(tsType);
|
||||||
},
|
},
|
||||||
getPartialNameFromFileName(filename: string): string {
|
getPartialNameFromFileName(filename: string): string {
|
||||||
const name = path.parse(filename).name;
|
const name = path.parse(filename).name;
|
||||||
@@ -62,7 +84,7 @@ export const utils = {
|
|||||||
throw new Error(`Failed to read ${filename}: ${err}`);
|
throw new Error(`Failed to read ${filename}: ${err}`);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getEmptyConstructor(): Web3.ConstructorAbi {
|
getEmptyConstructor(): ConstructorAbi {
|
||||||
return {
|
return {
|
||||||
type: AbiType.Constructor,
|
type: AbiType.Constructor,
|
||||||
stateMutability: 'nonpayable',
|
stateMutability: 'nonpayable',
|
||||||
|
@@ -3,5 +3,5 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "lib"
|
"outDir": "lib"
|
||||||
},
|
},
|
||||||
"include": ["./src/**/*", "./test/**/*", "../../node_modules/web3-typescript-typings/index.d.ts"]
|
"include": ["./src/**/*", "./test/**/*"]
|
||||||
}
|
}
|
||||||
|
@@ -4,3 +4,4 @@ yarn-error.log
|
|||||||
/scripts/
|
/scripts/
|
||||||
test/
|
test/
|
||||||
tsconfig.json
|
tsconfig.json
|
||||||
|
/lib/src/monorepo_scripts/
|
||||||
|
76
packages/assert/CHANGELOG.json
Normal file
76
packages/assert/CHANGELOG.json
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1523462196,
|
||||||
|
"version": "0.2.6",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1522673609,
|
||||||
|
"version": "0.2.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1522658513,
|
||||||
|
"version": "0.2.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Rename `isHttpUrl` to `isWebUri`",
|
||||||
|
"pr": 412
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520434800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Remove isETHAddressHex checksum address check and assume address will be lowercased ",
|
||||||
|
"pr": 373
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add an optional parameter `subSchemas` to `doesConformToSchema` method",
|
||||||
|
"pr": 385
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520089200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.0.18",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
|
||||||
|
"pr": 389
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1486566000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.0.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Re-publish Assert previously published under NPM package @0xproject/0x-assert"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note":
|
||||||
|
"Added assertion isValidBaseUnitAmount which checks both that the value is a valid bigNumber and that it does not contain decimals."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1510585200
|
||||||
|
}
|
||||||
|
]
|
@@ -1,10 +1,36 @@
|
|||||||
# CHANGELOG
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
## v0.0.18 - _February 9, 2017_
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.2.6 - _April 11, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.5 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.4 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.2.0 - _March 7, 2018_
|
||||||
|
|
||||||
|
* Rename `isHttpUrl` to `isWebUri` (#412)
|
||||||
|
|
||||||
|
## v0.1.0 - _March 3, 2018_
|
||||||
|
|
||||||
|
* Remove isETHAddressHex checksum address check and assume address will be lowercased (#373)
|
||||||
|
* Add an optional parameter `subSchemas` to `doesConformToSchema` method (#385)
|
||||||
|
|
||||||
|
## v0.0.18 - _February 8, 2017_
|
||||||
|
|
||||||
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
|
||||||
|
|
||||||
## v0.0.4 - _November 14, 2017_
|
## v0.0.4 - _November 13, 2017_
|
||||||
|
|
||||||
* Re-publish Assert previously published under NPM package @0xproject/0x-assert
|
* Re-publish Assert previously published under NPM package @0xproject/0x-assert
|
||||||
* Added assertion isValidBaseUnitAmount which checks both that the value is a valid bigNumber and that it does not contain decimals.
|
* Added assertion isValidBaseUnitAmount which checks both that the value is a valid bigNumber and that it does not contain decimals.
|
||||||
|
@@ -16,13 +16,21 @@ import { assert } from '@0xproject/assert';
|
|||||||
assert.isValidBaseUnitAmount('baseUnitAmount', baseUnitAmount);
|
assert.isValidBaseUnitAmount('baseUnitAmount', baseUnitAmount);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"compilerOptions": {
|
||||||
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
|
We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
|
||||||
|
|
||||||
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
||||||
|
|
||||||
### Install Dependencies
|
### Install dependencies
|
||||||
|
|
||||||
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
|
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
|
||||||
|
|
||||||
@@ -38,10 +46,36 @@ yarn install
|
|||||||
|
|
||||||
### Build
|
### Build
|
||||||
|
|
||||||
|
If this is your **first** time building this package, you must first build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn lerna:rebuild
|
||||||
|
```
|
||||||
|
|
||||||
|
Or continuously rebuild on change:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also build this specific package by running the following from within its directory:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn build
|
yarn build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
or continuously rebuild on change:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:watch
|
||||||
|
```
|
||||||
|
|
||||||
|
### Clean
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn clean
|
||||||
|
```
|
||||||
|
|
||||||
### Lint
|
### Lint
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
0
packages/assert/coverage/.gitkeep
Normal file
0
packages/assert/coverage/.gitkeep
Normal file
@@ -1,46 +1,55 @@
|
|||||||
{
|
{
|
||||||
"name": "@0xproject/assert",
|
"name": "@0xproject/assert",
|
||||||
"version": "0.0.18",
|
"version": "0.2.5",
|
||||||
"description": "Provides a standard way of performing type and schema validation across 0x projects",
|
"description": "Provides a standard way of performing type and schema validation across 0x projects",
|
||||||
"main": "lib/src/index.js",
|
"main": "lib/src/index.js",
|
||||||
"types": "lib/src/index.d.ts",
|
"types": "lib/src/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build:watch": "tsc -w",
|
"build:watch": "tsc -w",
|
||||||
"build": "tsc",
|
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
|
||||||
"clean": "shx rm -rf _bundles lib test_temp",
|
"clean": "shx rm -rf lib test_temp scripts",
|
||||||
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
||||||
"run_mocha": "mocha lib/test/**/*_test.js",
|
"run_mocha": "mocha lib/test/**/*_test.js",
|
||||||
"prepublishOnly": "run-p build",
|
"prepublishOnly": "run-p build",
|
||||||
"test": "run-s clean build run_mocha",
|
"test": "run-s clean build run_mocha",
|
||||||
"test:circleci": "yarn test"
|
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
||||||
|
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
||||||
|
"test:circleci": "yarn test:coverage",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
|
||||||
},
|
},
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/0xProject/0x.js.git"
|
"url": "https://github.com/0xProject/0x-monorepo.git"
|
||||||
},
|
},
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/0xProject/0x.js/issues"
|
"url": "https://github.com/0xProject/0x-monorepo/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/0x.js/packages/assert/README.md",
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/assert/README.md",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0xproject/tslint-config": "^0.4.8",
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
"@types/lodash": "^4.14.86",
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
|
"@types/lodash": "4.14.104",
|
||||||
"@types/mocha": "^2.2.42",
|
"@types/mocha": "^2.2.42",
|
||||||
"@types/valid-url": "^1.0.2",
|
"@types/valid-url": "^1.0.2",
|
||||||
"chai": "^4.0.1",
|
"chai": "^4.0.1",
|
||||||
"chai-typescript-typings": "^0.0.3",
|
"copyfiles": "^1.2.0",
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
"mocha": "^4.0.1",
|
"mocha": "^4.0.1",
|
||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
|
"nyc": "^11.0.1",
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"tslint": "5.8.0",
|
"tslint": "5.8.0",
|
||||||
"typescript": "2.7.1"
|
"typescript": "2.7.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0xproject/json-schemas": "^0.7.10",
|
"@0xproject/json-schemas": "^0.7.19",
|
||||||
"@0xproject/utils": "^0.3.2",
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
|
"@0xproject/utils": "^0.5.0",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"valid-url": "^1.0.9"
|
"valid-url": "^1.0.9"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +0,0 @@
|
|||||||
const postpublish_utils = require('../../../scripts/postpublish_utils');
|
|
||||||
const packageJSON = require('../package.json');
|
|
||||||
|
|
||||||
const subPackageName = packageJSON.name;
|
|
||||||
postpublish_utils.standardPostPublishAsync(subPackageName);
|
|
7
packages/assert/src/globals.d.ts
vendored
7
packages/assert/src/globals.d.ts
vendored
@@ -1 +1,6 @@
|
|||||||
declare module 'dirty-chai';
|
declare module '*.json' {
|
||||||
|
const json: any;
|
||||||
|
/* tslint:disable */
|
||||||
|
export default json;
|
||||||
|
/* tslint:enable */
|
||||||
|
}
|
||||||
|
@@ -33,11 +33,8 @@ export const assert = {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
isETHAddressHex(variableName: string, value: string): void {
|
isETHAddressHex(variableName: string, value: string): void {
|
||||||
|
this.assert(_.isString(value), this.typeAssertionMessage(variableName, 'string', value));
|
||||||
this.assert(addressUtils.isAddress(value), this.typeAssertionMessage(variableName, 'ETHAddressHex', value));
|
this.assert(addressUtils.isAddress(value), this.typeAssertionMessage(variableName, 'ETHAddressHex', value));
|
||||||
this.assert(
|
|
||||||
addressUtils.isAddress(value) && value.toLowerCase() === value,
|
|
||||||
`Checksummed addresses are not supported. Convert ${variableName} to lower case before passing`,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
doesBelongToStringEnum(
|
doesBelongToStringEnum(
|
||||||
variableName: string,
|
variableName: string,
|
||||||
@@ -64,10 +61,13 @@ export const assert = {
|
|||||||
},
|
},
|
||||||
isWeb3Provider(variableName: string, value: any): void {
|
isWeb3Provider(variableName: string, value: any): void {
|
||||||
const isWeb3Provider = _.isFunction(value.send) || _.isFunction(value.sendAsync);
|
const isWeb3Provider = _.isFunction(value.send) || _.isFunction(value.sendAsync);
|
||||||
this.assert(isWeb3Provider, this.typeAssertionMessage(variableName, 'Web3.Provider', value));
|
this.assert(isWeb3Provider, this.typeAssertionMessage(variableName, 'Provider', value));
|
||||||
},
|
},
|
||||||
doesConformToSchema(variableName: string, value: any, schema: Schema): void {
|
doesConformToSchema(variableName: string, value: any, schema: Schema, subSchemas?: Schema[]): void {
|
||||||
const schemaValidator = new SchemaValidator();
|
const schemaValidator = new SchemaValidator();
|
||||||
|
if (!_.isUndefined(subSchemas)) {
|
||||||
|
_.map(subSchemas, schemaValidator.addSchema.bind(schemaValidator));
|
||||||
|
}
|
||||||
const validationResult = schemaValidator.validate(value, schema);
|
const validationResult = schemaValidator.validate(value, schema);
|
||||||
const hasValidationErrors = validationResult.errors.length > 0;
|
const hasValidationErrors = validationResult.errors.length > 0;
|
||||||
const msg = `Expected ${variableName} to conform to schema ${schema.id}
|
const msg = `Expected ${variableName} to conform to schema ${schema.id}
|
||||||
@@ -75,9 +75,9 @@ Encountered: ${JSON.stringify(value, null, '\t')}
|
|||||||
Validation errors: ${validationResult.errors.join(', ')}`;
|
Validation errors: ${validationResult.errors.join(', ')}`;
|
||||||
this.assert(!hasValidationErrors, msg);
|
this.assert(!hasValidationErrors, msg);
|
||||||
},
|
},
|
||||||
isHttpUrl(variableName: string, value: any): void {
|
isWebUri(variableName: string, value: any): void {
|
||||||
const isValidUrl = !_.isUndefined(validUrl.isWebUri(value));
|
const isValidUrl = !_.isUndefined(validUrl.isWebUri(value));
|
||||||
this.assert(isValidUrl, this.typeAssertionMessage(variableName, 'http url', value));
|
this.assert(isValidUrl, this.typeAssertionMessage(variableName, 'web uri', value));
|
||||||
},
|
},
|
||||||
isUri(variableName: string, value: any): void {
|
isUri(variableName: string, value: any): void {
|
||||||
const isValidUri = !_.isUndefined(validUrl.isUri(value));
|
const isValidUri = !_.isUndefined(validUrl.isUri(value));
|
||||||
|
8
packages/assert/src/monorepo_scripts/postpublish.ts
Normal file
8
packages/assert/src/monorepo_scripts/postpublish.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { postpublishUtils } from '@0xproject/monorepo-scripts';
|
||||||
|
|
||||||
|
import * as packageJSON from '../package.json';
|
||||||
|
import * as tsConfigJSON from '../tsconfig.json';
|
||||||
|
|
||||||
|
const cwd = `${__dirname}/..`;
|
||||||
|
// tslint:disable-next-line:no-floating-promises
|
||||||
|
postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
|
@@ -183,7 +183,7 @@ describe('Assertions', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('#isHttpUrl', () => {
|
describe('#isWebUri', () => {
|
||||||
it('should not throw for valid input', () => {
|
it('should not throw for valid input', () => {
|
||||||
const validInputs = [
|
const validInputs = [
|
||||||
'http://www.google.com',
|
'http://www.google.com',
|
||||||
@@ -191,7 +191,7 @@ describe('Assertions', () => {
|
|||||||
'https://api.radarrelay.com/0x/v0/',
|
'https://api.radarrelay.com/0x/v0/',
|
||||||
'https://zeroex.beta.radarrelay.com:8000/0x/v0/',
|
'https://zeroex.beta.radarrelay.com:8000/0x/v0/',
|
||||||
];
|
];
|
||||||
validInputs.forEach(input => expect(assert.isHttpUrl.bind(assert, variableName, input)).to.not.throw());
|
validInputs.forEach(input => expect(assert.isWebUri.bind(assert, variableName, input)).to.not.throw());
|
||||||
});
|
});
|
||||||
it('should throw for invalid input', () => {
|
it('should throw for invalid input', () => {
|
||||||
const invalidInputs = [
|
const invalidInputs = [
|
||||||
@@ -205,7 +205,7 @@ describe('Assertions', () => {
|
|||||||
'user:password@api.example-relayer.net',
|
'user:password@api.example-relayer.net',
|
||||||
'//api.example-relayer.net',
|
'//api.example-relayer.net',
|
||||||
];
|
];
|
||||||
invalidInputs.forEach(input => expect(assert.isHttpUrl.bind(assert, variableName, input)).to.throw());
|
invalidInputs.forEach(input => expect(assert.isWebUri.bind(assert, variableName, input)).to.throw());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('#isUri', () => {
|
describe('#isUri', () => {
|
||||||
|
@@ -3,10 +3,5 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "lib"
|
"outDir": "lib"
|
||||||
},
|
},
|
||||||
"include": [
|
"include": ["./src/**/*", "./test/**/*"]
|
||||||
"./src/**/*",
|
|
||||||
"./test/**/*",
|
|
||||||
"../../node_modules/web3-typescript-typings/index.d.ts",
|
|
||||||
"../../node_modules/chai-typescript-typings/index.d.ts"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
6
packages/base-contract/.npmignore
Normal file
6
packages/base-contract/.npmignore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
.*
|
||||||
|
yarn-error.log
|
||||||
|
/scripts/
|
||||||
|
/src/
|
||||||
|
tsconfig.json
|
||||||
|
/lib/monorepo_scripts/
|
48
packages/base-contract/CHANGELOG.json
Normal file
48
packages/base-contract/CHANGELOG.json
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Contract wrappers now accept Provider and defaults instead of Web3Wrapper",
|
||||||
|
"pr": 501
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1523462196
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add tests for traversing ABI tree",
|
||||||
|
"pr": 485
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fix ABI tuples traversing",
|
||||||
|
"pr": 485
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Fix ABI arrays traversing",
|
||||||
|
"pr": 485
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1522673609
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1522658513,
|
||||||
|
"version": "0.0.6",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.0.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Initial release"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1520089200
|
||||||
|
}
|
||||||
|
]
|
24
packages/base-contract/CHANGELOG.md
Normal file
24
packages/base-contract/CHANGELOG.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<!--
|
||||||
|
This file is auto-generated using the monorepo-scripts package. Don't edit directly.
|
||||||
|
Edit the package's CHANGELOG.json file only.
|
||||||
|
-->
|
||||||
|
|
||||||
|
CHANGELOG
|
||||||
|
|
||||||
|
## v0.2.0 - _April 11, 2018_
|
||||||
|
|
||||||
|
* Contract wrappers now accept Provider and defaults instead of Web3Wrapper (#501)
|
||||||
|
|
||||||
|
## v0.1.0 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Add tests for traversing ABI tree (#485)
|
||||||
|
* Fix ABI tuples traversing (#485)
|
||||||
|
* Fix ABI arrays traversing (#485)
|
||||||
|
|
||||||
|
## v0.0.6 - _April 2, 2018_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v0.0.2 - _March 3, 2018_
|
||||||
|
|
||||||
|
* Initial release
|
61
packages/base-contract/README.md
Normal file
61
packages/base-contract/README.md
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
## @0xproject/base-contract
|
||||||
|
|
||||||
|
BaseContract to derive all auto-generated wrappers from
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn add @0xproject/base-contract
|
||||||
|
```
|
||||||
|
|
||||||
|
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"compilerOptions": {
|
||||||
|
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { BaseContract } from '@0xproject/base-contract';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
|
||||||
|
|
||||||
|
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
||||||
|
|
||||||
|
### Install Dependencies
|
||||||
|
|
||||||
|
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn config set workspaces-experimental true
|
||||||
|
```
|
||||||
|
|
||||||
|
Then install dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build:watch
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lint
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn lint
|
||||||
|
```
|
0
packages/base-contract/coverage/.gitkeep
Normal file
0
packages/base-contract/coverage/.gitkeep
Normal file
51
packages/base-contract/package.json
Normal file
51
packages/base-contract/package.json
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"name": "@0xproject/base-contract",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "0x Base TS contract",
|
||||||
|
"main": "lib/src/index.js",
|
||||||
|
"types": "lib/src/index.d.ts",
|
||||||
|
"scripts": {
|
||||||
|
"build:watch": "tsc -w",
|
||||||
|
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
|
||||||
|
"clean": "shx rm -rf lib scripts",
|
||||||
|
"test": "run-s clean build run_mocha",
|
||||||
|
"test:circleci": "yarn test:coverage",
|
||||||
|
"run_mocha": "mocha lib/test/**/*_test.js --bail --exit",
|
||||||
|
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
|
||||||
|
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
|
||||||
|
"lint": "tslint --project .",
|
||||||
|
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
|
||||||
|
},
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/0xProject/0x-monorepo.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/0xProject/0x-monorepo/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/0xProject/0x-monorepo/packages/base-contract/README.md",
|
||||||
|
"devDependencies": {
|
||||||
|
"@0xproject/monorepo-scripts": "^0.1.16",
|
||||||
|
"@0xproject/tslint-config": "^0.4.14",
|
||||||
|
"@types/lodash": "4.14.104",
|
||||||
|
"chai": "^4.0.1",
|
||||||
|
"copyfiles": "^1.2.0",
|
||||||
|
"mocha": "^4.0.1",
|
||||||
|
"npm-run-all": "^4.1.2",
|
||||||
|
"shx": "^0.2.2",
|
||||||
|
"tslint": "5.8.0",
|
||||||
|
"typescript": "2.7.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@0xproject/types": "^0.5.0",
|
||||||
|
"@0xproject/typescript-typings": "^0.0.3",
|
||||||
|
"@0xproject/utils": "^0.5.0",
|
||||||
|
"@0xproject/web3-wrapper": "^0.5.0",
|
||||||
|
"ethers-contracts": "^2.2.1",
|
||||||
|
"lodash": "^4.17.4"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
}
|
||||||
|
}
|
6
packages/base-contract/src/globals.d.ts
vendored
Normal file
6
packages/base-contract/src/globals.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
declare module '*.json' {
|
||||||
|
const json: any;
|
||||||
|
/* tslint:disable */
|
||||||
|
export default json;
|
||||||
|
/* tslint:enable */
|
||||||
|
}
|
98
packages/base-contract/src/index.ts
Normal file
98
packages/base-contract/src/index.ts
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
import {
|
||||||
|
AbiDefinition,
|
||||||
|
AbiType,
|
||||||
|
ContractAbi,
|
||||||
|
DataItem,
|
||||||
|
MethodAbi,
|
||||||
|
Provider,
|
||||||
|
TxData,
|
||||||
|
TxDataPayable,
|
||||||
|
} from '@0xproject/types';
|
||||||
|
import { abiUtils, BigNumber } from '@0xproject/utils';
|
||||||
|
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||||
|
import * as ethersContracts from 'ethers-contracts';
|
||||||
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
|
import { formatABIDataItem } from './utils';
|
||||||
|
|
||||||
|
export interface EthersInterfaceByFunctionSignature {
|
||||||
|
[key: string]: ethersContracts.Interface;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class BaseContract {
|
||||||
|
protected _ethersInterfacesByFunctionSignature: EthersInterfaceByFunctionSignature;
|
||||||
|
protected _web3Wrapper: Web3Wrapper;
|
||||||
|
public abi: ContractAbi;
|
||||||
|
public address: string;
|
||||||
|
protected static _formatABIDataItemList(
|
||||||
|
abis: DataItem[],
|
||||||
|
values: any[],
|
||||||
|
formatter: (type: string, value: any) => any,
|
||||||
|
): any {
|
||||||
|
return _.map(values, (value: any, i: number) => formatABIDataItem(abis[i], value, formatter));
|
||||||
|
}
|
||||||
|
protected static _lowercaseAddress(type: string, value: string): string {
|
||||||
|
return type === 'address' ? value.toLowerCase() : value;
|
||||||
|
}
|
||||||
|
protected static _bigNumberToString(type: string, value: any): any {
|
||||||
|
return _.isObject(value) && value.isBigNumber ? value.toString() : value;
|
||||||
|
}
|
||||||
|
protected static _bnToBigNumber(type: string, value: any): any {
|
||||||
|
return _.isObject(value) && value._bn ? new BigNumber(value.toString()) : value;
|
||||||
|
}
|
||||||
|
protected async _applyDefaultsToTxDataAsync<T extends Partial<TxData | TxDataPayable>>(
|
||||||
|
txData: T,
|
||||||
|
estimateGasAsync?: (txData: T) => Promise<number>,
|
||||||
|
): Promise<TxData> {
|
||||||
|
// Gas amount sourced with the following priorities:
|
||||||
|
// 1. Optional param passed in to public method call
|
||||||
|
// 2. Global config passed in at library instantiation
|
||||||
|
// 3. Gas estimate calculation + safety margin
|
||||||
|
const removeUndefinedProperties = _.pickBy;
|
||||||
|
const txDataWithDefaults = ({
|
||||||
|
to: this.address,
|
||||||
|
...removeUndefinedProperties(this._web3Wrapper.getContractDefaults()),
|
||||||
|
...removeUndefinedProperties(txData as any),
|
||||||
|
// HACK: TS can't prove that T is spreadable.
|
||||||
|
// Awaiting https://github.com/Microsoft/TypeScript/pull/13288 to be merged
|
||||||
|
} as any) as TxData;
|
||||||
|
if (_.isUndefined(txDataWithDefaults.gas) && !_.isUndefined(estimateGasAsync)) {
|
||||||
|
const estimatedGas = await estimateGasAsync(txData);
|
||||||
|
txDataWithDefaults.gas = estimatedGas;
|
||||||
|
}
|
||||||
|
return txDataWithDefaults;
|
||||||
|
}
|
||||||
|
protected _lookupEthersInterface(functionSignature: string): ethersContracts.Interface {
|
||||||
|
const ethersInterface = this._ethersInterfacesByFunctionSignature[functionSignature];
|
||||||
|
if (_.isUndefined(ethersInterface)) {
|
||||||
|
throw new Error(`Failed to lookup method with function signature '${functionSignature}'`);
|
||||||
|
}
|
||||||
|
return ethersInterface;
|
||||||
|
}
|
||||||
|
protected _lookupAbi(functionSignature: string): MethodAbi {
|
||||||
|
const methodAbi = _.find(this.abi, (abiDefinition: AbiDefinition) => {
|
||||||
|
if (abiDefinition.type !== AbiType.Function) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const abiFunctionSignature = abiUtils.getFunctionSignature(abiDefinition);
|
||||||
|
if (abiFunctionSignature === functionSignature) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}) as MethodAbi;
|
||||||
|
return methodAbi;
|
||||||
|
}
|
||||||
|
constructor(abi: ContractAbi, address: string, provider: Provider, defaults?: Partial<TxData>) {
|
||||||
|
this._web3Wrapper = new Web3Wrapper(provider, defaults);
|
||||||
|
this.abi = abi;
|
||||||
|
this.address = address;
|
||||||
|
const methodAbis = this.abi.filter(
|
||||||
|
(abiDefinition: AbiDefinition) => abiDefinition.type === AbiType.Function,
|
||||||
|
) as MethodAbi[];
|
||||||
|
this._ethersInterfacesByFunctionSignature = {};
|
||||||
|
_.each(methodAbis, methodAbi => {
|
||||||
|
const functionSignature = abiUtils.getFunctionSignature(methodAbi);
|
||||||
|
this._ethersInterfacesByFunctionSignature[functionSignature] = new ethersContracts.Interface([methodAbi]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,8 @@
|
|||||||
|
import { postpublishUtils } from '@0xproject/monorepo-scripts';
|
||||||
|
|
||||||
|
import * as packageJSON from '../package.json';
|
||||||
|
import * as tsConfigJSON from '../tsconfig.json';
|
||||||
|
|
||||||
|
const cwd = `${__dirname}/..`;
|
||||||
|
// tslint:disable-next-line:no-floating-promises
|
||||||
|
postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
|
25
packages/base-contract/src/utils.ts
Normal file
25
packages/base-contract/src/utils.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import { DataItem } from '@0xproject/types';
|
||||||
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
|
// tslint:disable-next-line:completed-docs
|
||||||
|
export function formatABIDataItem(abi: DataItem, value: any, formatter: (type: string, value: any) => any): any {
|
||||||
|
const trailingArrayRegex = /\[\d*\]$/;
|
||||||
|
if (abi.type.match(trailingArrayRegex)) {
|
||||||
|
const arrayItemType = abi.type.replace(trailingArrayRegex, '');
|
||||||
|
return _.map(value, val => {
|
||||||
|
const arrayItemAbi = {
|
||||||
|
...abi,
|
||||||
|
type: arrayItemType,
|
||||||
|
};
|
||||||
|
return formatABIDataItem(arrayItemAbi, val, formatter);
|
||||||
|
});
|
||||||
|
} else if (abi.type === 'tuple') {
|
||||||
|
const formattedTuple: { [componentName: string]: DataItem } = {};
|
||||||
|
_.forEach(abi.components, componentABI => {
|
||||||
|
formattedTuple[componentABI.name] = formatABIDataItem(componentABI, value[componentABI.name], formatter);
|
||||||
|
});
|
||||||
|
return formattedTuple;
|
||||||
|
} else {
|
||||||
|
return formatter(abi.type, value);
|
||||||
|
}
|
||||||
|
}
|
108
packages/base-contract/test/utils_test.ts
Normal file
108
packages/base-contract/test/utils_test.ts
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
import { BigNumber } from '@0xproject/utils';
|
||||||
|
import * as chai from 'chai';
|
||||||
|
import 'mocha';
|
||||||
|
|
||||||
|
import { formatABIDataItem } from '../src/utils';
|
||||||
|
|
||||||
|
const { expect } = chai;
|
||||||
|
|
||||||
|
describe('Utils tests', () => {
|
||||||
|
describe('#formatABIDataItem', () => {
|
||||||
|
it('correctly handles arrays', () => {
|
||||||
|
const calls: Array<{ type: string; value: any }> = [];
|
||||||
|
const abi = {
|
||||||
|
name: 'values',
|
||||||
|
type: 'uint256[]',
|
||||||
|
};
|
||||||
|
const val = [1, 2, 3];
|
||||||
|
const formatted = formatABIDataItem(abi, val, (type: string, value: any) => {
|
||||||
|
calls.push({ type, value });
|
||||||
|
return value; // no-op
|
||||||
|
});
|
||||||
|
expect(formatted).to.be.deep.equal(val);
|
||||||
|
expect(calls).to.be.deep.equal([
|
||||||
|
{ type: 'uint256', value: 1 },
|
||||||
|
{ type: 'uint256', value: 2 },
|
||||||
|
{ type: 'uint256', value: 3 },
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
it('correctly handles tuples', () => {
|
||||||
|
const calls: Array<{ type: string; value: any }> = [];
|
||||||
|
const abi = {
|
||||||
|
components: [
|
||||||
|
{
|
||||||
|
name: 'to',
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'amount',
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
name: 'data',
|
||||||
|
type: 'tuple',
|
||||||
|
};
|
||||||
|
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
||||||
|
const val = { to: ZERO_ADDRESS, amount: new BigNumber(1) };
|
||||||
|
const formatted = formatABIDataItem(abi, val, (type: string, value: any) => {
|
||||||
|
calls.push({ type, value });
|
||||||
|
return value; // no-op
|
||||||
|
});
|
||||||
|
expect(formatted).to.be.deep.equal(val);
|
||||||
|
expect(calls).to.be.deep.equal([
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
value: val.to,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
value: val.amount,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
it('correctly handles nested arrays of tuples', () => {
|
||||||
|
const calls: Array<{ type: string; value: any }> = [];
|
||||||
|
const abi = {
|
||||||
|
components: [
|
||||||
|
{
|
||||||
|
name: 'to',
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'amount',
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
name: 'data',
|
||||||
|
type: 'tuple[2][]',
|
||||||
|
};
|
||||||
|
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
||||||
|
const val = [
|
||||||
|
[{ to: ZERO_ADDRESS, amount: new BigNumber(1) }, { to: ZERO_ADDRESS, amount: new BigNumber(2) }],
|
||||||
|
];
|
||||||
|
const formatted = formatABIDataItem(abi, val, (type: string, value: any) => {
|
||||||
|
calls.push({ type, value });
|
||||||
|
return value; // no-op
|
||||||
|
});
|
||||||
|
expect(formatted).to.be.deep.equal(val);
|
||||||
|
expect(calls).to.be.deep.equal([
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
value: val[0][0].to,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
value: val[0][0].amount,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
value: val[0][1].to,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
value: val[0][1].amount,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
7
packages/base-contract/tsconfig.json
Normal file
7
packages/base-contract/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "lib"
|
||||||
|
},
|
||||||
|
"include": ["src/**/*", "test/**/*"]
|
||||||
|
}
|
3
packages/base-contract/tslint.json
Normal file
3
packages/base-contract/tslint.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"extends": ["@0xproject/tslint-config"]
|
||||||
|
}
|
@@ -1,3 +0,0 @@
|
|||||||
# CHANGELOG
|
|
||||||
|
|
||||||
## v0.x.x - _TBD, 2018_
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user