Compare commits
403 Commits
@0x/protoc
...
@0x/contra
Author | SHA1 | Date | |
---|---|---|---|
|
6fd269db34 | ||
|
033db23929 | ||
|
891d173705 | ||
|
091a10676c | ||
|
0ae6f3e64f | ||
|
8197fee50a | ||
|
ee48d4006b | ||
|
d2be56c30f | ||
|
c4097e4203 | ||
|
8f21d167cc | ||
|
b33fc27220 | ||
|
dcb17768cc | ||
|
82907f99a2 | ||
|
2e157cc307 | ||
|
3164d7882c | ||
|
91587efe2e | ||
|
008f00ba2f | ||
|
0e38b0e54a | ||
|
f6af4abd67 | ||
|
6dc3084c30 | ||
|
fd1f7a8a42 | ||
|
3a03174a92 | ||
|
f5e34bce3b | ||
|
3f8dbf3fe9 | ||
|
b040e55202 | ||
|
fe0676cec3 | ||
|
b697202e19 | ||
|
09bc48671c | ||
|
d31cc43ed6 | ||
|
372f23156b | ||
|
010a926d79 | ||
|
0000143b4e | ||
|
22684ff5ba | ||
|
4d9b68d527 | ||
|
957853788d | ||
|
28193479c6 | ||
|
70212534a1 | ||
|
ea9575e94d | ||
|
ca0b074893 | ||
|
b3281bfdb1 | ||
|
1516bf6a24 | ||
|
ab19bb41c4 | ||
|
7368aded88 | ||
|
b1f856e7a4 | ||
|
9d42018fc6 | ||
|
624cbebe27 | ||
|
4ace7c8c43 | ||
|
66846c8aec | ||
|
33e38fd0a1 | ||
|
5a6df5a39a | ||
|
592e7d34c9 | ||
|
1776dbef44 | ||
|
089718df33 | ||
|
7500ac36de | ||
|
f347f4392c | ||
|
10af74e616 | ||
|
cfb2392ac7 | ||
|
5a2447bef3 | ||
|
bf1b5c4257 | ||
|
10916205ab | ||
|
69f8fd39f7 | ||
|
0cc2cdd16e | ||
|
d207a4267e | ||
|
e846ed2f34 | ||
|
b04455c36f | ||
|
d06f6c8b4d | ||
|
a689e98b0f | ||
|
6f72a8e8e3 | ||
|
422f83fc99 | ||
|
b6597df84f | ||
|
c9b1aac8a5 | ||
|
87f4189e93 | ||
|
390e1b8510 | ||
|
5645e87aca | ||
|
0daa988996 | ||
|
b4d6f74d7b | ||
|
2163cb221b | ||
|
4575300016 | ||
|
82341c3b9d | ||
|
f89c2d2fed | ||
|
09419a7909 | ||
|
1fa093be64 | ||
|
8e9f358a02 | ||
|
0a2e8fc224 | ||
|
5653ee8f86 | ||
|
d180d5325d | ||
|
d249042b47 | ||
|
d3a6f79015 | ||
|
8c9dc96e5d | ||
|
fc0edba46b | ||
|
37dc99181e | ||
|
6efb9f532b | ||
|
9b7d88e136 | ||
|
e51e1f1674 | ||
|
036a263267 | ||
|
1fb44a55b4 | ||
|
d738eede0e | ||
|
a99c916100 | ||
|
2abb00b5e2 | ||
|
ef723e6f36 | ||
|
1fc139886e | ||
|
2be10bc72f | ||
|
abdc02f066 | ||
|
b7ef5473cd | ||
|
e43cdda22f | ||
|
416f2ec24c | ||
|
4f7fe66d74 | ||
|
eb394383d8 | ||
|
92e681f21b | ||
|
3f65dd6049 | ||
|
4425c316a3 | ||
|
9058839645 | ||
|
46a7a2e620 | ||
|
b35dccd43d | ||
|
08e0c2ebb9 | ||
|
8aa313a437 | ||
|
8e9699c340 | ||
|
939b708e63 | ||
|
1617e3fc44 | ||
|
e0d705703d | ||
|
01a6d933ca | ||
|
9b9f0b91d7 | ||
|
0d0fef841d | ||
|
17adfbea32 | ||
|
80594622b2 | ||
|
0dba5a5a3a | ||
|
4dae8de1b6 | ||
|
0046bb26d8 | ||
|
fe935f787c | ||
|
1b527ffcd8 | ||
|
9f5324d9c3 | ||
|
3647392a04 | ||
|
1d49662c58 | ||
|
6324b08b4d | ||
|
fe73b63aaa | ||
|
192d0b17d9 | ||
|
aa74d04083 | ||
|
d586f5727d | ||
|
98fc79a085 | ||
|
c12a10b96e | ||
|
d3d4a08f91 | ||
|
9ce090c8cd | ||
|
980d60deb8 | ||
|
d6d79e51e7 | ||
|
3ef5de93bb | ||
|
ab7dc33ca4 | ||
|
14dcee5bb6 | ||
|
9856e78609 | ||
|
2801b066b3 | ||
|
5bc8b13fc3 | ||
|
36dba8f5be | ||
|
ee2c069889 | ||
|
6ca14ed7b2 | ||
|
a5babb9a34 | ||
|
661cc4669d | ||
|
553ba5c868 | ||
|
d03d2f254d | ||
|
feb91a04b0 | ||
|
4d63f33aba | ||
|
b72b8b5ffd | ||
|
f7cb7a0f51 | ||
|
9fcb28f5d8 | ||
|
982173471c | ||
|
e77958425f | ||
|
6af4d71573 | ||
|
ee985240fb | ||
|
2aadbda527 | ||
|
297c73abcc | ||
|
4c9e1b21ec | ||
|
41685d1545 | ||
|
b9c25112ed | ||
|
f0738fc122 | ||
|
42baf504b7 | ||
|
56038d122f | ||
|
c4446b6c0e | ||
|
eaed2958c3 | ||
|
a045a3afb8 | ||
|
1cc59ab1ab | ||
|
2c6a714b71 | ||
|
d8c97d6720 | ||
|
d6bc702550 | ||
|
2838cb9420 | ||
|
b10cfc50d3 | ||
|
2e6317b01e | ||
|
50e99e6eac | ||
|
8f2f4554eb | ||
|
67d9678a3a | ||
|
f70341fb48 | ||
|
14cd24ea47 | ||
|
78328056d7 | ||
|
0045a60b0f | ||
|
e4e71c76e1 | ||
|
ca8127545f | ||
|
7b709089ce | ||
|
190f7e45f2 | ||
|
0dcc3a6fc3 | ||
|
c2e8cae293 | ||
|
83da7caab4 | ||
|
fd69a0c273 | ||
|
9b131199ad | ||
|
f5c486050b | ||
|
1f41fe6a20 | ||
|
7f4080e0a2 | ||
|
db76da58d7 | ||
|
cf8fc0ff8e | ||
|
2d16f83e37 | ||
|
4057bdab91 | ||
|
1cd10f0ac9 | ||
|
68f87b2432 | ||
|
69bafc3bcd | ||
|
2c44b06b7b | ||
|
0233f00b4e | ||
|
fedb53187d | ||
|
6774d2f588 | ||
|
cf740b74f5 | ||
|
177c00463a | ||
|
49b0e32129 | ||
|
938fc94756 | ||
|
1561d91c2b | ||
|
9a28e51f51 | ||
|
f55eaa867b | ||
|
6b2856424a | ||
|
da757c4700 | ||
|
75e6654884 | ||
|
87308e7693 | ||
|
d5eef93a76 | ||
|
a7f23a982e | ||
|
9eadc5fc28 | ||
|
92ad1a612e | ||
|
09413c0e12 | ||
|
23788b41d5 | ||
|
ccf999a495 | ||
|
aa1016ee5f | ||
|
423ef57344 | ||
|
c18149e82f | ||
|
d14aebf724 | ||
|
ba719a9631 | ||
|
d36034d958 | ||
|
7750c57620 | ||
|
4d027e11d1 | ||
|
470e9a4697 | ||
|
7c51412e2f | ||
|
b3d1f3cd10 | ||
|
389bb77439 | ||
|
4327885a00 | ||
|
0aef0afbbb | ||
|
fa4c3a4f5f | ||
|
1d7c527c5c | ||
|
cbe3135e4b | ||
|
955ad49711 | ||
|
8d6f6e76e0 | ||
|
9337115650 | ||
|
fa45a44fe4 | ||
|
c9c7ac8559 | ||
|
c881723578 | ||
|
c9c30d3a76 | ||
|
73dfdb5b69 | ||
|
e638268f94 | ||
|
0bfd765481 | ||
|
1f12893735 | ||
|
dd3d9337c4 | ||
|
904214f4a8 | ||
|
64c090c4b4 | ||
|
e24474f152 | ||
|
29fa408256 | ||
|
1b94cc68af | ||
|
f5b4bb3035 | ||
|
afd880f28c | ||
|
cd14cdd168 | ||
|
c8ff53a75f | ||
|
6d08add20b | ||
|
29f9c725e3 | ||
|
a83453f07f | ||
|
ae365ce92c | ||
|
77a592e891 | ||
|
9a1df67d6b | ||
|
4b91411faf | ||
|
622a542d57 | ||
|
cba53a9a50 | ||
|
e186f27f63 | ||
|
4cd767ecb8 | ||
|
f6e85aedf1 | ||
|
b3ee294ba5 | ||
|
1c242def93 | ||
|
f0fe6f2f69 | ||
|
f86d555e49 | ||
|
b0f2c40463 | ||
|
87be6fbb8a | ||
|
9141a9d2c8 | ||
|
7f75de347e | ||
|
329f7761c3 | ||
|
0d8e83cd75 | ||
|
e5d60b8077 | ||
|
ae2fe55efa | ||
|
6073607d3e | ||
|
389ebb5df8 | ||
|
fd9655e9d4 | ||
|
6480aaa189 | ||
|
38969bb0a8 | ||
|
1847ab93af | ||
|
c1177416f5 | ||
|
4fdd203211 | ||
|
4bc11776d7 | ||
|
eb12eac5f3 | ||
|
5f5b951998 | ||
|
8e90547604 | ||
|
fbea74d7ff | ||
|
dcea16bc13 | ||
|
d59a074bd7 | ||
|
39cc4f4dbf | ||
|
85bcf87af8 | ||
|
a0fe1c610f | ||
|
5d21af1a0a | ||
|
f6edbd210c | ||
|
e084807a8f | ||
|
1c7d512829 | ||
|
df0e0866e4 | ||
|
9e6efc3676 | ||
|
3aef29dace | ||
|
9a16e00577 | ||
|
84e4819e6e | ||
|
25dd6bc79a | ||
|
5d2cdb00c2 | ||
|
0f701f42d3 | ||
|
3e3e82d3f7 | ||
|
c57bf86273 | ||
|
f470d282ee | ||
|
b8a2526da5 | ||
|
97575bbde9 | ||
|
e5ed8b2c81 | ||
|
61fbae3ae2 | ||
|
5c2255c841 | ||
|
e036dee6c5 | ||
|
8583aab241 | ||
|
5d05b62821 | ||
|
0063e8178f | ||
|
ec6e5dd517 | ||
|
9d08fefa1c | ||
|
2fdca24d4e | ||
|
42ec0b144e | ||
|
3f6ce78b46 | ||
|
c1300c1068 | ||
|
9a641cfab6 | ||
|
60345d4465 | ||
|
11dfea47a6 | ||
|
55e9dd39a2 | ||
|
1993929bed | ||
|
e1d81de517 | ||
|
a6b3a21635 | ||
|
fd59cdc2db | ||
|
98e11b5189 | ||
|
3bebc7cd62 | ||
|
56dab6ae8c | ||
|
285f98e9e9 | ||
|
8ae9f59f20 | ||
|
4c341c5ca3 | ||
|
a3c912c2af | ||
|
5e72eb9af9 | ||
|
9b08b73c06 | ||
|
76c7eb7c3e | ||
|
9b2e5a3adb | ||
|
813d703d12 | ||
|
83005d0f3d | ||
|
d07ffd2688 | ||
|
4170f970d0 | ||
|
dcde12dd70 | ||
|
84a60ec982 | ||
|
9615570dc6 | ||
|
880a9c3da0 | ||
|
c44bd9d42d | ||
|
90b441330b | ||
|
e12ed1eddf | ||
|
ac94023ab3 | ||
|
281e6acca5 | ||
|
2f1b520409 | ||
|
21b4eb3d26 | ||
|
644f6c7d28 | ||
|
0647b9e4f8 | ||
|
82d42eeede | ||
|
6ef4d95043 | ||
|
6044140f86 | ||
|
4da1ef0f56 | ||
|
8c668a3918 | ||
|
f1ff1cde39 | ||
|
1668a24e31 | ||
|
4b7c376d96 | ||
|
bb4a9c656c | ||
|
6ab07b6304 | ||
|
8903f1ab01 | ||
|
415535612a | ||
|
5248a135c3 | ||
|
602290925c | ||
|
01813746e8 | ||
|
7d668d8801 | ||
|
797a00a33a | ||
|
4b3d98f43c | ||
|
9ff77c1cd5 | ||
|
18a8351671 | ||
|
9a994dfcd3 | ||
|
b7adc5a889 | ||
|
10b0d7f363 | ||
|
e2c905a15f | ||
|
8589ba728c |
@@ -1,209 +0,0 @@
|
|||||||
version: 2.1
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
resource_class: xlarge
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
environment:
|
|
||||||
NODE_OPTIONS: '--max-old-space-size=16384'
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run: echo 'export PATH=$HOME/CIRCLE_PROJECT_REPONAME/node_modules/.bin:$PATH' >> $BASH_ENV
|
|
||||||
- run:
|
|
||||||
name: install-yarn
|
|
||||||
command: npm install --force --global yarn@1.22.0
|
|
||||||
- run:
|
|
||||||
name: yarn
|
|
||||||
command: yarn --frozen-lockfile --ignore-engines install || yarn --frozen-lockfile --ignore-engines install
|
|
||||||
- setup_remote_docker
|
|
||||||
- run: yarn build:ci || yarn build:ci || yarn build:ci || yarn build:ci || yarn build:ci || yarn build:ci
|
|
||||||
- run: yarn build:ts || yarn build:ts || yarn build:ts || yarn build:ts || yarn build:ts || yarn build:ts
|
|
||||||
- save_cache:
|
|
||||||
key: repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
paths:
|
|
||||||
- ~/repo
|
|
||||||
- store_artifacts:
|
|
||||||
path: ~/repo/packages/abi-gen/test-cli/output
|
|
||||||
- store_artifacts:
|
|
||||||
path: ~/repo/packages/contract-wrappers/generated_docs
|
|
||||||
test-exchange-ganache:
|
|
||||||
resource_class: medium+
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run: yarn wsrun -p @0x/contracts-exchange -m --serial -c test:circleci
|
|
||||||
test-integrations-ganache:
|
|
||||||
resource_class: medium+
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run: yarn wsrun -p @0x/contracts-integrations -m --serial -c test:circleci
|
|
||||||
test-contracts-staking-ganache:
|
|
||||||
resource_class: medium+
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run: yarn wsrun -p @0x/contracts-staking -m --serial -c test:circleci
|
|
||||||
test-contracts-extra-ganache:
|
|
||||||
resource_class: medium+
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run: yarn wsrun -p @0x/contracts-exchange-forwarder -p @0x/contracts-coordinator -m --serial -c test:circleci
|
|
||||||
test-contracts-rest-ganache:
|
|
||||||
resource_class: medium+
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run: yarn wsrun -p @0x/contracts-multisig -p @0x/contracts-utils -p @0x/contracts-exchange-libs -p @0x/contracts-erc20 -p @0x/contracts-erc721 -p @0x/contracts-erc1155 -p @0x/contracts-asset-proxy -p @0x/contracts-broker -p @0x/contracts-zero-ex -m --serial -c test:circleci
|
|
||||||
test-publish:
|
|
||||||
resource_class: large
|
|
||||||
environment:
|
|
||||||
NODE_OPTIONS: '--max-old-space-size=6442'
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
- image: 0xorg/verdaccio
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run:
|
|
||||||
command: yarn test:publish:circleci
|
|
||||||
no_output_timeout: 1800
|
|
||||||
- store_artifacts:
|
|
||||||
path: ~/.npm/_logs
|
|
||||||
test-doc-generation:
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run:
|
|
||||||
command: yarn test:generate_docs:circleci
|
|
||||||
no_output_timeout: 1200
|
|
||||||
test-rest:
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run: yarn wsrun -p @0x/contracts-test-utils -m --serial -c test:circleci
|
|
||||||
- run: yarn wsrun -p @0x/contract-artifacts -m --serial -c test:circleci
|
|
||||||
- run: yarn wsrun -p @0x/contract-wrappers-test -m --serial -c test:circleci
|
|
||||||
- run: yarn wsrun -p @0x/migrations -m --serial -c test:circleci
|
|
||||||
- run: yarn wsrun -p @0x/order-utils -m --serial -c test:circleci
|
|
||||||
- run: yarn wsrun -p @0x/asset-swapper -m --serial -c test:circleci
|
|
||||||
- save_cache:
|
|
||||||
key: coverage-contract-wrappers-test-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
paths:
|
|
||||||
- ~/repo/packages/contract-wrappers-test/coverage/lcov.info
|
|
||||||
- save_cache:
|
|
||||||
key: coverage-order-utils-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
paths:
|
|
||||||
- ~/repo/packages/order-utils/coverage/lcov.info
|
|
||||||
- save_cache:
|
|
||||||
key: coverage-web3-wrapper-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
paths:
|
|
||||||
- ~/repo/packages/web3-wrapper/coverage/lcov.info
|
|
||||||
static-tests:
|
|
||||||
resource_class: large
|
|
||||||
working_directory: ~/repo
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run: yarn lerna run lint
|
|
||||||
- run: yarn prettier:ci
|
|
||||||
- run: yarn deps_versions:ci
|
|
||||||
- run: yarn diff_md_docs:ci
|
|
||||||
submit-coverage:
|
|
||||||
docker:
|
|
||||||
- image: node:12
|
|
||||||
working_directory: ~/repo
|
|
||||||
steps:
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- coverage-contract-wrappers-test-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- coverage-order-utils-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- coverage-contracts-{{ .Environment.CIRCLE_SHA1 }}
|
|
||||||
- run: yarn report_coverage
|
|
||||||
workflows:
|
|
||||||
version: 2
|
|
||||||
main:
|
|
||||||
jobs:
|
|
||||||
- build
|
|
||||||
# Disabled until we begin actively developing on these packages again.
|
|
||||||
# - test-exchange-ganache:
|
|
||||||
# requires:
|
|
||||||
# - build
|
|
||||||
# - test-integrations-ganache:
|
|
||||||
# requires:
|
|
||||||
# - build
|
|
||||||
# - test-contracts-staking-ganache:
|
|
||||||
# requires:
|
|
||||||
# - build
|
|
||||||
# - test-contracts-extra-ganache:
|
|
||||||
# requires:
|
|
||||||
# - build
|
|
||||||
- test-contracts-rest-ganache:
|
|
||||||
requires:
|
|
||||||
- build
|
|
||||||
- test-rest:
|
|
||||||
requires:
|
|
||||||
- build
|
|
||||||
- static-tests:
|
|
||||||
requires:
|
|
||||||
- build
|
|
||||||
- test-publish:
|
|
||||||
requires:
|
|
||||||
- build
|
|
||||||
- test-doc-generation:
|
|
||||||
requires:
|
|
||||||
- build
|
|
||||||
# Disabled until this repo has a coveralls API key
|
|
||||||
# - submit-coverage:
|
|
||||||
# requires:
|
|
||||||
# # Disabled until we begin actively developing on these packages again.
|
|
||||||
# # - test-exchange-ganache
|
|
||||||
# # - test-integrations-ganache
|
|
||||||
# # - test-contracts-staking-ganache
|
|
||||||
# # - test-contracts-extra-ganache
|
|
||||||
# - test-contracts-rest-ganache
|
|
||||||
# - test-rest
|
|
||||||
# - static-tests
|
|
18
.github/CODEOWNERS
vendored
Normal file
18
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# See https://help.github.com/articles/about-codeowners/
|
||||||
|
|
||||||
|
# for more info about CODEOWNERS file
|
||||||
|
|
||||||
|
# It uses the same pattern rule for gitignore file
|
||||||
|
|
||||||
|
# https://git-scm.com/docs/gitignore#_pattern_format
|
||||||
|
|
||||||
|
# Dev tools & setup
|
||||||
|
|
||||||
|
.github/ @dekz
|
||||||
|
packages/contract-addresses/ @dekz @dextracker @kyu-c
|
||||||
|
packages/contract-artifacts/ @dekz
|
||||||
|
packages/protocol-utils/ @dekz
|
||||||
|
|
||||||
|
# Protocol/smart contracts
|
||||||
|
|
||||||
|
contracts/ @dekz @dextracker
|
28
CONTRIBUTING.md → .github/CONTRIBUTING.md
vendored
28
CONTRIBUTING.md → .github/CONTRIBUTING.md
vendored
@@ -8,13 +8,13 @@ We welcome contributions from anyone on the internet and are grateful for even t
|
|||||||
2. Clone your fork
|
2. Clone your fork
|
||||||
3. Follow the [installation & build steps](https://github.com/0xProject/0x-tools#install-dependencies) in the repo's top-level README.
|
3. Follow the [installation & build steps](https://github.com/0xProject/0x-tools#install-dependencies) in the repo's top-level README.
|
||||||
4. Setup the recommended [Development Tooling](#development-tooling).
|
4. Setup the recommended [Development Tooling](#development-tooling).
|
||||||
5. Open a PR with the `[WIP]` flag against the `development` branch and describe the change you are intending to undertake in the PR description. (see [our branch naming conventions](#branch-structure))
|
5. Open a [draft PR](https://github.blog/2019-02-14-introducing-draft-pull-requests/) against the `development` branch and describe the change you are intending to undertake in the PR description. (see [our branch naming conventions](#branch-structure))
|
||||||
|
|
||||||
Before removing the `[WIP]` tag and submitting the PR for review, make sure:
|
Before making the PR "Ready for review", make sure:
|
||||||
|
|
||||||
- It passes our linter checks (`yarn lint`)
|
- It passes our linter checks (`yarn lint`)
|
||||||
- It is properly formatted with Prettier (`yarn prettier`)
|
- It is properly formatted with Prettier (`yarn prettier`)
|
||||||
- It passes our continuous integration tests (See: [Enabling code coverage checks on your fork](#enabling-code-coverage-checks-on-your-fork) for instructions on getting the `submit-coverage` test to pass on forks)
|
- It passes our continuous integration tests (See: [Enabling code coverage checks on your fork](#fix-submit-coverage-ci-failure) for instructions on getting the `submit-coverage` test to pass on forks)
|
||||||
- You've created/updated the corresponding [CHANGELOG](#CHANGELOGs) entries.
|
- You've created/updated the corresponding [CHANGELOG](#CHANGELOGs) entries.
|
||||||
- Your changes have sufficient test coverage (e.g regression tests have been added for bug fixes)
|
- Your changes have sufficient test coverage (e.g regression tests have been added for bug fixes)
|
||||||
|
|
||||||
@@ -59,16 +59,14 @@ We strongly recommend you use the [VSCode](https://code.visualstudio.com/) text
|
|||||||
|
|
||||||
#### Linter
|
#### Linter
|
||||||
|
|
||||||
We use [TSLint](https://palantir.github.io/tslint/) with [custom configs](https://github.com/0xProject/0x-tools/tree/development/packages/tslint-config) to keep our code-style consistent.
|
We use [ESLint](https://eslint.org/docs/latest/) to keep our code-style consistent.
|
||||||
|
|
||||||
Use `yarn:lint` to lint the entire monorepo, and `PKG={PACKAGE_NAME} yarn lint` to lint a specific package.
|
Use `yarn lint` to lint the entire monorepo, and `PKG={PACKAGE_NAME} yarn lint` to lint a specific package.
|
||||||
|
|
||||||
If you want to change a rule, or add a custom rule, please make these changes to our [tslint-config](https://github.com/0xProject/0x-tools/tree/development/packages/tslint-config) package. All other packages have it as a dependency.
|
|
||||||
|
|
||||||
Integrate it into your text editor:
|
Integrate it into your text editor:
|
||||||
|
|
||||||
- VSCode: [vscode-tslint](https://marketplace.visualstudio.com/items?itemName=eg2.tslint)
|
- VSCode: [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
|
||||||
- Atom: [linter-tslint](https://atom.io/packages/linter-tslint)
|
- Atom: [ESLint](https://atom.io/packages/eslint)
|
||||||
|
|
||||||
#### Auto-formatter
|
#### Auto-formatter
|
||||||
|
|
||||||
@@ -91,15 +89,3 @@ A few of our coding conventions are not yet enforced by the linter/auto-formatte
|
|||||||
1. If you _must_ cast a variable to any - try to type it back as fast as possible. (e.g., `const cw = ((zeroEx as any)._contractWrappers as ContractWrappers);`). This ensures subsequent code is type-safe.
|
1. If you _must_ cast a variable to any - try to type it back as fast as possible. (e.g., `const cw = ((zeroEx as any)._contractWrappers as ContractWrappers);`). This ensures subsequent code is type-safe.
|
||||||
1. Our enum conventions coincide with the recommended TypeScript conventions, using capitalized keys, and all-caps snake-case values. Eg `GetStats = 'GET_STATS'`
|
1. Our enum conventions coincide with the recommended TypeScript conventions, using capitalized keys, and all-caps snake-case values. Eg `GetStats = 'GET_STATS'`
|
||||||
1. All public, exported methods/functions/classes must have associated Javadoc-style comments.
|
1. All public, exported methods/functions/classes must have associated Javadoc-style comments.
|
||||||
|
|
||||||
### Fix `submit-coverage` CI failure
|
|
||||||
|
|
||||||
If you simply fork the repo and then create a PR from it, your PR will fail the `submit-coverage` check on CI. This is because the 0x CircleCI configuration sets the `COVERALLS_REPO_TOKEN` environment variable to the token for `0xProject/0x-tools`, but when running the check against your fork the token needs to match your repo's name `your-username/0x-tools`.
|
|
||||||
|
|
||||||
To facilitate this check, after creating your fork, but before creating the branch for your PR, do the following:
|
|
||||||
|
|
||||||
1. Log in to [coveralls.io](https://coveralls.io/), go to `Add Repos`, and enable your fork. Then go to the settings for that repo, and copy the `Repo Token` identifier.
|
|
||||||
2. Log in to [CircleCI](https://circleci.com/login), go to `Add Projects`, click the `Set Up Project` button corresponding to your fork, and then click `Start Building`. (Aside from step 3 below, no actual set up is needed, since it will use the `.circleci/config.yml` file in 0x-tools, so you can ignore all of the instruction/explanation given on the page with the `Start Building` button.)
|
|
||||||
3. In CircleCI, configure your project to add an environment variable, with name `COVERALLS_REPO_TOKEN`, and for the value paste in the `Repo Token` you copied in step 1.
|
|
||||||
|
|
||||||
Now, when you push to your branch, CircleCI will automatically run all of the checks in your own instance, and the coverage check will work since it has the proper `Repo Token`, and the PR will magically refer to your own checks rather than running them in the 0x CircleCI instance.
|
|
12
ISSUE_TEMPLATE.md → .github/ISSUE_TEMPLATE.md
vendored
12
ISSUE_TEMPLATE.md → .github/ISSUE_TEMPLATE.md
vendored
@@ -2,15 +2,13 @@
|
|||||||
|
|
||||||
<!--- Before submitting please check to see if this issue was already reported -->
|
<!--- Before submitting please check to see if this issue was already reported -->
|
||||||
|
|
||||||
<!--- Prefix your issue title with the package name it relates to (e.g., `0x.js: ` or `general:`) -->
|
|
||||||
|
|
||||||
## Expected Behavior
|
## Expected Behavior
|
||||||
|
|
||||||
<!--- If you're describing a bug, tell us what should happen -->
|
<!--- If you're describing a bug, tell us what should happen -->
|
||||||
|
|
||||||
<!--- If you're suggesting a package change/improvement, tell us how it should work -->
|
<!--- If you're suggesting a package change/improvement, tell us how it should work -->
|
||||||
|
|
||||||
<!--- If you're suggesting a contract or protocol change/improvement, visit our ZEIPs repo -->
|
<!--- If you're suggesting a contract or protocol change/improvement, visit our ZEIPs repo https://github.com/0xProject/ZEIPs -->
|
||||||
|
|
||||||
## Current Behavior
|
## Current Behavior
|
||||||
|
|
||||||
@@ -50,8 +48,8 @@
|
|||||||
| ------: | :------ |
|
| ------: | :------ |
|
||||||
|
|
||||||
<!-- For example:
|
<!-- For example:
|
||||||
| `0x.js` | 2.0.4 |
|
| `protocol-utils` | 2.0.4 |
|
||||||
| `Exchange Contract` | v2 |
|
| `Exchange Contract` | v3 |
|
||||||
-->
|
-->
|
||||||
|
|
||||||
| Network |
|
| Network |
|
||||||
@@ -60,6 +58,6 @@
|
|||||||
|
|
||||||
<!-- For example:
|
<!-- For example:
|
||||||
| mainnet |
|
| mainnet |
|
||||||
| kovan |
|
| goerli |
|
||||||
| testrpc |
|
| development |
|
||||||
-->
|
-->
|
@@ -20,7 +20,6 @@
|
|||||||
|
|
||||||
<!--- The following points should be used to indicate the progress of your PR. Put an `x` in all the boxes that apply right now, and come back over time and check them off as you make progress. If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
<!--- The following points should be used to indicate the progress of your PR. Put an `x` in all the boxes that apply right now, and come back over time and check them off as you make progress. If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
||||||
|
|
||||||
- [ ] Prefix PR title with `[WIP]` if necessary.
|
|
||||||
- [ ] Add tests to cover changes as needed.
|
- [ ] Add tests to cover changes as needed.
|
||||||
- [ ] Update documentation as needed.
|
- [ ] Update documentation as needed.
|
||||||
- [ ] Add new entries to the relevant CHANGELOG.jsons.
|
- [ ] Add new entries to the relevant CHANGELOG.jsons.
|
9
.github/autolabeler.yml
vendored
9
.github/autolabeler.yml
vendored
@@ -1,7 +1,2 @@
|
|||||||
python: ['python-packages']
|
documentation: ['docs']
|
||||||
contracts: ['contracts']
|
liquidity integrations: ['contracts/zero-ex/contracts/src/transformers']
|
||||||
@0x/contract-addresses: ['packages/contract-addresses']
|
|
||||||
@0x/migrations: ['packages/migrations']
|
|
||||||
@0x/order-utils: ['packages/order-utils']
|
|
||||||
@0x/contract-artifacts: ['packages/contract-artifacts']
|
|
||||||
@0x/contract-wrappers: ['packages/contract-wrappers']
|
|
||||||
|
7
.github/dependabot.yml
vendored
Normal file
7
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
|
target-branch: "development"
|
19
.github/stale.yml
vendored
19
.github/stale.yml
vendored
@@ -1,19 +0,0 @@
|
|||||||
# Number of days of inactivity before an issue becomes stale
|
|
||||||
daysUntilStale: 30
|
|
||||||
# Number of days of inactivity before a stale issue is closed
|
|
||||||
daysUntilClose: 30
|
|
||||||
# Issues with these labels will never be considered stale
|
|
||||||
exemptLabels:
|
|
||||||
- pinned
|
|
||||||
- security
|
|
||||||
# Label to use when marking an issue as stale
|
|
||||||
staleLabel: stale
|
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
|
||||||
for your contributions.
|
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
|
||||||
closeComment: >
|
|
||||||
This issue has been automatically closed because no activity occured in 7 days after being marked as stale. If it's still relevant - feel free to reopen. Thank you
|
|
||||||
for your contributions.
|
|
105
.github/workflows/ci.yml
vendored
Normal file
105
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
name: Continuous Integration
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- development
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build and test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: "16"
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Build solution
|
||||||
|
run: yarn build
|
||||||
|
|
||||||
|
- name: Lint typescript
|
||||||
|
run: yarn lint:ts
|
||||||
|
|
||||||
|
- name: Lint solidity
|
||||||
|
run: yarn lint:contracts
|
||||||
|
|
||||||
|
- name: Run prettier
|
||||||
|
run: yarn prettier:ci
|
||||||
|
|
||||||
|
- name: Check dependent packages have consistent versions
|
||||||
|
run: yarn deps_versions:ci
|
||||||
|
|
||||||
|
- name: Check diff in docs
|
||||||
|
run: yarn diff_md_docs:ci
|
||||||
|
|
||||||
|
- name: Check for broken links in markdown files
|
||||||
|
run: yarn test:links
|
||||||
|
|
||||||
|
- name: Test doc generation
|
||||||
|
run: yarn test:generate_docs:ci
|
||||||
|
|
||||||
|
- name: Test @0x/contracts-*
|
||||||
|
run: |
|
||||||
|
yarn wsrun \
|
||||||
|
-p @0x/contracts-multisig \
|
||||||
|
-p @0x/contracts-utils \
|
||||||
|
-p @0x/contracts-exchange-libs \
|
||||||
|
-p @0x/contracts-erc20 \
|
||||||
|
-p @0x/contracts-erc721 \
|
||||||
|
-p @0x/contracts-erc1155 \
|
||||||
|
-p @0x/contracts-asset-proxy \
|
||||||
|
-p @0x/contracts-broker \
|
||||||
|
-p @0x/contracts-zero-ex \
|
||||||
|
-m --serial -c test:ci
|
||||||
|
|
||||||
|
- name: Test local @0x/contracts-*
|
||||||
|
run: |
|
||||||
|
yarn wsrun \
|
||||||
|
-p @0x/contracts-test-utils \
|
||||||
|
-p @0x/contract-addresses \
|
||||||
|
-p @0x/contract-artifacts \
|
||||||
|
-p @0x/contract-wrappers-test \
|
||||||
|
-p @0x/order-utils \
|
||||||
|
-m --serial -c test:ci
|
||||||
|
|
||||||
|
- name: Add foundry
|
||||||
|
uses: foundry-rs/foundry-toolchain@v1
|
||||||
|
with:
|
||||||
|
version: nightly
|
||||||
|
|
||||||
|
- name: Run Forge build
|
||||||
|
working-directory: contracts/zero-ex
|
||||||
|
run: |
|
||||||
|
forge --version
|
||||||
|
forge build --sizes
|
||||||
|
|
||||||
|
- name: Run Forge tests
|
||||||
|
working-directory: contracts/zero-ex
|
||||||
|
run: |
|
||||||
|
forge test -vvv --gas-report
|
||||||
|
|
||||||
|
- name: Run Forge coverage
|
||||||
|
working-directory: contracts/zero-ex
|
||||||
|
run: |
|
||||||
|
forge coverage --report lcov
|
||||||
|
|
||||||
|
- name: Upload the coverage report to Coveralls
|
||||||
|
uses: coverallsapp/github-action@master
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
base-path: ./contracts/zero-ex/
|
||||||
|
path-to-lcov: ./contracts/zero-ex/lcov.info
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
2
.github/workflows/publish.yml
vendored
2
.github/workflows/publish.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-node@v1
|
- uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: 10
|
node-version: 16
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@v2
|
||||||
- name: 'configure git'
|
- name: 'configure git'
|
||||||
run: |
|
run: |
|
||||||
|
40
.github/workflows/stale.yml
vendored
Normal file
40
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
name: "Close stale issues and PRs"
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 8 * * 1-5" # This is in UTC.
|
||||||
|
# Do a dry-run (debug-only: true) whenever this workflow itself is changed.
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- .github/workflows/stale.yml
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- synchronize
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v7
|
||||||
|
with:
|
||||||
|
ascending: true # Spend API operations budget on older, more-likely-to-get-closed issues first
|
||||||
|
close-issue-message: "" # Leave no comment when closing
|
||||||
|
close-pr-message: "" # Leave no comment when closing
|
||||||
|
days-before-issue-stale: 30
|
||||||
|
days-before-pr-stale: 30
|
||||||
|
days-before-close: 14
|
||||||
|
debug-only: ${{ github.event_name == 'pull_request' }} # Dry-run when true.
|
||||||
|
exempt-issue-labels: bug,enhancement,feature,question
|
||||||
|
# No actual changes get made in debug-only mode, so we can raise the operations ceiling.
|
||||||
|
operations-per-run: ${{ github.event_name == 'pull_request' && 100 || 30}}
|
||||||
|
stale-issue-label: stale
|
||||||
|
stale-issue-message: "This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions."
|
||||||
|
stale-pr-label: stale
|
||||||
|
stale-pr-message: "This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions."
|
||||||
|
# Time immemorial when in debug-only mode (ie. on pull requests).
|
||||||
|
# `STALEBOT_START_DATE` otherwise.
|
||||||
|
# You can use this as a killswitch by setting `STALEBOT_START_DATE` in the far future.
|
||||||
|
start-date: ${{ github.event_name == 'pull_request' && '1970-01-01T00:00:00Z' || secrets.STALEBOT_START_DATE }} # ISO 8601 or RFC 2822
|
107
.gitignore
vendored
107
.gitignore
vendored
@@ -15,9 +15,6 @@ pids
|
|||||||
*.db
|
*.db
|
||||||
*.sqlite
|
*.sqlite
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
||||||
lib-cov
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
# Coverage directory used by tools like istanbul
|
||||||
coverage
|
coverage
|
||||||
|
|
||||||
@@ -80,98 +77,22 @@ TODO.md
|
|||||||
.idea
|
.idea
|
||||||
|
|
||||||
# generated contract artifacts/
|
# generated contract artifacts/
|
||||||
contracts/broker/generated-artifacts/
|
generated-artifacts/
|
||||||
contracts/broker/test/generated-artifacts/
|
|
||||||
contracts/erc20-bridge-sampler/generated-artifacts/
|
|
||||||
contracts/erc20-bridge-sampler/test/generated-artifacts/
|
|
||||||
contracts/integrations/generated-artifacts/
|
|
||||||
contracts/integrations/test/generated-artifacts/
|
|
||||||
contracts/staking/generated-artifacts/
|
|
||||||
contracts/staking/test/generated-artifacts/
|
|
||||||
contracts/coordinator/generated-artifacts/
|
|
||||||
contracts/coordinator/test/generated-artifacts/
|
|
||||||
contracts/exchange/generated-artifacts/
|
|
||||||
contracts/exchange/test/generated-artifacts/
|
|
||||||
contracts/asset-proxy/generated-artifacts/
|
|
||||||
contracts/asset-proxy/test/generated-artifacts/
|
|
||||||
contracts/multisig/generated-artifacts/
|
|
||||||
contracts/multisig/test/generated-artifacts/
|
|
||||||
contracts/utils/generated-artifacts/
|
|
||||||
contracts/utils/test/generated-artifacts/
|
|
||||||
contracts/exchange-libs/generated-artifacts/
|
|
||||||
contracts/exchange-libs/test/generated-artifacts/
|
|
||||||
contracts/erc20/generated-artifacts/
|
|
||||||
contracts/erc20/test/generated-artifacts/
|
|
||||||
contracts/erc721/generated-artifacts/
|
|
||||||
contracts/erc721/test/generated-artifacts/
|
|
||||||
contracts/erc1155/generated-artifacts/
|
|
||||||
contracts/erc1155/test/generated-artifacts/
|
|
||||||
contracts/extensions/generated-artifacts/
|
|
||||||
contracts/extensions/test/generated-artifacts/
|
|
||||||
contracts/exchange-forwarder/generated-artifacts/
|
|
||||||
contracts/exchange-forwarder/test/generated-artifacts/
|
|
||||||
contracts/dev-utils/generated-artifacts/
|
|
||||||
contracts/dev-utils/test/generated-artifacts/
|
|
||||||
contracts/zero-ex/generated-artifacts/
|
|
||||||
contracts/zero-ex/test/generated-artifacts/
|
|
||||||
contracts/treasury/generated-artifacts/
|
|
||||||
contracts/treasury/test/generated-artifacts/
|
|
||||||
|
|
||||||
# generated truffle contract artifacts/
|
|
||||||
contracts/broker/build/
|
|
||||||
contracts/erc20-bridge-sampler/build/
|
|
||||||
contracts/staking/build/
|
|
||||||
contracts/coordinator/build/
|
|
||||||
contracts/exchange/build/
|
|
||||||
contracts/asset-proxy/build/
|
|
||||||
contracts/multisig/build/
|
|
||||||
contracts/utils/build/
|
|
||||||
contracts/exchange-libs/build/
|
|
||||||
contracts/erc20/build/
|
|
||||||
contracts/erc721/build/
|
|
||||||
contracts/erc1155/build/
|
|
||||||
contracts/extensions/build/
|
|
||||||
contracts/exchange-forwarder/build/
|
|
||||||
contracts/dev-utils/build/
|
|
||||||
|
|
||||||
# generated contract wrappers
|
# generated contract wrappers
|
||||||
contracts/broker/generated-wrappers/
|
generated-wrappers/
|
||||||
contracts/broker/test/generated-wrappers/
|
|
||||||
packages/python-contract-wrappers/generated/
|
# foundry artifacts
|
||||||
contracts/erc20-bridge-sampler/generated-wrappers/
|
foundry-artifacts/
|
||||||
contracts/erc20-bridge-sampler/test/generated-wrappers/
|
|
||||||
contracts/integrations/generated-wrappers/
|
# foundry cache
|
||||||
contracts/integrations/test/generated-wrappers/
|
cache/
|
||||||
contracts/staking/generated-wrappers/
|
|
||||||
contracts/staking/test/generated-wrappers/
|
#foundry output artifacts
|
||||||
contracts/coordinator/generated-wrappers/
|
out/
|
||||||
contracts/coordinator/test/generated-wrappers/
|
|
||||||
contracts/exchange/generated-wrappers/
|
# typechain wrappers
|
||||||
contracts/exchange/test/generated-wrappers/
|
contracts/zero-ex/typechain-wrappers/
|
||||||
contracts/asset-proxy/generated-wrappers/
|
|
||||||
contracts/asset-proxy/test/generated-wrappers/
|
|
||||||
contracts/multisig/generated-wrappers/
|
|
||||||
contracts/multisig/test/generated-wrappers/
|
|
||||||
contracts/utils/generated-wrappers/
|
|
||||||
contracts/utils/test/generated-wrappers/
|
|
||||||
contracts/exchange-libs/generated-wrappers/
|
|
||||||
contracts/exchange-libs/test/generated-wrappers/
|
|
||||||
contracts/erc20/generated-wrappers/
|
|
||||||
contracts/erc20/test/generated-wrappers/
|
|
||||||
contracts/erc721/generated-wrappers/
|
|
||||||
contracts/erc721/test/generated-wrappers/
|
|
||||||
contracts/erc1155/generated-wrappers/
|
|
||||||
contracts/erc1155/test/generated-wrappers/
|
|
||||||
contracts/extensions/generated-wrappers/
|
|
||||||
contracts/extensions/test/generated-wrappers/
|
|
||||||
contracts/exchange-forwarder/generated-wrappers/
|
|
||||||
contracts/exchange-forwarder/test/generated-wrappers/
|
|
||||||
contracts/dev-utils/generated-wrappers/
|
|
||||||
contracts/dev-utils/test/generated-wrappers/
|
|
||||||
contracts/zero-ex/generated-wrappers/
|
|
||||||
contracts/zero-ex/test/generated-wrappers/
|
|
||||||
contracts/treasury/generated-wrappers/
|
|
||||||
contracts/treasury/test/generated-wrappers/
|
|
||||||
|
|
||||||
# Doc README copy
|
# Doc README copy
|
||||||
packages/*/docs/README.md
|
packages/*/docs/README.md
|
||||||
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "contracts/zero-ex/contracts/deps/forge-std"]
|
||||||
|
path = contracts/zero-ex/contracts/deps/forge-std
|
||||||
|
url = https://github.com/foundry-rs/forge-std
|
4
.husky/pre-commit
Executable file
4
.husky/pre-commit
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npx lint-staged --no-stash
|
@@ -1,90 +1,10 @@
|
|||||||
lib
|
lib
|
||||||
|
deps
|
||||||
.nyc_output
|
.nyc_output
|
||||||
/contracts/broker/generated-wrappers
|
generated-artifacts/
|
||||||
/contracts/broker/test/generated-wrappers
|
generated-wrappers/
|
||||||
/contracts/broker/generated-artifacts
|
foundry-artifacts/
|
||||||
/contracts/broker/test/generated-artifacts
|
out/
|
||||||
/contracts/integrations/generated-wrappers
|
cache/
|
||||||
/contracts/integrations/test/generated-wrappers
|
|
||||||
/contracts/integrations/generated-artifacts
|
|
||||||
/contracts/integrations/test/generated-artifacts
|
|
||||||
/contracts/staking/generated-wrappers
|
|
||||||
/contracts/staking/test/generated-wrappers
|
|
||||||
/contracts/staking/generated-artifacts
|
|
||||||
/contracts/staking/test/generated-artifacts
|
|
||||||
/contracts/coordinator/generated-wrappers
|
|
||||||
/contracts/coordinator/test/generated-wrappers
|
|
||||||
/contracts/coordinator/generated-artifacts
|
|
||||||
/contracts/coordinator/test/generated-artifacts
|
|
||||||
/contracts/exchange/generated-wrappers
|
|
||||||
/contracts/exchange/test/generated-wrappers
|
|
||||||
/contracts/exchange/generated-artifacts
|
|
||||||
/contracts/exchange/test/generated-artifacts
|
|
||||||
/contracts/asset-proxy/generated-wrappers
|
|
||||||
/contracts/asset-proxy/test/generated-wrappers
|
|
||||||
/contracts/asset-proxy/generated-artifacts
|
|
||||||
/contracts/asset-proxy/test/generated-artifacts
|
|
||||||
/contracts/multisig/generated-wrappers
|
|
||||||
/contracts/multisig/test/generated-wrappers
|
|
||||||
/contracts/multisig/generated-artifacts
|
|
||||||
/contracts/multisig/test/generated-artifacts
|
|
||||||
/contracts/utils/generated-wrappers
|
|
||||||
/contracts/utils/test/generated-wrappers
|
|
||||||
/contracts/utils/generated-artifacts
|
|
||||||
/contracts/utils/test/generated-artifacts
|
|
||||||
/contracts/exchange-libs/generated-wrappers
|
|
||||||
/contracts/exchange-libs/test/generated-wrappers
|
|
||||||
/contracts/exchange-libs/generated-artifacts
|
|
||||||
/contracts/exchange-libs/test/generated-artifacts
|
|
||||||
/contracts/erc20/generated-wrappers
|
|
||||||
/contracts/erc20/test/generated-wrappers
|
|
||||||
/contracts/erc20/generated-artifacts
|
|
||||||
/contracts/erc20/test/generated-artifacts
|
|
||||||
/contracts/erc721/generated-wrappers
|
|
||||||
/contracts/erc721/test/generated-wrappers
|
|
||||||
/contracts/erc721/generated-artifacts
|
|
||||||
/contracts/erc721/test/generated-artifacts
|
|
||||||
/contracts/erc1155/generated-wrappers
|
|
||||||
/contracts/erc1155/test/generated-wrappers
|
|
||||||
/contracts/erc1155/generated-artifacts
|
|
||||||
/contracts/erc1155/test/generated-artifacts
|
|
||||||
/contracts/extensions/generated-wrappers
|
|
||||||
/contracts/extensions/test/generated-wrappers
|
|
||||||
/contracts/extensions/generated-artifacts
|
|
||||||
/contracts/extensions/test/generated-artifacts
|
|
||||||
/contracts/exchange-forwarder/generated-wrappers
|
|
||||||
/contracts/exchange-forwarder/test/generated-wrappers
|
|
||||||
/contracts/exchange-forwarder/generated-artifacts
|
|
||||||
/contracts/exchange-forwarder/test/generated-artifacts
|
|
||||||
/contracts/dev-utils/generated-wrappers
|
|
||||||
/contracts/dev-utils/test/generated-wrappers
|
|
||||||
/contracts/dev-utils/generated-artifacts
|
|
||||||
/contracts/dev-utils/test/generated-artifacts
|
|
||||||
/contracts/zero-ex/generated-wrappers
|
|
||||||
/contracts/zero-ex/test/generated-wrappers
|
|
||||||
/contracts/zero-ex/generated-artifacts
|
|
||||||
/contracts/zero-ex/test/generated-artifacts
|
|
||||||
/contracts/treasury/generated-wrappers
|
|
||||||
/contracts/treasury/test/generated-wrappers
|
|
||||||
/contracts/treasury/generated-artifacts
|
|
||||||
/contracts/treasury/test/generated-artifacts
|
|
||||||
/contracts/staking/build/
|
|
||||||
/contracts/coordinator/build/
|
|
||||||
/contracts/exchange/build/
|
|
||||||
/contracts/asset-proxy/build/
|
|
||||||
/contracts/multisig/build/
|
|
||||||
/contracts/utils/build/
|
|
||||||
/contracts/exchange-libs/build/
|
|
||||||
/contracts/erc20/build/
|
|
||||||
/contracts/erc721/build/
|
|
||||||
/contracts/erc1155/build/
|
|
||||||
/contracts/extensions/build/
|
|
||||||
/contracts/exchange-forwarder/build/
|
|
||||||
/packages/asset-swapper/generated-artifacts
|
|
||||||
/packages/asset-swapper/generated-wrappers
|
|
||||||
/packages/asset-swapper/test/generated-artifacts
|
|
||||||
/packages/asset-swapper/test/generated-wrappers
|
|
||||||
package.json
|
package.json
|
||||||
packages/*/docs
|
packages
|
||||||
docs/
|
|
||||||
*.sol
|
|
||||||
|
14
.prettierrc
14
.prettierrc
@@ -4,5 +4,17 @@
|
|||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"trailingComma": "all",
|
"trailingComma": "all",
|
||||||
"bracketSpacing": true,
|
"bracketSpacing": true,
|
||||||
"arrowParens": "avoid"
|
"arrowParens": "avoid",
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": "**/*.sol",
|
||||||
|
"options": {
|
||||||
|
"printWidth": 120,
|
||||||
|
"tabWidth": 4,
|
||||||
|
"useTabs": false,
|
||||||
|
"singleQuote": false,
|
||||||
|
"bracketSpacing": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
17
.solhint.json
Normal file
17
.solhint.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"extends": "solhint:recommended",
|
||||||
|
"plugins": ["prettier"],
|
||||||
|
"rules": {
|
||||||
|
"prettier/prettier": "error",
|
||||||
|
"avoid-low-level-calls": "off",
|
||||||
|
"avoid-tx-origin": "warn",
|
||||||
|
"code-complexity": "off",
|
||||||
|
"const-name-snakecase": "error",
|
||||||
|
"function-max-lines": "off",
|
||||||
|
"max-line-length": ["error", 120],
|
||||||
|
"no-inline-assembly": "off",
|
||||||
|
"quotes": ["error", "double"],
|
||||||
|
"no-empty-blocks": "off",
|
||||||
|
"compiler-version": "off"
|
||||||
|
}
|
||||||
|
}
|
9
.solhintignore
Normal file
9
.solhintignore
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
contracts/erc20/contracts/src/ZRXToken.sol
|
||||||
|
node_modules/
|
||||||
|
lib
|
||||||
|
deps
|
||||||
|
generated-artifacts/
|
||||||
|
generated-wrappers/
|
||||||
|
foundry-artifacts/
|
||||||
|
out/
|
||||||
|
cache/
|
18
CODEOWNERS
18
CODEOWNERS
@@ -1,18 +0,0 @@
|
|||||||
# See https://help.github.com/articles/about-codeowners/
|
|
||||||
# for more info about CODEOWNERS file
|
|
||||||
|
|
||||||
# It uses the same pattern rule for gitignore file
|
|
||||||
# https://git-scm.com/docs/gitignore#_pattern_format
|
|
||||||
|
|
||||||
# Website
|
|
||||||
packages/asset-swapper/ @BMillman19 @fragosti @dave4506
|
|
||||||
packages/instant/ @BMillman19 @fragosti @dave4506
|
|
||||||
|
|
||||||
# Dev tools & setup
|
|
||||||
.circleci/ @dorothy-zbornak
|
|
||||||
packages/contract-addresses/ @abandeali1
|
|
||||||
packages/contract-artifacts/ @abandeali1
|
|
||||||
packages/order-utils/ @dorothy-zbornak
|
|
||||||
|
|
||||||
# Protocol/smart contracts
|
|
||||||
contracts/ @abandeali1 @hysz @dorothy-zbornak @mzhu25
|
|
19
README.md
19
README.md
@@ -8,8 +8,7 @@ This repository is a monorepo including the 0x protocol smart contracts and nume
|
|||||||
|
|
||||||
[website-url]: https://0x.org
|
[website-url]: https://0x.org
|
||||||
|
|
||||||
[](https://circleci.com/gh/0xProject/protocool)
|
[](https://coveralls.io/github/0xProject/protocol?branch=development)
|
||||||
[](https://coveralls.io/github/0xProject/0x-monorepo?branch=development)
|
|
||||||
[](https://discordapp.com/invite/d3FTX3M)
|
[](https://discordapp.com/invite/d3FTX3M)
|
||||||
[](https://opensource.org/licenses/Apache-2.0)
|
[](https://opensource.org/licenses/Apache-2.0)
|
||||||
|
|
||||||
@@ -34,11 +33,9 @@ These packages are all under development. See [/contracts/README.md](/contracts/
|
|||||||
|
|
||||||
| Package | Version | Description |
|
| Package | Version | Description |
|
||||||
| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
||||||
| [`@0x/asset-swapper`](/packages/asset-swapper) | [](https://www.npmjs.com/package/@0x/asset-swapper) | Package used to find and create aggregated swaps |
|
|
||||||
| [`@0x/protocol-utils`](/packages/protocol-utils) | [](https://www.npmjs.com/package/@0x/protocol-utils) | A set of utilities for generating, parsing, signing and validating 0x orders |
|
| [`@0x/protocol-utils`](/packages/protocol-utils) | [](https://www.npmjs.com/package/@0x/protocol-utils) | A set of utilities for generating, parsing, signing and validating 0x orders |
|
||||||
| [`@0x/contract-addresses`](/packages/contract-addresses) | [](https://www.npmjs.com/package/@0x/contract-addresses) | A tiny utility library for getting known deployed contract addresses for a particular network. |
|
| [`@0x/contract-addresses`](/packages/contract-addresses) | [](https://www.npmjs.com/package/@0x/contract-addresses) | A tiny utility library for getting known deployed contract addresses for a particular network. |
|
||||||
| [`@0x/contract-wrappers`](/packages/contract-wrappers) | [](https://www.npmjs.com/package/@0x/contract-wrappers) | JS/TS wrappers for interacting with the 0x smart contracts |
|
| [`@0x/contract-wrappers`](/packages/contract-wrappers) | [](https://www.npmjs.com/package/@0x/contract-wrappers) | JS/TS wrappers for interacting with the 0x smart contracts |
|
||||||
| [`@0x/migrations`](/packages/migrations) | [](https://www.npmjs.com/package/@0x/migrations) | Migration tool for deploying 0x smart contracts on private testnets |
|
|
||||||
| [`@0x/contract-artifacts`](/packages/contract-artifacts) | [](https://www.npmjs.com/package/@0x/contract-artifacts) | 0x smart contract compilation artifacts | |
|
| [`@0x/contract-artifacts`](/packages/contract-artifacts) | [](https://www.npmjs.com/package/@0x/contract-artifacts) | 0x smart contract compilation artifacts | |
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
@@ -56,7 +53,7 @@ You can include those by prepending the `@0x/typescript-typings` package to your
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
#### Read our [contribution guidelines](./CONTRIBUTING.md).
|
#### Read our [contribution guidelines](.github/CONTRIBUTING.md).
|
||||||
|
|
||||||
### Install dependencies
|
### Install dependencies
|
||||||
|
|
||||||
@@ -83,7 +80,7 @@ yarn build
|
|||||||
To build a specific package:
|
To build a specific package:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
PKG=@0x/asset-swapper yarn build
|
PKG=@0x/protocol-utils yarn build
|
||||||
```
|
```
|
||||||
|
|
||||||
To build all contracts packages:
|
To build all contracts packages:
|
||||||
@@ -106,7 +103,7 @@ To watch a specific package and all it's dependent packages:
|
|||||||
PKG=[NPM_PACKAGE_NAME] yarn watch
|
PKG=[NPM_PACKAGE_NAME] yarn watch
|
||||||
|
|
||||||
e.g
|
e.g
|
||||||
PKG=@0x/asset-swapper yarn watch
|
PKG=@0x/protocol-utils yarn watch
|
||||||
```
|
```
|
||||||
|
|
||||||
### Clean
|
### Clean
|
||||||
@@ -120,7 +117,7 @@ yarn clean
|
|||||||
Clean a specific package
|
Clean a specific package
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
PKG=@0x/asset-swapper yarn clean
|
PKG=@0x/protocol-utils yarn clean
|
||||||
```
|
```
|
||||||
|
|
||||||
### Rebuild
|
### Rebuild
|
||||||
@@ -134,7 +131,7 @@ yarn rebuild
|
|||||||
To re-build (clean & build) a specific package & it's deps:
|
To re-build (clean & build) a specific package & it's deps:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
PKG=@0x/asset-swapper yarn rebuild
|
PKG=@0x/protocol-utils yarn rebuild
|
||||||
```
|
```
|
||||||
|
|
||||||
### Lint
|
### Lint
|
||||||
@@ -148,7 +145,7 @@ yarn lint
|
|||||||
Lint a specific package:
|
Lint a specific package:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
PKG=@0x/asset-swapper yarn lint
|
PKG=@0x/protocol-utils yarn lint
|
||||||
```
|
```
|
||||||
|
|
||||||
### Run Tests
|
### Run Tests
|
||||||
@@ -162,7 +159,7 @@ yarn test
|
|||||||
Run a specific package's test:
|
Run a specific package's test:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
PKG=@0x/asset-swapper yarn test
|
PKG=@0x/protocol-utils yarn test
|
||||||
```
|
```
|
||||||
|
|
||||||
Run all contracts packages tests:
|
Run all contracts packages tests:
|
||||||
|
@@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "default",
|
|
||||||
"rules": {
|
|
||||||
"avoid-low-level-calls": false,
|
|
||||||
"avoid-tx-origin": "warn",
|
|
||||||
"bracket-align": false,
|
|
||||||
"code-complexity": false,
|
|
||||||
"compiler-fixed": false,
|
|
||||||
"const-name-snakecase": "error",
|
|
||||||
"expression-indent": "error",
|
|
||||||
"function-max-lines": false,
|
|
||||||
"func-order": "error",
|
|
||||||
"indent": ["error", 4],
|
|
||||||
"max-line-length": ["warn", 160],
|
|
||||||
"no-inline-assembly": false,
|
|
||||||
"quotes": ["error", "double"],
|
|
||||||
"separate-by-one-line-in-contract": "error",
|
|
||||||
"space-after-comma": "error",
|
|
||||||
"statement-indent": "error",
|
|
||||||
"no-empty-blocks": false
|
|
||||||
}
|
|
||||||
}
|
|
25
contracts/erc20/.eslintrc
Normal file
25
contracts/erc20/.eslintrc
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"es2021": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"],
|
||||||
|
"overrides": [],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"parserOptions": {
|
||||||
|
"project": "./tsconfig.json",
|
||||||
|
"ecmaVersion": "latest",
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"plugins": ["@typescript-eslint"],
|
||||||
|
"ignorePatterns": [
|
||||||
|
"lib/**/*",
|
||||||
|
"contracts/**/*",
|
||||||
|
"generated-wrappers/**/*",
|
||||||
|
"generated-artifacts/**/*",
|
||||||
|
"test/generated-wrappers/**/*",
|
||||||
|
"test/generated-artifacts/**/*"
|
||||||
|
|
||||||
|
],
|
||||||
|
"rules": {}
|
||||||
|
}
|
@@ -1 +0,0 @@
|
|||||||
contracts/src/ZRXToken.sol
|
|
@@ -1,4 +1,302 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1674517560,
|
||||||
|
"version": "3.3.55",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1670879498,
|
||||||
|
"version": "3.3.54",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1669235113,
|
||||||
|
"version": "3.3.53",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1668477029,
|
||||||
|
"version": "3.3.52",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1667607537,
|
||||||
|
"version": "3.3.51",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1667427402,
|
||||||
|
"version": "3.3.50",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1666645023,
|
||||||
|
"version": "3.3.49",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1666381417,
|
||||||
|
"version": "3.3.48",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665670315,
|
||||||
|
"version": "3.3.47",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665531940,
|
||||||
|
"version": "3.3.46",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "3.3.45",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Migrate from TSLint to ESLint and fix linting errors",
|
||||||
|
"pr": 589
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1665013355
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1663786955,
|
||||||
|
"version": "3.3.44",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662998180,
|
||||||
|
"version": "3.3.43",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662559804,
|
||||||
|
"version": "3.3.42",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662147076,
|
||||||
|
"version": "3.3.41",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662046042,
|
||||||
|
"version": "3.3.40",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661462289,
|
||||||
|
"version": "3.3.39",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661459661,
|
||||||
|
"version": "3.3.38",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661145612,
|
||||||
|
"version": "3.3.37",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1660093941,
|
||||||
|
"version": "3.3.36",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1660073235,
|
||||||
|
"version": "3.3.35",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1659750766,
|
||||||
|
"version": "3.3.34",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1658950329,
|
||||||
|
"version": "3.3.33",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1655244958,
|
||||||
|
"version": "3.3.32",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1654284040,
|
||||||
|
"version": "3.3.31",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1652919697,
|
||||||
|
"version": "3.3.30",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1650611093,
|
||||||
|
"version": "3.3.29",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1648739346,
|
||||||
|
"version": "3.3.28",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1646225739,
|
||||||
|
"version": "3.3.27",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1645569128,
|
||||||
|
"version": "3.3.26",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "3.3.25",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1638390144,
|
||||||
|
"version": "3.3.24",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1637102971,
|
||||||
|
"version": "3.3.23",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1635903615,
|
"timestamp": 1635903615,
|
||||||
"version": "3.3.22",
|
"version": "3.3.22",
|
||||||
|
@@ -5,6 +5,138 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v3.3.55 - _January 23, 2023_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.54 - _December 12, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.53 - _November 23, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.52 - _November 15, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.51 - _November 5, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.50 - _November 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.49 - _October 24, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.48 - _October 21, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.47 - _October 13, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.46 - _October 11, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.45 - _October 5, 2022_
|
||||||
|
|
||||||
|
* Migrate from TSLint to ESLint and fix linting errors (#589)
|
||||||
|
|
||||||
|
## v3.3.44 - _September 21, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.43 - _September 12, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.42 - _September 7, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.41 - _September 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.40 - _September 1, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.39 - _August 25, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.38 - _August 25, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.37 - _August 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.36 - _August 10, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.35 - _August 9, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.34 - _August 6, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.33 - _July 27, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.32 - _June 14, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.31 - _June 3, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.30 - _May 19, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.29 - _April 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.28 - _March 31, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.27 - _March 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.26 - _February 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.25 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.24 - _December 1, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v3.3.23 - _November 16, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v3.3.22 - _November 3, 2021_
|
## v3.3.22 - _November 3, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -20,7 +20,7 @@ We strongly recommend that the community help us make improvements and determine
|
|||||||
|
|
||||||
For proposals regarding the 0x protocol's smart contract architecture, message format, or additional functionality, go to the [0x Improvement Proposals (ZEIPs)](https://github.com/0xProject/ZEIPs) repository and follow the contribution guidelines provided therein.
|
For proposals regarding the 0x protocol's smart contract architecture, message format, or additional functionality, go to the [0x Improvement Proposals (ZEIPs)](https://github.com/0xProject/ZEIPs) repository and follow the contribution guidelines provided therein.
|
||||||
|
|
||||||
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
Please read our [contribution guidelines](../../.github/CONTRIBUTING.md) before getting started.
|
||||||
|
|
||||||
### Install Dependencies
|
### Install Dependencies
|
||||||
|
|
||||||
@@ -67,7 +67,3 @@ yarn lint
|
|||||||
```bash
|
```bash
|
||||||
yarn test
|
yarn test
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Testing options
|
|
||||||
|
|
||||||
Contracts testing options like coverage, profiling, revert traces or backing node choosing - are described [here](../TESTING.md).
|
|
||||||
|
@@ -20,12 +20,9 @@ pragma solidity ^0.5.9;
|
|||||||
|
|
||||||
import "./interfaces/IERC20Token.sol";
|
import "./interfaces/IERC20Token.sol";
|
||||||
|
|
||||||
|
contract ERC20Token is IERC20Token {
|
||||||
contract ERC20Token is
|
mapping(address => uint256) internal balances;
|
||||||
IERC20Token
|
mapping(address => mapping(address => uint256)) internal allowed;
|
||||||
{
|
|
||||||
mapping (address => uint256) internal balances;
|
|
||||||
mapping (address => mapping (address => uint256)) internal allowed;
|
|
||||||
|
|
||||||
uint256 internal _totalSupply;
|
uint256 internal _totalSupply;
|
||||||
|
|
||||||
@@ -33,27 +30,14 @@ contract ERC20Token is
|
|||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
/// @return True if transfer was successful
|
/// @return True if transfer was successful
|
||||||
function transfer(address _to, uint256 _value)
|
function transfer(address _to, uint256 _value) external returns (bool) {
|
||||||
external
|
require(balances[msg.sender] >= _value, "ERC20_INSUFFICIENT_BALANCE");
|
||||||
returns (bool)
|
require(balances[_to] + _value >= balances[_to], "UINT256_OVERFLOW");
|
||||||
{
|
|
||||||
require(
|
|
||||||
balances[msg.sender] >= _value,
|
|
||||||
"ERC20_INSUFFICIENT_BALANCE"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
balances[_to] + _value >= balances[_to],
|
|
||||||
"UINT256_OVERFLOW"
|
|
||||||
);
|
|
||||||
|
|
||||||
balances[msg.sender] -= _value;
|
balances[msg.sender] -= _value;
|
||||||
balances[_to] += _value;
|
balances[_to] += _value;
|
||||||
|
|
||||||
emit Transfer(
|
emit Transfer(msg.sender, _to, _value);
|
||||||
msg.sender,
|
|
||||||
_to,
|
|
||||||
_value
|
|
||||||
);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -63,36 +47,16 @@ contract ERC20Token is
|
|||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
/// @return True if transfer was successful
|
/// @return True if transfer was successful
|
||||||
function transferFrom(
|
function transferFrom(address _from, address _to, uint256 _value) external returns (bool) {
|
||||||
address _from,
|
require(balances[_from] >= _value, "ERC20_INSUFFICIENT_BALANCE");
|
||||||
address _to,
|
require(allowed[_from][msg.sender] >= _value, "ERC20_INSUFFICIENT_ALLOWANCE");
|
||||||
uint256 _value
|
require(balances[_to] + _value >= balances[_to], "UINT256_OVERFLOW");
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
require(
|
|
||||||
balances[_from] >= _value,
|
|
||||||
"ERC20_INSUFFICIENT_BALANCE"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
allowed[_from][msg.sender] >= _value,
|
|
||||||
"ERC20_INSUFFICIENT_ALLOWANCE"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
balances[_to] + _value >= balances[_to],
|
|
||||||
"UINT256_OVERFLOW"
|
|
||||||
);
|
|
||||||
|
|
||||||
balances[_to] += _value;
|
balances[_to] += _value;
|
||||||
balances[_from] -= _value;
|
balances[_from] -= _value;
|
||||||
allowed[_from][msg.sender] -= _value;
|
allowed[_from][msg.sender] -= _value;
|
||||||
|
|
||||||
emit Transfer(
|
emit Transfer(_from, _to, _value);
|
||||||
_from,
|
|
||||||
_to,
|
|
||||||
_value
|
|
||||||
);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -101,48 +65,29 @@ contract ERC20Token is
|
|||||||
/// @param _spender The address of the account able to transfer the tokens
|
/// @param _spender The address of the account able to transfer the tokens
|
||||||
/// @param _value The amount of wei to be approved for transfer
|
/// @param _value The amount of wei to be approved for transfer
|
||||||
/// @return Always true if the call has enough gas to complete execution
|
/// @return Always true if the call has enough gas to complete execution
|
||||||
function approve(address _spender, uint256 _value)
|
function approve(address _spender, uint256 _value) external returns (bool) {
|
||||||
external
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
allowed[msg.sender][_spender] = _value;
|
allowed[msg.sender][_spender] = _value;
|
||||||
emit Approval(
|
emit Approval(msg.sender, _spender, _value);
|
||||||
msg.sender,
|
|
||||||
_spender,
|
|
||||||
_value
|
|
||||||
);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Query total supply of token
|
/// @dev Query total supply of token
|
||||||
/// @return Total supply of token
|
/// @return Total supply of token
|
||||||
function totalSupply()
|
function totalSupply() external view returns (uint256) {
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256)
|
|
||||||
{
|
|
||||||
return _totalSupply;
|
return _totalSupply;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Query the balance of owner
|
/// @dev Query the balance of owner
|
||||||
/// @param _owner The address from which the balance will be retrieved
|
/// @param _owner The address from which the balance will be retrieved
|
||||||
/// @return Balance of owner
|
/// @return Balance of owner
|
||||||
function balanceOf(address _owner)
|
function balanceOf(address _owner) external view returns (uint256) {
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256)
|
|
||||||
{
|
|
||||||
return balances[_owner];
|
return balances[_owner];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @param _owner The address of the account owning tokens
|
/// @param _owner The address of the account owning tokens
|
||||||
/// @param _spender The address of the account able to transfer the tokens
|
/// @param _spender The address of the account able to transfer the tokens
|
||||||
/// @return Amount of remaining tokens allowed to spent
|
/// @return Amount of remaining tokens allowed to spent
|
||||||
function allowance(address _owner, address _spender)
|
function allowance(address _owner, address _spender) external view returns (uint256) {
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256)
|
|
||||||
{
|
|
||||||
return allowed[_owner][_spender];
|
return allowed[_owner][_spender];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -22,9 +22,8 @@ import "@0x/contracts-utils/contracts/src/LibRichErrors.sol";
|
|||||||
import "@0x/contracts-utils/contracts/src/LibBytes.sol";
|
import "@0x/contracts-utils/contracts/src/LibBytes.sol";
|
||||||
import "../src/interfaces/IERC20Token.sol";
|
import "../src/interfaces/IERC20Token.sol";
|
||||||
|
|
||||||
|
|
||||||
library LibERC20Token {
|
library LibERC20Token {
|
||||||
bytes constant private DECIMALS_CALL_DATA = hex"313ce567";
|
bytes private constant DECIMALS_CALL_DATA = hex"313ce567";
|
||||||
|
|
||||||
/// @dev Calls `IERC20Token(token).approve()`.
|
/// @dev Calls `IERC20Token(token).approve()`.
|
||||||
/// Reverts if `false` is returned or if the return
|
/// Reverts if `false` is returned or if the return
|
||||||
@@ -32,18 +31,8 @@ library LibERC20Token {
|
|||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @param spender The address that receives an allowance.
|
/// @param spender The address that receives an allowance.
|
||||||
/// @param allowance The allowance to set.
|
/// @param allowance The allowance to set.
|
||||||
function approve(
|
function approve(address token, address spender, uint256 allowance) internal {
|
||||||
address token,
|
bytes memory callData = abi.encodeWithSelector(IERC20Token(0).approve.selector, spender, allowance);
|
||||||
address spender,
|
|
||||||
uint256 allowance
|
|
||||||
)
|
|
||||||
internal
|
|
||||||
{
|
|
||||||
bytes memory callData = abi.encodeWithSelector(
|
|
||||||
IERC20Token(0).approve.selector,
|
|
||||||
spender,
|
|
||||||
allowance
|
|
||||||
);
|
|
||||||
_callWithOptionalBooleanResult(token, callData);
|
_callWithOptionalBooleanResult(token, callData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,13 +43,7 @@ library LibERC20Token {
|
|||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @param spender The address that receives an allowance.
|
/// @param spender The address that receives an allowance.
|
||||||
/// @param amount The minimum allowance needed.
|
/// @param amount The minimum allowance needed.
|
||||||
function approveIfBelow(
|
function approveIfBelow(address token, address spender, uint256 amount) internal {
|
||||||
address token,
|
|
||||||
address spender,
|
|
||||||
uint256 amount
|
|
||||||
)
|
|
||||||
internal
|
|
||||||
{
|
|
||||||
if (IERC20Token(token).allowance(address(this), spender) < amount) {
|
if (IERC20Token(token).allowance(address(this), spender) < amount) {
|
||||||
approve(token, spender, uint256(-1));
|
approve(token, spender, uint256(-1));
|
||||||
}
|
}
|
||||||
@@ -72,18 +55,8 @@ library LibERC20Token {
|
|||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @param to The address that receives the tokens
|
/// @param to The address that receives the tokens
|
||||||
/// @param amount Number of tokens to transfer.
|
/// @param amount Number of tokens to transfer.
|
||||||
function transfer(
|
function transfer(address token, address to, uint256 amount) internal {
|
||||||
address token,
|
bytes memory callData = abi.encodeWithSelector(IERC20Token(0).transfer.selector, to, amount);
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
)
|
|
||||||
internal
|
|
||||||
{
|
|
||||||
bytes memory callData = abi.encodeWithSelector(
|
|
||||||
IERC20Token(0).transfer.selector,
|
|
||||||
to,
|
|
||||||
amount
|
|
||||||
);
|
|
||||||
_callWithOptionalBooleanResult(token, callData);
|
_callWithOptionalBooleanResult(token, callData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,20 +67,8 @@ library LibERC20Token {
|
|||||||
/// @param from The owner of the tokens.
|
/// @param from The owner of the tokens.
|
||||||
/// @param to The address that receives the tokens
|
/// @param to The address that receives the tokens
|
||||||
/// @param amount Number of tokens to transfer.
|
/// @param amount Number of tokens to transfer.
|
||||||
function transferFrom(
|
function transferFrom(address token, address from, address to, uint256 amount) internal {
|
||||||
address token,
|
bytes memory callData = abi.encodeWithSelector(IERC20Token(0).transferFrom.selector, from, to, amount);
|
||||||
address from,
|
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
)
|
|
||||||
internal
|
|
||||||
{
|
|
||||||
bytes memory callData = abi.encodeWithSelector(
|
|
||||||
IERC20Token(0).transferFrom.selector,
|
|
||||||
from,
|
|
||||||
to,
|
|
||||||
amount
|
|
||||||
);
|
|
||||||
_callWithOptionalBooleanResult(token, callData);
|
_callWithOptionalBooleanResult(token, callData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,11 +76,7 @@ library LibERC20Token {
|
|||||||
/// Returns `18` if the call reverts.
|
/// Returns `18` if the call reverts.
|
||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @return tokenDecimals The number of decimals places for the token.
|
/// @return tokenDecimals The number of decimals places for the token.
|
||||||
function decimals(address token)
|
function decimals(address token) internal view returns (uint8 tokenDecimals) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (uint8 tokenDecimals)
|
|
||||||
{
|
|
||||||
tokenDecimals = 18;
|
tokenDecimals = 18;
|
||||||
(bool didSucceed, bytes memory resultData) = token.staticcall(DECIMALS_CALL_DATA);
|
(bool didSucceed, bytes memory resultData) = token.staticcall(DECIMALS_CALL_DATA);
|
||||||
if (didSucceed && resultData.length == 32) {
|
if (didSucceed && resultData.length == 32) {
|
||||||
@@ -133,17 +90,9 @@ library LibERC20Token {
|
|||||||
/// @param owner The owner of the tokens.
|
/// @param owner The owner of the tokens.
|
||||||
/// @param spender The address the spender.
|
/// @param spender The address the spender.
|
||||||
/// @return allowance The allowance for a token, owner, and spender.
|
/// @return allowance The allowance for a token, owner, and spender.
|
||||||
function allowance(address token, address owner, address spender)
|
function allowance(address token, address owner, address spender) internal view returns (uint256 allowance_) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (uint256 allowance_)
|
|
||||||
{
|
|
||||||
(bool didSucceed, bytes memory resultData) = token.staticcall(
|
(bool didSucceed, bytes memory resultData) = token.staticcall(
|
||||||
abi.encodeWithSelector(
|
abi.encodeWithSelector(IERC20Token(0).allowance.selector, owner, spender)
|
||||||
IERC20Token(0).allowance.selector,
|
|
||||||
owner,
|
|
||||||
spender
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
if (didSucceed && resultData.length == 32) {
|
if (didSucceed && resultData.length == 32) {
|
||||||
allowance_ = LibBytes.readUint256(resultData, 0);
|
allowance_ = LibBytes.readUint256(resultData, 0);
|
||||||
@@ -155,16 +104,9 @@ library LibERC20Token {
|
|||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @param owner The owner of the tokens.
|
/// @param owner The owner of the tokens.
|
||||||
/// @return balance The token balance of an owner.
|
/// @return balance The token balance of an owner.
|
||||||
function balanceOf(address token, address owner)
|
function balanceOf(address token, address owner) internal view returns (uint256 balance) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (uint256 balance)
|
|
||||||
{
|
|
||||||
(bool didSucceed, bytes memory resultData) = token.staticcall(
|
(bool didSucceed, bytes memory resultData) = token.staticcall(
|
||||||
abi.encodeWithSelector(
|
abi.encodeWithSelector(IERC20Token(0).balanceOf.selector, owner)
|
||||||
IERC20Token(0).balanceOf.selector,
|
|
||||||
owner
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
if (didSucceed && resultData.length == 32) {
|
if (didSucceed && resultData.length == 32) {
|
||||||
balance = LibBytes.readUint256(resultData, 0);
|
balance = LibBytes.readUint256(resultData, 0);
|
||||||
@@ -176,12 +118,7 @@ library LibERC20Token {
|
|||||||
/// was returned equal to `true`.
|
/// was returned equal to `true`.
|
||||||
/// @param target The call target.
|
/// @param target The call target.
|
||||||
/// @param callData The abi-encoded call data.
|
/// @param callData The abi-encoded call data.
|
||||||
function _callWithOptionalBooleanResult(
|
function _callWithOptionalBooleanResult(address target, bytes memory callData) private {
|
||||||
address target,
|
|
||||||
bytes memory callData
|
|
||||||
)
|
|
||||||
private
|
|
||||||
{
|
|
||||||
(bool didSucceed, bytes memory resultData) = target.call(callData);
|
(bool didSucceed, bytes memory resultData) = target.call(callData);
|
||||||
if (didSucceed) {
|
if (didSucceed) {
|
||||||
if (resultData.length == 0) {
|
if (resultData.length == 0) {
|
||||||
|
@@ -21,41 +21,26 @@ pragma solidity ^0.5.9;
|
|||||||
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
|
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
|
||||||
import "./UnlimitedAllowanceERC20Token.sol";
|
import "./UnlimitedAllowanceERC20Token.sol";
|
||||||
|
|
||||||
|
contract MintableERC20Token is UnlimitedAllowanceERC20Token {
|
||||||
contract MintableERC20Token is
|
|
||||||
UnlimitedAllowanceERC20Token
|
|
||||||
{
|
|
||||||
using LibSafeMath for uint256;
|
using LibSafeMath for uint256;
|
||||||
|
|
||||||
/// @dev Mints new tokens
|
/// @dev Mints new tokens
|
||||||
/// @param _to Address of the beneficiary that will own the minted token
|
/// @param _to Address of the beneficiary that will own the minted token
|
||||||
/// @param _value Amount of tokens to mint
|
/// @param _value Amount of tokens to mint
|
||||||
function _mint(address _to, uint256 _value)
|
function _mint(address _to, uint256 _value) internal {
|
||||||
internal
|
|
||||||
{
|
|
||||||
balances[_to] = _value.safeAdd(balances[_to]);
|
balances[_to] = _value.safeAdd(balances[_to]);
|
||||||
_totalSupply = _totalSupply.safeAdd(_value);
|
_totalSupply = _totalSupply.safeAdd(_value);
|
||||||
|
|
||||||
emit Transfer(
|
emit Transfer(address(0), _to, _value);
|
||||||
address(0),
|
|
||||||
_to,
|
|
||||||
_value
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Mints new tokens
|
/// @dev Mints new tokens
|
||||||
/// @param _owner Owner of tokens that will be burned
|
/// @param _owner Owner of tokens that will be burned
|
||||||
/// @param _value Amount of tokens to burn
|
/// @param _value Amount of tokens to burn
|
||||||
function _burn(address _owner, uint256 _value)
|
function _burn(address _owner, uint256 _value) internal {
|
||||||
internal
|
|
||||||
{
|
|
||||||
balances[_owner] = balances[_owner].safeSub(_value);
|
balances[_owner] = balances[_owner].safeSub(_value);
|
||||||
_totalSupply = _totalSupply.safeSub(_value);
|
_totalSupply = _totalSupply.safeSub(_value);
|
||||||
|
|
||||||
emit Transfer(
|
emit Transfer(_owner, address(0), _value);
|
||||||
_owner,
|
|
||||||
address(0),
|
|
||||||
_value
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,38 +20,20 @@ pragma solidity ^0.5.9;
|
|||||||
|
|
||||||
import "./ERC20Token.sol";
|
import "./ERC20Token.sol";
|
||||||
|
|
||||||
|
contract UnlimitedAllowanceERC20Token is ERC20Token {
|
||||||
|
uint256 internal constant MAX_UINT = 2 ** 256 - 1;
|
||||||
|
|
||||||
contract UnlimitedAllowanceERC20Token is
|
/// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.
|
||||||
ERC20Token
|
// See https://github.com/ethereum/EIPs/issues/717
|
||||||
{
|
|
||||||
uint256 constant internal MAX_UINT = 2**256 - 1;
|
|
||||||
|
|
||||||
/// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance. See https://github.com/ethereum/EIPs/issues/717
|
|
||||||
/// @param _from Address to transfer from.
|
/// @param _from Address to transfer from.
|
||||||
/// @param _to Address to transfer to.
|
/// @param _to Address to transfer to.
|
||||||
/// @param _value Amount to transfer.
|
/// @param _value Amount to transfer.
|
||||||
/// @return Success of transfer.
|
/// @return Success of transfer.
|
||||||
function transferFrom(
|
function transferFrom(address _from, address _to, uint256 _value) external returns (bool) {
|
||||||
address _from,
|
|
||||||
address _to,
|
|
||||||
uint256 _value
|
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
uint256 allowance = allowed[_from][msg.sender];
|
uint256 allowance = allowed[_from][msg.sender];
|
||||||
require(
|
require(balances[_from] >= _value, "ERC20_INSUFFICIENT_BALANCE");
|
||||||
balances[_from] >= _value,
|
require(allowance >= _value, "ERC20_INSUFFICIENT_ALLOWANCE");
|
||||||
"ERC20_INSUFFICIENT_BALANCE"
|
require(balances[_to] + _value >= balances[_to], "UINT256_OVERFLOW");
|
||||||
);
|
|
||||||
require(
|
|
||||||
allowance >= _value,
|
|
||||||
"ERC20_INSUFFICIENT_ALLOWANCE"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
balances[_to] + _value >= balances[_to],
|
|
||||||
"UINT256_OVERFLOW"
|
|
||||||
);
|
|
||||||
|
|
||||||
balances[_to] += _value;
|
balances[_to] += _value;
|
||||||
balances[_from] -= _value;
|
balances[_from] -= _value;
|
||||||
@@ -59,11 +41,7 @@ contract UnlimitedAllowanceERC20Token is
|
|||||||
allowed[_from][msg.sender] -= _value;
|
allowed[_from][msg.sender] -= _value;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit Transfer(
|
emit Transfer(_from, _to, _value);
|
||||||
_from,
|
|
||||||
_to,
|
|
||||||
_value
|
|
||||||
);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -13,58 +13,55 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// solhint-disable
|
|
||||||
pragma solidity ^0.5.9;
|
pragma solidity ^0.5.9;
|
||||||
|
|
||||||
|
|
||||||
contract WETH9 {
|
contract WETH9 {
|
||||||
string public name = "Wrapped Ether";
|
string public name = "Wrapped Ether";
|
||||||
string public symbol = "WETH";
|
string public symbol = "WETH";
|
||||||
uint8 public decimals = 18;
|
uint8 public decimals = 18;
|
||||||
|
|
||||||
event Approval(address indexed _owner, address indexed _spender, uint _value);
|
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
|
||||||
event Transfer(address indexed _from, address indexed _to, uint _value);
|
event Transfer(address indexed _from, address indexed _to, uint256 _value);
|
||||||
event Deposit(address indexed _owner, uint _value);
|
event Deposit(address indexed _owner, uint256 _value);
|
||||||
event Withdrawal(address indexed _owner, uint _value);
|
event Withdrawal(address indexed _owner, uint256 _value);
|
||||||
|
|
||||||
mapping (address => uint) public balanceOf;
|
mapping(address => uint256) public balanceOf;
|
||||||
mapping (address => mapping (address => uint)) public allowance;
|
mapping(address => mapping(address => uint256)) public allowance;
|
||||||
|
|
||||||
function() external payable {
|
function() external payable {
|
||||||
deposit();
|
deposit();
|
||||||
}
|
}
|
||||||
|
|
||||||
function deposit() public payable {
|
function deposit() public payable {
|
||||||
balanceOf[msg.sender] += msg.value;
|
balanceOf[msg.sender] += msg.value;
|
||||||
emit Deposit(msg.sender, msg.value);
|
emit Deposit(msg.sender, msg.value);
|
||||||
}
|
}
|
||||||
function withdraw(uint wad) public {
|
|
||||||
|
function withdraw(uint256 wad) public {
|
||||||
require(balanceOf[msg.sender] >= wad);
|
require(balanceOf[msg.sender] >= wad);
|
||||||
balanceOf[msg.sender] -= wad;
|
balanceOf[msg.sender] -= wad;
|
||||||
msg.sender.transfer(wad);
|
msg.sender.transfer(wad);
|
||||||
emit Withdrawal(msg.sender, wad);
|
emit Withdrawal(msg.sender, wad);
|
||||||
}
|
}
|
||||||
|
|
||||||
function totalSupply() public view returns (uint) {
|
function totalSupply() public view returns (uint256) {
|
||||||
return address(this).balance;
|
return address(this).balance;
|
||||||
}
|
}
|
||||||
|
|
||||||
function approve(address guy, uint wad) public returns (bool) {
|
function approve(address guy, uint256 wad) public returns (bool) {
|
||||||
allowance[msg.sender][guy] = wad;
|
allowance[msg.sender][guy] = wad;
|
||||||
emit Approval(msg.sender, guy, wad);
|
emit Approval(msg.sender, guy, wad);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function transfer(address dst, uint wad) public returns (bool) {
|
function transfer(address dst, uint256 wad) public returns (bool) {
|
||||||
return transferFrom(msg.sender, dst, wad);
|
return transferFrom(msg.sender, dst, wad);
|
||||||
}
|
}
|
||||||
|
|
||||||
function transferFrom(address src, address dst, uint wad)
|
function transferFrom(address src, address dst, uint256 wad) public returns (bool) {
|
||||||
public
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
require(balanceOf[src] >= wad);
|
require(balanceOf[src] >= wad);
|
||||||
|
|
||||||
if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
|
if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) {
|
||||||
require(allowance[src][msg.sender] >= wad);
|
require(allowance[src][msg.sender] >= wad);
|
||||||
allowance[src][msg.sender] -= wad;
|
allowance[src][msg.sender] -= wad;
|
||||||
}
|
}
|
||||||
@@ -78,7 +75,6 @@ contract WETH9 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
@@ -18,105 +18,99 @@
|
|||||||
|
|
||||||
pragma solidity 0.4.11;
|
pragma solidity 0.4.11;
|
||||||
|
|
||||||
|
|
||||||
contract Token {
|
contract Token {
|
||||||
|
|
||||||
/// @return total amount of tokens
|
/// @return total amount of tokens
|
||||||
function totalSupply() constant returns (uint supply) {}
|
function totalSupply() constant returns (uint256 supply) {}
|
||||||
|
|
||||||
/// @param _owner The address from which the balance will be retrieved
|
/// @param _owner The address from which the balance will be retrieved
|
||||||
/// @return The balance
|
/// @return The balance
|
||||||
function balanceOf(address _owner) constant returns (uint balance) {}
|
function balanceOf(address _owner) constant returns (uint256 balance) {}
|
||||||
|
|
||||||
/// @notice send `_value` token to `_to` from `msg.sender`
|
/// @notice send `_value` token to `_to` from `msg.sender`
|
||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
/// @return Whether the transfer was successful or not
|
/// @return Whether the transfer was successful or not
|
||||||
function transfer(address _to, uint _value) returns (bool success) {}
|
function transfer(address _to, uint256 _value) returns (bool success) {}
|
||||||
|
|
||||||
/// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
|
/// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
|
||||||
/// @param _from The address of the sender
|
/// @param _from The address of the sender
|
||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
/// @return Whether the transfer was successful or not
|
/// @return Whether the transfer was successful or not
|
||||||
function transferFrom(address _from, address _to, uint _value) returns (bool success) {}
|
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {}
|
||||||
|
|
||||||
/// @notice `msg.sender` approves `_addr` to spend `_value` tokens
|
/// @notice `msg.sender` approves `_addr` to spend `_value` tokens
|
||||||
/// @param _spender The address of the account able to transfer the tokens
|
/// @param _spender The address of the account able to transfer the tokens
|
||||||
/// @param _value The amount of wei to be approved for transfer
|
/// @param _value The amount of wei to be approved for transfer
|
||||||
/// @return Whether the approval was successful or not
|
/// @return Whether the approval was successful or not
|
||||||
function approve(address _spender, uint _value) returns (bool success) {}
|
function approve(address _spender, uint256 _value) returns (bool success) {}
|
||||||
|
|
||||||
/// @param _owner The address of the account owning tokens
|
/// @param _owner The address of the account owning tokens
|
||||||
/// @param _spender The address of the account able to transfer the tokens
|
/// @param _spender The address of the account able to transfer the tokens
|
||||||
/// @return Amount of remaining tokens allowed to spent
|
/// @return Amount of remaining tokens allowed to spent
|
||||||
function allowance(address _owner, address _spender) constant returns (uint remaining) {}
|
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {}
|
||||||
|
|
||||||
event Transfer(address indexed _from, address indexed _to, uint _value);
|
event Transfer(address indexed _from, address indexed _to, uint256 _value);
|
||||||
event Approval(address indexed _owner, address indexed _spender, uint _value);
|
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
contract ERC20Token is Token {
|
contract ERC20Token is Token {
|
||||||
|
function transfer(address _to, uint256 _value) returns (bool) {
|
||||||
function transfer(address _to, uint _value) returns (bool) {
|
|
||||||
//Default assumes totalSupply can't be over max (2^256 - 1).
|
//Default assumes totalSupply can't be over max (2^256 - 1).
|
||||||
if (balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {
|
if (balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {
|
||||||
balances[msg.sender] -= _value;
|
balances[msg.sender] -= _value;
|
||||||
balances[_to] += _value;
|
balances[_to] += _value;
|
||||||
Transfer(msg.sender, _to, _value);
|
Transfer(msg.sender, _to, _value);
|
||||||
return true;
|
return true;
|
||||||
} else { return false; }
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function transferFrom(address _from, address _to, uint _value) returns (bool) {
|
function transferFrom(address _from, address _to, uint256 _value) returns (bool) {
|
||||||
if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {
|
if (
|
||||||
|
balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]
|
||||||
|
) {
|
||||||
balances[_to] += _value;
|
balances[_to] += _value;
|
||||||
balances[_from] -= _value;
|
balances[_from] -= _value;
|
||||||
allowed[_from][msg.sender] -= _value;
|
allowed[_from][msg.sender] -= _value;
|
||||||
Transfer(_from, _to, _value);
|
Transfer(_from, _to, _value);
|
||||||
return true;
|
return true;
|
||||||
} else { return false; }
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function balanceOf(address _owner) constant returns (uint) {
|
function balanceOf(address _owner) constant returns (uint256) {
|
||||||
return balances[_owner];
|
return balances[_owner];
|
||||||
}
|
}
|
||||||
|
|
||||||
function approve(address _spender, uint _value) returns (bool) {
|
function approve(address _spender, uint256 _value) returns (bool) {
|
||||||
allowed[msg.sender][_spender] = _value;
|
allowed[msg.sender][_spender] = _value;
|
||||||
Approval(msg.sender, _spender, _value);
|
Approval(msg.sender, _spender, _value);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function allowance(address _owner, address _spender) constant returns (uint) {
|
function allowance(address _owner, address _spender) constant returns (uint256) {
|
||||||
return allowed[_owner][_spender];
|
return allowed[_owner][_spender];
|
||||||
}
|
}
|
||||||
|
|
||||||
mapping (address => uint) balances;
|
mapping(address => uint256) balances;
|
||||||
mapping (address => mapping (address => uint)) allowed;
|
mapping(address => mapping(address => uint256)) allowed;
|
||||||
uint public totalSupply;
|
uint256 public totalSupply;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
contract UnlimitedAllowanceToken is ERC20Token {
|
contract UnlimitedAllowanceToken is ERC20Token {
|
||||||
|
uint256 constant MAX_UINT = 2 ** 256 - 1;
|
||||||
uint constant MAX_UINT = 2**256 - 1;
|
|
||||||
|
|
||||||
/// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.
|
/// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.
|
||||||
/// @param _from Address to transfer from.
|
/// @param _from Address to transfer from.
|
||||||
/// @param _to Address to transfer to.
|
/// @param _to Address to transfer to.
|
||||||
/// @param _value Amount to transfer.
|
/// @param _value Amount to transfer.
|
||||||
/// @return Success of transfer.
|
/// @return Success of transfer.
|
||||||
function transferFrom(address _from, address _to, uint _value)
|
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
|
||||||
public
|
uint256 allowance = allowed[_from][msg.sender];
|
||||||
returns (bool)
|
if (balances[_from] >= _value && allowance >= _value && balances[_to] + _value >= balances[_to]) {
|
||||||
{
|
|
||||||
uint allowance = allowed[_from][msg.sender];
|
|
||||||
if (balances[_from] >= _value
|
|
||||||
&& allowance >= _value
|
|
||||||
&& balances[_to] + _value >= balances[_to]
|
|
||||||
) {
|
|
||||||
balances[_to] += _value;
|
balances[_to] += _value;
|
||||||
balances[_from] -= _value;
|
balances[_from] -= _value;
|
||||||
if (allowance < MAX_UINT) {
|
if (allowance < MAX_UINT) {
|
||||||
@@ -130,21 +124,13 @@ contract UnlimitedAllowanceToken is ERC20Token {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
contract ZRXToken is UnlimitedAllowanceToken {
|
||||||
|
uint8 public constant decimals = 18;
|
||||||
|
uint256 public totalSupply = 10 ** 27; // 1 billion tokens, 18 decimal places
|
||||||
|
string public constant name = "0x Protocol Token";
|
||||||
|
string public constant symbol = "ZRX";
|
||||||
|
|
||||||
contract ZRXToken is
|
function ZRXToken() public {
|
||||||
UnlimitedAllowanceToken
|
|
||||||
{
|
|
||||||
|
|
||||||
// solhint-disable const-name-snakecase
|
|
||||||
uint8 constant public decimals = 18;
|
|
||||||
uint256 public totalSupply = 10**27; // 1 billion tokens, 18 decimal places
|
|
||||||
string constant public name = "0x Protocol Token";
|
|
||||||
string constant public symbol = "ZRX";
|
|
||||||
// solhint-enableconst-name-snakecase
|
|
||||||
|
|
||||||
function ZRXToken()
|
|
||||||
public
|
|
||||||
{
|
|
||||||
balances[msg.sender] = totalSupply;
|
balances[msg.sender] = totalSupply;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,70 +18,40 @@
|
|||||||
|
|
||||||
pragma solidity ^0.5.9;
|
pragma solidity ^0.5.9;
|
||||||
|
|
||||||
|
|
||||||
contract IERC20Token {
|
contract IERC20Token {
|
||||||
|
event Transfer(address indexed _from, address indexed _to, uint256 _value);
|
||||||
|
|
||||||
// solhint-disable no-simple-event-func-name
|
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
|
||||||
event Transfer(
|
|
||||||
address indexed _from,
|
|
||||||
address indexed _to,
|
|
||||||
uint256 _value
|
|
||||||
);
|
|
||||||
|
|
||||||
event Approval(
|
|
||||||
address indexed _owner,
|
|
||||||
address indexed _spender,
|
|
||||||
uint256 _value
|
|
||||||
);
|
|
||||||
|
|
||||||
/// @dev send `value` token to `to` from `msg.sender`
|
/// @dev send `value` token to `to` from `msg.sender`
|
||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
/// @return True if transfer was successful
|
/// @return True if transfer was successful
|
||||||
function transfer(address _to, uint256 _value)
|
function transfer(address _to, uint256 _value) external returns (bool);
|
||||||
external
|
|
||||||
returns (bool);
|
|
||||||
|
|
||||||
/// @dev send `value` token to `to` from `from` on the condition it is approved by `from`
|
/// @dev send `value` token to `to` from `from` on the condition it is approved by `from`
|
||||||
/// @param _from The address of the sender
|
/// @param _from The address of the sender
|
||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
/// @return True if transfer was successful
|
/// @return True if transfer was successful
|
||||||
function transferFrom(
|
function transferFrom(address _from, address _to, uint256 _value) external returns (bool);
|
||||||
address _from,
|
|
||||||
address _to,
|
|
||||||
uint256 _value
|
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool);
|
|
||||||
|
|
||||||
/// @dev `msg.sender` approves `_spender` to spend `_value` tokens
|
/// @dev `msg.sender` approves `_spender` to spend `_value` tokens
|
||||||
/// @param _spender The address of the account able to transfer the tokens
|
/// @param _spender The address of the account able to transfer the tokens
|
||||||
/// @param _value The amount of wei to be approved for transfer
|
/// @param _value The amount of wei to be approved for transfer
|
||||||
/// @return Always true if the call has enough gas to complete execution
|
/// @return Always true if the call has enough gas to complete execution
|
||||||
function approve(address _spender, uint256 _value)
|
function approve(address _spender, uint256 _value) external returns (bool);
|
||||||
external
|
|
||||||
returns (bool);
|
|
||||||
|
|
||||||
/// @dev Query total supply of token
|
/// @dev Query total supply of token
|
||||||
/// @return Total supply of token
|
/// @return Total supply of token
|
||||||
function totalSupply()
|
function totalSupply() external view returns (uint256);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256);
|
|
||||||
|
|
||||||
/// @param _owner The address from which the balance will be retrieved
|
/// @param _owner The address from which the balance will be retrieved
|
||||||
/// @return Balance of owner
|
/// @return Balance of owner
|
||||||
function balanceOf(address _owner)
|
function balanceOf(address _owner) external view returns (uint256);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256);
|
|
||||||
|
|
||||||
/// @param _owner The address of the account owning tokens
|
/// @param _owner The address of the account owning tokens
|
||||||
/// @param _spender The address of the account able to transfer the tokens
|
/// @param _spender The address of the account able to transfer the tokens
|
||||||
/// @return Amount of remaining tokens allowed to spent
|
/// @return Amount of remaining tokens allowed to spent
|
||||||
function allowance(address _owner, address _spender)
|
function allowance(address _owner, address _spender) external view returns (uint256);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256);
|
|
||||||
}
|
}
|
||||||
|
@@ -20,14 +20,8 @@ pragma solidity ^0.5.9;
|
|||||||
|
|
||||||
import "./IERC20Token.sol";
|
import "./IERC20Token.sol";
|
||||||
|
|
||||||
|
contract IEtherToken is IERC20Token {
|
||||||
|
function deposit() public payable;
|
||||||
|
|
||||||
contract IEtherToken is
|
function withdraw(uint256 amount) public;
|
||||||
IERC20Token
|
|
||||||
{
|
|
||||||
function deposit()
|
|
||||||
public
|
|
||||||
payable;
|
|
||||||
|
|
||||||
function withdraw(uint256 amount)
|
|
||||||
public;
|
|
||||||
}
|
}
|
||||||
|
@@ -19,78 +19,45 @@
|
|||||||
|
|
||||||
pragma solidity ^0.6.5;
|
pragma solidity ^0.6.5;
|
||||||
|
|
||||||
|
|
||||||
interface IERC20TokenV06 {
|
interface IERC20TokenV06 {
|
||||||
|
event Transfer(address indexed from, address indexed to, uint256 value);
|
||||||
|
|
||||||
// solhint-disable no-simple-event-func-name
|
event Approval(address indexed owner, address indexed spender, uint256 value);
|
||||||
event Transfer(
|
|
||||||
address indexed from,
|
|
||||||
address indexed to,
|
|
||||||
uint256 value
|
|
||||||
);
|
|
||||||
|
|
||||||
event Approval(
|
|
||||||
address indexed owner,
|
|
||||||
address indexed spender,
|
|
||||||
uint256 value
|
|
||||||
);
|
|
||||||
|
|
||||||
/// @dev send `value` token to `to` from `msg.sender`
|
/// @dev send `value` token to `to` from `msg.sender`
|
||||||
/// @param to The address of the recipient
|
/// @param to The address of the recipient
|
||||||
/// @param value The amount of token to be transferred
|
/// @param value The amount of token to be transferred
|
||||||
/// @return True if transfer was successful
|
/// @return True if transfer was successful
|
||||||
function transfer(address to, uint256 value)
|
function transfer(address to, uint256 value) external returns (bool);
|
||||||
external
|
|
||||||
returns (bool);
|
|
||||||
|
|
||||||
/// @dev send `value` token to `to` from `from` on the condition it is approved by `from`
|
/// @dev send `value` token to `to` from `from` on the condition it is approved by `from`
|
||||||
/// @param from The address of the sender
|
/// @param from The address of the sender
|
||||||
/// @param to The address of the recipient
|
/// @param to The address of the recipient
|
||||||
/// @param value The amount of token to be transferred
|
/// @param value The amount of token to be transferred
|
||||||
/// @return True if transfer was successful
|
/// @return True if transfer was successful
|
||||||
function transferFrom(
|
function transferFrom(address from, address to, uint256 value) external returns (bool);
|
||||||
address from,
|
|
||||||
address to,
|
|
||||||
uint256 value
|
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool);
|
|
||||||
|
|
||||||
/// @dev `msg.sender` approves `spender` to spend `value` tokens
|
/// @dev `msg.sender` approves `spender` to spend `value` tokens
|
||||||
/// @param spender The address of the account able to transfer the tokens
|
/// @param spender The address of the account able to transfer the tokens
|
||||||
/// @param value The amount of wei to be approved for transfer
|
/// @param value The amount of wei to be approved for transfer
|
||||||
/// @return Always true if the call has enough gas to complete execution
|
/// @return Always true if the call has enough gas to complete execution
|
||||||
function approve(address spender, uint256 value)
|
function approve(address spender, uint256 value) external returns (bool);
|
||||||
external
|
|
||||||
returns (bool);
|
|
||||||
|
|
||||||
/// @dev Query total supply of token
|
/// @dev Query total supply of token
|
||||||
/// @return Total supply of token
|
/// @return Total supply of token
|
||||||
function totalSupply()
|
function totalSupply() external view returns (uint256);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256);
|
|
||||||
|
|
||||||
/// @dev Get the balance of `owner`.
|
/// @dev Get the balance of `owner`.
|
||||||
/// @param owner The address from which the balance will be retrieved
|
/// @param owner The address from which the balance will be retrieved
|
||||||
/// @return Balance of owner
|
/// @return Balance of owner
|
||||||
function balanceOf(address owner)
|
function balanceOf(address owner) external view returns (uint256);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256);
|
|
||||||
|
|
||||||
/// @dev Get the allowance for `spender` to spend from `owner`.
|
/// @dev Get the allowance for `spender` to spend from `owner`.
|
||||||
/// @param owner The address of the account owning tokens
|
/// @param owner The address of the account owning tokens
|
||||||
/// @param spender The address of the account able to transfer the tokens
|
/// @param spender The address of the account able to transfer the tokens
|
||||||
/// @return Amount of remaining tokens allowed to spent
|
/// @return Amount of remaining tokens allowed to spent
|
||||||
function allowance(address owner, address spender)
|
function allowance(address owner, address spender) external view returns (uint256);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256);
|
|
||||||
|
|
||||||
/// @dev Get the number of decimals this token has.
|
/// @dev Get the number of decimals this token has.
|
||||||
function decimals()
|
function decimals() external view returns (uint8);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint8);
|
|
||||||
}
|
}
|
||||||
|
@@ -21,10 +21,7 @@ pragma solidity ^0.6.5;
|
|||||||
|
|
||||||
import "./IERC20TokenV06.sol";
|
import "./IERC20TokenV06.sol";
|
||||||
|
|
||||||
|
interface IEtherTokenV06 is IERC20TokenV06 {
|
||||||
interface IEtherTokenV06 is
|
|
||||||
IERC20TokenV06
|
|
||||||
{
|
|
||||||
/// @dev Wrap ether.
|
/// @dev Wrap ether.
|
||||||
function deposit() external payable;
|
function deposit() external payable;
|
||||||
|
|
||||||
|
@@ -23,27 +23,16 @@ import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
|
|||||||
import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol";
|
import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol";
|
||||||
import "./IERC20TokenV06.sol";
|
import "./IERC20TokenV06.sol";
|
||||||
|
|
||||||
|
|
||||||
library LibERC20TokenV06 {
|
library LibERC20TokenV06 {
|
||||||
bytes constant private DECIMALS_CALL_DATA = hex"313ce567";
|
bytes private constant DECIMALS_CALL_DATA = hex"313ce567";
|
||||||
|
|
||||||
/// @dev Calls `IERC20TokenV06(token).approve()`.
|
/// @dev Calls `IERC20TokenV06(token).approve()`.
|
||||||
/// Reverts if the return data is invalid or the call reverts.
|
/// Reverts if the return data is invalid or the call reverts.
|
||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @param spender The address that receives an allowance.
|
/// @param spender The address that receives an allowance.
|
||||||
/// @param allowance The allowance to set.
|
/// @param allowance The allowance to set.
|
||||||
function compatApprove(
|
function compatApprove(IERC20TokenV06 token, address spender, uint256 allowance) internal {
|
||||||
IERC20TokenV06 token,
|
bytes memory callData = abi.encodeWithSelector(token.approve.selector, spender, allowance);
|
||||||
address spender,
|
|
||||||
uint256 allowance
|
|
||||||
)
|
|
||||||
internal
|
|
||||||
{
|
|
||||||
bytes memory callData = abi.encodeWithSelector(
|
|
||||||
token.approve.selector,
|
|
||||||
spender,
|
|
||||||
allowance
|
|
||||||
);
|
|
||||||
_callWithOptionalBooleanResult(address(token), callData);
|
_callWithOptionalBooleanResult(address(token), callData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,13 +42,7 @@ library LibERC20TokenV06 {
|
|||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @param spender The address that receives an allowance.
|
/// @param spender The address that receives an allowance.
|
||||||
/// @param amount The minimum allowance needed.
|
/// @param amount The minimum allowance needed.
|
||||||
function approveIfBelow(
|
function approveIfBelow(IERC20TokenV06 token, address spender, uint256 amount) internal {
|
||||||
IERC20TokenV06 token,
|
|
||||||
address spender,
|
|
||||||
uint256 amount
|
|
||||||
)
|
|
||||||
internal
|
|
||||||
{
|
|
||||||
if (token.allowance(address(this), spender) < amount) {
|
if (token.allowance(address(this), spender) < amount) {
|
||||||
compatApprove(token, spender, uint256(-1));
|
compatApprove(token, spender, uint256(-1));
|
||||||
}
|
}
|
||||||
@@ -70,18 +53,8 @@ library LibERC20TokenV06 {
|
|||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @param to The address that receives the tokens
|
/// @param to The address that receives the tokens
|
||||||
/// @param amount Number of tokens to transfer.
|
/// @param amount Number of tokens to transfer.
|
||||||
function compatTransfer(
|
function compatTransfer(IERC20TokenV06 token, address to, uint256 amount) internal {
|
||||||
IERC20TokenV06 token,
|
bytes memory callData = abi.encodeWithSelector(token.transfer.selector, to, amount);
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
)
|
|
||||||
internal
|
|
||||||
{
|
|
||||||
bytes memory callData = abi.encodeWithSelector(
|
|
||||||
token.transfer.selector,
|
|
||||||
to,
|
|
||||||
amount
|
|
||||||
);
|
|
||||||
_callWithOptionalBooleanResult(address(token), callData);
|
_callWithOptionalBooleanResult(address(token), callData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,20 +64,8 @@ library LibERC20TokenV06 {
|
|||||||
/// @param from The owner of the tokens.
|
/// @param from The owner of the tokens.
|
||||||
/// @param to The address that receives the tokens
|
/// @param to The address that receives the tokens
|
||||||
/// @param amount Number of tokens to transfer.
|
/// @param amount Number of tokens to transfer.
|
||||||
function compatTransferFrom(
|
function compatTransferFrom(IERC20TokenV06 token, address from, address to, uint256 amount) internal {
|
||||||
IERC20TokenV06 token,
|
bytes memory callData = abi.encodeWithSelector(token.transferFrom.selector, from, to, amount);
|
||||||
address from,
|
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
)
|
|
||||||
internal
|
|
||||||
{
|
|
||||||
bytes memory callData = abi.encodeWithSelector(
|
|
||||||
token.transferFrom.selector,
|
|
||||||
from,
|
|
||||||
to,
|
|
||||||
amount
|
|
||||||
);
|
|
||||||
_callWithOptionalBooleanResult(address(token), callData);
|
_callWithOptionalBooleanResult(address(token), callData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,11 +73,7 @@ library LibERC20TokenV06 {
|
|||||||
/// Returns `18` if the call reverts.
|
/// Returns `18` if the call reverts.
|
||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @return tokenDecimals The number of decimals places for the token.
|
/// @return tokenDecimals The number of decimals places for the token.
|
||||||
function compatDecimals(IERC20TokenV06 token)
|
function compatDecimals(IERC20TokenV06 token) internal view returns (uint8 tokenDecimals) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (uint8 tokenDecimals)
|
|
||||||
{
|
|
||||||
tokenDecimals = 18;
|
tokenDecimals = 18;
|
||||||
(bool didSucceed, bytes memory resultData) = address(token).staticcall(DECIMALS_CALL_DATA);
|
(bool didSucceed, bytes memory resultData) = address(token).staticcall(DECIMALS_CALL_DATA);
|
||||||
if (didSucceed && resultData.length >= 32) {
|
if (didSucceed && resultData.length >= 32) {
|
||||||
@@ -130,17 +87,13 @@ library LibERC20TokenV06 {
|
|||||||
/// @param owner The owner of the tokens.
|
/// @param owner The owner of the tokens.
|
||||||
/// @param spender The address the spender.
|
/// @param spender The address the spender.
|
||||||
/// @return allowance_ The allowance for a token, owner, and spender.
|
/// @return allowance_ The allowance for a token, owner, and spender.
|
||||||
function compatAllowance(IERC20TokenV06 token, address owner, address spender)
|
function compatAllowance(
|
||||||
internal
|
IERC20TokenV06 token,
|
||||||
view
|
address owner,
|
||||||
returns (uint256 allowance_)
|
address spender
|
||||||
{
|
) internal view returns (uint256 allowance_) {
|
||||||
(bool didSucceed, bytes memory resultData) = address(token).staticcall(
|
(bool didSucceed, bytes memory resultData) = address(token).staticcall(
|
||||||
abi.encodeWithSelector(
|
abi.encodeWithSelector(token.allowance.selector, owner, spender)
|
||||||
token.allowance.selector,
|
|
||||||
owner,
|
|
||||||
spender
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
if (didSucceed && resultData.length >= 32) {
|
if (didSucceed && resultData.length >= 32) {
|
||||||
allowance_ = LibBytesV06.readUint256(resultData, 0);
|
allowance_ = LibBytesV06.readUint256(resultData, 0);
|
||||||
@@ -152,16 +105,9 @@ library LibERC20TokenV06 {
|
|||||||
/// @param token The address of the token contract.
|
/// @param token The address of the token contract.
|
||||||
/// @param owner The owner of the tokens.
|
/// @param owner The owner of the tokens.
|
||||||
/// @return balance The token balance of an owner.
|
/// @return balance The token balance of an owner.
|
||||||
function compatBalanceOf(IERC20TokenV06 token, address owner)
|
function compatBalanceOf(IERC20TokenV06 token, address owner) internal view returns (uint256 balance) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (uint256 balance)
|
|
||||||
{
|
|
||||||
(bool didSucceed, bytes memory resultData) = address(token).staticcall(
|
(bool didSucceed, bytes memory resultData) = address(token).staticcall(
|
||||||
abi.encodeWithSelector(
|
abi.encodeWithSelector(token.balanceOf.selector, owner)
|
||||||
token.balanceOf.selector,
|
|
||||||
owner
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
if (didSucceed && resultData.length >= 32) {
|
if (didSucceed && resultData.length >= 32) {
|
||||||
balance = LibBytesV06.readUint256(resultData, 0);
|
balance = LibBytesV06.readUint256(resultData, 0);
|
||||||
@@ -173,12 +119,7 @@ library LibERC20TokenV06 {
|
|||||||
/// was returned equal to `true`.
|
/// was returned equal to `true`.
|
||||||
/// @param target The call target.
|
/// @param target The call target.
|
||||||
/// @param callData The abi-encoded call data.
|
/// @param callData The abi-encoded call data.
|
||||||
function _callWithOptionalBooleanResult(
|
function _callWithOptionalBooleanResult(address target, bytes memory callData) private {
|
||||||
address target,
|
|
||||||
bytes memory callData
|
|
||||||
)
|
|
||||||
private
|
|
||||||
{
|
|
||||||
(bool didSucceed, bytes memory resultData) = target.call(callData);
|
(bool didSucceed, bytes memory resultData) = target.call(callData);
|
||||||
// Revert if the call reverted.
|
// Revert if the call reverted.
|
||||||
if (!didSucceed) {
|
if (!didSucceed) {
|
||||||
@@ -188,7 +129,9 @@ library LibERC20TokenV06 {
|
|||||||
// does not return a boolean. Check that it at least contains code.
|
// does not return a boolean. Check that it at least contains code.
|
||||||
if (resultData.length == 0) {
|
if (resultData.length == 0) {
|
||||||
uint256 size;
|
uint256 size;
|
||||||
assembly { size := extcodesize(target) }
|
assembly {
|
||||||
|
size := extcodesize(target)
|
||||||
|
}
|
||||||
require(size > 0, "invalid token address, contains no code");
|
require(size > 0, "invalid token address, contains no code");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
63
contracts/erc20/contracts/src/v08/IERC20TokenV08.sol
Normal file
63
contracts/erc20/contracts/src/v08/IERC20TokenV08.sol
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2020 ZeroEx Intl.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
pragma solidity ^0.8.0;
|
||||||
|
|
||||||
|
interface IERC20TokenV08 {
|
||||||
|
event Transfer(address indexed from, address indexed to, uint256 value);
|
||||||
|
|
||||||
|
event Approval(address indexed owner, address indexed spender, uint256 value);
|
||||||
|
|
||||||
|
/// @dev send `value` token to `to` from `msg.sender`
|
||||||
|
/// @param to The address of the recipient
|
||||||
|
/// @param value The amount of token to be transferred
|
||||||
|
/// @return True if transfer was successful
|
||||||
|
function transfer(address to, uint256 value) external returns (bool);
|
||||||
|
|
||||||
|
/// @dev send `value` token to `to` from `from` on the condition it is approved by `from`
|
||||||
|
/// @param from The address of the sender
|
||||||
|
/// @param to The address of the recipient
|
||||||
|
/// @param value The amount of token to be transferred
|
||||||
|
/// @return True if transfer was successful
|
||||||
|
function transferFrom(address from, address to, uint256 value) external returns (bool);
|
||||||
|
|
||||||
|
/// @dev `msg.sender` approves `spender` to spend `value` tokens
|
||||||
|
/// @param spender The address of the account able to transfer the tokens
|
||||||
|
/// @param value The amount of wei to be approved for transfer
|
||||||
|
/// @return Always true if the call has enough gas to complete execution
|
||||||
|
function approve(address spender, uint256 value) external returns (bool);
|
||||||
|
|
||||||
|
/// @dev Query total supply of token
|
||||||
|
/// @return Total supply of token
|
||||||
|
function totalSupply() external view returns (uint256);
|
||||||
|
|
||||||
|
/// @dev Get the balance of `owner`.
|
||||||
|
/// @param owner The address from which the balance will be retrieved
|
||||||
|
/// @return Balance of owner
|
||||||
|
function balanceOf(address owner) external view returns (uint256);
|
||||||
|
|
||||||
|
/// @dev Get the allowance for `spender` to spend from `owner`.
|
||||||
|
/// @param owner The address of the account owning tokens
|
||||||
|
/// @param spender The address of the account able to transfer the tokens
|
||||||
|
/// @return Amount of remaining tokens allowed to spent
|
||||||
|
function allowance(address owner, address spender) external view returns (uint256);
|
||||||
|
|
||||||
|
/// @dev Get the number of decimals this token has.
|
||||||
|
function decimals() external view returns (uint8);
|
||||||
|
}
|
@@ -17,17 +17,14 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pragma solidity ^0.6;
|
pragma solidity ^0.8.0;
|
||||||
|
|
||||||
|
import "./IERC20TokenV08.sol";
|
||||||
|
|
||||||
interface IMStable {
|
interface IEtherTokenV08 is IERC20TokenV08 {
|
||||||
|
/// @dev Wrap ether.
|
||||||
|
function deposit() external payable;
|
||||||
|
|
||||||
function getSwapOutput(
|
/// @dev Unwrap ether.
|
||||||
address _input,
|
function withdraw(uint256 amount) external;
|
||||||
address _output,
|
|
||||||
uint256 _quantity
|
|
||||||
)
|
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256 swapOutput);
|
|
||||||
}
|
}
|
146
contracts/erc20/contracts/src/v08/LibERC20TokenV08.sol
Normal file
146
contracts/erc20/contracts/src/v08/LibERC20TokenV08.sol
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2020 ZeroEx Intl.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
pragma solidity ^0.8.0;
|
||||||
|
|
||||||
|
import "@0x/contracts-utils/contracts/src/v08/errors/LibRichErrorsV08.sol";
|
||||||
|
import "@0x/contracts-utils/contracts/src/v08/LibBytesV08.sol";
|
||||||
|
import "./IERC20TokenV08.sol";
|
||||||
|
|
||||||
|
library LibERC20TokenV08 {
|
||||||
|
bytes private constant DECIMALS_CALL_DATA = hex"313ce567";
|
||||||
|
|
||||||
|
/// @dev Calls `IERC20TokenV08(token).approve()`.
|
||||||
|
/// Reverts if the return data is invalid or the call reverts.
|
||||||
|
/// @param token The address of the token contract.
|
||||||
|
/// @param spender The address that receives an allowance.
|
||||||
|
/// @param allowance The allowance to set.
|
||||||
|
function compatApprove(IERC20TokenV08 token, address spender, uint256 allowance) internal {
|
||||||
|
bytes memory callData = abi.encodeCall(token.approve, (spender, allowance));
|
||||||
|
_callWithOptionalBooleanResult(address(token), callData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Calls `IERC20TokenV08(token).approve()` and sets the allowance to the
|
||||||
|
/// maximum if the current approval is not already >= an amount.
|
||||||
|
/// Reverts if the return data is invalid or the call reverts.
|
||||||
|
/// @param token The address of the token contract.
|
||||||
|
/// @param spender The address that receives an allowance.
|
||||||
|
/// @param amount The minimum allowance needed.
|
||||||
|
function approveIfBelow(IERC20TokenV08 token, address spender, uint256 amount) internal {
|
||||||
|
if (token.allowance(address(this), spender) < amount) {
|
||||||
|
compatApprove(token, spender, type(uint256).max);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Calls `IERC20TokenV08(token).transfer()`.
|
||||||
|
/// Reverts if the return data is invalid or the call reverts.
|
||||||
|
/// @param token The address of the token contract.
|
||||||
|
/// @param to The address that receives the tokens
|
||||||
|
/// @param amount Number of tokens to transfer.
|
||||||
|
function compatTransfer(IERC20TokenV08 token, address to, uint256 amount) internal {
|
||||||
|
bytes memory callData = abi.encodeCall(token.transfer, (to, amount));
|
||||||
|
_callWithOptionalBooleanResult(address(token), callData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Calls `IERC20TokenV08(token).transferFrom()`.
|
||||||
|
/// Reverts if the return data is invalid or the call reverts.
|
||||||
|
/// @param token The address of the token contract.
|
||||||
|
/// @param from The owner of the tokens.
|
||||||
|
/// @param to The address that receives the tokens
|
||||||
|
/// @param amount Number of tokens to transfer.
|
||||||
|
function compatTransferFrom(IERC20TokenV08 token, address from, address to, uint256 amount) internal {
|
||||||
|
bytes memory callData = abi.encodeCall(token.transferFrom, (from, to, amount));
|
||||||
|
_callWithOptionalBooleanResult(address(token), callData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Retrieves the number of decimals for a token.
|
||||||
|
/// Returns `18` if the call reverts.
|
||||||
|
/// @param token The address of the token contract.
|
||||||
|
/// @return tokenDecimals The number of decimals places for the token.
|
||||||
|
function compatDecimals(IERC20TokenV08 token) internal view returns (uint8 tokenDecimals) {
|
||||||
|
tokenDecimals = 18;
|
||||||
|
(bool didSucceed, bytes memory resultData) = address(token).staticcall(DECIMALS_CALL_DATA);
|
||||||
|
if (didSucceed && resultData.length >= 32) {
|
||||||
|
tokenDecimals = abi.decode(resultData, (uint8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Retrieves the allowance for a token, owner, and spender.
|
||||||
|
/// Returns `0` if the call reverts.
|
||||||
|
/// @param token The address of the token contract.
|
||||||
|
/// @param owner The owner of the tokens.
|
||||||
|
/// @param spender The address the spender.
|
||||||
|
/// @return allowance_ The allowance for a token, owner, and spender.
|
||||||
|
function compatAllowance(
|
||||||
|
IERC20TokenV08 token,
|
||||||
|
address owner,
|
||||||
|
address spender
|
||||||
|
) internal view returns (uint256 allowance_) {
|
||||||
|
(bool didSucceed, bytes memory resultData) = address(token).staticcall(
|
||||||
|
abi.encodeCall(token.allowance, (owner, spender))
|
||||||
|
);
|
||||||
|
if (didSucceed && resultData.length >= 32) {
|
||||||
|
allowance_ = abi.decode(resultData, (uint256));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Retrieves the balance for a token owner.
|
||||||
|
/// Returns `0` if the call reverts.
|
||||||
|
/// @param token The address of the token contract.
|
||||||
|
/// @param owner The owner of the tokens.
|
||||||
|
/// @return balance The token balance of an owner.
|
||||||
|
function compatBalanceOf(IERC20TokenV08 token, address owner) internal view returns (uint256 balance) {
|
||||||
|
(bool didSucceed, bytes memory resultData) = address(token).staticcall(
|
||||||
|
abi.encodeCall(token.balanceOf, (owner))
|
||||||
|
);
|
||||||
|
if (didSucceed && resultData.length >= 32) {
|
||||||
|
balance = abi.decode(resultData, (uint256));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Executes a call on address `target` with calldata `callData`
|
||||||
|
/// and asserts that either nothing was returned or a single boolean
|
||||||
|
/// was returned equal to `true`.
|
||||||
|
/// @param target The call target.
|
||||||
|
/// @param callData The abi-encoded call data.
|
||||||
|
function _callWithOptionalBooleanResult(address target, bytes memory callData) private {
|
||||||
|
(bool didSucceed, bytes memory resultData) = target.call(callData);
|
||||||
|
// Revert if the call reverted.
|
||||||
|
if (!didSucceed) {
|
||||||
|
LibRichErrorsV08.rrevert(resultData);
|
||||||
|
}
|
||||||
|
// If we get back 0 returndata, this may be a non-standard ERC-20 that
|
||||||
|
// does not return a boolean. Check that it at least contains code.
|
||||||
|
if (resultData.length == 0) {
|
||||||
|
require(target.code.length > 0, "invalid token address, contains no code");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// If we get back at least 32 bytes, we know the target address
|
||||||
|
// contains code, and we assume it is a token that returned a boolean
|
||||||
|
// success value, which must be true.
|
||||||
|
if (resultData.length >= 32) {
|
||||||
|
if (!abi.decode(resultData, (bool))) {
|
||||||
|
LibRichErrorsV08.rrevert(resultData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If 0 < returndatasize < 32, the target is a contract, but not a
|
||||||
|
// valid token.
|
||||||
|
LibRichErrorsV08.rrevert(resultData);
|
||||||
|
}
|
||||||
|
}
|
@@ -22,11 +22,7 @@ import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
|
|||||||
import "@0x/contracts-utils/contracts/src/Ownable.sol";
|
import "@0x/contracts-utils/contracts/src/Ownable.sol";
|
||||||
import "../src/MintableERC20Token.sol";
|
import "../src/MintableERC20Token.sol";
|
||||||
|
|
||||||
|
contract DummyERC20Token is Ownable, MintableERC20Token {
|
||||||
contract DummyERC20Token is
|
|
||||||
Ownable,
|
|
||||||
MintableERC20Token
|
|
||||||
{
|
|
||||||
using LibSafeMath for uint256;
|
using LibSafeMath for uint256;
|
||||||
|
|
||||||
string public name;
|
string public name;
|
||||||
@@ -34,14 +30,7 @@ contract DummyERC20Token is
|
|||||||
uint256 public decimals;
|
uint256 public decimals;
|
||||||
uint256 public constant MAX_MINT_AMOUNT = 10000000000000000000000;
|
uint256 public constant MAX_MINT_AMOUNT = 10000000000000000000000;
|
||||||
|
|
||||||
constructor (
|
constructor(string memory _name, string memory _symbol, uint256 _decimals, uint256 _totalSupply) public {
|
||||||
string memory _name,
|
|
||||||
string memory _symbol,
|
|
||||||
uint256 _decimals,
|
|
||||||
uint256 _totalSupply
|
|
||||||
)
|
|
||||||
public
|
|
||||||
{
|
|
||||||
name = _name;
|
name = _name;
|
||||||
symbol = _symbol;
|
symbol = _symbol;
|
||||||
decimals = _decimals;
|
decimals = _decimals;
|
||||||
@@ -52,10 +41,7 @@ contract DummyERC20Token is
|
|||||||
/// @dev Sets the balance of target address
|
/// @dev Sets the balance of target address
|
||||||
/// @param _target Address or which balance will be updated
|
/// @param _target Address or which balance will be updated
|
||||||
/// @param _value New balance of target address
|
/// @param _value New balance of target address
|
||||||
function setBalance(address _target, uint256 _value)
|
function setBalance(address _target, uint256 _value) external onlyOwner {
|
||||||
external
|
|
||||||
onlyOwner
|
|
||||||
{
|
|
||||||
uint256 currBalance = balances[_target];
|
uint256 currBalance = balances[_target];
|
||||||
if (_value < currBalance) {
|
if (_value < currBalance) {
|
||||||
_totalSupply = _totalSupply.safeSub(currBalance.safeSub(_value));
|
_totalSupply = _totalSupply.safeSub(currBalance.safeSub(_value));
|
||||||
@@ -67,13 +53,8 @@ contract DummyERC20Token is
|
|||||||
|
|
||||||
/// @dev Mints new tokens for sender
|
/// @dev Mints new tokens for sender
|
||||||
/// @param _value Amount of tokens to mint
|
/// @param _value Amount of tokens to mint
|
||||||
function mint(uint256 _value)
|
function mint(uint256 _value) external {
|
||||||
external
|
require(_value <= MAX_MINT_AMOUNT, "VALUE_TOO_LARGE");
|
||||||
{
|
|
||||||
require(
|
|
||||||
_value <= MAX_MINT_AMOUNT,
|
|
||||||
"VALUE_TOO_LARGE"
|
|
||||||
);
|
|
||||||
|
|
||||||
_mint(msg.sender, _value);
|
_mint(msg.sender, _value);
|
||||||
}
|
}
|
||||||
|
@@ -20,45 +20,23 @@ pragma solidity ^0.5.5;
|
|||||||
|
|
||||||
import "./DummyERC20Token.sol";
|
import "./DummyERC20Token.sol";
|
||||||
|
|
||||||
|
contract DummyMultipleReturnERC20Token is DummyERC20Token {
|
||||||
// solhint-disable no-empty-blocks
|
constructor(
|
||||||
contract DummyMultipleReturnERC20Token is
|
|
||||||
DummyERC20Token
|
|
||||||
{
|
|
||||||
constructor (
|
|
||||||
string memory _name,
|
string memory _name,
|
||||||
string memory _symbol,
|
string memory _symbol,
|
||||||
uint256 _decimals,
|
uint256 _decimals,
|
||||||
uint256 _totalSupply
|
uint256 _totalSupply
|
||||||
)
|
) public DummyERC20Token(_name, _symbol, _decimals, _totalSupply) {}
|
||||||
public
|
|
||||||
DummyERC20Token(
|
|
||||||
_name,
|
|
||||||
_symbol,
|
|
||||||
_decimals,
|
|
||||||
_totalSupply
|
|
||||||
)
|
|
||||||
{}
|
|
||||||
|
|
||||||
/// @dev send `value` token to `to` from `from` on the condition it is approved by `from`
|
/// @dev send `value` token to `to` from `from` on the condition it is approved by `from`
|
||||||
/// @param _from The address of the sender
|
/// @param _from The address of the sender
|
||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
function transferFrom(
|
function transferFrom(address _from, address _to, uint256 _value) external returns (bool) {
|
||||||
address _from,
|
emit Transfer(_from, _to, _value);
|
||||||
address _to,
|
|
||||||
uint256 _value
|
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
emit Transfer(
|
|
||||||
_from,
|
|
||||||
_to,
|
|
||||||
_value
|
|
||||||
);
|
|
||||||
|
|
||||||
// HACK: This contract will not compile if we remove `returns (bool)`, so we manually return 64 bytes (equiavalent to true, true)
|
// HACK: This contract will not compile if we remove `returns (bool)`, so we manually return 64 bytes
|
||||||
|
// (equiavalent to true, true)
|
||||||
assembly {
|
assembly {
|
||||||
mstore(0, 1)
|
mstore(0, 1)
|
||||||
mstore(32, 1)
|
mstore(32, 1)
|
||||||
@@ -66,4 +44,3 @@ contract DummyMultipleReturnERC20Token is
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,50 +20,25 @@ pragma solidity ^0.5.5;
|
|||||||
|
|
||||||
import "./DummyERC20Token.sol";
|
import "./DummyERC20Token.sol";
|
||||||
|
|
||||||
|
contract DummyNoReturnERC20Token is DummyERC20Token {
|
||||||
// solhint-disable no-empty-blocks
|
constructor(
|
||||||
contract DummyNoReturnERC20Token is
|
|
||||||
DummyERC20Token
|
|
||||||
{
|
|
||||||
constructor (
|
|
||||||
string memory _name,
|
string memory _name,
|
||||||
string memory _symbol,
|
string memory _symbol,
|
||||||
uint256 _decimals,
|
uint256 _decimals,
|
||||||
uint256 _totalSupply
|
uint256 _totalSupply
|
||||||
)
|
) public DummyERC20Token(_name, _symbol, _decimals, _totalSupply) {}
|
||||||
public
|
|
||||||
DummyERC20Token(
|
|
||||||
_name,
|
|
||||||
_symbol,
|
|
||||||
_decimals,
|
|
||||||
_totalSupply
|
|
||||||
)
|
|
||||||
{}
|
|
||||||
|
|
||||||
/// @dev send `value` token to `to` from `msg.sender`
|
/// @dev send `value` token to `to` from `msg.sender`
|
||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
function transfer(address _to, uint256 _value)
|
function transfer(address _to, uint256 _value) external returns (bool) {
|
||||||
external
|
require(balances[msg.sender] >= _value, "ERC20_INSUFFICIENT_BALANCE");
|
||||||
returns (bool)
|
require(balances[_to] + _value >= balances[_to], "UINT256_OVERFLOW");
|
||||||
{
|
|
||||||
require(
|
|
||||||
balances[msg.sender] >= _value,
|
|
||||||
"ERC20_INSUFFICIENT_BALANCE"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
balances[_to] + _value >= balances[_to],
|
|
||||||
"UINT256_OVERFLOW"
|
|
||||||
);
|
|
||||||
|
|
||||||
balances[msg.sender] -= _value;
|
balances[msg.sender] -= _value;
|
||||||
balances[_to] += _value;
|
balances[_to] += _value;
|
||||||
|
|
||||||
emit Transfer(
|
emit Transfer(msg.sender, _to, _value);
|
||||||
msg.sender,
|
|
||||||
_to,
|
|
||||||
_value
|
|
||||||
);
|
|
||||||
|
|
||||||
// HACK: This contract will not compile if we remove `returns (bool)`, so we manually return no data
|
// HACK: This contract will not compile if we remove `returns (bool)`, so we manually return no data
|
||||||
assembly {
|
assembly {
|
||||||
@@ -75,36 +50,16 @@ contract DummyNoReturnERC20Token is
|
|||||||
/// @param _from The address of the sender
|
/// @param _from The address of the sender
|
||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
function transferFrom(
|
function transferFrom(address _from, address _to, uint256 _value) external returns (bool) {
|
||||||
address _from,
|
require(balances[_from] >= _value, "ERC20_INSUFFICIENT_BALANCE");
|
||||||
address _to,
|
require(allowed[_from][msg.sender] >= _value, "ERC20_INSUFFICIENT_ALLOWANCE");
|
||||||
uint256 _value
|
require(balances[_to] + _value >= balances[_to], "UINT256_OVERFLOW");
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
require(
|
|
||||||
balances[_from] >= _value,
|
|
||||||
"ERC20_INSUFFICIENT_BALANCE"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
allowed[_from][msg.sender] >= _value,
|
|
||||||
"ERC20_INSUFFICIENT_ALLOWANCE"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
balances[_to] + _value >= balances[_to],
|
|
||||||
"UINT256_OVERFLOW"
|
|
||||||
);
|
|
||||||
|
|
||||||
balances[_to] += _value;
|
balances[_to] += _value;
|
||||||
balances[_from] -= _value;
|
balances[_from] -= _value;
|
||||||
allowed[_from][msg.sender] -= _value;
|
allowed[_from][msg.sender] -= _value;
|
||||||
|
|
||||||
emit Transfer(
|
emit Transfer(_from, _to, _value);
|
||||||
_from,
|
|
||||||
_to,
|
|
||||||
_value
|
|
||||||
);
|
|
||||||
|
|
||||||
// HACK: This contract will not compile if we remove `returns (bool)`, so we manually return no data
|
// HACK: This contract will not compile if we remove `returns (bool)`, so we manually return no data
|
||||||
assembly {
|
assembly {
|
||||||
@@ -112,4 +67,3 @@ contract DummyNoReturnERC20Token is
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,9 +21,7 @@ pragma solidity ^0.5.9;
|
|||||||
import "../src/LibERC20Token.sol";
|
import "../src/LibERC20Token.sol";
|
||||||
import "./TestLibERC20TokenTarget.sol";
|
import "./TestLibERC20TokenTarget.sol";
|
||||||
|
|
||||||
|
|
||||||
contract TestLibERC20Token {
|
contract TestLibERC20Token {
|
||||||
|
|
||||||
TestLibERC20TokenTarget public target;
|
TestLibERC20TokenTarget public target;
|
||||||
|
|
||||||
constructor() public {
|
constructor() public {
|
||||||
@@ -36,9 +34,7 @@ contract TestLibERC20Token {
|
|||||||
bytes calldata returnData,
|
bytes calldata returnData,
|
||||||
address spender,
|
address spender,
|
||||||
uint256 allowance
|
uint256 allowance
|
||||||
)
|
) external {
|
||||||
external
|
|
||||||
{
|
|
||||||
target.setBehavior(shouldRevert, revertData, returnData);
|
target.setBehavior(shouldRevert, revertData, returnData);
|
||||||
LibERC20Token.approve(address(target), spender, allowance);
|
LibERC20Token.approve(address(target), spender, allowance);
|
||||||
}
|
}
|
||||||
@@ -49,9 +45,7 @@ contract TestLibERC20Token {
|
|||||||
bytes calldata returnData,
|
bytes calldata returnData,
|
||||||
address to,
|
address to,
|
||||||
uint256 amount
|
uint256 amount
|
||||||
)
|
) external {
|
||||||
external
|
|
||||||
{
|
|
||||||
target.setBehavior(shouldRevert, revertData, returnData);
|
target.setBehavior(shouldRevert, revertData, returnData);
|
||||||
LibERC20Token.transfer(address(target), to, amount);
|
LibERC20Token.transfer(address(target), to, amount);
|
||||||
}
|
}
|
||||||
@@ -63,9 +57,7 @@ contract TestLibERC20Token {
|
|||||||
address from,
|
address from,
|
||||||
address to,
|
address to,
|
||||||
uint256 amount
|
uint256 amount
|
||||||
)
|
) external {
|
||||||
external
|
|
||||||
{
|
|
||||||
target.setBehavior(shouldRevert, revertData, returnData);
|
target.setBehavior(shouldRevert, revertData, returnData);
|
||||||
LibERC20Token.transferFrom(address(target), from, to, amount);
|
LibERC20Token.transferFrom(address(target), from, to, amount);
|
||||||
}
|
}
|
||||||
@@ -74,10 +66,7 @@ contract TestLibERC20Token {
|
|||||||
bool shouldRevert,
|
bool shouldRevert,
|
||||||
bytes calldata revertData,
|
bytes calldata revertData,
|
||||||
bytes calldata returnData
|
bytes calldata returnData
|
||||||
)
|
) external returns (uint8) {
|
||||||
external
|
|
||||||
returns (uint8)
|
|
||||||
{
|
|
||||||
target.setBehavior(shouldRevert, revertData, returnData);
|
target.setBehavior(shouldRevert, revertData, returnData);
|
||||||
return LibERC20Token.decimals(address(target));
|
return LibERC20Token.decimals(address(target));
|
||||||
}
|
}
|
||||||
|
@@ -18,89 +18,52 @@
|
|||||||
|
|
||||||
pragma solidity ^0.5.9;
|
pragma solidity ^0.5.9;
|
||||||
|
|
||||||
|
|
||||||
contract TestLibERC20TokenTarget {
|
contract TestLibERC20TokenTarget {
|
||||||
|
event ApproveCalled(address spender, uint256 allowance);
|
||||||
|
|
||||||
event ApproveCalled(
|
event TransferCalled(address to, uint256 amount);
|
||||||
address spender,
|
|
||||||
uint256 allowance
|
|
||||||
);
|
|
||||||
|
|
||||||
event TransferCalled(
|
event TransferFromCalled(address from, address to, uint256 amount);
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
);
|
|
||||||
|
|
||||||
event TransferFromCalled(
|
|
||||||
address from,
|
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
);
|
|
||||||
|
|
||||||
bool private _shouldRevert;
|
bool private _shouldRevert;
|
||||||
bytes private _revertData;
|
bytes private _revertData;
|
||||||
bytes private _returnData;
|
bytes private _returnData;
|
||||||
|
|
||||||
function setBehavior(
|
function setBehavior(bool shouldRevert, bytes calldata revertData, bytes calldata returnData) external {
|
||||||
bool shouldRevert,
|
|
||||||
bytes calldata revertData,
|
|
||||||
bytes calldata returnData
|
|
||||||
)
|
|
||||||
external
|
|
||||||
{
|
|
||||||
_shouldRevert = shouldRevert;
|
_shouldRevert = shouldRevert;
|
||||||
_revertData = revertData;
|
_revertData = revertData;
|
||||||
_returnData = returnData;
|
_returnData = returnData;
|
||||||
}
|
}
|
||||||
|
|
||||||
function approve(
|
function approve(address spender, uint256 allowance) external returns (bool) {
|
||||||
address spender,
|
|
||||||
uint256 allowance
|
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
emit ApproveCalled(spender, allowance);
|
emit ApproveCalled(spender, allowance);
|
||||||
_execute();
|
_execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
function transfer(
|
function transfer(address to, uint256 amount) external returns (bool) {
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
emit TransferCalled(to, amount);
|
emit TransferCalled(to, amount);
|
||||||
_execute();
|
_execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
function transferFrom(
|
function transferFrom(address from, address to, uint256 amount) external returns (bool) {
|
||||||
address from,
|
|
||||||
address to,
|
|
||||||
uint256 amount
|
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
emit TransferFromCalled(from, to, amount);
|
emit TransferFromCalled(from, to, amount);
|
||||||
_execute();
|
_execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
function decimals()
|
function decimals() external view returns (uint8) {
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint8)
|
|
||||||
{
|
|
||||||
_execute();
|
_execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
function _execute() private view {
|
function _execute() private view {
|
||||||
if (_shouldRevert) {
|
if (_shouldRevert) {
|
||||||
bytes memory revertData = _revertData;
|
bytes memory revertData = _revertData;
|
||||||
assembly { revert(add(revertData, 0x20), mload(revertData)) }
|
assembly {
|
||||||
|
revert(add(revertData, 0x20), mload(revertData))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bytes memory returnData = _returnData;
|
bytes memory returnData = _returnData;
|
||||||
assembly { return(add(returnData, 0x20), mload(returnData)) }
|
assembly {
|
||||||
|
return(add(returnData, 0x20), mload(returnData))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,43 +20,19 @@ pragma solidity ^0.5.5;
|
|||||||
|
|
||||||
import "./DummyERC20Token.sol";
|
import "./DummyERC20Token.sol";
|
||||||
|
|
||||||
|
contract UntransferrableDummyERC20Token is DummyERC20Token {
|
||||||
// solhint-disable no-empty-blocks
|
constructor(
|
||||||
// solhint-disable no-unused-vars
|
|
||||||
contract UntransferrableDummyERC20Token is
|
|
||||||
DummyERC20Token
|
|
||||||
{
|
|
||||||
constructor (
|
|
||||||
string memory _name,
|
string memory _name,
|
||||||
string memory _symbol,
|
string memory _symbol,
|
||||||
uint256 _decimals,
|
uint256 _decimals,
|
||||||
uint256 _totalSupply
|
uint256 _totalSupply
|
||||||
)
|
) public DummyERC20Token(_name, _symbol, _decimals, _totalSupply) {}
|
||||||
public
|
|
||||||
DummyERC20Token(
|
|
||||||
_name,
|
|
||||||
_symbol,
|
|
||||||
_decimals,
|
|
||||||
_totalSupply
|
|
||||||
)
|
|
||||||
{}
|
|
||||||
|
|
||||||
/// @dev send `value` token to `to` from `from` on the condition it is approved by `from`
|
/// @dev send `value` token to `to` from `from` on the condition it is approved by `from`
|
||||||
/// @param _from The address of the sender
|
/// @param _from The address of the sender
|
||||||
/// @param _to The address of the recipient
|
/// @param _to The address of the recipient
|
||||||
/// @param _value The amount of token to be transferred
|
/// @param _value The amount of token to be transferred
|
||||||
function transferFrom(
|
function transferFrom(address _from, address _to, uint256 _value) external returns (bool) {
|
||||||
address _from,
|
require(false, "TRANSFER_DISABLED");
|
||||||
address _to,
|
|
||||||
uint256 _value
|
|
||||||
)
|
|
||||||
external
|
|
||||||
returns (bool)
|
|
||||||
{
|
|
||||||
require(
|
|
||||||
false,
|
|
||||||
"TRANSFER_DISABLED"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-erc20",
|
"name": "@0x/contracts-erc20",
|
||||||
"version": "3.3.22",
|
"version": "3.3.55",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -15,7 +15,6 @@
|
|||||||
"pre_build": "run-s compile contracts:gen generate_contract_wrappers contracts:copy",
|
"pre_build": "run-s compile contracts:gen generate_contract_wrappers contracts:copy",
|
||||||
"test": "yarn run_mocha",
|
"test": "yarn run_mocha",
|
||||||
"rebuild_and_test": "run-s build test",
|
"rebuild_and_test": "run-s build test",
|
||||||
"test:coverage": "SOLIDITY_COVERAGE=true run-s build run_mocha coverage:report:text coverage:report:lcov",
|
|
||||||
"test:profiler": "SOLIDITY_PROFILER=true run-s build run_mocha profiler:report:html",
|
"test:profiler": "SOLIDITY_PROFILER=true run-s build run_mocha profiler:report:html",
|
||||||
"test:trace": "SOLIDITY_REVERT_TRACE=true run-s build run_mocha",
|
"test:trace": "SOLIDITY_REVERT_TRACE=true run-s build run_mocha",
|
||||||
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.js' --timeout 100000 --bail --exit",
|
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.js' --timeout 100000 --bail --exit",
|
||||||
@@ -23,22 +22,17 @@
|
|||||||
"watch": "sol-compiler -w",
|
"watch": "sol-compiler -w",
|
||||||
"clean": "shx rm -rf lib test/generated-artifacts test/generated-wrappers generated-artifacts generated-wrappers",
|
"clean": "shx rm -rf lib test/generated-artifacts test/generated-wrappers generated-artifacts generated-wrappers",
|
||||||
"generate_contract_wrappers": "abi-gen --debug --abis ${npm_package_config_abis} --output test/generated-wrappers --backend ethers",
|
"generate_contract_wrappers": "abi-gen --debug --abis ${npm_package_config_abis} --output test/generated-wrappers --backend ethers",
|
||||||
"lint": "tslint --format stylish --project . --exclude ./generated-wrappers/**/* --exclude ./test/generated-wrappers/**/* --exclude ./generated-artifacts/**/* --exclude ./test/generated-artifacts/**/* --exclude **/lib/**/* && yarn lint-contracts",
|
"lint": "eslint src test",
|
||||||
"fix": "tslint --fix --format stylish --project . --exclude ./generated-wrappers/**/* --exclude ./test/generated-wrappers/**/* --exclude ./generated-artifacts/**/* --exclude ./test/generated-artifacts/**/* --exclude **/lib/**/* && yarn lint-contracts",
|
"fix": "eslint --fix src test",
|
||||||
"coverage:report:text": "istanbul report text",
|
"test:ci": "yarn test",
|
||||||
"coverage:report:html": "istanbul report html && open coverage/index.html",
|
|
||||||
"profiler:report:html": "istanbul report html && open coverage/index.html",
|
|
||||||
"coverage:report:lcov": "istanbul report lcov",
|
|
||||||
"test:circleci": "yarn test",
|
|
||||||
"contracts:gen": "contracts-gen generate",
|
"contracts:gen": "contracts-gen generate",
|
||||||
"contracts:copy": "contracts-gen copy",
|
"contracts:copy": "contracts-gen copy",
|
||||||
"lint-contracts": "solhint -c ../.solhint.json contracts/**/**/**/**/*.sol",
|
|
||||||
"docs:md": "ts-doc-gen --sourceDir='$PROJECT_FILES' --output=$MD_FILE_DIR --fileExtension=mdx --tsconfig=./typedoc-tsconfig.json",
|
"docs:md": "ts-doc-gen --sourceDir='$PROJECT_FILES' --output=$MD_FILE_DIR --fileExtension=mdx --tsconfig=./typedoc-tsconfig.json",
|
||||||
"docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES"
|
"docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"publicInterfaceContracts": "DummyERC20Token,ERC20Token,WETH9,ZRXToken,DummyNoReturnERC20Token,DummyMultipleReturnERC20Token",
|
"publicInterfaceContracts": "DummyERC20Token,ERC20Token,WETH9,ZRXToken,DummyNoReturnERC20Token,DummyMultipleReturnERC20Token",
|
||||||
"abis": "./test/generated-artifacts/@(DummyERC20Token|DummyMultipleReturnERC20Token|DummyNoReturnERC20Token|ERC20Token|IERC20Token|IERC20TokenV06|IEtherToken|IEtherTokenV06|LibERC20Token|LibERC20TokenV06|MintableERC20Token|TestLibERC20Token|TestLibERC20TokenTarget|UnlimitedAllowanceERC20Token|UntransferrableDummyERC20Token|WETH9|ZRXToken).json",
|
"abis": "./test/generated-artifacts/@(DummyERC20Token|DummyMultipleReturnERC20Token|DummyNoReturnERC20Token|ERC20Token|IERC20Token|IERC20TokenV06|IERC20TokenV08|IEtherToken|IEtherTokenV06|IEtherTokenV08|LibERC20Token|LibERC20TokenV06|LibERC20TokenV08|MintableERC20Token|TestLibERC20Token|TestLibERC20TokenTarget|UnlimitedAllowanceERC20Token|UntransferrableDummyERC20Token|WETH9|ZRXToken).json",
|
||||||
"abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually."
|
"abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually."
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -51,38 +45,39 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
|
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/abi-gen": "^5.6.2",
|
"@0x/abi-gen": "^5.8.1",
|
||||||
"@0x/contracts-gen": "^2.0.40",
|
"@0x/contracts-gen": "^2.0.48",
|
||||||
"@0x/contracts-test-utils": "^5.4.13",
|
"@0x/contracts-test-utils": "^5.4.45",
|
||||||
"@0x/contracts-utils": "^4.8.3",
|
"@0x/contracts-utils": "^4.8.36",
|
||||||
"@0x/dev-utils": "^4.2.9",
|
"@0x/dev-utils": "^5.0.0",
|
||||||
"@0x/sol-compiler": "^4.7.5",
|
"@0x/sol-compiler": "^4.8.2",
|
||||||
"@0x/ts-doc-gen": "^0.0.28",
|
"@0x/ts-doc-gen": "^0.0.28",
|
||||||
"@0x/tslint-config": "^4.1.4",
|
"@0x/types": "^3.3.6",
|
||||||
"@0x/types": "^3.3.4",
|
"@0x/typescript-typings": "^5.3.1",
|
||||||
"@0x/typescript-typings": "^5.2.1",
|
"@0x/utils": "^7.0.0",
|
||||||
"@0x/utils": "^6.4.4",
|
"@0x/web3-wrapper": "^8.0.0",
|
||||||
"@0x/web3-wrapper": "^7.6.0",
|
|
||||||
"@types/lodash": "4.14.104",
|
"@types/lodash": "4.14.104",
|
||||||
"@types/mocha": "^5.2.7",
|
"@types/mocha": "^5.2.7",
|
||||||
"@types/node": "12.12.54",
|
"@types/node": "12.12.54",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.38.0",
|
||||||
|
"@typescript-eslint/parser": "^5.38.0",
|
||||||
"chai": "^4.0.1",
|
"chai": "^4.0.1",
|
||||||
"chai-as-promised": "^7.1.0",
|
"chai-as-promised": "^7.1.0",
|
||||||
"chai-bignumber": "^3.0.0",
|
"chai-bignumber": "^3.0.0",
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
"ethereum-types": "^3.6.0",
|
"eslint": "^8.23.1",
|
||||||
|
"eslint-config-prettier": "^8.5.0",
|
||||||
|
"ethereum-types": "^3.7.1",
|
||||||
"lodash": "^4.17.11",
|
"lodash": "^4.17.11",
|
||||||
"make-promises-safe": "^1.1.0",
|
"make-promises-safe": "^1.1.0",
|
||||||
"mocha": "^6.2.0",
|
"mocha": "^6.2.0",
|
||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"solhint": "^1.4.1",
|
|
||||||
"tslint": "5.11.0",
|
|
||||||
"typedoc": "~0.16.11",
|
"typedoc": "~0.16.11",
|
||||||
"typescript": "4.2.2"
|
"typescript": "4.6.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/base-contract": "^6.4.2",
|
"@0x/base-contract": "^7.0.0",
|
||||||
"ethers": "~4.0.4"
|
"ethers": "~4.0.4"
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
|
@@ -15,7 +15,7 @@ export const artifacts = {
|
|||||||
DummyERC20Token: DummyERC20Token as ContractArtifact,
|
DummyERC20Token: DummyERC20Token as ContractArtifact,
|
||||||
ERC20Token: ERC20Token as ContractArtifact,
|
ERC20Token: ERC20Token as ContractArtifact,
|
||||||
WETH9: WETH9 as ContractArtifact,
|
WETH9: WETH9 as ContractArtifact,
|
||||||
ZRXToken: (ZRXToken as any) as ContractArtifact,
|
ZRXToken: ZRXToken as any as ContractArtifact,
|
||||||
DummyNoReturnERC20Token: DummyNoReturnERC20Token as ContractArtifact,
|
DummyNoReturnERC20Token: DummyNoReturnERC20Token as ContractArtifact,
|
||||||
DummyMultipleReturnERC20Token: DummyMultipleReturnERC20Token as ContractArtifact,
|
DummyMultipleReturnERC20Token: DummyMultipleReturnERC20Token as ContractArtifact,
|
||||||
};
|
};
|
||||||
|
@@ -11,10 +11,13 @@ import * as DummyNoReturnERC20Token from '../test/generated-artifacts/DummyNoRet
|
|||||||
import * as ERC20Token from '../test/generated-artifacts/ERC20Token.json';
|
import * as ERC20Token from '../test/generated-artifacts/ERC20Token.json';
|
||||||
import * as IERC20Token from '../test/generated-artifacts/IERC20Token.json';
|
import * as IERC20Token from '../test/generated-artifacts/IERC20Token.json';
|
||||||
import * as IERC20TokenV06 from '../test/generated-artifacts/IERC20TokenV06.json';
|
import * as IERC20TokenV06 from '../test/generated-artifacts/IERC20TokenV06.json';
|
||||||
|
import * as IERC20TokenV08 from '../test/generated-artifacts/IERC20TokenV08.json';
|
||||||
import * as IEtherToken from '../test/generated-artifacts/IEtherToken.json';
|
import * as IEtherToken from '../test/generated-artifacts/IEtherToken.json';
|
||||||
import * as IEtherTokenV06 from '../test/generated-artifacts/IEtherTokenV06.json';
|
import * as IEtherTokenV06 from '../test/generated-artifacts/IEtherTokenV06.json';
|
||||||
|
import * as IEtherTokenV08 from '../test/generated-artifacts/IEtherTokenV08.json';
|
||||||
import * as LibERC20Token from '../test/generated-artifacts/LibERC20Token.json';
|
import * as LibERC20Token from '../test/generated-artifacts/LibERC20Token.json';
|
||||||
import * as LibERC20TokenV06 from '../test/generated-artifacts/LibERC20TokenV06.json';
|
import * as LibERC20TokenV06 from '../test/generated-artifacts/LibERC20TokenV06.json';
|
||||||
|
import * as LibERC20TokenV08 from '../test/generated-artifacts/LibERC20TokenV08.json';
|
||||||
import * as MintableERC20Token from '../test/generated-artifacts/MintableERC20Token.json';
|
import * as MintableERC20Token from '../test/generated-artifacts/MintableERC20Token.json';
|
||||||
import * as TestLibERC20Token from '../test/generated-artifacts/TestLibERC20Token.json';
|
import * as TestLibERC20Token from '../test/generated-artifacts/TestLibERC20Token.json';
|
||||||
import * as TestLibERC20TokenTarget from '../test/generated-artifacts/TestLibERC20TokenTarget.json';
|
import * as TestLibERC20TokenTarget from '../test/generated-artifacts/TestLibERC20TokenTarget.json';
|
||||||
@@ -28,12 +31,15 @@ export const artifacts = {
|
|||||||
MintableERC20Token: MintableERC20Token as ContractArtifact,
|
MintableERC20Token: MintableERC20Token as ContractArtifact,
|
||||||
UnlimitedAllowanceERC20Token: UnlimitedAllowanceERC20Token as ContractArtifact,
|
UnlimitedAllowanceERC20Token: UnlimitedAllowanceERC20Token as ContractArtifact,
|
||||||
WETH9: WETH9 as ContractArtifact,
|
WETH9: WETH9 as ContractArtifact,
|
||||||
ZRXToken: (ZRXToken as any) as ContractArtifact,
|
ZRXToken: ZRXToken as any as ContractArtifact,
|
||||||
IERC20Token: IERC20Token as ContractArtifact,
|
IERC20Token: IERC20Token as ContractArtifact,
|
||||||
IEtherToken: IEtherToken as ContractArtifact,
|
IEtherToken: IEtherToken as ContractArtifact,
|
||||||
IERC20TokenV06: IERC20TokenV06 as ContractArtifact,
|
IERC20TokenV06: IERC20TokenV06 as ContractArtifact,
|
||||||
IEtherTokenV06: IEtherTokenV06 as ContractArtifact,
|
IEtherTokenV06: IEtherTokenV06 as ContractArtifact,
|
||||||
LibERC20TokenV06: LibERC20TokenV06 as ContractArtifact,
|
LibERC20TokenV06: LibERC20TokenV06 as ContractArtifact,
|
||||||
|
IERC20TokenV08: IERC20TokenV08 as ContractArtifact,
|
||||||
|
IEtherTokenV08: IEtherTokenV08 as ContractArtifact,
|
||||||
|
LibERC20TokenV08: LibERC20TokenV08 as ContractArtifact,
|
||||||
DummyERC20Token: DummyERC20Token as ContractArtifact,
|
DummyERC20Token: DummyERC20Token as ContractArtifact,
|
||||||
DummyMultipleReturnERC20Token: DummyMultipleReturnERC20Token as ContractArtifact,
|
DummyMultipleReturnERC20Token: DummyMultipleReturnERC20Token as ContractArtifact,
|
||||||
DummyNoReturnERC20Token: DummyNoReturnERC20Token as ContractArtifact,
|
DummyNoReturnERC20Token: DummyNoReturnERC20Token as ContractArtifact,
|
||||||
|
@@ -1,19 +0,0 @@
|
|||||||
import { env, EnvVars } from '@0x/dev-utils';
|
|
||||||
|
|
||||||
import { coverage, profiler, provider } from '@0x/contracts-test-utils';
|
|
||||||
import { providerUtils } from '@0x/utils';
|
|
||||||
|
|
||||||
before('start web3 provider', () => {
|
|
||||||
providerUtils.startProviderEngine(provider);
|
|
||||||
});
|
|
||||||
after('generate coverage report', async () => {
|
|
||||||
if (env.parseBoolean(EnvVars.SolidityCoverage)) {
|
|
||||||
const coverageSubprovider = coverage.getCoverageSubproviderSingleton();
|
|
||||||
await coverageSubprovider.writeCoverageAsync();
|
|
||||||
}
|
|
||||||
if (env.parseBoolean(EnvVars.SolidityProfiler)) {
|
|
||||||
const profilerSubprovider = profiler.getProfilerSubproviderSingleton();
|
|
||||||
await profilerSubprovider.writeProfilerOutputAsync();
|
|
||||||
}
|
|
||||||
provider.stop();
|
|
||||||
});
|
|
@@ -9,10 +9,13 @@ export * from '../test/generated-wrappers/dummy_no_return_erc20_token';
|
|||||||
export * from '../test/generated-wrappers/erc20_token';
|
export * from '../test/generated-wrappers/erc20_token';
|
||||||
export * from '../test/generated-wrappers/i_erc20_token';
|
export * from '../test/generated-wrappers/i_erc20_token';
|
||||||
export * from '../test/generated-wrappers/i_erc20_token_v06';
|
export * from '../test/generated-wrappers/i_erc20_token_v06';
|
||||||
|
export * from '../test/generated-wrappers/i_erc20_token_v08';
|
||||||
export * from '../test/generated-wrappers/i_ether_token';
|
export * from '../test/generated-wrappers/i_ether_token';
|
||||||
export * from '../test/generated-wrappers/i_ether_token_v06';
|
export * from '../test/generated-wrappers/i_ether_token_v06';
|
||||||
|
export * from '../test/generated-wrappers/i_ether_token_v08';
|
||||||
export * from '../test/generated-wrappers/lib_erc20_token';
|
export * from '../test/generated-wrappers/lib_erc20_token';
|
||||||
export * from '../test/generated-wrappers/lib_erc20_token_v06';
|
export * from '../test/generated-wrappers/lib_erc20_token_v06';
|
||||||
|
export * from '../test/generated-wrappers/lib_erc20_token_v08';
|
||||||
export * from '../test/generated-wrappers/mintable_erc20_token';
|
export * from '../test/generated-wrappers/mintable_erc20_token';
|
||||||
export * from '../test/generated-wrappers/test_lib_erc20_token';
|
export * from '../test/generated-wrappers/test_lib_erc20_token';
|
||||||
export * from '../test/generated-wrappers/test_lib_erc20_token_target';
|
export * from '../test/generated-wrappers/test_lib_erc20_token_target';
|
||||||
|
@@ -1,96 +0,0 @@
|
|||||||
/**
|
|
||||||
* Use this file to configure your truffle project. It's seeded with some
|
|
||||||
* common settings for different networks and features like migrations,
|
|
||||||
* compilation and testing. Uncomment the ones you need or modify
|
|
||||||
* them to suit your project as necessary.
|
|
||||||
*
|
|
||||||
* More information about configuration can be found at:
|
|
||||||
*
|
|
||||||
* truffleframework.com/docs/advanced/configuration
|
|
||||||
*
|
|
||||||
* To deploy via Infura you'll need a wallet provider (like truffle-hdwallet-provider)
|
|
||||||
* to sign your transactions before they're sent to a remote public node. Infura accounts
|
|
||||||
* are available for free at: infura.io/register.
|
|
||||||
*
|
|
||||||
* You'll also need a mnemonic - the twelve word phrase the wallet uses to generate
|
|
||||||
* public/private key pairs. If you're publishing your code to GitHub make sure you load this
|
|
||||||
* phrase from a file you've .gitignored so it doesn't accidentally become public.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// const HDWalletProvider = require('truffle-hdwallet-provider');
|
|
||||||
// const infuraKey = "fj4jll3k.....";
|
|
||||||
//
|
|
||||||
// const fs = require('fs');
|
|
||||||
// const mnemonic = fs.readFileSync(".secret").toString().trim();
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
/**
|
|
||||||
* Networks define how you connect to your ethereum client and let you set the
|
|
||||||
* defaults web3 uses to send transactions. If you don't specify one truffle
|
|
||||||
* will spin up a development blockchain for you on port 9545 when you
|
|
||||||
* run `develop` or `test`. You can ask a truffle command to use a specific
|
|
||||||
* network from the command line, e.g
|
|
||||||
*
|
|
||||||
* $ truffle test --network <network-name>
|
|
||||||
*/
|
|
||||||
|
|
||||||
networks: {
|
|
||||||
// Useful for testing. The `development` name is special - truffle uses it by default
|
|
||||||
// if it's defined here and no other network is specified at the command line.
|
|
||||||
// You should run a client (like ganache-cli, geth or parity) in a separate terminal
|
|
||||||
// tab if you use this network and you must also set the `host`, `port` and `network_id`
|
|
||||||
// options below to some value.
|
|
||||||
//
|
|
||||||
// development: {
|
|
||||||
// host: "127.0.0.1", // Localhost (default: none)
|
|
||||||
// port: 8545, // Standard Ethereum port (default: none)
|
|
||||||
// network_id: "*", // Any network (default: none)
|
|
||||||
// },
|
|
||||||
// Another network with more advanced options...
|
|
||||||
// advanced: {
|
|
||||||
// port: 8777, // Custom port
|
|
||||||
// network_id: 1342, // Custom network
|
|
||||||
// gas: 8500000, // Gas sent with each transaction (default: ~6700000)
|
|
||||||
// gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei)
|
|
||||||
// from: <address>, // Account to send txs from (default: accounts[0])
|
|
||||||
// websockets: true // Enable EventEmitter interface for web3 (default: false)
|
|
||||||
// },
|
|
||||||
// Useful for deploying to a public network.
|
|
||||||
// NB: It's important to wrap the provider as a function.
|
|
||||||
// ropsten: {
|
|
||||||
// provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`),
|
|
||||||
// network_id: 3, // Ropsten's id
|
|
||||||
// gas: 5500000, // Ropsten has a lower block limit than mainnet
|
|
||||||
// confirmations: 2, // # of confs to wait between deployments. (default: 0)
|
|
||||||
// timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
|
|
||||||
// skipDryRun: true // Skip dry run before migrations? (default: false for public nets )
|
|
||||||
// },
|
|
||||||
// Useful for private networks
|
|
||||||
// private: {
|
|
||||||
// provider: () => new HDWalletProvider(mnemonic, `https://network.io`),
|
|
||||||
// network_id: 2111, // This network is yours, in the cloud.
|
|
||||||
// production: true // Treats this network as if it was a public net. (default: false)
|
|
||||||
// }
|
|
||||||
},
|
|
||||||
|
|
||||||
// Set default mocha options here, use special reporters etc.
|
|
||||||
mocha: {
|
|
||||||
// timeout: 100000
|
|
||||||
},
|
|
||||||
|
|
||||||
// Configure your compilers
|
|
||||||
compilers: {
|
|
||||||
solc: {
|
|
||||||
version: '0.5.9',
|
|
||||||
settings: {
|
|
||||||
evmVersion: 'constantinople',
|
|
||||||
optimizer: {
|
|
||||||
enabled: true,
|
|
||||||
runs: 1000000,
|
|
||||||
details: { yul: true, deduplicate: true, cse: true, constantOptimizer: true },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
@@ -15,10 +15,13 @@
|
|||||||
"test/generated-artifacts/ERC20Token.json",
|
"test/generated-artifacts/ERC20Token.json",
|
||||||
"test/generated-artifacts/IERC20Token.json",
|
"test/generated-artifacts/IERC20Token.json",
|
||||||
"test/generated-artifacts/IERC20TokenV06.json",
|
"test/generated-artifacts/IERC20TokenV06.json",
|
||||||
|
"test/generated-artifacts/IERC20TokenV08.json",
|
||||||
"test/generated-artifacts/IEtherToken.json",
|
"test/generated-artifacts/IEtherToken.json",
|
||||||
"test/generated-artifacts/IEtherTokenV06.json",
|
"test/generated-artifacts/IEtherTokenV06.json",
|
||||||
|
"test/generated-artifacts/IEtherTokenV08.json",
|
||||||
"test/generated-artifacts/LibERC20Token.json",
|
"test/generated-artifacts/LibERC20Token.json",
|
||||||
"test/generated-artifacts/LibERC20TokenV06.json",
|
"test/generated-artifacts/LibERC20TokenV06.json",
|
||||||
|
"test/generated-artifacts/LibERC20TokenV08.json",
|
||||||
"test/generated-artifacts/MintableERC20Token.json",
|
"test/generated-artifacts/MintableERC20Token.json",
|
||||||
"test/generated-artifacts/TestLibERC20Token.json",
|
"test/generated-artifacts/TestLibERC20Token.json",
|
||||||
"test/generated-artifacts/TestLibERC20TokenTarget.json",
|
"test/generated-artifacts/TestLibERC20TokenTarget.json",
|
||||||
|
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": ["@0x/tslint-config"],
|
|
||||||
"rules": {
|
|
||||||
"custom-no-magic-numbers": false
|
|
||||||
}
|
|
||||||
}
|
|
25
contracts/test-utils/.eslintrc
Normal file
25
contracts/test-utils/.eslintrc
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"es2021": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"],
|
||||||
|
"overrides": [],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"parserOptions": {
|
||||||
|
"project": "./tsconfig.json",
|
||||||
|
"ecmaVersion": "latest",
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"plugins": ["@typescript-eslint"],
|
||||||
|
"ignorePatterns": [
|
||||||
|
"lib/**/*",
|
||||||
|
"contracts/**/*",
|
||||||
|
"generated-wrappers/**/*",
|
||||||
|
"generated-artifacts/**/*",
|
||||||
|
"test/generated-wrappers/**/*",
|
||||||
|
"test/generated-artifacts/**/*"
|
||||||
|
|
||||||
|
],
|
||||||
|
"rules": {}
|
||||||
|
}
|
@@ -1,4 +1,293 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1674517560,
|
||||||
|
"version": "5.4.45",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1670879498,
|
||||||
|
"version": "5.4.44",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1669235113,
|
||||||
|
"version": "5.4.43",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1668477029,
|
||||||
|
"version": "5.4.42",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1667607537,
|
||||||
|
"version": "5.4.41",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1667427402,
|
||||||
|
"version": "5.4.40",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1666645023,
|
||||||
|
"version": "5.4.39",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1666381417,
|
||||||
|
"version": "5.4.38",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665531940,
|
||||||
|
"version": "5.4.37",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "5.4.36",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Migrate from TSLint to ESLint and fix linting errors",
|
||||||
|
"pr": 589
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1665013355
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1663786955,
|
||||||
|
"version": "5.4.35",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662998180,
|
||||||
|
"version": "5.4.34",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662559804,
|
||||||
|
"version": "5.4.33",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662147076,
|
||||||
|
"version": "5.4.32",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662046042,
|
||||||
|
"version": "5.4.31",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661462289,
|
||||||
|
"version": "5.4.30",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661459661,
|
||||||
|
"version": "5.4.29",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661145612,
|
||||||
|
"version": "5.4.28",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1660093941,
|
||||||
|
"version": "5.4.27",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1660073235,
|
||||||
|
"version": "5.4.26",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1659750766,
|
||||||
|
"version": "5.4.25",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1658950329,
|
||||||
|
"version": "5.4.24",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1655244958,
|
||||||
|
"version": "5.4.23",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1654284040,
|
||||||
|
"version": "5.4.22",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1652919697,
|
||||||
|
"version": "5.4.21",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1650611093,
|
||||||
|
"version": "5.4.20",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1648739346,
|
||||||
|
"version": "5.4.19",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1646225739,
|
||||||
|
"version": "5.4.18",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1645569128,
|
||||||
|
"version": "5.4.17",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "5.4.16",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1638390144,
|
||||||
|
"version": "5.4.15",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1637102971,
|
||||||
|
"version": "5.4.14",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1635903615,
|
"timestamp": 1635903615,
|
||||||
"version": "5.4.13",
|
"version": "5.4.13",
|
||||||
|
@@ -5,6 +5,134 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v5.4.45 - _January 23, 2023_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.44 - _December 12, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.43 - _November 23, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.42 - _November 15, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.41 - _November 5, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.40 - _November 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.39 - _October 24, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.38 - _October 21, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.37 - _October 11, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.36 - _October 5, 2022_
|
||||||
|
|
||||||
|
* Migrate from TSLint to ESLint and fix linting errors (#589)
|
||||||
|
|
||||||
|
## v5.4.35 - _September 21, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.34 - _September 12, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.33 - _September 7, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.32 - _September 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.31 - _September 1, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.30 - _August 25, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.29 - _August 25, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.28 - _August 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.27 - _August 10, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.26 - _August 9, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.25 - _August 6, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.24 - _July 27, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.23 - _June 14, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.22 - _June 3, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.21 - _May 19, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.20 - _April 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.19 - _March 31, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.18 - _March 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.17 - _February 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.16 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.15 - _December 1, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v5.4.14 - _November 16, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v5.4.13 - _November 3, 2021_
|
## v5.4.13 - _November 3, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -24,7 +24,7 @@ import {
|
|||||||
|
|
||||||
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.
|
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.
|
Please read our [contribution guidelines](../../.github/CONTRIBUTING.md) before getting started.
|
||||||
|
|
||||||
### Install Dependencies
|
### Install Dependencies
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-test-utils",
|
"name": "@0x/contracts-test-utils",
|
||||||
"version": "5.4.13",
|
"version": "5.4.45",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -13,16 +13,11 @@
|
|||||||
"build": "tsc -b",
|
"build": "tsc -b",
|
||||||
"build:ci": "yarn build",
|
"build:ci": "yarn build",
|
||||||
"test": "yarn run_mocha",
|
"test": "yarn run_mocha",
|
||||||
"test:coverage": "run-s build run_mocha coverage:report:text coverage:report:lcov",
|
|
||||||
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.js' --timeout 100000 --bail --exit",
|
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.js' --timeout 100000 --bail --exit",
|
||||||
"clean": "shx rm -rf lib",
|
"clean": "shx rm -rf lib",
|
||||||
"lint": "tslint --format stylish --project tsconfig.lint.json",
|
"lint": "eslint src test",
|
||||||
"fix": "tslint --fix --format stylish --project tsconfig.lint.json",
|
"fix": "eslint --fix src test",
|
||||||
"coverage:report:text": "istanbul report text",
|
"test:ci": "yarn test"
|
||||||
"coverage:report:html": "istanbul report html && open coverage/index.html",
|
|
||||||
"profiler:report:html": "istanbul report html && open coverage/index.html",
|
|
||||||
"coverage:report:lcov": "istanbul report lcov",
|
|
||||||
"test:circleci": "yarn test"
|
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -34,28 +29,29 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils",
|
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/sol-compiler": "^4.7.5",
|
"@0x/sol-compiler": "^4.8.2",
|
||||||
"@0x/tslint-config": "^4.1.4",
|
"@typescript-eslint/eslint-plugin": "^5.38.0",
|
||||||
|
"@typescript-eslint/parser": "^5.38.0",
|
||||||
|
"eslint": "^8.23.1",
|
||||||
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"tslint": "5.11.0",
|
"typescript": "4.6.3"
|
||||||
"typescript": "4.2.2"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/assert": "^3.0.29",
|
"@0x/assert": "^3.0.35",
|
||||||
"@0x/base-contract": "^6.4.2",
|
"@0x/base-contract": "^7.0.0",
|
||||||
"@0x/contract-addresses": "^6.8.1",
|
"@0x/contract-addresses": "^8.0.1",
|
||||||
"@0x/dev-utils": "^4.2.9",
|
"@0x/dev-utils": "^5.0.0",
|
||||||
"@0x/json-schemas": "^6.3.0",
|
"@0x/json-schemas": "^6.4.4",
|
||||||
"@0x/order-utils": "^10.4.28",
|
"@0x/order-utils": "^10.4.28",
|
||||||
"@0x/sol-coverage": "^4.0.39",
|
"@0x/sol-profiler": "^4.1.36",
|
||||||
"@0x/sol-profiler": "^4.1.29",
|
"@0x/sol-trace": "^3.0.46",
|
||||||
"@0x/sol-trace": "^3.0.39",
|
"@0x/subproviders": "^7.0.0",
|
||||||
"@0x/subproviders": "^6.6.0",
|
"@0x/types": "^3.3.6",
|
||||||
"@0x/types": "^3.3.4",
|
"@0x/typescript-typings": "^5.3.1",
|
||||||
"@0x/typescript-typings": "^5.2.1",
|
"@0x/utils": "^7.0.0",
|
||||||
"@0x/utils": "^6.4.4",
|
"@0x/web3-wrapper": "^8.0.0",
|
||||||
"@0x/web3-wrapper": "^7.6.0",
|
|
||||||
"@types/bn.js": "^4.11.0",
|
"@types/bn.js": "^4.11.0",
|
||||||
"@types/js-combinatorics": "^0.5.29",
|
"@types/js-combinatorics": "^0.5.29",
|
||||||
"@types/lodash": "4.14.104",
|
"@types/lodash": "4.14.104",
|
||||||
@@ -67,7 +63,7 @@
|
|||||||
"chai-bignumber": "^3.0.0",
|
"chai-bignumber": "^3.0.0",
|
||||||
"decimal.js": "^10.2.0",
|
"decimal.js": "^10.2.0",
|
||||||
"dirty-chai": "^2.0.1",
|
"dirty-chai": "^2.0.1",
|
||||||
"ethereum-types": "^3.6.0",
|
"ethereum-types": "^3.7.1",
|
||||||
"ethereumjs-util": "^7.0.10",
|
"ethereumjs-util": "^7.0.10",
|
||||||
"ethers": "~4.0.4",
|
"ethers": "~4.0.4",
|
||||||
"js-combinatorics": "^0.5.3",
|
"js-combinatorics": "^0.5.3",
|
||||||
|
@@ -38,7 +38,7 @@ async function _getGanacheOrGethErrorAsync(ganacheError: string, gethError: stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function _getInsufficientFundsErrorMessageAsync(): Promise<string> {
|
async function _getInsufficientFundsErrorMessageAsync(): Promise<string> {
|
||||||
return _getGanacheOrGethErrorAsync("sender doesn't have enough funds", 'insufficient funds');
|
return _getGanacheOrGethErrorAsync('insufficient funds for gas * price + value', 'insufficient funds');
|
||||||
}
|
}
|
||||||
|
|
||||||
async function _getTransactionFailedErrorMessageAsync(): Promise<string> {
|
async function _getTransactionFailedErrorMessageAsync(): Promise<string> {
|
||||||
@@ -102,9 +102,9 @@ export async function expectTransactionFailedAsync(p: sendTransactionResult, rea
|
|||||||
if (nodeType === undefined) {
|
if (nodeType === undefined) {
|
||||||
nodeType = await web3Wrapper.getNodeTypeAsync();
|
nodeType = await web3Wrapper.getNodeTypeAsync();
|
||||||
}
|
}
|
||||||
|
const rejectionMessageRegex = new RegExp(`^VM Exception while processing transaction: revert ${reason}$`);
|
||||||
switch (nodeType) {
|
switch (nodeType) {
|
||||||
case NodeType.Ganache:
|
case NodeType.Ganache:
|
||||||
const rejectionMessageRegex = new RegExp(`^VM Exception while processing transaction: revert ${reason}$`);
|
|
||||||
return expect(p).to.be.rejectedWith(rejectionMessageRegex);
|
return expect(p).to.be.rejectedWith(rejectionMessageRegex);
|
||||||
case NodeType.Geth:
|
case NodeType.Geth:
|
||||||
logUtils.warn(
|
logUtils.warn(
|
||||||
|
@@ -1,26 +0,0 @@
|
|||||||
import { devConstants } from '@0x/dev-utils';
|
|
||||||
import { CoverageSubprovider, SolCompilerArtifactAdapter } from '@0x/sol-coverage';
|
|
||||||
let coverageSubprovider: CoverageSubprovider;
|
|
||||||
|
|
||||||
export const coverage = {
|
|
||||||
getCoverageSubproviderSingleton(): CoverageSubprovider {
|
|
||||||
if (coverageSubprovider === undefined) {
|
|
||||||
coverageSubprovider = coverage._getCoverageSubprovider();
|
|
||||||
}
|
|
||||||
return coverageSubprovider;
|
|
||||||
},
|
|
||||||
_getCoverageSubprovider(): CoverageSubprovider {
|
|
||||||
const defaultFromAddress = devConstants.TESTRPC_FIRST_ADDRESS;
|
|
||||||
const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter();
|
|
||||||
const coverageSubproviderConfig = {
|
|
||||||
isVerbose: true,
|
|
||||||
ignoreFilesGlobs: ['**/node_modules/**', '**/interfaces/**', '**/test/**'],
|
|
||||||
};
|
|
||||||
const subprovider = new CoverageSubprovider(
|
|
||||||
solCompilerArtifactAdapter,
|
|
||||||
defaultFromAddress,
|
|
||||||
coverageSubproviderConfig,
|
|
||||||
);
|
|
||||||
return subprovider;
|
|
||||||
},
|
|
||||||
};
|
|
@@ -1,15 +0,0 @@
|
|||||||
import { env, EnvVars } from '@0x/dev-utils';
|
|
||||||
|
|
||||||
import { coverage } from './coverage';
|
|
||||||
import { profiler } from './profiler';
|
|
||||||
|
|
||||||
after('generate coverage report', async () => {
|
|
||||||
if (env.parseBoolean(EnvVars.SolidityCoverage)) {
|
|
||||||
const coverageSubprovider = coverage.getCoverageSubproviderSingleton();
|
|
||||||
await coverageSubprovider.writeCoverageAsync();
|
|
||||||
}
|
|
||||||
if (env.parseBoolean(EnvVars.SolidityProfiler)) {
|
|
||||||
const profilerSubprovider = profiler.getProfilerSubproviderSingleton();
|
|
||||||
await profilerSubprovider.writeProfilerOutputAsync();
|
|
||||||
}
|
|
||||||
});
|
|
@@ -20,7 +20,6 @@ export { signingUtils } from './signing_utils';
|
|||||||
export { orderUtils } from './order_utils';
|
export { orderUtils } from './order_utils';
|
||||||
export { typeEncodingUtils } from './type_encoding_utils';
|
export { typeEncodingUtils } from './type_encoding_utils';
|
||||||
export { profiler } from './profiler';
|
export { profiler } from './profiler';
|
||||||
export { coverage } from './coverage';
|
|
||||||
export { Web3ProviderEngine } from '@0x/subproviders';
|
export { Web3ProviderEngine } from '@0x/subproviders';
|
||||||
export { randomAddress } from './address_utils';
|
export { randomAddress } from './address_utils';
|
||||||
export { OrderFactory } from './order_factory';
|
export { OrderFactory } from './order_factory';
|
||||||
|
@@ -11,9 +11,14 @@ export function shortZip<T1, T2>(a: T1[], b: T2[]): Array<[T1, T2]> {
|
|||||||
/**
|
/**
|
||||||
* Replaces the keys in a deeply nested object. Adapted from https://stackoverflow.com/a/39126851
|
* Replaces the keys in a deeply nested object. Adapted from https://stackoverflow.com/a/39126851
|
||||||
*/
|
*/
|
||||||
export function replaceKeysDeep(obj: {}, mapKeys: (key: string) => string | void): _.Dictionary<{}> {
|
export function replaceKeysDeep(
|
||||||
|
obj: Record<string, unknown>,
|
||||||
|
mapKeys: (key: string) => string | void,
|
||||||
|
): _.Dictionary<Record<string, unknown>> {
|
||||||
return _.transform(obj, (result, value, key) => {
|
return _.transform(obj, (result, value, key) => {
|
||||||
const currentKey = mapKeys(key) || key;
|
const currentKey = mapKeys(key) || key;
|
||||||
result[currentKey] = _.isObject(value) ? replaceKeysDeep(value as {}, mapKeys) : (value as {});
|
result[currentKey] = _.isObject(value)
|
||||||
|
? replaceKeysDeep(value as Record<string, unknown>, mapKeys)
|
||||||
|
: (value as Record<string, unknown>);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -35,7 +35,6 @@ export class LogDecoder {
|
|||||||
}
|
}
|
||||||
public decodeLogOrThrow<ArgsType extends DecodedLogArgs>(log: LogEntry): LogWithDecodedArgs<ArgsType> | RawLog {
|
public decodeLogOrThrow<ArgsType extends DecodedLogArgs>(log: LogEntry): LogWithDecodedArgs<ArgsType> | RawLog {
|
||||||
const logWithDecodedArgsOrLog = this._abiDecoder.tryToDecodeLogOrNoop(log);
|
const logWithDecodedArgsOrLog = this._abiDecoder.tryToDecodeLogOrNoop(log);
|
||||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
|
||||||
if ((logWithDecodedArgsOrLog as LogWithDecodedArgs<ArgsType>).args === undefined) {
|
if ((logWithDecodedArgsOrLog as LogWithDecodedArgs<ArgsType>).args === undefined) {
|
||||||
throw new Error(`Unable to decode log: ${JSON.stringify(log)}`);
|
throw new Error(`Unable to decode log: ${JSON.stringify(log)}`);
|
||||||
}
|
}
|
||||||
|
@@ -2,8 +2,6 @@ import { LogEntry, LogWithDecodedArgs, TransactionReceiptWithDecodedLogs } from
|
|||||||
|
|
||||||
import { expect } from './chai_setup';
|
import { expect } from './chai_setup';
|
||||||
|
|
||||||
// tslint:disable no-unnecessary-type-assertion
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter logs by event name/type.
|
* Filter logs by event name/type.
|
||||||
*/
|
*/
|
||||||
|
@@ -8,8 +8,6 @@ import * as process from 'process';
|
|||||||
|
|
||||||
import { provider, providerConfigs, txDefaults, web3Wrapper } from './web3_wrapper';
|
import { provider, providerConfigs, txDefaults, web3Wrapper } from './web3_wrapper';
|
||||||
|
|
||||||
// tslint:disable: no-namespace only-arrow-functions no-unbound-method max-classes-per-file
|
|
||||||
|
|
||||||
export type ISuite = mocha.ISuite;
|
export type ISuite = mocha.ISuite;
|
||||||
export type ISuiteCallbackContext = mocha.ISuiteCallbackContext;
|
export type ISuiteCallbackContext = mocha.ISuiteCallbackContext;
|
||||||
export type SuiteCallback = (this: ISuiteCallbackContext) => void;
|
export type SuiteCallback = (this: ISuiteCallbackContext) => void;
|
||||||
@@ -236,7 +234,7 @@ export const describe = _.assign(mochaDescribe, {
|
|||||||
* Like mocha's `describe()`, but sets up a blockchain environment for you.
|
* Like mocha's `describe()`, but sets up a blockchain environment for you.
|
||||||
*/
|
*/
|
||||||
export const blockchainTests: BlockchainContextDefinition = _.assign(
|
export const blockchainTests: BlockchainContextDefinition = _.assign(
|
||||||
function(description: string, callback: BlockchainSuiteCallback): ISuite {
|
function (description: string, callback: BlockchainSuiteCallback): ISuite {
|
||||||
return defineBlockchainSuite(StandardBlockchainTestsEnvironmentSingleton, description, callback, describe);
|
return defineBlockchainSuite(StandardBlockchainTestsEnvironmentSingleton, description, callback, describe);
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -275,7 +273,7 @@ export const blockchainTests: BlockchainContextDefinition = _.assign(
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
fork: _.assign(
|
fork: _.assign(
|
||||||
function(description: string, callback: BlockchainSuiteCallback): ISuite | void {
|
function (description: string, callback: BlockchainSuiteCallback): ISuite | void {
|
||||||
return defineBlockchainSuite(
|
return defineBlockchainSuite(
|
||||||
ForkedBlockchainTestsEnvironmentSingleton,
|
ForkedBlockchainTestsEnvironmentSingleton,
|
||||||
description,
|
description,
|
||||||
@@ -319,7 +317,7 @@ export const blockchainTests: BlockchainContextDefinition = _.assign(
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
live: _.assign(
|
live: _.assign(
|
||||||
function(description: string, callback: BlockchainSuiteCallback): ISuite | void {
|
function (description: string, callback: BlockchainSuiteCallback): ISuite | void {
|
||||||
return defineBlockchainSuite(
|
return defineBlockchainSuite(
|
||||||
LiveBlockchainTestsEnvironmentSingleton,
|
LiveBlockchainTestsEnvironmentSingleton,
|
||||||
description,
|
description,
|
||||||
@@ -355,7 +353,7 @@ export const blockchainTests: BlockchainContextDefinition = _.assign(
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
resets: _.assign(
|
resets: _.assign(
|
||||||
function(description: string, callback: BlockchainSuiteCallback): ISuite {
|
function (description: string, callback: BlockchainSuiteCallback): ISuite {
|
||||||
return defineResetsBlockchainSuite(
|
return defineResetsBlockchainSuite(
|
||||||
StandardBlockchainTestsEnvironmentSingleton,
|
StandardBlockchainTestsEnvironmentSingleton,
|
||||||
description,
|
description,
|
||||||
@@ -399,7 +397,7 @@ function defineBlockchainSuite<T>(
|
|||||||
callback: BlockchainSuiteCallback,
|
callback: BlockchainSuiteCallback,
|
||||||
describeCall: ContextDefinitionCallback<T>,
|
describeCall: ContextDefinitionCallback<T>,
|
||||||
): T {
|
): T {
|
||||||
return describeCall(description, function(this: ISuiteCallbackContext): void {
|
return describeCall(description, function (this: ISuiteCallbackContext): void {
|
||||||
callback.call(this, envFactory.create());
|
callback.call(this, envFactory.create());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -410,7 +408,7 @@ function defineResetsBlockchainSuite<T>(
|
|||||||
callback: BlockchainSuiteCallback,
|
callback: BlockchainSuiteCallback,
|
||||||
describeCall: ContextDefinitionCallback<T>,
|
describeCall: ContextDefinitionCallback<T>,
|
||||||
): T {
|
): T {
|
||||||
return describeCall(description, function(this: ISuiteCallbackContext): void {
|
return describeCall(description, function (this: ISuiteCallbackContext): void {
|
||||||
const env = envFactory.create();
|
const env = envFactory.create();
|
||||||
beforeEach(async () => env.blockchainLifecycle.startAsync());
|
beforeEach(async () => env.blockchainLifecycle.startAsync());
|
||||||
afterEach(async () => env.blockchainLifecycle.revertAsync());
|
afterEach(async () => env.blockchainLifecycle.revertAsync());
|
||||||
|
@@ -40,10 +40,7 @@ export function getRandomPortion(total: Numberish): BigNumber {
|
|||||||
export function getRandomFloat(min: Numberish, max: Numberish): BigNumber {
|
export function getRandomFloat(min: Numberish, max: Numberish): BigNumber {
|
||||||
// Generate a really high precision number between [0, 1]
|
// Generate a really high precision number between [0, 1]
|
||||||
const r = new BigNumber(crypto.randomBytes(32).toString('hex'), 16).dividedBy(new BigNumber(2).pow(256).minus(1));
|
const r = new BigNumber(crypto.randomBytes(32).toString('hex'), 16).dividedBy(new BigNumber(2).pow(256).minus(1));
|
||||||
return new BigNumber(max)
|
return new BigNumber(max).minus(min).times(r).plus(min);
|
||||||
.minus(min)
|
|
||||||
.times(r)
|
|
||||||
.plus(min);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const FIXED_POINT_BASE = new BigNumber(2).pow(127);
|
export const FIXED_POINT_BASE = new BigNumber(2).pow(127);
|
||||||
@@ -66,7 +63,7 @@ export function fromFixed(n: Numberish): BigNumber {
|
|||||||
* Converts two decimal numbers to integers with `precision` digits, then returns
|
* Converts two decimal numbers to integers with `precision` digits, then returns
|
||||||
* the absolute difference.
|
* the absolute difference.
|
||||||
*/
|
*/
|
||||||
export function getNumericalDivergence(a: Numberish, b: Numberish, precision: number = 18): number {
|
export function getNumericalDivergence(a: Numberish, b: Numberish, precision = 18): number {
|
||||||
const _a = new BigNumber(a);
|
const _a = new BigNumber(a);
|
||||||
const _b = new BigNumber(b);
|
const _b = new BigNumber(b);
|
||||||
const maxIntegerDigits = Math.max(
|
const maxIntegerDigits = Math.max(
|
||||||
@@ -77,16 +74,13 @@ export function getNumericalDivergence(a: Numberish, b: Numberish, precision: nu
|
|||||||
const base = 10 ** (precision - maxIntegerDigits);
|
const base = 10 ** (precision - maxIntegerDigits);
|
||||||
return n.times(base).integerValue(BigNumber.ROUND_DOWN);
|
return n.times(base).integerValue(BigNumber.ROUND_DOWN);
|
||||||
};
|
};
|
||||||
return _toInteger(_a)
|
return _toInteger(_a).minus(_toInteger(_b)).abs().toNumber();
|
||||||
.minus(_toInteger(_b))
|
|
||||||
.abs()
|
|
||||||
.toNumber();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asserts that two numbers are equal up to `precision` digits.
|
* Asserts that two numbers are equal up to `precision` digits.
|
||||||
*/
|
*/
|
||||||
export function assertRoughlyEquals(actual: Numberish, expected: Numberish, precision: number = 18): void {
|
export function assertRoughlyEquals(actual: Numberish, expected: Numberish, precision = 18): void {
|
||||||
if (getNumericalDivergence(actual, expected, precision) <= 1) {
|
if (getNumericalDivergence(actual, expected, precision) <= 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -96,16 +90,8 @@ export function assertRoughlyEquals(actual: Numberish, expected: Numberish, prec
|
|||||||
/**
|
/**
|
||||||
* Asserts that two numbers are equal with up to `maxError` difference between them.
|
* Asserts that two numbers are equal with up to `maxError` difference between them.
|
||||||
*/
|
*/
|
||||||
export function assertIntegerRoughlyEquals(
|
export function assertIntegerRoughlyEquals(actual: Numberish, expected: Numberish, maxError = 1, msg?: string): void {
|
||||||
actual: Numberish,
|
const diff = new BigNumber(actual).minus(expected).abs().toNumber();
|
||||||
expected: Numberish,
|
|
||||||
maxError: number = 1,
|
|
||||||
msg?: string,
|
|
||||||
): void {
|
|
||||||
const diff = new BigNumber(actual)
|
|
||||||
.minus(expected)
|
|
||||||
.abs()
|
|
||||||
.toNumber();
|
|
||||||
if (diff <= maxError) {
|
if (diff <= maxError) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -29,7 +29,7 @@ export class OrderFactory {
|
|||||||
salt: generatePseudoRandomSalt(),
|
salt: generatePseudoRandomSalt(),
|
||||||
...this._defaultOrderParams,
|
...this._defaultOrderParams,
|
||||||
...customOrderParams,
|
...customOrderParams,
|
||||||
} as Order; // tslint:disable-line:no-object-literal-type-assertion
|
} as Order;
|
||||||
const orderHashBuff = orderHashUtils.getOrderHashBuffer(order);
|
const orderHashBuff = orderHashUtils.getOrderHashBuffer(order);
|
||||||
const signature = signingUtils.signMessage(orderHashBuff, this._privateKey, signatureType);
|
const signature = signingUtils.signMessage(orderHashBuff, this._privateKey, signatureType);
|
||||||
const signedOrder = {
|
const signedOrder = {
|
||||||
|
@@ -8,10 +8,7 @@ import { BatchMatchOrder, CancelOrder, MatchOrder } from './types';
|
|||||||
|
|
||||||
export const orderUtils = {
|
export const orderUtils = {
|
||||||
getPartialAmountFloor(numerator: BigNumber, denominator: BigNumber, target: BigNumber): BigNumber {
|
getPartialAmountFloor(numerator: BigNumber, denominator: BigNumber, target: BigNumber): BigNumber {
|
||||||
const partialAmount = numerator
|
const partialAmount = numerator.multipliedBy(target).div(denominator).integerValue(BigNumber.ROUND_FLOOR);
|
||||||
.multipliedBy(target)
|
|
||||||
.div(denominator)
|
|
||||||
.integerValue(BigNumber.ROUND_FLOOR);
|
|
||||||
return partialAmount;
|
return partialAmount;
|
||||||
},
|
},
|
||||||
createFill: (signedOrder: SignedOrder, takerAssetFillAmount?: BigNumber) => {
|
createFill: (signedOrder: SignedOrder, takerAssetFillAmount?: BigNumber) => {
|
||||||
|
@@ -9,7 +9,6 @@ export const typeEncodingUtils = {
|
|||||||
const base = 10;
|
const base = 10;
|
||||||
const formattedValue = new BN(value.toString(base));
|
const formattedValue = new BN(value.toString(base));
|
||||||
const encodedValue = ethUtil.toBuffer(formattedValue);
|
const encodedValue = ethUtil.toBuffer(formattedValue);
|
||||||
// tslint:disable-next-line:custom-no-magic-numbers
|
|
||||||
const paddedValue = ethUtil.setLengthLeft(encodedValue, constants.WORD_LENGTH);
|
const paddedValue = ethUtil.setLengthLeft(encodedValue, constants.WORD_LENGTH);
|
||||||
return paddedValue;
|
return paddedValue;
|
||||||
},
|
},
|
||||||
|
@@ -5,7 +5,6 @@ import { Web3Wrapper } from '@0x/web3-wrapper';
|
|||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
import { constants } from './constants';
|
import { constants } from './constants';
|
||||||
import { coverage } from './coverage';
|
|
||||||
import { profiler } from './profiler';
|
import { profiler } from './profiler';
|
||||||
import { revertTrace } from './revert_trace';
|
import { revertTrace } from './revert_trace';
|
||||||
|
|
||||||
@@ -15,7 +14,7 @@ export const txDefaults = {
|
|||||||
gasPrice: constants.DEFAULT_GAS_PRICE,
|
gasPrice: constants.DEFAULT_GAS_PRICE,
|
||||||
};
|
};
|
||||||
|
|
||||||
export let providerConfigs: Web3Config = {
|
export const providerConfigs: Web3Config = {
|
||||||
total_accounts: constants.NUM_TEST_ACCOUNTS,
|
total_accounts: constants.NUM_TEST_ACCOUNTS,
|
||||||
shouldUseInProcessGanache: true,
|
shouldUseInProcessGanache: true,
|
||||||
shouldAllowUnlimitedContractSize: true,
|
shouldAllowUnlimitedContractSize: true,
|
||||||
@@ -39,11 +38,7 @@ const enabledSubproviderCount = _.filter(
|
|||||||
_.identity.bind(_),
|
_.identity.bind(_),
|
||||||
).length;
|
).length;
|
||||||
if (enabledSubproviderCount > 1) {
|
if (enabledSubproviderCount > 1) {
|
||||||
throw new Error(`Only one of coverage, profiler, or revert trace subproviders can be enabled at a time`);
|
throw new Error(`Only one of profiler or revert trace subproviders can be enabled at a time`);
|
||||||
}
|
|
||||||
if (isCoverageEnabled) {
|
|
||||||
const coverageSubprovider = coverage.getCoverageSubproviderSingleton();
|
|
||||||
prependSubprovider(provider, coverageSubprovider);
|
|
||||||
}
|
}
|
||||||
if (isProfilerEnabled) {
|
if (isProfilerEnabled) {
|
||||||
const profilerSubprovider = profiler.getProfilerSubproviderSingleton();
|
const profilerSubprovider = profiler.getProfilerSubproviderSingleton();
|
||||||
|
@@ -4,6 +4,7 @@ import * as process from 'process';
|
|||||||
import { expect } from '../src/chai_setup';
|
import { expect } from '../src/chai_setup';
|
||||||
import { constants } from '../src/constants';
|
import { constants } from '../src/constants';
|
||||||
import { blockchainTests, describe } from '../src/mocha_blockchain';
|
import { blockchainTests, describe } from '../src/mocha_blockchain';
|
||||||
|
import { append } from './subtests/mocha_blockchain_1';
|
||||||
|
|
||||||
blockchainTests('mocha blockchain extensions', env => {
|
blockchainTests('mocha blockchain extensions', env => {
|
||||||
describe('blockchainTests()', () => {
|
describe('blockchainTests()', () => {
|
||||||
@@ -12,11 +13,8 @@ blockchainTests('mocha blockchain extensions', env => {
|
|||||||
expect(env.provider).to.exist('');
|
expect(env.provider).to.exist('');
|
||||||
expect(env.txDefaults).to.exist('');
|
expect(env.txDefaults).to.exist('');
|
||||||
expect(env.web3Wrapper).to.exist('');
|
expect(env.web3Wrapper).to.exist('');
|
||||||
// HACK(dorothy-zbornak): tslint seems to get confused by these assertions.
|
|
||||||
// tslint:disable: no-unbound-method
|
|
||||||
expect(typeof env.getChainIdAsync).to.eq('function');
|
expect(typeof env.getChainIdAsync).to.eq('function');
|
||||||
expect(typeof env.getAccountAddressesAsync).to.eq('function');
|
expect(typeof env.getAccountAddressesAsync).to.eq('function');
|
||||||
// tslint:enable: no-unbound-method
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('initializes the test environment', async () => {
|
it('initializes the test environment', async () => {
|
||||||
@@ -78,7 +76,7 @@ blockchainTests('mocha blockchain extensions', env => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('subtests', () => {
|
describe('subtests', () => {
|
||||||
require('./subtests/mocha_blockchain_1').append(env);
|
append(env);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -95,8 +93,7 @@ blockchainTests('mocha blockchain extensions', env => {
|
|||||||
|
|
||||||
function createHookedObject(obj: any, handler: (name: string) => void, methods: string[]): any {
|
function createHookedObject(obj: any, handler: (name: string) => void, methods: string[]): any {
|
||||||
const hookedMethods = _.map(methods, methodName => {
|
const hookedMethods = _.map(methods, methodName => {
|
||||||
// tslint:disable: only-arrow-functions
|
return function (this: any, ...args: any[]): any {
|
||||||
return function(this: any, ...args: any[]): any {
|
|
||||||
handler(methodName);
|
handler(methodName);
|
||||||
return obj[methodName].call(this, ...args);
|
return obj[methodName].call(this, ...args);
|
||||||
};
|
};
|
||||||
|
@@ -42,7 +42,6 @@ describe('Order hashing', () => {
|
|||||||
// It's common for developers using javascript to provide the amounts
|
// It's common for developers using javascript to provide the amounts
|
||||||
// as strings. Since we eventually toString() the BigNumber
|
// as strings. Since we eventually toString() the BigNumber
|
||||||
// before encoding we should result in the same orderHash in this scenario
|
// before encoding we should result in the same orderHash in this scenario
|
||||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
|
||||||
const orderHash = orderHashUtils.getOrderHashHex({
|
const orderHash = orderHashUtils.getOrderHashHex({
|
||||||
...order,
|
...order,
|
||||||
makerAssetAmount: '0',
|
makerAssetAmount: '0',
|
||||||
@@ -55,7 +54,7 @@ describe('Order hashing', () => {
|
|||||||
it('throws a readable error message if taker format is invalid', async () => {
|
it('throws a readable error message if taker format is invalid', async () => {
|
||||||
const orderWithInvalidtakerFormat = {
|
const orderWithInvalidtakerFormat = {
|
||||||
...order,
|
...order,
|
||||||
takerAddress: (null as any) as string,
|
takerAddress: null as any as string,
|
||||||
};
|
};
|
||||||
const expectedErrorMessage = `Expected order to conform to schema`;
|
const expectedErrorMessage = `Expected order to conform to schema`;
|
||||||
expect(() => orderHashUtils.getOrderHashHex(orderWithInvalidtakerFormat)).to.throw(expectedErrorMessage);
|
expect(() => orderHashUtils.getOrderHashHex(orderWithInvalidtakerFormat)).to.throw(expectedErrorMessage);
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
import { expect } from '../../src/chai_setup';
|
import { expect } from '../../src/chai_setup';
|
||||||
import { blockchainTests, BlockchainTestsEnvironment } from '../../src/mocha_blockchain';
|
import { blockchainTests, BlockchainTestsEnvironment } from '../../src/mocha_blockchain';
|
||||||
|
|
||||||
// tslint:disable: no-default-export completed-docs
|
|
||||||
export function append(env: BlockchainTestsEnvironment): void {
|
export function append(env: BlockchainTestsEnvironment): void {
|
||||||
blockchainTests('imported subtests', subtestsEnv => {
|
blockchainTests('imported subtests', subtestsEnv => {
|
||||||
it('shares the same environment object', () => {
|
it('shares the same environment object', () => {
|
||||||
|
@@ -35,7 +35,6 @@ describe('0x transaction hashing', () => {
|
|||||||
// It's common for developers using javascript to provide the amounts
|
// It's common for developers using javascript to provide the amounts
|
||||||
// as strings. Since we eventually toString() the BigNumber
|
// as strings. Since we eventually toString() the BigNumber
|
||||||
// before encoding we should result in the same orderHash in this scenario
|
// before encoding we should result in the same orderHash in this scenario
|
||||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
|
||||||
const transactionHash = transactionHashUtils.getTransactionHashHex({
|
const transactionHash = transactionHashUtils.getTransactionHashHex({
|
||||||
...transaction,
|
...transaction,
|
||||||
salt: '0',
|
salt: '0',
|
||||||
|
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
// This file is a workaround that issue: https://github.com/palantir/tslint/issues/4148#issuecomment-419872702
|
|
||||||
"extends": "./tsconfig",
|
|
||||||
"compilerOptions": {
|
|
||||||
"composite": false
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": ["@0x/tslint-config"],
|
|
||||||
"rules": {
|
|
||||||
"custom-no-magic-numbers": false
|
|
||||||
}
|
|
||||||
}
|
|
25
contracts/treasury/.eslintrc
Normal file
25
contracts/treasury/.eslintrc
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"es2021": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"],
|
||||||
|
"overrides": [],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"parserOptions": {
|
||||||
|
"project": "./tsconfig.json",
|
||||||
|
"ecmaVersion": "latest",
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"plugins": ["@typescript-eslint"],
|
||||||
|
"ignorePatterns": [
|
||||||
|
"lib/**/*",
|
||||||
|
"contracts/**/*",
|
||||||
|
"generated-wrappers/**/*",
|
||||||
|
"generated-artifacts/**/*",
|
||||||
|
"test/generated-wrappers/**/*",
|
||||||
|
"test/generated-artifacts/**/*"
|
||||||
|
|
||||||
|
],
|
||||||
|
"rules": {}
|
||||||
|
}
|
@@ -1,4 +1,302 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1674517560,
|
||||||
|
"version": "1.4.38",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1670879498,
|
||||||
|
"version": "1.4.37",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1669235113,
|
||||||
|
"version": "1.4.36",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1668477029,
|
||||||
|
"version": "1.4.35",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1667607537,
|
||||||
|
"version": "1.4.34",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1667427402,
|
||||||
|
"version": "1.4.33",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1666645023,
|
||||||
|
"version": "1.4.32",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1666381417,
|
||||||
|
"version": "1.4.31",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665670315,
|
||||||
|
"version": "1.4.30",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665531940,
|
||||||
|
"version": "1.4.29",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "1.4.28",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Migrate from TSLint to ESLint and fix linting errors",
|
||||||
|
"pr": 589
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1665013355
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1663786955,
|
||||||
|
"version": "1.4.27",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662998180,
|
||||||
|
"version": "1.4.26",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662559804,
|
||||||
|
"version": "1.4.25",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662147076,
|
||||||
|
"version": "1.4.24",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662046042,
|
||||||
|
"version": "1.4.23",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661462289,
|
||||||
|
"version": "1.4.22",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661459661,
|
||||||
|
"version": "1.4.21",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661145612,
|
||||||
|
"version": "1.4.20",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1660093941,
|
||||||
|
"version": "1.4.19",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1660073235,
|
||||||
|
"version": "1.4.18",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1659750766,
|
||||||
|
"version": "1.4.17",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1658950329,
|
||||||
|
"version": "1.4.16",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1655244958,
|
||||||
|
"version": "1.4.15",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1654284040,
|
||||||
|
"version": "1.4.14",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1652919697,
|
||||||
|
"version": "1.4.13",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1650611093,
|
||||||
|
"version": "1.4.12",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1648739346,
|
||||||
|
"version": "1.4.11",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1646225739,
|
||||||
|
"version": "1.4.10",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1645569128,
|
||||||
|
"version": "1.4.9",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "1.4.8",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1638390144,
|
||||||
|
"version": "1.4.7",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1637102971,
|
||||||
|
"version": "1.4.6",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1635903615,
|
"timestamp": 1635903615,
|
||||||
"version": "1.4.5",
|
"version": "1.4.5",
|
||||||
|
@@ -5,6 +5,138 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v1.4.38 - _January 23, 2023_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.37 - _December 12, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.36 - _November 23, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.35 - _November 15, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.34 - _November 5, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.33 - _November 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.32 - _October 24, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.31 - _October 21, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.30 - _October 13, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.29 - _October 11, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.28 - _October 5, 2022_
|
||||||
|
|
||||||
|
* Migrate from TSLint to ESLint and fix linting errors (#589)
|
||||||
|
|
||||||
|
## v1.4.27 - _September 21, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.26 - _September 12, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.25 - _September 7, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.24 - _September 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.23 - _September 1, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.22 - _August 25, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.21 - _August 25, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.20 - _August 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.19 - _August 10, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.18 - _August 9, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.17 - _August 6, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.16 - _July 27, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.15 - _June 14, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.14 - _June 3, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.13 - _May 19, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.12 - _April 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.11 - _March 31, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.10 - _March 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.9 - _February 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.8 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.7 - _December 1, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v1.4.6 - _November 16, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v1.4.5 - _November 3, 2021_
|
## v1.4.5 - _November 3, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -16,7 +16,7 @@ We strongly recommend that the community help us make improvements and determine
|
|||||||
|
|
||||||
For proposals regarding the 0x protocol's smart contract architecture, message format, or additional functionality, go to the [0x Improvement Proposals (ZEIPs)](https://github.com/0xProject/ZEIPs) repository and follow the contribution guidelines provided therein.
|
For proposals regarding the 0x protocol's smart contract architecture, message format, or additional functionality, go to the [0x Improvement Proposals (ZEIPs)](https://github.com/0xProject/ZEIPs) repository and follow the contribution guidelines provided therein.
|
||||||
|
|
||||||
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
Please read our [contribution guidelines](../../.github/CONTRIBUTING.md) before getting started.
|
||||||
|
|
||||||
### Install Dependencies
|
### Install Dependencies
|
||||||
|
|
||||||
|
@@ -36,7 +36,9 @@ interface ISablier {
|
|||||||
|
|
||||||
function balanceOf(uint256 streamId, address who) external view returns (uint256 balance);
|
function balanceOf(uint256 streamId, address who) external view returns (uint256 balance);
|
||||||
|
|
||||||
function getStream(uint256 streamId)
|
function getStream(
|
||||||
|
uint256 streamId
|
||||||
|
)
|
||||||
external
|
external
|
||||||
view
|
view
|
||||||
returns (
|
returns (
|
||||||
@@ -50,11 +52,15 @@ interface ISablier {
|
|||||||
uint256 ratePerSecond
|
uint256 ratePerSecond
|
||||||
);
|
);
|
||||||
|
|
||||||
function createStream(address recipient, uint256 deposit, address tokenAddress, uint256 startTime, uint256 stopTime)
|
function createStream(
|
||||||
external
|
address recipient,
|
||||||
returns (uint256 streamId);
|
uint256 deposit,
|
||||||
|
address tokenAddress,
|
||||||
|
uint256 startTime,
|
||||||
|
uint256 stopTime
|
||||||
|
) external returns (uint256 streamId);
|
||||||
|
|
||||||
function withdrawFromStream(uint256 streamId, uint256 funds) external returns (bool);
|
function withdrawFromStream(uint256 streamId, uint256 funds) external returns (bool);
|
||||||
|
|
||||||
function cancelStream(uint256 streamId) external returns (bool);
|
function cancelStream(uint256 streamId) external returns (bool);
|
||||||
}
|
}
|
||||||
|
@@ -23,7 +23,6 @@ pragma experimental ABIEncoderV2;
|
|||||||
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
|
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
|
||||||
import "./IStaking.sol";
|
import "./IStaking.sol";
|
||||||
|
|
||||||
|
|
||||||
contract DefaultPoolOperator {
|
contract DefaultPoolOperator {
|
||||||
// Immutables
|
// Immutables
|
||||||
IStaking public immutable stakingProxy;
|
IStaking public immutable stakingProxy;
|
||||||
@@ -33,12 +32,7 @@ contract DefaultPoolOperator {
|
|||||||
/// @dev Initializes this contract and creates a staking pool.
|
/// @dev Initializes this contract and creates a staking pool.
|
||||||
/// @param stakingProxy_ The 0x staking proxy contract.
|
/// @param stakingProxy_ The 0x staking proxy contract.
|
||||||
/// @param weth_ The WETH token contract.
|
/// @param weth_ The WETH token contract.
|
||||||
constructor(
|
constructor(IStaking stakingProxy_, IERC20TokenV06 weth_) public {
|
||||||
IStaking stakingProxy_,
|
|
||||||
IERC20TokenV06 weth_
|
|
||||||
)
|
|
||||||
public
|
|
||||||
{
|
|
||||||
stakingProxy = stakingProxy_;
|
stakingProxy = stakingProxy_;
|
||||||
weth = weth_;
|
weth = weth_;
|
||||||
// operator share = 100%
|
// operator share = 100%
|
||||||
@@ -51,9 +45,7 @@ contract DefaultPoolOperator {
|
|||||||
/// market making for some reason, thus earning this contract
|
/// market making for some reason, thus earning this contract
|
||||||
/// some staking rewards. Note that anyone can call this
|
/// some staking rewards. Note that anyone can call this
|
||||||
/// function at any time.
|
/// function at any time.
|
||||||
function returnStakingRewards()
|
function returnStakingRewards() external {
|
||||||
external
|
|
||||||
{
|
|
||||||
uint256 wethBalance = weth.balanceOf(address(this));
|
uint256 wethBalance = weth.balanceOf(address(this));
|
||||||
weth.transfer(address(stakingProxy), wethBalance);
|
weth.transfer(address(stakingProxy), wethBalance);
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,6 @@
|
|||||||
pragma solidity ^0.6.12;
|
pragma solidity ^0.6.12;
|
||||||
pragma experimental ABIEncoderV2;
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
|
|
||||||
interface IStaking {
|
interface IStaking {
|
||||||
/// @dev Statuses that stake can exist in.
|
/// @dev Statuses that stake can exist in.
|
||||||
/// Any stake can be (re)delegated effective at the next epoch
|
/// Any stake can be (re)delegated effective at the next epoch
|
||||||
@@ -55,45 +54,28 @@ interface IStaking {
|
|||||||
/// @param operatorShare Portion of rewards owned by the operator, in ppm.
|
/// @param operatorShare Portion of rewards owned by the operator, in ppm.
|
||||||
/// @param addOperatorAsMaker Adds operator to the created pool as a maker for convenience iff true.
|
/// @param addOperatorAsMaker Adds operator to the created pool as a maker for convenience iff true.
|
||||||
/// @return poolId The unique pool id generated for this pool.
|
/// @return poolId The unique pool id generated for this pool.
|
||||||
function createStakingPool(uint32 operatorShare, bool addOperatorAsMaker)
|
function createStakingPool(uint32 operatorShare, bool addOperatorAsMaker) external returns (bytes32 poolId);
|
||||||
external
|
|
||||||
returns (bytes32 poolId);
|
|
||||||
|
|
||||||
/// @dev Returns the current staking epoch number.
|
/// @dev Returns the current staking epoch number.
|
||||||
/// @return epoch The current epoch.
|
/// @return epoch The current epoch.
|
||||||
function currentEpoch()
|
function currentEpoch() external view returns (uint256 epoch);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256 epoch);
|
|
||||||
|
|
||||||
/// @dev Returns the time (in seconds) at which the current staking epoch started.
|
/// @dev Returns the time (in seconds) at which the current staking epoch started.
|
||||||
/// @return startTime The start time of the current epoch, in seconds.
|
/// @return startTime The start time of the current epoch, in seconds.
|
||||||
function currentEpochStartTimeInSeconds()
|
function currentEpochStartTimeInSeconds() external view returns (uint256 startTime);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256 startTime);
|
|
||||||
|
|
||||||
/// @dev Returns the duration of an epoch in seconds. This value can be updated.
|
/// @dev Returns the duration of an epoch in seconds. This value can be updated.
|
||||||
/// @return duration The duration of an epoch, in seconds.
|
/// @return duration The duration of an epoch, in seconds.
|
||||||
function epochDurationInSeconds()
|
function epochDurationInSeconds() external view returns (uint256 duration);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256 duration);
|
|
||||||
|
|
||||||
/// @dev Returns a staking pool
|
/// @dev Returns a staking pool
|
||||||
/// @param poolId Unique id of pool.
|
/// @param poolId Unique id of pool.
|
||||||
function getStakingPool(bytes32 poolId)
|
function getStakingPool(bytes32 poolId) external view returns (Pool memory);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (Pool memory);
|
|
||||||
|
|
||||||
/// @dev Gets global stake for a given status.
|
/// @dev Gets global stake for a given status.
|
||||||
/// @param stakeStatus UNDELEGATED or DELEGATED
|
/// @param stakeStatus UNDELEGATED or DELEGATED
|
||||||
/// @return balance Global stake for given status.
|
/// @return balance Global stake for given status.
|
||||||
function getGlobalStakeByStatus(StakeStatus stakeStatus)
|
function getGlobalStakeByStatus(StakeStatus stakeStatus) external view returns (StoredBalance memory balance);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (StoredBalance memory balance);
|
|
||||||
|
|
||||||
/// @dev Gets an owner's stake balances by status.
|
/// @dev Gets an owner's stake balances by status.
|
||||||
/// @param staker Owner of stake.
|
/// @param staker Owner of stake.
|
||||||
@@ -102,26 +84,20 @@ interface IStaking {
|
|||||||
function getOwnerStakeByStatus(
|
function getOwnerStakeByStatus(
|
||||||
address staker,
|
address staker,
|
||||||
StakeStatus stakeStatus
|
StakeStatus stakeStatus
|
||||||
)
|
) external view returns (StoredBalance memory balance);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (StoredBalance memory balance);
|
|
||||||
|
|
||||||
/// @dev Returns the total stake delegated to a specific staking pool,
|
/// @dev Returns the total stake delegated to a specific staking pool,
|
||||||
/// across all members.
|
/// across all members.
|
||||||
/// @param poolId Unique Id of pool.
|
/// @param poolId Unique Id of pool.
|
||||||
/// @return balance Total stake delegated to pool.
|
/// @return balance Total stake delegated to pool.
|
||||||
function getTotalStakeDelegatedToPool(bytes32 poolId)
|
function getTotalStakeDelegatedToPool(bytes32 poolId) external view returns (StoredBalance memory balance);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (StoredBalance memory balance);
|
|
||||||
|
|
||||||
/// @dev Returns the stake delegated to a specific staking pool, by a given staker.
|
/// @dev Returns the stake delegated to a specific staking pool, by a given staker.
|
||||||
/// @param staker of stake.
|
/// @param staker of stake.
|
||||||
/// @param poolId Unique Id of pool.
|
/// @param poolId Unique Id of pool.
|
||||||
/// @return balance Stake delegated to pool by staker.
|
/// @return balance Stake delegated to pool by staker.
|
||||||
function getStakeDelegatedToPoolByOwner(address staker, bytes32 poolId)
|
function getStakeDelegatedToPoolByOwner(
|
||||||
external
|
address staker,
|
||||||
view
|
bytes32 poolId
|
||||||
returns (StoredBalance memory balance);
|
) external view returns (StoredBalance memory balance);
|
||||||
}
|
}
|
||||||
|
@@ -23,9 +23,7 @@ pragma experimental ABIEncoderV2;
|
|||||||
import "./DefaultPoolOperator.sol";
|
import "./DefaultPoolOperator.sol";
|
||||||
import "./IStaking.sol";
|
import "./IStaking.sol";
|
||||||
|
|
||||||
|
|
||||||
interface IZrxTreasury {
|
interface IZrxTreasury {
|
||||||
|
|
||||||
struct TreasuryParameters {
|
struct TreasuryParameters {
|
||||||
uint256 votingPeriod;
|
uint256 votingPeriod;
|
||||||
uint256 proposalThreshold;
|
uint256 proposalThreshold;
|
||||||
@@ -57,45 +55,21 @@ interface IZrxTreasury {
|
|||||||
string description
|
string description
|
||||||
);
|
);
|
||||||
|
|
||||||
event VoteCast(
|
event VoteCast(address voter, bytes32[] operatedPoolIds, uint256 proposalId, bool support, uint256 votingPower);
|
||||||
address voter,
|
|
||||||
bytes32[] operatedPoolIds,
|
|
||||||
uint256 proposalId,
|
|
||||||
bool support,
|
|
||||||
uint256 votingPower
|
|
||||||
);
|
|
||||||
|
|
||||||
event ProposalExecuted(uint256 proposalId);
|
event ProposalExecuted(uint256 proposalId);
|
||||||
|
|
||||||
function stakingProxy()
|
function stakingProxy() external view returns (IStaking);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (IStaking);
|
|
||||||
|
|
||||||
function defaultPoolOperator()
|
function defaultPoolOperator() external view returns (DefaultPoolOperator);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (DefaultPoolOperator);
|
|
||||||
|
|
||||||
function defaultPoolId()
|
function defaultPoolId() external view returns (bytes32);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (bytes32);
|
|
||||||
|
|
||||||
function votingPeriod()
|
function votingPeriod() external view returns (uint256);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256);
|
|
||||||
|
|
||||||
function proposalThreshold()
|
function proposalThreshold() external view returns (uint256);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256);
|
|
||||||
|
|
||||||
function quorumThreshold()
|
function quorumThreshold() external view returns (uint256);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256);
|
|
||||||
|
|
||||||
/// @dev Updates the proposal and quorum thresholds to the given
|
/// @dev Updates the proposal and quorum thresholds to the given
|
||||||
/// values. Note that this function is only callable by the
|
/// values. Note that this function is only callable by the
|
||||||
@@ -103,11 +77,7 @@ interface IZrxTreasury {
|
|||||||
/// updated via a successful treasury proposal.
|
/// updated via a successful treasury proposal.
|
||||||
/// @param newProposalThreshold The new value for the proposal threshold.
|
/// @param newProposalThreshold The new value for the proposal threshold.
|
||||||
/// @param newQuorumThreshold The new value for the quorum threshold.
|
/// @param newQuorumThreshold The new value for the quorum threshold.
|
||||||
function updateThresholds(
|
function updateThresholds(uint256 newProposalThreshold, uint256 newQuorumThreshold) external;
|
||||||
uint256 newProposalThreshold,
|
|
||||||
uint256 newQuorumThreshold
|
|
||||||
)
|
|
||||||
external;
|
|
||||||
|
|
||||||
/// @dev Creates a proposal to send ZRX from this treasury on the
|
/// @dev Creates a proposal to send ZRX from this treasury on the
|
||||||
/// the given actions. Must have at least `proposalThreshold`
|
/// the given actions. Must have at least `proposalThreshold`
|
||||||
@@ -131,9 +101,7 @@ interface IZrxTreasury {
|
|||||||
uint256 executionEpoch,
|
uint256 executionEpoch,
|
||||||
string calldata description,
|
string calldata description,
|
||||||
bytes32[] calldata operatedPoolIds
|
bytes32[] calldata operatedPoolIds
|
||||||
)
|
) external returns (uint256 proposalId);
|
||||||
external
|
|
||||||
returns (uint256 proposalId);
|
|
||||||
|
|
||||||
/// @dev Casts a vote for the given proposal. Only callable
|
/// @dev Casts a vote for the given proposal. Only callable
|
||||||
/// during the voting period for that proposal.
|
/// during the voting period for that proposal.
|
||||||
@@ -144,12 +112,7 @@ interface IZrxTreasury {
|
|||||||
/// @param operatedPoolIds The pools operated by `msg.sender`. The
|
/// @param operatedPoolIds The pools operated by `msg.sender`. The
|
||||||
/// ZRX currently delegated to those pools will be accounted
|
/// ZRX currently delegated to those pools will be accounted
|
||||||
/// for in the voting power.
|
/// for in the voting power.
|
||||||
function castVote(
|
function castVote(uint256 proposalId, bool support, bytes32[] calldata operatedPoolIds) external;
|
||||||
uint256 proposalId,
|
|
||||||
bool support,
|
|
||||||
bytes32[] calldata operatedPoolIds
|
|
||||||
)
|
|
||||||
external;
|
|
||||||
|
|
||||||
/// @dev Casts a vote for the given proposal, by signature.
|
/// @dev Casts a vote for the given proposal, by signature.
|
||||||
/// Only callable during the voting period for that proposal.
|
/// Only callable during the voting period for that proposal.
|
||||||
@@ -170,23 +133,17 @@ interface IZrxTreasury {
|
|||||||
uint8 v,
|
uint8 v,
|
||||||
bytes32 r,
|
bytes32 r,
|
||||||
bytes32 s
|
bytes32 s
|
||||||
)
|
) external;
|
||||||
external;
|
|
||||||
|
|
||||||
/// @dev Executes a proposal that has passed and is
|
/// @dev Executes a proposal that has passed and is
|
||||||
/// currently executable.
|
/// currently executable.
|
||||||
/// @param proposalId The ID of the proposal to execute.
|
/// @param proposalId The ID of the proposal to execute.
|
||||||
/// @param actions Actions associated with the proposal to execute.
|
/// @param actions Actions associated with the proposal to execute.
|
||||||
function execute(uint256 proposalId, ProposedAction[] memory actions)
|
function execute(uint256 proposalId, ProposedAction[] memory actions) external payable;
|
||||||
external
|
|
||||||
payable;
|
|
||||||
|
|
||||||
/// @dev Returns the total number of proposals.
|
/// @dev Returns the total number of proposals.
|
||||||
/// @return count The number of proposals.
|
/// @return count The number of proposals.
|
||||||
function proposalCount()
|
function proposalCount() external view returns (uint256 count);
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (uint256 count);
|
|
||||||
|
|
||||||
/// @dev Computes the current voting power of the given account.
|
/// @dev Computes the current voting power of the given account.
|
||||||
/// Voting power is equal to:
|
/// Voting power is equal to:
|
||||||
@@ -198,8 +155,8 @@ interface IZrxTreasury {
|
|||||||
/// ZRX currently delegated to those pools will be accounted
|
/// ZRX currently delegated to those pools will be accounted
|
||||||
/// for in the voting power.
|
/// for in the voting power.
|
||||||
/// @return votingPower The current voting power of the given account.
|
/// @return votingPower The current voting power of the given account.
|
||||||
function getVotingPower(address account, bytes32[] calldata operatedPoolIds)
|
function getVotingPower(
|
||||||
external
|
address account,
|
||||||
view
|
bytes32[] calldata operatedPoolIds
|
||||||
returns (uint256 votingPower);
|
) external view returns (uint256 votingPower);
|
||||||
}
|
}
|
||||||
|
@@ -26,10 +26,7 @@ import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
|
|||||||
import "@0x/contracts-zero-ex/contracts/src/features/libs/LibSignature.sol";
|
import "@0x/contracts-zero-ex/contracts/src/features/libs/LibSignature.sol";
|
||||||
import "./IZrxTreasury.sol";
|
import "./IZrxTreasury.sol";
|
||||||
|
|
||||||
|
contract ZrxTreasury is IZrxTreasury {
|
||||||
contract ZrxTreasury is
|
|
||||||
IZrxTreasury
|
|
||||||
{
|
|
||||||
using LibSafeMathV06 for uint256;
|
using LibSafeMathV06 for uint256;
|
||||||
using LibRichErrorsV06 for bytes;
|
using LibRichErrorsV06 for bytes;
|
||||||
using LibBytesV06 for bytes;
|
using LibBytesV06 for bytes;
|
||||||
@@ -41,10 +38,12 @@ contract ZrxTreasury is
|
|||||||
string private constant CONTRACT_VERSION = "1.0.0";
|
string private constant CONTRACT_VERSION = "1.0.0";
|
||||||
|
|
||||||
/// The EIP-712 typehash for the contract's domain
|
/// The EIP-712 typehash for the contract's domain
|
||||||
bytes32 private constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
|
bytes32 private constant DOMAIN_TYPEHASH =
|
||||||
|
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
|
||||||
|
|
||||||
/// The EIP-712 typehash for the vote struct
|
/// The EIP-712 typehash for the vote struct
|
||||||
bytes32 private constant VOTE_TYPEHASH = keccak256("TreasuryVote(uint256 proposalId,bool support,bytes32[] operatedPoolIds)");
|
bytes32 private constant VOTE_TYPEHASH =
|
||||||
|
keccak256("TreasuryVote(uint256 proposalId,bool support,bytes32[] operatedPoolIds)");
|
||||||
|
|
||||||
// Immutables
|
// Immutables
|
||||||
IStaking public immutable override stakingProxy;
|
IStaking public immutable override stakingProxy;
|
||||||
@@ -58,22 +57,14 @@ contract ZrxTreasury is
|
|||||||
|
|
||||||
// Storage
|
// Storage
|
||||||
Proposal[] public proposals;
|
Proposal[] public proposals;
|
||||||
mapping (uint256 => mapping (address => bool)) public hasVoted;
|
mapping(uint256 => mapping(address => bool)) public hasVoted;
|
||||||
|
|
||||||
/// @dev Initializes the ZRX treasury and creates the default
|
/// @dev Initializes the ZRX treasury and creates the default
|
||||||
/// staking pool.
|
/// staking pool.
|
||||||
/// @param stakingProxy_ The 0x staking proxy contract.
|
/// @param stakingProxy_ The 0x staking proxy contract.
|
||||||
/// @param params Immutable treasury parameters.
|
/// @param params Immutable treasury parameters.
|
||||||
constructor(
|
constructor(IStaking stakingProxy_, TreasuryParameters memory params) public {
|
||||||
IStaking stakingProxy_,
|
require(params.votingPeriod < stakingProxy_.epochDurationInSeconds(), "VOTING_PERIOD_TOO_LONG");
|
||||||
TreasuryParameters memory params
|
|
||||||
)
|
|
||||||
public
|
|
||||||
{
|
|
||||||
require(
|
|
||||||
params.votingPeriod < stakingProxy_.epochDurationInSeconds(),
|
|
||||||
"VOTING_PERIOD_TOO_LONG"
|
|
||||||
);
|
|
||||||
stakingProxy = stakingProxy_;
|
stakingProxy = stakingProxy_;
|
||||||
votingPeriod = params.votingPeriod;
|
votingPeriod = params.votingPeriod;
|
||||||
proposalThreshold = params.proposalThreshold;
|
proposalThreshold = params.proposalThreshold;
|
||||||
@@ -92,10 +83,8 @@ contract ZrxTreasury is
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// solhint-disable
|
|
||||||
/// @dev Allows this contract to receive ether.
|
/// @dev Allows this contract to receive ether.
|
||||||
receive() external payable {}
|
receive() external payable {}
|
||||||
// solhint-enable
|
|
||||||
|
|
||||||
/// @dev Updates the proposal and quorum thresholds to the given
|
/// @dev Updates the proposal and quorum thresholds to the given
|
||||||
/// values. Note that this function is only callable by the
|
/// values. Note that this function is only callable by the
|
||||||
@@ -103,13 +92,7 @@ contract ZrxTreasury is
|
|||||||
/// updated via a successful treasury proposal.
|
/// updated via a successful treasury proposal.
|
||||||
/// @param newProposalThreshold The new value for the proposal threshold.
|
/// @param newProposalThreshold The new value for the proposal threshold.
|
||||||
/// @param newQuorumThreshold The new value for the quorum threshold.
|
/// @param newQuorumThreshold The new value for the quorum threshold.
|
||||||
function updateThresholds(
|
function updateThresholds(uint256 newProposalThreshold, uint256 newQuorumThreshold) external override {
|
||||||
uint256 newProposalThreshold,
|
|
||||||
uint256 newQuorumThreshold
|
|
||||||
)
|
|
||||||
external
|
|
||||||
override
|
|
||||||
{
|
|
||||||
require(msg.sender == address(this), "updateThresholds/ONLY_SELF");
|
require(msg.sender == address(this), "updateThresholds/ONLY_SELF");
|
||||||
proposalThreshold = newProposalThreshold;
|
proposalThreshold = newProposalThreshold;
|
||||||
quorumThreshold = newQuorumThreshold;
|
quorumThreshold = newQuorumThreshold;
|
||||||
@@ -137,24 +120,11 @@ contract ZrxTreasury is
|
|||||||
uint256 executionEpoch,
|
uint256 executionEpoch,
|
||||||
string memory description,
|
string memory description,
|
||||||
bytes32[] memory operatedPoolIds
|
bytes32[] memory operatedPoolIds
|
||||||
)
|
) public override returns (uint256 proposalId) {
|
||||||
public
|
require(getVotingPower(msg.sender, operatedPoolIds) >= proposalThreshold, "propose/INSUFFICIENT_VOTING_POWER");
|
||||||
override
|
require(actions.length > 0, "propose/NO_ACTIONS_PROPOSED");
|
||||||
returns (uint256 proposalId)
|
|
||||||
{
|
|
||||||
require(
|
|
||||||
getVotingPower(msg.sender, operatedPoolIds) >= proposalThreshold,
|
|
||||||
"propose/INSUFFICIENT_VOTING_POWER"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
actions.length > 0,
|
|
||||||
"propose/NO_ACTIONS_PROPOSED"
|
|
||||||
);
|
|
||||||
uint256 currentEpoch = stakingProxy.currentEpoch();
|
uint256 currentEpoch = stakingProxy.currentEpoch();
|
||||||
require(
|
require(executionEpoch >= currentEpoch + 2, "propose/INVALID_EXECUTION_EPOCH");
|
||||||
executionEpoch >= currentEpoch + 2,
|
|
||||||
"propose/INVALID_EXECUTION_EPOCH"
|
|
||||||
);
|
|
||||||
|
|
||||||
proposalId = proposalCount();
|
proposalId = proposalCount();
|
||||||
Proposal storage newProposal = proposals.push();
|
Proposal storage newProposal = proposals.push();
|
||||||
@@ -162,14 +132,7 @@ contract ZrxTreasury is
|
|||||||
newProposal.executionEpoch = executionEpoch;
|
newProposal.executionEpoch = executionEpoch;
|
||||||
newProposal.voteEpoch = currentEpoch + 2;
|
newProposal.voteEpoch = currentEpoch + 2;
|
||||||
|
|
||||||
emit ProposalCreated(
|
emit ProposalCreated(msg.sender, operatedPoolIds, proposalId, actions, executionEpoch, description);
|
||||||
msg.sender,
|
|
||||||
operatedPoolIds,
|
|
||||||
proposalId,
|
|
||||||
actions,
|
|
||||||
executionEpoch,
|
|
||||||
description
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Casts a vote for the given proposal. Only callable
|
/// @dev Casts a vote for the given proposal. Only callable
|
||||||
@@ -181,14 +144,7 @@ contract ZrxTreasury is
|
|||||||
/// @param operatedPoolIds The pools operated by `msg.sender`. The
|
/// @param operatedPoolIds The pools operated by `msg.sender`. The
|
||||||
/// ZRX currently delegated to those pools will be accounted
|
/// ZRX currently delegated to those pools will be accounted
|
||||||
/// for in the voting power.
|
/// for in the voting power.
|
||||||
function castVote(
|
function castVote(uint256 proposalId, bool support, bytes32[] memory operatedPoolIds) public override {
|
||||||
uint256 proposalId,
|
|
||||||
bool support,
|
|
||||||
bytes32[] memory operatedPoolIds
|
|
||||||
)
|
|
||||||
public
|
|
||||||
override
|
|
||||||
{
|
|
||||||
return _castVote(msg.sender, proposalId, support, operatedPoolIds);
|
return _castVote(msg.sender, proposalId, support, operatedPoolIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,10 +167,7 @@ contract ZrxTreasury is
|
|||||||
uint8 v,
|
uint8 v,
|
||||||
bytes32 r,
|
bytes32 r,
|
||||||
bytes32 s
|
bytes32 s
|
||||||
)
|
) public override {
|
||||||
public
|
|
||||||
override
|
|
||||||
{
|
|
||||||
bytes32 structHash = keccak256(
|
bytes32 structHash = keccak256(
|
||||||
abi.encode(VOTE_TYPEHASH, proposalId, support, keccak256(abi.encodePacked(operatedPoolIds)))
|
abi.encode(VOTE_TYPEHASH, proposalId, support, keccak256(abi.encodePacked(operatedPoolIds)))
|
||||||
);
|
);
|
||||||
@@ -228,11 +181,7 @@ contract ZrxTreasury is
|
|||||||
/// currently executable.
|
/// currently executable.
|
||||||
/// @param proposalId The ID of the proposal to execute.
|
/// @param proposalId The ID of the proposal to execute.
|
||||||
/// @param actions Actions associated with the proposal to execute.
|
/// @param actions Actions associated with the proposal to execute.
|
||||||
function execute(uint256 proposalId, ProposedAction[] memory actions)
|
function execute(uint256 proposalId, ProposedAction[] memory actions) public payable override {
|
||||||
public
|
|
||||||
payable
|
|
||||||
override
|
|
||||||
{
|
|
||||||
if (proposalId >= proposalCount()) {
|
if (proposalId >= proposalCount()) {
|
||||||
revert("execute/INVALID_PROPOSAL_ID");
|
revert("execute/INVALID_PROPOSAL_ID");
|
||||||
}
|
}
|
||||||
@@ -244,10 +193,7 @@ contract ZrxTreasury is
|
|||||||
for (uint256 i = 0; i != actions.length; i++) {
|
for (uint256 i = 0; i != actions.length; i++) {
|
||||||
ProposedAction memory action = actions[i];
|
ProposedAction memory action = actions[i];
|
||||||
(bool didSucceed, ) = action.target.call{value: action.value}(action.data);
|
(bool didSucceed, ) = action.target.call{value: action.value}(action.data);
|
||||||
require(
|
require(didSucceed, "execute/ACTION_EXECUTION_FAILED");
|
||||||
didSucceed,
|
|
||||||
"execute/ACTION_EXECUTION_FAILED"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
emit ProposalExecuted(proposalId);
|
emit ProposalExecuted(proposalId);
|
||||||
@@ -255,12 +201,7 @@ contract ZrxTreasury is
|
|||||||
|
|
||||||
/// @dev Returns the total number of proposals.
|
/// @dev Returns the total number of proposals.
|
||||||
/// @return count The number of proposals.
|
/// @return count The number of proposals.
|
||||||
function proposalCount()
|
function proposalCount() public view override returns (uint256 count) {
|
||||||
public
|
|
||||||
override
|
|
||||||
view
|
|
||||||
returns (uint256 count)
|
|
||||||
{
|
|
||||||
return proposals.length;
|
return proposals.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,41 +215,29 @@ contract ZrxTreasury is
|
|||||||
/// ZRX currently delegated to those pools will be accounted
|
/// ZRX currently delegated to those pools will be accounted
|
||||||
/// for in the voting power.
|
/// for in the voting power.
|
||||||
/// @return votingPower The current voting power of the given account.
|
/// @return votingPower The current voting power of the given account.
|
||||||
function getVotingPower(address account, bytes32[] memory operatedPoolIds)
|
function getVotingPower(
|
||||||
public
|
address account,
|
||||||
override
|
bytes32[] memory operatedPoolIds
|
||||||
view
|
) public view override returns (uint256 votingPower) {
|
||||||
returns (uint256 votingPower)
|
uint256 delegatedBalance = stakingProxy
|
||||||
{
|
.getOwnerStakeByStatus(account, IStaking.StakeStatus.DELEGATED)
|
||||||
uint256 delegatedBalance = stakingProxy.getOwnerStakeByStatus(
|
.currentEpochBalance;
|
||||||
account,
|
uint256 balanceDelegatedToDefaultPool = stakingProxy
|
||||||
IStaking.StakeStatus.DELEGATED
|
.getStakeDelegatedToPoolByOwner(account, defaultPoolId)
|
||||||
).currentEpochBalance;
|
.currentEpochBalance;
|
||||||
uint256 balanceDelegatedToDefaultPool = stakingProxy.getStakeDelegatedToPoolByOwner(
|
|
||||||
account,
|
|
||||||
defaultPoolId
|
|
||||||
).currentEpochBalance;
|
|
||||||
|
|
||||||
// Voting power for ZRX delegated to the default pool is not diluted,
|
// Voting power for ZRX delegated to the default pool is not diluted,
|
||||||
// so we double-count the balance delegated to the default pool before
|
// so we double-count the balance delegated to the default pool before
|
||||||
// dividing by 2.
|
// dividing by 2.
|
||||||
votingPower = delegatedBalance
|
votingPower = delegatedBalance.safeAdd(balanceDelegatedToDefaultPool).safeDiv(2);
|
||||||
.safeAdd(balanceDelegatedToDefaultPool)
|
|
||||||
.safeDiv(2);
|
|
||||||
|
|
||||||
// Add voting power for operated staking pools.
|
// Add voting power for operated staking pools.
|
||||||
for (uint256 i = 0; i != operatedPoolIds.length; i++) {
|
for (uint256 i = 0; i != operatedPoolIds.length; i++) {
|
||||||
for (uint256 j = 0; j != i; j++) {
|
for (uint256 j = 0; j != i; j++) {
|
||||||
require(
|
require(operatedPoolIds[i] != operatedPoolIds[j], "getVotingPower/DUPLICATE_POOL_ID");
|
||||||
operatedPoolIds[i] != operatedPoolIds[j],
|
|
||||||
"getVotingPower/DUPLICATE_POOL_ID"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
IStaking.Pool memory pool = stakingProxy.getStakingPool(operatedPoolIds[i]);
|
IStaking.Pool memory pool = stakingProxy.getStakingPool(operatedPoolIds[i]);
|
||||||
require(
|
require(pool.operator == account, "getVotingPower/POOL_NOT_OPERATED_BY_ACCOUNT");
|
||||||
pool.operator == account,
|
|
||||||
"getVotingPower/POOL_NOT_OPERATED_BY_ACCOUNT"
|
|
||||||
);
|
|
||||||
uint96 stakeDelegatedToPool = stakingProxy
|
uint96 stakeDelegatedToPool = stakingProxy
|
||||||
.getTotalStakeDelegatedToPool(operatedPoolIds[i])
|
.getTotalStakeDelegatedToPool(operatedPoolIds[i])
|
||||||
.currentEpochBalance;
|
.currentEpochBalance;
|
||||||
@@ -322,25 +251,10 @@ contract ZrxTreasury is
|
|||||||
/// @dev Checks whether the given proposal is executable.
|
/// @dev Checks whether the given proposal is executable.
|
||||||
/// Reverts if not.
|
/// Reverts if not.
|
||||||
/// @param proposal The proposal to check.
|
/// @param proposal The proposal to check.
|
||||||
function _assertProposalExecutable(
|
function _assertProposalExecutable(Proposal memory proposal, ProposedAction[] memory actions) private view {
|
||||||
Proposal memory proposal,
|
require(keccak256(abi.encode(actions)) == proposal.actionsHash, "_assertProposalExecutable/INVALID_ACTIONS");
|
||||||
ProposedAction[] memory actions
|
require(_hasProposalPassed(proposal), "_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED");
|
||||||
)
|
require(!proposal.executed, "_assertProposalExecutable/PROPOSAL_ALREADY_EXECUTED");
|
||||||
private
|
|
||||||
view
|
|
||||||
{
|
|
||||||
require(
|
|
||||||
keccak256(abi.encode(actions)) == proposal.actionsHash,
|
|
||||||
"_assertProposalExecutable/INVALID_ACTIONS"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
_hasProposalPassed(proposal),
|
|
||||||
"_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED"
|
|
||||||
);
|
|
||||||
require(
|
|
||||||
!proposal.executed,
|
|
||||||
"_assertProposalExecutable/PROPOSAL_ALREADY_EXECUTED"
|
|
||||||
);
|
|
||||||
require(
|
require(
|
||||||
stakingProxy.currentEpoch() == proposal.executionEpoch,
|
stakingProxy.currentEpoch() == proposal.executionEpoch,
|
||||||
"_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH"
|
"_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH"
|
||||||
@@ -350,11 +264,7 @@ contract ZrxTreasury is
|
|||||||
/// @dev Checks whether the given proposal has passed or not.
|
/// @dev Checks whether the given proposal has passed or not.
|
||||||
/// @param proposal The proposal to check.
|
/// @param proposal The proposal to check.
|
||||||
/// @return hasPassed Whether the proposal has passed.
|
/// @return hasPassed Whether the proposal has passed.
|
||||||
function _hasProposalPassed(Proposal memory proposal)
|
function _hasProposalPassed(Proposal memory proposal) private view returns (bool hasPassed) {
|
||||||
private
|
|
||||||
view
|
|
||||||
returns (bool hasPassed)
|
|
||||||
{
|
|
||||||
// Proposal is not passed until the vote is over.
|
// Proposal is not passed until the vote is over.
|
||||||
if (!_hasVoteEnded(proposal.voteEpoch)) {
|
if (!_hasVoteEnded(proposal.voteEpoch)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -374,11 +284,7 @@ contract ZrxTreasury is
|
|||||||
/// epoch has ended or not.
|
/// epoch has ended or not.
|
||||||
/// @param voteEpoch The epoch at which the vote started.
|
/// @param voteEpoch The epoch at which the vote started.
|
||||||
/// @return hasEnded Whether the vote has ended.
|
/// @return hasEnded Whether the vote has ended.
|
||||||
function _hasVoteEnded(uint256 voteEpoch)
|
function _hasVoteEnded(uint256 voteEpoch) private view returns (bool hasEnded) {
|
||||||
private
|
|
||||||
view
|
|
||||||
returns (bool hasEnded)
|
|
||||||
{
|
|
||||||
uint256 currentEpoch = stakingProxy.currentEpoch();
|
uint256 currentEpoch = stakingProxy.currentEpoch();
|
||||||
if (currentEpoch < voteEpoch) {
|
if (currentEpoch < voteEpoch) {
|
||||||
return false;
|
return false;
|
||||||
@@ -388,23 +294,14 @@ contract ZrxTreasury is
|
|||||||
}
|
}
|
||||||
// voteEpoch == currentEpoch
|
// voteEpoch == currentEpoch
|
||||||
// Vote ends at currentEpochStartTime + votingPeriod
|
// Vote ends at currentEpochStartTime + votingPeriod
|
||||||
uint256 voteEndTime = stakingProxy
|
uint256 voteEndTime = stakingProxy.currentEpochStartTimeInSeconds().safeAdd(votingPeriod);
|
||||||
.currentEpochStartTimeInSeconds()
|
|
||||||
.safeAdd(votingPeriod);
|
|
||||||
return block.timestamp > voteEndTime;
|
return block.timestamp > voteEndTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Casts a vote for the given proposal. Only callable
|
/// @dev Casts a vote for the given proposal. Only callable
|
||||||
/// during the voting period for that proposal. See
|
/// during the voting period for that proposal. See
|
||||||
/// `getVotingPower` for how voting power is computed.
|
/// `getVotingPower` for how voting power is computed.
|
||||||
function _castVote(
|
function _castVote(address voter, uint256 proposalId, bool support, bytes32[] memory operatedPoolIds) private {
|
||||||
address voter,
|
|
||||||
uint256 proposalId,
|
|
||||||
bool support,
|
|
||||||
bytes32[] memory operatedPoolIds
|
|
||||||
)
|
|
||||||
private
|
|
||||||
{
|
|
||||||
if (proposalId >= proposalCount()) {
|
if (proposalId >= proposalCount()) {
|
||||||
revert("_castVote/INVALID_PROPOSAL_ID");
|
revert("_castVote/INVALID_PROPOSAL_ID");
|
||||||
}
|
}
|
||||||
@@ -413,10 +310,7 @@ contract ZrxTreasury is
|
|||||||
}
|
}
|
||||||
|
|
||||||
Proposal memory proposal = proposals[proposalId];
|
Proposal memory proposal = proposals[proposalId];
|
||||||
if (
|
if (proposal.voteEpoch != stakingProxy.currentEpoch() || _hasVoteEnded(proposal.voteEpoch)) {
|
||||||
proposal.voteEpoch != stakingProxy.currentEpoch() ||
|
|
||||||
_hasVoteEnded(proposal.voteEpoch)
|
|
||||||
) {
|
|
||||||
revert("_castVote/VOTING_IS_CLOSED");
|
revert("_castVote/VOTING_IS_CLOSED");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,27 +320,21 @@ contract ZrxTreasury is
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (support) {
|
if (support) {
|
||||||
proposals[proposalId].votesFor = proposals[proposalId].votesFor
|
proposals[proposalId].votesFor = proposals[proposalId].votesFor.safeAdd(votingPower);
|
||||||
.safeAdd(votingPower);
|
|
||||||
} else {
|
} else {
|
||||||
proposals[proposalId].votesAgainst = proposals[proposalId].votesAgainst
|
proposals[proposalId].votesAgainst = proposals[proposalId].votesAgainst.safeAdd(votingPower);
|
||||||
.safeAdd(votingPower);
|
|
||||||
}
|
}
|
||||||
hasVoted[proposalId][voter] = true;
|
hasVoted[proposalId][voter] = true;
|
||||||
|
|
||||||
emit VoteCast(
|
emit VoteCast(voter, operatedPoolIds, proposalId, support, votingPower);
|
||||||
voter,
|
|
||||||
operatedPoolIds,
|
|
||||||
proposalId,
|
|
||||||
support,
|
|
||||||
votingPower
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Gets the Ethereum chain id
|
/// @dev Gets the Ethereum chain id
|
||||||
function _getChainId() private pure returns (uint256) {
|
function _getChainId() private pure returns (uint256) {
|
||||||
uint256 chainId;
|
uint256 chainId;
|
||||||
assembly { chainId := chainid() }
|
assembly {
|
||||||
|
chainId := chainid()
|
||||||
|
}
|
||||||
return chainId;
|
return chainId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-treasury",
|
"name": "@0x/contracts-treasury",
|
||||||
"version": "1.4.5",
|
"version": "1.4.38",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
@@ -21,12 +21,11 @@
|
|||||||
"watch": "sol-compiler -w",
|
"watch": "sol-compiler -w",
|
||||||
"clean": "shx rm -rf lib test/generated-artifacts test/generated-wrappers generated-artifacts generated-wrappers",
|
"clean": "shx rm -rf lib test/generated-artifacts test/generated-wrappers generated-artifacts generated-wrappers",
|
||||||
"generate_contract_wrappers": "abi-gen --debug --abis ${npm_package_config_abis} --output test/generated-wrappers --backend ethers",
|
"generate_contract_wrappers": "abi-gen --debug --abis ${npm_package_config_abis} --output test/generated-wrappers --backend ethers",
|
||||||
"lint": "tslint --format stylish --project . --exclude ./generated-wrappers/**/* --exclude ./test/generated-wrappers/**/* --exclude ./generated-artifacts/**/* --exclude ./test/generated-artifacts/**/* --exclude **/lib/**/* && yarn lint-contracts",
|
"lint": "eslint src test",
|
||||||
"fix": "tslint --fix --format stylish --project . --exclude ./generated-wrappers/**/* --exclude ./generated-artifacts/**/* --exclude ./test/generated-wrappers/**/* --exclude ./test/generated-artifacts/**/* --exclude **/lib/**/* && yarn lint-contracts",
|
"fix": "eslint --fix src test",
|
||||||
"test:circleci": "yarn test",
|
"test:ci": "yarn test",
|
||||||
"contracts:gen": "contracts-gen generate",
|
"contracts:gen": "contracts-gen generate",
|
||||||
"contracts:copy": "contracts-gen copy",
|
"contracts:copy": "contracts-gen copy",
|
||||||
"lint-contracts": "#solhint -c ../.solhint.json contracts/**/**/**/**/*.sol",
|
|
||||||
"docs:md": "ts-doc-gen --sourceDir='$PROJECT_FILES' --output=$MD_FILE_DIR --fileExtension=mdx --tsconfig=./typedoc-tsconfig.json",
|
"docs:md": "ts-doc-gen --sourceDir='$PROJECT_FILES' --output=$MD_FILE_DIR --fileExtension=mdx --tsconfig=./typedoc-tsconfig.json",
|
||||||
"docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES",
|
"docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES",
|
||||||
"publish:private": "yarn build && gitpkg publish"
|
"publish:private": "yarn build && gitpkg publish"
|
||||||
@@ -46,40 +45,41 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury",
|
"homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@0x/abi-gen": "^5.6.2",
|
"@0x/abi-gen": "^5.8.1",
|
||||||
"@0x/contract-addresses": "^6.8.1",
|
"@0x/contract-addresses": "^8.0.1",
|
||||||
"@0x/contracts-asset-proxy": "^3.7.19",
|
"@0x/contracts-asset-proxy": "^3.7.19",
|
||||||
"@0x/contracts-erc20": "^3.3.22",
|
"@0x/contracts-erc20": "^3.3.55",
|
||||||
"@0x/contracts-gen": "^2.0.40",
|
"@0x/contracts-gen": "^2.0.48",
|
||||||
"@0x/contracts-staking": "^2.0.45",
|
"@0x/contracts-staking": "^2.0.45",
|
||||||
"@0x/contracts-test-utils": "^5.4.13",
|
"@0x/contracts-test-utils": "^5.4.45",
|
||||||
"@0x/sol-compiler": "^4.7.5",
|
"@0x/sol-compiler": "^4.8.2",
|
||||||
"@0x/ts-doc-gen": "^0.0.28",
|
"@0x/ts-doc-gen": "^0.0.28",
|
||||||
"@0x/tslint-config": "^4.1.4",
|
|
||||||
"@types/isomorphic-fetch": "^0.0.35",
|
"@types/isomorphic-fetch": "^0.0.35",
|
||||||
"@types/lodash": "4.14.104",
|
"@types/lodash": "4.14.104",
|
||||||
"@types/mocha": "^5.2.7",
|
"@types/mocha": "^5.2.7",
|
||||||
"@types/prompts": "^2.0.9",
|
"@types/prompts": "^2.0.9",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.38.0",
|
||||||
|
"@typescript-eslint/parser": "^5.38.0",
|
||||||
|
"eslint": "^8.23.1",
|
||||||
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"isomorphic-fetch": "^3.0.0",
|
"isomorphic-fetch": "^3.0.0",
|
||||||
"lodash": "^4.17.11",
|
"lodash": "^4.17.11",
|
||||||
"mocha": "^6.2.0",
|
"mocha": "^6.2.0",
|
||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
"prompts": "^2.4.0",
|
"prompts": "^2.4.0",
|
||||||
"shx": "^0.2.2",
|
"shx": "^0.2.2",
|
||||||
"solhint": "^1.4.1",
|
|
||||||
"tslint": "5.11.0",
|
|
||||||
"typedoc": "~0.16.11",
|
"typedoc": "~0.16.11",
|
||||||
"typescript": "4.2.2"
|
"typescript": "4.6.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/base-contract": "^6.4.2",
|
"@0x/base-contract": "^7.0.0",
|
||||||
"@0x/protocol-utils": "^1.9.4",
|
"@0x/protocol-utils": "^11.17.4",
|
||||||
"@0x/subproviders": "^6.6.0",
|
"@0x/subproviders": "^7.0.0",
|
||||||
"@0x/types": "^3.3.4",
|
"@0x/types": "^3.3.6",
|
||||||
"@0x/typescript-typings": "^5.2.1",
|
"@0x/typescript-typings": "^5.3.1",
|
||||||
"@0x/utils": "^6.4.4",
|
"@0x/utils": "^7.0.0",
|
||||||
"@0x/web3-wrapper": "^7.6.0",
|
"@0x/web3-wrapper": "^8.0.0",
|
||||||
"ethereum-types": "^3.6.0",
|
"ethereum-types": "^3.7.1",
|
||||||
"ethereumjs-util": "^7.0.10"
|
"ethereumjs-util": "^7.0.10"
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
|
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": ["@0x/tslint-config"],
|
|
||||||
"rules": {
|
|
||||||
"custom-no-magic-numbers": false,
|
|
||||||
"max-file-line-count": false,
|
|
||||||
"no-non-null-assertion": false,
|
|
||||||
"no-unnecessary-type-assertion": false,
|
|
||||||
"number-literal-format": false
|
|
||||||
},
|
|
||||||
"linterOptions": {
|
|
||||||
"exclude": ["src/artifacts.ts", "test/artifacts.ts"]
|
|
||||||
}
|
|
||||||
}
|
|
25
contracts/utils/.eslintrc
Normal file
25
contracts/utils/.eslintrc
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"es2021": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"],
|
||||||
|
"overrides": [],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"parserOptions": {
|
||||||
|
"project": "./tsconfig.json",
|
||||||
|
"ecmaVersion": "latest",
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"plugins": ["@typescript-eslint"],
|
||||||
|
"ignorePatterns": [
|
||||||
|
"lib/**/*",
|
||||||
|
"contracts/**/*",
|
||||||
|
"generated-wrappers/**/*",
|
||||||
|
"generated-artifacts/**/*",
|
||||||
|
"test/generated-wrappers/**/*",
|
||||||
|
"test/generated-artifacts/**/*"
|
||||||
|
|
||||||
|
],
|
||||||
|
"rules": {}
|
||||||
|
}
|
@@ -1,4 +1,302 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"timestamp": 1674517560,
|
||||||
|
"version": "4.8.36",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1670879498,
|
||||||
|
"version": "4.8.35",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1669235113,
|
||||||
|
"version": "4.8.34",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1668477029,
|
||||||
|
"version": "4.8.33",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1667607537,
|
||||||
|
"version": "4.8.32",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1667427402,
|
||||||
|
"version": "4.8.31",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1666645023,
|
||||||
|
"version": "4.8.30",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1666381417,
|
||||||
|
"version": "4.8.29",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665670315,
|
||||||
|
"version": "4.8.28",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1665531940,
|
||||||
|
"version": "4.8.27",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "4.8.26",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Migrate from TSLint to ESLint and fix linting errors",
|
||||||
|
"pr": 589
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1665013355
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1663786955,
|
||||||
|
"version": "4.8.25",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662998180,
|
||||||
|
"version": "4.8.24",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662559804,
|
||||||
|
"version": "4.8.23",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662147076,
|
||||||
|
"version": "4.8.22",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1662046042,
|
||||||
|
"version": "4.8.21",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661462289,
|
||||||
|
"version": "4.8.20",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661459661,
|
||||||
|
"version": "4.8.19",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1661145612,
|
||||||
|
"version": "4.8.18",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1660093941,
|
||||||
|
"version": "4.8.17",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1660073235,
|
||||||
|
"version": "4.8.16",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1659750766,
|
||||||
|
"version": "4.8.15",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1658950329,
|
||||||
|
"version": "4.8.14",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1655244958,
|
||||||
|
"version": "4.8.13",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1654284040,
|
||||||
|
"version": "4.8.12",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1652919697,
|
||||||
|
"version": "4.8.11",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1650611093,
|
||||||
|
"version": "4.8.10",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1648739346,
|
||||||
|
"version": "4.8.9",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1646225739,
|
||||||
|
"version": "4.8.8",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1645569128,
|
||||||
|
"version": "4.8.7",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1640364306,
|
||||||
|
"version": "4.8.6",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1638390144,
|
||||||
|
"version": "4.8.5",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1637102971,
|
||||||
|
"version": "4.8.4",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"timestamp": 1635903615,
|
"timestamp": 1635903615,
|
||||||
"version": "4.8.3",
|
"version": "4.8.3",
|
||||||
|
@@ -5,6 +5,138 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v4.8.36 - _January 23, 2023_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.35 - _December 12, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.34 - _November 23, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.33 - _November 15, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.32 - _November 5, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.31 - _November 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.30 - _October 24, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.29 - _October 21, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.28 - _October 13, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.27 - _October 11, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.26 - _October 5, 2022_
|
||||||
|
|
||||||
|
* Migrate from TSLint to ESLint and fix linting errors (#589)
|
||||||
|
|
||||||
|
## v4.8.25 - _September 21, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.24 - _September 12, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.23 - _September 7, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.22 - _September 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.21 - _September 1, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.20 - _August 25, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.19 - _August 25, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.18 - _August 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.17 - _August 10, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.16 - _August 9, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.15 - _August 6, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.14 - _July 27, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.13 - _June 14, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.12 - _June 3, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.11 - _May 19, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.10 - _April 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.9 - _March 31, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.8 - _March 2, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.7 - _February 22, 2022_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.6 - _December 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.5 - _December 1, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v4.8.4 - _November 16, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
## v4.8.3 - _November 3, 2021_
|
## v4.8.3 - _November 3, 2021_
|
||||||
|
|
||||||
* Dependencies updated
|
* Dependencies updated
|
||||||
|
@@ -16,7 +16,7 @@ We strongly recommend that the community help us make improvements and determine
|
|||||||
|
|
||||||
For proposals regarding the 0x protocol's smart contract architecture, message format, or additional functionality, go to the [0x Improvement Proposals (ZEIPs)](https://github.com/0xProject/ZEIPs) repository and follow the contribution guidelines provided therein.
|
For proposals regarding the 0x protocol's smart contract architecture, message format, or additional functionality, go to the [0x Improvement Proposals (ZEIPs)](https://github.com/0xProject/ZEIPs) repository and follow the contribution guidelines provided therein.
|
||||||
|
|
||||||
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
Please read our [contribution guidelines](../../.github/CONTRIBUTING.md) before getting started.
|
||||||
|
|
||||||
### Install Dependencies
|
### Install Dependencies
|
||||||
|
|
||||||
@@ -63,7 +63,3 @@ yarn lint
|
|||||||
```bash
|
```bash
|
||||||
yarn test
|
yarn test
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Testing options
|
|
||||||
|
|
||||||
Contracts testing options like coverage, profiling, revert traces or backing node choosing - are described [here](../TESTING.md).
|
|
||||||
|
@@ -23,14 +23,9 @@ import "./LibAuthorizableRichErrors.sol";
|
|||||||
import "./LibRichErrors.sol";
|
import "./LibRichErrors.sol";
|
||||||
import "./Ownable.sol";
|
import "./Ownable.sol";
|
||||||
|
|
||||||
|
contract Authorizable is Ownable, IAuthorizable {
|
||||||
// solhint-disable no-empty-blocks
|
|
||||||
contract Authorizable is
|
|
||||||
Ownable,
|
|
||||||
IAuthorizable
|
|
||||||
{
|
|
||||||
/// @dev Only authorized addresses can invoke functions with this modifier.
|
/// @dev Only authorized addresses can invoke functions with this modifier.
|
||||||
modifier onlyAuthorized {
|
modifier onlyAuthorized() {
|
||||||
_assertSenderIsAuthorized();
|
_assertSenderIsAuthorized();
|
||||||
_;
|
_;
|
||||||
}
|
}
|
||||||
@@ -38,33 +33,24 @@ contract Authorizable is
|
|||||||
/// @dev Whether an adderss is authorized to call privileged functions.
|
/// @dev Whether an adderss is authorized to call privileged functions.
|
||||||
/// @param 0 Address to query.
|
/// @param 0 Address to query.
|
||||||
/// @return 0 Whether the address is authorized.
|
/// @return 0 Whether the address is authorized.
|
||||||
mapping (address => bool) public authorized;
|
mapping(address => bool) public authorized;
|
||||||
/// @dev Whether an adderss is authorized to call privileged functions.
|
/// @dev Whether an adderss is authorized to call privileged functions.
|
||||||
/// @param 0 Index of authorized address.
|
/// @param 0 Index of authorized address.
|
||||||
/// @return 0 Authorized address.
|
/// @return 0 Authorized address.
|
||||||
address[] public authorities;
|
address[] public authorities;
|
||||||
|
|
||||||
/// @dev Initializes the `owner` address.
|
/// @dev Initializes the `owner` address.
|
||||||
constructor()
|
constructor() public Ownable() {}
|
||||||
public
|
|
||||||
Ownable()
|
|
||||||
{}
|
|
||||||
|
|
||||||
/// @dev Authorizes an address.
|
/// @dev Authorizes an address.
|
||||||
/// @param target Address to authorize.
|
/// @param target Address to authorize.
|
||||||
function addAuthorizedAddress(address target)
|
function addAuthorizedAddress(address target) external onlyOwner {
|
||||||
external
|
|
||||||
onlyOwner
|
|
||||||
{
|
|
||||||
_addAuthorizedAddress(target);
|
_addAuthorizedAddress(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Removes authorizion of an address.
|
/// @dev Removes authorizion of an address.
|
||||||
/// @param target Address to remove authorization from.
|
/// @param target Address to remove authorization from.
|
||||||
function removeAuthorizedAddress(address target)
|
function removeAuthorizedAddress(address target) external onlyOwner {
|
||||||
external
|
|
||||||
onlyOwner
|
|
||||||
{
|
|
||||||
if (!authorized[target]) {
|
if (!authorized[target]) {
|
||||||
LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));
|
LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));
|
||||||
}
|
}
|
||||||
@@ -79,31 +65,18 @@ contract Authorizable is
|
|||||||
/// @dev Removes authorizion of an address.
|
/// @dev Removes authorizion of an address.
|
||||||
/// @param target Address to remove authorization from.
|
/// @param target Address to remove authorization from.
|
||||||
/// @param index Index of target in authorities array.
|
/// @param index Index of target in authorities array.
|
||||||
function removeAuthorizedAddressAtIndex(
|
function removeAuthorizedAddressAtIndex(address target, uint256 index) external onlyOwner {
|
||||||
address target,
|
|
||||||
uint256 index
|
|
||||||
)
|
|
||||||
external
|
|
||||||
onlyOwner
|
|
||||||
{
|
|
||||||
_removeAuthorizedAddressAtIndex(target, index);
|
_removeAuthorizedAddressAtIndex(target, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Gets all authorized addresses.
|
/// @dev Gets all authorized addresses.
|
||||||
/// @return Array of authorized addresses.
|
/// @return Array of authorized addresses.
|
||||||
function getAuthorizedAddresses()
|
function getAuthorizedAddresses() external view returns (address[] memory) {
|
||||||
external
|
|
||||||
view
|
|
||||||
returns (address[] memory)
|
|
||||||
{
|
|
||||||
return authorities;
|
return authorities;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Reverts if msg.sender is not authorized.
|
/// @dev Reverts if msg.sender is not authorized.
|
||||||
function _assertSenderIsAuthorized()
|
function _assertSenderIsAuthorized() internal view {
|
||||||
internal
|
|
||||||
view
|
|
||||||
{
|
|
||||||
if (!authorized[msg.sender]) {
|
if (!authorized[msg.sender]) {
|
||||||
LibRichErrors.rrevert(LibAuthorizableRichErrors.SenderNotAuthorizedError(msg.sender));
|
LibRichErrors.rrevert(LibAuthorizableRichErrors.SenderNotAuthorizedError(msg.sender));
|
||||||
}
|
}
|
||||||
@@ -111,9 +84,7 @@ contract Authorizable is
|
|||||||
|
|
||||||
/// @dev Authorizes an address.
|
/// @dev Authorizes an address.
|
||||||
/// @param target Address to authorize.
|
/// @param target Address to authorize.
|
||||||
function _addAuthorizedAddress(address target)
|
function _addAuthorizedAddress(address target) internal {
|
||||||
internal
|
|
||||||
{
|
|
||||||
// Ensure that the target is not the zero address.
|
// Ensure that the target is not the zero address.
|
||||||
if (target == address(0)) {
|
if (target == address(0)) {
|
||||||
LibRichErrors.rrevert(LibAuthorizableRichErrors.ZeroCantBeAuthorizedError());
|
LibRichErrors.rrevert(LibAuthorizableRichErrors.ZeroCantBeAuthorizedError());
|
||||||
@@ -132,26 +103,15 @@ contract Authorizable is
|
|||||||
/// @dev Removes authorizion of an address.
|
/// @dev Removes authorizion of an address.
|
||||||
/// @param target Address to remove authorization from.
|
/// @param target Address to remove authorization from.
|
||||||
/// @param index Index of target in authorities array.
|
/// @param index Index of target in authorities array.
|
||||||
function _removeAuthorizedAddressAtIndex(
|
function _removeAuthorizedAddressAtIndex(address target, uint256 index) internal {
|
||||||
address target,
|
|
||||||
uint256 index
|
|
||||||
)
|
|
||||||
internal
|
|
||||||
{
|
|
||||||
if (!authorized[target]) {
|
if (!authorized[target]) {
|
||||||
LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));
|
LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));
|
||||||
}
|
}
|
||||||
if (index >= authorities.length) {
|
if (index >= authorities.length) {
|
||||||
LibRichErrors.rrevert(LibAuthorizableRichErrors.IndexOutOfBoundsError(
|
LibRichErrors.rrevert(LibAuthorizableRichErrors.IndexOutOfBoundsError(index, authorities.length));
|
||||||
index,
|
|
||||||
authorities.length
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
if (authorities[index] != target) {
|
if (authorities[index] != target) {
|
||||||
LibRichErrors.rrevert(LibAuthorizableRichErrors.AuthorizedAddressMismatchError(
|
LibRichErrors.rrevert(LibAuthorizableRichErrors.AuthorizedAddressMismatchError(authorities[index], target));
|
||||||
authorities[index],
|
|
||||||
target
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete authorized[target];
|
delete authorized[target];
|
||||||
|
@@ -18,201 +18,124 @@
|
|||||||
|
|
||||||
pragma solidity ^0.5.16;
|
pragma solidity ^0.5.16;
|
||||||
|
|
||||||
|
|
||||||
/// @dev A library for working with 18 digit, base 10 decimals.
|
/// @dev A library for working with 18 digit, base 10 decimals.
|
||||||
library D18 {
|
library D18 {
|
||||||
|
|
||||||
/// @dev Decimal places for dydx value quantities.
|
/// @dev Decimal places for dydx value quantities.
|
||||||
uint256 private constant PRECISION = 18;
|
uint256 private constant PRECISION = 18;
|
||||||
/// @dev 1.0 in base-18 decimal.
|
/// @dev 1.0 in base-18 decimal.
|
||||||
int256 private constant DECIMAL_ONE = int256(10 ** PRECISION);
|
int256 private constant DECIMAL_ONE = int256(10 ** PRECISION);
|
||||||
/// @dev Minimum signed integer value.
|
/// @dev Minimum signed integer value.
|
||||||
int256 private constant MIN_INT256_VALUE = int256(0x8000000000000000000000000000000000000000000000000000000000000000);
|
int256 private constant MIN_INT256_VALUE =
|
||||||
|
int256(0x8000000000000000000000000000000000000000000000000000000000000000);
|
||||||
|
|
||||||
/// @dev Return `1.0`
|
/// @dev Return `1.0`
|
||||||
function one()
|
function one() internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
r = DECIMAL_ONE;
|
r = DECIMAL_ONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Add two decimals.
|
/// @dev Add two decimals.
|
||||||
function add(int256 a, int256 b)
|
function add(int256 a, int256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
r = _add(a, b);
|
r = _add(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Add two decimals.
|
/// @dev Add two decimals.
|
||||||
function add(uint256 a, int256 b)
|
function add(uint256 a, int256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _add(int256(a), b);
|
r = _add(int256(a), b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Add two decimals.
|
/// @dev Add two decimals.
|
||||||
function add(int256 a, uint256 b)
|
function add(int256 a, uint256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _add(a, int256(b));
|
r = _add(a, int256(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Add two decimals.
|
/// @dev Add two decimals.
|
||||||
function add(uint256 a, uint256 b)
|
function add(uint256 a, uint256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _add(int256(a), int256(b));
|
r = _add(int256(a), int256(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Subract two decimals.
|
/// @dev Subract two decimals.
|
||||||
function sub(int256 a, int256 b)
|
function sub(int256 a, int256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
r = _add(a, -b);
|
r = _add(a, -b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Subract two decimals.
|
/// @dev Subract two decimals.
|
||||||
function sub(uint256 a, int256 b)
|
function sub(uint256 a, int256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _add(int256(a), -b);
|
r = _add(int256(a), -b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Subract two decimals.
|
/// @dev Subract two decimals.
|
||||||
function sub(uint256 a, uint256 b)
|
function sub(uint256 a, uint256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _add(int256(a), -int256(b));
|
r = _add(int256(a), -int256(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Multiply two decimals.
|
/// @dev Multiply two decimals.
|
||||||
function mul(int256 a, int256 b)
|
function mul(int256 a, int256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
r = _div(_mul(a, b), DECIMAL_ONE);
|
r = _div(_mul(a, b), DECIMAL_ONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Multiply two decimals.
|
/// @dev Multiply two decimals.
|
||||||
function mul(uint256 a, int256 b)
|
function mul(uint256 a, int256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _div(_mul(int256(a), b), DECIMAL_ONE);
|
r = _div(_mul(int256(a), b), DECIMAL_ONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Multiply two decimals.
|
/// @dev Multiply two decimals.
|
||||||
function mul(int256 a, uint256 b)
|
function mul(int256 a, uint256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _div(_mul(a, int256(b)), DECIMAL_ONE);
|
r = _div(_mul(a, int256(b)), DECIMAL_ONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Multiply two decimals.
|
/// @dev Multiply two decimals.
|
||||||
function mul(uint256 a, uint256 b)
|
function mul(uint256 a, uint256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _div(_mul(int256(a), int256(b)), DECIMAL_ONE);
|
r = _div(_mul(int256(a), int256(b)), DECIMAL_ONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Divide two decimals.
|
/// @dev Divide two decimals.
|
||||||
function div(int256 a, int256 b)
|
function div(int256 a, int256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
r = _div(_mul(a, DECIMAL_ONE), b);
|
r = _div(_mul(a, DECIMAL_ONE), b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Divide two decimals.
|
/// @dev Divide two decimals.
|
||||||
function div(uint256 a, int256 b)
|
function div(uint256 a, int256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _div(_mul(int256(a), DECIMAL_ONE), b);
|
r = _div(_mul(int256(a), DECIMAL_ONE), b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Divide two decimals.
|
/// @dev Divide two decimals.
|
||||||
function div(int256 a, uint256 b)
|
function div(int256 a, uint256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _div(_mul(a, DECIMAL_ONE), int256(b));
|
r = _div(_mul(a, DECIMAL_ONE), int256(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Divide two decimals.
|
/// @dev Divide two decimals.
|
||||||
function div(uint256 a, uint256 b)
|
function div(uint256 a, uint256 b) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(b) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = _div(_mul(int256(a), DECIMAL_ONE), int256(b));
|
r = _div(_mul(int256(a), DECIMAL_ONE), int256(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Safely convert an unsigned integer into a signed integer.
|
/// @dev Safely convert an unsigned integer into a signed integer.
|
||||||
function toSigned(uint256 a)
|
function toSigned(uint256 a) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
require(int256(a) >= 0, "D18/DECIMAL_VALUE_TOO_BIG");
|
||||||
r = int256(a);
|
r = int256(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Clip a signed value to be positive.
|
/// @dev Clip a signed value to be positive.
|
||||||
function clip(int256 a)
|
function clip(int256 a) internal pure returns (int256 r) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
r = a < 0 ? 0 : a;
|
r = a < 0 ? 0 : a;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Safely multiply two signed integers.
|
/// @dev Safely multiply two signed integers.
|
||||||
function _mul(int256 a, int256 b)
|
function _mul(int256 a, int256 b) private pure returns (int256 r) {
|
||||||
private
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
if (a == 0 || b == 0) {
|
if (a == 0 || b == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -222,27 +145,15 @@ library D18 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Safely divide two signed integers.
|
/// @dev Safely divide two signed integers.
|
||||||
function _div(int256 a, int256 b)
|
function _div(int256 a, int256 b) private pure returns (int256 r) {
|
||||||
private
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
require(b != 0, "D18/DECIMAL_DIV_BY_ZERO");
|
require(b != 0, "D18/DECIMAL_DIV_BY_ZERO");
|
||||||
require(a != MIN_INT256_VALUE || b != -1, "D18/DECIMAL_DIV_OVERFLOW");
|
require(a != MIN_INT256_VALUE || b != -1, "D18/DECIMAL_DIV_OVERFLOW");
|
||||||
r = a / b;
|
r = a / b;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Safely add two signed integers.
|
/// @dev Safely add two signed integers.
|
||||||
function _add(int256 a, int256 b)
|
function _add(int256 a, int256 b) private pure returns (int256 r) {
|
||||||
private
|
|
||||||
pure
|
|
||||||
returns (int256 r)
|
|
||||||
{
|
|
||||||
r = a + b;
|
r = a + b;
|
||||||
require(
|
require(!((a < 0 && b < 0 && r > a) || (a > 0 && b > 0 && r < a)), "D18/DECIMAL_ADD_OVERFLOW");
|
||||||
!((a < 0 && b < 0 && r > a) || (a > 0 && b > 0 && r < a)),
|
|
||||||
"D18/DECIMAL_ADD_OVERFLOW"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -18,306 +18,234 @@
|
|||||||
|
|
||||||
pragma solidity ^0.5.9;
|
pragma solidity ^0.5.9;
|
||||||
|
|
||||||
|
|
||||||
contract DeploymentConstants {
|
contract DeploymentConstants {
|
||||||
|
|
||||||
// solhint-disable separate-by-one-line-in-contract
|
|
||||||
|
|
||||||
// Mainnet addresses ///////////////////////////////////////////////////////
|
// Mainnet addresses ///////////////////////////////////////////////////////
|
||||||
/// @dev Mainnet address of the WETH contract.
|
/// @dev Mainnet address of the WETH contract.
|
||||||
address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
|
address private constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
|
||||||
/// @dev Mainnet address of the KyberNetworkProxy contract.
|
/// @dev Mainnet address of the KyberNetworkProxy contract.
|
||||||
address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e;
|
address private constant KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e;
|
||||||
/// @dev Mainnet address of the KyberHintHandler contract.
|
/// @dev Mainnet address of the KyberHintHandler contract.
|
||||||
address constant private KYBER_HINT_HANDLER_ADDRESS = 0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C;
|
address private constant KYBER_HINT_HANDLER_ADDRESS = 0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C;
|
||||||
/// @dev Mainnet address of the `UniswapExchangeFactory` contract.
|
/// @dev Mainnet address of the `UniswapExchangeFactory` contract.
|
||||||
address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;
|
address private constant UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;
|
||||||
/// @dev Mainnet address of the `UniswapV2Router01` contract.
|
/// @dev Mainnet address of the `UniswapV2Router01` contract.
|
||||||
address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;
|
address private constant UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;
|
||||||
/// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.
|
/// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.
|
||||||
address constant private ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D;
|
address private constant ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D;
|
||||||
/// @dev Mainnet address of the `ERC20BridgeProxy` contract
|
/// @dev Mainnet address of the `ERC20BridgeProxy` contract
|
||||||
address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0;
|
address private constant ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0;
|
||||||
///@dev Mainnet address of the `Dai` (multi-collateral) contract
|
///@dev Mainnet address of the `Dai` (multi-collateral) contract
|
||||||
address constant private DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
|
address private constant DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
|
||||||
/// @dev Mainnet address of the `Chai` contract
|
/// @dev Mainnet address of the `Chai` contract
|
||||||
address constant private CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215;
|
address private constant CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215;
|
||||||
/// @dev Mainnet address of the 0x DevUtils contract.
|
/// @dev Mainnet address of the 0x DevUtils contract.
|
||||||
address constant private DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547;
|
address private constant DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547;
|
||||||
/// @dev Kyber ETH pseudo-address.
|
/// @dev Kyber ETH pseudo-address.
|
||||||
address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
address internal constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
||||||
/// @dev Mainnet address of the dYdX contract.
|
/// @dev Mainnet address of the dYdX contract.
|
||||||
address constant private DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e;
|
address private constant DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e;
|
||||||
/// @dev Mainnet address of the GST2 contract
|
/// @dev Mainnet address of the GST2 contract
|
||||||
address constant private GST_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04;
|
address private constant GST_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04;
|
||||||
/// @dev Mainnet address of the GST Collector
|
/// @dev Mainnet address of the GST Collector
|
||||||
address constant private GST_COLLECTOR_ADDRESS = 0x000000D3b08566BE75A6DB803C03C85C0c1c5B96;
|
address private constant GST_COLLECTOR_ADDRESS = 0x000000D3b08566BE75A6DB803C03C85C0c1c5B96;
|
||||||
/// @dev Mainnet address of the mStable mUSD contract.
|
/// @dev Mainnet address of the mStable mUSD contract.
|
||||||
address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;
|
address private constant MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;
|
||||||
/// @dev Mainnet address of the Mooniswap Registry contract
|
/// @dev Mainnet address of the Mooniswap Registry contract
|
||||||
address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;
|
address private constant MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;
|
||||||
/// @dev Mainnet address of the DODO Registry (ZOO) contract
|
/// @dev Mainnet address of the DODO Registry (ZOO) contract
|
||||||
address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;
|
address private constant DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;
|
||||||
/// @dev Mainnet address of the DODO Helper contract
|
/// @dev Mainnet address of the DODO Helper contract
|
||||||
address constant private DODO_HELPER = 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb;
|
address private constant DODO_HELPER = 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb;
|
||||||
|
|
||||||
// // Ropsten addresses ///////////////////////////////////////////////////////
|
// // Ropsten addresses ///////////////////////////////////////////////////////
|
||||||
// /// @dev Mainnet address of the WETH contract.
|
/// @dev Mainnet address of the WETH contract.
|
||||||
// address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;
|
// address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;
|
||||||
// /// @dev Mainnet address of the KyberNetworkProxy contract.
|
/// @dev Mainnet address of the KyberNetworkProxy contract.
|
||||||
// address constant private KYBER_NETWORK_PROXY_ADDRESS = 0xd719c34261e099Fdb33030ac8909d5788D3039C4;
|
// address constant private KYBER_NETWORK_PROXY_ADDRESS = 0xd719c34261e099Fdb33030ac8909d5788D3039C4;
|
||||||
// /// @dev Mainnet address of the `UniswapExchangeFactory` contract.
|
/// @dev Mainnet address of the `UniswapExchangeFactory` contract.
|
||||||
// address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351;
|
// address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351;
|
||||||
// /// @dev Mainnet address of the `UniswapV2Router01` contract.
|
/// @dev Mainnet address of the `UniswapV2Router01` contract.
|
||||||
// address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;
|
// address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;
|
||||||
// /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.
|
/// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.
|
||||||
// address constant private ETH2DAI_ADDRESS = address(0);
|
// address constant private ETH2DAI_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the `ERC20BridgeProxy` contract
|
/// @dev Mainnet address of the `ERC20BridgeProxy` contract
|
||||||
// address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xb344afeD348de15eb4a9e180205A2B0739628339;
|
// address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xb344afeD348de15eb4a9e180205A2B0739628339;
|
||||||
// ///@dev Mainnet address of the `Dai` (multi-collateral) contract
|
// ///@dev Mainnet address of the `Dai` (multi-collateral) contract
|
||||||
// address constant private DAI_ADDRESS = address(0);
|
// address constant private DAI_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the `Chai` contract
|
/// @dev Mainnet address of the `Chai` contract
|
||||||
// address constant private CHAI_ADDRESS = address(0);
|
// address constant private CHAI_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the 0x DevUtils contract.
|
/// @dev Mainnet address of the 0x DevUtils contract.
|
||||||
// address constant private DEV_UTILS_ADDRESS = 0xC812AF3f3fBC62F76ea4262576EC0f49dB8B7f1c;
|
// address constant private DEV_UTILS_ADDRESS = 0xC812AF3f3fBC62F76ea4262576EC0f49dB8B7f1c;
|
||||||
// /// @dev Kyber ETH pseudo-address.
|
/// @dev Kyber ETH pseudo-address.
|
||||||
// address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
// address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
||||||
// /// @dev Mainnet address of the dYdX contract.
|
/// @dev Mainnet address of the dYdX contract.
|
||||||
// address constant private DYDX_ADDRESS = address(0);
|
// address constant private DYDX_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the GST2 contract
|
/// @dev Mainnet address of the GST2 contract
|
||||||
// address constant private GST_ADDRESS = address(0);
|
// address constant private GST_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the GST Collector
|
/// @dev Mainnet address of the GST Collector
|
||||||
// address constant private GST_COLLECTOR_ADDRESS = address(0);
|
// address constant private GST_COLLECTOR_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the mStable mUSD contract.
|
/// @dev Mainnet address of the mStable mUSD contract.
|
||||||
// address constant private MUSD_ADDRESS = 0x4E1000616990D83e56f4b5fC6CC8602DcfD20459;
|
// address constant private MUSD_ADDRESS = 0x4E1000616990D83e56f4b5fC6CC8602DcfD20459;
|
||||||
|
|
||||||
// // Rinkeby addresses ///////////////////////////////////////////////////////
|
// // Rinkeby addresses ///////////////////////////////////////////////////////
|
||||||
// /// @dev Mainnet address of the WETH contract.
|
/// @dev Mainnet address of the WETH contract.
|
||||||
// address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;
|
// address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;
|
||||||
// /// @dev Mainnet address of the KyberNetworkProxy contract.
|
/// @dev Mainnet address of the KyberNetworkProxy contract.
|
||||||
// address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x0d5371e5EE23dec7DF251A8957279629aa79E9C5;
|
// address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x0d5371e5EE23dec7DF251A8957279629aa79E9C5;
|
||||||
// /// @dev Mainnet address of the `UniswapExchangeFactory` contract.
|
/// @dev Mainnet address of the `UniswapExchangeFactory` contract.
|
||||||
// address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36;
|
// address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36;
|
||||||
// /// @dev Mainnet address of the `UniswapV2Router01` contract.
|
/// @dev Mainnet address of the `UniswapV2Router01` contract.
|
||||||
// address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;
|
// address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;
|
||||||
// /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.
|
/// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.
|
||||||
// address constant private ETH2DAI_ADDRESS = address(0);
|
// address constant private ETH2DAI_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the `ERC20BridgeProxy` contract
|
/// @dev Mainnet address of the `ERC20BridgeProxy` contract
|
||||||
// address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xA2AA4bEFED748Fba27a3bE7Dfd2C4b2c6DB1F49B;
|
// address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xA2AA4bEFED748Fba27a3bE7Dfd2C4b2c6DB1F49B;
|
||||||
// ///@dev Mainnet address of the `Dai` (multi-collateral) contract
|
// ///@dev Mainnet address of the `Dai` (multi-collateral) contract
|
||||||
// address constant private DAI_ADDRESS = address(0);
|
// address constant private DAI_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the `Chai` contract
|
/// @dev Mainnet address of the `Chai` contract
|
||||||
// address constant private CHAI_ADDRESS = address(0);
|
// address constant private CHAI_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the 0x DevUtils contract.
|
/// @dev Mainnet address of the 0x DevUtils contract.
|
||||||
// address constant private DEV_UTILS_ADDRESS = 0x46B5BC959e8A754c0256FFF73bF34A52Ad5CdfA9;
|
// address constant private DEV_UTILS_ADDRESS = 0x46B5BC959e8A754c0256FFF73bF34A52Ad5CdfA9;
|
||||||
// /// @dev Kyber ETH pseudo-address.
|
/// @dev Kyber ETH pseudo-address.
|
||||||
// address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
// address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
||||||
// /// @dev Mainnet address of the dYdX contract.
|
/// @dev Mainnet address of the dYdX contract.
|
||||||
// address constant private DYDX_ADDRESS = address(0);
|
// address constant private DYDX_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the GST2 contract
|
/// @dev Mainnet address of the GST2 contract
|
||||||
// address constant private GST_ADDRESS = address(0);
|
// address constant private GST_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the GST Collector
|
/// @dev Mainnet address of the GST Collector
|
||||||
// address constant private GST_COLLECTOR_ADDRESS = address(0);
|
// address constant private GST_COLLECTOR_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the mStable mUSD contract.
|
/// @dev Mainnet address of the mStable mUSD contract.
|
||||||
// address constant private MUSD_ADDRESS = address(0);
|
// address constant private MUSD_ADDRESS = address(0);
|
||||||
|
|
||||||
// // Kovan addresses /////////////////////////////////////////////////////////
|
// // Kovan addresses /////////////////////////////////////////////////////////
|
||||||
// /// @dev Kovan address of the WETH contract.
|
/// @dev Kovan address of the WETH contract.
|
||||||
// address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;
|
// address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;
|
||||||
// /// @dev Kovan address of the KyberNetworkProxy contract.
|
/// @dev Kovan address of the KyberNetworkProxy contract.
|
||||||
// address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D;
|
// address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D;
|
||||||
// /// @dev Kovan address of the `UniswapExchangeFactory` contract.
|
/// @dev Kovan address of the `UniswapExchangeFactory` contract.
|
||||||
// address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30;
|
// address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30;
|
||||||
// /// @dev Kovan address of the `UniswapV2Router01` contract.
|
/// @dev Kovan address of the `UniswapV2Router01` contract.
|
||||||
// address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;
|
// address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;
|
||||||
// /// @dev Kovan address of the Eth2Dai `MatchingMarket` contract.
|
/// @dev Kovan address of the Eth2Dai `MatchingMarket` contract.
|
||||||
// address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4;
|
// address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4;
|
||||||
// /// @dev Kovan address of the `ERC20BridgeProxy` contract
|
/// @dev Kovan address of the `ERC20BridgeProxy` contract
|
||||||
// address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x3577552C1Fb7A44aD76BeEB7aB53251668A21F8D;
|
// address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x3577552C1Fb7A44aD76BeEB7aB53251668A21F8D;
|
||||||
// /// @dev Kovan address of the `Chai` contract
|
/// @dev Kovan address of the `Chai` contract
|
||||||
// address constant private CHAI_ADDRESS = address(0);
|
// address constant private CHAI_ADDRESS = address(0);
|
||||||
// /// @dev Kovan address of the `Dai` (multi-collateral) contract
|
/// @dev Kovan address of the `Dai` (multi-collateral) contract
|
||||||
// address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;
|
// address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;
|
||||||
// /// @dev Kovan address of the 0x DevUtils contract.
|
/// @dev Kovan address of the 0x DevUtils contract.
|
||||||
// address constant private DEV_UTILS_ADDRESS = 0x9402639A828BdF4E9e4103ac3B69E1a6E522eB59;
|
// address constant private DEV_UTILS_ADDRESS = 0x9402639A828BdF4E9e4103ac3B69E1a6E522eB59;
|
||||||
// /// @dev Kyber ETH pseudo-address.
|
/// @dev Kyber ETH pseudo-address.
|
||||||
// address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
// address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
||||||
// /// @dev Kovan address of the dYdX contract.
|
/// @dev Kovan address of the dYdX contract.
|
||||||
// address constant private DYDX_ADDRESS = address(0);
|
// address constant private DYDX_ADDRESS = address(0);
|
||||||
// /// @dev Kovan address of the GST2 contract
|
/// @dev Kovan address of the GST2 contract
|
||||||
// address constant private GST_ADDRESS = address(0);
|
// address constant private GST_ADDRESS = address(0);
|
||||||
// /// @dev Kovan address of the GST Collector
|
/// @dev Kovan address of the GST Collector
|
||||||
// address constant private GST_COLLECTOR_ADDRESS = address(0);
|
// address constant private GST_COLLECTOR_ADDRESS = address(0);
|
||||||
// /// @dev Mainnet address of the mStable mUSD contract.
|
/// @dev Mainnet address of the mStable mUSD contract.
|
||||||
// address constant private MUSD_ADDRESS = address(0);
|
// address constant private MUSD_ADDRESS = address(0);
|
||||||
|
|
||||||
/// @dev Overridable way to get the `KyberNetworkProxy` address.
|
/// @dev Overridable way to get the `KyberNetworkProxy` address.
|
||||||
/// @return kyberAddress The `IKyberNetworkProxy` address.
|
/// @return kyberAddress The `IKyberNetworkProxy` address.
|
||||||
function _getKyberNetworkProxyAddress()
|
function _getKyberNetworkProxyAddress() internal view returns (address kyberAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address kyberAddress)
|
|
||||||
{
|
|
||||||
return KYBER_NETWORK_PROXY_ADDRESS;
|
return KYBER_NETWORK_PROXY_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Overridable way to get the `KyberHintHandler` address.
|
/// @dev Overridable way to get the `KyberHintHandler` address.
|
||||||
/// @return kyberAddress The `IKyberHintHandler` address.
|
/// @return kyberAddress The `IKyberHintHandler` address.
|
||||||
function _getKyberHintHandlerAddress()
|
function _getKyberHintHandlerAddress() internal view returns (address hintHandlerAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address hintHandlerAddress)
|
|
||||||
{
|
|
||||||
return KYBER_HINT_HANDLER_ADDRESS;
|
return KYBER_HINT_HANDLER_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Overridable way to get the WETH address.
|
/// @dev Overridable way to get the WETH address.
|
||||||
/// @return wethAddress The WETH address.
|
/// @return wethAddress The WETH address.
|
||||||
function _getWethAddress()
|
function _getWethAddress() internal view returns (address wethAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address wethAddress)
|
|
||||||
{
|
|
||||||
return WETH_ADDRESS;
|
return WETH_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Overridable way to get the `UniswapExchangeFactory` address.
|
/// @dev Overridable way to get the `UniswapExchangeFactory` address.
|
||||||
/// @return uniswapAddress The `UniswapExchangeFactory` address.
|
/// @return uniswapAddress The `UniswapExchangeFactory` address.
|
||||||
function _getUniswapExchangeFactoryAddress()
|
function _getUniswapExchangeFactoryAddress() internal view returns (address uniswapAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address uniswapAddress)
|
|
||||||
{
|
|
||||||
return UNISWAP_EXCHANGE_FACTORY_ADDRESS;
|
return UNISWAP_EXCHANGE_FACTORY_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Overridable way to get the `UniswapV2Router01` address.
|
/// @dev Overridable way to get the `UniswapV2Router01` address.
|
||||||
/// @return uniswapRouterAddress The `UniswapV2Router01` address.
|
/// @return uniswapRouterAddress The `UniswapV2Router01` address.
|
||||||
function _getUniswapV2Router01Address()
|
function _getUniswapV2Router01Address() internal view returns (address uniswapRouterAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address uniswapRouterAddress)
|
|
||||||
{
|
|
||||||
return UNISWAP_V2_ROUTER_01_ADDRESS;
|
return UNISWAP_V2_ROUTER_01_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract.
|
/// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract.
|
||||||
/// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract.
|
/// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract.
|
||||||
function _getEth2DaiAddress()
|
function _getEth2DaiAddress() internal view returns (address eth2daiAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address eth2daiAddress)
|
|
||||||
{
|
|
||||||
return ETH2DAI_ADDRESS;
|
return ETH2DAI_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract.
|
/// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract.
|
||||||
/// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract.
|
/// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract.
|
||||||
function _getERC20BridgeProxyAddress()
|
function _getERC20BridgeProxyAddress() internal view returns (address erc20BridgeProxyAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address erc20BridgeProxyAddress)
|
|
||||||
{
|
|
||||||
return ERC20_BRIDGE_PROXY_ADDRESS;
|
return ERC20_BRIDGE_PROXY_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the `Dai` contract.
|
/// @dev An overridable way to retrieve the `Dai` contract.
|
||||||
/// @return daiAddress The `Dai` contract.
|
/// @return daiAddress The `Dai` contract.
|
||||||
function _getDaiAddress()
|
function _getDaiAddress() internal view returns (address daiAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address daiAddress)
|
|
||||||
{
|
|
||||||
return DAI_ADDRESS;
|
return DAI_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the `Chai` contract.
|
/// @dev An overridable way to retrieve the `Chai` contract.
|
||||||
/// @return chaiAddress The `Chai` contract.
|
/// @return chaiAddress The `Chai` contract.
|
||||||
function _getChaiAddress()
|
function _getChaiAddress() internal view returns (address chaiAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address chaiAddress)
|
|
||||||
{
|
|
||||||
return CHAI_ADDRESS;
|
return CHAI_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the 0x `DevUtils` contract address.
|
/// @dev An overridable way to retrieve the 0x `DevUtils` contract address.
|
||||||
/// @return devUtils The 0x `DevUtils` contract address.
|
/// @return devUtils The 0x `DevUtils` contract address.
|
||||||
function _getDevUtilsAddress()
|
function _getDevUtilsAddress() internal view returns (address devUtils) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address devUtils)
|
|
||||||
{
|
|
||||||
return DEV_UTILS_ADDRESS;
|
return DEV_UTILS_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Overridable way to get the DyDx contract.
|
/// @dev Overridable way to get the DyDx contract.
|
||||||
/// @return exchange The DyDx exchange contract.
|
/// @return exchange The DyDx exchange contract.
|
||||||
function _getDydxAddress()
|
function _getDydxAddress() internal view returns (address dydxAddress) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address dydxAddress)
|
|
||||||
{
|
|
||||||
return DYDX_ADDRESS;
|
return DYDX_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the GST2 contract address.
|
/// @dev An overridable way to retrieve the GST2 contract address.
|
||||||
/// @return gst The GST contract.
|
/// @return gst The GST contract.
|
||||||
function _getGstAddress()
|
function _getGstAddress() internal view returns (address gst) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address gst)
|
|
||||||
{
|
|
||||||
return GST_ADDRESS;
|
return GST_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the GST Collector address.
|
/// @dev An overridable way to retrieve the GST Collector address.
|
||||||
/// @return collector The GST collector address.
|
/// @return collector The GST collector address.
|
||||||
function _getGstCollectorAddress()
|
function _getGstCollectorAddress() internal view returns (address collector) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address collector)
|
|
||||||
{
|
|
||||||
return GST_COLLECTOR_ADDRESS;
|
return GST_COLLECTOR_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the mStable mUSD address.
|
/// @dev An overridable way to retrieve the mStable mUSD address.
|
||||||
/// @return musd The mStable mUSD address.
|
/// @return musd The mStable mUSD address.
|
||||||
function _getMUsdAddress()
|
function _getMUsdAddress() internal view returns (address musd) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address musd)
|
|
||||||
{
|
|
||||||
return MUSD_ADDRESS;
|
return MUSD_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the Mooniswap registry address.
|
/// @dev An overridable way to retrieve the Mooniswap registry address.
|
||||||
/// @return registry The Mooniswap registry address.
|
/// @return registry The Mooniswap registry address.
|
||||||
function _getMooniswapAddress()
|
function _getMooniswapAddress() internal view returns (address) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address)
|
|
||||||
{
|
|
||||||
return MOONISWAP_REGISTRY;
|
return MOONISWAP_REGISTRY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the DODO Registry contract address.
|
/// @dev An overridable way to retrieve the DODO Registry contract address.
|
||||||
/// @return registry The DODO Registry contract address.
|
/// @return registry The DODO Registry contract address.
|
||||||
function _getDODORegistryAddress()
|
function _getDODORegistryAddress() internal view returns (address) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address)
|
|
||||||
{
|
|
||||||
return DODO_REGISTRY;
|
return DODO_REGISTRY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev An overridable way to retrieve the DODO Helper contract address.
|
/// @dev An overridable way to retrieve the DODO Helper contract address.
|
||||||
/// @return registry The DODO Helper contract address.
|
/// @return registry The DODO Helper contract address.
|
||||||
function _getDODOHelperAddress()
|
function _getDODOHelperAddress() internal view returns (address) {
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (address)
|
|
||||||
{
|
|
||||||
return DODO_HELPER;
|
return DODO_HELPER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,12 +18,10 @@
|
|||||||
|
|
||||||
pragma solidity ^0.5.9;
|
pragma solidity ^0.5.9;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility library of inline functions on addresses
|
* Utility library of inline functions on addresses
|
||||||
*/
|
*/
|
||||||
library LibAddress {
|
library LibAddress {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the target address is a contract
|
* Returns whether the target address is a contract
|
||||||
* @dev This function will return false if invoked during the constructor of a contract,
|
* @dev This function will return false if invoked during the constructor of a contract,
|
||||||
@@ -40,8 +38,9 @@ library LibAddress {
|
|||||||
// TODO Check this again before the Serenity release, because all addresses will be
|
// TODO Check this again before the Serenity release, because all addresses will be
|
||||||
// contracts then.
|
// contracts then.
|
||||||
// solium-disable-next-line security/no-inline-assembly
|
// solium-disable-next-line security/no-inline-assembly
|
||||||
assembly { size := extcodesize(account) }
|
assembly {
|
||||||
|
size := extcodesize(account)
|
||||||
|
}
|
||||||
return size > 0;
|
return size > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -22,9 +22,7 @@ import "./LibAddressArrayRichErrors.sol";
|
|||||||
import "./LibBytes.sol";
|
import "./LibBytes.sol";
|
||||||
import "./LibRichErrors.sol";
|
import "./LibRichErrors.sol";
|
||||||
|
|
||||||
|
|
||||||
library LibAddressArray {
|
library LibAddressArray {
|
||||||
|
|
||||||
/// @dev Append a new address to an array of addresses.
|
/// @dev Append a new address to an array of addresses.
|
||||||
/// The `addressArray` may need to be reallocated to make space
|
/// The `addressArray` may need to be reallocated to make space
|
||||||
/// for the new address. Because of this we return the resulting
|
/// for the new address. Because of this we return the resulting
|
||||||
@@ -32,11 +30,7 @@ library LibAddressArray {
|
|||||||
/// @param addressArray Array of addresses.
|
/// @param addressArray Array of addresses.
|
||||||
/// @param addressToAppend Address to append.
|
/// @param addressToAppend Address to append.
|
||||||
/// @return Array of addresses: [... addressArray, addressToAppend]
|
/// @return Array of addresses: [... addressArray, addressToAppend]
|
||||||
function append(address[] memory addressArray, address addressToAppend)
|
function append(address[] memory addressArray, address addressToAppend) internal pure returns (address[] memory) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (address[] memory)
|
|
||||||
{
|
|
||||||
// Get stats on address array and free memory
|
// Get stats on address array and free memory
|
||||||
uint256 freeMemPtr = 0;
|
uint256 freeMemPtr = 0;
|
||||||
uint256 addressArrayBeginPtr = 0;
|
uint256 addressArrayBeginPtr = 0;
|
||||||
@@ -54,10 +48,7 @@ library LibAddressArray {
|
|||||||
// `freeMemPtr` > `addressArrayEndPtr`: Some value occupies memory after `addressArray`
|
// `freeMemPtr` > `addressArrayEndPtr`: Some value occupies memory after `addressArray`
|
||||||
// `freeMemPtr` < `addressArrayEndPtr`: Memory has not been managed properly.
|
// `freeMemPtr` < `addressArrayEndPtr`: Memory has not been managed properly.
|
||||||
if (freeMemPtr < addressArrayEndPtr) {
|
if (freeMemPtr < addressArrayEndPtr) {
|
||||||
LibRichErrors.rrevert(LibAddressArrayRichErrors.MismanagedMemoryError(
|
LibRichErrors.rrevert(LibAddressArrayRichErrors.MismanagedMemoryError(freeMemPtr, addressArrayEndPtr));
|
||||||
freeMemPtr,
|
|
||||||
addressArrayEndPtr
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If free memory begins at the end of `addressArray`
|
// If free memory begins at the end of `addressArray`
|
||||||
@@ -92,13 +83,8 @@ library LibAddressArray {
|
|||||||
/// @param addressArray Array of addresses.
|
/// @param addressArray Array of addresses.
|
||||||
/// @param target Address to search for in array.
|
/// @param target Address to search for in array.
|
||||||
/// @return True if the addressArray contains the target.
|
/// @return True if the addressArray contains the target.
|
||||||
function contains(address[] memory addressArray, address target)
|
function contains(address[] memory addressArray, address target) internal pure returns (bool success) {
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (bool success)
|
|
||||||
{
|
|
||||||
assembly {
|
assembly {
|
||||||
|
|
||||||
// Calculate byte length of array
|
// Calculate byte length of array
|
||||||
let arrayByteLen := mul(mload(addressArray), 32)
|
let arrayByteLen := mul(mload(addressArray), 32)
|
||||||
// Calculate beginning of array contents
|
// Calculate beginning of array contents
|
||||||
@@ -107,8 +93,11 @@ library LibAddressArray {
|
|||||||
let arrayContentsEnd := add(arrayContentsStart, arrayByteLen)
|
let arrayContentsEnd := add(arrayContentsStart, arrayByteLen)
|
||||||
|
|
||||||
// Loop through array
|
// Loop through array
|
||||||
for {let i:= arrayContentsStart} lt(i, arrayContentsEnd) {i := add(i, 32)} {
|
for {
|
||||||
|
let i := arrayContentsStart
|
||||||
|
} lt(i, arrayContentsEnd) {
|
||||||
|
i := add(i, 32)
|
||||||
|
} {
|
||||||
// Load array element
|
// Load array element
|
||||||
let arrayElement := mload(i)
|
let arrayElement := mload(i)
|
||||||
|
|
||||||
@@ -128,13 +117,11 @@ library LibAddressArray {
|
|||||||
/// @param addressArray Array of addresses.
|
/// @param addressArray Array of addresses.
|
||||||
/// @param target Address to search for in array.
|
/// @param target Address to search for in array.
|
||||||
/// @return Existence and index of the target in the array.
|
/// @return Existence and index of the target in the array.
|
||||||
function indexOf(address[] memory addressArray, address target)
|
function indexOf(
|
||||||
internal
|
address[] memory addressArray,
|
||||||
pure
|
address target
|
||||||
returns (bool success, uint256 index)
|
) internal pure returns (bool success, uint256 index) {
|
||||||
{
|
|
||||||
assembly {
|
assembly {
|
||||||
|
|
||||||
// Calculate byte length of array
|
// Calculate byte length of array
|
||||||
let arrayByteLen := mul(mload(addressArray), 32)
|
let arrayByteLen := mul(mload(addressArray), 32)
|
||||||
// Calculate beginning of array contents
|
// Calculate beginning of array contents
|
||||||
@@ -143,8 +130,11 @@ library LibAddressArray {
|
|||||||
let arrayContentsEnd := add(arrayContentsStart, arrayByteLen)
|
let arrayContentsEnd := add(arrayContentsStart, arrayByteLen)
|
||||||
|
|
||||||
// Loop through array
|
// Loop through array
|
||||||
for {let i:= arrayContentsStart} lt(i, arrayContentsEnd) {i := add(i, 32)} {
|
for {
|
||||||
|
let i := arrayContentsStart
|
||||||
|
} lt(i, arrayContentsEnd) {
|
||||||
|
i := add(i, 32)
|
||||||
|
} {
|
||||||
// Load array element
|
// Load array element
|
||||||
let arrayElement := mload(i)
|
let arrayElement := mload(i)
|
||||||
|
|
||||||
|
@@ -18,26 +18,14 @@
|
|||||||
|
|
||||||
pragma solidity ^0.5.9;
|
pragma solidity ^0.5.9;
|
||||||
|
|
||||||
|
|
||||||
library LibAddressArrayRichErrors {
|
library LibAddressArrayRichErrors {
|
||||||
|
|
||||||
// bytes4(keccak256("MismanagedMemoryError(uint256,uint256)"))
|
// bytes4(keccak256("MismanagedMemoryError(uint256,uint256)"))
|
||||||
bytes4 internal constant MISMANAGED_MEMORY_ERROR_SELECTOR =
|
bytes4 internal constant MISMANAGED_MEMORY_ERROR_SELECTOR = 0x5fc83722;
|
||||||
0x5fc83722;
|
|
||||||
|
|
||||||
// solhint-disable func-name-mixedcase
|
|
||||||
function MismanagedMemoryError(
|
function MismanagedMemoryError(
|
||||||
uint256 freeMemPtr,
|
uint256 freeMemPtr,
|
||||||
uint256 addressArrayEndPtr
|
uint256 addressArrayEndPtr
|
||||||
)
|
) internal pure returns (bytes memory) {
|
||||||
internal
|
return abi.encodeWithSelector(MISMANAGED_MEMORY_ERROR_SELECTOR, freeMemPtr, addressArrayEndPtr);
|
||||||
pure
|
|
||||||
returns (bytes memory)
|
|
||||||
{
|
|
||||||
return abi.encodeWithSelector(
|
|
||||||
MISMANAGED_MEMORY_ERROR_SELECTOR,
|
|
||||||
freeMemPtr,
|
|
||||||
addressArrayEndPtr
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user