Compare commits
	
		
			152 Commits
		
	
	
		
			@0x/contra
			...
			protocol@b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b29196b983 | ||
|  | ce76a7033d | ||
|  | 3f4bb933d1 | ||
|  | 501b7b9b65 | ||
|  | c0ea88e864 | ||
|  | 48f8bea460 | ||
|  | f4e5b6e38d | ||
|  | 477cb0a48d | ||
|  | d6bc0a3368 | ||
|  | e544a804c2 | ||
|  | 96e0ad7899 | ||
|  | 5a1fee5d31 | ||
|  | 3557a5e5a9 | ||
|  | 0bd43d5265 | ||
|  | 8fd7c1b386 | ||
|  | 50068750f5 | ||
|  | a7a905de4c | ||
|  | f283108586 | ||
|  | 9afe05095a | ||
|  | 3dab892978 | ||
|  | e40ddb800e | ||
|  | 72a74e7c66 | ||
|  | e8ae64673f | ||
|  | 2451f419c8 | ||
|  | 2394eb62aa | ||
|  | f9078bb1c3 | ||
|  | bf25c81f1c | ||
|  | 03ecc530c3 | ||
|  | d52b1d24d0 | ||
|  | 5083fab06a | ||
|  | 1249bf9ccc | ||
|  | 681f6b3f07 | ||
|  | d3ca1fe96b | ||
|  | 9e4f5815e4 | ||
|  | c3c27eaedc | ||
|  | 4bf6a23d23 | ||
|  | aaaf0d02de | ||
|  | 825cc4d035 | ||
|  | c2d44e5c10 | ||
|  | 0efd0860c8 | ||
|  | a890a06664 | ||
|  | 5befb87071 | ||
|  | 12ba4c373a | ||
|  | 7fd25be02e | ||
|  | aa688c4a92 | ||
|  | fb437551c9 | ||
|  | 6fa1de7889 | ||
|  | 7a42df9a65 | ||
|  | 15a508f3ea | ||
|  | b3c20ff909 | ||
|  | 682c07cb73 | ||
|  | 602605ab4b | ||
|  | 0eff2548d5 | ||
|  | 93ee681204 | ||
|  | d7bea98075 | ||
|  | 437a3b048d | ||
|  | f55a9454b5 | ||
|  | 3b03ad0db4 | ||
|  | 27d679e1f1 | ||
|  | 1e16d59c23 | ||
|  | 1e7c9bbb1f | ||
|  | edda1edc50 | ||
|  | d1eb6279b4 | ||
|  | 4ace79d947 | ||
|  | e5eee96487 | ||
|  | 907adf9145 | ||
|  | c046fe6220 | ||
|  | 84bf20de41 | ||
|  | f5a6f74d9a | ||
|  | 7c7fc51ccf | ||
|  | fa22f6de0d | ||
|  | 4f41214af2 | ||
|  | 607b7169bc | ||
|  | 1253490a38 | ||
|  | 0a37a588e8 | ||
|  | 23ee108089 | ||
|  | 64feeeea75 | ||
|  | 2ebef23b8c | ||
|  | cc9f43ba3b | ||
|  | 5f1c139176 | ||
|  | 9eea7de340 | ||
|  | 4480f84efa | ||
|  | 5a8b8afff1 | ||
|  | 67c95bc0b7 | ||
|  | e70ec02be8 | ||
|  | db81a94adb | ||
|  | 475b608338 | ||
|  | 27e36b112e | ||
|  | f698721484 | ||
|  | 0c08353b2c | ||
|  | a074b49732 | ||
|  | 43b75c7953 | ||
|  | 84a78eafc4 | ||
|  | 3c1ab889dd | ||
|  | 012fff46f6 | ||
|  | 6307ebc3a2 | ||
|  | 88d7e73eba | ||
|  | 9653eb9e70 | ||
|  | ad337271d3 | ||
|  | 7591e99316 | ||
|  | ca20df4752 | ||
|  | 841e4ee666 | ||
|  | e2ee3414ea | ||
|  | 5306cc03e9 | ||
|  | 85f5d32de2 | ||
|  | ab698cec14 | ||
|  | b463a39bfa | ||
|  | 018e25345b | ||
|  | b60fa8a7d7 | ||
|  | 048d8dee60 | ||
|  | 927fe2b58b | ||
|  | 89948b360c | ||
|  | 561b60a24d | ||
|  | 4f82543bdf | ||
|  | 3133c509f9 | ||
|  | 426c15692d | ||
|  | 8c87a77faa | ||
|  | d2018f07a2 | ||
|  | d2e57d8163 | ||
|  | 7403c0255a | ||
|  | 75dcd687e2 | ||
|  | afd4805421 | ||
|  | 6aa582d140 | ||
|  | 534d92fa00 | ||
|  | 37aae134ab | ||
|  | 36bd8f68c9 | ||
|  | c3ad42221e | ||
|  | 602ac1f626 | ||
|  | 3126795efe | ||
|  | dbcb221a59 | ||
|  | 6bbc179f52 | ||
|  | 48e7a391c8 | ||
|  | 2334e64d0c | ||
|  | 14f920ee84 | ||
|  | e10a81023a | ||
|  | f4709ed1cb | ||
|  | e2e14a977a | ||
|  | 866f958a10 | ||
|  | 717db99b38 | ||
|  | 02006118c7 | ||
|  | 9816019bc5 | ||
|  | 9c821dbfc3 | ||
|  | af1b890423 | ||
|  | 673835d2de | ||
|  | 500b57e935 | ||
|  | 3f7d0580c1 | ||
|  | a71c356bba | ||
|  | c3a95b7fb1 | ||
|  | f01540fb35 | ||
|  | 689a8881c2 | ||
|  | 99f5be8378 | ||
|  | 8de0282d92 | 
							
								
								
									
										2
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							| @@ -24,9 +24,9 @@ jobs: | |||||||
|                 ref: 'development' |                 ref: 'development' | ||||||
|                 fetch-depth: 0 |                 fetch-depth: 0 | ||||||
|             - uses: actions/setup-node@v1 |             - uses: actions/setup-node@v1 | ||||||
|             - uses: actions/setup-python@v2 |  | ||||||
|               with: |               with: | ||||||
|                 node-version: 10 |                 node-version: 10 | ||||||
|  |             - uses: actions/setup-python@v2 | ||||||
|             - name: 'configure git' |             - name: 'configure git' | ||||||
|               run: | |               run: | | ||||||
|                   git config --global user.email "github-actions@github.com" |                   git config --global user.email "github-actions@github.com" | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -113,6 +113,8 @@ contracts/dev-utils/generated-artifacts/ | |||||||
| contracts/dev-utils/test/generated-artifacts/ | contracts/dev-utils/test/generated-artifacts/ | ||||||
| contracts/zero-ex/generated-artifacts/ | contracts/zero-ex/generated-artifacts/ | ||||||
| contracts/zero-ex/test/generated-artifacts/ | contracts/zero-ex/test/generated-artifacts/ | ||||||
|  | contracts/treasury/generated-artifacts/ | ||||||
|  | contracts/treasury/test/generated-artifacts/ | ||||||
|  |  | ||||||
| # generated truffle contract artifacts/ | # generated truffle contract artifacts/ | ||||||
| contracts/broker/build/ | contracts/broker/build/ | ||||||
| @@ -167,6 +169,8 @@ contracts/dev-utils/generated-wrappers/ | |||||||
| contracts/dev-utils/test/generated-wrappers/ | contracts/dev-utils/test/generated-wrappers/ | ||||||
| contracts/zero-ex/generated-wrappers/ | contracts/zero-ex/generated-wrappers/ | ||||||
| contracts/zero-ex/test/generated-wrappers/ | contracts/zero-ex/test/generated-wrappers/ | ||||||
|  | contracts/treasury/generated-wrappers/ | ||||||
|  | contracts/treasury/test/generated-wrappers/ | ||||||
|  |  | ||||||
| # Doc README copy | # Doc README copy | ||||||
| packages/*/docs/README.md | packages/*/docs/README.md | ||||||
|   | |||||||
| @@ -64,6 +64,10 @@ lib | |||||||
| /contracts/zero-ex/test/generated-wrappers | /contracts/zero-ex/test/generated-wrappers | ||||||
| /contracts/zero-ex/generated-artifacts | /contracts/zero-ex/generated-artifacts | ||||||
| /contracts/zero-ex/test/generated-artifacts | /contracts/zero-ex/test/generated-artifacts | ||||||
|  | /contracts/treasury/generated-wrappers | ||||||
|  | /contracts/treasury/test/generated-wrappers | ||||||
|  | /contracts/treasury/generated-artifacts | ||||||
|  | /contracts/treasury/test/generated-artifacts | ||||||
| /contracts/staking/build/ | /contracts/staking/build/ | ||||||
| /contracts/coordinator/build/ | /contracts/coordinator/build/ | ||||||
| /contracts/exchange/build/ | /contracts/exchange/build/ | ||||||
| @@ -82,4 +86,5 @@ lib | |||||||
| /packages/asset-swapper/test/generated-wrappers | /packages/asset-swapper/test/generated-wrappers | ||||||
| package.json | package.json | ||||||
| packages/*/docs | packages/*/docs | ||||||
|  | docs/ | ||||||
| *.sol | *.sol | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								.readthedocs.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.readthedocs.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | # Read the Docs configuration file | ||||||
|  | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details | ||||||
|  |  | ||||||
|  | # Required | ||||||
|  | version: 2 | ||||||
|  |  | ||||||
|  | # Build documentation in the docs/ directory with Sphinx | ||||||
|  | sphinx: | ||||||
|  |   configuration: docs/conf.py | ||||||
|  |  | ||||||
|  | # Build documentation with MkDocs | ||||||
|  | #mkdocs: | ||||||
|  | #  configuration: mkdocs.yml | ||||||
|  |  | ||||||
|  | # Optionally build your docs in additional formats such as PDF | ||||||
|  | #formats: | ||||||
|  | #  - pdf | ||||||
|  |  | ||||||
|  | # Optionally set the version of Python and requirements required to build your docs | ||||||
|  | python: | ||||||
|  |   version: 3.7 | ||||||
|  |   install: | ||||||
|  |     - requirements: docs/requirements.txt | ||||||
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							| @@ -8,7 +8,7 @@ This repository is a monorepo including the 0x protocol smart contracts and nume | |||||||
|  |  | ||||||
| [website-url]: https://0x.org | [website-url]: https://0x.org | ||||||
|  |  | ||||||
| [](https://circleci.com/gh/0xProject/0x-monorepo) | [](https://circleci.com/gh/0xProject/protocool) | ||||||
| [](https://coveralls.io/github/0xProject/0x-monorepo?branch=development) | [](https://coveralls.io/github/0xProject/0x-monorepo?branch=development) | ||||||
| [](https://discordapp.com/invite/d3FTX3M) | [](https://discordapp.com/invite/d3FTX3M) | ||||||
| [](https://opensource.org/licenses/Apache-2.0) | [](https://opensource.org/licenses/Apache-2.0) | ||||||
| @@ -92,7 +92,7 @@ yarn build | |||||||
| To build a specific package: | To build a specific package: | ||||||
|  |  | ||||||
| ```bash | ```bash | ||||||
| PKG=@0x/web3-wrapper yarn build | PKG=@0x/contract-wrappers yarn build | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| To build all contracts packages: | To build all contracts packages: | ||||||
| @@ -115,7 +115,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/web3-wrapper yarn watch | PKG=@0x/contract-wrappers yarn watch | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ### Clean | ### Clean | ||||||
| @@ -143,7 +143,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.js yarn rebuild | PKG=@0x/contract-wrappers yarn rebuild | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ### Lint | ### Lint | ||||||
| @@ -157,7 +157,7 @@ yarn lint | |||||||
| Lint a specific package: | Lint a specific package: | ||||||
|  |  | ||||||
| ```bash | ```bash | ||||||
| PKG=0x.js yarn lint | PKG=@0x/contract-wrappers yarn lint | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ### Run Tests | ### Run Tests | ||||||
| @@ -171,7 +171,7 @@ yarn test | |||||||
| Run a specific package's test: | Run a specific package's test: | ||||||
|  |  | ||||||
| ```bash | ```bash | ||||||
| PKG=@0x/web3-wrapper yarn test | PKG=@0x/contract-wrappers yarn test | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| Run all contracts packages tests: | Run all contracts packages tests: | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ | |||||||
|         "quotes": ["error", "double"], |         "quotes": ["error", "double"], | ||||||
|         "separate-by-one-line-in-contract": "error", |         "separate-by-one-line-in-contract": "error", | ||||||
|         "space-after-comma": "error", |         "space-after-comma": "error", | ||||||
|         "statement-indent": "error" |         "statement-indent": "error", | ||||||
|  |         "no-empty-blocks": false | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,159 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "3.7.6", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "3.7.5", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "3.7.4", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "3.7.3", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "3.7.2", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "3.7.1", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "version": "3.7.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Fix Bancor support of ETH", | ||||||
|  |                 "pr": 88 | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "timestamp": 1608105788 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "3.6.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "3.6.8", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "3.6.7", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "3.6.6", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "3.6.5", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "3.6.4", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "3.6.3", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "3.6.2", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "3.6.1", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "version": "3.6.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Add `SwerveBridge` and `SnowSwapBridge` (duplicate of `CurveBridge`)", | ||||||
|  |                 "pr": 2707 | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "timestamp": 1603833198 | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "version": "3.5.0", |         "version": "3.5.0", | ||||||
|         "changes": [ |         "changes": [ | ||||||
|   | |||||||
| @@ -5,6 +5,74 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v3.7.6 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.7.5 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.7.4 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.7.3 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.7.2 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.7.1 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.7.0 - _December 16, 2020_ | ||||||
|  |  | ||||||
|  |     * Fix Bancor support of ETH (#88) | ||||||
|  |  | ||||||
|  | ## v3.6.9 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.6.8 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.6.7 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.6.6 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.6.5 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.6.4 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.6.3 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.6.2 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.6.1 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.6.0 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Add `SwerveBridge` and `SnowSwapBridge` (duplicate of `CurveBridge`) (#2707) | ||||||
|  |  | ||||||
| ## v3.5.0 - _October 21, 2020_ | ## v3.5.0 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Update `CurveBridge` to support more varied curves (#2633) |     * Update `CurveBridge` to support more varied curves (#2633) | ||||||
|   | |||||||
| @@ -21,6 +21,7 @@ pragma solidity ^0.5.9; | |||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol"; | import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol"; | ||||||
|  | import "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol"; | ||||||
| import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; | import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; | ||||||
| import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol"; | import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol"; | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | ||||||
| @@ -36,6 +37,20 @@ contract BancorBridge is | |||||||
|     struct TransferState { |     struct TransferState { | ||||||
|         address bancorNetworkAddress; |         address bancorNetworkAddress; | ||||||
|         address[] path; |         address[] path; | ||||||
|  |         IEtherToken weth; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Bancor ETH pseudo-address. | ||||||
|  |     address constant public BANCOR_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||||
|  |  | ||||||
|  |     // solhint-disable no-empty-blocks | ||||||
|  |     /// @dev Payable fallback to receive ETH from Bancor/WETH. | ||||||
|  |     function () | ||||||
|  |         external | ||||||
|  |         payable | ||||||
|  |     { | ||||||
|  |         // Poor man's receive in 0.5.9 | ||||||
|  |         require(msg.data.length == 0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of |     /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of | ||||||
| @@ -60,7 +75,6 @@ contract BancorBridge is | |||||||
|     { |     { | ||||||
|         // hold variables to get around stack depth limitations |         // hold variables to get around stack depth limitations | ||||||
|         TransferState memory state; |         TransferState memory state; | ||||||
|  |  | ||||||
|         // Decode the bridge data. |         // Decode the bridge data. | ||||||
|         ( |         ( | ||||||
|             state.path, |             state.path, | ||||||
| @@ -68,34 +82,42 @@ contract BancorBridge is | |||||||
|         // solhint-disable indent |         // solhint-disable indent | ||||||
|         ) = abi.decode(bridgeData, (address[], address)); |         ) = abi.decode(bridgeData, (address[], address)); | ||||||
|         // solhint-enable indent |         // solhint-enable indent | ||||||
|  |         state.weth = IEtherToken(_getWethAddress()); | ||||||
|  |  | ||||||
|         require(state.path.length > 0, "BancorBridge/PATH_MUST_EXIST"); |         require(state.path.length >= 2, "BancorBridge/PATH_LENGTH_MUST_BE_GREATER_THAN_TWO"); | ||||||
|         // Just transfer the tokens if they're the same. |  | ||||||
|         if (state.path[0] == toTokenAddress) { |         // Grant an allowance to the Bancor Network to spend `fromTokenAddress` token. | ||||||
|             LibERC20Token.transfer(state.path[0], to, amount); |         uint256 fromTokenBalance; | ||||||
|             return BRIDGE_SUCCESS; |         uint256 payableAmount = 0; | ||||||
|  |         // If it's ETH in the path then withdraw from WETH | ||||||
|  |         // The Bancor path will have ETH as the 0xeee address | ||||||
|  |         // Bancor expects to be paid in ETH not WETH | ||||||
|  |         if (state.path[0] == BANCOR_ETH_ADDRESS) { | ||||||
|  |             fromTokenBalance = state.weth.balanceOf(address(this)); | ||||||
|  |             state.weth.withdraw(fromTokenBalance); | ||||||
|  |             payableAmount = fromTokenBalance; | ||||||
|  |         } else { | ||||||
|  |             fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this)); | ||||||
|  |             LibERC20Token.approveIfBelow(state.path[0], state.bancorNetworkAddress, fromTokenBalance); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Otherwise use Bancor to convert |  | ||||||
|         require(state.path.length > 2, "BancorBridge/PATH_LENGTH_MUST_BE_GREATER_THAN_TWO"); |  | ||||||
|         require(state.path[state.path.length - 1] == toTokenAddress, "BancorBridge/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN"); |  | ||||||
|          |  | ||||||
|         // // Grant an allowance to the Bancor Network to spend `fromTokenAddress` token. |  | ||||||
|         uint256 fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this)); |  | ||||||
|         LibERC20Token.approveIfBelow(state.path[0], state.bancorNetworkAddress, fromTokenBalance); |  | ||||||
|  |  | ||||||
|         // Convert the tokens |         // Convert the tokens | ||||||
|         uint256 boughtAmount = IBancorNetwork(state.bancorNetworkAddress).convertByPath( |         uint256 boughtAmount = IBancorNetwork(state.bancorNetworkAddress).convertByPath.value(payableAmount)( | ||||||
|             state.path, // path originating with source token and terminating in destination token |             state.path, // path originating with source token and terminating in destination token | ||||||
|             fromTokenBalance, // amount of source token to trade |             fromTokenBalance, // amount of source token to trade | ||||||
|             amount, // minimum amount of destination token expected to receive |             amount, // minimum amount of destination token expected to receive | ||||||
|             to, // beneficiary |             state.path[state.path.length-1] == BANCOR_ETH_ADDRESS ? address(this) : to, // beneficiary | ||||||
|             address(0), // affiliateAccount; no fee paid |             address(0), // affiliateAccount; no fee paid | ||||||
|             0 // affiliateFee; no fee paid |             0 // affiliateFee; no fee paid | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|  |         if (state.path[state.path.length-1] == BANCOR_ETH_ADDRESS) { | ||||||
|  |             state.weth.deposit.value(boughtAmount)(); | ||||||
|  |             state.weth.transfer(to, boughtAmount); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         emit ERC20BridgeTransfer( |         emit ERC20BridgeTransfer( | ||||||
|             state.path[0], // fromTokenAddress |             state.path[0] == BANCOR_ETH_ADDRESS ? address(state.weth) : state.path[0], | ||||||
|             toTokenAddress, |             toTokenAddress, | ||||||
|             fromTokenBalance, |             fromTokenBalance, | ||||||
|             boughtAmount, |             boughtAmount, | ||||||
|   | |||||||
							
								
								
									
										136
									
								
								contracts/asset-proxy/contracts/src/bridges/CryptoComBridge.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								contracts/asset-proxy/contracts/src/bridges/CryptoComBridge.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,136 @@ | |||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.5.9; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol"; | ||||||
|  | import "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol"; | ||||||
|  | import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; | ||||||
|  | import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol"; | ||||||
|  | import "@0x/contracts-utils/contracts/src/LibAddressArray.sol"; | ||||||
|  | import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | ||||||
|  | import "../interfaces/IUniswapV2Router01.sol"; | ||||||
|  | import "../interfaces/IERC20Bridge.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // solhint-disable space-after-comma | ||||||
|  | // solhint-disable not-rely-on-time | ||||||
|  | contract CryptoComBridge is | ||||||
|  |     IERC20Bridge, | ||||||
|  |     IWallet, | ||||||
|  |     DeploymentConstants | ||||||
|  | { | ||||||
|  |     struct TransferState { | ||||||
|  |         address[] path; | ||||||
|  |         address router; | ||||||
|  |         uint256 fromTokenBalance; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of | ||||||
|  |     ///      `toTokenAddress` tokens by selling the entirety of the `fromTokenAddress` | ||||||
|  |     ///      token encoded in the bridge data. | ||||||
|  |     /// @param toTokenAddress The token to buy and transfer to `to`. | ||||||
|  |     /// @param from The maker (this contract). | ||||||
|  |     /// @param to The recipient of the bought tokens. | ||||||
|  |     /// @param amount Minimum amount of `toTokenAddress` tokens to buy. | ||||||
|  |     /// @param bridgeData The abi-encoded path of token addresses. Last element must be toTokenAddress | ||||||
|  |     /// @return success The magic bytes if successful. | ||||||
|  |     function bridgeTransferFrom( | ||||||
|  |         address toTokenAddress, | ||||||
|  |         address from, | ||||||
|  |         address to, | ||||||
|  |         uint256 amount, | ||||||
|  |         bytes calldata bridgeData | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |         returns (bytes4 success) | ||||||
|  |     { | ||||||
|  |         // hold variables to get around stack depth limitations | ||||||
|  |         TransferState memory state; | ||||||
|  |  | ||||||
|  |         // Decode the bridge data to get the `fromTokenAddress`. | ||||||
|  |         // solhint-disable indent | ||||||
|  |         (state.path, state.router) = abi.decode(bridgeData, (address[], address)); | ||||||
|  |         // solhint-enable indent | ||||||
|  |  | ||||||
|  |         require(state.path.length >= 2, "CryptoComBridge/PATH_LENGTH_MUST_BE_AT_LEAST_TWO"); | ||||||
|  |         require(state.path[state.path.length - 1] == toTokenAddress, "CryptoComBridge/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN"); | ||||||
|  |  | ||||||
|  |         // Just transfer the tokens if they're the same. | ||||||
|  |         if (state.path[0] == toTokenAddress) { | ||||||
|  |             LibERC20Token.transfer(state.path[0], to, amount); | ||||||
|  |             return BRIDGE_SUCCESS; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Get our balance of `fromTokenAddress` token. | ||||||
|  |         state.fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this)); | ||||||
|  |  | ||||||
|  |         // Grant the SushiSwap router an allowance. | ||||||
|  |         LibERC20Token.approveIfBelow( | ||||||
|  |             state.path[0], | ||||||
|  |             state.router, | ||||||
|  |             state.fromTokenBalance | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         // Buy as much `toTokenAddress` token with `fromTokenAddress` token | ||||||
|  |         // and transfer it to `to`. | ||||||
|  |         IUniswapV2Router01 router = IUniswapV2Router01(state.router); | ||||||
|  |         uint[] memory amounts = router.swapExactTokensForTokens( | ||||||
|  |              // Sell all tokens we hold. | ||||||
|  |             state.fromTokenBalance, | ||||||
|  |              // Minimum buy amount. | ||||||
|  |             amount, | ||||||
|  |             // Convert `fromTokenAddress` to `toTokenAddress`. | ||||||
|  |             state.path, | ||||||
|  |             // Recipient is `to`. | ||||||
|  |             to, | ||||||
|  |             // Expires after this block. | ||||||
|  |             block.timestamp | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         emit ERC20BridgeTransfer( | ||||||
|  |             // input token | ||||||
|  |             state.path[0], | ||||||
|  |             // output token | ||||||
|  |             toTokenAddress, | ||||||
|  |             // input token amount | ||||||
|  |             state.fromTokenBalance, | ||||||
|  |             // output token amount | ||||||
|  |             amounts[amounts.length - 1], | ||||||
|  |             from, | ||||||
|  |             to | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         return BRIDGE_SUCCESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker | ||||||
|  |     ///      and sign for itself in orders. Always succeeds. | ||||||
|  |     /// @return magicValue Success bytes, always. | ||||||
|  |     function isValidSignature( | ||||||
|  |         bytes32, | ||||||
|  |         bytes calldata | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (bytes4 magicValue) | ||||||
|  |     { | ||||||
|  |         return LEGACY_WALLET_MAGIC_VALUE; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -56,11 +56,14 @@ contract KyberBridge is | |||||||
|     uint256 constant private KYBER_RATE_BASE = 10 ** 18; |     uint256 constant private KYBER_RATE_BASE = 10 ** 18; | ||||||
|  |  | ||||||
|     // solhint-disable no-empty-blocks |     // solhint-disable no-empty-blocks | ||||||
|     /// @dev Payable fallback to receive ETH from Kyber. |     /// @dev Payable fallback to receive ETH from Kyber/WETH. | ||||||
|     function () |     function () | ||||||
|         external |         external | ||||||
|         payable |         payable | ||||||
|     {} |     { | ||||||
|  |         // Poor man's receive in 0.5.9 | ||||||
|  |         require(msg.data.length == 0); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /// @dev Callback for `IKyberBridge`. Tries to buy `amount` of |     /// @dev Callback for `IKyberBridge`. Tries to buy `amount` of | ||||||
|     ///      `toTokenAddress` tokens by selling the entirety of the opposing asset |     ///      `toTokenAddress` tokens by selling the entirety of the opposing asset | ||||||
|   | |||||||
| @@ -51,16 +51,15 @@ contract ShellBridge is | |||||||
|         external |         external | ||||||
|         returns (bytes4 success) |         returns (bytes4 success) | ||||||
|     { |     { | ||||||
|         // Decode the bridge data to get the `fromTokenAddress`. |         // Decode the bridge data to get the `fromTokenAddress` and `pool`. | ||||||
|         (address fromTokenAddress) = abi.decode(bridgeData, (address)); |         (address fromTokenAddress, address pool) = abi.decode(bridgeData, (address, address)); | ||||||
|  |  | ||||||
|         uint256 fromTokenBalance = IERC20Token(fromTokenAddress).balanceOf(address(this)); |         uint256 fromTokenBalance = IERC20Token(fromTokenAddress).balanceOf(address(this)); | ||||||
|         IShell exchange = IShell(_getShellAddress()); |  | ||||||
|         // Grant an allowance to the exchange to spend `fromTokenAddress` token. |         // Grant an allowance to the exchange to spend `fromTokenAddress` token. | ||||||
|         LibERC20Token.approveIfBelow(fromTokenAddress, address(exchange), fromTokenBalance); |         LibERC20Token.approveIfBelow(fromTokenAddress, pool, fromTokenBalance); | ||||||
|  |  | ||||||
|         // Try to sell all of this contract's `fromTokenAddress` token balance. |         // Try to sell all of this contract's `fromTokenAddress` token balance. | ||||||
|         uint256 boughtAmount = exchange.originSwap( |         uint256 boughtAmount = IShell(pool).originSwap( | ||||||
|             fromTokenAddress, |             fromTokenAddress, | ||||||
|             toTokenAddress, |             toTokenAddress, | ||||||
|             fromTokenBalance, |             fromTokenBalance, | ||||||
|   | |||||||
							
								
								
									
										119
									
								
								contracts/asset-proxy/contracts/src/bridges/SnowSwapBridge.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								contracts/asset-proxy/contracts/src/bridges/SnowSwapBridge.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  |  | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2019 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.5.9; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol"; | ||||||
|  | import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; | ||||||
|  | import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol"; | ||||||
|  | import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | ||||||
|  | import "../interfaces/IERC20Bridge.sol"; | ||||||
|  | import "../interfaces/ICurve.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // solhint-disable not-rely-on-time | ||||||
|  | // solhint-disable space-after-comma | ||||||
|  | contract SnowSwapBridge is | ||||||
|  |     IERC20Bridge, | ||||||
|  |     IWallet, | ||||||
|  |     DeploymentConstants | ||||||
|  | { | ||||||
|  |     struct SnowSwapBridgeData { | ||||||
|  |         address curveAddress; | ||||||
|  |         bytes4 exchangeFunctionSelector; | ||||||
|  |         address fromTokenAddress; | ||||||
|  |         int128 fromCoinIdx; | ||||||
|  |         int128 toCoinIdx; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Callback for `ICurve`. Tries to buy `amount` of | ||||||
|  |     ///      `toTokenAddress` tokens by selling the entirety of the opposing asset | ||||||
|  |     ///      (DAI, USDC) to the Curve contract, then transfers the bought | ||||||
|  |     ///      tokens to `to`. | ||||||
|  |     /// @param toTokenAddress The token to give to `to` (i.e DAI, USDC, USDT). | ||||||
|  |     /// @param from The maker (this contract). | ||||||
|  |     /// @param to The recipient of the bought tokens. | ||||||
|  |     /// @param amount Minimum amount of `toTokenAddress` tokens to buy. | ||||||
|  |     /// @param bridgeData The abi-encoeded "from" token address. | ||||||
|  |     /// @return success The magic bytes if successful. | ||||||
|  |     function bridgeTransferFrom( | ||||||
|  |         address toTokenAddress, | ||||||
|  |         address from, | ||||||
|  |         address to, | ||||||
|  |         uint256 amount, | ||||||
|  |         bytes calldata bridgeData | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |         returns (bytes4 success) | ||||||
|  |     { | ||||||
|  |         // Decode the bridge data to get the SnowSwap metadata. | ||||||
|  |         SnowSwapBridgeData memory data = abi.decode(bridgeData, (SnowSwapBridgeData)); | ||||||
|  |  | ||||||
|  |         require(toTokenAddress != data.fromTokenAddress, "SnowSwapBridge/INVALID_PAIR"); | ||||||
|  |         uint256 fromTokenBalance = IERC20Token(data.fromTokenAddress).balanceOf(address(this)); | ||||||
|  |         // Grant an allowance to the exchange to spend `fromTokenAddress` token. | ||||||
|  |         LibERC20Token.approveIfBelow(data.fromTokenAddress, data.curveAddress, fromTokenBalance); | ||||||
|  |  | ||||||
|  |         // Try to sell all of this contract's `fromTokenAddress` token balance. | ||||||
|  |         { | ||||||
|  |             (bool didSucceed, bytes memory resultData) = | ||||||
|  |                 data.curveAddress.call(abi.encodeWithSelector( | ||||||
|  |                     data.exchangeFunctionSelector, | ||||||
|  |                     data.fromCoinIdx, | ||||||
|  |                     data.toCoinIdx, | ||||||
|  |                     // dx | ||||||
|  |                     fromTokenBalance, | ||||||
|  |                     // min dy | ||||||
|  |                     amount | ||||||
|  |                 )); | ||||||
|  |             if (!didSucceed) { | ||||||
|  |                 assembly { revert(add(resultData, 32), mload(resultData)) } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         uint256 toTokenBalance = IERC20Token(toTokenAddress).balanceOf(address(this)); | ||||||
|  |         // Transfer the converted `toToken`s to `to`. | ||||||
|  |         LibERC20Token.transfer(toTokenAddress, to, toTokenBalance); | ||||||
|  |  | ||||||
|  |         emit ERC20BridgeTransfer( | ||||||
|  |             data.fromTokenAddress, | ||||||
|  |             toTokenAddress, | ||||||
|  |             fromTokenBalance, | ||||||
|  |             toTokenBalance, | ||||||
|  |             from, | ||||||
|  |             to | ||||||
|  |         ); | ||||||
|  |         return BRIDGE_SUCCESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker | ||||||
|  |     ///      and sign for itself in orders. Always succeeds. | ||||||
|  |     /// @return magicValue Magic success bytes, always. | ||||||
|  |     function isValidSignature( | ||||||
|  |         bytes32, | ||||||
|  |         bytes calldata | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (bytes4 magicValue) | ||||||
|  |     { | ||||||
|  |         return LEGACY_WALLET_MAGIC_VALUE; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										119
									
								
								contracts/asset-proxy/contracts/src/bridges/SwerveBridge.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								contracts/asset-proxy/contracts/src/bridges/SwerveBridge.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  |  | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2019 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.5.9; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol"; | ||||||
|  | import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; | ||||||
|  | import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol"; | ||||||
|  | import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | ||||||
|  | import "../interfaces/IERC20Bridge.sol"; | ||||||
|  | import "../interfaces/ICurve.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // solhint-disable not-rely-on-time | ||||||
|  | // solhint-disable space-after-comma | ||||||
|  | contract SwerveBridge is | ||||||
|  |     IERC20Bridge, | ||||||
|  |     IWallet, | ||||||
|  |     DeploymentConstants | ||||||
|  | { | ||||||
|  |     struct SwerveBridgeData { | ||||||
|  |         address curveAddress; | ||||||
|  |         bytes4 exchangeFunctionSelector; | ||||||
|  |         address fromTokenAddress; | ||||||
|  |         int128 fromCoinIdx; | ||||||
|  |         int128 toCoinIdx; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Callback for `ICurve`. Tries to buy `amount` of | ||||||
|  |     ///      `toTokenAddress` tokens by selling the entirety of the opposing asset | ||||||
|  |     ///      (DAI, USDC) to the Curve contract, then transfers the bought | ||||||
|  |     ///      tokens to `to`. | ||||||
|  |     /// @param toTokenAddress The token to give to `to` (i.e DAI, USDC, USDT). | ||||||
|  |     /// @param from The maker (this contract). | ||||||
|  |     /// @param to The recipient of the bought tokens. | ||||||
|  |     /// @param amount Minimum amount of `toTokenAddress` tokens to buy. | ||||||
|  |     /// @param bridgeData The abi-encoeded "from" token address. | ||||||
|  |     /// @return success The magic bytes if successful. | ||||||
|  |     function bridgeTransferFrom( | ||||||
|  |         address toTokenAddress, | ||||||
|  |         address from, | ||||||
|  |         address to, | ||||||
|  |         uint256 amount, | ||||||
|  |         bytes calldata bridgeData | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |         returns (bytes4 success) | ||||||
|  |     { | ||||||
|  |         // Decode the bridge data to get the SwerveBridgeData metadata. | ||||||
|  |         SwerveBridgeData memory data = abi.decode(bridgeData, (SwerveBridgeData)); | ||||||
|  |  | ||||||
|  |         require(toTokenAddress != data.fromTokenAddress, "SwerveBridge/INVALID_PAIR"); | ||||||
|  |         uint256 fromTokenBalance = IERC20Token(data.fromTokenAddress).balanceOf(address(this)); | ||||||
|  |         // Grant an allowance to the exchange to spend `fromTokenAddress` token. | ||||||
|  |         LibERC20Token.approveIfBelow(data.fromTokenAddress, data.curveAddress, fromTokenBalance); | ||||||
|  |  | ||||||
|  |         // Try to sell all of this contract's `fromTokenAddress` token balance. | ||||||
|  |         { | ||||||
|  |             (bool didSucceed, bytes memory resultData) = | ||||||
|  |                 data.curveAddress.call(abi.encodeWithSelector( | ||||||
|  |                     data.exchangeFunctionSelector, | ||||||
|  |                     data.fromCoinIdx, | ||||||
|  |                     data.toCoinIdx, | ||||||
|  |                     // dx | ||||||
|  |                     fromTokenBalance, | ||||||
|  |                     // min dy | ||||||
|  |                     amount | ||||||
|  |                 )); | ||||||
|  |             if (!didSucceed) { | ||||||
|  |                 assembly { revert(add(resultData, 32), mload(resultData)) } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         uint256 toTokenBalance = IERC20Token(toTokenAddress).balanceOf(address(this)); | ||||||
|  |         // Transfer the converted `toToken`s to `to`. | ||||||
|  |         LibERC20Token.transfer(toTokenAddress, to, toTokenBalance); | ||||||
|  |  | ||||||
|  |         emit ERC20BridgeTransfer( | ||||||
|  |             data.fromTokenAddress, | ||||||
|  |             toTokenAddress, | ||||||
|  |             fromTokenBalance, | ||||||
|  |             toTokenBalance, | ||||||
|  |             from, | ||||||
|  |             to | ||||||
|  |         ); | ||||||
|  |         return BRIDGE_SUCCESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker | ||||||
|  |     ///      and sign for itself in orders. Always succeeds. | ||||||
|  |     /// @return magicValue Magic success bytes, always. | ||||||
|  |     function isValidSignature( | ||||||
|  |         bytes32, | ||||||
|  |         bytes calldata | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (bytes4 magicValue) | ||||||
|  |     { | ||||||
|  |         return LEGACY_WALLET_MAGIC_VALUE; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-asset-proxy", |     "name": "@0x/contracts-asset-proxy", | ||||||
|     "version": "3.5.0", |     "version": "3.7.6", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -38,7 +38,7 @@ | |||||||
|         "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES" |         "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES" | ||||||
|     }, |     }, | ||||||
|     "config": { |     "config": { | ||||||
|         "abis": "./test/generated-artifacts/@(BalancerBridge|BancorBridge|ChaiBridge|CreamBridge|CurveBridge|DODOBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IBancorNetwork|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IMooniswap|IShell|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MooniswapBridge|MultiAssetProxy|Ownable|ShellBridge|StaticCallProxy|SushiSwapBridge|TestBancorBridge|TestChaiBridge|TestDexForwarderBridge|TestDydxBridge|TestERC20Bridge|TestEth2DaiBridge|TestKyberBridge|TestStaticCallTarget|TestUniswapBridge|TestUniswapV2Bridge|UniswapBridge|UniswapV2Bridge).json", |         "abis": "./test/generated-artifacts/@(BalancerBridge|BancorBridge|ChaiBridge|CreamBridge|CryptoComBridge|CurveBridge|DODOBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IBancorNetwork|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IMooniswap|IShell|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MooniswapBridge|MultiAssetProxy|Ownable|ShellBridge|SnowSwapBridge|StaticCallProxy|SushiSwapBridge|SwerveBridge|TestBancorBridge|TestChaiBridge|TestDexForwarderBridge|TestDydxBridge|TestERC20Bridge|TestEth2DaiBridge|TestKyberBridge|TestStaticCallTarget|TestUniswapBridge|TestUniswapV2Bridge|UniswapBridge|UniswapV2Bridge).json", | ||||||
|         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." |         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." | ||||||
|     }, |     }, | ||||||
|     "repository": { |     "repository": { | ||||||
| @@ -51,13 +51,13 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contract-wrappers": "^13.9.0", |         "@0x/contract-wrappers": "^13.12.3", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@types/lodash": "4.14.104", |         "@types/lodash": "4.14.104", | ||||||
| @@ -79,17 +79,17 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/contracts-erc1155": "^2.1.8", |         "@0x/contracts-erc1155": "^2.1.24", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-erc721": "^3.1.8", |         "@0x/contracts-erc721": "^3.1.24", | ||||||
|         "@0x/contracts-exchange-libs": "^4.3.8", |         "@0x/contracts-exchange-libs": "^4.3.24", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "ethereum-types": "^3.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "lodash": "^4.17.11" |         "lodash": "^4.17.11" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ import * as BalancerBridge from '../generated-artifacts/BalancerBridge.json'; | |||||||
| import * as BancorBridge from '../generated-artifacts/BancorBridge.json'; | import * as BancorBridge from '../generated-artifacts/BancorBridge.json'; | ||||||
| import * as ChaiBridge from '../generated-artifacts/ChaiBridge.json'; | import * as ChaiBridge from '../generated-artifacts/ChaiBridge.json'; | ||||||
| import * as CreamBridge from '../generated-artifacts/CreamBridge.json'; | import * as CreamBridge from '../generated-artifacts/CreamBridge.json'; | ||||||
|  | import * as CryptoComBridge from '../generated-artifacts/CryptoComBridge.json'; | ||||||
| import * as CurveBridge from '../generated-artifacts/CurveBridge.json'; | import * as CurveBridge from '../generated-artifacts/CurveBridge.json'; | ||||||
| import * as DexForwarderBridge from '../generated-artifacts/DexForwarderBridge.json'; | import * as DexForwarderBridge from '../generated-artifacts/DexForwarderBridge.json'; | ||||||
| import * as DODOBridge from '../generated-artifacts/DODOBridge.json'; | import * as DODOBridge from '../generated-artifacts/DODOBridge.json'; | ||||||
| @@ -47,8 +48,10 @@ import * as MStableBridge from '../generated-artifacts/MStableBridge.json'; | |||||||
| import * as MultiAssetProxy from '../generated-artifacts/MultiAssetProxy.json'; | import * as MultiAssetProxy from '../generated-artifacts/MultiAssetProxy.json'; | ||||||
| import * as Ownable from '../generated-artifacts/Ownable.json'; | import * as Ownable from '../generated-artifacts/Ownable.json'; | ||||||
| import * as ShellBridge from '../generated-artifacts/ShellBridge.json'; | import * as ShellBridge from '../generated-artifacts/ShellBridge.json'; | ||||||
|  | import * as SnowSwapBridge from '../generated-artifacts/SnowSwapBridge.json'; | ||||||
| import * as StaticCallProxy from '../generated-artifacts/StaticCallProxy.json'; | import * as StaticCallProxy from '../generated-artifacts/StaticCallProxy.json'; | ||||||
| import * as SushiSwapBridge from '../generated-artifacts/SushiSwapBridge.json'; | import * as SushiSwapBridge from '../generated-artifacts/SushiSwapBridge.json'; | ||||||
|  | import * as SwerveBridge from '../generated-artifacts/SwerveBridge.json'; | ||||||
| import * as TestBancorBridge from '../generated-artifacts/TestBancorBridge.json'; | import * as TestBancorBridge from '../generated-artifacts/TestBancorBridge.json'; | ||||||
| import * as TestChaiBridge from '../generated-artifacts/TestChaiBridge.json'; | import * as TestChaiBridge from '../generated-artifacts/TestChaiBridge.json'; | ||||||
| import * as TestDexForwarderBridge from '../generated-artifacts/TestDexForwarderBridge.json'; | import * as TestDexForwarderBridge from '../generated-artifacts/TestDexForwarderBridge.json'; | ||||||
| @@ -75,6 +78,7 @@ export const artifacts = { | |||||||
|     BancorBridge: BancorBridge as ContractArtifact, |     BancorBridge: BancorBridge as ContractArtifact, | ||||||
|     ChaiBridge: ChaiBridge as ContractArtifact, |     ChaiBridge: ChaiBridge as ContractArtifact, | ||||||
|     CreamBridge: CreamBridge as ContractArtifact, |     CreamBridge: CreamBridge as ContractArtifact, | ||||||
|  |     CryptoComBridge: CryptoComBridge as ContractArtifact, | ||||||
|     CurveBridge: CurveBridge as ContractArtifact, |     CurveBridge: CurveBridge as ContractArtifact, | ||||||
|     DODOBridge: DODOBridge as ContractArtifact, |     DODOBridge: DODOBridge as ContractArtifact, | ||||||
|     DexForwarderBridge: DexForwarderBridge as ContractArtifact, |     DexForwarderBridge: DexForwarderBridge as ContractArtifact, | ||||||
| @@ -85,7 +89,9 @@ export const artifacts = { | |||||||
|     MixinGasToken: MixinGasToken as ContractArtifact, |     MixinGasToken: MixinGasToken as ContractArtifact, | ||||||
|     MooniswapBridge: MooniswapBridge as ContractArtifact, |     MooniswapBridge: MooniswapBridge as ContractArtifact, | ||||||
|     ShellBridge: ShellBridge as ContractArtifact, |     ShellBridge: ShellBridge as ContractArtifact, | ||||||
|  |     SnowSwapBridge: SnowSwapBridge as ContractArtifact, | ||||||
|     SushiSwapBridge: SushiSwapBridge as ContractArtifact, |     SushiSwapBridge: SushiSwapBridge as ContractArtifact, | ||||||
|  |     SwerveBridge: SwerveBridge as ContractArtifact, | ||||||
|     UniswapBridge: UniswapBridge as ContractArtifact, |     UniswapBridge: UniswapBridge as ContractArtifact, | ||||||
|     UniswapV2Bridge: UniswapV2Bridge as ContractArtifact, |     UniswapV2Bridge: UniswapV2Bridge as ContractArtifact, | ||||||
|     IAssetData: IAssetData as ContractArtifact, |     IAssetData: IAssetData as ContractArtifact, | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ export * from '../generated-wrappers/balancer_bridge'; | |||||||
| export * from '../generated-wrappers/bancor_bridge'; | export * from '../generated-wrappers/bancor_bridge'; | ||||||
| export * from '../generated-wrappers/chai_bridge'; | export * from '../generated-wrappers/chai_bridge'; | ||||||
| export * from '../generated-wrappers/cream_bridge'; | export * from '../generated-wrappers/cream_bridge'; | ||||||
|  | export * from '../generated-wrappers/crypto_com_bridge'; | ||||||
| export * from '../generated-wrappers/curve_bridge'; | export * from '../generated-wrappers/curve_bridge'; | ||||||
| export * from '../generated-wrappers/d_o_d_o_bridge'; | export * from '../generated-wrappers/d_o_d_o_bridge'; | ||||||
| export * from '../generated-wrappers/dex_forwarder_bridge'; | export * from '../generated-wrappers/dex_forwarder_bridge'; | ||||||
| @@ -45,8 +46,10 @@ export * from '../generated-wrappers/mooniswap_bridge'; | |||||||
| export * from '../generated-wrappers/multi_asset_proxy'; | export * from '../generated-wrappers/multi_asset_proxy'; | ||||||
| export * from '../generated-wrappers/ownable'; | export * from '../generated-wrappers/ownable'; | ||||||
| export * from '../generated-wrappers/shell_bridge'; | export * from '../generated-wrappers/shell_bridge'; | ||||||
|  | export * from '../generated-wrappers/snow_swap_bridge'; | ||||||
| export * from '../generated-wrappers/static_call_proxy'; | export * from '../generated-wrappers/static_call_proxy'; | ||||||
| export * from '../generated-wrappers/sushi_swap_bridge'; | export * from '../generated-wrappers/sushi_swap_bridge'; | ||||||
|  | export * from '../generated-wrappers/swerve_bridge'; | ||||||
| export * from '../generated-wrappers/test_bancor_bridge'; | export * from '../generated-wrappers/test_bancor_bridge'; | ||||||
| export * from '../generated-wrappers/test_chai_bridge'; | export * from '../generated-wrappers/test_chai_bridge'; | ||||||
| export * from '../generated-wrappers/test_dex_forwarder_bridge'; | export * from '../generated-wrappers/test_dex_forwarder_bridge'; | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ import * as BalancerBridge from '../test/generated-artifacts/BalancerBridge.json | |||||||
| import * as BancorBridge from '../test/generated-artifacts/BancorBridge.json'; | import * as BancorBridge from '../test/generated-artifacts/BancorBridge.json'; | ||||||
| import * as ChaiBridge from '../test/generated-artifacts/ChaiBridge.json'; | import * as ChaiBridge from '../test/generated-artifacts/ChaiBridge.json'; | ||||||
| import * as CreamBridge from '../test/generated-artifacts/CreamBridge.json'; | import * as CreamBridge from '../test/generated-artifacts/CreamBridge.json'; | ||||||
|  | import * as CryptoComBridge from '../test/generated-artifacts/CryptoComBridge.json'; | ||||||
| import * as CurveBridge from '../test/generated-artifacts/CurveBridge.json'; | import * as CurveBridge from '../test/generated-artifacts/CurveBridge.json'; | ||||||
| import * as DexForwarderBridge from '../test/generated-artifacts/DexForwarderBridge.json'; | import * as DexForwarderBridge from '../test/generated-artifacts/DexForwarderBridge.json'; | ||||||
| import * as DODOBridge from '../test/generated-artifacts/DODOBridge.json'; | import * as DODOBridge from '../test/generated-artifacts/DODOBridge.json'; | ||||||
| @@ -47,8 +48,10 @@ import * as MStableBridge from '../test/generated-artifacts/MStableBridge.json'; | |||||||
| import * as MultiAssetProxy from '../test/generated-artifacts/MultiAssetProxy.json'; | import * as MultiAssetProxy from '../test/generated-artifacts/MultiAssetProxy.json'; | ||||||
| import * as Ownable from '../test/generated-artifacts/Ownable.json'; | import * as Ownable from '../test/generated-artifacts/Ownable.json'; | ||||||
| import * as ShellBridge from '../test/generated-artifacts/ShellBridge.json'; | import * as ShellBridge from '../test/generated-artifacts/ShellBridge.json'; | ||||||
|  | import * as SnowSwapBridge from '../test/generated-artifacts/SnowSwapBridge.json'; | ||||||
| import * as StaticCallProxy from '../test/generated-artifacts/StaticCallProxy.json'; | import * as StaticCallProxy from '../test/generated-artifacts/StaticCallProxy.json'; | ||||||
| import * as SushiSwapBridge from '../test/generated-artifacts/SushiSwapBridge.json'; | import * as SushiSwapBridge from '../test/generated-artifacts/SushiSwapBridge.json'; | ||||||
|  | import * as SwerveBridge from '../test/generated-artifacts/SwerveBridge.json'; | ||||||
| import * as TestBancorBridge from '../test/generated-artifacts/TestBancorBridge.json'; | import * as TestBancorBridge from '../test/generated-artifacts/TestBancorBridge.json'; | ||||||
| import * as TestChaiBridge from '../test/generated-artifacts/TestChaiBridge.json'; | import * as TestChaiBridge from '../test/generated-artifacts/TestChaiBridge.json'; | ||||||
| import * as TestDexForwarderBridge from '../test/generated-artifacts/TestDexForwarderBridge.json'; | import * as TestDexForwarderBridge from '../test/generated-artifacts/TestDexForwarderBridge.json'; | ||||||
| @@ -75,6 +78,7 @@ export const artifacts = { | |||||||
|     BancorBridge: BancorBridge as ContractArtifact, |     BancorBridge: BancorBridge as ContractArtifact, | ||||||
|     ChaiBridge: ChaiBridge as ContractArtifact, |     ChaiBridge: ChaiBridge as ContractArtifact, | ||||||
|     CreamBridge: CreamBridge as ContractArtifact, |     CreamBridge: CreamBridge as ContractArtifact, | ||||||
|  |     CryptoComBridge: CryptoComBridge as ContractArtifact, | ||||||
|     CurveBridge: CurveBridge as ContractArtifact, |     CurveBridge: CurveBridge as ContractArtifact, | ||||||
|     DODOBridge: DODOBridge as ContractArtifact, |     DODOBridge: DODOBridge as ContractArtifact, | ||||||
|     DexForwarderBridge: DexForwarderBridge as ContractArtifact, |     DexForwarderBridge: DexForwarderBridge as ContractArtifact, | ||||||
| @@ -85,7 +89,9 @@ export const artifacts = { | |||||||
|     MixinGasToken: MixinGasToken as ContractArtifact, |     MixinGasToken: MixinGasToken as ContractArtifact, | ||||||
|     MooniswapBridge: MooniswapBridge as ContractArtifact, |     MooniswapBridge: MooniswapBridge as ContractArtifact, | ||||||
|     ShellBridge: ShellBridge as ContractArtifact, |     ShellBridge: ShellBridge as ContractArtifact, | ||||||
|  |     SnowSwapBridge: SnowSwapBridge as ContractArtifact, | ||||||
|     SushiSwapBridge: SushiSwapBridge as ContractArtifact, |     SushiSwapBridge: SushiSwapBridge as ContractArtifact, | ||||||
|  |     SwerveBridge: SwerveBridge as ContractArtifact, | ||||||
|     UniswapBridge: UniswapBridge as ContractArtifact, |     UniswapBridge: UniswapBridge as ContractArtifact, | ||||||
|     UniswapV2Bridge: UniswapV2Bridge as ContractArtifact, |     UniswapV2Bridge: UniswapV2Bridge as ContractArtifact, | ||||||
|     IAssetData: IAssetData as ContractArtifact, |     IAssetData: IAssetData as ContractArtifact, | ||||||
|   | |||||||
| @@ -12,13 +12,11 @@ import { DecodedLogs } from 'ethereum-types'; | |||||||
| import * as _ from 'lodash'; | import * as _ from 'lodash'; | ||||||
|  |  | ||||||
| import { artifacts } from './artifacts'; | import { artifacts } from './artifacts'; | ||||||
|  |  | ||||||
| import { TestBancorBridgeContract } from './generated-wrappers/test_bancor_bridge'; | import { TestBancorBridgeContract } from './generated-wrappers/test_bancor_bridge'; | ||||||
| import { | import { | ||||||
|     TestBancorBridgeConvertByPathInputEventArgs as ConvertByPathArgs, |     TestBancorBridgeConvertByPathInputEventArgs as ConvertByPathArgs, | ||||||
|     TestBancorBridgeEvents as ContractEvents, |     TestBancorBridgeEvents as ContractEvents, | ||||||
|     TestBancorBridgeTokenApproveEventArgs as TokenApproveArgs, |     TestBancorBridgeTokenApproveEventArgs as TokenApproveArgs, | ||||||
|     TestBancorBridgeTokenTransferEventArgs as TokenTransferArgs, |  | ||||||
| } from './wrappers'; | } from './wrappers'; | ||||||
|  |  | ||||||
| blockchainTests.resets('Bancor unit tests', env => { | blockchainTests.resets('Bancor unit tests', env => { | ||||||
| @@ -128,24 +126,6 @@ blockchainTests.resets('Bancor unit tests', env => { | |||||||
|             expect(result).to.eq(AssetProxyId.ERC20Bridge); |             expect(result).to.eq(AssetProxyId.ERC20Bridge); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         it('performs transfer when both tokens are the same', async () => { |  | ||||||
|             const createTokenFn = testContract.createToken(constants.NULL_ADDRESS); |  | ||||||
|             const tokenAddress = await createTokenFn.callAsync(); |  | ||||||
|             await createTokenFn.awaitTransactionSuccessAsync(); |  | ||||||
|  |  | ||||||
|             const { opts, result, logs } = await transferFromAsync({ |  | ||||||
|                 tokenAddressesPath: [tokenAddress, tokenAddress], |  | ||||||
|             }); |  | ||||||
|             expect(result).to.eq(AssetProxyId.ERC20Bridge, 'asset proxy id'); |  | ||||||
|             const transfers = filterLogsToArguments<TokenTransferArgs>(logs, ContractEvents.TokenTransfer); |  | ||||||
|  |  | ||||||
|             expect(transfers.length).to.eq(1); |  | ||||||
|             expect(transfers[0].token).to.eq(tokenAddress, 'input token address'); |  | ||||||
|             expect(transfers[0].from).to.eq(testContract.address); |  | ||||||
|             expect(transfers[0].to).to.eq(opts.toAddress, 'recipient address'); |  | ||||||
|             expect(transfers[0].amount).to.bignumber.eq(opts.amount, 'amount'); |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         describe('token -> token', async () => { |         describe('token -> token', async () => { | ||||||
|             it('calls BancorNetwork.convertByPath()', async () => { |             it('calls BancorNetwork.convertByPath()', async () => { | ||||||
|                 const { opts, result, logs } = await transferFromAsync(); |                 const { opts, result, logs } = await transferFromAsync(); | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ export * from '../test/generated-wrappers/balancer_bridge'; | |||||||
| export * from '../test/generated-wrappers/bancor_bridge'; | export * from '../test/generated-wrappers/bancor_bridge'; | ||||||
| export * from '../test/generated-wrappers/chai_bridge'; | export * from '../test/generated-wrappers/chai_bridge'; | ||||||
| export * from '../test/generated-wrappers/cream_bridge'; | export * from '../test/generated-wrappers/cream_bridge'; | ||||||
|  | export * from '../test/generated-wrappers/crypto_com_bridge'; | ||||||
| export * from '../test/generated-wrappers/curve_bridge'; | export * from '../test/generated-wrappers/curve_bridge'; | ||||||
| export * from '../test/generated-wrappers/d_o_d_o_bridge'; | export * from '../test/generated-wrappers/d_o_d_o_bridge'; | ||||||
| export * from '../test/generated-wrappers/dex_forwarder_bridge'; | export * from '../test/generated-wrappers/dex_forwarder_bridge'; | ||||||
| @@ -45,8 +46,10 @@ export * from '../test/generated-wrappers/mooniswap_bridge'; | |||||||
| export * from '../test/generated-wrappers/multi_asset_proxy'; | export * from '../test/generated-wrappers/multi_asset_proxy'; | ||||||
| export * from '../test/generated-wrappers/ownable'; | export * from '../test/generated-wrappers/ownable'; | ||||||
| export * from '../test/generated-wrappers/shell_bridge'; | export * from '../test/generated-wrappers/shell_bridge'; | ||||||
|  | export * from '../test/generated-wrappers/snow_swap_bridge'; | ||||||
| export * from '../test/generated-wrappers/static_call_proxy'; | export * from '../test/generated-wrappers/static_call_proxy'; | ||||||
| export * from '../test/generated-wrappers/sushi_swap_bridge'; | export * from '../test/generated-wrappers/sushi_swap_bridge'; | ||||||
|  | export * from '../test/generated-wrappers/swerve_bridge'; | ||||||
| export * from '../test/generated-wrappers/test_bancor_bridge'; | export * from '../test/generated-wrappers/test_bancor_bridge'; | ||||||
| export * from '../test/generated-wrappers/test_chai_bridge'; | export * from '../test/generated-wrappers/test_chai_bridge'; | ||||||
| export * from '../test/generated-wrappers/test_dex_forwarder_bridge'; | export * from '../test/generated-wrappers/test_dex_forwarder_bridge'; | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ | |||||||
|         "generated-artifacts/BancorBridge.json", |         "generated-artifacts/BancorBridge.json", | ||||||
|         "generated-artifacts/ChaiBridge.json", |         "generated-artifacts/ChaiBridge.json", | ||||||
|         "generated-artifacts/CreamBridge.json", |         "generated-artifacts/CreamBridge.json", | ||||||
|  |         "generated-artifacts/CryptoComBridge.json", | ||||||
|         "generated-artifacts/CurveBridge.json", |         "generated-artifacts/CurveBridge.json", | ||||||
|         "generated-artifacts/DODOBridge.json", |         "generated-artifacts/DODOBridge.json", | ||||||
|         "generated-artifacts/DexForwarderBridge.json", |         "generated-artifacts/DexForwarderBridge.json", | ||||||
| @@ -45,8 +46,10 @@ | |||||||
|         "generated-artifacts/MultiAssetProxy.json", |         "generated-artifacts/MultiAssetProxy.json", | ||||||
|         "generated-artifacts/Ownable.json", |         "generated-artifacts/Ownable.json", | ||||||
|         "generated-artifacts/ShellBridge.json", |         "generated-artifacts/ShellBridge.json", | ||||||
|  |         "generated-artifacts/SnowSwapBridge.json", | ||||||
|         "generated-artifacts/StaticCallProxy.json", |         "generated-artifacts/StaticCallProxy.json", | ||||||
|         "generated-artifacts/SushiSwapBridge.json", |         "generated-artifacts/SushiSwapBridge.json", | ||||||
|  |         "generated-artifacts/SwerveBridge.json", | ||||||
|         "generated-artifacts/TestBancorBridge.json", |         "generated-artifacts/TestBancorBridge.json", | ||||||
|         "generated-artifacts/TestChaiBridge.json", |         "generated-artifacts/TestChaiBridge.json", | ||||||
|         "generated-artifacts/TestDexForwarderBridge.json", |         "generated-artifacts/TestDexForwarderBridge.json", | ||||||
| @@ -63,6 +66,7 @@ | |||||||
|         "test/generated-artifacts/BancorBridge.json", |         "test/generated-artifacts/BancorBridge.json", | ||||||
|         "test/generated-artifacts/ChaiBridge.json", |         "test/generated-artifacts/ChaiBridge.json", | ||||||
|         "test/generated-artifacts/CreamBridge.json", |         "test/generated-artifacts/CreamBridge.json", | ||||||
|  |         "test/generated-artifacts/CryptoComBridge.json", | ||||||
|         "test/generated-artifacts/CurveBridge.json", |         "test/generated-artifacts/CurveBridge.json", | ||||||
|         "test/generated-artifacts/DODOBridge.json", |         "test/generated-artifacts/DODOBridge.json", | ||||||
|         "test/generated-artifacts/DexForwarderBridge.json", |         "test/generated-artifacts/DexForwarderBridge.json", | ||||||
| @@ -101,8 +105,10 @@ | |||||||
|         "test/generated-artifacts/MultiAssetProxy.json", |         "test/generated-artifacts/MultiAssetProxy.json", | ||||||
|         "test/generated-artifacts/Ownable.json", |         "test/generated-artifacts/Ownable.json", | ||||||
|         "test/generated-artifacts/ShellBridge.json", |         "test/generated-artifacts/ShellBridge.json", | ||||||
|  |         "test/generated-artifacts/SnowSwapBridge.json", | ||||||
|         "test/generated-artifacts/StaticCallProxy.json", |         "test/generated-artifacts/StaticCallProxy.json", | ||||||
|         "test/generated-artifacts/SushiSwapBridge.json", |         "test/generated-artifacts/SushiSwapBridge.json", | ||||||
|  |         "test/generated-artifacts/SwerveBridge.json", | ||||||
|         "test/generated-artifacts/TestBancorBridge.json", |         "test/generated-artifacts/TestBancorBridge.json", | ||||||
|         "test/generated-artifacts/TestChaiBridge.json", |         "test/generated-artifacts/TestChaiBridge.json", | ||||||
|         "test/generated-artifacts/TestDexForwarderBridge.json", |         "test/generated-artifacts/TestDexForwarderBridge.json", | ||||||
|   | |||||||
| @@ -1,4 +1,157 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "1.1.24", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "1.1.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "1.1.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "1.1.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "1.1.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "1.1.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608105788, | ||||||
|  |         "version": "1.1.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "1.1.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "1.1.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "1.1.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "1.1.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "1.1.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "1.1.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "1.1.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "1.1.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "1.1.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "1.1.8", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "1.1.7", |         "version": "1.1.7", | ||||||
|   | |||||||
| @@ -5,6 +5,74 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v1.1.24 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.23 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.22 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.21 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.20 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.19 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.18 - _December 16, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.17 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.16 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.15 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.14 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.13 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.12 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.11 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.10 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.9 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.1.8 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v1.1.7 - _October 21, 2020_ | ## v1.1.7 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-broker", |     "name": "@0x/contracts-broker", | ||||||
|     "version": "1.1.7", |     "version": "1.1.24", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -51,20 +51,20 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-asset-proxy": "^3.5.0", |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-erc721": "^3.1.8", |         "@0x/contracts-erc721": "^3.1.24", | ||||||
|         "@0x/contracts-exchange": "^3.2.8", |         "@0x/contracts-exchange": "^3.2.25", | ||||||
|         "@0x/contracts-exchange-libs": "^4.3.8", |         "@0x/contracts-exchange-libs": "^4.3.24", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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", | ||||||
| @@ -84,11 +84,11 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "ethereum-types": "^3.3.3" |         "ethereum-types": "^3.4.0" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|         "access": "public" |         "access": "public" | ||||||
|   | |||||||
| @@ -1,4 +1,157 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "3.1.25", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "3.1.24", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "3.1.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "3.1.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "3.1.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "3.1.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608105788, | ||||||
|  |         "version": "3.1.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "3.1.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "3.1.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "3.1.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "3.1.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "3.1.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "3.1.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "3.1.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "3.1.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "3.1.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "3.1.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "3.1.8", |         "version": "3.1.8", | ||||||
|   | |||||||
| @@ -5,6 +5,74 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v3.1.25 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.24 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.23 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.22 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.21 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.20 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.19 - _December 16, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.18 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.17 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.16 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.15 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.14 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.13 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.12 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.11 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.10 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.9 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v3.1.8 - _October 21, 2020_ | ## v3.1.8 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-coordinator", |     "name": "@0x/contracts-coordinator", | ||||||
|     "version": "3.1.8", |     "version": "3.1.25", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -52,17 +52,17 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-asset-proxy": "^3.5.0", |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|         "@0x/contracts-dev-utils": "^1.3.6", |         "@0x/contracts-dev-utils": "^1.3.23", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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", | ||||||
| @@ -82,17 +82,17 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/assert": "^3.0.13", |         "@0x/assert": "^3.0.21", | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/contract-addresses": "^4.12.0", |         "@0x/contract-addresses": "^5.10.0", | ||||||
|         "@0x/contracts-exchange": "^3.2.8", |         "@0x/contracts-exchange": "^3.2.25", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/json-schemas": "^5.2.3", |         "@0x/json-schemas": "^5.4.1", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "ethereum-types": "^3.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "http-status-codes": "^1.3.2" |         "http-status-codes": "^1.3.2" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|   | |||||||
| @@ -1,4 +1,157 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "1.3.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "1.3.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "1.3.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "1.3.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "1.3.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "1.3.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608105788, | ||||||
|  |         "version": "1.3.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "1.3.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "1.3.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "1.3.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "1.3.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "1.3.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "1.3.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "1.3.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "1.3.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "1.3.8", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "1.3.7", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "1.3.6", |         "version": "1.3.6", | ||||||
|   | |||||||
| @@ -5,6 +5,74 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v1.3.23 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.22 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.21 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.20 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.19 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.18 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.17 - _December 16, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.16 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.15 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.14 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.13 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.12 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.11 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.10 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.9 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.8 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.3.7 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v1.3.6 - _October 21, 2020_ | ## v1.3.6 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-dev-utils", |     "name": "@0x/contracts-dev-utils", | ||||||
|     "version": "1.3.6", |     "version": "1.3.23", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -41,18 +41,18 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/dev-utils", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/dev-utils", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/assert": "^3.0.13", |         "@0x/assert": "^3.0.21", | ||||||
|         "@0x/contracts-asset-proxy": "^3.5.0", |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "ethereum-types": "^3.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "ethers": "~4.0.4", |         "ethers": "~4.0.4", | ||||||
|         "npm-run-all": "^4.1.2", |         "npm-run-all": "^4.1.2", | ||||||
|         "shx": "^0.2.2", |         "shx": "^0.2.2", | ||||||
| @@ -63,7 +63,7 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@types/node": "12.12.54" |         "@types/node": "12.12.54" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|   | |||||||
| @@ -1,4 +1,148 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "2.1.24", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "2.1.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "2.1.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "2.1.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "2.1.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "2.1.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "2.1.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "2.1.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "2.1.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "2.1.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "2.1.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "2.1.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "2.1.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "2.1.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "2.1.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "2.1.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "2.1.8", |         "version": "2.1.8", | ||||||
|   | |||||||
| @@ -5,6 +5,70 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v2.1.24 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.23 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.22 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.21 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.20 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.19 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.18 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.17 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.16 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.15 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.14 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.13 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.12 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.11 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.10 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.1.9 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v2.1.8 - _October 21, 2020_ | ## v2.1.8 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-erc1155", |     "name": "@0x/contracts-erc1155", | ||||||
|     "version": "2.1.8", |     "version": "2.1.24", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -52,15 +52,15 @@ | |||||||
|     }, |     }, | ||||||
|     "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.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@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", | ||||||
| @@ -68,7 +68,7 @@ | |||||||
|         "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.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "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", | ||||||
| @@ -80,10 +80,10 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "lodash": "^4.17.11" |         "lodash": "^4.17.11" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|   | |||||||
| @@ -1,4 +1,153 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "3.3.3", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "3.3.2", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "3.3.1", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "version": "3.3.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Add SPDX license identifiers to solidity files", | ||||||
|  |                 "pr": 105 | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "note": "Allow for excess return data in `LibERC20TokenV06` compat* functions", | ||||||
|  |                 "pr": 97 | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "timestamp": 1609802516 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "3.2.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "3.2.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "3.2.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "3.2.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "3.2.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "3.2.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "3.2.8", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "3.2.7", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "3.2.6", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "3.2.5", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "3.2.4", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "3.2.3", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "3.2.2", |         "version": "3.2.2", | ||||||
|   | |||||||
| @@ -5,6 +5,71 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v3.3.3 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.3.2 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.3.1 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.3.0 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Add SPDX license identifiers to solidity files (#105) | ||||||
|  |     * Allow for excess return data in `LibERC20TokenV06` compat* functions (#97) | ||||||
|  |  | ||||||
|  | ## v3.2.14 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.13 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.12 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.11 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.10 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.9 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.8 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.7 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.6 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.5 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.4 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.3 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v3.2.2 - _October 21, 2020_ | ## v3.2.2 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | // SPDX-License-Identifier: Apache-2.0 | ||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2020 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | // SPDX-License-Identifier: Apache-2.0 | ||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2020 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | // SPDX-License-Identifier: Apache-2.0 | ||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2020 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
| @@ -118,7 +119,7 @@ library LibERC20TokenV06 { | |||||||
|     { |     { | ||||||
|         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) { | ||||||
|             tokenDecimals = uint8(LibBytesV06.readUint256(resultData, 0)); |             tokenDecimals = uint8(LibBytesV06.readUint256(resultData, 0)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -141,7 +142,7 @@ library LibERC20TokenV06 { | |||||||
|                 spender |                 spender | ||||||
|             ) |             ) | ||||||
|         ); |         ); | ||||||
|         if (didSucceed && resultData.length == 32) { |         if (didSucceed && resultData.length >= 32) { | ||||||
|             allowance_ = LibBytesV06.readUint256(resultData, 0); |             allowance_ = LibBytesV06.readUint256(resultData, 0); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -162,7 +163,7 @@ library LibERC20TokenV06 { | |||||||
|                 owner |                 owner | ||||||
|             ) |             ) | ||||||
|         ); |         ); | ||||||
|         if (didSucceed && resultData.length == 32) { |         if (didSucceed && resultData.length >= 32) { | ||||||
|             balance = LibBytesV06.readUint256(resultData, 0); |             balance = LibBytesV06.readUint256(resultData, 0); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -180,7 +181,7 @@ library LibERC20TokenV06 { | |||||||
|         if (resultData.length == 0) { |         if (resultData.length == 0) { | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|         if (resultData.length == 32) { |         if (resultData.length >= 32) { | ||||||
|             uint256 result = LibBytesV06.readUint256(resultData, 0); |             uint256 result = LibBytesV06.readUint256(resultData, 0); | ||||||
|             if (result == 1) { |             if (result == 1) { | ||||||
|                 return true; |                 return true; | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-erc20", |     "name": "@0x/contracts-erc20", | ||||||
|     "version": "3.2.2", |     "version": "3.3.3", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -51,18 +51,18 @@ | |||||||
|     }, |     }, | ||||||
|     "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.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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", | ||||||
| @@ -70,7 +70,7 @@ | |||||||
|         "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.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "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", | ||||||
| @@ -82,7 +82,7 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7" |         "@0x/base-contract": "^6.2.18" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|         "access": "public" |         "access": "public" | ||||||
|   | |||||||
| @@ -1,4 +1,148 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "3.1.24", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "3.1.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "3.1.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "3.1.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "3.1.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "3.1.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "3.1.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "3.1.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "3.1.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "3.1.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "3.1.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "3.1.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "3.1.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "3.1.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "3.1.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "3.1.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "3.1.8", |         "version": "3.1.8", | ||||||
|   | |||||||
| @@ -5,6 +5,70 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v3.1.24 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.23 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.22 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.21 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.20 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.19 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.18 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.17 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.16 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.15 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.14 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.13 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.12 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.11 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.10 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.1.9 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v3.1.8 - _October 21, 2020_ | ## v3.1.8 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-erc721", |     "name": "@0x/contracts-erc721", | ||||||
|     "version": "3.1.8", |     "version": "3.1.24", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -52,18 +52,18 @@ | |||||||
|     }, |     }, | ||||||
|     "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.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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", | ||||||
| @@ -71,7 +71,7 @@ | |||||||
|         "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.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "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", | ||||||
| @@ -84,7 +84,7 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7" |         "@0x/base-contract": "^6.2.18" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|         "access": "public" |         "access": "public" | ||||||
|   | |||||||
| @@ -1,4 +1,157 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "4.2.25", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "4.2.24", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "4.2.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "4.2.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "4.2.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "4.2.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608105788, | ||||||
|  |         "version": "4.2.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "4.2.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "4.2.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "4.2.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "4.2.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "4.2.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "4.2.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "4.2.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "4.2.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "4.2.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "4.2.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "4.2.8", |         "version": "4.2.8", | ||||||
|   | |||||||
| @@ -5,6 +5,74 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v4.2.25 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.24 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.23 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.22 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.21 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.20 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.19 - _December 16, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.18 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.17 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.16 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.15 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.14 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.13 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.12 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.11 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.10 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.2.9 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v4.2.8 - _October 21, 2020_ | ## v4.2.8 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-exchange-forwarder", |     "name": "@0x/contracts-exchange-forwarder", | ||||||
|     "version": "4.2.8", |     "version": "4.2.25", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -52,25 +52,25 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-asset-proxy": "^3.5.0", |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|         "@0x/contracts-dev-utils": "^1.3.6", |         "@0x/contracts-dev-utils": "^1.3.23", | ||||||
|         "@0x/contracts-erc1155": "^2.1.8", |         "@0x/contracts-erc1155": "^2.1.24", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-erc721": "^3.1.8", |         "@0x/contracts-erc721": "^3.1.24", | ||||||
|         "@0x/contracts-exchange": "^3.2.8", |         "@0x/contracts-exchange": "^3.2.25", | ||||||
|         "@0x/contracts-exchange-libs": "^4.3.8", |         "@0x/contracts-exchange-libs": "^4.3.24", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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", | ||||||
| @@ -90,9 +90,9 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "ethereum-types": "^3.3.3" |         "ethereum-types": "^3.4.0" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|         "access": "public" |         "access": "public" | ||||||
|   | |||||||
| @@ -1,4 +1,148 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "4.3.24", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "4.3.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "4.3.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "4.3.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "4.3.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "4.3.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "4.3.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "4.3.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "4.3.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "4.3.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "4.3.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "4.3.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "4.3.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "4.3.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "4.3.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "4.3.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "4.3.8", |         "version": "4.3.8", | ||||||
|   | |||||||
| @@ -5,6 +5,70 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v4.3.24 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.23 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.22 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.21 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.20 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.19 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.18 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.17 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.16 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.15 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.14 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.13 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.12 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.11 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.10 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.3.9 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v4.3.8 - _October 21, 2020_ | ## v4.3.8 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-exchange-libs", |     "name": "@0x/contracts-exchange-libs", | ||||||
|     "version": "4.3.8", |     "version": "4.3.24", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -52,14 +52,14 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/libs", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/libs", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/subproviders": "^6.1.5", |         "@0x/subproviders": "^6.4.1", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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", | ||||||
| @@ -80,14 +80,14 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "ethereum-types": "^3.3.3" |         "ethereum-types": "^3.4.0" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|         "access": "public" |         "access": "public" | ||||||
|   | |||||||
| @@ -1,4 +1,157 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "3.2.25", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "3.2.24", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "3.2.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "3.2.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "3.2.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "3.2.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608105788, | ||||||
|  |         "version": "3.2.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "3.2.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "3.2.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "3.2.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "3.2.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "3.2.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "3.2.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "3.2.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "3.2.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "3.2.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "3.2.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "3.2.8", |         "version": "3.2.8", | ||||||
|   | |||||||
| @@ -5,6 +5,74 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v3.2.25 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.24 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.23 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.22 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.21 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.20 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.19 - _December 16, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.18 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.17 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.16 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.15 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.14 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.13 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.12 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.11 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.10 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v3.2.9 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v3.2.8 - _October 21, 2020_ | ## v3.2.8 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-exchange", |     "name": "@0x/contracts-exchange", | ||||||
|     "version": "3.2.8", |     "version": "3.2.25", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -52,21 +52,21 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-asset-proxy": "^3.5.0", |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|         "@0x/contracts-exchange-libs": "^4.3.8", |         "@0x/contracts-exchange-libs": "^4.3.24", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-multisig": "^4.1.8", |         "@0x/contracts-multisig": "^4.1.25", | ||||||
|         "@0x/contracts-staking": "^2.0.15", |         "@0x/contracts-staking": "^2.0.32", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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", | ||||||
| @@ -74,7 +74,7 @@ | |||||||
|         "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.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "ethereumjs-util": "^5.1.1", |         "ethereumjs-util": "^5.1.1", | ||||||
|         "js-combinatorics": "^0.5.3", |         "js-combinatorics": "^0.5.3", | ||||||
|         "make-promises-safe": "^1.1.0", |         "make-promises-safe": "^1.1.0", | ||||||
| @@ -88,13 +88,13 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/contracts-dev-utils": "^1.3.6", |         "@0x/contracts-dev-utils": "^1.3.23", | ||||||
|         "@0x/contracts-erc1155": "^2.1.8", |         "@0x/contracts-erc1155": "^2.1.24", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-erc721": "^3.1.8", |         "@0x/contracts-erc721": "^3.1.24", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "lodash": "^4.17.11" |         "lodash": "^4.17.11" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|   | |||||||
| @@ -1,4 +1,157 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "6.2.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "6.2.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "6.2.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "6.2.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "6.2.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "6.2.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608105788, | ||||||
|  |         "version": "6.2.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "6.2.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "6.2.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "6.2.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "6.2.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "6.2.8", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "6.2.7", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "6.2.6", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "6.2.5", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "6.2.4", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "6.2.3", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "6.2.2", |         "version": "6.2.2", | ||||||
|   | |||||||
| @@ -5,6 +5,74 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v6.2.19 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.18 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.17 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.16 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.15 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.14 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.13 - _December 16, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.12 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.11 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.10 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.9 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.8 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.7 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.6 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.5 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.4 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v6.2.3 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v6.2.2 - _October 21, 2020_ | ## v6.2.2 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-extensions", |     "name": "@0x/contracts-extensions", | ||||||
|     "version": "6.2.2", |     "version": "6.2.19", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -52,23 +52,23 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-asset-proxy": "^3.5.0", |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|         "@0x/contracts-dev-utils": "^1.3.6", |         "@0x/contracts-dev-utils": "^1.3.23", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-erc721": "^3.1.8", |         "@0x/contracts-erc721": "^3.1.24", | ||||||
|         "@0x/contracts-exchange": "^3.2.8", |         "@0x/contracts-exchange": "^3.2.25", | ||||||
|         "@0x/contracts-exchange-libs": "^4.3.8", |         "@0x/contracts-exchange-libs": "^4.3.24", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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", | ||||||
| @@ -90,10 +90,10 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "ethereum-types": "^3.3.3" |         "ethereum-types": "^3.4.0" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|         "access": "public" |         "access": "public" | ||||||
|   | |||||||
| @@ -1,4 +1,85 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "2.7.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605320370, | ||||||
|  |         "version": "2.7.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "2.7.8", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604620645, | ||||||
|  |         "version": "2.7.7", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "2.7.6", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "2.7.5", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "2.7.4", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "2.7.3", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "2.7.2", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603487270, |         "timestamp": 1603487270, | ||||||
|         "version": "2.7.1", |         "version": "2.7.1", | ||||||
|   | |||||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v2.7.10 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.7.9 - _November 14, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.7.8 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.7.7 - _November 5, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.7.6 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.7.5 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.7.4 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.7.3 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.7.2 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v2.7.1 - _October 23, 2020_ | ## v2.7.1 - _October 23, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -0,0 +1,39 @@ | |||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.6.5; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-zero-ex/contracts/test/TestFixinProtocolFees.sol"; | ||||||
|  | import "@0x/contracts-zero-ex/contracts/src/external/FeeCollectorController.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | contract TestFixinProtocolFeesIntegration is TestFixinProtocolFees { | ||||||
|  |     constructor( | ||||||
|  |         IEtherTokenV06 weth, | ||||||
|  |         IStaking staking, | ||||||
|  |         uint32 protocolFeeMultiplier | ||||||
|  |     ) | ||||||
|  |         public | ||||||
|  |         TestFixinProtocolFees( | ||||||
|  |             weth, | ||||||
|  |             staking, | ||||||
|  |             new FeeCollectorController(weth, staking), | ||||||
|  |             protocolFeeMultiplier | ||||||
|  |         ) | ||||||
|  |     {} | ||||||
|  | } | ||||||
							
								
								
									
										110
									
								
								contracts/integrations/contracts/test/TestStaking.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								contracts/integrations/contracts/test/TestStaking.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | |||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2019 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.5.9; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-staking/contracts/src/Staking.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | contract TestStaking is | ||||||
|  |     Staking | ||||||
|  | { | ||||||
|  |     IEtherToken public testWeth; | ||||||
|  |  | ||||||
|  |     struct TestPool { | ||||||
|  |         uint96 operatorStake; | ||||||
|  |         uint96 membersStake; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     mapping(bytes32 => TestPool) private _testPools; | ||||||
|  |  | ||||||
|  |     constructor(address exchangeAddress, IEtherToken _testWeth) public { | ||||||
|  |         testWeth = _testWeth; | ||||||
|  |  | ||||||
|  |         _addAuthorizedAddress(msg.sender); | ||||||
|  |         init(); | ||||||
|  |         validExchanges[exchangeAddress] = true; | ||||||
|  |         _removeAuthorizedAddressAtIndex(msg.sender, 0); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function advanceEpoch() | ||||||
|  |         external | ||||||
|  |     { | ||||||
|  |         currentEpoch += 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Create a test pool. | ||||||
|  |     function createTestPool( | ||||||
|  |         bytes32 poolId, | ||||||
|  |         uint96 operatorStake, | ||||||
|  |         uint96 membersStake | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |     { | ||||||
|  |         TestPool storage pool = _testPools[poolId]; | ||||||
|  |         pool.operatorStake = operatorStake; | ||||||
|  |         pool.membersStake = membersStake; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function getAggregatedStatsForCurrentEpoch() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (IStructs.AggregatedStats memory) | ||||||
|  |     { | ||||||
|  |         return aggregatedStatsByEpoch[currentEpoch]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Overridden to use test pools. | ||||||
|  |     function getTotalStakeDelegatedToPool(bytes32 poolId) | ||||||
|  |         public | ||||||
|  |         view | ||||||
|  |         returns (IStructs.StoredBalance memory balance) | ||||||
|  |     { | ||||||
|  |         TestPool memory pool = _testPools[poolId]; | ||||||
|  |         uint96 stake = pool.operatorStake + pool.membersStake; | ||||||
|  |         return IStructs.StoredBalance({ | ||||||
|  |             currentEpoch: currentEpoch.downcastToUint64(), | ||||||
|  |             currentEpochBalance: stake, | ||||||
|  |             nextEpochBalance: stake | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Overridden to use test pools. | ||||||
|  |     function getStakeDelegatedToPoolByOwner(address, bytes32 poolId) | ||||||
|  |         public | ||||||
|  |         view | ||||||
|  |         returns (IStructs.StoredBalance memory balance) | ||||||
|  |     { | ||||||
|  |         TestPool memory pool = _testPools[poolId]; | ||||||
|  |         return IStructs.StoredBalance({ | ||||||
|  |             currentEpoch: currentEpoch.downcastToUint64(), | ||||||
|  |             currentEpochBalance: pool.operatorStake, | ||||||
|  |             nextEpochBalance: pool.operatorStake | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function getWethContract() | ||||||
|  |         public | ||||||
|  |         view | ||||||
|  |         returns (IEtherToken wethContract) | ||||||
|  |     { | ||||||
|  |         return testWeth; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| @@ -0,0 +1,24 @@ | |||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.6.5; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-zero-ex/contracts/test/TestWeth.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | contract TestWethIntegration is TestWeth {} | ||||||
| @@ -1,6 +1,7 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-integrations", |     "name": "@0x/contracts-integrations", | ||||||
|     "version": "2.7.1", |     "version": "2.7.26", | ||||||
|  |     "private": true, | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -38,7 +39,7 @@ | |||||||
|     }, |     }, | ||||||
|     "config": { |     "config": { | ||||||
|         "publicInterfaceContracts": "TestFramework", |         "publicInterfaceContracts": "TestFramework", | ||||||
|         "abis": "./test/generated-artifacts/@(ChainlinkStopLimit|IChainlinkAggregator|TestChainlinkAggregator|TestContractWrapper|TestDydxUser|TestEth2Dai|TestEth2DaiBridge|TestFramework|TestMainnetAggregatorFills|TestSignatureValidationWallet|TestUniswapBridge|TestUniswapExchange|TestUniswapExchangeFactory).json", |         "abis": "./test/generated-artifacts/@(ChainlinkStopLimit|IChainlinkAggregator|TestChainlinkAggregator|TestContractWrapper|TestDydxUser|TestEth2Dai|TestEth2DaiBridge|TestFixinProtocolFeesIntegration|TestFramework|TestMainnetAggregatorFills|TestSignatureValidationWallet|TestStaking|TestUniswapBridge|TestUniswapExchange|TestUniswapExchangeFactory|TestWethIntegration).json", | ||||||
|         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." |         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." | ||||||
|     }, |     }, | ||||||
|     "repository": { |     "repository": { | ||||||
| @@ -51,24 +52,25 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contract-addresses": "^4.12.0", |         "@0x/contract-addresses": "^5.10.0", | ||||||
|         "@0x/contract-wrappers": "^13.9.0", |         "@0x/contract-wrappers": "^13.12.3", | ||||||
|         "@0x/contracts-broker": "^1.1.7", |         "@0x/contracts-broker": "^1.1.24", | ||||||
|         "@0x/contracts-coordinator": "^3.1.8", |         "@0x/contracts-coordinator": "^3.1.25", | ||||||
|         "@0x/contracts-dev-utils": "^1.3.6", |         "@0x/contracts-dev-utils": "^1.3.23", | ||||||
|         "@0x/contracts-exchange-forwarder": "^4.2.8", |         "@0x/contracts-exchange-forwarder": "^4.2.25", | ||||||
|         "@0x/contracts-exchange-libs": "^4.3.8", |         "@0x/contracts-exchange-libs": "^4.3.24", | ||||||
|         "@0x/contracts-extensions": "^6.2.2", |         "@0x/contracts-extensions": "^6.2.19", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/coordinator-server": "^1.0.5", |         "@0x/coordinator-server": "^1.0.5", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/migrations": "^6.4.2", |         "@0x/migrations": "^6.6.0", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/protocol-utils": "^1.2.0", | ||||||
|  |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@azure/core-asynciterator-polyfill": "^1.0.0", |         "@azure/core-asynciterator-polyfill": "^1.0.0", | ||||||
|         "@types/lodash": "4.14.104", |         "@types/lodash": "4.14.104", | ||||||
|         "@types/mocha": "^5.2.7", |         "@types/mocha": "^5.2.7", | ||||||
| @@ -91,22 +93,22 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/asset-swapper": "^4.7.1", |         "@0x/asset-swapper": "^6.0.0", | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/contracts-asset-proxy": "^3.5.0", |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|         "@0x/contracts-erc1155": "^2.1.8", |         "@0x/contracts-erc1155": "^2.1.24", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-erc721": "^3.1.8", |         "@0x/contracts-erc721": "^3.1.24", | ||||||
|         "@0x/contracts-exchange": "^3.2.8", |         "@0x/contracts-exchange": "^3.2.25", | ||||||
|         "@0x/contracts-multisig": "^4.1.8", |         "@0x/contracts-multisig": "^4.1.25", | ||||||
|         "@0x/contracts-staking": "^2.0.15", |         "@0x/contracts-staking": "^2.0.32", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-zero-ex": "^0.4.0", |         "@0x/contracts-zero-ex": "^0.18.2", | ||||||
|         "@0x/subproviders": "^6.1.5", |         "@0x/subproviders": "^6.4.1", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "ethereum-types": "^3.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "ethereumjs-util": "^6.2.0", |         "ethereumjs-util": "^6.2.0", | ||||||
|         "lodash": "^4.17.11" |         "lodash": "^4.17.11" | ||||||
|     }, |     }, | ||||||
|   | |||||||
| @@ -1,239 +0,0 @@ | |||||||
| import { MarketBuySwapQuote, MarketSellSwapQuote, Orderbook, SwapQuoter } from '@0x/asset-swapper'; |  | ||||||
| import { blockchainTests, expect, Numberish } from '@0x/contracts-test-utils'; |  | ||||||
| import { assetDataUtils } from '@0x/order-utils'; |  | ||||||
| import { FillResults, SignedOrder } from '@0x/types'; |  | ||||||
| import { BigNumber, logUtils } from '@0x/utils'; |  | ||||||
| import * as _ from 'lodash'; |  | ||||||
|  |  | ||||||
| import { TestMainnetAggregatorFillsContract } from '../wrappers'; |  | ||||||
|  |  | ||||||
| import { tokens } from './tokens'; |  | ||||||
|  |  | ||||||
| blockchainTests.live('Aggregator Mainnet Tests', env => { |  | ||||||
|     // Mainnet address of the `TestMainnetAggregatorFills` contract. |  | ||||||
|     const TEST_CONTRACT_ADDRESS = '0x37Ca306F42748b7fe105F89FCBb2CD03D27c8146'; |  | ||||||
|     const TAKER_ADDRESS = '0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B'; // Vitalik |  | ||||||
|     const ORDERBOOK_POLLING_MS = 1000; |  | ||||||
|     const GAS_PRICE = new BigNumber(1); |  | ||||||
|     const TAKER_ASSET_ETH_VALUE = 500e18; |  | ||||||
|     const MIN_BALANCE = 500.1e18; |  | ||||||
|     const SYMBOLS = ['ETH', 'DAI', 'USDC', 'FOAM']; |  | ||||||
|     const TEST_PAIRS = _.flatten(SYMBOLS.map(m => SYMBOLS.filter(t => t !== m).map(t => [m, t]))); |  | ||||||
|     const FILL_VALUES = [1, 10, 1e2, 1e3, 1e4, 2.5e4, 5e4]; |  | ||||||
|  |  | ||||||
|     let testContract: TestMainnetAggregatorFillsContract; |  | ||||||
|     let swapQuoter: SwapQuoter; |  | ||||||
|     let takerEthBalance: BigNumber; |  | ||||||
|     const orderbooks: { [name: string]: Orderbook } = {}; |  | ||||||
|  |  | ||||||
|     async function getTakerOrdersAsync(takerAssetSymbol: string): Promise<SignedOrder[]> { |  | ||||||
|         if (takerAssetSymbol === 'ETH') { |  | ||||||
|             return []; |  | ||||||
|         } |  | ||||||
|         return getOrdersAsync(takerAssetSymbol, 'ETH'); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Fetches ETH -> taker asset orders for the forwarder contract. |  | ||||||
|     async function getOrdersAsync(makerAssetSymbol: string, takerAssetSymbol: string): Promise<SignedOrder[]> { |  | ||||||
|         const takerTokenAddress = tokens[takerAssetSymbol].address; |  | ||||||
|         const makerTokenAddress = tokens[makerAssetSymbol].address; |  | ||||||
|         const makerAssetData = assetDataUtils.encodeERC20AssetData(makerTokenAddress); |  | ||||||
|         const takerAssetData = assetDataUtils.encodeERC20AssetData(takerTokenAddress); |  | ||||||
|         const orders = _.flatten( |  | ||||||
|             await Promise.all( |  | ||||||
|                 Object.keys(orderbooks).map(async name => |  | ||||||
|                     getOrdersFromOrderBookAsync(name, makerAssetData, takerAssetData), |  | ||||||
|                 ), |  | ||||||
|             ), |  | ||||||
|         ); |  | ||||||
|         const uniqueOrders: SignedOrder[] = []; |  | ||||||
|         for (const order of orders) { |  | ||||||
|             if (!order.makerFee.eq(0) || !order.takerFee.eq(0)) { |  | ||||||
|                 continue; |  | ||||||
|             } |  | ||||||
|             if (uniqueOrders.findIndex(o => isSameOrder(order, o)) === -1) { |  | ||||||
|                 uniqueOrders.push(order); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return uniqueOrders; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     async function getOrdersFromOrderBookAsync( |  | ||||||
|         name: string, |  | ||||||
|         makerAssetData: string, |  | ||||||
|         takerAssetData: string, |  | ||||||
|     ): Promise<SignedOrder[]> { |  | ||||||
|         try { |  | ||||||
|             return (await orderbooks[name].getOrdersAsync(makerAssetData, takerAssetData)).map(r => r.order); |  | ||||||
|         } catch (err) { |  | ||||||
|             logUtils.warn(`Failed to retrieve orders from orderbook "${name}".`); |  | ||||||
|         } |  | ||||||
|         return []; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function isSameOrder(a: SignedOrder, b: SignedOrder): boolean { |  | ||||||
|         for (const [k, v] of Object.entries(a)) { |  | ||||||
|             if (k in (b as any)) { |  | ||||||
|                 if (BigNumber.isBigNumber(v) && !v.eq((b as any)[k])) { |  | ||||||
|                     return false; |  | ||||||
|                 } |  | ||||||
|                 if (v !== (b as any)[k]) { |  | ||||||
|                     return false; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function toTokenUnits(symbol: string, weis: Numberish): BigNumber { |  | ||||||
|         return new BigNumber(weis).div(new BigNumber(10).pow(tokens[symbol].decimals)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function fromTokenUnits(symbol: string, units: Numberish): BigNumber { |  | ||||||
|         return new BigNumber(units) |  | ||||||
|             .times(new BigNumber(10).pow(tokens[symbol].decimals)) |  | ||||||
|             .integerValue(BigNumber.ROUND_DOWN); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     interface MarketOperationResult { |  | ||||||
|         makerAssetBalanceBefore: BigNumber; |  | ||||||
|         takerAssetBalanceBefore: BigNumber; |  | ||||||
|         makerAssetBalanceAfter: BigNumber; |  | ||||||
|         takerAssetBalanceAfter: BigNumber; |  | ||||||
|         fillResults: FillResults; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Liquidity is low right now so it's possible we didn't have |  | ||||||
|     // enough taker assets to cover the orders, so occasionally we'll get incomplete |  | ||||||
|     // fills. This function will catch those cases. |  | ||||||
|     // TODO(dorothy-zbornak): Remove this special case when liquidity is up. |  | ||||||
|     function checkHadEnoughTakerAsset( |  | ||||||
|         quote: MarketBuySwapQuote | MarketSellSwapQuote, |  | ||||||
|         result: MarketOperationResult, |  | ||||||
|     ): boolean { |  | ||||||
|         if (result.takerAssetBalanceBefore.gte(quote.worstCaseQuoteInfo.takerAssetAmount)) { |  | ||||||
|             return true; |  | ||||||
|         } |  | ||||||
|         const takerAssetPct = result.takerAssetBalanceBefore |  | ||||||
|             .div(quote.worstCaseQuoteInfo.takerAssetAmount) |  | ||||||
|             .times(100) |  | ||||||
|             .toNumber() |  | ||||||
|             .toFixed(1); |  | ||||||
|         logUtils.warn(`Could not acquire enough taker asset to complete the fill: ${takerAssetPct}%`); |  | ||||||
|         expect(result.fillResults.makerAssetFilledAmount).to.bignumber.lt(quote.worstCaseQuoteInfo.makerAssetAmount); |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     before(async () => { |  | ||||||
|         testContract = new TestMainnetAggregatorFillsContract(TEST_CONTRACT_ADDRESS, env.provider, { |  | ||||||
|             ...env.txDefaults, |  | ||||||
|             gasPrice: GAS_PRICE, |  | ||||||
|             gas: 10e6, |  | ||||||
|         }); |  | ||||||
|         swapQuoter = SwapQuoter.getSwapQuoterForStandardRelayerAPIUrl(env.provider, 'https://api.0x.org/sra'); |  | ||||||
|         // Pool orderbooks because we're desperate for liquidity. |  | ||||||
|         orderbooks.swapQuoter = swapQuoter.orderbook; |  | ||||||
|         orderbooks.bamboo = Orderbook.getOrderbookForPollingProvider({ |  | ||||||
|             httpEndpoint: 'https://sra.bamboorelay.com/0x/v3', |  | ||||||
|             pollingIntervalMs: ORDERBOOK_POLLING_MS, |  | ||||||
|         }); |  | ||||||
|         // TODO(dorothy-zbornak): Uncomment when radar's SRA is up. |  | ||||||
|         // orderbooks.radar = Orderbook.getOrderbookForPollingProvider({ |  | ||||||
|         //     httpEndpoint: 'https://api-v3.radarrelay.com/v3', |  | ||||||
|         //     pollingIntervalMs: ORDERBOOK_POLLING_MS, |  | ||||||
|         // }); |  | ||||||
|         takerEthBalance = await env.web3Wrapper.getBalanceInWeiAsync(TAKER_ADDRESS); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('taker has minimum ETH', async () => { |  | ||||||
|         expect(takerEthBalance).to.bignumber.gte(MIN_BALANCE); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     describe('market sells', () => { |  | ||||||
|         for (const [makerSymbol, takerSymbol] of TEST_PAIRS) { |  | ||||||
|             for (const fillValue of FILL_VALUES) { |  | ||||||
|                 const fillAmount = fromTokenUnits(takerSymbol, new BigNumber(fillValue).div(tokens[takerSymbol].price)); |  | ||||||
|                 it(`sell ${toTokenUnits(takerSymbol, fillAmount)} ${takerSymbol} for ${makerSymbol}`, async () => { |  | ||||||
|                     const [quote, takerOrders] = await Promise.all([ |  | ||||||
|                         swapQuoter.getMarketSellSwapQuoteAsync( |  | ||||||
|                             tokens[makerSymbol].address, |  | ||||||
|                             tokens[takerSymbol].address, |  | ||||||
|                             fillAmount, |  | ||||||
|                             { gasPrice: GAS_PRICE }, |  | ||||||
|                         ), |  | ||||||
|                         getTakerOrdersAsync(takerSymbol), |  | ||||||
|                     ]); |  | ||||||
|                     // Buy taker assets from `takerOrders` and and perform a |  | ||||||
|                     // market sell on the bridge orders. |  | ||||||
|                     const fill = await testContract |  | ||||||
|                         .marketSell( |  | ||||||
|                             tokens[makerSymbol].address, |  | ||||||
|                             tokens[takerSymbol].address, |  | ||||||
|                             quote.orders, |  | ||||||
|                             takerOrders, |  | ||||||
|                             quote.orders.map(o => o.signature), |  | ||||||
|                             takerOrders.map(o => o.signature), |  | ||||||
|                             quote.takerAssetFillAmount, |  | ||||||
|                         ) |  | ||||||
|                         .callAsync({ |  | ||||||
|                             value: quote.worstCaseQuoteInfo.protocolFeeInWeiAmount.plus(TAKER_ASSET_ETH_VALUE), |  | ||||||
|                             from: TAKER_ADDRESS, |  | ||||||
|                             gasPrice: quote.gasPrice, |  | ||||||
|                         }); |  | ||||||
|                     if (checkHadEnoughTakerAsset(quote, fill)) { |  | ||||||
|                         expect(fill.fillResults.makerAssetFilledAmount, 'makerAssetFilledAmount').to.bignumber.gte( |  | ||||||
|                             quote.worstCaseQuoteInfo.makerAssetAmount, |  | ||||||
|                         ); |  | ||||||
|                         expect(fill.fillResults.takerAssetFilledAmount, 'takerAssetFilledAmount').to.bignumber.lte( |  | ||||||
|                             quote.takerAssetFillAmount, |  | ||||||
|                         ); |  | ||||||
|                     } |  | ||||||
|                 }); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     describe('market buys', () => { |  | ||||||
|         for (const [makerSymbol, takerSymbol] of TEST_PAIRS) { |  | ||||||
|             for (const fillValue of FILL_VALUES) { |  | ||||||
|                 const fillAmount = fromTokenUnits(makerSymbol, new BigNumber(fillValue).div(tokens[makerSymbol].price)); |  | ||||||
|                 it(`buy ${toTokenUnits(makerSymbol, fillAmount)} ${makerSymbol} with ${takerSymbol}`, async () => { |  | ||||||
|                     const [quote, takerOrders] = await Promise.all([ |  | ||||||
|                         swapQuoter.getMarketBuySwapQuoteAsync( |  | ||||||
|                             tokens[makerSymbol].address, |  | ||||||
|                             tokens[takerSymbol].address, |  | ||||||
|                             fillAmount, |  | ||||||
|                             { gasPrice: GAS_PRICE }, |  | ||||||
|                         ), |  | ||||||
|                         getTakerOrdersAsync(takerSymbol), |  | ||||||
|                     ]); |  | ||||||
|                     // Buy taker assets from `takerOrders` and and perform a |  | ||||||
|                     // market buy on the bridge orders. |  | ||||||
|                     const fill = await testContract |  | ||||||
|                         .marketBuy( |  | ||||||
|                             tokens[makerSymbol].address, |  | ||||||
|                             tokens[takerSymbol].address, |  | ||||||
|                             quote.orders, |  | ||||||
|                             takerOrders, |  | ||||||
|                             quote.orders.map(o => o.signature), |  | ||||||
|                             takerOrders.map(o => o.signature), |  | ||||||
|                             quote.makerAssetFillAmount, |  | ||||||
|                         ) |  | ||||||
|                         .callAsync({ |  | ||||||
|                             value: quote.worstCaseQuoteInfo.protocolFeeInWeiAmount.plus(TAKER_ASSET_ETH_VALUE), |  | ||||||
|                             from: TAKER_ADDRESS, |  | ||||||
|                             gasPrice: quote.gasPrice, |  | ||||||
|                         }); |  | ||||||
|                     if (checkHadEnoughTakerAsset(quote, fill)) { |  | ||||||
|                         expect(fill.fillResults.takerAssetFilledAmount, 'takerAssetFilledAmount').to.bignumber.lte( |  | ||||||
|                             quote.worstCaseQuoteInfo.takerAssetAmount, |  | ||||||
|                         ); |  | ||||||
|                         expect(fill.fillResults.makerAssetFilledAmount, 'makerAssetFilledAmount').to.bignumber.gte( |  | ||||||
|                             quote.makerAssetFillAmount, |  | ||||||
|                         ); |  | ||||||
|                     } |  | ||||||
|                 }); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| }); |  | ||||||
| @@ -1,77 +0,0 @@ | |||||||
| export const tokens: { [symbol: string]: { address: string; decimals: number; price: number } } = { |  | ||||||
|     ETH: { |  | ||||||
|         address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 133, |  | ||||||
|     }, |  | ||||||
|     SAI: { |  | ||||||
|         address: '0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 1, |  | ||||||
|     }, |  | ||||||
|     DAI: { |  | ||||||
|         address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 1, |  | ||||||
|     }, |  | ||||||
|     USDC: { |  | ||||||
|         address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', |  | ||||||
|         decimals: 6, |  | ||||||
|         price: 1, |  | ||||||
|     }, |  | ||||||
|     WBTC: { |  | ||||||
|         address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', |  | ||||||
|         decimals: 8, |  | ||||||
|         price: 6900, |  | ||||||
|     }, |  | ||||||
|     MKR: { |  | ||||||
|         address: '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 454, |  | ||||||
|     }, |  | ||||||
|     BAT: { |  | ||||||
|         address: '0x0D8775F648430679A709E98d2b0Cb6250d2887EF', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 0.17, |  | ||||||
|     }, |  | ||||||
|     OMG: { |  | ||||||
|         address: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 0.65, |  | ||||||
|     }, |  | ||||||
|     ZRX: { |  | ||||||
|         address: '0xE41d2489571d322189246DaFA5ebDe1F4699F498', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 0.19, |  | ||||||
|     }, |  | ||||||
|     ZIL: { |  | ||||||
|         address: '0x05f4a42e251f2d52b8ed15E9FEdAacFcEF1FAD27', |  | ||||||
|         decimals: 12, |  | ||||||
|         price: 0.004, |  | ||||||
|     }, |  | ||||||
|     FOAM: { |  | ||||||
|         address: '0x4946Fcea7C692606e8908002e55A582af44AC121', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 0.004, |  | ||||||
|     }, |  | ||||||
|     USDT: { |  | ||||||
|         address: '0xdAC17F958D2ee523a2206206994597C13D831ec7', |  | ||||||
|         decimals: 6, |  | ||||||
|         price: 0.019, |  | ||||||
|     }, |  | ||||||
|     REP: { |  | ||||||
|         address: '0x1985365e9f78359a9B6AD760e32412f4a445E862', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 8.9, |  | ||||||
|     }, |  | ||||||
|     MANA: { |  | ||||||
|         address: '0x0F5D2fB29fb7d3CFeE444a200298f468908cC942', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 0.025, |  | ||||||
|     }, |  | ||||||
|     LINK: { |  | ||||||
|         address: '0x514910771AF9Ca656af840dff83E8264EcF986CA', |  | ||||||
|         decimals: 18, |  | ||||||
|         price: 1.8, |  | ||||||
|     }, |  | ||||||
| }; |  | ||||||
| @@ -12,12 +12,15 @@ import * as TestContractWrapper from '../test/generated-artifacts/TestContractWr | |||||||
| import * as TestDydxUser from '../test/generated-artifacts/TestDydxUser.json'; | import * as TestDydxUser from '../test/generated-artifacts/TestDydxUser.json'; | ||||||
| import * as TestEth2Dai from '../test/generated-artifacts/TestEth2Dai.json'; | import * as TestEth2Dai from '../test/generated-artifacts/TestEth2Dai.json'; | ||||||
| import * as TestEth2DaiBridge from '../test/generated-artifacts/TestEth2DaiBridge.json'; | import * as TestEth2DaiBridge from '../test/generated-artifacts/TestEth2DaiBridge.json'; | ||||||
|  | import * as TestFixinProtocolFeesIntegration from '../test/generated-artifacts/TestFixinProtocolFeesIntegration.json'; | ||||||
| import * as TestFramework from '../test/generated-artifacts/TestFramework.json'; | import * as TestFramework from '../test/generated-artifacts/TestFramework.json'; | ||||||
| import * as TestMainnetAggregatorFills from '../test/generated-artifacts/TestMainnetAggregatorFills.json'; | import * as TestMainnetAggregatorFills from '../test/generated-artifacts/TestMainnetAggregatorFills.json'; | ||||||
| import * as TestSignatureValidationWallet from '../test/generated-artifacts/TestSignatureValidationWallet.json'; | import * as TestSignatureValidationWallet from '../test/generated-artifacts/TestSignatureValidationWallet.json'; | ||||||
|  | import * as TestStaking from '../test/generated-artifacts/TestStaking.json'; | ||||||
| import * as TestUniswapBridge from '../test/generated-artifacts/TestUniswapBridge.json'; | import * as TestUniswapBridge from '../test/generated-artifacts/TestUniswapBridge.json'; | ||||||
| import * as TestUniswapExchange from '../test/generated-artifacts/TestUniswapExchange.json'; | import * as TestUniswapExchange from '../test/generated-artifacts/TestUniswapExchange.json'; | ||||||
| import * as TestUniswapExchangeFactory from '../test/generated-artifacts/TestUniswapExchangeFactory.json'; | import * as TestUniswapExchangeFactory from '../test/generated-artifacts/TestUniswapExchangeFactory.json'; | ||||||
|  | import * as TestWethIntegration from '../test/generated-artifacts/TestWethIntegration.json'; | ||||||
| export const artifacts = { | export const artifacts = { | ||||||
|     ChainlinkStopLimit: ChainlinkStopLimit as ContractArtifact, |     ChainlinkStopLimit: ChainlinkStopLimit as ContractArtifact, | ||||||
|     IChainlinkAggregator: IChainlinkAggregator as ContractArtifact, |     IChainlinkAggregator: IChainlinkAggregator as ContractArtifact, | ||||||
| @@ -26,10 +29,13 @@ export const artifacts = { | |||||||
|     TestDydxUser: TestDydxUser as ContractArtifact, |     TestDydxUser: TestDydxUser as ContractArtifact, | ||||||
|     TestEth2Dai: TestEth2Dai as ContractArtifact, |     TestEth2Dai: TestEth2Dai as ContractArtifact, | ||||||
|     TestEth2DaiBridge: TestEth2DaiBridge as ContractArtifact, |     TestEth2DaiBridge: TestEth2DaiBridge as ContractArtifact, | ||||||
|  |     TestFixinProtocolFeesIntegration: TestFixinProtocolFeesIntegration as ContractArtifact, | ||||||
|     TestFramework: TestFramework as ContractArtifact, |     TestFramework: TestFramework as ContractArtifact, | ||||||
|     TestMainnetAggregatorFills: TestMainnetAggregatorFills as ContractArtifact, |     TestMainnetAggregatorFills: TestMainnetAggregatorFills as ContractArtifact, | ||||||
|     TestSignatureValidationWallet: TestSignatureValidationWallet as ContractArtifact, |     TestSignatureValidationWallet: TestSignatureValidationWallet as ContractArtifact, | ||||||
|  |     TestStaking: TestStaking as ContractArtifact, | ||||||
|     TestUniswapBridge: TestUniswapBridge as ContractArtifact, |     TestUniswapBridge: TestUniswapBridge as ContractArtifact, | ||||||
|     TestUniswapExchange: TestUniswapExchange as ContractArtifact, |     TestUniswapExchange: TestUniswapExchange as ContractArtifact, | ||||||
|     TestUniswapExchangeFactory: TestUniswapExchangeFactory as ContractArtifact, |     TestUniswapExchangeFactory: TestUniswapExchangeFactory as ContractArtifact, | ||||||
|  |     TestWethIntegration: TestWethIntegration as ContractArtifact, | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -1,426 +0,0 @@ | |||||||
| import { ContractAddresses } from '@0x/contract-addresses'; |  | ||||||
| import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contracts-erc20'; |  | ||||||
| import { IExchangeContract } from '@0x/contracts-exchange'; |  | ||||||
| import { blockchainTests, constants, expect, getRandomPortion, verifyEventsFromLogs } from '@0x/contracts-test-utils'; |  | ||||||
| import { |  | ||||||
|     artifacts as exchangeProxyArtifacts, |  | ||||||
|     IZeroExContract, |  | ||||||
|     LogMetadataTransformerContract, |  | ||||||
|     signCallData, |  | ||||||
| } from '@0x/contracts-zero-ex'; |  | ||||||
| import { migrateOnceAsync } from '@0x/migrations'; |  | ||||||
| import { |  | ||||||
|     assetDataUtils, |  | ||||||
|     encodeFillQuoteTransformerData, |  | ||||||
|     encodePayTakerTransformerData, |  | ||||||
|     ETH_TOKEN_ADDRESS, |  | ||||||
|     FillQuoteTransformerSide, |  | ||||||
|     findTransformerNonce, |  | ||||||
|     signatureUtils, |  | ||||||
|     SignedExchangeProxyMetaTransaction, |  | ||||||
| } from '@0x/order-utils'; |  | ||||||
| import { AssetProxyId, Order, SignedOrder } from '@0x/types'; |  | ||||||
| import { BigNumber, hexUtils, ZeroExRevertErrors } from '@0x/utils'; |  | ||||||
| import * as ethjs from 'ethereumjs-util'; |  | ||||||
|  |  | ||||||
| const { MAX_UINT256, NULL_ADDRESS, NULL_BYTES, NULL_BYTES32, ZERO_AMOUNT } = constants; |  | ||||||
|  |  | ||||||
| blockchainTests.resets('exchange proxy - meta-transactions', env => { |  | ||||||
|     const quoteSignerKey = hexUtils.random(); |  | ||||||
|     const quoteSigner = hexUtils.toHex(ethjs.privateToAddress(ethjs.toBuffer(quoteSignerKey))); |  | ||||||
|     let owner: string; |  | ||||||
|     let relayer: string; |  | ||||||
|     let maker: string; |  | ||||||
|     let taker: string; |  | ||||||
|     let flashWalletAddress: string; |  | ||||||
|     let zeroEx: IZeroExContract; |  | ||||||
|     let exchange: IExchangeContract; |  | ||||||
|     let inputToken: DummyERC20TokenContract; |  | ||||||
|     let outputToken: DummyERC20TokenContract; |  | ||||||
|     let feeToken: DummyERC20TokenContract; |  | ||||||
|     let addresses: ContractAddresses; |  | ||||||
|     let protocolFee: BigNumber; |  | ||||||
|     let metadataTransformer: LogMetadataTransformerContract; |  | ||||||
|     const GAS_PRICE = new BigNumber('1e9'); |  | ||||||
|     const MAKER_BALANCE = new BigNumber('100e18'); |  | ||||||
|     const TAKER_BALANCE = new BigNumber('100e18'); |  | ||||||
|     const TAKER_FEE_BALANCE = new BigNumber('100e18'); |  | ||||||
|  |  | ||||||
|     before(async () => { |  | ||||||
|         [, relayer, maker, taker] = await env.getAccountAddressesAsync(); |  | ||||||
|         addresses = await migrateOnceAsync(env.provider); |  | ||||||
|         zeroEx = new IZeroExContract(addresses.exchangeProxy, env.provider, env.txDefaults, { |  | ||||||
|             LogMetadataTransformer: LogMetadataTransformerContract.ABI(), |  | ||||||
|             DummyERC20Token: DummyERC20TokenContract.ABI(), |  | ||||||
|         }); |  | ||||||
|         exchange = new IExchangeContract(addresses.exchange, env.provider, env.txDefaults); |  | ||||||
|         [inputToken, outputToken, feeToken] = await Promise.all( |  | ||||||
|             [...new Array(3)].map(i => |  | ||||||
|                 DummyERC20TokenContract.deployFrom0xArtifactAsync( |  | ||||||
|                     erc20Artifacts.DummyERC20Token, |  | ||||||
|                     env.provider, |  | ||||||
|                     env.txDefaults, |  | ||||||
|                     {}, |  | ||||||
|                     `DummyToken-${i}`, |  | ||||||
|                     `TOK${i}`, |  | ||||||
|                     new BigNumber(18), |  | ||||||
|                     BigNumber.max(MAKER_BALANCE, TAKER_BALANCE), |  | ||||||
|                 ), |  | ||||||
|             ), |  | ||||||
|         ); |  | ||||||
|         // LogMetadataTransformer is not deployed in migrations. |  | ||||||
|         metadataTransformer = await LogMetadataTransformerContract.deployFrom0xArtifactAsync( |  | ||||||
|             exchangeProxyArtifacts.LogMetadataTransformer, |  | ||||||
|             env.provider, |  | ||||||
|             { |  | ||||||
|                 ...env.txDefaults, |  | ||||||
|                 from: addresses.exchangeProxyTransformerDeployer, |  | ||||||
|             }, |  | ||||||
|             {}, |  | ||||||
|         ); |  | ||||||
|         owner = await zeroEx.owner().callAsync(); |  | ||||||
|         protocolFee = await exchange.protocolFeeMultiplier().callAsync(); |  | ||||||
|         flashWalletAddress = await zeroEx.getTransformWallet().callAsync(); |  | ||||||
|         const erc20Proxy = await exchange.getAssetProxy(AssetProxyId.ERC20).callAsync(); |  | ||||||
|         const allowanceTarget = await zeroEx.getAllowanceTarget().callAsync(); |  | ||||||
|         await outputToken.mint(MAKER_BALANCE).awaitTransactionSuccessAsync({ from: maker }); |  | ||||||
|         await inputToken.mint(TAKER_BALANCE).awaitTransactionSuccessAsync({ from: taker }); |  | ||||||
|         await feeToken.mint(TAKER_FEE_BALANCE).awaitTransactionSuccessAsync({ from: taker }); |  | ||||||
|         await outputToken.approve(erc20Proxy, MAX_UINT256).awaitTransactionSuccessAsync({ from: maker }); |  | ||||||
|         await inputToken.approve(allowanceTarget, MAX_UINT256).awaitTransactionSuccessAsync({ from: taker }); |  | ||||||
|         await feeToken.approve(allowanceTarget, MAX_UINT256).awaitTransactionSuccessAsync({ from: taker }); |  | ||||||
|         await zeroEx.setQuoteSigner(quoteSigner).awaitTransactionSuccessAsync({ from: owner }); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     interface Transformation { |  | ||||||
|         deploymentNonce: number; |  | ||||||
|         data: string; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     interface SwapInfo { |  | ||||||
|         inputTokenAddress: string; |  | ||||||
|         outputTokenAddress: string; |  | ||||||
|         inputTokenAmount: BigNumber; |  | ||||||
|         minOutputTokenAmount: BigNumber; |  | ||||||
|         transformations: Transformation[]; |  | ||||||
|         orders: SignedOrder[]; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     async function generateSwapAsync(orderFields: Partial<Order> = {}, isRfqt: boolean = false): Promise<SwapInfo> { |  | ||||||
|         const order = await signatureUtils.ecSignTypedDataOrderAsync( |  | ||||||
|             env.provider, |  | ||||||
|             { |  | ||||||
|                 chainId: 1337, |  | ||||||
|                 exchangeAddress: exchange.address, |  | ||||||
|                 expirationTimeSeconds: new BigNumber(Date.now()), |  | ||||||
|                 salt: new BigNumber(hexUtils.random()), |  | ||||||
|                 feeRecipientAddress: NULL_ADDRESS, |  | ||||||
|                 senderAddress: NULL_ADDRESS, |  | ||||||
|                 takerAddress: isRfqt ? flashWalletAddress : NULL_ADDRESS, |  | ||||||
|                 makerAddress: maker, |  | ||||||
|                 makerAssetData: assetDataUtils.encodeERC20AssetData(outputToken.address), |  | ||||||
|                 takerAssetData: assetDataUtils.encodeERC20AssetData(inputToken.address), |  | ||||||
|                 makerFeeAssetData: NULL_BYTES, |  | ||||||
|                 takerFeeAssetData: NULL_BYTES, |  | ||||||
|                 takerAssetAmount: getRandomPortion(TAKER_BALANCE), |  | ||||||
|                 makerAssetAmount: getRandomPortion(MAKER_BALANCE), |  | ||||||
|                 makerFee: ZERO_AMOUNT, |  | ||||||
|                 takerFee: ZERO_AMOUNT, |  | ||||||
|                 ...orderFields, |  | ||||||
|             }, |  | ||||||
|             maker, |  | ||||||
|         ); |  | ||||||
|         const transformations = [ |  | ||||||
|             { |  | ||||||
|                 deploymentNonce: findTransformerNonce( |  | ||||||
|                     addresses.transformers.fillQuoteTransformer, |  | ||||||
|                     addresses.exchangeProxyTransformerDeployer, |  | ||||||
|                 ), |  | ||||||
|                 data: encodeFillQuoteTransformerData({ |  | ||||||
|                     orders: [order], |  | ||||||
|                     signatures: [order.signature], |  | ||||||
|                     buyToken: outputToken.address, |  | ||||||
|                     sellToken: inputToken.address, |  | ||||||
|                     fillAmount: order.takerAssetAmount, |  | ||||||
|                     maxOrderFillAmounts: [], |  | ||||||
|                     refundReceiver: hexUtils.leftPad(2, 20), // Send refund to sender. |  | ||||||
|                     rfqtTakerAddress: isRfqt ? taker : NULL_ADDRESS, |  | ||||||
|                     side: FillQuoteTransformerSide.Sell, |  | ||||||
|                 }), |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 deploymentNonce: findTransformerNonce( |  | ||||||
|                     addresses.transformers.payTakerTransformer, |  | ||||||
|                     addresses.exchangeProxyTransformerDeployer, |  | ||||||
|                 ), |  | ||||||
|                 data: encodePayTakerTransformerData({ |  | ||||||
|                     tokens: [inputToken.address, outputToken.address, ETH_TOKEN_ADDRESS], |  | ||||||
|                     amounts: [MAX_UINT256, MAX_UINT256, MAX_UINT256], |  | ||||||
|                 }), |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 deploymentNonce: findTransformerNonce( |  | ||||||
|                     metadataTransformer.address, |  | ||||||
|                     addresses.exchangeProxyTransformerDeployer, |  | ||||||
|                 ), |  | ||||||
|                 data: NULL_BYTES, |  | ||||||
|             }, |  | ||||||
|         ]; |  | ||||||
|         return { |  | ||||||
|             transformations, |  | ||||||
|             orders: [order], |  | ||||||
|             inputTokenAddress: inputToken.address, |  | ||||||
|             outputTokenAddress: outputToken.address, |  | ||||||
|             inputTokenAmount: order.takerAssetAmount, |  | ||||||
|             minOutputTokenAmount: order.makerAssetAmount, |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function getSwapData(swap: SwapInfo): string { |  | ||||||
|         return zeroEx |  | ||||||
|             .transformERC20( |  | ||||||
|                 swap.inputTokenAddress, |  | ||||||
|                 swap.outputTokenAddress, |  | ||||||
|                 swap.inputTokenAmount, |  | ||||||
|                 swap.minOutputTokenAmount, |  | ||||||
|                 swap.transformations, |  | ||||||
|             ) |  | ||||||
|             .getABIEncodedTransactionData(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function getSignedSwapData(swap: SwapInfo, signerKey?: string): string { |  | ||||||
|         return signCallData( |  | ||||||
|             zeroEx |  | ||||||
|                 .transformERC20( |  | ||||||
|                     swap.inputTokenAddress, |  | ||||||
|                     swap.outputTokenAddress, |  | ||||||
|                     swap.inputTokenAmount, |  | ||||||
|                     swap.minOutputTokenAmount, |  | ||||||
|                     swap.transformations, |  | ||||||
|                 ) |  | ||||||
|                 .getABIEncodedTransactionData(), |  | ||||||
|             signerKey ? signerKey : quoteSignerKey, |  | ||||||
|         ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     async function createMetaTransactionAsync( |  | ||||||
|         data: string, |  | ||||||
|         value: BigNumber, |  | ||||||
|         fee?: BigNumber | number, |  | ||||||
|     ): Promise<SignedExchangeProxyMetaTransaction> { |  | ||||||
|         return signatureUtils.ecSignTypedDataExchangeProxyMetaTransactionAsync( |  | ||||||
|             env.provider, |  | ||||||
|             { |  | ||||||
|                 value, |  | ||||||
|                 signer: taker, |  | ||||||
|                 sender: relayer, |  | ||||||
|                 minGasPrice: GAS_PRICE, |  | ||||||
|                 maxGasPrice: GAS_PRICE, |  | ||||||
|                 expirationTimeSeconds: new BigNumber(Math.floor(Date.now() / 1000) + 60), |  | ||||||
|                 salt: new BigNumber(hexUtils.random()), |  | ||||||
|                 callData: data, |  | ||||||
|                 feeToken: feeToken.address, |  | ||||||
|                 feeAmount: fee !== undefined ? new BigNumber(fee) : getRandomPortion(TAKER_FEE_BALANCE), |  | ||||||
|                 domain: { |  | ||||||
|                     chainId: 1, |  | ||||||
|                     name: 'ZeroEx', |  | ||||||
|                     version: '1.0.0', |  | ||||||
|                     verifyingContract: zeroEx.address, |  | ||||||
|                 }, |  | ||||||
|             }, |  | ||||||
|             taker, |  | ||||||
|         ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     it('can call `transformERC20()` with signed calldata and no relayer fee', async () => { |  | ||||||
|         const swap = await generateSwapAsync(); |  | ||||||
|         const callDataHash = hexUtils.hash(getSwapData(swap)); |  | ||||||
|         const signedSwapData = getSignedSwapData(swap); |  | ||||||
|         const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed. |  | ||||||
|         const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee, 0); |  | ||||||
|         const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer); |  | ||||||
|         const receipt = await zeroEx |  | ||||||
|             .executeMetaTransaction(mtx, mtx.signature) |  | ||||||
|             .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE }); |  | ||||||
|         const relayerEthRefund = relayerEthBalanceBefore |  | ||||||
|             .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer)) |  | ||||||
|             .minus(GAS_PRICE.times(receipt.gasUsed)); |  | ||||||
|         // Ensure the relayer got back the unused protocol fees. |  | ||||||
|         expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE)); |  | ||||||
|         // Ensure the relayer got paid no mtx fees. |  | ||||||
|         expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(0); |  | ||||||
|         // Ensure the taker got output tokens. |  | ||||||
|         expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount); |  | ||||||
|         // Ensure the maker got input tokens. |  | ||||||
|         expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount); |  | ||||||
|         // Check events. |  | ||||||
|         verifyEventsFromLogs( |  | ||||||
|             receipt.logs, |  | ||||||
|             [ |  | ||||||
|                 { |  | ||||||
|                     taker, |  | ||||||
|                     callDataHash, |  | ||||||
|                     sender: zeroEx.address, |  | ||||||
|                     data: NULL_BYTES, |  | ||||||
|                 }, |  | ||||||
|             ], |  | ||||||
|             'TransformerMetadata', |  | ||||||
|         ); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('can call `transformERC20()` with signed calldata and a relayer fee', async () => { |  | ||||||
|         const swap = await generateSwapAsync(); |  | ||||||
|         const callDataHash = hexUtils.hash(getSwapData(swap)); |  | ||||||
|         const signedSwapData = getSignedSwapData(swap); |  | ||||||
|         const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed. |  | ||||||
|         const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee); |  | ||||||
|         const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer); |  | ||||||
|         const receipt = await zeroEx |  | ||||||
|             .executeMetaTransaction(mtx, mtx.signature) |  | ||||||
|             .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE }); |  | ||||||
|         const relayerEthRefund = relayerEthBalanceBefore |  | ||||||
|             .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer)) |  | ||||||
|             .minus(GAS_PRICE.times(receipt.gasUsed)); |  | ||||||
|         // Ensure the relayer got back the unused protocol fees. |  | ||||||
|         expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE)); |  | ||||||
|         // Ensure the relayer got paid mtx fees. |  | ||||||
|         expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(mtx.feeAmount); |  | ||||||
|         // Ensure the taker got output tokens. |  | ||||||
|         expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount); |  | ||||||
|         // Ensure the maker got input tokens. |  | ||||||
|         expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount); |  | ||||||
|         // Check events. |  | ||||||
|         verifyEventsFromLogs( |  | ||||||
|             receipt.logs, |  | ||||||
|             [ |  | ||||||
|                 { |  | ||||||
|                     taker, |  | ||||||
|                     callDataHash, |  | ||||||
|                     sender: zeroEx.address, |  | ||||||
|                     data: NULL_BYTES, |  | ||||||
|                 }, |  | ||||||
|             ], |  | ||||||
|             'TransformerMetadata', |  | ||||||
|         ); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('can call `transformERC20()` with wrongly signed calldata and a relayer fee', async () => { |  | ||||||
|         const swap = await generateSwapAsync(); |  | ||||||
|         const signedSwapData = getSignedSwapData(swap, hexUtils.random()); |  | ||||||
|         const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed. |  | ||||||
|         const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee); |  | ||||||
|         const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer); |  | ||||||
|         const receipt = await zeroEx |  | ||||||
|             .executeMetaTransaction(mtx, mtx.signature) |  | ||||||
|             .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE }); |  | ||||||
|         const relayerEthRefund = relayerEthBalanceBefore |  | ||||||
|             .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer)) |  | ||||||
|             .minus(GAS_PRICE.times(receipt.gasUsed)); |  | ||||||
|         // Ensure the relayer got back the unused protocol fees. |  | ||||||
|         expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE)); |  | ||||||
|         // Ensure the relayer got paid mtx fees. |  | ||||||
|         expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(mtx.feeAmount); |  | ||||||
|         // Ensure the taker got output tokens. |  | ||||||
|         expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount); |  | ||||||
|         // Ensure the maker got input tokens. |  | ||||||
|         expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount); |  | ||||||
|         // Check events. |  | ||||||
|         verifyEventsFromLogs( |  | ||||||
|             receipt.logs, |  | ||||||
|             [ |  | ||||||
|                 { |  | ||||||
|                     taker, |  | ||||||
|                     // Only signed calldata should have a nonzero hash. |  | ||||||
|                     callDataHash: NULL_BYTES32, |  | ||||||
|                     sender: zeroEx.address, |  | ||||||
|                     data: NULL_BYTES, |  | ||||||
|                 }, |  | ||||||
|             ], |  | ||||||
|             'TransformerMetadata', |  | ||||||
|         ); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('`transformERC20()` can fill RFQT order if calldata is signed', async () => { |  | ||||||
|         const swap = await generateSwapAsync({}, true); |  | ||||||
|         const callDataHash = hexUtils.hash(getSwapData(swap)); |  | ||||||
|         const signedSwapData = getSignedSwapData(swap); |  | ||||||
|         const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed. |  | ||||||
|         const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee, 0); |  | ||||||
|         const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer); |  | ||||||
|         const receipt = await zeroEx |  | ||||||
|             .executeMetaTransaction(mtx, mtx.signature) |  | ||||||
|             .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE }); |  | ||||||
|         const relayerEthRefund = relayerEthBalanceBefore |  | ||||||
|             .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer)) |  | ||||||
|             .minus(GAS_PRICE.times(receipt.gasUsed)); |  | ||||||
|         // Ensure the relayer got back the unused protocol fees. |  | ||||||
|         expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE)); |  | ||||||
|         // Ensure the relayer got paid no mtx fees. |  | ||||||
|         expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(0); |  | ||||||
|         // Ensure the taker got output tokens. |  | ||||||
|         expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount); |  | ||||||
|         // Ensure the maker got input tokens. |  | ||||||
|         expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount); |  | ||||||
|         // Check events. |  | ||||||
|         verifyEventsFromLogs( |  | ||||||
|             receipt.logs, |  | ||||||
|             [ |  | ||||||
|                 { |  | ||||||
|                     taker, |  | ||||||
|                     callDataHash, |  | ||||||
|                     sender: zeroEx.address, |  | ||||||
|                     data: NULL_BYTES, |  | ||||||
|                 }, |  | ||||||
|             ], |  | ||||||
|             'TransformerMetadata', |  | ||||||
|         ); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('`transformERC20()` can fill RFQT order if calldata is not signed but no quote signer configured', async () => { |  | ||||||
|         const swap = await generateSwapAsync({}, true); |  | ||||||
|         const callData = getSwapData(swap); |  | ||||||
|         const callDataHash = hexUtils.hash(callData); |  | ||||||
|         const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed. |  | ||||||
|         const mtx = await createMetaTransactionAsync(callData, _protocolFee, 0); |  | ||||||
|         const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer); |  | ||||||
|         await zeroEx.setQuoteSigner(NULL_ADDRESS).awaitTransactionSuccessAsync({ from: owner }); |  | ||||||
|         const receipt = await zeroEx |  | ||||||
|             .executeMetaTransaction(mtx, mtx.signature) |  | ||||||
|             .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE }); |  | ||||||
|         const relayerEthRefund = relayerEthBalanceBefore |  | ||||||
|             .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer)) |  | ||||||
|             .minus(GAS_PRICE.times(receipt.gasUsed)); |  | ||||||
|         // Ensure the relayer got back the unused protocol fees. |  | ||||||
|         expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE)); |  | ||||||
|         // Ensure the relayer got paid no mtx fees. |  | ||||||
|         expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(0); |  | ||||||
|         // Ensure the taker got output tokens. |  | ||||||
|         expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount); |  | ||||||
|         // Ensure the maker got input tokens. |  | ||||||
|         expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount); |  | ||||||
|         // Check events. |  | ||||||
|         verifyEventsFromLogs( |  | ||||||
|             receipt.logs, |  | ||||||
|             [ |  | ||||||
|                 { |  | ||||||
|                     taker, |  | ||||||
|                     callDataHash, |  | ||||||
|                     sender: zeroEx.address, |  | ||||||
|                     data: NULL_BYTES, |  | ||||||
|                 }, |  | ||||||
|             ], |  | ||||||
|             'TransformerMetadata', |  | ||||||
|         ); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('`transformERC20()` cannot fill RFQT order if calldata is not signed', async () => { |  | ||||||
|         const swap = await generateSwapAsync({}, true); |  | ||||||
|         const callData = getSwapData(swap); |  | ||||||
|         const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed. |  | ||||||
|         const mtx = await createMetaTransactionAsync(callData, _protocolFee, 0); |  | ||||||
|         const tx = zeroEx |  | ||||||
|             .executeMetaTransaction(mtx, mtx.signature) |  | ||||||
|             .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE }); |  | ||||||
|         return expect(tx).to.revertWith(new ZeroExRevertErrors.MetaTransactions.MetaTransactionCallFailedError()); |  | ||||||
|     }); |  | ||||||
| }); |  | ||||||
| @@ -10,9 +10,12 @@ export * from '../test/generated-wrappers/test_contract_wrapper'; | |||||||
| export * from '../test/generated-wrappers/test_dydx_user'; | export * from '../test/generated-wrappers/test_dydx_user'; | ||||||
| export * from '../test/generated-wrappers/test_eth2_dai'; | export * from '../test/generated-wrappers/test_eth2_dai'; | ||||||
| export * from '../test/generated-wrappers/test_eth2_dai_bridge'; | export * from '../test/generated-wrappers/test_eth2_dai_bridge'; | ||||||
|  | export * from '../test/generated-wrappers/test_fixin_protocol_fees_integration'; | ||||||
| export * from '../test/generated-wrappers/test_framework'; | export * from '../test/generated-wrappers/test_framework'; | ||||||
| export * from '../test/generated-wrappers/test_mainnet_aggregator_fills'; | export * from '../test/generated-wrappers/test_mainnet_aggregator_fills'; | ||||||
| export * from '../test/generated-wrappers/test_signature_validation_wallet'; | export * from '../test/generated-wrappers/test_signature_validation_wallet'; | ||||||
|  | export * from '../test/generated-wrappers/test_staking'; | ||||||
| export * from '../test/generated-wrappers/test_uniswap_bridge'; | export * from '../test/generated-wrappers/test_uniswap_bridge'; | ||||||
| export * from '../test/generated-wrappers/test_uniswap_exchange'; | export * from '../test/generated-wrappers/test_uniswap_exchange'; | ||||||
| export * from '../test/generated-wrappers/test_uniswap_exchange_factory'; | export * from '../test/generated-wrappers/test_uniswap_exchange_factory'; | ||||||
|  | export * from '../test/generated-wrappers/test_weth_integration'; | ||||||
|   | |||||||
| @@ -0,0 +1,85 @@ | |||||||
|  | import { blockchainTests, constants, expect } from '@0x/contracts-test-utils'; | ||||||
|  | import { BigNumber, hexUtils } from '@0x/utils'; | ||||||
|  |  | ||||||
|  | import { artifacts } from '../artifacts'; | ||||||
|  | import { | ||||||
|  |     TestFixinProtocolFeesIntegrationContract, | ||||||
|  |     TestStakingContract, | ||||||
|  |     TestWethIntegrationContract, | ||||||
|  | } from '../wrappers'; | ||||||
|  |  | ||||||
|  | blockchainTests.resets('ProtocolFeeIntegration', env => { | ||||||
|  |     const FEE_MULTIPLIER = 70e3; | ||||||
|  |     let owner: string; | ||||||
|  |     let taker: string; | ||||||
|  |     let protocolFees: TestFixinProtocolFeesIntegrationContract; | ||||||
|  |     let staking: TestStakingContract; | ||||||
|  |     let weth: TestWethIntegrationContract; | ||||||
|  |     let singleFeeAmount: BigNumber; | ||||||
|  |  | ||||||
|  |     before(async () => { | ||||||
|  |         [owner, taker] = await env.getAccountAddressesAsync(); | ||||||
|  |         weth = await TestWethIntegrationContract.deployFrom0xArtifactAsync( | ||||||
|  |             artifacts.TestWethIntegration, | ||||||
|  |             env.provider, | ||||||
|  |             env.txDefaults, | ||||||
|  |             artifacts, | ||||||
|  |         ); | ||||||
|  |         staking = await TestStakingContract.deployFrom0xArtifactAsync( | ||||||
|  |             artifacts.TestStaking, | ||||||
|  |             env.provider, | ||||||
|  |             env.txDefaults, | ||||||
|  |             artifacts, | ||||||
|  |             constants.NULL_ADDRESS, // exchange address, which we don't know yet | ||||||
|  |             weth.address, | ||||||
|  |         ); | ||||||
|  |         protocolFees = await TestFixinProtocolFeesIntegrationContract.deployFrom0xArtifactAsync( | ||||||
|  |             artifacts.TestFixinProtocolFeesIntegration, | ||||||
|  |             env.provider, | ||||||
|  |             { ...env.txDefaults, from: taker }, | ||||||
|  |             artifacts, | ||||||
|  |             weth.address, | ||||||
|  |             staking.address, | ||||||
|  |             FEE_MULTIPLIER, | ||||||
|  |         ); | ||||||
|  |         await staking.addAuthorizedAddress(owner).awaitTransactionSuccessAsync(); | ||||||
|  |         await staking.addExchangeAddress(protocolFees.address).awaitTransactionSuccessAsync({ from: owner }); | ||||||
|  |         await weth.mint(taker, constants.ONE_ETHER).awaitTransactionSuccessAsync(); | ||||||
|  |         await weth.approve(protocolFees.address, constants.ONE_ETHER).awaitTransactionSuccessAsync({ from: taker }); | ||||||
|  |  | ||||||
|  |         singleFeeAmount = await protocolFees.getSingleProtocolFee().callAsync(); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     describe('fee collection integration', () => { | ||||||
|  |         const pool0 = constants.NULL_BYTES32; | ||||||
|  |         const poolId = hexUtils.random(); | ||||||
|  |  | ||||||
|  |         it('should collect fees for pool 0', async () => { | ||||||
|  |             await protocolFees.collectProtocolFee(pool0).awaitTransactionSuccessAsync({ value: singleFeeAmount }); | ||||||
|  |             await protocolFees.transferFeesForPool(pool0).awaitTransactionSuccessAsync(); | ||||||
|  |  | ||||||
|  |             // Fees in the pool bytes32(0) don't get attributed to a pool. | ||||||
|  |             await expect( | ||||||
|  |                 (await staking.getStakingPoolStatsThisEpoch(pool0).callAsync()).feesCollected, | ||||||
|  |             ).to.bignumber.equal(constants.ZERO_AMOUNT); | ||||||
|  |  | ||||||
|  |             // Expected amount is singleFeeAmount - 1 because we leave 1 wei of WETH behind for future gas savings. | ||||||
|  |             return expect(await weth.balanceOf(staking.address).callAsync()).to.bignumber.equal( | ||||||
|  |                 singleFeeAmount.minus(1), | ||||||
|  |             ); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         it('should collect fees for non-zero pool', async () => { | ||||||
|  |             const eth100 = constants.ONE_ETHER.multipliedBy(100); | ||||||
|  |             await staking.createTestPool(poolId, eth100, eth100).awaitTransactionSuccessAsync(); | ||||||
|  |  | ||||||
|  |             await protocolFees.collectProtocolFee(poolId).awaitTransactionSuccessAsync({ value: singleFeeAmount }); | ||||||
|  |             await protocolFees.transferFeesForPool(poolId).awaitTransactionSuccessAsync(); | ||||||
|  |  | ||||||
|  |             // Expected amount is singleFeeAmount - 1 because we leave 1 wei of WETH behind for future gas savings. | ||||||
|  |             return expect( | ||||||
|  |                 (await staking.getStakingPoolStatsThisEpoch(poolId).callAsync()).feesCollected, | ||||||
|  |             ).to.bignumber.equal(singleFeeAmount.minus(1)); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  | }); | ||||||
| @@ -11,11 +11,14 @@ | |||||||
|         "test/generated-artifacts/TestDydxUser.json", |         "test/generated-artifacts/TestDydxUser.json", | ||||||
|         "test/generated-artifacts/TestEth2Dai.json", |         "test/generated-artifacts/TestEth2Dai.json", | ||||||
|         "test/generated-artifacts/TestEth2DaiBridge.json", |         "test/generated-artifacts/TestEth2DaiBridge.json", | ||||||
|  |         "test/generated-artifacts/TestFixinProtocolFeesIntegration.json", | ||||||
|         "test/generated-artifacts/TestFramework.json", |         "test/generated-artifacts/TestFramework.json", | ||||||
|         "test/generated-artifacts/TestMainnetAggregatorFills.json", |         "test/generated-artifacts/TestMainnetAggregatorFills.json", | ||||||
|         "test/generated-artifacts/TestSignatureValidationWallet.json", |         "test/generated-artifacts/TestSignatureValidationWallet.json", | ||||||
|  |         "test/generated-artifacts/TestStaking.json", | ||||||
|         "test/generated-artifacts/TestUniswapBridge.json", |         "test/generated-artifacts/TestUniswapBridge.json", | ||||||
|         "test/generated-artifacts/TestUniswapExchange.json", |         "test/generated-artifacts/TestUniswapExchange.json", | ||||||
|         "test/generated-artifacts/TestUniswapExchangeFactory.json" |         "test/generated-artifacts/TestUniswapExchangeFactory.json", | ||||||
|  |         "test/generated-artifacts/TestWethIntegration.json" | ||||||
|     ] |     ] | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,157 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "4.1.25", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "4.1.24", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "4.1.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "4.1.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "4.1.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "4.1.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608105788, | ||||||
|  |         "version": "4.1.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "4.1.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "4.1.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "4.1.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "4.1.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "4.1.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "4.1.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "4.1.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "4.1.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "4.1.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "4.1.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "4.1.8", |         "version": "4.1.8", | ||||||
|   | |||||||
| @@ -5,6 +5,74 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v4.1.25 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.24 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.23 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.22 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.21 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.20 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.19 - _December 16, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.18 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.17 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.16 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.15 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.14 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.13 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.12 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.11 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.10 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.1.9 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v4.1.8 - _October 21, 2020_ | ## v4.1.8 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-multisig", |     "name": "@0x/contracts-multisig", | ||||||
|     "version": "4.1.8", |     "version": "4.1.25", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -49,18 +49,18 @@ | |||||||
|     }, |     }, | ||||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/multisig", |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/multisig", | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@0x/abi-gen": "^5.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-asset-proxy": "^3.5.0", |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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", | ||||||
| @@ -78,9 +78,9 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "ethereum-types": "^3.3.3" |         "ethereum-types": "^3.4.0" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|         "access": "public" |         "access": "public" | ||||||
|   | |||||||
| @@ -1,4 +1,157 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "2.0.32", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "2.0.31", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "2.0.30", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "2.0.29", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "2.0.28", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "2.0.27", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608105788, | ||||||
|  |         "version": "2.0.26", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "2.0.25", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "2.0.24", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "2.0.23", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "2.0.22", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "2.0.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "2.0.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "2.0.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "2.0.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "2.0.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "2.0.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "2.0.15", |         "version": "2.0.15", | ||||||
|   | |||||||
| @@ -5,6 +5,74 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v2.0.32 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.31 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.30 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.29 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.28 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.27 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.26 - _December 16, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.25 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.24 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.23 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.22 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.21 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.20 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.19 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.18 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.17 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v2.0.16 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v2.0.15 - _October 21, 2020_ | ## v2.0.15 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|     "artifactsDir": "./test/generated-artifacts", |     "artifactsDir": "./test/generated-artifacts", | ||||||
|     "contractsDir": "./contracts", |     "contractsDir": "./contracts", | ||||||
|     "useDockerisedSolc": false, |     "useDockerisedSolc": false, | ||||||
|     "isOfflineMode": true, |     "isOfflineMode": false, | ||||||
|     "shouldSaveStandardInput": true, |     "shouldSaveStandardInput": true, | ||||||
|     "compilerSettings": { |     "compilerSettings": { | ||||||
|         "evmVersion": "istanbul", |         "evmVersion": "istanbul", | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-staking", |     "name": "@0x/contracts-staking", | ||||||
|     "version": "2.0.15", |     "version": "2.0.32", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -53,20 +53,20 @@ | |||||||
|     }, |     }, | ||||||
|     "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.4.3", |         "@0x/abi-gen": "^5.4.19", | ||||||
|         "@0x/contracts-asset-proxy": "^3.5.0", |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|         "@0x/contracts-dev-utils": "^1.3.6", |         "@0x/contracts-dev-utils": "^1.3.23", | ||||||
|         "@0x/contracts-erc20": "^3.2.2", |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|         "@0x/contracts-exchange-libs": "^4.3.8", |         "@0x/contracts-exchange-libs": "^4.3.24", | ||||||
|         "@0x/contracts-gen": "2.0.13", |         "@0x/contracts-gen": "^2.0.30", | ||||||
|         "@0x/contracts-utils": "^4.5.2", |         "@0x/contracts-utils": "^4.7.3", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/sol-compiler": "^4.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/ts-doc-gen": "^0.0.28", |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@types/lodash": "4.14.104", |         "@types/lodash": "4.14.104", | ||||||
|         "@types/node": "12.12.54", |         "@types/node": "12.12.54", | ||||||
|         "chai": "^4.0.1", |         "chai": "^4.0.1", | ||||||
| @@ -87,11 +87,11 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/contracts-test-utils": "^5.3.5", |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "ethereum-types": "^3.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "ethereumjs-util": "^5.1.1" |         "ethereumjs-util": "^5.1.1" | ||||||
|     }, |     }, | ||||||
|     "publishConfig": { |     "publishConfig": { | ||||||
|   | |||||||
| @@ -1,4 +1,148 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "5.3.21", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "5.3.20", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "5.3.19", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1609802516, | ||||||
|  |         "version": "5.3.18", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "5.3.17", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "5.3.16", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "5.3.15", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "5.3.14", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "5.3.13", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605763885, | ||||||
|  |         "version": "5.3.12", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "5.3.11", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "5.3.10", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "5.3.9", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "5.3.8", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "5.3.7", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "5.3.6", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603265572, |         "timestamp": 1603265572, | ||||||
|         "version": "5.3.5", |         "version": "5.3.5", | ||||||
|   | |||||||
| @@ -5,6 +5,70 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v5.3.21 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.20 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.19 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.18 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.17 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.16 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.15 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.14 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.13 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.12 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.11 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.10 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.9 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.8 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.7 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v5.3.6 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v5.3.5 - _October 21, 2020_ | ## v5.3.5 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Dependencies updated |     * Dependencies updated | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "@0x/contracts-test-utils", |     "name": "@0x/contracts-test-utils", | ||||||
|     "version": "5.3.5", |     "version": "5.3.21", | ||||||
|     "engines": { |     "engines": { | ||||||
|         "node": ">=6.12" |         "node": ">=6.12" | ||||||
|     }, |     }, | ||||||
| @@ -34,7 +34,7 @@ | |||||||
|     }, |     }, | ||||||
|     "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.2.3", |         "@0x/sol-compiler": "^4.5.2", | ||||||
|         "@0x/tslint-config": "^4.1.3", |         "@0x/tslint-config": "^4.1.3", | ||||||
|         "npm-run-all": "^4.1.2", |         "npm-run-all": "^4.1.2", | ||||||
|         "shx": "^0.2.2", |         "shx": "^0.2.2", | ||||||
| @@ -42,20 +42,20 @@ | |||||||
|         "typescript": "3.0.1" |         "typescript": "3.0.1" | ||||||
|     }, |     }, | ||||||
|     "dependencies": { |     "dependencies": { | ||||||
|         "@0x/assert": "^3.0.13", |         "@0x/assert": "^3.0.21", | ||||||
|         "@0x/base-contract": "^6.2.7", |         "@0x/base-contract": "^6.2.18", | ||||||
|         "@0x/contract-addresses": "^4.12.0", |         "@0x/contract-addresses": "^5.10.0", | ||||||
|         "@0x/dev-utils": "^3.3.4", |         "@0x/dev-utils": "^4.2.1", | ||||||
|         "@0x/json-schemas": "^5.2.3", |         "@0x/json-schemas": "^5.4.1", | ||||||
|         "@0x/order-utils": "^10.4.0", |         "@0x/order-utils": "^10.4.16", | ||||||
|         "@0x/sol-coverage": "^4.0.14", |         "@0x/sol-coverage": "^4.0.29", | ||||||
|         "@0x/sol-profiler": "^4.1.4", |         "@0x/sol-profiler": "^4.1.19", | ||||||
|         "@0x/sol-trace": "^3.0.14", |         "@0x/sol-trace": "^3.0.29", | ||||||
|         "@0x/subproviders": "^6.1.5", |         "@0x/subproviders": "^6.4.1", | ||||||
|         "@0x/types": "^3.2.4", |         "@0x/types": "^3.3.1", | ||||||
|         "@0x/typescript-typings": "^5.1.5", |         "@0x/typescript-typings": "^5.1.6", | ||||||
|         "@0x/utils": "^5.6.3", |         "@0x/utils": "^6.2.0", | ||||||
|         "@0x/web3-wrapper": "^7.2.4", |         "@0x/web3-wrapper": "^7.4.1", | ||||||
|         "@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 +67,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.3.3", |         "ethereum-types": "^3.4.0", | ||||||
|         "ethereumjs-util": "^5.1.1", |         "ethereumjs-util": "^5.1.1", | ||||||
|         "ethers": "~4.0.4", |         "ethers": "~4.0.4", | ||||||
|         "js-combinatorics": "^0.5.3", |         "js-combinatorics": "^0.5.3", | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								contracts/treasury/.npmignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								contracts/treasury/.npmignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | # Blacklist all files | ||||||
|  | .* | ||||||
|  | * | ||||||
|  | # Whitelist lib | ||||||
|  | !lib/**/* | ||||||
|  | # Whitelist Solidity contracts | ||||||
|  | !contracts/src/**/* | ||||||
|  | # Blacklist tests in lib | ||||||
|  | /lib/test/* | ||||||
|  | # Package specific ignore | ||||||
							
								
								
									
										21
									
								
								contracts/treasury/CHANGELOG.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								contracts/treasury/CHANGELOG.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "1.0.1", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "version": "1.0.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Create this package", | ||||||
|  |                 "pr": 120 | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "timestamp": 1611869778 | ||||||
|  |     } | ||||||
|  | ] | ||||||
							
								
								
									
										14
									
								
								contracts/treasury/CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								contracts/treasury/CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | <!-- | ||||||
|  | changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly. | ||||||
|  | Edit the package's CHANGELOG.json file only. | ||||||
|  | --> | ||||||
|  |  | ||||||
|  | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v1.0.1 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v1.0.0 - _January 28, 2021_ | ||||||
|  |  | ||||||
|  |     * Create this package (#120) | ||||||
							
								
								
									
										1
									
								
								contracts/treasury/DEPLOYS.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contracts/treasury/DEPLOYS.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | [] | ||||||
							
								
								
									
										65
									
								
								contracts/treasury/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								contracts/treasury/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | |||||||
|  | ## Governance | ||||||
|  |  | ||||||
|  | This package contains contracts for the governance of the 0x ZRX treasury. | ||||||
|  |  | ||||||
|  | ## Installation | ||||||
|  |  | ||||||
|  | **Install** | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | npm install @0x/contracts-treasury --save | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Contributing | ||||||
|  |  | ||||||
|  | We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. | ||||||
|  |  | ||||||
|  | For proposals regarding the 0x protocol's smart contract architecture, message format, or additional functionality, go to the [0x Improvement Proposals (ZEIPs)](https://github.com/0xProject/ZEIPs) repository and follow the contribution guidelines provided therein. | ||||||
|  |  | ||||||
|  | Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. | ||||||
|  |  | ||||||
|  | ### Install Dependencies | ||||||
|  |  | ||||||
|  | If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | yarn config set workspaces-experimental true | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Then install dependencies | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | yarn install | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Build | ||||||
|  |  | ||||||
|  | To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | PKG=@0x/contracts-treasury yarn build | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Or continuously rebuild on change: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | PKG=@0x/contracts-treasury yarn watch | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Clean | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | yarn clean | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Lint | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | yarn lint | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Run Tests | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | yarn test | ||||||
|  | ``` | ||||||
							
								
								
									
										29
									
								
								contracts/treasury/compiler.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								contracts/treasury/compiler.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | { | ||||||
|  |     "artifactsDir": "./test/generated-artifacts", | ||||||
|  |     "contractsDir": "./contracts", | ||||||
|  |     "useDockerisedSolc": false, | ||||||
|  |     "isOfflineMode": false, | ||||||
|  |     "shouldSaveStandardInput": true, | ||||||
|  |     "shouldCompileIndependently": true, | ||||||
|  |     "compilerSettings": { | ||||||
|  |         "evmVersion": "istanbul", | ||||||
|  |         "optimizer": { | ||||||
|  |             "enabled": true, | ||||||
|  |             "runs": 1000000, | ||||||
|  |             "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } | ||||||
|  |         }, | ||||||
|  |         "outputSelection": { | ||||||
|  |             "*": { | ||||||
|  |                 "*": [ | ||||||
|  |                     "abi", | ||||||
|  |                     "devdoc", | ||||||
|  |                     "evm.bytecode.object", | ||||||
|  |                     "evm.bytecode.sourceMap", | ||||||
|  |                     "evm.deployedBytecode.object", | ||||||
|  |                     "evm.deployedBytecode.sourceMap", | ||||||
|  |                     "evm.methodIdentifiers" | ||||||
|  |                 ] | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								contracts/treasury/contracts/src/DefaultPoolOperator.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								contracts/treasury/contracts/src/DefaultPoolOperator.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | // SPDX-License-Identifier: Apache-2.0 | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2021 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.6.12; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||||
|  | import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||||
|  | import "./IStaking.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | contract DefaultPoolOperator { | ||||||
|  |     using LibERC20TokenV06 for IERC20TokenV06; | ||||||
|  |  | ||||||
|  |     // Immutables | ||||||
|  |     IStaking public immutable stakingProxy; | ||||||
|  |     IERC20TokenV06 public immutable weth; | ||||||
|  |     bytes32 public immutable poolId; | ||||||
|  |  | ||||||
|  |     /// @dev Initializes this contract and creates a staking pool. | ||||||
|  |     /// @param stakingProxy_ The 0x staking proxy contract. | ||||||
|  |     /// @param weth_ The WETH token contract. | ||||||
|  |     constructor( | ||||||
|  |         IStaking stakingProxy_, | ||||||
|  |         IERC20TokenV06 weth_ | ||||||
|  |     ) | ||||||
|  |         public | ||||||
|  |     { | ||||||
|  |         stakingProxy = stakingProxy_; | ||||||
|  |         weth = weth_; | ||||||
|  |         // operator share = 100% | ||||||
|  |         poolId = stakingProxy_.createStakingPool(10 ** 6, false); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Sends this contract's entire WETH balance to the | ||||||
|  |     ///      staking proxy contract. This function exists in case | ||||||
|  |     ///      someone joins the default staking pool and starts | ||||||
|  |     ///      market making for some reason, thus earning this contract | ||||||
|  |     ///      some staking rewards. Note that anyone can call this | ||||||
|  |     ///      function at any time. | ||||||
|  |     function returnStakingRewards() | ||||||
|  |         external | ||||||
|  |     { | ||||||
|  |         uint256 wethBalance = weth.compatBalanceOf(address(this)); | ||||||
|  |         weth.compatTransfer(address(stakingProxy), wethBalance); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										127
									
								
								contracts/treasury/contracts/src/IStaking.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								contracts/treasury/contracts/src/IStaking.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | |||||||
|  | // SPDX-License-Identifier: Apache-2.0 | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2021 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.6.12; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | interface IStaking { | ||||||
|  |     /// @dev Statuses that stake can exist in. | ||||||
|  |     ///      Any stake can be (re)delegated effective at the next epoch | ||||||
|  |     ///      Undelegated stake can be withdrawn if it is available in both the current and next epoch | ||||||
|  |     enum StakeStatus { | ||||||
|  |         UNDELEGATED, | ||||||
|  |         DELEGATED | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Encapsulates a balance for the current and next epochs. | ||||||
|  |     /// Note that these balances may be stale if the current epoch | ||||||
|  |     /// is greater than `currentEpoch`. | ||||||
|  |     /// @param currentEpoch The current epoch | ||||||
|  |     /// @param currentEpochBalance Balance in the current epoch. | ||||||
|  |     /// @param nextEpochBalance Balance in `currentEpoch+1`. | ||||||
|  |     struct StoredBalance { | ||||||
|  |         uint64 currentEpoch; | ||||||
|  |         uint96 currentEpochBalance; | ||||||
|  |         uint96 nextEpochBalance; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Holds the metadata for a staking pool. | ||||||
|  |     /// @param operator Operator of the pool. | ||||||
|  |     /// @param operatorShare Fraction of the total balance owned by the operator, in ppm. | ||||||
|  |     struct Pool { | ||||||
|  |         address operator; | ||||||
|  |         uint32 operatorShare; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Create a new staking pool. The sender will be the operator of this pool. | ||||||
|  |     /// Note that an operator must be payable. | ||||||
|  |     /// @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. | ||||||
|  |     /// @return poolId The unique pool id generated for this pool. | ||||||
|  |     function createStakingPool(uint32 operatorShare, bool addOperatorAsMaker) | ||||||
|  |         external | ||||||
|  |         returns (bytes32 poolId); | ||||||
|  |  | ||||||
|  |     /// @dev Returns the current staking epoch number. | ||||||
|  |     /// @return epoch The current epoch. | ||||||
|  |     function currentEpoch() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (uint256 epoch); | ||||||
|  |  | ||||||
|  |     /// @dev Returns the time (in seconds) at which the current staking epoch started. | ||||||
|  |     /// @return startTime The start time of the current epoch, in seconds. | ||||||
|  |     function currentEpochStartTimeInSeconds() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (uint256 startTime); | ||||||
|  |  | ||||||
|  |     /// @dev Returns the duration of an epoch in seconds. This value can be updated. | ||||||
|  |     /// @return duration The duration of an epoch, in seconds. | ||||||
|  |     function epochDurationInSeconds() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (uint256 duration); | ||||||
|  |  | ||||||
|  |     /// @dev Returns a staking pool | ||||||
|  |     /// @param poolId Unique id of pool. | ||||||
|  |     function getStakingPool(bytes32 poolId) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (Pool memory); | ||||||
|  |  | ||||||
|  |     /// @dev Gets global stake for a given status. | ||||||
|  |     /// @param stakeStatus UNDELEGATED or DELEGATED | ||||||
|  |     /// @return balance Global stake for given status. | ||||||
|  |     function getGlobalStakeByStatus(StakeStatus stakeStatus) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (StoredBalance memory balance); | ||||||
|  |  | ||||||
|  |     /// @dev Gets an owner's stake balances by status. | ||||||
|  |     /// @param staker Owner of stake. | ||||||
|  |     /// @param stakeStatus UNDELEGATED or DELEGATED | ||||||
|  |     /// @return balance Owner's stake balances for given status. | ||||||
|  |     function getOwnerStakeByStatus( | ||||||
|  |         address staker, | ||||||
|  |         StakeStatus stakeStatus | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (StoredBalance memory balance); | ||||||
|  |  | ||||||
|  |     /// @dev Returns the total stake delegated to a specific staking pool, | ||||||
|  |     ///      across all members. | ||||||
|  |     /// @param poolId Unique Id of pool. | ||||||
|  |     /// @return balance Total stake delegated to pool. | ||||||
|  |     function getTotalStakeDelegatedToPool(bytes32 poolId) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (StoredBalance memory balance); | ||||||
|  |  | ||||||
|  |     /// @dev Returns the stake delegated to a specific staking pool, by a given staker. | ||||||
|  |     /// @param staker of stake. | ||||||
|  |     /// @param poolId Unique Id of pool. | ||||||
|  |     /// @return balance Stake delegated to pool by staker. | ||||||
|  |     function getStakeDelegatedToPoolByOwner(address staker, bytes32 poolId) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (StoredBalance memory balance); | ||||||
|  | } | ||||||
							
								
								
									
										169
									
								
								contracts/treasury/contracts/src/IZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								contracts/treasury/contracts/src/IZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | |||||||
|  | // SPDX-License-Identifier: Apache-2.0 | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2021 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.6.12; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  | import "./DefaultPoolOperator.sol"; | ||||||
|  | import "./IStaking.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | interface IZrxTreasury { | ||||||
|  |  | ||||||
|  |     struct TreasuryParameters { | ||||||
|  |         uint256 votingPeriod; | ||||||
|  |         uint256 proposalThreshold; | ||||||
|  |         uint256 quorumThreshold; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     struct ProposedAction { | ||||||
|  |         address target; | ||||||
|  |         bytes data; | ||||||
|  |         uint256 value; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     struct Proposal { | ||||||
|  |         bytes32 actionsHash; | ||||||
|  |         uint256 executionEpoch; | ||||||
|  |         uint256 voteEpoch; | ||||||
|  |         uint256 votesFor; | ||||||
|  |         uint256 votesAgainst; | ||||||
|  |         bool executed; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     event ProposalCreated( | ||||||
|  |         address proposer, | ||||||
|  |         bytes32[] operatedPoolIds, | ||||||
|  |         uint256 proposalId, | ||||||
|  |         ProposedAction[] actions, | ||||||
|  |         uint256 executionEpoch, | ||||||
|  |         string description | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     event VoteCast( | ||||||
|  |         address voter, | ||||||
|  |         bytes32[] operatedPoolIds, | ||||||
|  |         uint256 proposalId, | ||||||
|  |         bool support, | ||||||
|  |         uint256 votingPower | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     event ProposalExecuted(uint256 proposalId); | ||||||
|  |  | ||||||
|  |     function stakingProxy() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (IStaking); | ||||||
|  |  | ||||||
|  |     function defaultPoolOperator() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (DefaultPoolOperator); | ||||||
|  |  | ||||||
|  |     function defaultPoolId() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (bytes32); | ||||||
|  |  | ||||||
|  |     function votingPeriod() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (uint256); | ||||||
|  |  | ||||||
|  |     function proposalThreshold() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (uint256); | ||||||
|  |  | ||||||
|  |     function quorumThreshold() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (uint256); | ||||||
|  |  | ||||||
|  |     /// @dev Creates a proposal to send ZRX from this treasury on the | ||||||
|  |     ///      the given actions. Must have at least `proposalThreshold` | ||||||
|  |     ///      of voting power to call this function. See `getVotingPower` | ||||||
|  |     ///      for how voting power is computed. If a proposal is successfully | ||||||
|  |     ///      created, voting starts at the epoch after next (currentEpoch + 2). | ||||||
|  |     ///      If the vote passes, the proposal is executable during the | ||||||
|  |     ///      `executionEpoch`. See `hasProposalPassed` for the passing criteria. | ||||||
|  |     /// @param actions The proposed ZRX actions. An action specifies a | ||||||
|  |     ///        contract call. | ||||||
|  |     /// @param executionEpoch The epoch during which the proposal is to | ||||||
|  |     ///        be executed if it passes. Must be at least two epochs | ||||||
|  |     ///        from the current epoch. | ||||||
|  |     /// @param description A text description for the proposal. | ||||||
|  |     /// @param operatedPoolIds The pools operated by `msg.sender`. The | ||||||
|  |     ///        ZRX currently delegated to those pools will be accounted | ||||||
|  |     ///        for in the voting power. | ||||||
|  |     /// @return proposalId The ID of the newly created proposal. | ||||||
|  |     function propose( | ||||||
|  |         ProposedAction[] calldata actions, | ||||||
|  |         uint256 executionEpoch, | ||||||
|  |         string calldata description, | ||||||
|  |         bytes32[] calldata operatedPoolIds | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |         returns (uint256 proposalId); | ||||||
|  |  | ||||||
|  |     /// @dev Casts a vote for the given proposal. Only callable | ||||||
|  |     ///      during the voting period for that proposal. See | ||||||
|  |     ///      `getVotingPower` for how voting power is computed. | ||||||
|  |     /// @param proposalId The ID of the proposal to vote on. | ||||||
|  |     /// @param support Whether to support the proposal or not. | ||||||
|  |     /// @param operatedPoolIds The pools operated by `msg.sender`. The | ||||||
|  |     ///        ZRX currently delegated to those pools will be accounted | ||||||
|  |     ///        for in the voting power. | ||||||
|  |     function castVote( | ||||||
|  |         uint256 proposalId, | ||||||
|  |         bool support, | ||||||
|  |         bytes32[] calldata operatedPoolIds | ||||||
|  |     ) | ||||||
|  |         external; | ||||||
|  |  | ||||||
|  |     /// @dev Executes a proposal that has passed and is | ||||||
|  |     ///      currently executable. | ||||||
|  |     /// @param proposalId The ID of the proposal to execute. | ||||||
|  |     /// @param actions Actions associated with the proposal to execute. | ||||||
|  |     function execute(uint256 proposalId, ProposedAction[] memory actions) | ||||||
|  |         external | ||||||
|  |         payable; | ||||||
|  |  | ||||||
|  |     /// @dev Returns the total number of proposals. | ||||||
|  |     /// @return count The number of proposals. | ||||||
|  |     function proposalCount() | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (uint256 count); | ||||||
|  |  | ||||||
|  |     /// @dev Computes the current voting power of the given account. | ||||||
|  |     ///      Voting power is equal to: | ||||||
|  |     ///      (ZRX delegated to the default pool) + | ||||||
|  |     ///      0.5 * (ZRX delegated to other pools) + | ||||||
|  |     ///      0.5 * (ZRX delegated to pools operated by account) | ||||||
|  |     /// @param account The address of the account. | ||||||
|  |     /// @param operatedPoolIds The pools operated by `account`. The | ||||||
|  |     ///        ZRX currently delegated to those pools will be accounted | ||||||
|  |     ///        for in the voting power. | ||||||
|  |     /// @return votingPower The current voting power of the given account. | ||||||
|  |     function getVotingPower(address account, bytes32[] calldata operatedPoolIds) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (uint256 votingPower); | ||||||
|  | } | ||||||
							
								
								
									
										360
									
								
								contracts/treasury/contracts/src/ZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										360
									
								
								contracts/treasury/contracts/src/ZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,360 @@ | |||||||
|  | // SPDX-License-Identifier: Apache-2.0 | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   Copyright 2021 ZeroEx Intl. | ||||||
|  |  | ||||||
|  |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |   you may not use this file except in compliance with the License. | ||||||
|  |   You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |   Unless required by applicable law or agreed to in writing, software | ||||||
|  |   distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |   See the License for the specific language governing permissions and | ||||||
|  |   limitations under the License. | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | pragma solidity ^0.6.12; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||||
|  | import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||||
|  | import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol"; | ||||||
|  | import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol"; | ||||||
|  | import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol"; | ||||||
|  | import "@0x/contracts-zero-ex/contracts/src/features/libs/LibSignature.sol"; | ||||||
|  | import "./IZrxTreasury.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | contract ZrxTreasury is | ||||||
|  |     IZrxTreasury | ||||||
|  | { | ||||||
|  |     using LibERC20TokenV06 for IERC20TokenV06; | ||||||
|  |     using LibSafeMathV06 for uint256; | ||||||
|  |     using LibRichErrorsV06 for bytes; | ||||||
|  |     using LibBytesV06 for bytes; | ||||||
|  |  | ||||||
|  |     // Immutables | ||||||
|  |     IStaking public immutable override stakingProxy; | ||||||
|  |     DefaultPoolOperator public immutable override defaultPoolOperator; | ||||||
|  |     bytes32 public immutable override defaultPoolId; | ||||||
|  |     uint256 public immutable override votingPeriod; | ||||||
|  |     uint256 public immutable override proposalThreshold; | ||||||
|  |     uint256 public immutable override quorumThreshold; | ||||||
|  |  | ||||||
|  |     // Storage | ||||||
|  |     Proposal[] public proposals; | ||||||
|  |     mapping (uint256 => mapping (address => bool)) public hasVoted; | ||||||
|  |  | ||||||
|  |     /// @dev Initializes the ZRX treasury and creates the default | ||||||
|  |     ///      staking pool. | ||||||
|  |     /// @param stakingProxy_ The 0x staking proxy contract. | ||||||
|  |     /// @param weth_ The WETH token contract. | ||||||
|  |     /// @param params Immutable treasury parameters. | ||||||
|  |     constructor( | ||||||
|  |         IStaking stakingProxy_, | ||||||
|  |         IERC20TokenV06 weth_, | ||||||
|  |         TreasuryParameters memory params | ||||||
|  |     ) | ||||||
|  |         public | ||||||
|  |     { | ||||||
|  |         require( | ||||||
|  |             params.votingPeriod < stakingProxy_.epochDurationInSeconds(), | ||||||
|  |             "VOTING_PERIOD_TOO_LONG" | ||||||
|  |         ); | ||||||
|  |         stakingProxy = stakingProxy_; | ||||||
|  |         DefaultPoolOperator defaultPoolOperator_ = new DefaultPoolOperator( | ||||||
|  |             stakingProxy_, | ||||||
|  |             weth_ | ||||||
|  |         ); | ||||||
|  |         defaultPoolOperator = defaultPoolOperator_; | ||||||
|  |         defaultPoolId = defaultPoolOperator_.poolId(); | ||||||
|  |         votingPeriod = params.votingPeriod; | ||||||
|  |         proposalThreshold = params.proposalThreshold; | ||||||
|  |         quorumThreshold = params.quorumThreshold; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // solhint-disable | ||||||
|  |     /// @dev Allows this contract to receive ether. | ||||||
|  |     receive() external payable {} | ||||||
|  |     // solhint-enable | ||||||
|  |  | ||||||
|  |     /// @dev Creates a proposal to send ZRX from this treasury on the | ||||||
|  |     ///      the given actions. Must have at least `proposalThreshold` | ||||||
|  |     ///      of voting power to call this function. See `getVotingPower` | ||||||
|  |     ///      for how voting power is computed. If a proposal is successfully | ||||||
|  |     ///      created, voting starts at the epoch after next (currentEpoch + 2). | ||||||
|  |     ///      If the vote passes, the proposal is executable during the | ||||||
|  |     ///      `executionEpoch`. See `hasProposalPassed` for the passing criteria. | ||||||
|  |     /// @param actions The proposed ZRX actions. An action specifies a | ||||||
|  |     ///        contract call. | ||||||
|  |     /// @param executionEpoch The epoch during which the proposal is to | ||||||
|  |     ///        be executed if it passes. Must be at least two epochs | ||||||
|  |     ///        from the current epoch. | ||||||
|  |     /// @param description A text description for the proposal. | ||||||
|  |     /// @param operatedPoolIds The pools operated by `msg.sender`. The | ||||||
|  |     ///        ZRX currently delegated to those pools will be accounted | ||||||
|  |     ///        for in the voting power. | ||||||
|  |     /// @return proposalId The ID of the newly created proposal. | ||||||
|  |     function propose( | ||||||
|  |         ProposedAction[] memory actions, | ||||||
|  |         uint256 executionEpoch, | ||||||
|  |         string memory description, | ||||||
|  |         bytes32[] memory operatedPoolIds | ||||||
|  |     ) | ||||||
|  |         public | ||||||
|  |         override | ||||||
|  |         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(); | ||||||
|  |         require( | ||||||
|  |             executionEpoch >= currentEpoch + 2, | ||||||
|  |             "propose/INVALID_EXECUTION_EPOCH" | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         proposalId = proposalCount(); | ||||||
|  |         Proposal storage newProposal = proposals.push(); | ||||||
|  |         newProposal.actionsHash = keccak256(abi.encode(actions)); | ||||||
|  |         newProposal.executionEpoch = executionEpoch; | ||||||
|  |         newProposal.voteEpoch = currentEpoch + 2; | ||||||
|  |  | ||||||
|  |         emit ProposalCreated( | ||||||
|  |             msg.sender, | ||||||
|  |             operatedPoolIds, | ||||||
|  |             proposalId, | ||||||
|  |             actions, | ||||||
|  |             executionEpoch, | ||||||
|  |             description | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Casts a vote for the given proposal. Only callable | ||||||
|  |     ///      during the voting period for that proposal. See | ||||||
|  |     ///      `getVotingPower` for how voting power is computed. | ||||||
|  |     /// @param proposalId The ID of the proposal to vote on. | ||||||
|  |     /// @param support Whether to support the proposal or not. | ||||||
|  |     /// @param operatedPoolIds The pools operated by `msg.sender`. The | ||||||
|  |     ///        ZRX currently delegated to those pools will be accounted | ||||||
|  |     ///        for in the voting power. | ||||||
|  |     function castVote( | ||||||
|  |         uint256 proposalId, | ||||||
|  |         bool support, | ||||||
|  |         bytes32[] memory operatedPoolIds | ||||||
|  |     ) | ||||||
|  |         public | ||||||
|  |         override | ||||||
|  |     { | ||||||
|  |         if (proposalId >= proposalCount()) { | ||||||
|  |             revert("castVote/INVALID_PROPOSAL_ID"); | ||||||
|  |         } | ||||||
|  |         if (hasVoted[proposalId][msg.sender]) { | ||||||
|  |             revert("castVote/ALREADY_VOTED"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         Proposal memory proposal = proposals[proposalId]; | ||||||
|  |         if ( | ||||||
|  |             proposal.voteEpoch != stakingProxy.currentEpoch() || | ||||||
|  |             _hasVoteEnded(proposal.voteEpoch) | ||||||
|  |         ) { | ||||||
|  |             revert("castVote/VOTING_IS_CLOSED"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         uint256 votingPower = getVotingPower(msg.sender, operatedPoolIds); | ||||||
|  |         if (votingPower == 0) { | ||||||
|  |             revert("castVote/NO_VOTING_POWER"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (support) { | ||||||
|  |             proposals[proposalId].votesFor = proposals[proposalId].votesFor | ||||||
|  |                 .safeAdd(votingPower); | ||||||
|  |             hasVoted[proposalId][msg.sender] = true; | ||||||
|  |         } else { | ||||||
|  |             proposals[proposalId].votesAgainst = proposals[proposalId].votesAgainst | ||||||
|  |                 .safeAdd(votingPower); | ||||||
|  |             hasVoted[proposalId][msg.sender] = true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         emit VoteCast( | ||||||
|  |             msg.sender, | ||||||
|  |             operatedPoolIds, | ||||||
|  |             proposalId, | ||||||
|  |             support, | ||||||
|  |             votingPower | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Executes a proposal that has passed and is | ||||||
|  |     ///      currently executable. | ||||||
|  |     /// @param proposalId The ID of the proposal to execute. | ||||||
|  |     /// @param actions Actions associated with the proposal to execute. | ||||||
|  |     function execute(uint256 proposalId, ProposedAction[] memory actions) | ||||||
|  |         public | ||||||
|  |         payable | ||||||
|  |         override | ||||||
|  |     { | ||||||
|  |         if (proposalId >= proposalCount()) { | ||||||
|  |             revert("execute/INVALID_PROPOSAL_ID"); | ||||||
|  |         } | ||||||
|  |         Proposal memory proposal = proposals[proposalId]; | ||||||
|  |         _assertProposalExecutable(proposal, actions); | ||||||
|  |  | ||||||
|  |         proposals[proposalId].executed = true; | ||||||
|  |  | ||||||
|  |         for (uint256 i = 0; i != actions.length; i++) { | ||||||
|  |             ProposedAction memory action = actions[i]; | ||||||
|  |             (bool didSucceed, ) = action.target.call{value: action.value}(action.data); | ||||||
|  |             require( | ||||||
|  |                 didSucceed, | ||||||
|  |                 "execute/ACTION_EXECUTION_FAILED" | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         emit ProposalExecuted(proposalId); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Returns the total number of proposals. | ||||||
|  |     /// @return count The number of proposals. | ||||||
|  |     function proposalCount() | ||||||
|  |         public | ||||||
|  |         override | ||||||
|  |         view | ||||||
|  |         returns (uint256 count) | ||||||
|  |     { | ||||||
|  |         return proposals.length; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Computes the current voting power of the given account. | ||||||
|  |     ///      Voting power is equal to: | ||||||
|  |     ///      (ZRX delegated to the default pool) + | ||||||
|  |     ///      0.5 * (ZRX delegated to other pools) + | ||||||
|  |     ///      0.5 * (ZRX delegated to pools operated by account) | ||||||
|  |     /// @param account The address of the account. | ||||||
|  |     /// @param operatedPoolIds The pools operated by `account`. The | ||||||
|  |     ///        ZRX currently delegated to those pools will be accounted | ||||||
|  |     ///        for in the voting power. | ||||||
|  |     /// @return votingPower The current voting power of the given account. | ||||||
|  |     function getVotingPower(address account, bytes32[] memory operatedPoolIds) | ||||||
|  |         public | ||||||
|  |         override | ||||||
|  |         view | ||||||
|  |         returns (uint256 votingPower) | ||||||
|  |     { | ||||||
|  |         uint256 delegatedBalance = stakingProxy.getOwnerStakeByStatus( | ||||||
|  |             account, | ||||||
|  |             IStaking.StakeStatus.DELEGATED | ||||||
|  |         ).currentEpochBalance; | ||||||
|  |         uint256 balanceDelegatedToDefaultPool = stakingProxy.getStakeDelegatedToPoolByOwner( | ||||||
|  |             account, | ||||||
|  |             defaultPoolId | ||||||
|  |         ).currentEpochBalance; | ||||||
|  |  | ||||||
|  |         // Voting power for ZRX delegated to the default pool is not diluted, | ||||||
|  |         // so we double-count the balance delegated to the default pool before | ||||||
|  |         // dividing by 2. | ||||||
|  |         votingPower = delegatedBalance | ||||||
|  |             .safeAdd(balanceDelegatedToDefaultPool) | ||||||
|  |             .safeDiv(2); | ||||||
|  |  | ||||||
|  |         // Add voting power for operated staking pools. | ||||||
|  |         for (uint256 i = 0; i != operatedPoolIds.length; i++) { | ||||||
|  |             IStaking.Pool memory pool = stakingProxy.getStakingPool(operatedPoolIds[i]); | ||||||
|  |             require( | ||||||
|  |                 pool.operator == account, | ||||||
|  |                 "getVotingPower/POOL_NOT_OPERATED_BY_ACCOUNT" | ||||||
|  |             ); | ||||||
|  |             uint96 stakeDelegatedToPool = stakingProxy | ||||||
|  |                 .getTotalStakeDelegatedToPool(operatedPoolIds[i]) | ||||||
|  |                 .currentEpochBalance; | ||||||
|  |             uint256 poolVotingPower = uint256(stakeDelegatedToPool).safeDiv(2); | ||||||
|  |             votingPower = votingPower.safeAdd(poolVotingPower); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return votingPower; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Checks whether the given proposal is executable. | ||||||
|  |     ///      Reverts if not. | ||||||
|  |     /// @param proposal The proposal to check. | ||||||
|  |     function _assertProposalExecutable( | ||||||
|  |         Proposal memory proposal, | ||||||
|  |         ProposedAction[] memory actions | ||||||
|  |     ) | ||||||
|  |         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( | ||||||
|  |             stakingProxy.currentEpoch() == proposal.executionEpoch, | ||||||
|  |             "_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH" | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Checks whether the given proposal has passed or not. | ||||||
|  |     /// @param proposal The proposal to check. | ||||||
|  |     /// @return hasPassed Whether the proposal has passed. | ||||||
|  |     function _hasProposalPassed(Proposal memory proposal) | ||||||
|  |         private | ||||||
|  |         view | ||||||
|  |         returns (bool hasPassed) | ||||||
|  |     { | ||||||
|  |         // Proposal is not passed until the vote is over. | ||||||
|  |         if (!_hasVoteEnded(proposal.voteEpoch)) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         // Must have >50% support. | ||||||
|  |         if (proposal.votesFor <= proposal.votesAgainst) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         // Must reach quorum threshold. | ||||||
|  |         if (proposal.votesFor < quorumThreshold) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Checks whether a vote starting at the given | ||||||
|  |     ///      epoch has ended or not. | ||||||
|  |     /// @param voteEpoch The epoch at which the vote started. | ||||||
|  |     /// @return hasEnded Whether the vote has ended. | ||||||
|  |     function _hasVoteEnded(uint256 voteEpoch) | ||||||
|  |         private | ||||||
|  |         view | ||||||
|  |         returns (bool hasEnded) | ||||||
|  |     { | ||||||
|  |         uint256 currentEpoch = stakingProxy.currentEpoch(); | ||||||
|  |         if (currentEpoch < voteEpoch) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         if (currentEpoch > voteEpoch) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         // voteEpoch == currentEpoch | ||||||
|  |         // Vote ends at currentEpochStartTime + votingPeriod | ||||||
|  |         uint256 voteEndTime = stakingProxy | ||||||
|  |             .currentEpochStartTimeInSeconds() | ||||||
|  |             .safeAdd(votingPeriod); | ||||||
|  |         return block.timestamp > voteEndTime; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										88
									
								
								contracts/treasury/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								contracts/treasury/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | { | ||||||
|  |     "name": "@0x/contracts-treasury", | ||||||
|  |     "version": "1.0.1", | ||||||
|  |     "engines": { | ||||||
|  |         "node": ">=6.12" | ||||||
|  |     }, | ||||||
|  |     "description": "Smart contracts for governing the 0x ZRX treasury", | ||||||
|  |     "main": "lib/src/index.js", | ||||||
|  |     "directories": { | ||||||
|  |         "test": "test" | ||||||
|  |     }, | ||||||
|  |     "scripts": { | ||||||
|  |         "build": "yarn pre_build && yarn build:ts", | ||||||
|  |         "build:ci": "yarn build", | ||||||
|  |         "build:ts": "tsc -b", | ||||||
|  |         "pre_build": "run-s compile contracts:gen generate_contract_wrappers contracts:copy", | ||||||
|  |         "test": "yarn run_mocha", | ||||||
|  |         "rebuild_and_test": "run-s build test", | ||||||
|  |         "run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.js' --timeout 100000 --bail --exit", | ||||||
|  |         "compile": "sol-compiler", | ||||||
|  |         "watch": "sol-compiler -w", | ||||||
|  |         "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", | ||||||
|  |         "lint": "tslint --format stylish --project . --exclude ./generated-wrappers/**/* --exclude ./test/generated-wrappers/**/* --exclude ./generated-artifacts/**/* --exclude ./test/generated-artifacts/**/* --exclude **/lib/**/* && yarn lint-contracts", | ||||||
|  |         "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", | ||||||
|  |         "test:circleci": "yarn test", | ||||||
|  |         "contracts:gen": "contracts-gen generate", | ||||||
|  |         "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:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES", | ||||||
|  |         "publish:private": "yarn build && gitpkg publish" | ||||||
|  |     }, | ||||||
|  |     "config": { | ||||||
|  |         "publicInterfaceContracts": "ZrxTreasury,DefaultPoolOperator", | ||||||
|  |         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", | ||||||
|  |         "abis": "./test/generated-artifacts/@(DefaultPoolOperator|IStaking|IZrxTreasury|ZrxTreasury).json" | ||||||
|  |     }, | ||||||
|  |     "repository": { | ||||||
|  |         "type": "git", | ||||||
|  |         "url": "https://github.com/0xProject/protocol.git" | ||||||
|  |     }, | ||||||
|  |     "license": "Apache-2.0", | ||||||
|  |     "bugs": { | ||||||
|  |         "url": "https://github.com/0xProject/protocol/issues" | ||||||
|  |     }, | ||||||
|  |     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury", | ||||||
|  |     "devDependencies": { | ||||||
|  |         "@0x/abi-gen": "^5.4.13", | ||||||
|  |         "@0x/contract-addresses": "^5.10.0", | ||||||
|  |         "@0x/contracts-asset-proxy": "^3.7.6", | ||||||
|  |         "@0x/contracts-erc20": "^3.3.3", | ||||||
|  |         "@0x/contracts-gen": "^2.0.24", | ||||||
|  |         "@0x/contracts-staking": "^2.0.32", | ||||||
|  |         "@0x/contracts-test-utils": "^5.3.21", | ||||||
|  |         "@0x/sol-compiler": "^4.4.1", | ||||||
|  |         "@0x/ts-doc-gen": "^0.0.28", | ||||||
|  |         "@0x/tslint-config": "^4.1.3", | ||||||
|  |         "@types/isomorphic-fetch": "^0.0.35", | ||||||
|  |         "@types/lodash": "4.14.104", | ||||||
|  |         "@types/mocha": "^5.2.7", | ||||||
|  |         "@types/prompts": "^2.0.9", | ||||||
|  |         "isomorphic-fetch": "^3.0.0", | ||||||
|  |         "lodash": "^4.17.11", | ||||||
|  |         "mocha": "^6.2.0", | ||||||
|  |         "npm-run-all": "^4.1.2", | ||||||
|  |         "prompts": "^2.4.0", | ||||||
|  |         "shx": "^0.2.2", | ||||||
|  |         "solhint": "^1.4.1", | ||||||
|  |         "tslint": "5.11.0", | ||||||
|  |         "typedoc": "~0.16.11", | ||||||
|  |         "typescript": "3.0.1" | ||||||
|  |     }, | ||||||
|  |     "dependencies": { | ||||||
|  |         "@0x/base-contract": "^6.2.14", | ||||||
|  |         "@0x/protocol-utils": "^1.2.0", | ||||||
|  |         "@0x/subproviders": "^6.2.3", | ||||||
|  |         "@0x/types": "^3.3.1", | ||||||
|  |         "@0x/typescript-typings": "^5.1.6", | ||||||
|  |         "@0x/utils": "^6.1.1", | ||||||
|  |         "@0x/web3-wrapper": "^7.3.0", | ||||||
|  |         "ethereum-types": "^3.4.0", | ||||||
|  |         "ethereumjs-util": "^5.1.1" | ||||||
|  |     }, | ||||||
|  |     "publishConfig": { | ||||||
|  |         "access": "public" | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								contracts/treasury/src/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								contracts/treasury/src/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | /* | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  * Warning: This file is auto-generated by contracts-gen. Don't edit manually. | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  | import { ContractArtifact } from 'ethereum-types'; | ||||||
|  |  | ||||||
|  | import * as DefaultPoolOperator from '../generated-artifacts/DefaultPoolOperator.json'; | ||||||
|  | import * as ZrxTreasury from '../generated-artifacts/ZrxTreasury.json'; | ||||||
|  | export const artifacts = { | ||||||
|  |     ZrxTreasury: ZrxTreasury as ContractArtifact, | ||||||
|  |     DefaultPoolOperator: DefaultPoolOperator as ContractArtifact, | ||||||
|  | }; | ||||||
							
								
								
									
										2
									
								
								contracts/treasury/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								contracts/treasury/src/index.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | export { artifacts } from './artifacts'; | ||||||
|  | export { DefaultPoolOperatorContract, ZrxTreasuryContract } from './wrappers'; | ||||||
							
								
								
									
										7
									
								
								contracts/treasury/src/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								contracts/treasury/src/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | /* | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  * Warning: This file is auto-generated by contracts-gen. Don't edit manually. | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  | export * from '../generated-wrappers/default_pool_operator'; | ||||||
|  | export * from '../generated-wrappers/zrx_treasury'; | ||||||
							
								
								
									
										17
									
								
								contracts/treasury/test/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								contracts/treasury/test/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | /* | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  * Warning: This file is auto-generated by contracts-gen. Don't edit manually. | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  | import { ContractArtifact } from 'ethereum-types'; | ||||||
|  |  | ||||||
|  | import * as DefaultPoolOperator from '../test/generated-artifacts/DefaultPoolOperator.json'; | ||||||
|  | import * as IStaking from '../test/generated-artifacts/IStaking.json'; | ||||||
|  | import * as IZrxTreasury from '../test/generated-artifacts/IZrxTreasury.json'; | ||||||
|  | import * as ZrxTreasury from '../test/generated-artifacts/ZrxTreasury.json'; | ||||||
|  | export const artifacts = { | ||||||
|  |     DefaultPoolOperator: DefaultPoolOperator as ContractArtifact, | ||||||
|  |     IStaking: IStaking as ContractArtifact, | ||||||
|  |     IZrxTreasury: IZrxTreasury as ContractArtifact, | ||||||
|  |     ZrxTreasury: ZrxTreasury as ContractArtifact, | ||||||
|  | }; | ||||||
							
								
								
									
										583
									
								
								contracts/treasury/test/treasury_test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										583
									
								
								contracts/treasury/test/treasury_test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,583 @@ | |||||||
|  | import { artifacts as assetProxyArtifacts, ERC20ProxyContract } from '@0x/contracts-asset-proxy'; | ||||||
|  | import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contracts-erc20'; | ||||||
|  | import { | ||||||
|  |     artifacts as stakingArtifacts, | ||||||
|  |     constants as stakingConstants, | ||||||
|  |     StakeInfo, | ||||||
|  |     StakeStatus, | ||||||
|  |     StakingProxyContract, | ||||||
|  |     TestStakingContract, | ||||||
|  |     ZrxVaultContract, | ||||||
|  | } from '@0x/contracts-staking'; | ||||||
|  | import { | ||||||
|  |     blockchainTests, | ||||||
|  |     constants, | ||||||
|  |     expect, | ||||||
|  |     getRandomInteger, | ||||||
|  |     randomAddress, | ||||||
|  |     verifyEventsFromLogs, | ||||||
|  | } from '@0x/contracts-test-utils'; | ||||||
|  | import { BigNumber } from '@0x/utils'; | ||||||
|  | import * as _ from 'lodash'; | ||||||
|  |  | ||||||
|  | import { artifacts } from './artifacts'; | ||||||
|  | import { DefaultPoolOperatorContract, ZrxTreasuryContract, ZrxTreasuryEvents } from './wrappers'; | ||||||
|  |  | ||||||
|  | blockchainTests.resets('Treasury governance', env => { | ||||||
|  |     const TREASURY_PARAMS = { | ||||||
|  |         votingPeriod: new BigNumber(3).times(stakingConstants.ONE_DAY_IN_SECONDS), | ||||||
|  |         proposalThreshold: new BigNumber(100), | ||||||
|  |         quorumThreshold: new BigNumber(1000), | ||||||
|  |     }; | ||||||
|  |     const PROPOSAL_DESCRIPTION = 'A very compelling proposal!'; | ||||||
|  |     const TREASURY_BALANCE = constants.INITIAL_ERC20_BALANCE; | ||||||
|  |     const INVALID_PROPOSAL_ID = new BigNumber(999); | ||||||
|  |     const GRANT_PROPOSALS = [ | ||||||
|  |         { recipient: randomAddress(), amount: getRandomInteger(1, TREASURY_BALANCE.dividedToIntegerBy(2)) }, | ||||||
|  |         { recipient: randomAddress(), amount: getRandomInteger(1, TREASURY_BALANCE.dividedToIntegerBy(2)) }, | ||||||
|  |     ]; | ||||||
|  |  | ||||||
|  |     interface ProposedAction { | ||||||
|  |         target: string; | ||||||
|  |         data: string; | ||||||
|  |         value: BigNumber; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     let zrx: DummyERC20TokenContract; | ||||||
|  |     let weth: DummyERC20TokenContract; | ||||||
|  |     let erc20ProxyContract: ERC20ProxyContract; | ||||||
|  |     let staking: TestStakingContract; | ||||||
|  |     let treasury: ZrxTreasuryContract; | ||||||
|  |     let defaultPoolId: string; | ||||||
|  |     let defaultPoolOperator: DefaultPoolOperatorContract; | ||||||
|  |     let admin: string; | ||||||
|  |     let nonDefaultPoolId: string; | ||||||
|  |     let poolOperator: string; | ||||||
|  |     let delegator: string; | ||||||
|  |     let actions: ProposedAction[]; | ||||||
|  |  | ||||||
|  |     async function deployStakingAsync(): Promise<void> { | ||||||
|  |         erc20ProxyContract = await ERC20ProxyContract.deployFrom0xArtifactAsync( | ||||||
|  |             assetProxyArtifacts.ERC20Proxy, | ||||||
|  |             env.provider, | ||||||
|  |             env.txDefaults, | ||||||
|  |             assetProxyArtifacts, | ||||||
|  |         ); | ||||||
|  |         const zrxVaultContract = await ZrxVaultContract.deployFrom0xArtifactAsync( | ||||||
|  |             stakingArtifacts.ZrxVault, | ||||||
|  |             env.provider, | ||||||
|  |             env.txDefaults, | ||||||
|  |             stakingArtifacts, | ||||||
|  |             erc20ProxyContract.address, | ||||||
|  |             zrx.address, | ||||||
|  |         ); | ||||||
|  |         await erc20ProxyContract.addAuthorizedAddress(zrxVaultContract.address).awaitTransactionSuccessAsync(); | ||||||
|  |         await zrxVaultContract.addAuthorizedAddress(admin).awaitTransactionSuccessAsync(); | ||||||
|  |         const stakingLogic = await TestStakingContract.deployFrom0xArtifactAsync( | ||||||
|  |             stakingArtifacts.TestStaking, | ||||||
|  |             env.provider, | ||||||
|  |             env.txDefaults, | ||||||
|  |             artifacts, | ||||||
|  |             weth.address, | ||||||
|  |             zrxVaultContract.address, | ||||||
|  |         ); | ||||||
|  |         const stakingProxyContract = await StakingProxyContract.deployFrom0xArtifactAsync( | ||||||
|  |             stakingArtifacts.StakingProxy, | ||||||
|  |             env.provider, | ||||||
|  |             env.txDefaults, | ||||||
|  |             artifacts, | ||||||
|  |             stakingLogic.address, | ||||||
|  |         ); | ||||||
|  |         await stakingProxyContract.addAuthorizedAddress(admin).awaitTransactionSuccessAsync(); | ||||||
|  |         await zrxVaultContract.setStakingProxy(stakingProxyContract.address).awaitTransactionSuccessAsync(); | ||||||
|  |         staking = new TestStakingContract(stakingProxyContract.address, env.provider, env.txDefaults); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async function fastForwardToNextEpochAsync(): Promise<void> { | ||||||
|  |         const epochEndTime = await staking.getCurrentEpochEarliestEndTimeInSeconds().callAsync(); | ||||||
|  |         const lastBlockTime = await env.web3Wrapper.getBlockTimestampAsync('latest'); | ||||||
|  |         const dt = Math.max(0, epochEndTime.minus(lastBlockTime).toNumber()); | ||||||
|  |         await env.web3Wrapper.increaseTimeAsync(dt); | ||||||
|  |         // mine next block | ||||||
|  |         await env.web3Wrapper.mineBlockAsync(); | ||||||
|  |         await staking.endEpoch().awaitTransactionSuccessAsync(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     before(async () => { | ||||||
|  |         [admin, poolOperator, delegator] = await env.getAccountAddressesAsync(); | ||||||
|  |         zrx = await DummyERC20TokenContract.deployFrom0xArtifactAsync( | ||||||
|  |             erc20Artifacts.DummyERC20Token, | ||||||
|  |             env.provider, | ||||||
|  |             env.txDefaults, | ||||||
|  |             erc20Artifacts, | ||||||
|  |             constants.DUMMY_TOKEN_NAME, | ||||||
|  |             constants.DUMMY_TOKEN_SYMBOL, | ||||||
|  |             constants.DUMMY_TOKEN_DECIMALS, | ||||||
|  |             constants.DUMMY_TOKEN_TOTAL_SUPPLY, | ||||||
|  |         ); | ||||||
|  |         weth = await DummyERC20TokenContract.deployFrom0xArtifactAsync( | ||||||
|  |             erc20Artifacts.DummyERC20Token, | ||||||
|  |             env.provider, | ||||||
|  |             env.txDefaults, | ||||||
|  |             erc20Artifacts, | ||||||
|  |             constants.DUMMY_TOKEN_NAME, | ||||||
|  |             constants.DUMMY_TOKEN_SYMBOL, | ||||||
|  |             constants.DUMMY_TOKEN_DECIMALS, | ||||||
|  |             constants.DUMMY_TOKEN_TOTAL_SUPPLY, | ||||||
|  |         ); | ||||||
|  |         await deployStakingAsync(); | ||||||
|  |         await zrx.mint(constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |         await zrx.mint(constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |         await zrx | ||||||
|  |             .approve(erc20ProxyContract.address, constants.INITIAL_ERC20_ALLOWANCE) | ||||||
|  |             .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |         await zrx | ||||||
|  |             .approve(erc20ProxyContract.address, constants.INITIAL_ERC20_ALLOWANCE) | ||||||
|  |             .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |  | ||||||
|  |         const createStakingPoolTx = staking.createStakingPool(stakingConstants.PPM, false); | ||||||
|  |         nonDefaultPoolId = await createStakingPoolTx.callAsync({ from: poolOperator }); | ||||||
|  |         await createStakingPoolTx.awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |  | ||||||
|  |         treasury = await ZrxTreasuryContract.deployFrom0xArtifactAsync( | ||||||
|  |             artifacts.ZrxTreasury, | ||||||
|  |             env.provider, | ||||||
|  |             env.txDefaults, | ||||||
|  |             { ...artifacts, ...erc20Artifacts }, | ||||||
|  |             staking.address, | ||||||
|  |             weth.address, | ||||||
|  |             TREASURY_PARAMS, | ||||||
|  |         ); | ||||||
|  |         await zrx.mint(TREASURY_BALANCE).awaitTransactionSuccessAsync(); | ||||||
|  |         await zrx.transfer(treasury.address, TREASURY_BALANCE).awaitTransactionSuccessAsync(); | ||||||
|  |         actions = [ | ||||||
|  |             { | ||||||
|  |                 target: zrx.address, | ||||||
|  |                 data: zrx | ||||||
|  |                     .transfer(GRANT_PROPOSALS[0].recipient, GRANT_PROPOSALS[0].amount) | ||||||
|  |                     .getABIEncodedTransactionData(), | ||||||
|  |                 value: constants.ZERO_AMOUNT, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 target: zrx.address, | ||||||
|  |                 data: zrx | ||||||
|  |                     .transfer(GRANT_PROPOSALS[1].recipient, GRANT_PROPOSALS[1].amount) | ||||||
|  |                     .getABIEncodedTransactionData(), | ||||||
|  |                 value: constants.ZERO_AMOUNT, | ||||||
|  |             }, | ||||||
|  |         ]; | ||||||
|  |  | ||||||
|  |         defaultPoolId = await treasury.defaultPoolId().callAsync(); | ||||||
|  |         const defaultPoolOperatorAddress = await treasury.defaultPoolOperator().callAsync(); | ||||||
|  |         defaultPoolOperator = new DefaultPoolOperatorContract(defaultPoolOperatorAddress, env.provider, env.txDefaults); | ||||||
|  |     }); | ||||||
|  |     describe('getVotingPower()', () => { | ||||||
|  |         it('Unstaked ZRX has no voting power', async () => { | ||||||
|  |             const votingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||||
|  |             expect(votingPower).to.bignumber.equal(0); | ||||||
|  |         }); | ||||||
|  |         it('Staked but undelegated ZRX has no voting power', async () => { | ||||||
|  |             await staking.stake(constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             const votingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||||
|  |             expect(votingPower).to.bignumber.equal(0); | ||||||
|  |         }); | ||||||
|  |         it('ZRX delegated during epoch N has no voting power during Epoch N', async () => { | ||||||
|  |             await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     TREASURY_PARAMS.proposalThreshold, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             const votingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||||
|  |             expect(votingPower).to.bignumber.equal(0); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |         }); | ||||||
|  |         it('ZRX delegated to the default pool retains full voting power', async () => { | ||||||
|  |             await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     TREASURY_PARAMS.proposalThreshold, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const votingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||||
|  |             expect(votingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold); | ||||||
|  |         }); | ||||||
|  |         it('ZRX delegated to a non-default pool splits voting power between delegator and pool operator', async () => { | ||||||
|  |             await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, nonDefaultPoolId), | ||||||
|  |                     TREASURY_PARAMS.proposalThreshold, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const delegatorVotingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||||
|  |             expect(delegatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.dividedBy(2)); | ||||||
|  |             const operatorVotingPower = await treasury.getVotingPower(poolOperator, [nonDefaultPoolId]).callAsync(); | ||||||
|  |             expect(operatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.dividedBy(2)); | ||||||
|  |         }); | ||||||
|  |         it('Correctly sums voting power delegated to multiple pools', async () => { | ||||||
|  |             await staking | ||||||
|  |                 .stake(TREASURY_PARAMS.proposalThreshold.times(2)) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             // Delegate half of total stake to the default pool. | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     TREASURY_PARAMS.proposalThreshold, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             // Delegate the other half to a non-default pool. | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, nonDefaultPoolId), | ||||||
|  |                     TREASURY_PARAMS.proposalThreshold, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const delegatorVotingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||||
|  |             expect(delegatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.times(1.5)); | ||||||
|  |         }); | ||||||
|  |         it('Correctly sums voting power for operator with multiple pools', async () => { | ||||||
|  |             const createStakingPoolTx = staking.createStakingPool(stakingConstants.PPM, false); | ||||||
|  |             const firstPool = nonDefaultPoolId; | ||||||
|  |             const secondPool = await createStakingPoolTx.callAsync({ from: poolOperator }); | ||||||
|  |             await createStakingPoolTx.awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |  | ||||||
|  |             const amountDelegatedToDefaultPool = new BigNumber(1337); | ||||||
|  |             const amountSelfDelegatedToFirstPool = new BigNumber(420); | ||||||
|  |             const amountExternallyDelegatedToSecondPool = new BigNumber(2020); | ||||||
|  |  | ||||||
|  |             await staking | ||||||
|  |                 .stake(amountDelegatedToDefaultPool.plus(amountSelfDelegatedToFirstPool)) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     amountDelegatedToDefaultPool, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, firstPool), | ||||||
|  |                     amountSelfDelegatedToFirstPool, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |             await staking | ||||||
|  |                 .stake(amountExternallyDelegatedToSecondPool) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, secondPool), | ||||||
|  |                     amountExternallyDelegatedToSecondPool, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |  | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const votingPower = await treasury.getVotingPower(poolOperator, [firstPool, secondPool]).callAsync(); | ||||||
|  |             expect(votingPower).to.bignumber.equal( | ||||||
|  |                 amountDelegatedToDefaultPool | ||||||
|  |                     .plus(amountSelfDelegatedToFirstPool) | ||||||
|  |                     .plus(amountExternallyDelegatedToSecondPool.dividedToIntegerBy(2)), | ||||||
|  |             ); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |     describe('propose()', () => { | ||||||
|  |         it('Cannot create proposal without sufficient voting power', async () => { | ||||||
|  |             const votingPower = TREASURY_PARAMS.proposalThreshold.minus(1); | ||||||
|  |             await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     votingPower, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||||
|  |             const tx = treasury | ||||||
|  |                 .propose(actions, currentEpoch.plus(2), PROPOSAL_DESCRIPTION, []) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             return expect(tx).to.revertWith('propose/INSUFFICIENT_VOTING_POWER'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot create proposal with no actions', async () => { | ||||||
|  |             const votingPower = TREASURY_PARAMS.proposalThreshold; | ||||||
|  |             await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     votingPower, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||||
|  |             const tx = treasury | ||||||
|  |                 .propose([], currentEpoch.plus(2), PROPOSAL_DESCRIPTION, []) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             return expect(tx).to.revertWith('propose/NO_ACTIONS_PROPOSED'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot create proposal with an invalid execution epoch', async () => { | ||||||
|  |             const votingPower = TREASURY_PARAMS.proposalThreshold; | ||||||
|  |             await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     votingPower, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||||
|  |             const tx = treasury | ||||||
|  |                 .propose(actions, currentEpoch.plus(1), PROPOSAL_DESCRIPTION, []) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             return expect(tx).to.revertWith('propose/INVALID_EXECUTION_EPOCH'); | ||||||
|  |         }); | ||||||
|  |         it('Can create a valid proposal', async () => { | ||||||
|  |             const votingPower = TREASURY_PARAMS.proposalThreshold; | ||||||
|  |             await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     votingPower, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||||
|  |             const executionEpoch = currentEpoch.plus(2); | ||||||
|  |             const tx = await treasury | ||||||
|  |                 .propose(actions, executionEpoch, PROPOSAL_DESCRIPTION, []) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             const proposalId = new BigNumber(0); | ||||||
|  |             verifyEventsFromLogs( | ||||||
|  |                 tx.logs, | ||||||
|  |                 [ | ||||||
|  |                     { | ||||||
|  |                         proposer: delegator, | ||||||
|  |                         operatedPoolIds: [], | ||||||
|  |                         proposalId, | ||||||
|  |                         actions, | ||||||
|  |                         executionEpoch, | ||||||
|  |                         description: PROPOSAL_DESCRIPTION, | ||||||
|  |                     }, | ||||||
|  |                 ], | ||||||
|  |                 ZrxTreasuryEvents.ProposalCreated, | ||||||
|  |             ); | ||||||
|  |             expect(await treasury.proposalCount().callAsync()).to.bignumber.equal(1); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |     describe('castVote()', () => { | ||||||
|  |         const VOTE_PROPOSAL_ID = new BigNumber(0); | ||||||
|  |         const DELEGATOR_VOTING_POWER = new BigNumber(420); | ||||||
|  |  | ||||||
|  |         before(async () => { | ||||||
|  |             await staking.stake(DELEGATOR_VOTING_POWER).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     DELEGATOR_VOTING_POWER, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||||
|  |             await treasury | ||||||
|  |                 .propose(actions, currentEpoch.plus(2), PROPOSAL_DESCRIPTION, []) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |         }); | ||||||
|  |         it('Cannot vote on invalid proposalId', async () => { | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const tx = treasury | ||||||
|  |                 .castVote(INVALID_PROPOSAL_ID, true, []) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             return expect(tx).to.revertWith('castVote/INVALID_PROPOSAL_ID'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot vote before voting period starts', async () => { | ||||||
|  |             const tx = treasury.castVote(VOTE_PROPOSAL_ID, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             return expect(tx).to.revertWith('castVote/VOTING_IS_CLOSED'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot vote after voting period ends', async () => { | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             await env.web3Wrapper.increaseTimeAsync(TREASURY_PARAMS.votingPeriod.plus(1).toNumber()); | ||||||
|  |             await env.web3Wrapper.mineBlockAsync(); | ||||||
|  |             const tx = treasury.castVote(VOTE_PROPOSAL_ID, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             return expect(tx).to.revertWith('castVote/VOTING_IS_CLOSED'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot vote twice on same proposal', async () => { | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             await treasury.castVote(VOTE_PROPOSAL_ID, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             const tx = treasury.castVote(VOTE_PROPOSAL_ID, false, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             return expect(tx).to.revertWith('castVote/ALREADY_VOTED'); | ||||||
|  |         }); | ||||||
|  |         it('Can cast a valid vote', async () => { | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const tx = await treasury | ||||||
|  |                 .castVote(VOTE_PROPOSAL_ID, true, []) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             verifyEventsFromLogs( | ||||||
|  |                 tx.logs, | ||||||
|  |                 [ | ||||||
|  |                     { | ||||||
|  |                         voter: delegator, | ||||||
|  |                         operatedPoolIds: [], | ||||||
|  |                         proposalId: VOTE_PROPOSAL_ID, | ||||||
|  |                         support: true, | ||||||
|  |                         votingPower: DELEGATOR_VOTING_POWER, | ||||||
|  |                     }, | ||||||
|  |                 ], | ||||||
|  |                 ZrxTreasuryEvents.VoteCast, | ||||||
|  |             ); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |     describe('execute()', () => { | ||||||
|  |         let passedProposalId: BigNumber; | ||||||
|  |         let failedProposalId: BigNumber; | ||||||
|  |         let defeatedProposalId: BigNumber; | ||||||
|  |         let ongoingVoteProposalId: BigNumber; | ||||||
|  |  | ||||||
|  |         before(async () => { | ||||||
|  |             // OPerator has enough ZRX to create and pass a proposal | ||||||
|  |             await staking.stake(TREASURY_PARAMS.quorumThreshold).awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     TREASURY_PARAMS.quorumThreshold, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |             // Delegator only has enough ZRX to create a proposal | ||||||
|  |             await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await staking | ||||||
|  |                 .moveStake( | ||||||
|  |                     new StakeInfo(StakeStatus.Undelegated), | ||||||
|  |                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||||
|  |                     TREASURY_PARAMS.proposalThreshold, | ||||||
|  |                 ) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||||
|  |             // Proposal 0 | ||||||
|  |             let tx = treasury.propose(actions, currentEpoch.plus(4), PROPOSAL_DESCRIPTION, []); | ||||||
|  |             passedProposalId = await tx.callAsync({ from: delegator }); | ||||||
|  |             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             // Proposal 1 | ||||||
|  |             tx = treasury.propose(actions, currentEpoch.plus(3), PROPOSAL_DESCRIPTION, []); | ||||||
|  |             failedProposalId = await tx.callAsync({ from: delegator }); | ||||||
|  |             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             // Proposal 2 | ||||||
|  |             tx = treasury.propose(actions, currentEpoch.plus(3), PROPOSAL_DESCRIPTION, []); | ||||||
|  |             defeatedProposalId = await tx.callAsync({ from: delegator }); | ||||||
|  |             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |  | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             // Proposal 3 | ||||||
|  |             tx = treasury.propose(actions, currentEpoch.plus(3), PROPOSAL_DESCRIPTION, []); | ||||||
|  |             ongoingVoteProposalId = await tx.callAsync({ from: delegator }); | ||||||
|  |             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |  | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             /********** Start Vote Epoch for Proposals 0, 1, 2 **********/ | ||||||
|  |             // Proposal 0 passes | ||||||
|  |             await treasury.castVote(passedProposalId, true, []).awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |             // Proposal 1 fails to reach quorum | ||||||
|  |             await treasury.castVote(failedProposalId, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             // Proposal 2 is voted down | ||||||
|  |             await treasury.castVote(defeatedProposalId, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||||
|  |             await treasury.castVote(defeatedProposalId, false, []).awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |             /********** End Vote Epoch for Proposals 0, 1, 2 **********/ | ||||||
|  |  | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             /********** Start Execution Epoch for Proposals 1, 2, 3 **********/ | ||||||
|  |             /********** Start Vote Epoch for Proposal 3 **********************/ | ||||||
|  |             // Proposal 3 has enough votes to pass, but the vote is ongoing | ||||||
|  |             await treasury | ||||||
|  |                 .castVote(ongoingVoteProposalId, true, []) | ||||||
|  |                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||||
|  |         }); | ||||||
|  |         it('Cannot execute an invalid proposalId', async () => { | ||||||
|  |             const tx = treasury.execute(INVALID_PROPOSAL_ID, actions).awaitTransactionSuccessAsync(); | ||||||
|  |             return expect(tx).to.revertWith('execute/INVALID_PROPOSAL_ID'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot execute a proposal whose vote is ongoing', async () => { | ||||||
|  |             const tx = treasury.execute(ongoingVoteProposalId, actions).awaitTransactionSuccessAsync(); | ||||||
|  |             return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot execute a proposal that failed to reach quorum', async () => { | ||||||
|  |             const tx = treasury.execute(failedProposalId, actions).awaitTransactionSuccessAsync(); | ||||||
|  |             return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot execute a proposal that was defeated in its vote', async () => { | ||||||
|  |             const tx = treasury.execute(defeatedProposalId, actions).awaitTransactionSuccessAsync(); | ||||||
|  |             return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot execute before or after the execution epoch', async () => { | ||||||
|  |             const tooEarly = treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||||
|  |             expect(tooEarly).to.revertWith('_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH'); | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             // Proposal 0 is executable here | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const tooLate = treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||||
|  |             return expect(tooLate).to.revertWith('_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot execute the same proposal twice', async () => { | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             await treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||||
|  |             const tx = treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||||
|  |             return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_ALREADY_EXECUTED'); | ||||||
|  |         }); | ||||||
|  |         it('Cannot execute actions that do not match the proposal `actionsHash`', async () => { | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const tx = treasury | ||||||
|  |                 .execute(passedProposalId, [ | ||||||
|  |                     { | ||||||
|  |                         target: zrx.address, | ||||||
|  |                         data: zrx.transfer(randomAddress(), GRANT_PROPOSALS[0].amount).getABIEncodedTransactionData(), | ||||||
|  |                         value: constants.ZERO_AMOUNT, | ||||||
|  |                     }, | ||||||
|  |                 ]) | ||||||
|  |                 .awaitTransactionSuccessAsync(); | ||||||
|  |             return expect(tx).to.revertWith('_assertProposalExecutable/INVALID_ACTIONS'); | ||||||
|  |         }); | ||||||
|  |         it('Can execute a valid proposal', async () => { | ||||||
|  |             await fastForwardToNextEpochAsync(); | ||||||
|  |             const tx = await treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||||
|  |             verifyEventsFromLogs(tx.logs, [{ proposalId: passedProposalId }], ZrxTreasuryEvents.ProposalExecuted); | ||||||
|  |             expect(await zrx.balanceOf(GRANT_PROPOSALS[0].recipient).callAsync()).to.bignumber.equal( | ||||||
|  |                 GRANT_PROPOSALS[0].amount, | ||||||
|  |             ); | ||||||
|  |             expect(await zrx.balanceOf(GRANT_PROPOSALS[1].recipient).callAsync()).to.bignumber.equal( | ||||||
|  |                 GRANT_PROPOSALS[1].amount, | ||||||
|  |             ); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |     describe('Default pool operator contract', () => { | ||||||
|  |         it('Returns WETH to the staking proxy', async () => { | ||||||
|  |             const wethAmount = new BigNumber(1337); | ||||||
|  |             await weth.mint(wethAmount).awaitTransactionSuccessAsync(); | ||||||
|  |             // Some amount of WETH ends up in the default pool operator | ||||||
|  |             // contract, e.g. from errant staking rewards. | ||||||
|  |             await weth.transfer(defaultPoolOperator.address, wethAmount).awaitTransactionSuccessAsync(); | ||||||
|  |             // This function should send all the WETH to the staking proxy. | ||||||
|  |             await defaultPoolOperator.returnStakingRewards().awaitTransactionSuccessAsync(); | ||||||
|  |             expect(await weth.balanceOf(defaultPoolOperator.address).callAsync()).to.bignumber.equal(0); | ||||||
|  |             expect(await weth.balanceOf(staking.address).callAsync()).to.bignumber.equal(wethAmount); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  | }); | ||||||
							
								
								
									
										9
									
								
								contracts/treasury/test/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								contracts/treasury/test/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | /* | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  * Warning: This file is auto-generated by contracts-gen. Don't edit manually. | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  | export * from '../test/generated-wrappers/default_pool_operator'; | ||||||
|  | export * from '../test/generated-wrappers/i_staking'; | ||||||
|  | export * from '../test/generated-wrappers/i_zrx_treasury'; | ||||||
|  | export * from '../test/generated-wrappers/zrx_treasury'; | ||||||
							
								
								
									
										14
									
								
								contracts/treasury/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								contracts/treasury/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | { | ||||||
|  |     "extends": "../../tsconfig", | ||||||
|  |     "compilerOptions": { "outDir": "lib", "rootDir": ".", "resolveJsonModule": true }, | ||||||
|  |     "include": ["./src/**/*", "./test/**/*", "./generated-wrappers/**/*"], | ||||||
|  |     "files": [ | ||||||
|  |         "generated-artifacts/DefaultPoolOperator.json", | ||||||
|  |         "generated-artifacts/ZrxTreasury.json", | ||||||
|  |         "test/generated-artifacts/DefaultPoolOperator.json", | ||||||
|  |         "test/generated-artifacts/IStaking.json", | ||||||
|  |         "test/generated-artifacts/IZrxTreasury.json", | ||||||
|  |         "test/generated-artifacts/ZrxTreasury.json" | ||||||
|  |     ], | ||||||
|  |     "exclude": ["./deploy/solc/solc_bin"] | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								contracts/treasury/tslint.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								contracts/treasury/tslint.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |     "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"] | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,4 +1,154 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "timestamp": 1612950500, | ||||||
|  |         "version": "4.7.3", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1611648096, | ||||||
|  |         "version": "4.7.2", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1610510890, | ||||||
|  |         "version": "4.7.1", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "version": "4.7.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Add `LibSafeMathV06.safeDowncastToUint128()`", | ||||||
|  |                 "pr": 97 | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "note": "Add SPDX license identifiers to solidity files", | ||||||
|  |                 "pr": 105 | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "timestamp": 1609802516 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608692071, | ||||||
|  |         "version": "4.6.5", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1608245516, | ||||||
|  |         "version": "4.6.4", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607485227, | ||||||
|  |         "version": "4.6.3", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1607381756, | ||||||
|  |         "version": "4.6.2", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1606961263, | ||||||
|  |         "version": "4.6.1", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "version": "4.6.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Add `uint128` functions to `LibSafeMathV06`", | ||||||
|  |                 "pr": 27 | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "timestamp": 1605763885 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1605302002, | ||||||
|  |         "version": "4.5.8", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604385937, | ||||||
|  |         "version": "4.5.7", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604376968, | ||||||
|  |         "version": "4.5.6", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1604355662, | ||||||
|  |         "version": "4.5.5", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603851023, | ||||||
|  |         "version": "4.5.4", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "timestamp": 1603833198, | ||||||
|  |         "version": "4.5.3", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Dependencies updated" | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "version": "4.5.2", |         "version": "4.5.2", | ||||||
|         "changes": [ |         "changes": [ | ||||||
|   | |||||||
| @@ -5,6 +5,71 @@ Edit the package's CHANGELOG.json file only. | |||||||
|  |  | ||||||
| CHANGELOG | CHANGELOG | ||||||
|  |  | ||||||
|  | ## v4.7.3 - _February 10, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.7.2 - _January 26, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.7.1 - _January 13, 2021_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.7.0 - _January 4, 2021_ | ||||||
|  |  | ||||||
|  |     * Add `LibSafeMathV06.safeDowncastToUint128()` (#97) | ||||||
|  |     * Add SPDX license identifiers to solidity files (#105) | ||||||
|  |  | ||||||
|  | ## v4.6.5 - _December 23, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.6.4 - _December 17, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.6.3 - _December 9, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.6.2 - _December 7, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.6.1 - _December 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.6.0 - _November 19, 2020_ | ||||||
|  |  | ||||||
|  |     * Add `uint128` functions to `LibSafeMathV06` (#27) | ||||||
|  |  | ||||||
|  | ## v4.5.8 - _November 13, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.5.7 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.5.6 - _November 3, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.5.5 - _November 2, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.5.4 - _October 28, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
|  | ## v4.5.3 - _October 27, 2020_ | ||||||
|  |  | ||||||
|  |     * Dependencies updated | ||||||
|  |  | ||||||
| ## v4.5.2 - _October 21, 2020_ | ## v4.5.2 - _October 21, 2020_ | ||||||
|  |  | ||||||
|     * Add Ropsten and Rinkeby addresses to `DeploymentConstants` (#2656) |     * Add Ropsten and Rinkeby addresses to `DeploymentConstants` (#2656) | ||||||
|   | |||||||
| @@ -56,8 +56,6 @@ contract DeploymentConstants { | |||||||
|     address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5; |     address constant private 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 constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303; | ||||||
|     /// @dev Mainnet address of the Shell contract |  | ||||||
|     address constant private SHELL_CONTRACT = 0x2E703D658f8dd21709a7B458967aB4081F8D3d05; |  | ||||||
|     /// @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 constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950; | ||||||
|     /// @dev Mainnet address of the DODO Helper contract |     /// @dev Mainnet address of the DODO Helper contract | ||||||
| @@ -303,16 +301,6 @@ contract DeploymentConstants { | |||||||
|         return MOONISWAP_REGISTRY; |         return MOONISWAP_REGISTRY; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// @dev An overridable way to retrieve the Shell contract address. |  | ||||||
|     /// @return registry The Shell contract address. |  | ||||||
|     function _getShellAddress() |  | ||||||
|         internal |  | ||||||
|         view |  | ||||||
|         returns (address) |  | ||||||
|     { |  | ||||||
|         return SHELL_CONTRACT; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// @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() | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | // SPDX-License-Identifier: Apache-2.0 | ||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2020 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user