Compare commits

..

101 Commits

Author SHA1 Message Date
Github Actions
66846c8aec Publish
- @0x/contracts-erc20@3.3.49
 - @0x/contracts-test-utils@5.4.39
 - @0x/contracts-treasury@1.4.32
 - @0x/contracts-utils@4.8.30
 - @0x/contracts-zero-ex@0.37.9
 - @0x/asset-swapper@16.66.16
 - @0x/contract-addresses@7.1.0
 - @0x/contract-wrappers@13.22.8
 - @0x/protocol-utils@11.16.16
2022-10-24 20:57:19 +00:00
Github Actions
33e38fd0a1 Updated CHANGELOGS & MD docs 2022-10-24 20:57:15 +00:00
Kyu
5a6df5a39a Add BalancerV2Batch support in Fantom FillQuoteTransformer (#607) 2022-10-24 13:39:06 -07:00
Savarn Dontamsetti (Sav)
592e7d34c9 adding BalancerV2 Batch support for Fantom Bridge Adapter (#606) 2022-10-24 14:15:11 -04:00
Github Actions
1776dbef44 Publish
- @0x/contracts-erc20@3.3.48
 - @0x/contracts-test-utils@5.4.38
 - @0x/contracts-treasury@1.4.31
 - @0x/contracts-utils@4.8.29
 - @0x/contracts-zero-ex@0.37.8
 - @0x/asset-swapper@16.66.15
 - @0x/contract-addresses@7.0.0
 - @0x/contract-wrappers@13.22.7
 - @0x/protocol-utils@11.16.15
2022-10-21 19:43:49 +00:00
Github Actions
089718df33 Updated CHANGELOGS & MD docs 2022-10-21 19:43:46 +00:00
Noah Khamliche
7500ac36de update changelog (#605) 2022-10-21 15:28:33 -04:00
Noah Khamliche
f347f4392c update contract fqt in contract-addresses (#604) 2022-10-21 15:02:23 -04:00
Github Actions
10af74e616 Publish
- @0x/contracts-erc20@3.3.47
 - @0x/contracts-treasury@1.4.30
 - @0x/contracts-utils@4.8.28
 - @0x/contracts-zero-ex@0.37.7
 - @0x/asset-swapper@16.66.14
 - @0x/protocol-utils@11.16.14
2022-10-13 14:12:06 +00:00
Github Actions
cfb2392ac7 Updated CHANGELOGS & MD docs 2022-10-13 14:12:02 +00:00
Kyu
5a2447bef3 Upgrade @0x/contracts-gen (#602) 2022-10-12 17:36:25 -07:00
Noah Khamliche
bf1b5c4257 Fix: FQT otc order encoding logic (#596)
* swap rfq and otc in fillQuoteTransformerDataEncoder to match our enum

* changelog

* fix changelog and move otcOrders field to last in fillQuoteTransformerDataEncoder

* prettier

* move otcOrders array to end of fqtTransformData

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
2022-10-12 17:10:16 -04:00
Github Actions
10916205ab Publish
- @0x/contracts-erc20@3.3.46
 - @0x/contracts-test-utils@5.4.37
 - @0x/contracts-treasury@1.4.29
 - @0x/contracts-utils@4.8.27
 - @0x/contracts-zero-ex@0.37.6
 - @0x/asset-swapper@16.66.13
 - @0x/contract-addresses@6.25.0
 - @0x/contract-wrappers@13.22.6
 - @0x/protocol-utils@11.16.13
2022-10-11 23:45:53 +00:00
Github Actions
69f8fd39f7 Updated CHANGELOGS & MD docs 2022-10-11 23:45:49 +00:00
Kyu
0cc2cdd16e Remove Ropsten and Rinkeby addresses (#597) 2022-10-11 16:29:44 -07:00
Kyu
d207a4267e Update forge-std and fix foundry.toml (#600) 2022-10-11 16:18:21 -07:00
Kyu
e846ed2f34 Replace branch-level Circle CI cache with commit-level cache (#599)
* Branch-level cache does not make sense for `lib` because it needs to be
updated whenever there is a change in TS files.
2022-10-11 10:41:36 -07:00
Elyas
b04455c36f chore: Configure prettier-solidity and run prettier-solidity [TKR-532] (#592)
* add prettier-solidity + config

* run prettier

* update lockfile

* run prettier again

* Prettier missed one /:

* keep bridge adapter the same

* yarn prettier
2022-10-06 11:44:57 -04:00
Github Actions
d06f6c8b4d Publish
- @0x/contracts-erc20@3.3.45
 - @0x/contracts-test-utils@5.4.36
 - @0x/contracts-treasury@1.4.28
 - @0x/contracts-utils@4.8.26
 - @0x/contracts-zero-ex@0.37.5
 - @0x/asset-swapper@16.66.12
 - @0x/contract-addresses@6.24.0
 - @0x/contract-wrappers@13.22.5
 - @0x/protocol-utils@11.16.12
2022-10-05 23:42:44 +00:00
Github Actions
a689e98b0f Updated CHANGELOGS & MD docs 2022-10-05 23:42:41 +00:00
Noah Khamliche
6f72a8e8e3 fix: add balancerV2/batch to optimismBridgeAdapter (#578)
* add balancerV2/batch to optimismBridgeAdapter

* changelog

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
Co-authored-by: Savarn Dontamsetti <sav.dontamsetti@gmail.com>
2022-09-29 12:16:34 -04:00
eobbad
422f83fc99 Chore: Remove Solhint + TSlint clean-up [TKR-585] (#593)
* contracts/ERC20

* remove tslint.json from erc20

* remove tslint.json from test-utils

* remove solhint from treasury

* remove tslint.json from treasury

* remove solhint from utils

* remove tslint.json from utils

* remove solhint from zero-ex

* remove lint-contracts
2022-09-27 14:51:47 -04:00
eobbad
b6597df84f ignore generated wrappers and asset-swapper (#591) 2022-09-26 16:05:55 -04:00
eobbad
c9b1aac8a5 remove scripts from asset swapper (#590) 2022-09-26 12:41:38 -04:00
Ido Kleinman
87f4189e93 chore: Replace TSLint with ESLint in contracts/utils,treasury,test-utils,erc20 (#589)
* replace TSLint with ESLint in contracts-utils

* also contracts/treasury

* also do test-utils

* yarn fix

* fix stuff yarn fix could not fix

* eslint erc20 contracts folder too

* changelogs

* actually zeroex was a different pr

* PR #589 in changelogs

* whitespace

* prettier
2022-09-23 12:39:27 -07:00
Ido Kleinman
390e1b8510 chore: Replace TSLint with ESLint in contracts/zeroex (#587)
* replace tslint with eslint

* config file

* fix linting errors

* changelog

* prettier
2022-09-23 12:39:17 -07:00
Ido Kleinman
5645e87aca chore: add ESLint to package contract wrappers (#584)
* replace tslint with eslint + add eslintrc config

* few more missing packages for eslint

* exclude. now eslint is running (but there are errors)

* correct excludes fixes all the linter issues

* no need for max warnings
2022-09-21 17:20:09 -07:00
eobbad
0daa988996 purge tslint comments (#585) 2022-09-21 19:53:47 -04:00
eobbad
b4d6f74d7b [protocol-utils] tslint->eslint (#582)
* initialize eslint and remove tslint

* change some packages + eslintrc

* run eslint fix

* run prettier

* changelog

* update package.json

* changelog update+prettier
2022-09-21 19:37:25 -04:00
Kyu
2163cb221b Add missing Arbitrum ZeroExGovernor address (#583) 2022-09-21 16:16:28 -07:00
Github Actions
4575300016 Publish
- @0x/contracts-erc20@3.3.44
 - @0x/contracts-test-utils@5.4.35
 - @0x/contracts-treasury@1.4.27
 - @0x/contracts-utils@4.8.25
 - @0x/contracts-zero-ex@0.37.4
 - @0x/asset-swapper@16.66.11
 - @0x/contract-addresses@6.23.4
 - @0x/contract-wrappers@13.22.4
 - @0x/protocol-utils@11.16.11
2022-09-21 19:02:46 +00:00
Github Actions
82341c3b9d Updated CHANGELOGS & MD docs 2022-09-21 19:02:43 +00:00
Noah Khamliche
f89c2d2fed feat: add new fqt address containing nerve mixin (#581)
* add new fqt address containing nerve

* changelog

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
2022-09-21 14:44:55 -04:00
Savarn Dontamsetti (Sav)
09419a7909 Adding Nerve Mixin to Arbitrum Bridge Adapter [TKR-554] (#579)
* adding Nerve Mixin to Arbitrum Bridge Adapter

* refactor bridgeAdapter to include currently deployed changes

* remove duplicate DODOV2

* removing DODO V1 from Arbitrum Bridge Adapter

* updating imports

* fixing CI: ganache tests

* Invalid caching configuration

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
Co-authored-by: Marcin Wolny <marcin@0xproject.com>
2022-09-20 10:54:50 -04:00
Github Actions
1fa093be64 Publish
- @0x/contracts-erc20@3.3.43
 - @0x/contracts-test-utils@5.4.34
 - @0x/contracts-treasury@1.4.26
 - @0x/contracts-utils@4.8.24
 - @0x/contracts-zero-ex@0.37.3
 - @0x/asset-swapper@16.66.10
 - @0x/contract-addresses@6.23.3
 - @0x/contract-wrappers@13.22.3
 - @0x/protocol-utils@11.16.10
2022-09-12 15:56:30 +00:00
Github Actions
8e9f358a02 Updated CHANGELOGS & MD docs 2022-09-12 15:56:27 +00:00
Noah Khamliche
0a2e8fc224 feat: add new fqt for optimism with balancerv2 (#577)
* add new fqt for optimism with balancerv2

* changelog

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
2022-09-09 15:50:23 -04:00
Github Actions
5653ee8f86 Publish
- @0x/contracts-erc20@3.3.42
 - @0x/contracts-test-utils@5.4.33
 - @0x/contracts-treasury@1.4.25
 - @0x/contracts-utils@4.8.23
 - @0x/contracts-zero-ex@0.37.2
 - @0x/asset-swapper@16.66.9
 - @0x/contract-addresses@6.23.2
 - @0x/contract-wrappers@13.22.2
 - @0x/protocol-utils@11.16.9
2022-09-07 14:10:14 +00:00
Github Actions
d180d5325d Updated CHANGELOGS & MD docs 2022-09-07 14:10:11 +00:00
Noah Khamliche
d249042b47 nwe fqt address and changelog (#574)
* nwe fqt address and changelog

* add pr

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
2022-09-07 09:52:42 -04:00
Github Actions
d3a6f79015 Publish
- @0x/contracts-erc20@3.3.41
 - @0x/contracts-test-utils@5.4.32
 - @0x/contracts-treasury@1.4.24
 - @0x/contracts-utils@4.8.22
 - @0x/contracts-zero-ex@0.37.1
 - @0x/asset-swapper@16.66.8
 - @0x/contract-addresses@6.23.1
 - @0x/contract-wrappers@13.22.1
 - @0x/protocol-utils@11.16.8
2022-09-02 19:31:26 +00:00
Github Actions
8c9dc96e5d Updated CHANGELOGS & MD docs 2022-09-02 19:31:23 +00:00
Noah Khamliche
fc0edba46b Fix/new arbitrum bridge adapter (#572)
* added new fqt with new bridge adapter for Arbitrum

* changelog

* changelog add pr

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
2022-09-02 15:16:00 -04:00
Github Actions
37dc99181e Publish
- @0x/contracts-erc20@3.3.40
 - @0x/contracts-test-utils@5.4.31
 - @0x/contracts-treasury@1.4.23
 - @0x/contracts-utils@4.8.21
 - @0x/contracts-zero-ex@0.37.0
 - @0x/asset-swapper@16.66.7
 - @0x/contract-addresses@6.23.0
 - @0x/contract-wrappers@13.22.0
 - @0x/protocol-utils@11.16.7
2022-09-01 15:27:33 +00:00
Github Actions
6efb9f532b Updated CHANGELOGS & MD docs 2022-09-01 15:27:30 +00:00
Noah Khamliche
9b7d88e136 change weth from OPWeth to ARBWeth (#571)
* change weth from OPWeth to ARBWeth

* udpate changelog

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
2022-09-01 11:12:46 -04:00
Noah Khamliche
e51e1f1674 added otc order array to createTranformData (#569)
* added otc order array to createTranformData

* changelog

* fix linting

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
2022-08-31 11:37:50 -04:00
Noah Khamliche
036a263267 prereq code for otc orders in asset-swapper (#565)
* prereq code for otc orders in asset-swapper

* update changelog

* add pr to changelog

Co-authored-by: Noah Khamliche <0xnoah@Noahs-MacBook-Pro-2.local>
2022-08-31 11:08:28 -04:00
Marcin Wolny
1fb44a55b4 Invalid working_directory (#568)
* Invalid working_directory

Invalid working_directory leads to a bug where some of commands are
executed incorrect code version.

* Fix prettier
2022-08-31 16:37:39 +02:00
Kyu
d738eede0e chore: Cleanup contract addresses [TKR-530] (#564)
* Delete unused addresses in addresses.json

* Update contract wrappers

* Update CHANGELOG.json
2022-08-29 20:10:53 +09:00
Github Actions
a99c916100 Publish
- @0x/contracts-erc20@3.3.39
 - @0x/contracts-test-utils@5.4.30
 - @0x/contracts-treasury@1.4.22
 - @0x/contracts-utils@4.8.20
 - @0x/contracts-zero-ex@0.36.6
 - @0x/asset-swapper@16.66.6
 - @0x/contract-addresses@6.22.0
 - @0x/contract-wrappers@13.21.3
 - @0x/protocol-utils@11.16.6
2022-08-25 21:18:21 +00:00
Github Actions
2abb00b5e2 Updated CHANGELOGS & MD docs 2022-08-25 21:18:18 +00:00
eobbad
ef723e6f36 Empty commit 2022-08-25 17:02:48 -04:00
Ido Kleinman
1fc139886e Arbitrum-rinkeby support in AS + contracts-addresses (#552)
* Arbitrum-rinkeby support in AS + contracts-addresses

* fix UniV3 router+quoter addresses to standard ones

* changelog update
2022-08-25 13:51:37 -07:00
Github Actions
2be10bc72f Publish
- @0x/contracts-erc20@3.3.38
 - @0x/contracts-test-utils@5.4.29
 - @0x/contracts-treasury@1.4.21
 - @0x/contracts-utils@4.8.19
 - @0x/contracts-zero-ex@0.36.5
 - @0x/asset-swapper@16.66.5
 - @0x/contract-addresses@6.21.0
 - @0x/contract-wrappers@13.21.2
 - @0x/protocol-utils@11.16.5
2022-08-25 20:34:36 +00:00
Github Actions
abdc02f066 Updated CHANGELOGS & MD docs 2022-08-25 20:34:30 +00:00
eobbad
b7ef5473cd update FQT address on Arbitrum 2022-08-25 15:49:17 -04:00
eobbad
e43cdda22f Arbitrum support (#560)
* Arbitrum support

* fix typo in bridge adapter

* changelog

* remove timestamp from changelog

* fix typo in brige adapter

* add new addresses

* Fix build error

* adjust DodoV2 arguments
2022-08-25 10:37:26 -04:00
Marcin Wolny
416f2ec24c CircleCI candies 🍬 (#550)
* Re-usable cache

By use of branch as a cache key, we invalidate the cache very often.
This leads to incresed builds time. By use of cache based on checksum of
yarn.lock, we may drop the build time.

It will increase the time every time checksum has changed. In our case,
it happens multiple times per month.

* Skip job run if no changes applied

* Skip tests if no changes applied

* Skip tests if no changes applied
2022-08-25 10:08:28 +02:00
Kyu
4f7fe66d74 Fix asset-swapper deprecation notice (#561) 2022-08-24 09:49:46 +09:00
Kyu
eb394383d8 chore: Deprecate asset-swapper [TKR-484] (#559)
* Add asset-swapper deprecation notice in README.md

* Remove asset-swapper references from the top-level README

* Remove asset-swapper from circleci config

* Set asset-swapper private to prevent it from being published

* Remove asset-swapper from `nonContractPackages`

* Disable asset-swapper build and test scripts
2022-08-24 09:30:52 +09:00
Github Actions
92e681f21b Publish
- @0x/contracts-erc20@3.3.37
 - @0x/contracts-test-utils@5.4.28
 - @0x/contracts-treasury@1.4.20
 - @0x/contracts-utils@4.8.18
 - @0x/contracts-zero-ex@0.36.4
 - @0x/asset-swapper@16.66.4
 - @0x/contract-addresses@6.20.1
 - @0x/contract-artifacts@3.18.1
 - @0x/contract-wrappers@13.21.1
 - @0x/protocol-utils@11.16.4
2022-08-22 05:20:31 +00:00
Github Actions
3f65dd6049 Updated CHANGELOGS & MD docs 2022-08-22 05:20:26 +00:00
Jacob Evans
4425c316a3 chore: update packages (#553)
* Update package.jsons to latest tools packages

* Skip tests relying on gasPrice > 0

* Yarn.lock

* Fix linter

* Update Balance checker, new ganache gets more ETH

* Fix new Ganache insufficient assertion string

* Temporarily set QuoteRequestor to skip

* Fix headers Axios now requests with
2022-08-22 14:55:42 +10:00
eobbad
9058839645 WooFi Gas Estimates (#551)
* change gas estimates

* changelog

* remove comments

* fix lerna run lint error
2022-08-16 14:10:53 -04:00
Ido Kleinman
46a7a2e620 Revert "chore: Remove unused addresses in addresses.json [TKR-519] (#548)"
This reverts commit 8aa313a437.
2022-08-11 13:31:47 -07:00
eobbad
b35dccd43d Offboard Cream (#546)
* offboard cream

* changelog

* remove BalancerFillData (unused)
2022-08-10 08:42:43 -04:00
Kyu
08e0c2ebb9 chore: Add checks for addresses.json [TKR-519] (#549) 2022-08-10 17:35:38 +09:00
Kyu
8aa313a437 chore: Remove unused addresses in addresses.json [TKR-519] (#548)
* Delete unused addresses in addresses.json and update index.ts

* Update contract wrappers

* Remove outdated references to `exchange` contract in `asset-swapper`

* Update CHANGELOG.json
2022-08-10 16:59:21 +09:00
Github Actions
8e9699c340 Publish
- @0x/contracts-erc20@3.3.36
 - @0x/contracts-test-utils@5.4.27
 - @0x/contracts-treasury@1.4.19
 - @0x/contracts-utils@4.8.17
 - @0x/contracts-zero-ex@0.36.3
 - @0x/asset-swapper@16.66.3
 - @0x/contract-addresses@6.19.2
 - @0x/contract-wrappers@13.20.8
 - @0x/protocol-utils@11.16.3
2022-08-10 01:12:34 +00:00
Github Actions
939b708e63 Updated CHANGELOGS & MD docs 2022-08-10 01:12:31 +00:00
Kyu
1617e3fc44 Fix Polygon and Ganache FillQuoteTransformer addresses (#547)
* Revert Ganache (1337) FQT address as it was mistakenly updated.
* Update Polygon (137) FQT address with the new one.
2022-08-10 09:43:42 +09:00
Github Actions
e0d705703d Publish
- @0x/contracts-erc20@3.3.35
 - @0x/contracts-test-utils@5.4.26
 - @0x/contracts-treasury@1.4.18
 - @0x/contracts-utils@4.8.16
 - @0x/contracts-zero-ex@0.36.2
 - @0x/asset-swapper@16.66.2
 - @0x/contract-addresses@6.19.1
 - @0x/contract-wrappers@13.20.7
 - @0x/protocol-utils@11.16.2
2022-08-09 19:27:28 +00:00
Github Actions
01a6d933ca Updated CHANGELOGS & MD docs 2022-08-09 19:27:24 +00:00
Kyu
9b9f0b91d7 Move woofi tokens to constant.ts and run prettier (#544) 2022-08-09 13:31:37 +09:00
Ido Kleinman
0d0fef841d PR # 2022-08-08 19:04:04 -05:00
Ido Kleinman
17adfbea32 changelogs 2022-08-08 19:04:04 -05:00
Noah Khamliche
80594622b2 empty commit to run workflow 2022-08-08 18:55:39 -05:00
Ido Kleinman
0dba5a5a3a lowercase addresses (#542) 2022-08-08 16:40:31 -07:00
phil-ociraptor
4dae8de1b6 feat: add Foundry support to contracts/zero-ex (#534)
Co-authored-by: Michael Zhu <mchl.zhu.96@gmail.com>
2022-08-08 11:46:50 -05:00
eobbad
0046bb26d8 Update WooFi sampler logicand addresses.json w/ new FQT's 2022-08-08 12:27:45 -04:00
Kyu
fe935f787c Use @0x/fast-abi instead of deprecated fast-abi (#540) 2022-08-08 14:34:48 +09:00
Kyu
1b527ffcd8 Clean up Mirror and UST related stuff (#539) 2022-08-08 12:29:33 +09:00
Github Actions
9f5324d9c3 Publish
- @0x/asset-swapper@16.66.1
2022-08-08 02:47:26 +00:00
Github Actions
3647392a04 Updated CHANGELOGS & MD docs 2022-08-08 02:47:21 +00:00
Kyu
1d49662c58 Upgrade fast-abi (#538) 2022-08-08 11:27:44 +09:00
Github Actions
6324b08b4d Publish
- @0x/contracts-erc20@3.3.34
 - @0x/contracts-test-utils@5.4.25
 - @0x/contracts-treasury@1.4.17
 - @0x/contracts-utils@4.8.15
 - @0x/contracts-zero-ex@0.36.1
 - @0x/asset-swapper@16.66.0
 - @0x/contract-addresses@6.19.0
 - @0x/contract-wrappers@13.20.6
 - @0x/protocol-utils@11.16.1
2022-08-06 01:52:58 +00:00
Github Actions
fe73b63aaa Updated CHANGELOGS & MD docs 2022-08-06 01:52:55 +00:00
Kyu
192d0b17d9 Empty commit to trigger CI (something is wrong with Ido's account lol) 2022-08-06 10:34:15 +09:00
Ido Kleinman
aa74d04083 new contract address for goerli verified deploy (#537)
* new contract address for goerli verified deploy

* v6.18.0

* updated addresses for goerli + mumbai to verified contracts

* contract addresses changelog update

* unbump package version
2022-08-05 18:22:06 -07:00
Kyu
d586f5727d Rename Balancer pool cache files (#536) 2022-08-05 17:53:55 +09:00
Kyu
98fc79a085 Upgrade dependencies in asset-swapper to match the versions used in 0x-api [TKR-484] (#535)
* Upgrade dependencies to match the versions used in 0x-api

* Fix/disable tslint issues from the new version
2022-08-05 14:26:18 +09:00
eobbad
c12a10b96e Add WooFI support (#513)
* Add WooFI interface for sampling

* WooFi Sampler

* Add mixin

* Update bridge adapters

* fix some bugs

* update transformer_utils

* Add BSC support

* yarn prettier

* Capitalize WOOFI in bridge adapters

* Put rebateAddress in a constant, fixed some other stylistic errors

* bug fixes

* Updated CHANGELOGS & MD docs

* Publish

 - @0x/contracts-erc20@3.3.33
 - @0x/contracts-test-utils@5.4.24
 - @0x/contracts-treasury@1.4.16
 - @0x/contracts-utils@4.8.14
 - @0x/contracts-zero-ex@0.36.0
 - @0x/asset-swapper@16.64.0
 - @0x/contract-addresses@6.17.0
 - @0x/contract-wrappers@13.20.5
 - @0x/protocol-utils@11.16.0

* Update reference.mdx (#531)

Align with `DEFAULT_QUOTE_SLIPPAGE_PERCENTAGE` value from c74e31c219/src/constants.ts (L26)

* code cleanup

* remove deusdc curve pool from this pr

* Refactor PoolsCache (part 1) [TKR-500] (#525)

* Make _refreshPoolCacheIfRequiredAsync type-safe and remove Promise.all

* Factor out PoolsCache key logic into a function

* Use Map instead of object in PoolsCache and increase the default timeout

* Clean up PoolsCache and simplify its public interface

* Refactor PoolsCache (part 2) [TKR-500]  (#526)

* Introduce NoOpPoolsCache and use it in unsupported chains for BeethovenX

* Use `NoOpPoolsCache` for `CreamPoolsCache` and `BalancerPoolsCache` on unsupported chains

* Remove `getBidAskLiquidityForMakerTakerAssetPairAsync` (#528)

* Add transfer approval for quote token for multi-hops and fix buy sampler typo

* Use 0x gas api instead of eth gas station api [TKR-502] (#532)

* Use 0x gas api instead of eth gas station api

* Add integration test for `ProtocolFeeUtils`

* Update CHANGELOG.json

* Add polygon, fantom, avalanche support

* yarn prettier

* Updated CHANGELOGS & MD docs

* Publish

 - @0x/asset-swapper@16.65.0

* Remove references to `custom-no-magic-numbers` ts lint rule [TKR-484] (#533)

* Remove references to `custom-no-magic-numbers ts` lint rule

* Run prettier

* resolve Kyu's comments

* remove fqt change

* Add WooFI interface for sampling

* WooFi Sampler

* Add mixin

* Update bridge adapters

* fix some bugs

* update transformer_utils

* Add BSC support

* yarn prettier

* Capitalize WOOFI in bridge adapters

* Put rebateAddress in a constant, fixed some other stylistic errors

* bug fixes

* code cleanup

* remove deusdc curve pool from this pr

* Add transfer approval for quote token for multi-hops and fix buy sampler typo

* Add polygon, fantom, avalanche support

* yarn prettier

* resolve Kyu's comments

* remove fqt change

* merge types.ts

* WOOFi -> WOOFI

* fix lerna run lint

* Changelog

* nit changes

Co-authored-by: Github Actions <github-actions@github.com>
Co-authored-by: Pavel <51318041+pavel-bc@users.noreply.github.com>
Co-authored-by: Kyu <kyuhyun217@gmail.com>
2022-08-03 15:54:09 -04:00
Kyu
d3d4a08f91 Remove references to custom-no-magic-numbers ts lint rule [TKR-484] (#533)
* Remove references to `custom-no-magic-numbers ts` lint rule

* Run prettier
2022-08-01 17:50:40 -07:00
Github Actions
9ce090c8cd Publish
- @0x/asset-swapper@16.65.0
2022-08-01 22:10:47 +00:00
Github Actions
980d60deb8 Updated CHANGELOGS & MD docs 2022-08-01 22:10:42 +00:00
Kyu
d6d79e51e7 Use 0x gas api instead of eth gas station api [TKR-502] (#532)
* Use 0x gas api instead of eth gas station api

* Add integration test for `ProtocolFeeUtils`

* Update CHANGELOG.json
2022-08-01 14:42:45 -07:00
Kyu
3ef5de93bb Remove getBidAskLiquidityForMakerTakerAssetPairAsync (#528) 2022-07-28 09:26:07 -07:00
Kyu
ab7dc33ca4 Refactor PoolsCache (part 2) [TKR-500] (#526)
* Introduce NoOpPoolsCache and use it in unsupported chains for BeethovenX

* Use `NoOpPoolsCache` for `CreamPoolsCache` and `BalancerPoolsCache` on unsupported chains
2022-07-28 09:12:02 -07:00
Kyu
14dcee5bb6 Refactor PoolsCache (part 1) [TKR-500] (#525)
* Make _refreshPoolCacheIfRequiredAsync type-safe and remove Promise.all

* Factor out PoolsCache key logic into a function

* Use Map instead of object in PoolsCache and increase the default timeout

* Clean up PoolsCache and simplify its public interface
2022-07-28 09:04:42 -07:00
Pavel
9856e78609 Update reference.mdx (#531)
Align with `DEFAULT_QUOTE_SLIPPAGE_PERCENTAGE` value from c74e31c219/src/constants.ts (L26)
2022-07-27 12:35:16 -07:00
405 changed files with 14953 additions and 12887 deletions

View File

@@ -1,5 +1,10 @@
version: 2.1 version: 2.1
parameters:
cache_version:
type: string
default: v5
jobs: jobs:
build: build:
resource_class: xlarge resource_class: xlarge
@@ -7,10 +12,16 @@ jobs:
- image: node:16 - image: node:16
environment: environment:
NODE_OPTIONS: '--max-old-space-size=16384' NODE_OPTIONS: '--max-old-space-size=16384'
working_directory: ~/repo
steps: steps:
- checkout - checkout
- run: git submodule update --init --recursive
- run: echo 'export PATH=$HOME/CIRCLE_PROJECT_REPONAME/node_modules/.bin:$PATH' >> $BASH_ENV - run: echo 'export PATH=$HOME/CIRCLE_PROJECT_REPONAME/node_modules/.bin:$PATH' >> $BASH_ENV
- restore_cache:
keys:
- lib-{{ .Environment.CIRCLE_SHA1 }}-feat/NerveMixinArbitrum
- restore_cache:
keys:
- cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- run: - run:
name: install-yarn name: install-yarn
command: npm install --force --global yarn@1.22.0 command: npm install --force --global yarn@1.22.0
@@ -18,65 +29,155 @@ jobs:
name: yarn name: yarn
command: yarn --frozen-lockfile --ignore-engines install || yarn --frozen-lockfile --ignore-engines install command: yarn --frozen-lockfile --ignore-engines install || yarn --frozen-lockfile --ignore-engines install
- setup_remote_docker - 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:ci
- save_cache: - save_cache:
key: repo-{{ .Environment.CIRCLE_SHA1 }} key: cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
paths: paths:
- ~/repo - ~/project/node_modules
- ~/.cache/yarn
- save_cache:
key: lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
paths:
- ~/project/contracts/erc20/generated-artifacts/
- ~/project/contracts/erc20/generated-wrappers/
- ~/project/contracts/erc20/lib/
- ~/project/contracts/erc20/node_modules
- ~/project/contracts/erc20/test/generated-artifacts/
- ~/project/contracts/erc20/test/generated-wrappers/
- ~/project/contracts/test-utils/lib/
- ~/project/contracts/test-utils/node_modules
- ~/project/contracts/treasury/generated-artifacts/
- ~/project/contracts/treasury/generated-wrappers/
- ~/project/contracts/treasury/lib/
- ~/project/contracts/treasury/node_modules
- ~/project/contracts/treasury/test/generated-artifacts/
- ~/project/contracts/treasury/test/generated-wrappers/
- ~/project/contracts/utils/generated-artifacts/
- ~/project/contracts/utils/generated-wrappers/
- ~/project/contracts/utils/lib/
- ~/project/contracts/utils/node_modules
- ~/project/contracts/utils/test/generated-artifacts/
- ~/project/contracts/utils/test/generated-wrappers/
- ~/project/contracts/zero-ex/generated-artifacts/
- ~/project/contracts/zero-ex/generated-wrappers/
- ~/project/contracts/zero-ex/lib/
- ~/project/contracts/zero-ex/node_modules
- ~/project/contracts/zero-ex/test/generated-artifacts/
- ~/project/contracts/zero-ex/test/generated-wrappers/
- ~/project/packages/asset-swapper/node_modules
- ~/project/packages/contract-addresses/lib/
- ~/project/packages/contract-addresses/node_modules
- ~/project/packages/contract-artifacts/lib/
- ~/project/packages/contract-artifacts/node_modules
- ~/project/packages/contract-wrappers/lib/
- ~/project/packages/contract-wrappers/node_modules
- ~/project/packages/protocol-utils/lib/
- ~/project/packages/protocol-utils/node_modules
- store_artifacts: - store_artifacts:
path: ~/repo/packages/abi-gen/test-cli/output path: ~/repo/packages/abi-gen/test-cli/output
- store_artifacts: - store_artifacts:
path: ~/repo/packages/contract-wrappers/generated_docs path: ~/repo/packages/contract-wrappers/generated_docs
test-exchange-ganache: test-exchange-ganache:
resource_class: medium+ resource_class: xlarge
docker: docker:
- image: node:16 - image: node:16
working_directory: ~/repo
steps: steps:
- checkout
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- restore_cache:
keys:
- lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- run: yarn wsrun -p @0x/contracts-exchange -m --serial -c test:circleci - run: yarn wsrun -p @0x/contracts-exchange -m --serial -c test:circleci
test-integrations-ganache: test-integrations-ganache:
resource_class: medium+ resource_class: xlarge
docker: docker:
- image: node:16 - image: node:16
working_directory: ~/repo
steps: steps:
- checkout
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- restore_cache:
keys:
- lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- run: yarn wsrun -p @0x/contracts-integrations -m --serial -c test:circleci - run: yarn wsrun -p @0x/contracts-integrations -m --serial -c test:circleci
test-contracts-staking-ganache: test-contracts-staking-ganache:
resource_class: medium+ resource_class: xlarge
docker: docker:
- image: node:16 - image: node:16
working_directory: ~/repo
steps: steps:
- checkout
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- run: yarn wsrun -p @0x/contracts-staking -m --serial -c test:circleci - run: yarn wsrun -p @0x/contracts-staking -m --serial -c test:circleci
test-contracts-extra-ganache: test-contracts-extra-ganache:
resource_class: medium+ resource_class: xlarge
docker: docker:
- image: node:16 - image: node:16
working_directory: ~/repo
steps: steps:
- checkout
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}
- restore_cache:
keys:
- lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- run: yarn wsrun -p @0x/contracts-exchange-forwarder -p @0x/contracts-coordinator -m --serial -c test:circleci - run: yarn wsrun -p @0x/contracts-exchange-forwarder -p @0x/contracts-coordinator -m --serial -c test:circleci
test-contracts-rest-ganache: test-contracts-rest-ganache:
resource_class: medium+ resource_class: xlarge
docker: docker:
- image: node:16 - image: node:16
working_directory: ~/repo
steps: steps:
- checkout
- run: |
git diff --name-only development >> changed.txt
if ! grep -q \.sol changed.txt; then
circleci-agent step halt
fi
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- 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 - restore_cache:
keys:
- lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- 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-foundry:
resource_class: xlarge
docker:
- image: ghcr.io/foundry-rs/foundry:latest
steps:
- checkout
- run: |
git diff --name-only development >> changed.txt
cat changed.txt
if ! grep -q \.sol changed.txt; then
circleci-agent step halt
fi
- restore_cache:
keys:
- cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- restore_cache:
keys:
- lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- run: git submodule update --init --recursive
- run:
command: forge test
working_directory: ~/project/contracts/zero-ex
test-publish: test-publish:
resource_class: large resource_class: large
environment: environment:
@@ -84,11 +185,20 @@ jobs:
docker: docker:
- image: node:16 - image: node:16
- image: 0xorg/verdaccio - image: 0xorg/verdaccio
working_directory: ~/repo
steps: steps:
- checkout
- run: |
git diff --name-only development >> changed.txt
cat changed.txt
if ! grep -q packages/ changed.txt; then
circleci-agent step halt
fi
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- restore_cache:
keys:
- lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- run: - run:
command: yarn test:publish:circleci command: yarn test:publish:circleci
no_output_timeout: 1800 no_output_timeout: 1800
@@ -97,71 +207,86 @@ jobs:
test-doc-generation: test-doc-generation:
docker: docker:
- image: node:16 - image: node:16
working_directory: ~/repo
steps: steps:
- checkout
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- restore_cache:
keys:
- lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- run: - run:
command: yarn test:generate_docs:circleci command: yarn test:generate_docs:circleci
no_output_timeout: 1200 no_output_timeout: 1200
test-rest: test-rest:
docker: docker:
- image: node:16 - image: node:16
working_directory: ~/repo
environment: environment:
RUST_ROUTER: 'true' RUST_ROUTER: 'true'
steps: steps:
- checkout
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- restore_cache:
keys:
- lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- run: yarn wsrun -p @0x/contracts-test-utils -m --serial -c test:circleci - run: yarn wsrun -p @0x/contracts-test-utils -m --serial -c test:circleci
- run: yarn wsrun -p @0x/contract-addresses -m --serial -c test:circleci
- run: yarn wsrun -p @0x/contract-artifacts -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/contract-wrappers-test -m --serial -c test:circleci
- run: yarn wsrun -p @0x/order-utils -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: - save_cache:
key: coverage-contract-wrappers-test-{{ .Environment.CIRCLE_SHA1 }} key: coverage-contract-wrappers-test-{{ checksum "yarn.lock" }}
paths: paths:
- ~/repo/packages/contract-wrappers-test/coverage/lcov.info - ~/repo/packages/contract-wrappers-test/coverage/lcov.info
- save_cache: - save_cache:
key: coverage-order-utils-{{ .Environment.CIRCLE_SHA1 }} key: coverage-order-utils-{{ checksum "yarn.lock" }}
paths: paths:
- ~/repo/packages/order-utils/coverage/lcov.info - ~/repo/packages/order-utils/coverage/lcov.info
- save_cache: - save_cache:
key: coverage-web3-wrapper-{{ .Environment.CIRCLE_SHA1 }} key: coverage-web3-wrapper-{{ checksum "yarn.lock" }}
paths: paths:
- ~/repo/packages/web3-wrapper/coverage/lcov.info - ~/repo/packages/web3-wrapper/coverage/lcov.info
static-tests: static-tests:
resource_class: large resource_class: large
working_directory: ~/repo
docker: docker:
- image: node:16 - image: node:16
steps: steps:
- checkout
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- run: yarn lerna run lint - restore_cache:
- run: yarn prettier:ci keys:
- run: yarn deps_versions:ci - lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- run: yarn diff_md_docs:ci - run:
command: yarn lerna run lint
- run:
command: yarn prettier:ci
- run:
command: yarn deps_versions:ci
- run:
command: yarn diff_md_docs:ci
submit-coverage: submit-coverage:
docker: docker:
- image: node:16 - image: node:16
working_directory: ~/repo
steps: steps:
- restore_cache: - restore_cache:
keys: keys:
- repo-{{ .Environment.CIRCLE_SHA1 }} - cache-{{ checksum "yarn.lock" }}-<< pipeline.parameters.cache_version >>
- restore_cache: - restore_cache:
keys: keys:
- coverage-contract-wrappers-test-{{ .Environment.CIRCLE_SHA1 }} - lib-{{ .Environment.CIRCLE_SHA1 }}-<< pipeline.parameters.cache_version >>
- restore_cache: - restore_cache:
keys: keys:
- coverage-order-utils-{{ .Environment.CIRCLE_SHA1 }} - coverage-contract-wrappers-test-{{ checksum "yarn.lock" }}
- restore_cache: - restore_cache:
keys: keys:
- coverage-contracts-{{ .Environment.CIRCLE_SHA1 }} - coverage-order-utils-{{ checksum "yarn.lock" }}
- restore_cache:
keys:
- coverage-contracts-{{ checksum "yarn.lock" }}
- run: yarn report_coverage - run: yarn report_coverage
workflows: workflows:
version: 2 version: 2
@@ -181,6 +306,9 @@ workflows:
# - test-contracts-extra-ganache: # - test-contracts-extra-ganache:
# requires: # requires:
# - build # - build
- test-foundry:
requires:
- build
- test-contracts-rest-ganache: - test-contracts-rest-ganache:
requires: requires:
- build - build

9
.gitignore vendored
View File

@@ -173,6 +173,15 @@ contracts/zero-ex/test/generated-wrappers/
contracts/treasury/generated-wrappers/ contracts/treasury/generated-wrappers/
contracts/treasury/test/generated-wrappers/ contracts/treasury/test/generated-wrappers/
# foundry artifacts
contracts/zero-ex/foundry-artifacts/
# foundry cache
contracts/zero-ex/foundry-cache/
# typechain wrappers
contracts/zero-ex/typechain-wrappers/
# Doc README copy # Doc README copy
packages/*/docs/README.md packages/*/docs/README.md

3
.gitmodules vendored Normal file
View 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

View File

@@ -80,11 +80,8 @@ lib
/contracts/erc1155/build/ /contracts/erc1155/build/
/contracts/extensions/build/ /contracts/extensions/build/
/contracts/exchange-forwarder/build/ /contracts/exchange-forwarder/build/
/packages/asset-swapper/generated-artifacts /packages/asset-swapper/
/packages/asset-swapper/generated-wrappers /packages/contract-wrappers/src/generated-wrappers/
/packages/asset-swapper/test/generated-artifacts
/packages/asset-swapper/test/generated-wrappers
package.json package.json
packages/*/docs packages/*/docs
docs/ docs/
*.sol

View File

@@ -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
}
}
]
} }

View File

@@ -34,7 +34,6 @@ These packages are all under development. See [/contracts/README.md](/contracts/
| Package | Version | Description | | Package | Version | Description |
| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| [`@0x/asset-swapper`](/packages/asset-swapper) | [![npm](https://img.shields.io/npm/v/@0x/asset-swapper.svg)](https://www.npmjs.com/package/@0x/asset-swapper) | Package used to find and create aggregated swaps |
| [`@0x/protocol-utils`](/packages/protocol-utils) | [![npm](https://img.shields.io/npm/v/@0x/protocol-utils.svg)](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) | [![npm](https://img.shields.io/npm/v/@0x/protocol-utils.svg)](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) | [![npm](https://img.shields.io/npm/v/@0x/contract-addresses.svg)](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) | [![npm](https://img.shields.io/npm/v/@0x/contract-addresses.svg)](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) | [![npm](https://img.shields.io/npm/v/@0x/contract-wrappers.svg)](https://www.npmjs.com/package/@0x/contract-wrappers) | JS/TS wrappers for interacting with the 0x smart contracts | | [`@0x/contract-wrappers`](/packages/contract-wrappers) | [![npm](https://img.shields.io/npm/v/@0x/contract-wrappers.svg)](https://www.npmjs.com/package/@0x/contract-wrappers) | JS/TS wrappers for interacting with the 0x smart contracts |
@@ -82,7 +81,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:
@@ -105,7 +104,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
@@ -119,7 +118,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
@@ -133,7 +132,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
@@ -147,7 +146,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
@@ -161,7 +160,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:

View File

@@ -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
View 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": {}
}

View File

@@ -1 +0,0 @@
contracts/src/ZRXToken.sol

View File

@@ -1,4 +1,149 @@
[ [
{
"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, "timestamp": 1658950329,
"version": "3.3.33", "version": "3.3.33",

View File

@@ -5,6 +5,70 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG CHANGELOG
## 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_ ## v3.3.33 - _July 27, 2022_
* Dependencies updated * Dependencies updated

View File

@@ -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;
} }
@@ -67,32 +51,16 @@ contract ERC20Token is
address _from, address _from,
address _to, address _to,
uint256 _value uint256 _value
) ) external returns (bool) {
external require(balances[_from] >= _value, "ERC20_INSUFFICIENT_BALANCE");
returns (bool) require(allowed[_from][msg.sender] >= _value, "ERC20_INSUFFICIENT_ALLOWANCE");
{ require(balances[_to] + _value >= balances[_to], "UINT256_OVERFLOW");
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 +69,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];
} }
} }

View File

@@ -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
@@ -36,14 +35,8 @@ library LibERC20Token {
address token, address token,
address spender, address spender,
uint256 allowance uint256 allowance
) ) internal {
internal bytes memory callData = abi.encodeWithSelector(IERC20Token(0).approve.selector, spender, allowance);
{
bytes memory callData = abi.encodeWithSelector(
IERC20Token(0).approve.selector,
spender,
allowance
);
_callWithOptionalBooleanResult(token, callData); _callWithOptionalBooleanResult(token, callData);
} }
@@ -58,9 +51,7 @@ library LibERC20Token {
address token, address token,
address spender, address spender,
uint256 amount uint256 amount
) ) internal {
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));
} }
@@ -76,14 +67,8 @@ library LibERC20Token {
address token, address token,
address to, address to,
uint256 amount uint256 amount
) ) internal {
internal bytes memory callData = abi.encodeWithSelector(IERC20Token(0).transfer.selector, to, amount);
{
bytes memory callData = abi.encodeWithSelector(
IERC20Token(0).transfer.selector,
to,
amount
);
_callWithOptionalBooleanResult(token, callData); _callWithOptionalBooleanResult(token, callData);
} }
@@ -99,15 +84,8 @@ library LibERC20Token {
address from, address from,
address to, address to,
uint256 amount uint256 amount
) ) internal {
internal bytes memory callData = abi.encodeWithSelector(IERC20Token(0).transferFrom.selector, from, to, amount);
{
bytes memory callData = abi.encodeWithSelector(
IERC20Token(0).transferFrom.selector,
from,
to,
amount
);
_callWithOptionalBooleanResult(token, callData); _callWithOptionalBooleanResult(token, callData);
} }
@@ -115,11 +93,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 +107,13 @@ 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(
internal address token,
view address owner,
returns (uint256 allowance_) address spender
{ ) 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 +125,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 +139,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) {

View File

@@ -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
);
} }
} }

View File

@@ -20,11 +20,8 @@ pragma solidity ^0.5.9;
import "./ERC20Token.sol"; import "./ERC20Token.sol";
contract UnlimitedAllowanceERC20Token is ERC20Token {
contract UnlimitedAllowanceERC20Token is uint256 internal constant MAX_UINT = 2**256 - 1;
ERC20Token
{
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 /// @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.
@@ -35,23 +32,11 @@ contract UnlimitedAllowanceERC20Token is
address _from, address _from,
address _to, address _to,
uint256 _value uint256 _value
) ) external returns (bool) {
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 +44,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;
} }

View File

@@ -16,55 +16,57 @@
// solhint-disable // 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(
public address src,
returns (bool) address dst,
{ uint256 wad
) 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 +80,6 @@ contract WETH9 {
} }
} }
/* /*
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 29 June 2007

View File

@@ -18,105 +18,111 @@
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(
if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]) { address _from,
address _to,
uint256 _value
) returns (bool) {
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(
public address _from,
returns (bool) address _to,
{ uint256 _value
uint allowance = allowed[_from][msg.sender]; ) public returns (bool) {
if (balances[_from] >= _value uint256 allowance = allowed[_from][msg.sender];
&& allowance >= _value if (balances[_from] >= _value && allowance >= _value && balances[_to] + _value >= balances[_to]) {
&& 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 +136,16 @@ contract UnlimitedAllowanceToken is ERC20Token {
} }
} }
contract ZRXToken is UnlimitedAllowanceToken {
contract ZRXToken is
UnlimitedAllowanceToken
{
// solhint-disable const-name-snakecase // solhint-disable const-name-snakecase
uint8 constant public decimals = 18; uint8 public constant decimals = 18;
uint256 public totalSupply = 10**27; // 1 billion tokens, 18 decimal places uint256 public totalSupply = 10**27; // 1 billion tokens, 18 decimal places
string constant public name = "0x Protocol Token"; string public constant name = "0x Protocol Token";
string constant public symbol = "ZRX"; string public constant symbol = "ZRX";
// solhint-enableconst-name-snakecase // solhint-enableconst-name-snakecase
function ZRXToken() function ZRXToken() public {
public
{
balances[msg.sender] = totalSupply; balances[msg.sender] = totalSupply;
} }
} }

View File

@@ -18,29 +18,17 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
contract IERC20Token { contract IERC20Token {
// solhint-disable no-simple-event-func-name // solhint-disable no-simple-event-func-name
event Transfer( event Transfer(address indexed _from, address indexed _to, uint256 _value);
address indexed _from,
address indexed _to,
uint256 _value
);
event Approval( event Approval(address indexed _owner, address indexed _spender, uint256 _value);
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
@@ -51,37 +39,24 @@ contract IERC20Token {
address _from, address _from,
address _to, address _to,
uint256 _value uint256 _value
) ) external returns (bool);
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);
} }

View File

@@ -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;
} }

View File

@@ -19,29 +19,17 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
interface IERC20TokenV06 { interface IERC20TokenV06 {
// solhint-disable no-simple-event-func-name // solhint-disable no-simple-event-func-name
event Transfer( event Transfer(address indexed from, address indexed to, uint256 value);
address indexed from,
address indexed to,
uint256 value
);
event Approval( event Approval(address indexed owner, address indexed spender, uint256 value);
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
@@ -52,45 +40,29 @@ interface IERC20TokenV06 {
address from, address from,
address to, address to,
uint256 value uint256 value
) ) external returns (bool);
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);
} }

View File

@@ -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;

View File

@@ -23,9 +23,8 @@ 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.
@@ -36,14 +35,8 @@ library LibERC20TokenV06 {
IERC20TokenV06 token, IERC20TokenV06 token,
address spender, address spender,
uint256 allowance uint256 allowance
) ) internal {
internal bytes memory callData = abi.encodeWithSelector(token.approve.selector, spender, allowance);
{
bytes memory callData = abi.encodeWithSelector(
token.approve.selector,
spender,
allowance
);
_callWithOptionalBooleanResult(address(token), callData); _callWithOptionalBooleanResult(address(token), callData);
} }
@@ -57,9 +50,7 @@ library LibERC20TokenV06 {
IERC20TokenV06 token, IERC20TokenV06 token,
address spender, address spender,
uint256 amount uint256 amount
) ) internal {
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));
} }
@@ -74,14 +65,8 @@ library LibERC20TokenV06 {
IERC20TokenV06 token, IERC20TokenV06 token,
address to, address to,
uint256 amount uint256 amount
) ) internal {
internal bytes memory callData = abi.encodeWithSelector(token.transfer.selector, to, amount);
{
bytes memory callData = abi.encodeWithSelector(
token.transfer.selector,
to,
amount
);
_callWithOptionalBooleanResult(address(token), callData); _callWithOptionalBooleanResult(address(token), callData);
} }
@@ -96,15 +81,8 @@ library LibERC20TokenV06 {
address from, address from,
address to, address to,
uint256 amount uint256 amount
) ) internal {
internal bytes memory callData = abi.encodeWithSelector(token.transferFrom.selector, from, to, amount);
{
bytes memory callData = abi.encodeWithSelector(
token.transferFrom.selector,
from,
to,
amount
);
_callWithOptionalBooleanResult(address(token), callData); _callWithOptionalBooleanResult(address(token), callData);
} }
@@ -112,11 +90,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 +104,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 +122,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 +136,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 +146,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;
} }

View File

@@ -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,12 @@ 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 _name,
string memory _symbol, string memory _symbol,
uint256 _decimals, uint256 _decimals,
uint256 _totalSupply uint256 _totalSupply
) ) public {
public
{
name = _name; name = _name;
symbol = _symbol; symbol = _symbol;
decimals = _decimals; decimals = _decimals;
@@ -52,10 +46,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 +58,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);
} }

View File

@@ -20,25 +20,14 @@ pragma solidity ^0.5.5;
import "./DummyERC20Token.sol"; import "./DummyERC20Token.sol";
// solhint-disable no-empty-blocks // solhint-disable no-empty-blocks
contract DummyMultipleReturnERC20Token is contract DummyMultipleReturnERC20Token is DummyERC20Token {
DummyERC20Token constructor(
{
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
@@ -48,15 +37,8 @@ contract DummyMultipleReturnERC20Token is
address _from, address _from,
address _to, address _to,
uint256 _value uint256 _value
) ) external returns (bool) {
external emit Transfer(_from, _to, _value);
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 {
@@ -66,4 +48,3 @@ contract DummyMultipleReturnERC20Token is
} }
} }
} }

View File

@@ -20,50 +20,26 @@ pragma solidity ^0.5.5;
import "./DummyERC20Token.sol"; import "./DummyERC20Token.sol";
// solhint-disable no-empty-blocks // solhint-disable no-empty-blocks
contract DummyNoReturnERC20Token is contract DummyNoReturnERC20Token is DummyERC20Token {
DummyERC20Token constructor(
{
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 {
@@ -79,32 +55,16 @@ contract DummyNoReturnERC20Token is
address _from, address _from,
address _to, address _to,
uint256 _value uint256 _value
) ) external returns (bool) {
external require(balances[_from] >= _value, "ERC20_INSUFFICIENT_BALANCE");
returns (bool) require(allowed[_from][msg.sender] >= _value, "ERC20_INSUFFICIENT_ALLOWANCE");
{ require(balances[_to] + _value >= balances[_to], "UINT256_OVERFLOW");
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 +72,3 @@ contract DummyNoReturnERC20Token is
} }
} }
} }

View File

@@ -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));
} }

View File

@@ -18,24 +18,12 @@
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;
@@ -45,32 +33,18 @@ contract TestLibERC20TokenTarget {
bool shouldRevert, bool shouldRevert,
bytes calldata revertData, bytes calldata revertData,
bytes calldata returnData bytes calldata returnData
) ) external {
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();
} }
@@ -79,28 +53,25 @@ contract TestLibERC20TokenTarget {
address from, address from,
address to, address to,
uint256 amount uint256 amount
) ) external returns (bool) {
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))
}
} }
} }

View File

@@ -20,26 +20,15 @@ pragma solidity ^0.5.5;
import "./DummyERC20Token.sol"; import "./DummyERC20Token.sol";
// solhint-disable no-empty-blocks // solhint-disable no-empty-blocks
// solhint-disable no-unused-vars // solhint-disable no-unused-vars
contract UntransferrableDummyERC20Token is contract UntransferrableDummyERC20Token is DummyERC20Token {
DummyERC20Token constructor(
{
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
@@ -49,14 +38,7 @@ contract UntransferrableDummyERC20Token is
address _from, address _from,
address _to, address _to,
uint256 _value uint256 _value
) ) external returns (bool) {
external require(false, "TRANSFER_DISABLED");
returns (bool)
{
require(
false,
"TRANSFER_DISABLED"
);
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@0x/contracts-erc20", "name": "@0x/contracts-erc20",
"version": "3.3.33", "version": "3.3.49",
"engines": { "engines": {
"node": ">=6.12" "node": ">=6.12"
}, },
@@ -23,8 +23,8 @@
"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", "coverage:report:text": "istanbul report text",
"coverage:report:html": "istanbul report html && open coverage/index.html", "coverage:report:html": "istanbul report html && open coverage/index.html",
"profiler:report:html": "istanbul report html && open coverage/index.html", "profiler:report:html": "istanbul report html && open coverage/index.html",
@@ -32,7 +32,6 @@
"test:circleci": "yarn test", "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"
}, },
@@ -51,38 +50,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.8.0", "@0x/abi-gen": "^5.8.1",
"@0x/contracts-gen": "^2.0.46", "@0x/contracts-gen": "^2.0.48",
"@0x/contracts-test-utils": "^5.4.24", "@0x/contracts-test-utils": "^5.4.39",
"@0x/contracts-utils": "^4.8.14", "@0x/contracts-utils": "^4.8.30",
"@0x/dev-utils": "^4.2.14", "@0x/dev-utils": "^5.0.0",
"@0x/sol-compiler": "^4.8.1", "@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.6",
"@0x/typescript-typings": "^5.3.1", "@0x/typescript-typings": "^5.3.1",
"@0x/utils": "^6.5.3", "@0x/utils": "^7.0.0",
"@0x/web3-wrapper": "^7.6.5", "@0x/web3-wrapper": "^8.0.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.7.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.6.3" "typescript": "4.6.3"
}, },
"dependencies": { "dependencies": {
"@0x/base-contract": "^6.5.0", "@0x/base-contract": "^7.0.0",
"ethers": "~4.0.4" "ethers": "~4.0.4"
}, },
"publishConfig": { "publishConfig": {

View File

@@ -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,
}; };

View File

@@ -28,7 +28,7 @@ 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,

View File

@@ -1,6 +0,0 @@
{
"extends": ["@0x/tslint-config"],
"rules": {
"custom-no-magic-numbers": false
}
}

View 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": {}
}

View File

@@ -1,4 +1,140 @@
[ [
{
"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, "timestamp": 1658950329,
"version": "5.4.24", "version": "5.4.24",

View File

@@ -5,6 +5,66 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG CHANGELOG
## 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_ ## v5.4.24 - _July 27, 2022_
* Dependencies updated * Dependencies updated

View File

@@ -1,6 +1,6 @@
{ {
"name": "@0x/contracts-test-utils", "name": "@0x/contracts-test-utils",
"version": "5.4.24", "version": "5.4.39",
"engines": { "engines": {
"node": ">=6.12" "node": ">=6.12"
}, },
@@ -16,8 +16,8 @@
"test:coverage": "run-s build run_mocha coverage:report:text coverage:report:lcov", "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", "coverage:report:text": "istanbul report text",
"coverage:report:html": "istanbul report html && open coverage/index.html", "coverage:report:html": "istanbul report html && open coverage/index.html",
"profiler:report:html": "istanbul report html && open coverage/index.html", "profiler:report:html": "istanbul report html && open coverage/index.html",
@@ -34,28 +34,30 @@
}, },
"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.8.1", "@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.6.3"
}, },
"dependencies": { "dependencies": {
"@0x/assert": "^3.0.34", "@0x/assert": "^3.0.35",
"@0x/base-contract": "^6.5.0", "@0x/base-contract": "^7.0.0",
"@0x/contract-addresses": "^6.17.0", "@0x/contract-addresses": "^7.1.0",
"@0x/dev-utils": "^4.2.14", "@0x/dev-utils": "^5.0.0",
"@0x/json-schemas": "^6.4.4", "@0x/json-schemas": "^6.4.4",
"@0x/order-utils": "^10.4.28", "@0x/order-utils": "^10.4.28",
"@0x/sol-coverage": "^4.0.45", "@0x/sol-coverage": "^4.0.46",
"@0x/sol-profiler": "^4.1.35", "@0x/sol-profiler": "^4.1.36",
"@0x/sol-trace": "^3.0.45", "@0x/sol-trace": "^3.0.46",
"@0x/subproviders": "^6.6.5", "@0x/subproviders": "^7.0.0",
"@0x/types": "^3.3.6", "@0x/types": "^3.3.6",
"@0x/typescript-typings": "^5.3.1", "@0x/typescript-typings": "^5.3.1",
"@0x/utils": "^6.5.3", "@0x/utils": "^7.0.0",
"@0x/web3-wrapper": "^7.6.5", "@0x/web3-wrapper": "^8.0.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 +69,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.7.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",

View File

@@ -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(

View File

@@ -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>);
}); });
} }

View File

@@ -236,7 +236,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 +275,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 +319,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 +355,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 +399,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 +410,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());

View File

@@ -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;
} }

View File

@@ -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) => {

View File

@@ -15,7 +15,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,

View File

@@ -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()', () => {
@@ -78,7 +79,7 @@ blockchainTests('mocha blockchain extensions', env => {
}); });
describe('subtests', () => { describe('subtests', () => {
require('./subtests/mocha_blockchain_1').append(env); append(env);
}); });
}); });
@@ -96,7 +97,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 // 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);
}; };

View File

@@ -55,7 +55,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);

View File

@@ -1,6 +0,0 @@
{
"extends": ["@0x/tslint-config"],
"rules": {
"custom-no-magic-numbers": false
}
}

View 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": {}
}

View File

@@ -1,4 +1,149 @@
[ [
{
"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, "timestamp": 1658950329,
"version": "1.4.16", "version": "1.4.16",

View File

@@ -5,6 +5,70 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG CHANGELOG
## 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_ ## v1.4.16 - _July 27, 2022_
* Dependencies updated * Dependencies updated

View File

@@ -50,11 +50,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);
} }

View File

@@ -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,16 +32,11 @@ 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%
poolId = stakingProxy_.createStakingPool(10 ** 6, false); poolId = stakingProxy_.createStakingPool(10**6, false);
} }
/// @dev Sends this contract's entire WETH balance to the /// @dev Sends this contract's entire WETH balance to the
@@ -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);
} }

View File

@@ -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,54 +54,34 @@ 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.
/// @param stakeStatus UNDELEGATED or DELEGATED /// @param stakeStatus UNDELEGATED or DELEGATED
/// @return balance Owner's stake balances for given status. /// @return balance Owner's stake balances for given status.
function getOwnerStakeByStatus( function getOwnerStakeByStatus(address staker, StakeStatus stakeStatus)
address staker,
StakeStatus stakeStatus
)
external external
view view
returns (StoredBalance memory balance); returns (StoredBalance memory balance);
@@ -111,10 +90,7 @@ interface IStaking {
/// 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.

View File

@@ -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.
@@ -148,8 +116,7 @@ interface IZrxTreasury {
uint256 proposalId, uint256 proposalId,
bool support, bool support,
bytes32[] calldata operatedPoolIds bytes32[] calldata operatedPoolIds
) ) external;
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 +137,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:

View File

@@ -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;
@@ -95,6 +86,7 @@ contract ZrxTreasury is
// solhint-disable // solhint-disable
/// @dev Allows this contract to receive ether. /// @dev Allows this contract to receive ether.
receive() external payable {} receive() external payable {}
// solhint-enable // solhint-enable
/// @dev Updates the proposal and quorum thresholds to the given /// @dev Updates the proposal and quorum thresholds to the given
@@ -103,13 +95,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 +123,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 +135,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
@@ -185,10 +151,7 @@ contract ZrxTreasury is
uint256 proposalId, uint256 proposalId,
bool support, bool support,
bytes32[] memory operatedPoolIds bytes32[] memory operatedPoolIds
) ) public override {
public
override
{
return _castVote(msg.sender, proposalId, support, operatedPoolIds); return _castVote(msg.sender, proposalId, support, operatedPoolIds);
} }
@@ -211,10 +174,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 +188,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 +200,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 +208,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;
} }
@@ -276,39 +224,29 @@ contract ZrxTreasury is
/// @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(address account, bytes32[] memory operatedPoolIds)
public public
override
view view
override
returns (uint256 votingPower) returns (uint256 votingPower)
{ {
uint256 delegatedBalance = stakingProxy.getOwnerStakeByStatus( uint256 delegatedBalance = stakingProxy
account, .getOwnerStakeByStatus(account, IStaking.StakeStatus.DELEGATED)
IStaking.StakeStatus.DELEGATED .currentEpochBalance;
).currentEpochBalance; uint256 balanceDelegatedToDefaultPool = stakingProxy
uint256 balanceDelegatedToDefaultPool = stakingProxy.getStakeDelegatedToPoolByOwner( .getStakeDelegatedToPoolByOwner(account, defaultPoolId)
account, .currentEpochBalance;
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 +260,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 +273,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 +293,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,9 +303,7 @@ 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;
} }
@@ -402,9 +315,7 @@ contract ZrxTreasury is
uint256 proposalId, uint256 proposalId,
bool support, bool support,
bytes32[] memory operatedPoolIds bytes32[] memory operatedPoolIds
) ) private {
private
{
if (proposalId >= proposalCount()) { if (proposalId >= proposalCount()) {
revert("_castVote/INVALID_PROPOSAL_ID"); revert("_castVote/INVALID_PROPOSAL_ID");
} }
@@ -413,10 +324,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 +334,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;
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@0x/contracts-treasury", "name": "@0x/contracts-treasury",
"version": "1.4.16", "version": "1.4.32",
"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: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",
"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.8.0", "@0x/abi-gen": "^5.8.1",
"@0x/contract-addresses": "^6.17.0", "@0x/contract-addresses": "^7.1.0",
"@0x/contracts-asset-proxy": "^3.7.19", "@0x/contracts-asset-proxy": "^3.7.19",
"@0x/contracts-erc20": "^3.3.33", "@0x/contracts-erc20": "^3.3.49",
"@0x/contracts-gen": "^2.0.46", "@0x/contracts-gen": "^2.0.48",
"@0x/contracts-staking": "^2.0.45", "@0x/contracts-staking": "^2.0.45",
"@0x/contracts-test-utils": "^5.4.24", "@0x/contracts-test-utils": "^5.4.39",
"@0x/sol-compiler": "^4.8.1", "@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.6.3" "typescript": "4.6.3"
}, },
"dependencies": { "dependencies": {
"@0x/base-contract": "^6.5.0", "@0x/base-contract": "^7.0.0",
"@0x/protocol-utils": "^11.16.0", "@0x/protocol-utils": "^11.16.16",
"@0x/subproviders": "^6.6.5", "@0x/subproviders": "^7.0.0",
"@0x/types": "^3.3.6", "@0x/types": "^3.3.6",
"@0x/typescript-typings": "^5.3.1", "@0x/typescript-typings": "^5.3.1",
"@0x/utils": "^6.5.3", "@0x/utils": "^7.0.0",
"@0x/web3-wrapper": "^7.6.5", "@0x/web3-wrapper": "^8.0.0",
"ethereum-types": "^3.7.0", "ethereum-types": "^3.7.1",
"ethereumjs-util": "^7.0.10" "ethereumjs-util": "^7.0.10"
}, },
"publishConfig": { "publishConfig": {

View File

@@ -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
View 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": {}
}

View File

@@ -1,4 +1,149 @@
[ [
{
"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, "timestamp": 1658950329,
"version": "4.8.14", "version": "4.8.14",

View File

@@ -5,6 +5,70 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG CHANGELOG
## 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_ ## v4.8.14 - _July 27, 2022_
* Dependencies updated * Dependencies updated

View File

@@ -23,14 +23,10 @@ import "./LibAuthorizableRichErrors.sol";
import "./LibRichErrors.sol"; import "./LibRichErrors.sol";
import "./Ownable.sol"; import "./Ownable.sol";
// solhint-disable no-empty-blocks // solhint-disable no-empty-blocks
contract Authorizable is contract Authorizable is Ownable, IAuthorizable {
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 +34,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 +66,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 +85,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 +104,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];

View File

@@ -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"
);
} }
} }

View File

@@ -18,48 +18,46 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
contract DeploymentConstants { contract DeploymentConstants {
// solhint-disable separate-by-one-line-in-contract // 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.
@@ -153,171 +151,103 @@ contract DeploymentConstants {
/// @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;
} }
} }

View File

@@ -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;
} }
} }

View File

@@ -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)
@@ -134,7 +123,6 @@ library LibAddressArray {
returns (bool success, uint256 index) 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 +131,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)

View File

@@ -18,26 +18,16 @@
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 // solhint-disable func-name-mixedcase
function MismanagedMemoryError( function MismanagedMemoryError(uint256 freeMemPtr, uint256 addressArrayEndPtr)
uint256 freeMemPtr,
uint256 addressArrayEndPtr
)
internal internal
pure pure
returns (bytes memory) returns (bytes memory)
{ {
return abi.encodeWithSelector( return abi.encodeWithSelector(MISMANAGED_MEMORY_ERROR_SELECTOR, freeMemPtr, addressArrayEndPtr);
MISMANAGED_MEMORY_ERROR_SELECTOR,
freeMemPtr,
addressArrayEndPtr
);
} }
} }

View File

@@ -18,102 +18,47 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
library LibAuthorizableRichErrors { library LibAuthorizableRichErrors {
// bytes4(keccak256("AuthorizedAddressMismatchError(address,address)")) // bytes4(keccak256("AuthorizedAddressMismatchError(address,address)"))
bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR = bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR = 0x140a84db;
0x140a84db;
// bytes4(keccak256("IndexOutOfBoundsError(uint256,uint256)")) // bytes4(keccak256("IndexOutOfBoundsError(uint256,uint256)"))
bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR = bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR = 0xe9f83771;
0xe9f83771;
// bytes4(keccak256("SenderNotAuthorizedError(address)")) // bytes4(keccak256("SenderNotAuthorizedError(address)"))
bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR = bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR = 0xb65a25b9;
0xb65a25b9;
// bytes4(keccak256("TargetAlreadyAuthorizedError(address)")) // bytes4(keccak256("TargetAlreadyAuthorizedError(address)"))
bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR = bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR = 0xde16f1a0;
0xde16f1a0;
// bytes4(keccak256("TargetNotAuthorizedError(address)")) // bytes4(keccak256("TargetNotAuthorizedError(address)"))
bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR = bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR = 0xeb5108a2;
0xeb5108a2;
// bytes4(keccak256("ZeroCantBeAuthorizedError()")) // bytes4(keccak256("ZeroCantBeAuthorizedError()"))
bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES = bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES = hex"57654fe4";
hex"57654fe4";
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function AuthorizedAddressMismatchError( function AuthorizedAddressMismatchError(address authorized, address target) internal pure returns (bytes memory) {
address authorized, return abi.encodeWithSelector(AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR, authorized, target);
address target
)
internal
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR,
authorized,
target
);
} }
function IndexOutOfBoundsError( function IndexOutOfBoundsError(uint256 index, uint256 length) internal pure returns (bytes memory) {
uint256 index, return abi.encodeWithSelector(INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR, index, length);
uint256 length
)
internal
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR,
index,
length
);
} }
function SenderNotAuthorizedError(address sender) function SenderNotAuthorizedError(address sender) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(SENDER_NOT_AUTHORIZED_ERROR_SELECTOR, sender);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
SENDER_NOT_AUTHORIZED_ERROR_SELECTOR,
sender
);
} }
function TargetAlreadyAuthorizedError(address target) function TargetAlreadyAuthorizedError(address target) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR, target);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR,
target
);
} }
function TargetNotAuthorizedError(address target) function TargetNotAuthorizedError(address target) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(TARGET_NOT_AUTHORIZED_ERROR_SELECTOR, target);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
TARGET_NOT_AUTHORIZED_ERROR_SELECTOR,
target
);
} }
function ZeroCantBeAuthorizedError() function ZeroCantBeAuthorizedError() internal pure returns (bytes memory) {
internal
pure
returns (bytes memory)
{
return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES; return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES;
} }
} }

View File

@@ -21,9 +21,7 @@ pragma solidity ^0.5.9;
import "./LibBytesRichErrors.sol"; import "./LibBytesRichErrors.sol";
import "./LibRichErrors.sol"; import "./LibRichErrors.sol";
library LibBytes { library LibBytes {
using LibBytes for bytes; using LibBytes for bytes;
/// @dev Gets the memory address for a byte array. /// @dev Gets the memory address for a byte array.
@@ -31,11 +29,7 @@ library LibBytes {
/// @return memoryAddress Memory address of byte array. This /// @return memoryAddress Memory address of byte array. This
/// points to the header of the byte array which contains /// points to the header of the byte array which contains
/// the length. /// the length.
function rawAddress(bytes memory input) function rawAddress(bytes memory input) internal pure returns (uint256 memoryAddress) {
internal
pure
returns (uint256 memoryAddress)
{
assembly { assembly {
memoryAddress := input memoryAddress := input
} }
@@ -45,11 +39,7 @@ library LibBytes {
/// @dev Gets the memory address for the contents of a byte array. /// @dev Gets the memory address for the contents of a byte array.
/// @param input Byte array to lookup. /// @param input Byte array to lookup.
/// @return memoryAddress Memory address of the contents of the byte array. /// @return memoryAddress Memory address of the contents of the byte array.
function contentAddress(bytes memory input) function contentAddress(bytes memory input) internal pure returns (uint256 memoryAddress) {
internal
pure
returns (uint256 memoryAddress)
{
assembly { assembly {
memoryAddress := add(input, 32) memoryAddress := add(input, 32)
} }
@@ -64,10 +54,7 @@ library LibBytes {
uint256 dest, uint256 dest,
uint256 source, uint256 source,
uint256 length uint256 length
) ) internal pure {
internal
pure
{
if (length < 32) { if (length < 32) {
// Handle a partial word by reading destination and masking // Handle a partial word by reading destination and masking
// off the bits we are interested in. // off the bits we are interested in.
@@ -119,7 +106,11 @@ library LibBytes {
// Note: the first check is always true, // Note: the first check is always true,
// this could have been a do-while loop. // this could have been a do-while loop.
// solhint-disable-next-line no-empty-blocks // solhint-disable-next-line no-empty-blocks
for {} lt(source, sEnd) {} { for {
} lt(source, sEnd) {
} {
mstore(dest, mload(source)) mstore(dest, mload(source))
source := add(source, 32) source := add(source, 32)
dest := add(dest, 32) dest := add(dest, 32)
@@ -150,7 +141,11 @@ library LibBytes {
// Note: the first check is always true, // Note: the first check is always true,
// this could have been a do-while loop. // this could have been a do-while loop.
// solhint-disable-next-line no-empty-blocks // solhint-disable-next-line no-empty-blocks
for {} slt(dest, dEnd) {} { for {
} slt(dest, dEnd) {
} {
mstore(dEnd, mload(sEnd)) mstore(dEnd, mload(sEnd))
sEnd := sub(sEnd, 32) sEnd := sub(sEnd, 32)
dEnd := sub(dEnd, 32) dEnd := sub(dEnd, 32)
@@ -172,35 +167,31 @@ library LibBytes {
bytes memory b, bytes memory b,
uint256 from, uint256 from,
uint256 to uint256 to
) ) internal pure returns (bytes memory result) {
internal
pure
returns (bytes memory result)
{
// Ensure that the from and to positions are valid positions for a slice within // Ensure that the from and to positions are valid positions for a slice within
// the byte array that is being used. // the byte array that is being used.
if (from > to) { if (from > to) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired, LibBytesRichErrors.InvalidByteOperationError(
from, LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
to from,
)); to
)
);
} }
if (to > b.length) { if (to > b.length) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired, LibBytesRichErrors.InvalidByteOperationError(
to, LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
b.length to,
)); b.length
)
);
} }
// Create a new bytes structure and copy contents // Create a new bytes structure and copy contents
result = new bytes(to - from); result = new bytes(to - from);
memCopy( memCopy(result.contentAddress(), b.contentAddress() + from, result.length);
result.contentAddress(),
b.contentAddress() + from,
result.length
);
return result; return result;
} }
@@ -214,26 +205,26 @@ library LibBytes {
bytes memory b, bytes memory b,
uint256 from, uint256 from,
uint256 to uint256 to
) ) internal pure returns (bytes memory result) {
internal
pure
returns (bytes memory result)
{
// Ensure that the from and to positions are valid positions for a slice within // Ensure that the from and to positions are valid positions for a slice within
// the byte array that is being used. // the byte array that is being used.
if (from > to) { if (from > to) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired, LibBytesRichErrors.InvalidByteOperationError(
from, LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
to from,
)); to
)
);
} }
if (to > b.length) { if (to > b.length) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired, LibBytesRichErrors.InvalidByteOperationError(
to, LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
b.length to,
)); b.length
)
);
} }
// Create a new bytes structure around [from, to) in-place. // Create a new bytes structure around [from, to) in-place.
@@ -247,17 +238,15 @@ library LibBytes {
/// @dev Pops the last byte off of a byte array by modifying its length. /// @dev Pops the last byte off of a byte array by modifying its length.
/// @param b Byte array that will be modified. /// @param b Byte array that will be modified.
/// @return The byte that was popped off. /// @return The byte that was popped off.
function popLastByte(bytes memory b) function popLastByte(bytes memory b) internal pure returns (bytes1 result) {
internal
pure
returns (bytes1 result)
{
if (b.length == 0) { if (b.length == 0) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired, LibBytesRichErrors.InvalidByteOperationError(
b.length, LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,
0 b.length,
)); 0
)
);
} }
// Store last byte. // Store last byte.
@@ -275,14 +264,7 @@ library LibBytes {
/// @param lhs First byte array to compare. /// @param lhs First byte array to compare.
/// @param rhs Second byte array to compare. /// @param rhs Second byte array to compare.
/// @return True if arrays are the same. False otherwise. /// @return True if arrays are the same. False otherwise.
function equals( function equals(bytes memory lhs, bytes memory rhs) internal pure returns (bool equal) {
bytes memory lhs,
bytes memory rhs
)
internal
pure
returns (bool equal)
{
// Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare. // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.
// We early exit on unequal lengths, but keccak would also correctly // We early exit on unequal lengths, but keccak would also correctly
// handle this. // handle this.
@@ -293,20 +275,15 @@ library LibBytes {
/// @param b Byte array containing an address. /// @param b Byte array containing an address.
/// @param index Index in byte array of address. /// @param index Index in byte array of address.
/// @return address from byte array. /// @return address from byte array.
function readAddress( function readAddress(bytes memory b, uint256 index) internal pure returns (address result) {
bytes memory b,
uint256 index
)
internal
pure
returns (address result)
{
if (b.length < index + 20) { if (b.length < index + 20) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired, LibBytesRichErrors.InvalidByteOperationError(
b.length, LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
index + 20 // 20 is length of address b.length,
)); index + 20 // 20 is length of address
)
);
} }
// Add offset to index: // Add offset to index:
@@ -332,16 +309,15 @@ library LibBytes {
bytes memory b, bytes memory b,
uint256 index, uint256 index,
address input address input
) ) internal pure {
internal
pure
{
if (b.length < index + 20) { if (b.length < index + 20) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired, LibBytesRichErrors.InvalidByteOperationError(
b.length, LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
index + 20 // 20 is length of address b.length,
)); index + 20 // 20 is length of address
)
);
} }
// Add offset to index: // Add offset to index:
@@ -377,20 +353,15 @@ library LibBytes {
/// @param b Byte array containing a bytes32 value. /// @param b Byte array containing a bytes32 value.
/// @param index Index in byte array of bytes32 value. /// @param index Index in byte array of bytes32 value.
/// @return bytes32 value from byte array. /// @return bytes32 value from byte array.
function readBytes32( function readBytes32(bytes memory b, uint256 index) internal pure returns (bytes32 result) {
bytes memory b,
uint256 index
)
internal
pure
returns (bytes32 result)
{
if (b.length < index + 32) { if (b.length < index + 32) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired, LibBytesRichErrors.InvalidByteOperationError(
b.length, LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
index + 32 b.length,
)); index + 32
)
);
} }
// Arrays are prefixed by a 256 bit length parameter // Arrays are prefixed by a 256 bit length parameter
@@ -411,16 +382,15 @@ library LibBytes {
bytes memory b, bytes memory b,
uint256 index, uint256 index,
bytes32 input bytes32 input
) ) internal pure {
internal
pure
{
if (b.length < index + 32) { if (b.length < index + 32) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired, LibBytesRichErrors.InvalidByteOperationError(
b.length, LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
index + 32 b.length,
)); index + 32
)
);
} }
// Arrays are prefixed by a 256 bit length parameter // Arrays are prefixed by a 256 bit length parameter
@@ -436,14 +406,7 @@ library LibBytes {
/// @param b Byte array containing a uint256 value. /// @param b Byte array containing a uint256 value.
/// @param index Index in byte array of uint256 value. /// @param index Index in byte array of uint256 value.
/// @return uint256 value from byte array. /// @return uint256 value from byte array.
function readUint256( function readUint256(bytes memory b, uint256 index) internal pure returns (uint256 result) {
bytes memory b,
uint256 index
)
internal
pure
returns (uint256 result)
{
result = uint256(readBytes32(b, index)); result = uint256(readBytes32(b, index));
return result; return result;
} }
@@ -456,10 +419,7 @@ library LibBytes {
bytes memory b, bytes memory b,
uint256 index, uint256 index,
uint256 input uint256 input
) ) internal pure {
internal
pure
{
writeBytes32(b, index, bytes32(input)); writeBytes32(b, index, bytes32(input));
} }
@@ -467,20 +427,15 @@ library LibBytes {
/// @param b Byte array containing a bytes4 value. /// @param b Byte array containing a bytes4 value.
/// @param index Index in byte array of bytes4 value. /// @param index Index in byte array of bytes4 value.
/// @return bytes4 value from byte array. /// @return bytes4 value from byte array.
function readBytes4( function readBytes4(bytes memory b, uint256 index) internal pure returns (bytes4 result) {
bytes memory b,
uint256 index
)
internal
pure
returns (bytes4 result)
{
if (b.length < index + 4) { if (b.length < index + 4) {
LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibRichErrors.rrevert(
LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired, LibBytesRichErrors.InvalidByteOperationError(
b.length, LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,
index + 4 b.length,
)); index + 4
)
);
} }
// Arrays are prefixed by a 32 byte length field // Arrays are prefixed by a 32 byte length field
@@ -501,10 +456,7 @@ library LibBytes {
/// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array. /// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.
/// @param b Bytes array to write new length to. /// @param b Bytes array to write new length to.
/// @param length New length of byte array. /// @param length New length of byte array.
function writeLength(bytes memory b, uint256 length) function writeLength(bytes memory b, uint256 length) internal pure {
internal
pure
{
assembly { assembly {
mstore(b, length) mstore(b, length)
} }

View File

@@ -18,9 +18,7 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
library LibBytesRichErrors { library LibBytesRichErrors {
enum InvalidByteOperationErrorCodes { enum InvalidByteOperationErrorCodes {
FromLessThanOrEqualsToRequired, FromLessThanOrEqualsToRequired,
ToLessThanOrEqualsLengthRequired, ToLessThanOrEqualsLengthRequired,
@@ -33,24 +31,14 @@ library LibBytesRichErrors {
} }
// bytes4(keccak256("InvalidByteOperationError(uint8,uint256,uint256)")) // bytes4(keccak256("InvalidByteOperationError(uint8,uint256,uint256)"))
bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR = bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR = 0x28006595;
0x28006595;
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function InvalidByteOperationError( function InvalidByteOperationError(
InvalidByteOperationErrorCodes errorCode, InvalidByteOperationErrorCodes errorCode,
uint256 offset, uint256 offset,
uint256 required uint256 required
) ) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(INVALID_BYTE_OPERATION_ERROR_SELECTOR, errorCode, offset, required);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
INVALID_BYTE_OPERATION_ERROR_SELECTOR,
errorCode,
offset,
required
);
} }
} }

View File

@@ -18,10 +18,8 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
contract LibEIP1271 { contract LibEIP1271 {
/// @dev Magic bytes returned by EIP1271 wallets on success. /// @dev Magic bytes returned by EIP1271 wallets on success.
/// @return 0 Magic bytes. /// @return 0 Magic bytes.
bytes4 constant public EIP1271_MAGIC_VALUE = 0x20c13b0b; bytes4 public constant EIP1271_MAGIC_VALUE = 0x20c13b0b;
} }

View File

@@ -18,9 +18,7 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
library LibEIP712 { library LibEIP712 {
// Hash of the EIP712 Domain Separator Schema // Hash of the EIP712 Domain Separator Schema
// keccak256(abi.encodePacked( // keccak256(abi.encodePacked(
// "EIP712Domain(", // "EIP712Domain(",
@@ -30,7 +28,8 @@ library LibEIP712 {
// "address verifyingContract", // "address verifyingContract",
// ")" // ")"
// )) // ))
bytes32 constant internal _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; bytes32 internal constant _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH =
0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;
/// @dev Calculates a EIP712 domain separator. /// @dev Calculates a EIP712 domain separator.
/// @param name The EIP712 domain name. /// @param name The EIP712 domain name.
@@ -42,11 +41,7 @@ library LibEIP712 {
string memory version, string memory version,
uint256 chainId, uint256 chainId,
address verifyingContract address verifyingContract
) ) internal pure returns (bytes32 result) {
internal
pure
returns (bytes32 result)
{
bytes32 schemaHash = _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH; bytes32 schemaHash = _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;
// Assembly for more efficient computing: // Assembly for more efficient computing:
@@ -84,11 +79,7 @@ library LibEIP712 {
/// with getDomainHash(). /// with getDomainHash().
/// @param hashStruct The EIP712 hash struct. /// @param hashStruct The EIP712 hash struct.
/// @return EIP712 hash applied to the given EIP712 Domain. /// @return EIP712 hash applied to the given EIP712 Domain.
function hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct) function hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct) internal pure returns (bytes32 result) {
internal
pure
returns (bytes32 result)
{
// Assembly for more efficient computing: // Assembly for more efficient computing:
// keccak256(abi.encodePacked( // keccak256(abi.encodePacked(
// EIP191_HEADER, // EIP191_HEADER,
@@ -100,9 +91,9 @@ library LibEIP712 {
// Load free memory pointer // Load free memory pointer
let memPtr := mload(64) let memPtr := mload(64)
mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header
mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash
mstore(add(memPtr, 34), hashStruct) // Hash of struct mstore(add(memPtr, 34), hashStruct) // Hash of struct
// Compute hash // Compute hash
result := keccak256(memPtr, 66) result := keccak256(memPtr, 66)

View File

@@ -2,9 +2,7 @@ pragma solidity ^0.5.9;
import "./LibSafeMath.sol"; import "./LibSafeMath.sol";
library LibFractions { library LibFractions {
using LibSafeMath for uint256; using LibSafeMath for uint256;
/// @dev Safely adds two fractions `n1/d1 + n2/d2` /// @dev Safely adds two fractions `n1/d1 + n2/d2`
@@ -19,23 +17,14 @@ library LibFractions {
uint256 d1, uint256 d1,
uint256 n2, uint256 n2,
uint256 d2 uint256 d2
) ) internal pure returns (uint256 numerator, uint256 denominator) {
internal
pure
returns (
uint256 numerator,
uint256 denominator
)
{
if (n1 == 0) { if (n1 == 0) {
return (numerator = n2, denominator = d2); return (numerator = n2, denominator = d2);
} }
if (n2 == 0) { if (n2 == 0) {
return (numerator = n1, denominator = d1); return (numerator = n1, denominator = d1);
} }
numerator = n1 numerator = n1.safeMul(d2).safeAdd(n2.safeMul(d1));
.safeMul(d2)
.safeAdd(n2.safeMul(d1));
denominator = d1.safeMul(d2); denominator = d1.safeMul(d2);
return (numerator, denominator); return (numerator, denominator);
} }
@@ -52,14 +41,7 @@ library LibFractions {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 maxValue uint256 maxValue
) ) internal pure returns (uint256 scaledNumerator, uint256 scaledDenominator) {
internal
pure
returns (
uint256 scaledNumerator,
uint256 scaledDenominator
)
{
// If either the numerator or the denominator are > `maxValue`, // If either the numerator or the denominator are > `maxValue`,
// re-scale them by `maxValue` to prevent overflows in future operations. // re-scale them by `maxValue` to prevent overflows in future operations.
if (numerator > maxValue || denominator > maxValue) { if (numerator > maxValue || denominator > maxValue) {
@@ -80,18 +62,12 @@ library LibFractions {
/// @param denominator The denominator. /// @param denominator The denominator.
/// @return scaledNumerator The rescaled numerator. /// @return scaledNumerator The rescaled numerator.
/// @return scaledDenominator The rescaled denominator. /// @return scaledDenominator The rescaled denominator.
function normalize( function normalize(uint256 numerator, uint256 denominator)
uint256 numerator,
uint256 denominator
)
internal internal
pure pure
returns ( returns (uint256 scaledNumerator, uint256 scaledDenominator)
uint256 scaledNumerator,
uint256 scaledDenominator
)
{ {
return normalize(numerator, denominator, 2 ** 127); return normalize(numerator, denominator, 2**127);
} }
/// @dev Safely scales the difference between two fractions. /// @dev Safely scales the difference between two fractions.
@@ -107,25 +83,15 @@ library LibFractions {
uint256 n2, uint256 n2,
uint256 d2, uint256 d2,
uint256 s uint256 s
) ) internal pure returns (uint256 result) {
internal
pure
returns (uint256 result)
{
if (s == 0) { if (s == 0) {
return 0; return 0;
} }
if (n2 == 0) { if (n2 == 0) {
return result = s return result = s.safeMul(n1).safeDiv(d1);
.safeMul(n1)
.safeDiv(d1);
} }
uint256 numerator = n1 uint256 numerator = n1.safeMul(d2).safeSub(n2.safeMul(d1));
.safeMul(d2)
.safeSub(n2.safeMul(d1));
uint256 tmp = numerator.safeDiv(d2); uint256 tmp = numerator.safeDiv(d2);
return s return s.safeMul(tmp).safeDiv(d1);
.safeMul(tmp)
.safeDiv(d1);
} }
} }

View File

@@ -22,9 +22,7 @@ import "./LibSafeMath.sol";
import "./LibRichErrors.sol"; import "./LibRichErrors.sol";
import "./LibMathRichErrors.sol"; import "./LibMathRichErrors.sol";
library LibMath { library LibMath {
using LibSafeMath for uint256; using LibSafeMath for uint256;
/// @dev Calculates partial value given a numerator and denominator rounded down. /// @dev Calculates partial value given a numerator and denominator rounded down.
@@ -37,21 +35,9 @@ library LibMath {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (uint256 partialAmount) {
internal if (isRoundingErrorFloor(numerator, denominator, target)) {
pure LibRichErrors.rrevert(LibMathRichErrors.RoundingError(numerator, denominator, target));
returns (uint256 partialAmount)
{
if (isRoundingErrorFloor(
numerator,
denominator,
target
)) {
LibRichErrors.rrevert(LibMathRichErrors.RoundingError(
numerator,
denominator,
target
));
} }
partialAmount = numerator.safeMul(target).safeDiv(denominator); partialAmount = numerator.safeMul(target).safeDiv(denominator);
@@ -68,29 +54,15 @@ library LibMath {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (uint256 partialAmount) {
internal if (isRoundingErrorCeil(numerator, denominator, target)) {
pure LibRichErrors.rrevert(LibMathRichErrors.RoundingError(numerator, denominator, target));
returns (uint256 partialAmount)
{
if (isRoundingErrorCeil(
numerator,
denominator,
target
)) {
LibRichErrors.rrevert(LibMathRichErrors.RoundingError(
numerator,
denominator,
target
));
} }
// safeDiv computes `floor(a / b)`. We use the identity (a, b integer): // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):
// ceil(a / b) = floor((a + b - 1) / b) // ceil(a / b) = floor((a + b - 1) / b)
// To implement `ceil(a / b)` using safeDiv. // To implement `ceil(a / b)` using safeDiv.
partialAmount = numerator.safeMul(target) partialAmount = numerator.safeMul(target).safeAdd(denominator.safeSub(1)).safeDiv(denominator);
.safeAdd(denominator.safeSub(1))
.safeDiv(denominator);
return partialAmount; return partialAmount;
} }
@@ -104,11 +76,7 @@ library LibMath {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (uint256 partialAmount) {
internal
pure
returns (uint256 partialAmount)
{
partialAmount = numerator.safeMul(target).safeDiv(denominator); partialAmount = numerator.safeMul(target).safeDiv(denominator);
return partialAmount; return partialAmount;
} }
@@ -122,17 +90,11 @@ library LibMath {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (uint256 partialAmount) {
internal
pure
returns (uint256 partialAmount)
{
// safeDiv computes `floor(a / b)`. We use the identity (a, b integer): // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):
// ceil(a / b) = floor((a + b - 1) / b) // ceil(a / b) = floor((a + b - 1) / b)
// To implement `ceil(a / b)` using safeDiv. // To implement `ceil(a / b)` using safeDiv.
partialAmount = numerator.safeMul(target) partialAmount = numerator.safeMul(target).safeAdd(denominator.safeSub(1)).safeDiv(denominator);
.safeAdd(denominator.safeSub(1))
.safeDiv(denominator);
return partialAmount; return partialAmount;
} }
@@ -146,11 +108,7 @@ library LibMath {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (bool isError) {
internal
pure
returns (bool isError)
{
if (denominator == 0) { if (denominator == 0) {
LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError()); LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());
} }
@@ -181,11 +139,7 @@ library LibMath {
// 1000 * remainder < numerator * target // 1000 * remainder < numerator * target
// so we have a rounding error iff: // so we have a rounding error iff:
// 1000 * remainder >= numerator * target // 1000 * remainder >= numerator * target
uint256 remainder = mulmod( uint256 remainder = mulmod(target, numerator, denominator);
target,
numerator,
denominator
);
isError = remainder.safeMul(1000) >= numerator.safeMul(target); isError = remainder.safeMul(1000) >= numerator.safeMul(target);
return isError; return isError;
} }
@@ -199,11 +153,7 @@ library LibMath {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (bool isError) {
internal
pure
returns (bool isError)
{
if (denominator == 0) { if (denominator == 0) {
LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError()); LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());
} }
@@ -216,11 +166,7 @@ library LibMath {
return false; return false;
} }
// Compute remainder as before // Compute remainder as before
uint256 remainder = mulmod( uint256 remainder = mulmod(target, numerator, denominator);
target,
numerator,
denominator
);
remainder = denominator.safeSub(remainder) % denominator; remainder = denominator.safeSub(remainder) % denominator;
isError = remainder.safeMul(1000) >= numerator.safeMul(target); isError = remainder.safeMul(1000) >= numerator.safeMul(target);
return isError; return isError;

View File

@@ -1,22 +1,14 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
library LibMathRichErrors { library LibMathRichErrors {
// bytes4(keccak256("DivisionByZeroError()")) // bytes4(keccak256("DivisionByZeroError()"))
bytes internal constant DIVISION_BY_ZERO_ERROR = bytes internal constant DIVISION_BY_ZERO_ERROR = hex"a791837c";
hex"a791837c";
// bytes4(keccak256("RoundingError(uint256,uint256,uint256)")) // bytes4(keccak256("RoundingError(uint256,uint256,uint256)"))
bytes4 internal constant ROUNDING_ERROR_SELECTOR = bytes4 internal constant ROUNDING_ERROR_SELECTOR = 0x339f3de2;
0x339f3de2;
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function DivisionByZeroError() function DivisionByZeroError() internal pure returns (bytes memory) {
internal
pure
returns (bytes memory)
{
return DIVISION_BY_ZERO_ERROR; return DIVISION_BY_ZERO_ERROR;
} }
@@ -24,16 +16,7 @@ library LibMathRichErrors {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(ROUNDING_ERROR_SELECTOR, numerator, denominator, target);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
ROUNDING_ERROR_SELECTOR,
numerator,
denominator,
target
);
} }
} }

View File

@@ -1,37 +1,18 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
library LibOwnableRichErrors { library LibOwnableRichErrors {
// bytes4(keccak256("OnlyOwnerError(address,address)")) // bytes4(keccak256("OnlyOwnerError(address,address)"))
bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR = bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR = 0x1de45ad1;
0x1de45ad1;
// bytes4(keccak256("TransferOwnerToZeroError()")) // bytes4(keccak256("TransferOwnerToZeroError()"))
bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES = bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES = hex"e69edc3e";
hex"e69edc3e";
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function OnlyOwnerError( function OnlyOwnerError(address sender, address owner) internal pure returns (bytes memory) {
address sender, return abi.encodeWithSelector(ONLY_OWNER_ERROR_SELECTOR, sender, owner);
address owner
)
internal
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
ONLY_OWNER_ERROR_SELECTOR,
sender,
owner
);
} }
function TransferOwnerToZeroError() function TransferOwnerToZeroError() internal pure returns (bytes memory) {
internal
pure
returns (bytes memory)
{
return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES; return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES;
} }
} }

View File

@@ -18,19 +18,12 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
library LibReentrancyGuardRichErrors { library LibReentrancyGuardRichErrors {
// bytes4(keccak256("IllegalReentrancyError()")) // bytes4(keccak256("IllegalReentrancyError()"))
bytes internal constant ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES = bytes internal constant ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES = hex"0c3b823f";
hex"0c3b823f";
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function IllegalReentrancyError() function IllegalReentrancyError() internal pure returns (bytes memory) {
internal
pure
returns (bytes memory)
{
return ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES; return ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES;
} }
} }

View File

@@ -18,12 +18,9 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
library LibRichErrors { library LibRichErrors {
// bytes4(keccak256("Error(string)")) // bytes4(keccak256("Error(string)"))
bytes4 internal constant STANDARD_ERROR_SELECTOR = bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0;
0x08c379a0;
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
/// @dev ABI encode a standard, string revert error payload. /// @dev ABI encode a standard, string revert error payload.
@@ -31,26 +28,15 @@ library LibRichErrors {
/// solidity statement. It has the function signature `Error(string)`. /// solidity statement. It has the function signature `Error(string)`.
/// @param message The error string. /// @param message The error string.
/// @return The ABI encoded error. /// @return The ABI encoded error.
function StandardError( function StandardError(string memory message) internal pure returns (bytes memory) {
string memory message return abi.encodeWithSelector(STANDARD_ERROR_SELECTOR, bytes(message));
)
internal
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
STANDARD_ERROR_SELECTOR,
bytes(message)
);
} }
// solhint-enable func-name-mixedcase // solhint-enable func-name-mixedcase
/// @dev Reverts an encoded rich revert reason `errorData`. /// @dev Reverts an encoded rich revert reason `errorData`.
/// @param errorData ABI encoded error data. /// @param errorData ABI encoded error data.
function rrevert(bytes memory errorData) function rrevert(bytes memory errorData) internal pure {
internal
pure
{
assembly { assembly {
revert(add(errorData, 0x20), mload(errorData)) revert(add(errorData, 0x20), mload(errorData))
} }

View File

@@ -3,88 +3,62 @@ pragma solidity ^0.5.9;
import "./LibRichErrors.sol"; import "./LibRichErrors.sol";
import "./LibSafeMathRichErrors.sol"; import "./LibSafeMathRichErrors.sol";
library LibSafeMath { library LibSafeMath {
function safeMul(uint256 a, uint256 b) internal pure returns (uint256) {
function safeMul(uint256 a, uint256 b)
internal
pure
returns (uint256)
{
if (a == 0) { if (a == 0) {
return 0; return 0;
} }
uint256 c = a * b; uint256 c = a * b;
if (c / a != b) { if (c / a != b) {
LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError( LibRichErrors.rrevert(
LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW, LibSafeMathRichErrors.Uint256BinOpError(
a, LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,
b a,
)); b
)
);
} }
return c; return c;
} }
function safeDiv(uint256 a, uint256 b) function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
if (b == 0) { if (b == 0) {
LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError( LibRichErrors.rrevert(
LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO, LibSafeMathRichErrors.Uint256BinOpError(LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO, a, b)
a, );
b
));
} }
uint256 c = a / b; uint256 c = a / b;
return c; return c;
} }
function safeSub(uint256 a, uint256 b) function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
if (b > a) { if (b > a) {
LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError( LibRichErrors.rrevert(
LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW, LibSafeMathRichErrors.Uint256BinOpError(
a, LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,
b a,
)); b
)
);
} }
return a - b; return a - b;
} }
function safeAdd(uint256 a, uint256 b) function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
uint256 c = a + b; uint256 c = a + b;
if (c < a) { if (c < a) {
LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError( LibRichErrors.rrevert(
LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW, LibSafeMathRichErrors.Uint256BinOpError(LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW, a, b)
a, );
b
));
} }
return c; return c;
} }
function max256(uint256 a, uint256 b) function max256(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
return a >= b ? a : b; return a >= b ? a : b;
} }
function min256(uint256 a, uint256 b) function min256(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
return a < b ? a : b; return a < b ? a : b;
} }
} }

View File

@@ -1,15 +1,11 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
library LibSafeMathRichErrors { library LibSafeMathRichErrors {
// bytes4(keccak256("Uint256BinOpError(uint8,uint256,uint256)")) // bytes4(keccak256("Uint256BinOpError(uint8,uint256,uint256)"))
bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR = bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR = 0xe946c1bb;
0xe946c1bb;
// bytes4(keccak256("Uint256DowncastError(uint8,uint256)")) // bytes4(keccak256("Uint256DowncastError(uint8,uint256)"))
bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR = bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR = 0xc996af7b;
0xc996af7b;
enum BinOpErrorCodes { enum BinOpErrorCodes {
ADDITION_OVERFLOW, ADDITION_OVERFLOW,
@@ -29,31 +25,11 @@ library LibSafeMathRichErrors {
BinOpErrorCodes errorCode, BinOpErrorCodes errorCode,
uint256 a, uint256 a,
uint256 b uint256 b
) ) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(UINT256_BINOP_ERROR_SELECTOR, errorCode, a, b);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
UINT256_BINOP_ERROR_SELECTOR,
errorCode,
a,
b
);
} }
function Uint256DowncastError( function Uint256DowncastError(DowncastErrorCodes errorCode, uint256 a) internal pure returns (bytes memory) {
DowncastErrorCodes errorCode, return abi.encodeWithSelector(UINT256_DOWNCAST_ERROR_SELECTOR, errorCode, a);
uint256 a
)
internal
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
UINT256_DOWNCAST_ERROR_SELECTOR,
errorCode,
a
);
} }
} }

View File

@@ -22,17 +22,12 @@ import "./interfaces/IOwnable.sol";
import "./LibOwnableRichErrors.sol"; import "./LibOwnableRichErrors.sol";
import "./LibRichErrors.sol"; import "./LibRichErrors.sol";
contract Ownable is IOwnable {
contract Ownable is
IOwnable
{
/// @dev The owner of this contract. /// @dev The owner of this contract.
/// @return 0 The owner address. /// @return 0 The owner address.
address public owner; address public owner;
constructor () constructor() public {
public
{
owner = msg.sender; owner = msg.sender;
} }
@@ -43,10 +38,7 @@ contract Ownable is
/// @dev Change the owner of this contract. /// @dev Change the owner of this contract.
/// @param newOwner New owner address. /// @param newOwner New owner address.
function transferOwnership(address newOwner) function transferOwnership(address newOwner) public onlyOwner {
public
onlyOwner
{
if (newOwner == address(0)) { if (newOwner == address(0)) {
LibRichErrors.rrevert(LibOwnableRichErrors.TransferOwnerToZeroError()); LibRichErrors.rrevert(LibOwnableRichErrors.TransferOwnerToZeroError());
} else { } else {
@@ -55,15 +47,9 @@ contract Ownable is
} }
} }
function _assertSenderIsOwner() function _assertSenderIsOwner() internal view {
internal
view
{
if (msg.sender != owner) { if (msg.sender != owner) {
LibRichErrors.rrevert(LibOwnableRichErrors.OnlyOwnerError( LibRichErrors.rrevert(LibOwnableRichErrors.OnlyOwnerError(msg.sender, owner));
msg.sender,
owner
));
} }
} }
} }

View File

@@ -21,9 +21,7 @@ pragma solidity ^0.5.9;
import "./LibReentrancyGuardRichErrors.sol"; import "./LibReentrancyGuardRichErrors.sol";
import "./LibRichErrors.sol"; import "./LibRichErrors.sol";
contract ReentrancyGuard { contract ReentrancyGuard {
// Locked state of mutex. // Locked state of mutex.
bool private _locked = false; bool private _locked = false;
@@ -35,22 +33,16 @@ contract ReentrancyGuard {
_unlockMutex(); _unlockMutex();
} }
function _lockMutexOrThrowIfAlreadyLocked() function _lockMutexOrThrowIfAlreadyLocked() internal {
internal
{
// Ensure mutex is unlocked. // Ensure mutex is unlocked.
if (_locked) { if (_locked) {
LibRichErrors.rrevert( LibRichErrors.rrevert(LibReentrancyGuardRichErrors.IllegalReentrancyError());
LibReentrancyGuardRichErrors.IllegalReentrancyError()
);
} }
// Lock mutex. // Lock mutex.
_locked = true; _locked = true;
} }
function _unlockMutex() function _unlockMutex() internal {
internal
{
// Unlock mutex. // Unlock mutex.
_locked = false; _locked = false;
} }

View File

@@ -20,27 +20,23 @@ pragma solidity ^0.5.9;
import "./ReentrancyGuard.sol"; import "./ReentrancyGuard.sol";
contract Refundable is ReentrancyGuard {
contract Refundable is
ReentrancyGuard
{
// This bool is used by the refund modifier to allow for lazily evaluated refunds. // This bool is used by the refund modifier to allow for lazily evaluated refunds.
bool internal _shouldNotRefund; bool internal _shouldNotRefund;
modifier refundFinalBalance { modifier refundFinalBalance() {
_; _;
_refundNonZeroBalanceIfEnabled(); _refundNonZeroBalanceIfEnabled();
} }
modifier refundFinalBalanceNoReentry { modifier refundFinalBalanceNoReentry() {
_lockMutexOrThrowIfAlreadyLocked(); _lockMutexOrThrowIfAlreadyLocked();
_; _;
_refundNonZeroBalanceIfEnabled(); _refundNonZeroBalanceIfEnabled();
_unlockMutex(); _unlockMutex();
} }
modifier disableRefundUntilEnd { modifier disableRefundUntilEnd() {
if (_areRefundsDisabled()) { if (_areRefundsDisabled()) {
_; _;
} else { } else {
@@ -50,41 +46,29 @@ contract Refundable is
} }
} }
function _refundNonZeroBalanceIfEnabled() function _refundNonZeroBalanceIfEnabled() internal {
internal
{
if (!_areRefundsDisabled()) { if (!_areRefundsDisabled()) {
_refundNonZeroBalance(); _refundNonZeroBalance();
} }
} }
function _refundNonZeroBalance() function _refundNonZeroBalance() internal {
internal
{
uint256 balance = address(this).balance; uint256 balance = address(this).balance;
if (balance > 0) { if (balance > 0) {
msg.sender.transfer(balance); msg.sender.transfer(balance);
} }
} }
function _disableRefund() function _disableRefund() internal {
internal
{
_shouldNotRefund = true; _shouldNotRefund = true;
} }
function _enableAndRefundNonZeroBalance() function _enableAndRefundNonZeroBalance() internal {
internal
{
_shouldNotRefund = false; _shouldNotRefund = false;
_refundNonZeroBalance(); _refundNonZeroBalance();
} }
function _areRefundsDisabled() function _areRefundsDisabled() internal view returns (bool) {
internal
view
returns (bool)
{
return _shouldNotRefund; return _shouldNotRefund;
} }
} }

View File

@@ -20,45 +20,27 @@ pragma solidity ^0.5.9;
import "./IOwnable.sol"; import "./IOwnable.sol";
contract IAuthorizable is IOwnable {
contract IAuthorizable is
IOwnable
{
// Event logged when a new address is authorized. // Event logged when a new address is authorized.
event AuthorizedAddressAdded( event AuthorizedAddressAdded(address indexed target, address indexed caller);
address indexed target,
address indexed caller
);
// Event logged when a currently authorized address is unauthorized. // Event logged when a currently authorized address is unauthorized.
event AuthorizedAddressRemoved( event AuthorizedAddressRemoved(address indexed target, address indexed caller);
address indexed target,
address indexed caller
);
/// @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;
external;
/// @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;
external;
/// @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;
address target,
uint256 index
)
external;
/// @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);
} }

View File

@@ -18,9 +18,7 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
contract IOwnable { contract IOwnable {
/// @dev Emitted by Ownable when ownership is transferred. /// @dev Emitted by Ownable when ownership is transferred.
/// @param previousOwner The previous owner of the contract. /// @param previousOwner The previous owner of the contract.
/// @param newOwner The new owner of the contract. /// @param newOwner The new owner of the contract.
@@ -28,6 +26,5 @@ contract IOwnable {
/// @dev Transfers ownership of the contract to a new address. /// @dev Transfers ownership of the contract to a new address.
/// @param newOwner The address that will become the owner. /// @param newOwner The address that will become the owner.
function transferOwnership(address newOwner) function transferOwnership(address newOwner) public;
public;
} }

View File

@@ -24,14 +24,10 @@ import "./errors/LibRichErrorsV06.sol";
import "./errors/LibAuthorizableRichErrorsV06.sol"; import "./errors/LibAuthorizableRichErrorsV06.sol";
import "./OwnableV06.sol"; import "./OwnableV06.sol";
// solhint-disable no-empty-blocks // solhint-disable no-empty-blocks
contract AuthorizableV06 is contract AuthorizableV06 is OwnableV06, IAuthorizableV06 {
OwnableV06,
IAuthorizableV06
{
/// @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();
_; _;
} }
@@ -39,35 +35,24 @@ contract AuthorizableV06 is
// @dev Whether an address is authorized to call privileged functions. // @dev Whether an address 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 override authorized; mapping(address => bool) public override authorized;
// @dev Whether an address is authorized to call privileged functions. // @dev Whether an address 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 override authorities; address[] public override authorities;
/// @dev Initializes the `owner` address. /// @dev Initializes the `owner` address.
constructor() constructor() public OwnableV06() {}
public
OwnableV06()
{}
/// @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 override onlyOwner {
external
override
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 override onlyOwner {
external
override
onlyOwner
{
if (!authorized[target]) { if (!authorized[target]) {
LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetNotAuthorizedError(target)); LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetNotAuthorizedError(target));
} }
@@ -82,33 +67,18 @@ contract AuthorizableV06 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 override onlyOwner {
address target,
uint256 index
)
external
override
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 override returns (address[] memory) {
external
override
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]) {
LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.SenderNotAuthorizedError(msg.sender)); LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.SenderNotAuthorizedError(msg.sender));
} }
@@ -116,9 +86,7 @@ contract AuthorizableV06 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)) {
LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.ZeroCantBeAuthorizedError()); LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.ZeroCantBeAuthorizedError());
@@ -137,26 +105,17 @@ contract AuthorizableV06 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]) {
LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetNotAuthorizedError(target)); LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetNotAuthorizedError(target));
} }
if (index >= authorities.length) { if (index >= authorities.length) {
LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.IndexOutOfBoundsError( LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.IndexOutOfBoundsError(index, authorities.length));
index,
authorities.length
));
} }
if (authorities[index] != target) { if (authorities[index] != target) {
LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.AuthorizedAddressMismatchError( LibRichErrorsV06.rrevert(
authorities[index], LibAuthorizableRichErrorsV06.AuthorizedAddressMismatchError(authorities[index], target)
target );
));
} }
delete authorized[target]; delete authorized[target];

View File

@@ -22,9 +22,7 @@ pragma solidity ^0.6.5;
import "./errors/LibBytesRichErrorsV06.sol"; import "./errors/LibBytesRichErrorsV06.sol";
import "./errors/LibRichErrorsV06.sol"; import "./errors/LibRichErrorsV06.sol";
library LibBytesV06 { library LibBytesV06 {
using LibBytesV06 for bytes; using LibBytesV06 for bytes;
/// @dev Gets the memory address for a byte array. /// @dev Gets the memory address for a byte array.
@@ -32,11 +30,7 @@ library LibBytesV06 {
/// @return memoryAddress Memory address of byte array. This /// @return memoryAddress Memory address of byte array. This
/// points to the header of the byte array which contains /// points to the header of the byte array which contains
/// the length. /// the length.
function rawAddress(bytes memory input) function rawAddress(bytes memory input) internal pure returns (uint256 memoryAddress) {
internal
pure
returns (uint256 memoryAddress)
{
assembly { assembly {
memoryAddress := input memoryAddress := input
} }
@@ -46,11 +40,7 @@ library LibBytesV06 {
/// @dev Gets the memory address for the contents of a byte array. /// @dev Gets the memory address for the contents of a byte array.
/// @param input Byte array to lookup. /// @param input Byte array to lookup.
/// @return memoryAddress Memory address of the contents of the byte array. /// @return memoryAddress Memory address of the contents of the byte array.
function contentAddress(bytes memory input) function contentAddress(bytes memory input) internal pure returns (uint256 memoryAddress) {
internal
pure
returns (uint256 memoryAddress)
{
assembly { assembly {
memoryAddress := add(input, 32) memoryAddress := add(input, 32)
} }
@@ -65,10 +55,7 @@ library LibBytesV06 {
uint256 dest, uint256 dest,
uint256 source, uint256 source,
uint256 length uint256 length
) ) internal pure {
internal
pure
{
if (length < 32) { if (length < 32) {
// Handle a partial word by reading destination and masking // Handle a partial word by reading destination and masking
// off the bits we are interested in. // off the bits we are interested in.
@@ -120,7 +107,11 @@ library LibBytesV06 {
// Note: the first check is always true, // Note: the first check is always true,
// this could have been a do-while loop. // this could have been a do-while loop.
// solhint-disable-next-line no-empty-blocks // solhint-disable-next-line no-empty-blocks
for {} lt(source, sEnd) {} { for {
} lt(source, sEnd) {
} {
mstore(dest, mload(source)) mstore(dest, mload(source))
source := add(source, 32) source := add(source, 32)
dest := add(dest, 32) dest := add(dest, 32)
@@ -151,7 +142,11 @@ library LibBytesV06 {
// Note: the first check is always true, // Note: the first check is always true,
// this could have been a do-while loop. // this could have been a do-while loop.
// solhint-disable-next-line no-empty-blocks // solhint-disable-next-line no-empty-blocks
for {} slt(dest, dEnd) {} { for {
} slt(dest, dEnd) {
} {
mstore(dEnd, mload(sEnd)) mstore(dEnd, mload(sEnd))
sEnd := sub(sEnd, 32) sEnd := sub(sEnd, 32)
dEnd := sub(dEnd, 32) dEnd := sub(dEnd, 32)
@@ -173,35 +168,31 @@ library LibBytesV06 {
bytes memory b, bytes memory b,
uint256 from, uint256 from,
uint256 to uint256 to
) ) internal pure returns (bytes memory result) {
internal
pure
returns (bytes memory result)
{
// Ensure that the from and to positions are valid positions for a slice within // Ensure that the from and to positions are valid positions for a slice within
// the byte array that is being used. // the byte array that is being used.
if (from > to) { if (from > to) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
from, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
to from,
)); to
)
);
} }
if (to > b.length) { if (to > b.length) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
to, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
b.length to,
)); b.length
)
);
} }
// Create a new bytes structure and copy contents // Create a new bytes structure and copy contents
result = new bytes(to - from); result = new bytes(to - from);
memCopy( memCopy(result.contentAddress(), b.contentAddress() + from, result.length);
result.contentAddress(),
b.contentAddress() + from,
result.length
);
return result; return result;
} }
@@ -216,26 +207,26 @@ library LibBytesV06 {
bytes memory b, bytes memory b,
uint256 from, uint256 from,
uint256 to uint256 to
) ) internal pure returns (bytes memory result) {
internal
pure
returns (bytes memory result)
{
// Ensure that the from and to positions are valid positions for a slice within // Ensure that the from and to positions are valid positions for a slice within
// the byte array that is being used. // the byte array that is being used.
if (from > to) { if (from > to) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
from, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
to from,
)); to
)
);
} }
if (to > b.length) { if (to > b.length) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
to, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
b.length to,
)); b.length
)
);
} }
// Create a new bytes structure around [from, to) in-place. // Create a new bytes structure around [from, to) in-place.
@@ -249,17 +240,15 @@ library LibBytesV06 {
/// @dev Pops the last byte off of a byte array by modifying its length. /// @dev Pops the last byte off of a byte array by modifying its length.
/// @param b Byte array that will be modified. /// @param b Byte array that will be modified.
/// @return result The byte that was popped off. /// @return result The byte that was popped off.
function popLastByte(bytes memory b) function popLastByte(bytes memory b) internal pure returns (bytes1 result) {
internal
pure
returns (bytes1 result)
{
if (b.length == 0) { if (b.length == 0) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
b.length, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,
0 b.length,
)); 0
)
);
} }
// Store last byte. // Store last byte.
@@ -277,14 +266,7 @@ library LibBytesV06 {
/// @param lhs First byte array to compare. /// @param lhs First byte array to compare.
/// @param rhs Second byte array to compare. /// @param rhs Second byte array to compare.
/// @return equal True if arrays are the same. False otherwise. /// @return equal True if arrays are the same. False otherwise.
function equals( function equals(bytes memory lhs, bytes memory rhs) internal pure returns (bool equal) {
bytes memory lhs,
bytes memory rhs
)
internal
pure
returns (bool equal)
{
// Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare. // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.
// We early exit on unequal lengths, but keccak would also correctly // We early exit on unequal lengths, but keccak would also correctly
// handle this. // handle this.
@@ -295,20 +277,15 @@ library LibBytesV06 {
/// @param b Byte array containing an address. /// @param b Byte array containing an address.
/// @param index Index in byte array of address. /// @param index Index in byte array of address.
/// @return result address from byte array. /// @return result address from byte array.
function readAddress( function readAddress(bytes memory b, uint256 index) internal pure returns (address result) {
bytes memory b,
uint256 index
)
internal
pure
returns (address result)
{
if (b.length < index + 20) { if (b.length < index + 20) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
b.length, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
index + 20 // 20 is length of address b.length,
)); index + 20 // 20 is length of address
)
);
} }
// Add offset to index: // Add offset to index:
@@ -334,16 +311,15 @@ library LibBytesV06 {
bytes memory b, bytes memory b,
uint256 index, uint256 index,
address input address input
) ) internal pure {
internal
pure
{
if (b.length < index + 20) { if (b.length < index + 20) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
b.length, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
index + 20 // 20 is length of address b.length,
)); index + 20 // 20 is length of address
)
);
} }
// Add offset to index: // Add offset to index:
@@ -379,20 +355,15 @@ library LibBytesV06 {
/// @param b Byte array containing a bytes32 value. /// @param b Byte array containing a bytes32 value.
/// @param index Index in byte array of bytes32 value. /// @param index Index in byte array of bytes32 value.
/// @return result bytes32 value from byte array. /// @return result bytes32 value from byte array.
function readBytes32( function readBytes32(bytes memory b, uint256 index) internal pure returns (bytes32 result) {
bytes memory b,
uint256 index
)
internal
pure
returns (bytes32 result)
{
if (b.length < index + 32) { if (b.length < index + 32) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
b.length, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
index + 32 b.length,
)); index + 32
)
);
} }
// Arrays are prefixed by a 256 bit length parameter // Arrays are prefixed by a 256 bit length parameter
@@ -413,16 +384,15 @@ library LibBytesV06 {
bytes memory b, bytes memory b,
uint256 index, uint256 index,
bytes32 input bytes32 input
) ) internal pure {
internal
pure
{
if (b.length < index + 32) { if (b.length < index + 32) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
b.length, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
index + 32 b.length,
)); index + 32
)
);
} }
// Arrays are prefixed by a 256 bit length parameter // Arrays are prefixed by a 256 bit length parameter
@@ -438,14 +408,7 @@ library LibBytesV06 {
/// @param b Byte array containing a uint256 value. /// @param b Byte array containing a uint256 value.
/// @param index Index in byte array of uint256 value. /// @param index Index in byte array of uint256 value.
/// @return result uint256 value from byte array. /// @return result uint256 value from byte array.
function readUint256( function readUint256(bytes memory b, uint256 index) internal pure returns (uint256 result) {
bytes memory b,
uint256 index
)
internal
pure
returns (uint256 result)
{
result = uint256(readBytes32(b, index)); result = uint256(readBytes32(b, index));
return result; return result;
} }
@@ -458,10 +421,7 @@ library LibBytesV06 {
bytes memory b, bytes memory b,
uint256 index, uint256 index,
uint256 input uint256 input
) ) internal pure {
internal
pure
{
writeBytes32(b, index, bytes32(input)); writeBytes32(b, index, bytes32(input));
} }
@@ -469,20 +429,15 @@ library LibBytesV06 {
/// @param b Byte array containing a bytes4 value. /// @param b Byte array containing a bytes4 value.
/// @param index Index in byte array of bytes4 value. /// @param index Index in byte array of bytes4 value.
/// @return result bytes4 value from byte array. /// @return result bytes4 value from byte array.
function readBytes4( function readBytes4(bytes memory b, uint256 index) internal pure returns (bytes4 result) {
bytes memory b,
uint256 index
)
internal
pure
returns (bytes4 result)
{
if (b.length < index + 4) { if (b.length < index + 4) {
LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError( LibRichErrorsV06.rrevert(
LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired, LibBytesRichErrorsV06.InvalidByteOperationError(
b.length, LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,
index + 4 b.length,
)); index + 4
)
);
} }
// Arrays are prefixed by a 32 byte length field // Arrays are prefixed by a 32 byte length field
@@ -503,10 +458,7 @@ library LibBytesV06 {
/// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array. /// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.
/// @param b Bytes array to write new length to. /// @param b Bytes array to write new length to.
/// @param length New length of byte array. /// @param length New length of byte array.
function writeLength(bytes memory b, uint256 length) function writeLength(bytes memory b, uint256 length) internal pure {
internal
pure
{
assembly { assembly {
mstore(b, length) mstore(b, length)
} }

View File

@@ -23,9 +23,7 @@ import "./LibSafeMathV06.sol";
import "./errors/LibRichErrorsV06.sol"; import "./errors/LibRichErrorsV06.sol";
import "./errors/LibMathRichErrorsV06.sol"; import "./errors/LibMathRichErrorsV06.sol";
library LibMathV06 { library LibMathV06 {
using LibSafeMathV06 for uint256; using LibSafeMathV06 for uint256;
/// @dev Calculates partial value given a numerator and denominator rounded down. /// @dev Calculates partial value given a numerator and denominator rounded down.
@@ -38,21 +36,9 @@ library LibMathV06 {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (uint256 partialAmount) {
internal if (isRoundingErrorFloor(numerator, denominator, target)) {
pure LibRichErrorsV06.rrevert(LibMathRichErrorsV06.RoundingError(numerator, denominator, target));
returns (uint256 partialAmount)
{
if (isRoundingErrorFloor(
numerator,
denominator,
target
)) {
LibRichErrorsV06.rrevert(LibMathRichErrorsV06.RoundingError(
numerator,
denominator,
target
));
} }
partialAmount = numerator.safeMul(target).safeDiv(denominator); partialAmount = numerator.safeMul(target).safeDiv(denominator);
@@ -69,29 +55,15 @@ library LibMathV06 {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (uint256 partialAmount) {
internal if (isRoundingErrorCeil(numerator, denominator, target)) {
pure LibRichErrorsV06.rrevert(LibMathRichErrorsV06.RoundingError(numerator, denominator, target));
returns (uint256 partialAmount)
{
if (isRoundingErrorCeil(
numerator,
denominator,
target
)) {
LibRichErrorsV06.rrevert(LibMathRichErrorsV06.RoundingError(
numerator,
denominator,
target
));
} }
// safeDiv computes `floor(a / b)`. We use the identity (a, b integer): // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):
// ceil(a / b) = floor((a + b - 1) / b) // ceil(a / b) = floor((a + b - 1) / b)
// To implement `ceil(a / b)` using safeDiv. // To implement `ceil(a / b)` using safeDiv.
partialAmount = numerator.safeMul(target) partialAmount = numerator.safeMul(target).safeAdd(denominator.safeSub(1)).safeDiv(denominator);
.safeAdd(denominator.safeSub(1))
.safeDiv(denominator);
return partialAmount; return partialAmount;
} }
@@ -105,11 +77,7 @@ library LibMathV06 {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (uint256 partialAmount) {
internal
pure
returns (uint256 partialAmount)
{
partialAmount = numerator.safeMul(target).safeDiv(denominator); partialAmount = numerator.safeMul(target).safeDiv(denominator);
return partialAmount; return partialAmount;
} }
@@ -123,17 +91,11 @@ library LibMathV06 {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (uint256 partialAmount) {
internal
pure
returns (uint256 partialAmount)
{
// safeDiv computes `floor(a / b)`. We use the identity (a, b integer): // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):
// ceil(a / b) = floor((a + b - 1) / b) // ceil(a / b) = floor((a + b - 1) / b)
// To implement `ceil(a / b)` using safeDiv. // To implement `ceil(a / b)` using safeDiv.
partialAmount = numerator.safeMul(target) partialAmount = numerator.safeMul(target).safeAdd(denominator.safeSub(1)).safeDiv(denominator);
.safeAdd(denominator.safeSub(1))
.safeDiv(denominator);
return partialAmount; return partialAmount;
} }
@@ -147,11 +109,7 @@ library LibMathV06 {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (bool isError) {
internal
pure
returns (bool isError)
{
if (denominator == 0) { if (denominator == 0) {
LibRichErrorsV06.rrevert(LibMathRichErrorsV06.DivisionByZeroError()); LibRichErrorsV06.rrevert(LibMathRichErrorsV06.DivisionByZeroError());
} }
@@ -182,11 +140,7 @@ library LibMathV06 {
// 1000 * remainder < numerator * target // 1000 * remainder < numerator * target
// so we have a rounding error iff: // so we have a rounding error iff:
// 1000 * remainder >= numerator * target // 1000 * remainder >= numerator * target
uint256 remainder = mulmod( uint256 remainder = mulmod(target, numerator, denominator);
target,
numerator,
denominator
);
isError = remainder.safeMul(1000) >= numerator.safeMul(target); isError = remainder.safeMul(1000) >= numerator.safeMul(target);
return isError; return isError;
} }
@@ -200,11 +154,7 @@ library LibMathV06 {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (bool isError) {
internal
pure
returns (bool isError)
{
if (denominator == 0) { if (denominator == 0) {
LibRichErrorsV06.rrevert(LibMathRichErrorsV06.DivisionByZeroError()); LibRichErrorsV06.rrevert(LibMathRichErrorsV06.DivisionByZeroError());
} }
@@ -217,11 +167,7 @@ library LibMathV06 {
return false; return false;
} }
// Compute remainder as before // Compute remainder as before
uint256 remainder = mulmod( uint256 remainder = mulmod(target, numerator, denominator);
target,
numerator,
denominator
);
remainder = denominator.safeSub(remainder) % denominator; remainder = denominator.safeSub(remainder) % denominator;
isError = remainder.safeMul(1000) >= numerator.safeMul(target); isError = remainder.safeMul(1000) >= numerator.safeMul(target);
return isError; return isError;

View File

@@ -22,183 +22,147 @@ pragma solidity ^0.6.5;
import "./errors/LibRichErrorsV06.sol"; import "./errors/LibRichErrorsV06.sol";
import "./errors/LibSafeMathRichErrorsV06.sol"; import "./errors/LibSafeMathRichErrorsV06.sol";
library LibSafeMathV06 { library LibSafeMathV06 {
function safeMul(uint256 a, uint256 b) internal pure returns (uint256) {
function safeMul(uint256 a, uint256 b)
internal
pure
returns (uint256)
{
if (a == 0) { if (a == 0) {
return 0; return 0;
} }
uint256 c = a * b; uint256 c = a * b;
if (c / a != b) { if (c / a != b) {
LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError( LibRichErrorsV06.rrevert(
LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW, LibSafeMathRichErrorsV06.Uint256BinOpError(
a, LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,
b a,
)); b
)
);
} }
return c; return c;
} }
function safeDiv(uint256 a, uint256 b) function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
if (b == 0) { if (b == 0) {
LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError( LibRichErrorsV06.rrevert(
LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO, LibSafeMathRichErrorsV06.Uint256BinOpError(
a, LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,
b a,
)); b
)
);
} }
uint256 c = a / b; uint256 c = a / b;
return c; return c;
} }
function safeSub(uint256 a, uint256 b) function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
if (b > a) { if (b > a) {
LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError( LibRichErrorsV06.rrevert(
LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW, LibSafeMathRichErrorsV06.Uint256BinOpError(
a, LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,
b a,
)); b
)
);
} }
return a - b; return a - b;
} }
function safeAdd(uint256 a, uint256 b) function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
uint256 c = a + b; uint256 c = a + b;
if (c < a) { if (c < a) {
LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError( LibRichErrorsV06.rrevert(
LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW, LibSafeMathRichErrorsV06.Uint256BinOpError(
a, LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,
b a,
)); b
)
);
} }
return c; return c;
} }
function max256(uint256 a, uint256 b) function max256(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
return a >= b ? a : b; return a >= b ? a : b;
} }
function min256(uint256 a, uint256 b) function min256(uint256 a, uint256 b) internal pure returns (uint256) {
internal
pure
returns (uint256)
{
return a < b ? a : b; return a < b ? a : b;
} }
function safeMul128(uint128 a, uint128 b) function safeMul128(uint128 a, uint128 b) internal pure returns (uint128) {
internal
pure
returns (uint128)
{
if (a == 0) { if (a == 0) {
return 0; return 0;
} }
uint128 c = a * b; uint128 c = a * b;
if (c / a != b) { if (c / a != b) {
LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError( LibRichErrorsV06.rrevert(
LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW, LibSafeMathRichErrorsV06.Uint256BinOpError(
a, LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,
b a,
)); b
)
);
} }
return c; return c;
} }
function safeDiv128(uint128 a, uint128 b) function safeDiv128(uint128 a, uint128 b) internal pure returns (uint128) {
internal
pure
returns (uint128)
{
if (b == 0) { if (b == 0) {
LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError( LibRichErrorsV06.rrevert(
LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO, LibSafeMathRichErrorsV06.Uint256BinOpError(
a, LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,
b a,
)); b
)
);
} }
uint128 c = a / b; uint128 c = a / b;
return c; return c;
} }
function safeSub128(uint128 a, uint128 b) function safeSub128(uint128 a, uint128 b) internal pure returns (uint128) {
internal
pure
returns (uint128)
{
if (b > a) { if (b > a) {
LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError( LibRichErrorsV06.rrevert(
LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW, LibSafeMathRichErrorsV06.Uint256BinOpError(
a, LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,
b a,
)); b
)
);
} }
return a - b; return a - b;
} }
function safeAdd128(uint128 a, uint128 b) function safeAdd128(uint128 a, uint128 b) internal pure returns (uint128) {
internal
pure
returns (uint128)
{
uint128 c = a + b; uint128 c = a + b;
if (c < a) { if (c < a) {
LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError( LibRichErrorsV06.rrevert(
LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW, LibSafeMathRichErrorsV06.Uint256BinOpError(
a, LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,
b a,
)); b
)
);
} }
return c; return c;
} }
function max128(uint128 a, uint128 b) function max128(uint128 a, uint128 b) internal pure returns (uint128) {
internal
pure
returns (uint128)
{
return a >= b ? a : b; return a >= b ? a : b;
} }
function min128(uint128 a, uint128 b) function min128(uint128 a, uint128 b) internal pure returns (uint128) {
internal
pure
returns (uint128)
{
return a < b ? a : b; return a < b ? a : b;
} }
function safeDowncastToUint128(uint256 a) function safeDowncastToUint128(uint256 a) internal pure returns (uint128) {
internal
pure
returns (uint128)
{
if (a > type(uint128).max) { if (a > type(uint128).max) {
LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256DowncastError( LibRichErrorsV06.rrevert(
LibSafeMathRichErrorsV06.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128, LibSafeMathRichErrorsV06.Uint256DowncastError(
a LibSafeMathRichErrorsV06.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128,
)); a
)
);
} }
return uint128(a); return uint128(a);
} }

View File

@@ -23,10 +23,7 @@ import "./interfaces/IOwnableV06.sol";
import "./errors/LibRichErrorsV06.sol"; import "./errors/LibRichErrorsV06.sol";
import "./errors/LibOwnableRichErrorsV06.sol"; import "./errors/LibOwnableRichErrorsV06.sol";
contract OwnableV06 is IOwnableV06 {
contract OwnableV06 is
IOwnableV06
{
/// @dev The owner of this contract. /// @dev The owner of this contract.
/// @return 0 The owner address. /// @return 0 The owner address.
address public override owner; address public override owner;
@@ -42,11 +39,7 @@ contract OwnableV06 is
/// @dev Change the owner of this contract. /// @dev Change the owner of this contract.
/// @param newOwner New owner address. /// @param newOwner New owner address.
function transferOwnership(address newOwner) function transferOwnership(address newOwner) public override onlyOwner {
public
override
onlyOwner
{
if (newOwner == address(0)) { if (newOwner == address(0)) {
LibRichErrorsV06.rrevert(LibOwnableRichErrorsV06.TransferOwnerToZeroError()); LibRichErrorsV06.rrevert(LibOwnableRichErrorsV06.TransferOwnerToZeroError());
} else { } else {
@@ -55,15 +48,9 @@ contract OwnableV06 is
} }
} }
function _assertSenderIsOwner() function _assertSenderIsOwner() internal view {
internal
view
{
if (msg.sender != owner) { if (msg.sender != owner) {
LibRichErrorsV06.rrevert(LibOwnableRichErrorsV06.OnlyOwnerError( LibRichErrorsV06.rrevert(LibOwnableRichErrorsV06.OnlyOwnerError(msg.sender, owner));
msg.sender,
owner
));
} }
} }
} }

View File

@@ -22,9 +22,7 @@ pragma solidity ^0.6.5;
import "./errors/LibReentrancyGuardRichErrorsV06.sol"; import "./errors/LibReentrancyGuardRichErrorsV06.sol";
import "./errors/LibRichErrorsV06.sol"; import "./errors/LibRichErrorsV06.sol";
contract ReentrancyGuardV06 { contract ReentrancyGuardV06 {
// Locked state of mutex. // Locked state of mutex.
bool private _locked = false; bool private _locked = false;
@@ -36,22 +34,16 @@ contract ReentrancyGuardV06 {
_unlockMutex(); _unlockMutex();
} }
function _lockMutexOrThrowIfAlreadyLocked() function _lockMutexOrThrowIfAlreadyLocked() internal {
internal
{
// Ensure mutex is unlocked. // Ensure mutex is unlocked.
if (_locked) { if (_locked) {
LibRichErrorsV06.rrevert( LibRichErrorsV06.rrevert(LibReentrancyGuardRichErrorsV06.IllegalReentrancyError());
LibReentrancyGuardRichErrorsV06.IllegalReentrancyError()
);
} }
// Lock mutex. // Lock mutex.
_locked = true; _locked = true;
} }
function _unlockMutex() function _unlockMutex() internal {
internal
{
// Unlock mutex. // Unlock mutex.
_locked = false; _locked = false;
} }

View File

@@ -19,102 +19,47 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
library LibAuthorizableRichErrorsV06 { library LibAuthorizableRichErrorsV06 {
// bytes4(keccak256("AuthorizedAddressMismatchError(address,address)")) // bytes4(keccak256("AuthorizedAddressMismatchError(address,address)"))
bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR = bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR = 0x140a84db;
0x140a84db;
// bytes4(keccak256("IndexOutOfBoundsError(uint256,uint256)")) // bytes4(keccak256("IndexOutOfBoundsError(uint256,uint256)"))
bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR = bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR = 0xe9f83771;
0xe9f83771;
// bytes4(keccak256("SenderNotAuthorizedError(address)")) // bytes4(keccak256("SenderNotAuthorizedError(address)"))
bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR = bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR = 0xb65a25b9;
0xb65a25b9;
// bytes4(keccak256("TargetAlreadyAuthorizedError(address)")) // bytes4(keccak256("TargetAlreadyAuthorizedError(address)"))
bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR = bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR = 0xde16f1a0;
0xde16f1a0;
// bytes4(keccak256("TargetNotAuthorizedError(address)")) // bytes4(keccak256("TargetNotAuthorizedError(address)"))
bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR = bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR = 0xeb5108a2;
0xeb5108a2;
// bytes4(keccak256("ZeroCantBeAuthorizedError()")) // bytes4(keccak256("ZeroCantBeAuthorizedError()"))
bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES = bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES = hex"57654fe4";
hex"57654fe4";
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function AuthorizedAddressMismatchError( function AuthorizedAddressMismatchError(address authorized, address target) internal pure returns (bytes memory) {
address authorized, return abi.encodeWithSelector(AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR, authorized, target);
address target
)
internal
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR,
authorized,
target
);
} }
function IndexOutOfBoundsError( function IndexOutOfBoundsError(uint256 index, uint256 length) internal pure returns (bytes memory) {
uint256 index, return abi.encodeWithSelector(INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR, index, length);
uint256 length
)
internal
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR,
index,
length
);
} }
function SenderNotAuthorizedError(address sender) function SenderNotAuthorizedError(address sender) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(SENDER_NOT_AUTHORIZED_ERROR_SELECTOR, sender);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
SENDER_NOT_AUTHORIZED_ERROR_SELECTOR,
sender
);
} }
function TargetAlreadyAuthorizedError(address target) function TargetAlreadyAuthorizedError(address target) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR, target);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR,
target
);
} }
function TargetNotAuthorizedError(address target) function TargetNotAuthorizedError(address target) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(TARGET_NOT_AUTHORIZED_ERROR_SELECTOR, target);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
TARGET_NOT_AUTHORIZED_ERROR_SELECTOR,
target
);
} }
function ZeroCantBeAuthorizedError() function ZeroCantBeAuthorizedError() internal pure returns (bytes memory) {
internal
pure
returns (bytes memory)
{
return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES; return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES;
} }
} }

View File

@@ -19,9 +19,7 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
library LibBytesRichErrorsV06 { library LibBytesRichErrorsV06 {
enum InvalidByteOperationErrorCodes { enum InvalidByteOperationErrorCodes {
FromLessThanOrEqualsToRequired, FromLessThanOrEqualsToRequired,
ToLessThanOrEqualsLengthRequired, ToLessThanOrEqualsLengthRequired,
@@ -34,24 +32,14 @@ library LibBytesRichErrorsV06 {
} }
// bytes4(keccak256("InvalidByteOperationError(uint8,uint256,uint256)")) // bytes4(keccak256("InvalidByteOperationError(uint8,uint256,uint256)"))
bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR = bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR = 0x28006595;
0x28006595;
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function InvalidByteOperationError( function InvalidByteOperationError(
InvalidByteOperationErrorCodes errorCode, InvalidByteOperationErrorCodes errorCode,
uint256 offset, uint256 offset,
uint256 required uint256 required
) ) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(INVALID_BYTE_OPERATION_ERROR_SELECTOR, errorCode, offset, required);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
INVALID_BYTE_OPERATION_ERROR_SELECTOR,
errorCode,
offset,
required
);
} }
} }

View File

@@ -19,23 +19,15 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
library LibMathRichErrorsV06 { library LibMathRichErrorsV06 {
// bytes4(keccak256("DivisionByZeroError()")) // bytes4(keccak256("DivisionByZeroError()"))
bytes internal constant DIVISION_BY_ZERO_ERROR = bytes internal constant DIVISION_BY_ZERO_ERROR = hex"a791837c";
hex"a791837c";
// bytes4(keccak256("RoundingError(uint256,uint256,uint256)")) // bytes4(keccak256("RoundingError(uint256,uint256,uint256)"))
bytes4 internal constant ROUNDING_ERROR_SELECTOR = bytes4 internal constant ROUNDING_ERROR_SELECTOR = 0x339f3de2;
0x339f3de2;
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function DivisionByZeroError() function DivisionByZeroError() internal pure returns (bytes memory) {
internal
pure
returns (bytes memory)
{
return DIVISION_BY_ZERO_ERROR; return DIVISION_BY_ZERO_ERROR;
} }
@@ -43,16 +35,7 @@ library LibMathRichErrorsV06 {
uint256 numerator, uint256 numerator,
uint256 denominator, uint256 denominator,
uint256 target uint256 target
) ) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(ROUNDING_ERROR_SELECTOR, numerator, denominator, target);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
ROUNDING_ERROR_SELECTOR,
numerator,
denominator,
target
);
} }
} }

View File

@@ -18,38 +18,19 @@
*/ */
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
library LibOwnableRichErrorsV06 { library LibOwnableRichErrorsV06 {
// bytes4(keccak256("OnlyOwnerError(address,address)")) // bytes4(keccak256("OnlyOwnerError(address,address)"))
bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR = bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR = 0x1de45ad1;
0x1de45ad1;
// bytes4(keccak256("TransferOwnerToZeroError()")) // bytes4(keccak256("TransferOwnerToZeroError()"))
bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES = bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES = hex"e69edc3e";
hex"e69edc3e";
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function OnlyOwnerError( function OnlyOwnerError(address sender, address owner) internal pure returns (bytes memory) {
address sender, return abi.encodeWithSelector(ONLY_OWNER_ERROR_SELECTOR, sender, owner);
address owner
)
internal
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
ONLY_OWNER_ERROR_SELECTOR,
sender,
owner
);
} }
function TransferOwnerToZeroError() function TransferOwnerToZeroError() internal pure returns (bytes memory) {
internal
pure
returns (bytes memory)
{
return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES; return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES;
} }
} }

View File

@@ -19,19 +19,12 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
library LibReentrancyGuardRichErrorsV06 { library LibReentrancyGuardRichErrorsV06 {
// bytes4(keccak256("IllegalReentrancyError()")) // bytes4(keccak256("IllegalReentrancyError()"))
bytes internal constant ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES = bytes internal constant ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES = hex"0c3b823f";
hex"0c3b823f";
// solhint-disable func-name-mixedcase // solhint-disable func-name-mixedcase
function IllegalReentrancyError() function IllegalReentrancyError() internal pure returns (bytes memory) {
internal
pure
returns (bytes memory)
{
return ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES; return ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES;
} }
} }

View File

@@ -19,9 +19,7 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
library LibRichErrorsV06 { library LibRichErrorsV06 {
// bytes4(keccak256("Error(string)")) // bytes4(keccak256("Error(string)"))
bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0; bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0;
@@ -31,24 +29,15 @@ library LibRichErrorsV06 {
/// solidity statement. It has the function signature `Error(string)`. /// solidity statement. It has the function signature `Error(string)`.
/// @param message The error string. /// @param message The error string.
/// @return The ABI encoded error. /// @return The ABI encoded error.
function StandardError(string memory message) function StandardError(string memory message) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(STANDARD_ERROR_SELECTOR, bytes(message));
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
STANDARD_ERROR_SELECTOR,
bytes(message)
);
} }
// solhint-enable func-name-mixedcase // solhint-enable func-name-mixedcase
/// @dev Reverts an encoded rich revert reason `errorData`. /// @dev Reverts an encoded rich revert reason `errorData`.
/// @param errorData ABI encoded error data. /// @param errorData ABI encoded error data.
function rrevert(bytes memory errorData) function rrevert(bytes memory errorData) internal pure {
internal
pure
{
assembly { assembly {
revert(add(errorData, 0x20), mload(errorData)) revert(add(errorData, 0x20), mload(errorData))
} }

View File

@@ -19,16 +19,12 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
library LibSafeMathRichErrorsV06 { library LibSafeMathRichErrorsV06 {
// bytes4(keccak256("Uint256BinOpError(uint8,uint256,uint256)")) // bytes4(keccak256("Uint256BinOpError(uint8,uint256,uint256)"))
bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR = bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR = 0xe946c1bb;
0xe946c1bb;
// bytes4(keccak256("Uint256DowncastError(uint8,uint256)")) // bytes4(keccak256("Uint256DowncastError(uint8,uint256)"))
bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR = bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR = 0xc996af7b;
0xc996af7b;
enum BinOpErrorCodes { enum BinOpErrorCodes {
ADDITION_OVERFLOW, ADDITION_OVERFLOW,
@@ -49,31 +45,11 @@ library LibSafeMathRichErrorsV06 {
BinOpErrorCodes errorCode, BinOpErrorCodes errorCode,
uint256 a, uint256 a,
uint256 b uint256 b
) ) internal pure returns (bytes memory) {
internal return abi.encodeWithSelector(UINT256_BINOP_ERROR_SELECTOR, errorCode, a, b);
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
UINT256_BINOP_ERROR_SELECTOR,
errorCode,
a,
b
);
} }
function Uint256DowncastError( function Uint256DowncastError(DowncastErrorCodes errorCode, uint256 a) internal pure returns (bytes memory) {
DowncastErrorCodes errorCode, return abi.encodeWithSelector(UINT256_DOWNCAST_ERROR_SELECTOR, errorCode, a);
uint256 a
)
internal
pure
returns (bytes memory)
{
return abi.encodeWithSelector(
UINT256_DOWNCAST_ERROR_SELECTOR,
errorCode,
a
);
} }
} }

View File

@@ -21,47 +21,29 @@ pragma solidity ^0.6.5;
import "./IOwnableV06.sol"; import "./IOwnableV06.sol";
interface IAuthorizableV06 is IOwnableV06 {
interface IAuthorizableV06 is
IOwnableV06
{
// Event logged when a new address is authorized. // Event logged when a new address is authorized.
event AuthorizedAddressAdded( event AuthorizedAddressAdded(address indexed target, address indexed caller);
address indexed target,
address indexed caller
);
// Event logged when a currently authorized address is unauthorized. // Event logged when a currently authorized address is unauthorized.
event AuthorizedAddressRemoved( event AuthorizedAddressRemoved(address indexed target, address indexed caller);
address indexed target,
address indexed caller
);
/// @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;
external;
/// @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;
external;
/// @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;
address target,
uint256 index
)
external;
/// @dev Gets all authorized addresses. /// @dev Gets all authorized addresses.
/// @return authorizedAddresses Array of authorized addresses. /// @return authorizedAddresses Array of authorized addresses.
function getAuthorizedAddresses() function getAuthorizedAddresses() external view returns (address[] memory authorizedAddresses);
external
view
returns (address[] memory authorizedAddresses);
/// @dev Whether an adderss is authorized to call privileged functions. /// @dev Whether an adderss is authorized to call privileged functions.
/// @param addr Address to query. /// @param addr Address to query.
@@ -72,5 +54,4 @@ interface IAuthorizableV06 is
/// @param idx Index of authorized address. /// @param idx Index of authorized address.
/// @return addr Authorized address. /// @return addr Authorized address.
function authorities(uint256 idx) external view returns (address addr); function authorities(uint256 idx) external view returns (address addr);
} }

View File

@@ -19,9 +19,7 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
interface IOwnableV06 { interface IOwnableV06 {
/// @dev Emitted by Ownable when ownership is transferred. /// @dev Emitted by Ownable when ownership is transferred.
/// @param previousOwner The previous owner of the contract. /// @param previousOwner The previous owner of the contract.
/// @param newOwner The new owner of the contract. /// @param newOwner The new owner of the contract.

View File

@@ -20,14 +20,7 @@ pragma solidity ^0.5.9;
import "../src/Authorizable.sol"; import "../src/Authorizable.sol";
// solhint-disable no-empty-blocks // solhint-disable no-empty-blocks
contract TestAuthorizable is contract TestAuthorizable is Authorizable {
Authorizable function onlyAuthorizedFn() external view onlyAuthorized {}
{
function onlyAuthorizedFn()
external
view
onlyAuthorized
{}
} }

View File

@@ -20,16 +20,10 @@ pragma solidity ^0.5.9;
import "../src/LibAddress.sol"; import "../src/LibAddress.sol";
contract TestLibAddress { contract TestLibAddress {
using LibAddress for address; using LibAddress for address;
function externalIsContract(address account) function externalIsContract(address account) external view returns (bool) {
external
view
returns (bool)
{
return account.isContract(); return account.isContract();
} }
} }

View File

@@ -20,9 +20,7 @@ pragma solidity ^0.5.5;
import "../src/LibAddressArray.sol"; import "../src/LibAddressArray.sol";
contract TestLibAddressArray { contract TestLibAddressArray {
using LibAddressArray for address[]; using LibAddressArray for address[];
/// @dev Append a new address to an array of addresses. /// @dev Append a new address to an array of addresses.
@@ -83,11 +81,7 @@ contract TestLibAddressArray {
/// @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 publicContains(address[] memory addressArray, address target) function publicContains(address[] memory addressArray, address target) public pure returns (bool success) {
public
pure
returns (bool success)
{
return addressArray.contains(target); return addressArray.contains(target);
} }
@@ -102,5 +96,4 @@ contract TestLibAddressArray {
{ {
(success, index) = addressArray.indexOf(target); (success, index) = addressArray.indexOf(target);
} }
} }

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