Compare commits
	
		
			173 Commits
		
	
	
		
			@0x/contra
			...
			protocol@6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 6e3e795b8b | ||
|  | d9c410a7e3 | ||
|  | 609727afe8 | ||
|  | 8a5c74c0b4 | ||
|  | cd93f3b07e | ||
|  | 8397b12de6 | ||
|  | 3f85acec3a | ||
|  | d6a9e3d600 | ||
|  | 361569ac2f | ||
|  | 719664c145 | ||
|  | f800d6c24c | ||
|  | a9a81bcafb | ||
|  | 4280307a15 | ||
|  | 7b57d3ae51 | ||
|  | 8a8a5bbda0 | ||
|  | 76987c8db1 | ||
|  | 6f8971cc42 | ||
|  | 71ab882143 | ||
|  | 5a4961c8d9 | ||
|  | 4c4fb99d87 | ||
|  | 872abf09e9 | ||
|  | f10bfe7d04 | ||
|  | a74d8deff3 | ||
|  | 835ee4e8de | ||
|  | 63ec42303f | ||
|  | f789aebddc | ||
|  | efd83be779 | ||
|  | 603bc1d51c | ||
|  | 32a930a7fc | ||
|  | f464bf68d7 | ||
|  | ebdc4fb509 | ||
|  | 7580719586 | ||
|  | aba9db2be7 | ||
|  | a6680411c8 | ||
|  | 0d0e87de94 | ||
|  | ccf2000c09 | ||
|  | 3eb2e0f56a | ||
|  | d07c7d5b69 | ||
|  | adf6684c29 | ||
|  | 9bf889aa30 | ||
|  | e81c88564e | ||
|  | 901d400d62 | ||
|  | 289474e2ce | ||
|  | 407ca21168 | ||
|  | 5c68fc24d2 | ||
|  | 548800e0a9 | ||
|  | bde3d6dc6a | ||
|  | 56550a6acc | ||
|  | e51b83accc | ||
|  | d5ae971f1c | ||
|  | 5a2f5f9a42 | ||
|  | 75a3b70cef | ||
|  | 803cf65ba1 | ||
|  | 5d3947b838 | ||
|  | 4397a59008 | ||
|  | 966d54c935 | ||
|  | 234ddb495d | ||
|  | a744acc7bc | ||
|  | 27c624633c | ||
|  | 7ef75101b4 | ||
|  | 6f8aace00d | ||
|  | 6c264b2f18 | ||
|  | df055e1958 | ||
|  | 70d2117470 | ||
|  | 2c173ccaf3 | ||
|  | d2f4a0c5f3 | ||
|  | 0d6021e5e3 | ||
|  | bb04726e7f | ||
|  | 220ca370c2 | ||
|  | 63af4e3e98 | ||
|  | 9754e12d82 | ||
|  | d72ebed246 | ||
|  | 587fc71058 | ||
|  | 7d34e09a12 | ||
|  | 7d15baad0f | ||
|  | 1e6476ada7 | ||
|  | 1d6ca5f6b5 | ||
|  | fb249f02fc | ||
|  | fdf04ef275 | ||
|  | b0f5f634f2 | ||
|  | 6ee0108565 | ||
|  | c73097e688 | ||
|  | a2d42b07b5 | ||
|  | f9a794af93 | ||
|  | a2643674ca | ||
|  | c00ce9daac | ||
|  | c68b5d7844 | ||
|  | 09ed106d4c | ||
|  | a6b92fc658 | ||
|  | 4be4a1a30b | ||
|  | 9bede5d331 | ||
|  | b50d4aee6d | ||
|  | 55bc367bd6 | ||
|  | 7a59b7eafe | ||
|  | 9e59d41e44 | ||
|  | 475e6c7bca | ||
|  | dbc5a5293e | ||
|  | f4bd2bd0d8 | ||
|  | f1782a83ba | ||
|  | cbade0d558 | ||
|  | fe0c26387c | ||
|  | c03a014740 | ||
|  | 84e6d788aa | ||
|  | cd296b8767 | ||
|  | 5946d32a7d | ||
|  | 842dd8572b | ||
|  | 33e260f9db | ||
|  | c44f8d0060 | ||
|  | 411548a33e | ||
|  | 9a17ce1383 | ||
|  | 2b120d0669 | ||
|  | 6d877d5242 | ||
|  | e4abd690e7 | ||
|  | 2a194384b6 | ||
|  | 1e069e6f8a | ||
|  | a019bb913d | ||
|  | 9ce73931f7 | ||
|  | 97020df178 | ||
|  | dfb7b3de8f | ||
|  | 9e152912fe | ||
|  | b2c2f1e1aa | ||
|  | 629c7d8e92 | ||
|  | 62f24d4356 | ||
|  | ae281c33ca | ||
|  | 5d034dd106 | ||
|  | c1f8df0eca | ||
|  | 76dda9eeda | ||
|  | a9b84a92ac | ||
|  | 0f7e881899 | ||
|  | 6045f777ab | ||
|  | 5a15044ead | ||
|  | a69d76e487 | ||
|  | 3adfcdffa8 | ||
|  | 164a5d44d9 | ||
|  | 70ddab0231 | ||
|  | 7bf009fbf6 | ||
|  | 525bc8197b | ||
|  | 24397c51a8 | ||
|  | 06b3464756 | ||
|  | bbaa90bd9a | ||
|  | 5c683cbc0f | ||
|  | 95345f18bc | ||
|  | 4c3fbe83ac | ||
|  | 7caa43d02c | ||
|  | 3d4c03c9df | ||
|  | 22e1ed35d3 | ||
|  | dabe6fd793 | ||
|  | 3cc639c8d0 | ||
|  | 22c8e0b6db | ||
|  | f3ca4293bc | ||
|  | db3e076d03 | ||
|  | 1a6759820a | ||
|  | 61c5e7b948 | ||
|  | 5fd78ef32f | ||
|  | 14ff9b827c | ||
|  | 598dc2cd71 | ||
|  | 08e1c5109f | ||
|  | 6f7a843742 | ||
|  | c9c9615bb5 | ||
|  | f98609686d | ||
|  | 5b8bbc34e8 | ||
|  | 49cb00a9ab | ||
|  | 74b240fb88 | ||
|  | 514f9d2621 | ||
|  | fa78d1092a | ||
|  | 297342092b | ||
|  | 076f263a86 | ||
|  | 0c56207abc | ||
|  | 23953d8a5a | ||
|  | c6919eb25a | ||
|  | d509604b52 | ||
|  | a74a3450eb | ||
|  | 72c5399b9d | 
| @@ -1,25 +1,25 @@ | ||||
| version: 2 | ||||
| version: 2.1 | ||||
|  | ||||
| jobs: | ||||
|     build: | ||||
|         resource_class: medium+ | ||||
|         resource_class: xlarge | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         environment: | ||||
|             CONTRACTS_COMMIT_HASH: '9ed05f5' | ||||
|             NODE_OPTIONS: '--max-old-space-size=16384' | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - checkout | ||||
|             - run: echo 'export PATH=$HOME/CIRCLE_PROJECT_REPONAME/node_modules/.bin:$PATH' >> $BASH_ENV | ||||
|             - run: | ||||
|                   name: install-yarn | ||||
|                   command: npm install --force --global yarn@1.17.0 | ||||
|                   command: npm install --force --global yarn@1.22.0 | ||||
|             - run: | ||||
|                   name: yarn | ||||
|                   command: yarn --frozen-lockfile --ignore-engines install || yarn --frozen-lockfile --ignore-engines install | ||||
|             - setup_remote_docker | ||||
|             - run: yarn build:ci | ||||
|             - run: yarn build:ts | ||||
|             - run: yarn build:ci || yarn build:ci || yarn build:ci || yarn build:ci || yarn build:ci || yarn build:ci | ||||
|             - run: yarn build:ts || yarn build:ts || yarn build:ts || yarn build:ts || yarn build:ts || yarn build:ts | ||||
|             - save_cache: | ||||
|                   key: repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                   paths: | ||||
| @@ -31,57 +31,59 @@ jobs: | ||||
|     test-exchange-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-exchange | ||||
|             - run: yarn wsrun -p @0x/contracts-exchange -m --serial -c test:circleci | ||||
|     test-integrations-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-integrations | ||||
|             - run: yarn wsrun -p @0x/contracts-integrations -m --serial -c test:circleci | ||||
|     test-contracts-staking-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-staking | ||||
|             - run: yarn wsrun -p @0x/contracts-staking -m --serial -c test:circleci | ||||
|     test-contracts-extra-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-exchange-forwarder @0x/contracts-coordinator | ||||
|             - run: yarn wsrun -p @0x/contracts-exchange-forwarder -p @0x/contracts-coordinator -m --serial -c test:circleci | ||||
|     test-contracts-rest-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-multisig @0x/contracts-utils @0x/contracts-exchange-libs @0x/contracts-erc20 @0x/contracts-erc721 @0x/contracts-erc1155 @0x/contracts-asset-proxy @0x/contracts-broker @0x/contracts-zero-ex | ||||
|             - run: yarn wsrun -p @0x/contracts-multisig -p @0x/contracts-utils -p @0x/contracts-exchange-libs -p  @0x/contracts-erc20 -p @0x/contracts-erc721 -p @0x/contracts-erc1155 -p @0x/contracts-asset-proxy -p @0x/contracts-broker -p @0x/contracts-zero-ex -m --serial -c test:circleci | ||||
|     test-publish: | ||||
|         resource_class: medium+ | ||||
|         resource_class: large | ||||
|         environment: | ||||
|             NODE_OPTIONS: '--max-old-space-size=6442' | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|             - image: 0xorg/verdaccio | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
| @@ -95,7 +97,7 @@ jobs: | ||||
|                   path: ~/.npm/_logs | ||||
|     test-doc-generation: | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
| @@ -106,18 +108,18 @@ jobs: | ||||
|                   no_output_timeout: 1200 | ||||
|     test-rest: | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-test-utils | ||||
|             - run: yarn wsrun test:circleci @0x/contract-artifacts | ||||
|             - run: yarn wsrun test:circleci @0x/contract-wrappers-test | ||||
|             - run: yarn wsrun test:circleci @0x/migrations | ||||
|             - run: yarn wsrun test:circleci @0x/order-utils | ||||
|             - run: yarn wsrun test:circleci @0x/asset-swapper | ||||
|             - run: yarn wsrun -p @0x/contracts-test-utils -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/contract-artifacts -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/contract-wrappers-test -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/migrations -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/order-utils -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/asset-swapper -m --serial -c test:circleci | ||||
|             - save_cache: | ||||
|                   key: coverage-contract-wrappers-test-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                   paths: | ||||
| @@ -134,7 +136,7 @@ jobs: | ||||
|         resource_class: large | ||||
|         working_directory: ~/repo | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
| @@ -145,7 +147,7 @@ jobs: | ||||
|             - run: yarn diff_md_docs:ci | ||||
|     submit-coverage: | ||||
|         docker: | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: node:12 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|   | ||||
							
								
								
									
										7
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							| @@ -7,6 +7,9 @@ on: | ||||
|               description: 'required CI status' | ||||
|               default: 'success' | ||||
|               required: true | ||||
|           prerelease: | ||||
|               description: 'prerelease name' | ||||
|               required: false | ||||
|  | ||||
| jobs: | ||||
|     publish: | ||||
| @@ -21,7 +24,7 @@ jobs: | ||||
|                   (echo "::error ::${{ github.ref }} does not have a successful CI status" && false) | ||||
|             - uses: actions/checkout@v2 | ||||
|               with: | ||||
|                 ref: 'development' | ||||
|                 ref: ${{ github.ref }} | ||||
|                 fetch-depth: 0 | ||||
|             - uses: actions/setup-node@v1 | ||||
|               with: | ||||
| @@ -41,7 +44,9 @@ jobs: | ||||
|               env: | ||||
|                   NPM_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} | ||||
|                   GITHUB_TOKEN: ${{ github.token }} | ||||
|                   PUBLISH_PRERELEASE: ${{ github.event.inputs.prerelease }} | ||||
|             - name: 'merge into main branch' | ||||
|               if: github.event.inputs.prerelease == '' # unless it's a prerelease | ||||
|               run: | | ||||
|                   git checkout main && \ | ||||
|                   git merge ${{ github.ref }} && \ | ||||
|   | ||||
| @@ -3,5 +3,6 @@ | ||||
|     "tabWidth": 4, | ||||
|     "singleQuote": true, | ||||
|     "trailingComma": "all", | ||||
|     "bracketSpacing": true | ||||
|     "bracketSpacing": true, | ||||
|     "arrowParens": "avoid" | ||||
| } | ||||
|   | ||||
| @@ -49,7 +49,6 @@ | ||||
| | Package | Version | | ||||
| | ------: | :------ | | ||||
|  | ||||
|  | ||||
| <!-- For example: | ||||
| |             `0x.js` | 2.0.4   | | ||||
| | `Exchange Contract` | v2      | | ||||
|   | ||||
| @@ -43,12 +43,12 @@ These packages are all under development. See [/contracts/README.md](/contracts/ | ||||
| #### 0x-specific packages | ||||
|  | ||||
| | Package                                                  | Version                                                                                                                 | Description                                                                                    | | ||||
| | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | ||||
| | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | ||||
| | [`@0x/contract-addresses`](/packages/contract-addresses) | [](https://www.npmjs.com/package/@0x/contract-addresses) | A tiny utility library for getting known deployed contract addresses for a particular network. | | ||||
| | [`@0x/contract-wrappers`](/packages/contract-wrappers)   | [](https://www.npmjs.com/package/@0x/contract-wrappers)   | JS/TS wrappers for interacting with the 0x smart contracts                                     | | ||||
| | [`@0x/order-utils`](/packages/order-utils)               | [](https://www.npmjs.com/package/@0x/order-utils)               | A set of utilities for generating, parsing, signing and validating 0x orders                   | | ||||
| | [`@0x/migrations`](/packages/migrations)                 | [](https://www.npmjs.com/package/@0x/migrations)                 | Migration tool for deploying 0x smart contracts on private testnets                            | | ||||
| | [`@0x/contract-artifacts`](/packages/contract-artifacts) | [](https://www.npmjs.com/package/@0x/contract-artifacts) | 0x smart contract compilation artifacts                                                        |  | | ||||
| | [`@0x/contract-artifacts`](/packages/contract-artifacts) | [](https://www.npmjs.com/package/@0x/contract-artifacts) | 0x smart contract compilation artifacts                                                        |     | | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "3.7.16", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "3.7.15", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "3.7.14", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "3.7.13", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.7.12", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.7.11", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.7.10", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.7.9", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.7.8", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.7.7", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.7.6", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.7.16 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.15 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.14 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.13 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.12 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.11 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.10 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.9 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.8 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.7 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.6 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-asset-proxy", | ||||
|     "version": "3.7.6", | ||||
|     "version": "3.7.16", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -51,15 +51,15 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contract-wrappers": "^13.12.3", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contract-wrappers": "^13.17.2", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -67,7 +67,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
|         "npm-run-all": "^4.1.2", | ||||
| @@ -76,20 +76,20 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-erc1155": "^2.1.24", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-erc721": "^3.1.24", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.24", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-erc1155": "^2.1.34", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-erc721": "^3.1.34", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.34", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,354 +0,0 @@ | ||||
| import { ContractTxFunctionObj } from '@0x/contract-wrappers'; | ||||
| import { | ||||
|     blockchainTests, | ||||
|     constants, | ||||
|     expect, | ||||
|     filterLogsToArguments, | ||||
|     getRandomInteger, | ||||
|     randomAddress, | ||||
|     shortZip, | ||||
| } from '@0x/contracts-test-utils'; | ||||
| import { BigNumber, hexUtils, NULL_ADDRESS } from '@0x/utils'; | ||||
| import { DecodedLogs } from 'ethereum-types'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { DexForwarderBridgeCall, dexForwarderBridgeDataEncoder } from '../src/dex_forwarder_bridge'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
| import { | ||||
|     TestDexForwarderBridgeBridgeTransferFromCalledEventArgs as BtfCalledEventArgs, | ||||
|     TestDexForwarderBridgeContract, | ||||
|     TestDexForwarderBridgeEvents as TestEvents, | ||||
| } from './wrappers'; | ||||
|  | ||||
| const { ZERO_AMOUNT } = constants; | ||||
|  | ||||
| blockchainTests.resets('DexForwarderBridge unit tests', env => { | ||||
|     let testContract: TestDexForwarderBridgeContract; | ||||
|     let inputToken: string; | ||||
|     let outputToken: string; | ||||
|     const BRIDGE_SUCCESS = '0xdc1600f3'; | ||||
|     const BRIDGE_FAILURE = '0xffffffff'; | ||||
|     const BRIDGE_REVERT_ERROR = 'oopsie'; | ||||
|     const NOT_AUTHORIZED_REVERT = 'DexForwarderBridge/SENDER_NOT_AUTHORIZED'; | ||||
|     const DEFAULTS = { | ||||
|         toAddress: randomAddress(), | ||||
|     }; | ||||
|  | ||||
|     before(async () => { | ||||
|         testContract = await TestDexForwarderBridgeContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.TestDexForwarderBridge, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             artifacts, | ||||
|         ); | ||||
|         // Create test tokens. | ||||
|         [inputToken, outputToken] = [ | ||||
|             await callAndTransactAsync(testContract.createToken()), | ||||
|             await callAndTransactAsync(testContract.createToken()), | ||||
|         ]; | ||||
|         await callAndTransactAsync(testContract.setAuthorized(env.txDefaults.from as string)); | ||||
|     }); | ||||
|  | ||||
|     async function callAndTransactAsync<TResult>(fnCall: ContractTxFunctionObj<TResult>): Promise<TResult> { | ||||
|         const result = await fnCall.callAsync(); | ||||
|         await fnCall.awaitTransactionSuccessAsync({}, { shouldValidate: false }); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     function getRandomBridgeCall( | ||||
|         bridgeAddress: string, | ||||
|         fields: Partial<DexForwarderBridgeCall> = {}, | ||||
|     ): DexForwarderBridgeCall { | ||||
|         return { | ||||
|             target: bridgeAddress, | ||||
|             inputTokenAmount: getRandomInteger(1, '100e18'), | ||||
|             outputTokenAmount: getRandomInteger(1, '100e18'), | ||||
|             bridgeData: hexUtils.leftPad(inputToken), | ||||
|             ...fields, | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     describe('bridgeTransferFrom()', () => { | ||||
|         let goodBridgeCalls: DexForwarderBridgeCall[]; | ||||
|         let revertingBridgeCall: DexForwarderBridgeCall; | ||||
|         let failingBridgeCall: DexForwarderBridgeCall; | ||||
|         let allBridgeCalls: DexForwarderBridgeCall[]; | ||||
|         let totalFillableOutputAmount: BigNumber; | ||||
|         let totalFillableInputAmount: BigNumber; | ||||
|         let recipientOutputBalance: BigNumber; | ||||
|  | ||||
|         beforeEach(async () => { | ||||
|             goodBridgeCalls = []; | ||||
|             for (let i = 0; i < 4; ++i) { | ||||
|                 goodBridgeCalls.push(await createBridgeCallAsync({ returnCode: BRIDGE_SUCCESS })); | ||||
|             } | ||||
|             revertingBridgeCall = await createBridgeCallAsync({ revertError: BRIDGE_REVERT_ERROR }); | ||||
|             failingBridgeCall = await createBridgeCallAsync({ returnCode: BRIDGE_FAILURE }); | ||||
|             allBridgeCalls = _.shuffle([failingBridgeCall, revertingBridgeCall, ...goodBridgeCalls]); | ||||
|  | ||||
|             totalFillableInputAmount = BigNumber.sum(...goodBridgeCalls.map(c => c.inputTokenAmount)); | ||||
|             totalFillableOutputAmount = BigNumber.sum(...goodBridgeCalls.map(c => c.outputTokenAmount)); | ||||
|  | ||||
|             // Grant the taker some output tokens. | ||||
|             await testContract.setTokenBalance( | ||||
|                 outputToken, | ||||
|                 DEFAULTS.toAddress, | ||||
|                 (recipientOutputBalance = getRandomInteger(1, '100e18')), | ||||
|             ); | ||||
|         }); | ||||
|  | ||||
|         async function setForwarderInputBalanceAsync(amount: BigNumber): Promise<void> { | ||||
|             await testContract | ||||
|                 .setTokenBalance(inputToken, testContract.address, amount) | ||||
|                 .awaitTransactionSuccessAsync({}, { shouldValidate: false }); | ||||
|         } | ||||
|  | ||||
|         async function createBridgeCallAsync( | ||||
|             opts: Partial<{ | ||||
|                 returnCode: string; | ||||
|                 revertError: string; | ||||
|                 callFields: Partial<DexForwarderBridgeCall>; | ||||
|                 outputFillAmount: BigNumber; | ||||
|             }>, | ||||
|         ): Promise<DexForwarderBridgeCall> { | ||||
|             const { returnCode, revertError, callFields, outputFillAmount } = { | ||||
|                 returnCode: BRIDGE_SUCCESS, | ||||
|                 revertError: '', | ||||
|                 ...opts, | ||||
|             }; | ||||
|             const bridge = await callAndTransactAsync(testContract.createBridge(returnCode, revertError)); | ||||
|             const call = getRandomBridgeCall(bridge, callFields); | ||||
|             await testContract | ||||
|                 .setBridgeTransferAmount(call.target, outputFillAmount || call.outputTokenAmount) | ||||
|                 .awaitTransactionSuccessAsync({}, { shouldValidate: false }); | ||||
|             return call; | ||||
|         } | ||||
|  | ||||
|         async function callBridgeTransferFromAsync(opts: { | ||||
|             bridgeData: string; | ||||
|             sellAmount?: BigNumber; | ||||
|             buyAmount?: BigNumber; | ||||
|         }): Promise<DecodedLogs> { | ||||
|             // Fund the forwarder with input tokens to sell. | ||||
|             await setForwarderInputBalanceAsync(opts.sellAmount || totalFillableInputAmount); | ||||
|             const call = testContract.bridgeTransferFrom( | ||||
|                 outputToken, | ||||
|                 testContract.address, | ||||
|                 DEFAULTS.toAddress, | ||||
|                 opts.buyAmount || totalFillableOutputAmount, | ||||
|                 opts.bridgeData, | ||||
|             ); | ||||
|             const returnCode = await call.callAsync(); | ||||
|             if (returnCode !== BRIDGE_SUCCESS) { | ||||
|                 throw new Error('Expected BRIDGE_SUCCESS'); | ||||
|             } | ||||
|             const receipt = await call.awaitTransactionSuccessAsync({}, { shouldValidate: false }); | ||||
|             // tslint:disable-next-line: no-unnecessary-type-assertion | ||||
|             return receipt.logs as DecodedLogs; | ||||
|         } | ||||
|  | ||||
|         it('succeeds with no bridge calls and no input balance', async () => { | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls: [], | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData, sellAmount: ZERO_AMOUNT }); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds with bridge calls and no input balance', async () => { | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls: allBridgeCalls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData, sellAmount: ZERO_AMOUNT }); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds with no bridge calls and an input balance', async () => { | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls: [], | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ | ||||
|                 bridgeData, | ||||
|                 sellAmount: new BigNumber(1), | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds if entire input token balance is not consumed', async () => { | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls: allBridgeCalls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ | ||||
|                 bridgeData, | ||||
|                 sellAmount: totalFillableInputAmount.plus(1), | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         it('fails if not authorized', async () => { | ||||
|             const calls = goodBridgeCalls.slice(0, 1); | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callAndTransactAsync(testContract.setAuthorized(NULL_ADDRESS)); | ||||
|             return expect(callBridgeTransferFromAsync({ bridgeData, sellAmount: new BigNumber(1) })).to.revertWith( | ||||
|                 NOT_AUTHORIZED_REVERT, | ||||
|             ); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds with one bridge call', async () => { | ||||
|             const calls = goodBridgeCalls.slice(0, 1); | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData, sellAmount: calls[0].inputTokenAmount }); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds with many bridge calls', async () => { | ||||
|             const calls = goodBridgeCalls; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData }); | ||||
|         }); | ||||
|  | ||||
|         it('swallows a failing bridge call', async () => { | ||||
|             const calls = _.shuffle([...goodBridgeCalls, failingBridgeCall]); | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData }); | ||||
|         }); | ||||
|  | ||||
|         it('consumes input tokens for output tokens', async () => { | ||||
|             const calls = allBridgeCalls; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const currentBridgeInputBalance = await testContract | ||||
|                 .balanceOf(inputToken, testContract.address) | ||||
|                 .callAsync(); | ||||
|             expect(currentBridgeInputBalance).to.bignumber.eq(0); | ||||
|             const currentRecipientOutputBalance = await testContract | ||||
|                 .balanceOf(outputToken, DEFAULTS.toAddress) | ||||
|                 .callAsync(); | ||||
|             expect(currentRecipientOutputBalance).to.bignumber.eq(totalFillableOutputAmount); | ||||
|         }); | ||||
|  | ||||
|         it("transfers only up to each call's input amount to each bridge", async () => { | ||||
|             const calls = goodBridgeCalls; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             for (const [call, btf] of shortZip(goodBridgeCalls, btfs)) { | ||||
|                 expect(btf.inputTokenBalance).to.bignumber.eq(call.inputTokenAmount); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         it('transfers only up to outstanding sell amount to each bridge', async () => { | ||||
|             // Prepend an extra bridge call. | ||||
|             const calls = [ | ||||
|                 await createBridgeCallAsync({ | ||||
|                     callFields: { | ||||
|                         inputTokenAmount: new BigNumber(1), | ||||
|                         outputTokenAmount: new BigNumber(1), | ||||
|                     }, | ||||
|                 }), | ||||
|                 ...goodBridgeCalls, | ||||
|             ]; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             expect(btfs).to.be.length(goodBridgeCalls.length + 1); | ||||
|             // The last call will receive 1 less token. | ||||
|             const lastCall = calls.slice(-1)[0]; | ||||
|             const lastBtf = btfs.slice(-1)[0]; | ||||
|             expect(lastBtf.inputTokenBalance).to.bignumber.eq(lastCall.inputTokenAmount.minus(1)); | ||||
|         }); | ||||
|  | ||||
|         it('recoups funds from a bridge that fails', async () => { | ||||
|             // Prepend a call that will take the whole input amount but will | ||||
|             // fail. | ||||
|             const badCall = await createBridgeCallAsync({ | ||||
|                 callFields: { inputTokenAmount: totalFillableInputAmount }, | ||||
|                 returnCode: BRIDGE_FAILURE, | ||||
|             }); | ||||
|             const calls = [badCall, ...goodBridgeCalls]; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             expect(btfs).to.be.length(goodBridgeCalls.length); | ||||
|         }); | ||||
|  | ||||
|         it('recoups funds from a bridge that reverts', async () => { | ||||
|             // Prepend a call that will take the whole input amount but will | ||||
|             // revert. | ||||
|             const badCall = await createBridgeCallAsync({ | ||||
|                 callFields: { inputTokenAmount: totalFillableInputAmount }, | ||||
|                 revertError: BRIDGE_REVERT_ERROR, | ||||
|             }); | ||||
|             const calls = [badCall, ...goodBridgeCalls]; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             expect(btfs).to.be.length(goodBridgeCalls.length); | ||||
|         }); | ||||
|  | ||||
|         it('recoups funds from a bridge that under-pays', async () => { | ||||
|             // Prepend a call that will take the whole input amount but will | ||||
|             // underpay the output amount.. | ||||
|             const badCall = await createBridgeCallAsync({ | ||||
|                 callFields: { | ||||
|                     inputTokenAmount: totalFillableInputAmount, | ||||
|                     outputTokenAmount: new BigNumber(2), | ||||
|                 }, | ||||
|                 outputFillAmount: new BigNumber(1), | ||||
|             }); | ||||
|             const calls = [badCall, ...goodBridgeCalls]; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             expect(btfs).to.be.length(goodBridgeCalls.length); | ||||
|         }); | ||||
|     }); | ||||
|  | ||||
|     describe('executeBridgeCall()', () => { | ||||
|         it('cannot be called externally', async () => { | ||||
|             return expect( | ||||
|                 testContract | ||||
|                     .executeBridgeCall( | ||||
|                         randomAddress(), | ||||
|                         randomAddress(), | ||||
|                         randomAddress(), | ||||
|                         randomAddress(), | ||||
|                         new BigNumber(1), | ||||
|                         new BigNumber(1), | ||||
|                         constants.NULL_BYTES, | ||||
|                     ) | ||||
|                     .callAsync(), | ||||
|             ).to.revertWith('DexForwarderBridge/ONLY_SELF'); | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
| @@ -168,7 +168,7 @@ describe('StaticCallProxy', () => { | ||||
|         it('should revert if the hash of the output is different than expected expected', async () => { | ||||
|             const staticCallData = staticCallTarget.isOddNumber(new BigNumber(0)).getABIEncodedTransactionData(); | ||||
|             const trueAsBuffer = ethUtil.toBuffer('0x0000000000000000000000000000000000000000000000000000000000000001'); | ||||
|             const expectedResultHash = ethUtil.bufferToHex(ethUtil.sha3(trueAsBuffer)); | ||||
|             const expectedResultHash = ethUtil.bufferToHex(ethUtil.keccak256(trueAsBuffer)); | ||||
|             const assetData = assetDataInterface | ||||
|                 .StaticCall(staticCallTarget.address, staticCallData, expectedResultHash) | ||||
|                 .getABIEncodedTransactionData(); | ||||
| @@ -199,7 +199,7 @@ describe('StaticCallProxy', () => { | ||||
|         it('should be successful if a function call with one static input returns the correct value', async () => { | ||||
|             const staticCallData = staticCallTarget.isOddNumber(new BigNumber(1)).getABIEncodedTransactionData(); | ||||
|             const trueAsBuffer = ethUtil.toBuffer('0x0000000000000000000000000000000000000000000000000000000000000001'); | ||||
|             const expectedResultHash = ethUtil.bufferToHex(ethUtil.sha3(trueAsBuffer)); | ||||
|             const expectedResultHash = ethUtil.bufferToHex(ethUtil.keccak256(trueAsBuffer)); | ||||
|             const assetData = assetDataInterface | ||||
|                 .StaticCall(staticCallTarget.address, staticCallData, expectedResultHash) | ||||
|                 .getABIEncodedTransactionData(); | ||||
| @@ -232,7 +232,7 @@ describe('StaticCallProxy', () => { | ||||
|             const offset = '0000000000000000000000000000000000000000000000000000000000000020'; | ||||
|             const encodedExpectedResultWithOffset = `0x${offset}${abiEncoder.encode(expectedResults).slice(2)}`; | ||||
|             const expectedResultHash = ethUtil.bufferToHex( | ||||
|                 ethUtil.sha3(ethUtil.toBuffer(encodedExpectedResultWithOffset)), | ||||
|                 ethUtil.keccak256(ethUtil.toBuffer(encodedExpectedResultWithOffset)), | ||||
|             ); | ||||
|             const assetData = assetDataInterface | ||||
|                 .StaticCall(staticCallTarget.address, staticCallData, expectedResultHash) | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "1.1.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "1.1.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "1.1.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "1.1.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "1.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "1.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "1.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "1.1.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "1.1.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "1.1.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "1.1.24", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.1.34 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.33 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.32 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.31 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.30 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.29 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.28 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.27 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.26 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.25 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.24 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-broker", | ||||
|     "version": "1.1.24", | ||||
|     "version": "1.1.34", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -51,20 +51,20 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.6", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-erc721": "^3.1.24", | ||||
|         "@0x/contracts-exchange": "^3.2.25", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.24", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-erc721": "^3.1.34", | ||||
|         "@0x/contracts-exchange": "^3.2.35", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.34", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -81,14 +81,14 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -7,7 +7,10 @@ export interface GodsUnchainedProperties { | ||||
|     quality: BigNumber | number; | ||||
| } | ||||
|  | ||||
| const propertyDataEncoder = AbiEncoder.create([{ name: 'proto', type: 'uint16' }, { name: 'quality', type: 'uint8' }]); | ||||
| const propertyDataEncoder = AbiEncoder.create([ | ||||
|     { name: 'proto', type: 'uint16' }, | ||||
|     { name: 'quality', type: 'uint8' }, | ||||
| ]); | ||||
| const brokerDataEncoder = AbiEncoder.create([ | ||||
|     { name: 'godsUnchainedAddress', type: 'address' }, | ||||
|     { name: 'validatorAddress', type: 'address' }, | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "3.1.35", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "3.1.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "3.1.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "3.1.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.1.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.1.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.1.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.1.25", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.1.35 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.34 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.33 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.32 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.31 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.30 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.29 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.28 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.27 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.26 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.25 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-coordinator", | ||||
|     "version": "3.1.25", | ||||
|     "version": "3.1.35", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,17 +52,17 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.6", | ||||
|         "@0x/contracts-dev-utils": "^1.3.23", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-dev-utils": "^1.3.33", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -79,20 +79,20 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.21", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contract-addresses": "^5.10.0", | ||||
|         "@0x/contracts-exchange": "^3.2.25", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/json-schemas": "^5.4.1", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "@0x/assert": "^3.0.27", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contract-addresses": "^6.4.0", | ||||
|         "@0x/contracts-exchange": "^3.2.35", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/json-schemas": "^6.1.3", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "http-status-codes": "^1.3.2" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| import { assert as sharedAssert } from '@0x/assert'; | ||||
| // HACK: We need those two unused imports because they're actually used by sharedAssert which gets injected here | ||||
| import { Schema } from '@0x/json-schemas'; // tslint:disable-line:no-unused-variable | ||||
| import { Order } from '@0x/types'; // tslint:disable-line:no-unused-variable | ||||
| import { BigNumber } from '@0x/utils'; // tslint:disable-line:no-unused-variable | ||||
| import { Web3Wrapper } from '@0x/web3-wrapper'; | ||||
|  | ||||
| export const assert = { | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "1.3.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "1.3.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "1.3.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "1.3.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "1.3.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "1.3.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "1.3.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "1.3.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "1.3.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "1.3.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "1.3.23", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.3.33 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.32 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.31 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.30 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.29 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.28 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.27 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.26 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.25 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.24 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.23 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-dev-utils", | ||||
|     "version": "1.3.23", | ||||
|     "version": "1.3.33", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -41,18 +41,18 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/dev-utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/assert": "^3.0.21", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.6", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/assert": "^3.0.27", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethers": "~4.0.4", | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "shx": "^0.2.2", | ||||
| @@ -60,10 +60,10 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@types/node": "12.12.54" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "2.1.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "2.1.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "2.1.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "2.1.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "2.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "2.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "2.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "2.1.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "2.1.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "2.1.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "2.1.24", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v2.1.34 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.33 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.32 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.31 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.30 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.29 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.28 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.27 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.26 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.25 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.24 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc1155", | ||||
|     "version": "2.1.24", | ||||
|     "version": "2.1.34", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,15 +52,15 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -68,7 +68,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
|         "npm-run-all": "^4.1.2", | ||||
| @@ -77,13 +77,13 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "3.3.13", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "3.3.12", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "3.3.11", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "3.3.10", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.3.9", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.3.8", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.3.7", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.3.6", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.3.5", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.3.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.3.3", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.3.13 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.12 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.11 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.10 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.9 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.8 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.7 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.6 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.5 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.4 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.3 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc20", | ||||
|     "version": "3.3.3", | ||||
|     "version": "3.3.13", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -51,18 +51,18 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -70,7 +70,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -79,10 +79,10 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18" | ||||
|         "@0x/base-contract": "^6.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -6,6 +6,7 @@ export { | ||||
|     WETH9Events, | ||||
|     WETH9DepositEventArgs, | ||||
|     WETH9TransferEventArgs, | ||||
|     WETH9WithdrawalEventArgs, | ||||
|     ZRXTokenContract, | ||||
|     DummyERC20TokenTransferEventArgs, | ||||
|     ERC20TokenEventArgs, | ||||
|   | ||||
| @@ -39,8 +39,8 @@ describe('EtherToken', () => { | ||||
|             artifacts.WETH9, | ||||
|             provider, | ||||
|             { | ||||
|                 gasPrice, | ||||
|                 ...txDefaults, | ||||
|                 gasPrice, | ||||
|             }, | ||||
|             artifacts, | ||||
|         ); | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "3.1.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "3.1.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "3.1.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "3.1.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.1.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.1.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.1.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.1.24", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.1.34 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.33 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.32 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.31 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.30 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.29 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.28 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.27 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.26 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.25 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.24 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc721", | ||||
|     "version": "3.1.24", | ||||
|     "version": "3.1.34", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,18 +52,18 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -71,7 +71,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -81,10 +81,10 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18" | ||||
|         "@0x/base-contract": "^6.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "4.2.35", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "4.2.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "4.2.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "4.2.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "4.2.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "4.2.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "4.2.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "4.2.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "4.2.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "4.2.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "4.2.25", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.2.35 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.34 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.33 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.32 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.31 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.30 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.29 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.28 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.27 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.26 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.25 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange-forwarder", | ||||
|     "version": "4.2.25", | ||||
|     "version": "4.2.35", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,25 +52,25 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.6", | ||||
|         "@0x/contracts-dev-utils": "^1.3.23", | ||||
|         "@0x/contracts-erc1155": "^2.1.24", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-erc721": "^3.1.24", | ||||
|         "@0x/contracts-exchange": "^3.2.25", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.24", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-dev-utils": "^1.3.33", | ||||
|         "@0x/contracts-erc1155": "^2.1.34", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-erc721": "^3.1.34", | ||||
|         "@0x/contracts-exchange": "^3.2.35", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.34", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -87,12 +87,12 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "4.3.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "4.3.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "4.3.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "4.3.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "4.3.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "4.3.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "4.3.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "4.3.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "4.3.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "4.3.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "4.3.24", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.3.34 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.33 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.32 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.31 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.30 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.29 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.28 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.27 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.26 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.25 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.24 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange-libs", | ||||
|     "version": "4.3.24", | ||||
|     "version": "4.3.34", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,14 +52,14 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/libs", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/subproviders": "^6.4.1", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/subproviders": "^6.5.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -67,7 +67,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -77,17 +77,17 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "3.2.35", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "3.2.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "3.2.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "3.2.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.2.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.2.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.2.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.2.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.2.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.2.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.2.25", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.2.35 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.34 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.33 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.32 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.31 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.30 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.29 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.28 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.27 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.26 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.25 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange", | ||||
|     "version": "3.2.25", | ||||
|     "version": "3.2.35", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,21 +52,21 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.6", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.24", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-multisig": "^4.1.25", | ||||
|         "@0x/contracts-staking": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.34", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-multisig": "^4.1.35", | ||||
|         "@0x/contracts-staking": "^2.0.42", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -74,8 +74,8 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "js-combinatorics": "^0.5.3", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -85,16 +85,16 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-dev-utils": "^1.3.23", | ||||
|         "@0x/contracts-erc1155": "^2.1.24", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-erc721": "^3.1.24", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-dev-utils": "^1.3.33", | ||||
|         "@0x/contracts-erc1155": "^2.1.34", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-erc721": "^3.1.34", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -13,7 +13,11 @@ export const exchangeDataEncoder = { | ||||
|                 .getABIEncodedTransactionData(); | ||||
|         } else if (constants.BATCH_FILL_FN_NAMES.indexOf(fnName) !== -1) { | ||||
|             data = (exchangeInstance as any) | ||||
|                 [fnName](orders, orders.map(order => order.takerAssetAmount), orders.map(order => order.signature)) | ||||
|                 [fnName]( | ||||
|                     orders, | ||||
|                     orders.map(order => order.takerAssetAmount), | ||||
|                     orders.map(order => order.signature), | ||||
|                 ) | ||||
|                 .getABIEncodedTransactionData(); | ||||
|         } else if (constants.MARKET_FILL_FN_NAMES.indexOf(fnName) !== -1) { | ||||
|             const fillAsset = /Buy/.test(fnName) ? 'makerAssetAmount' : 'takerAssetAmount'; | ||||
|   | ||||
| @@ -39,7 +39,10 @@ blockchainTests.resets('Reentrancy Tests', env => { | ||||
|         // Handle tuples. | ||||
|         if (item.type === 'tuple') { | ||||
|             const tuple = item as TupleDataItem; | ||||
|             return _.zipObject(tuple.components.map(c => c.name), tuple.components.map(createFunctionInputs)); | ||||
|             return _.zipObject( | ||||
|                 tuple.components.map(c => c.name), | ||||
|                 tuple.components.map(createFunctionInputs), | ||||
|             ); | ||||
|         } | ||||
|         // Handle strings. | ||||
|         if (item.type === 'string') { | ||||
|   | ||||
| @@ -86,7 +86,7 @@ blockchainTests.resets('MixinSignatureValidator', env => { | ||||
|  | ||||
|     const SIGNATURE_LENGTH = 65; | ||||
|     const generateRandomSignature = (): string => hexUtils.random(SIGNATURE_LENGTH); | ||||
|     const hashBytes = (bytesHex: string): string => ethUtil.bufferToHex(ethUtil.sha3(ethUtil.toBuffer(bytesHex))); | ||||
|     const hashBytes = (bytesHex: string): string => hexUtils.hash(bytesHex); | ||||
|     const signDataHex = (dataHex: string, privateKey: Buffer): string => { | ||||
|         const ecSignature = ethUtil.ecsign(ethUtil.toBuffer(dataHex), privateKey); | ||||
|         return hexUtils.concat(ecSignature.v, ecSignature.r, ecSignature.s); | ||||
|   | ||||
| @@ -12,12 +12,12 @@ export abstract class AbstractBalanceAndProxyAllowanceFetcher { | ||||
|      * @param userAddress Ethereum address for which to fetch the balance | ||||
|      * @return Balance amount in base units | ||||
|      */ | ||||
|     public abstract async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     /** | ||||
|      * Get the 0x asset proxy allowance of assetData for userAddress | ||||
|      * @param assetData AssetData for which to fetch the allowance | ||||
|      * @param userAddress Ethereum address for which to fetch the allowance | ||||
|      * @return Allowance amount in base units | ||||
|      */ | ||||
|     public abstract async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| import { BigNumber } from '@0x/utils'; | ||||
|  | ||||
| export abstract class AbstractBalanceAndProxyAllowanceLazyStore { | ||||
|     public abstract async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract setBalance(assetData: string, userAddress: string, balance: BigNumber): void; | ||||
|     public abstract deleteBalance(assetData: string, userAddress: string): void; | ||||
|     public abstract setProxyAllowance(assetData: string, userAddress: string, proxyAllowance: BigNumber): void; | ||||
|   | ||||
| @@ -11,5 +11,5 @@ export abstract class AbstractOrderFilledCancelledFetcher { | ||||
|      * @param orderHash OrderHash of order we are interested in | ||||
|      * @return FilledTakerAmount | ||||
|      */ | ||||
|     public abstract async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>; | ||||
|     public abstract getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>; | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import { BigNumber } from '@0x/utils'; | ||||
|  | ||||
| export abstract class AbstractOrderFilledCancelledLazyStore { | ||||
|     public abstract async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>; | ||||
|     public abstract getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>; | ||||
|     public abstract setFilledTakerAmount(orderHash: string, balance: BigNumber): void; | ||||
|     public abstract deleteFilledTakerAmount(orderHash: string): void; | ||||
|     public abstract setIsCancelled(orderHash: string, isCancelled: boolean): void; | ||||
|   | ||||
| @@ -109,7 +109,11 @@ export class ExchangeWrapper { | ||||
|         opts: { makerAssetFillAmount: BigNumber; gas?: number; gasPrice?: BigNumber }, | ||||
|     ): Promise<TransactionReceiptWithDecodedLogs> { | ||||
|         return this.exchangeContract | ||||
|             .marketBuyOrdersNoThrow(orders, opts.makerAssetFillAmount, orders.map(signedOrder => signedOrder.signature)) | ||||
|             .marketBuyOrdersNoThrow( | ||||
|                 orders, | ||||
|                 opts.makerAssetFillAmount, | ||||
|                 orders.map(signedOrder => signedOrder.signature), | ||||
|             ) | ||||
|             .awaitTransactionSuccessAsync({ from, gas: opts.gas }); | ||||
|     } | ||||
|     public async marketSellOrdersFillOrKillAsync( | ||||
|   | ||||
| @@ -18,6 +18,7 @@ import { | ||||
|     IsolatedExchangeFillEventArgs as FillEventArgs, | ||||
| } from '../wrappers'; | ||||
|  | ||||
| export { Order } from '@0x/types'; | ||||
| export interface AssetBalances { | ||||
|     [assetData: string]: { [address: string]: BigNumber }; | ||||
| } | ||||
| @@ -27,7 +28,6 @@ export interface IsolatedExchangeEvents { | ||||
|     transferFromCalls: DispatchTransferFromCallArgs[]; | ||||
| } | ||||
|  | ||||
| export type Order = Order; | ||||
| export type Numberish = string | number | BigNumber; | ||||
|  | ||||
| export const DEFAULT_GOOD_SIGNATURE = createGoodSignature(); | ||||
|   | ||||
| @@ -12,7 +12,6 @@ import { ReferenceFunctions as UtilReferenceFunctions, SafeMathRevertErrors } fr | ||||
| import { FillResults, Order } from '@0x/types'; | ||||
| import { AnyRevertError, BigNumber, ExchangeRevertErrors, hexUtils, StringRevertError } from '@0x/utils'; | ||||
| import { LogEntry, LogWithDecodedArgs } from 'ethereum-types'; | ||||
| import * as ethjs from 'ethereumjs-util'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
| @@ -104,7 +103,7 @@ blockchainTests('Exchange wrapper functions unit tests.', env => { | ||||
|     // Creates a deterministic order signature, even though no signature validation | ||||
|     // actually occurs in the test contract. | ||||
|     function createOrderSignature(order: Order): string { | ||||
|         return ethjs.bufferToHex(ethjs.sha3(ethjs.toBuffer(orderHashUtils.getOrderHashHex(order)))); | ||||
|         return hexUtils.hash(orderHashUtils.getOrderHashHex(order)); | ||||
|     } | ||||
|  | ||||
|     // Asserts that `_fillOrder()` was called in the same order and with the same | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "6.2.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "6.2.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "6.2.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "6.2.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "6.2.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "6.2.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "6.2.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "6.2.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "6.2.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "6.2.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "6.2.19", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v6.2.29 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.28 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.27 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.26 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.25 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.24 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.23 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.22 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.21 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.20 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.19 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-extensions", | ||||
|     "version": "6.2.19", | ||||
|     "version": "6.2.29", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,23 +52,23 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.6", | ||||
|         "@0x/contracts-dev-utils": "^1.3.23", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-erc721": "^3.1.24", | ||||
|         "@0x/contracts-exchange": "^3.2.25", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.24", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-dev-utils": "^1.3.33", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-erc721": "^3.1.34", | ||||
|         "@0x/contracts-exchange": "^3.2.35", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.34", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -77,7 +77,7 @@ | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereumjs-abi": "0.6.5", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -87,13 +87,13 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-integrations", | ||||
|     "version": "2.7.26", | ||||
|     "version": "2.7.59", | ||||
|     "private": true, | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
| @@ -52,25 +52,25 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contract-addresses": "^5.10.0", | ||||
|         "@0x/contract-wrappers": "^13.12.3", | ||||
|         "@0x/contracts-broker": "^1.1.24", | ||||
|         "@0x/contracts-coordinator": "^3.1.25", | ||||
|         "@0x/contracts-dev-utils": "^1.3.23", | ||||
|         "@0x/contracts-exchange-forwarder": "^4.2.25", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.24", | ||||
|         "@0x/contracts-extensions": "^6.2.19", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contract-addresses": "^6.4.0", | ||||
|         "@0x/contract-wrappers": "^13.17.2", | ||||
|         "@0x/contracts-broker": "^1.1.34", | ||||
|         "@0x/contracts-coordinator": "^3.1.35", | ||||
|         "@0x/contracts-dev-utils": "^1.3.33", | ||||
|         "@0x/contracts-exchange-forwarder": "^4.2.35", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.34", | ||||
|         "@0x/contracts-extensions": "^6.2.29", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/coordinator-server": "^1.0.5", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/migrations": "^6.6.0", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/protocol-utils": "^1.2.0", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/migrations": "^8.0.11", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/protocol-utils": "^1.7.2", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@azure/core-asynciterator-polyfill": "^1.0.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -90,26 +90,26 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/asset-swapper": "^6.0.0", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.6", | ||||
|         "@0x/contracts-erc1155": "^2.1.24", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-erc721": "^3.1.24", | ||||
|         "@0x/contracts-exchange": "^3.2.25", | ||||
|         "@0x/contracts-multisig": "^4.1.25", | ||||
|         "@0x/contracts-staking": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-zero-ex": "^0.18.2", | ||||
|         "@0x/subproviders": "^6.4.1", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^6.2.0", | ||||
|         "@0x/asset-swapper": "^16.22.0", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-erc1155": "^2.1.34", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-erc721": "^3.1.34", | ||||
|         "@0x/contracts-exchange": "^3.2.35", | ||||
|         "@0x/contracts-multisig": "^4.1.35", | ||||
|         "@0x/contracts-staking": "^2.0.42", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-zero-ex": "^0.26.0", | ||||
|         "@0x/subproviders": "^6.5.3", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -534,9 +534,14 @@ blockchainTests.skip('Coordinator Client', env => { | ||||
|             const signedOrders = [signedOrder, signedOrderWithDifferentFeeRecipient]; | ||||
|             const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount, takerTokenFillAmount]; | ||||
|             await coordinatorClient | ||||
|                 .batchFillOrdersAsync(signedOrders, takerAssetFillAmounts, signedOrders.map(o => o.signature), { | ||||
|                     from: takerAddress, | ||||
|                 }) | ||||
|                 .batchFillOrdersAsync( | ||||
|                     signedOrders, | ||||
|                     takerAssetFillAmounts, | ||||
|                     signedOrders.map(o => o.signature), | ||||
|                     { | ||||
|                         from: takerAddress, | ||||
|                     }, | ||||
|                 ) | ||||
|                 .then(res => { | ||||
|                     expect(res).to.be.undefined(); | ||||
|                 }) | ||||
| @@ -570,9 +575,14 @@ blockchainTests.skip('Coordinator Client', env => { | ||||
|             const signedOrders = [signedOrder, signedOrderWithDifferentCoordinatorOperator]; | ||||
|             const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount, takerTokenFillAmount]; | ||||
|             await coordinatorClient | ||||
|                 .batchFillOrdersAsync(signedOrders, takerAssetFillAmounts, signedOrders.map(o => o.signature), { | ||||
|                     from: takerAddress, | ||||
|                 }) | ||||
|                 .batchFillOrdersAsync( | ||||
|                     signedOrders, | ||||
|                     takerAssetFillAmounts, | ||||
|                     signedOrders.map(o => o.signature), | ||||
|                     { | ||||
|                         from: takerAddress, | ||||
|                     }, | ||||
|                 ) | ||||
|                 .then(res => { | ||||
|                     expect(res).to.be.undefined(); | ||||
|                 }) | ||||
| @@ -600,9 +610,14 @@ blockchainTests.skip('Coordinator Client', env => { | ||||
|             const signedOrders = [signedOrder, signedOrderWithDifferentCoordinatorOperator]; | ||||
|             const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount, takerTokenFillAmount]; | ||||
|             await coordinatorClient | ||||
|                 .batchFillOrdersAsync(signedOrders, takerAssetFillAmounts, signedOrders.map(o => o.signature), { | ||||
|                     from: takerAddress, | ||||
|                 }) | ||||
|                 .batchFillOrdersAsync( | ||||
|                     signedOrders, | ||||
|                     takerAssetFillAmounts, | ||||
|                     signedOrders.map(o => o.signature), | ||||
|                     { | ||||
|                         from: takerAddress, | ||||
|                     }, | ||||
|                 ) | ||||
|                 .then(res => { | ||||
|                     expect(res).to.be.undefined(); | ||||
|                 }) | ||||
|   | ||||
| @@ -267,7 +267,11 @@ blockchainTests.resets('Coordinator integration tests', env => { | ||||
|                 expectedBalances.simulateFills(orders, taker.address, txReceipt, deployment, value); | ||||
|                 await balanceStore.updateBalancesAsync(); | ||||
|                 balanceStore.assertEquals(expectedBalances); | ||||
|                 verifyEvents(txReceipt, orders.map(order => expectedFillEvent(order)), ExchangeEvents.Fill); | ||||
|                 verifyEvents( | ||||
|                     txReceipt, | ||||
|                     orders.map(order => expectedFillEvent(order)), | ||||
|                     ExchangeEvents.Fill, | ||||
|                 ); | ||||
|             }); | ||||
|             it(`${fnName} should fill the orders if called by approver (eth fee, no refund)`, async () => { | ||||
|                 await balanceStore.updateBalancesAsync(); | ||||
| @@ -280,7 +284,11 @@ blockchainTests.resets('Coordinator integration tests', env => { | ||||
|                 expectedBalances.simulateFills(orders, taker.address, txReceipt, deployment, value); | ||||
|                 await balanceStore.updateBalancesAsync(); | ||||
|                 balanceStore.assertEquals(expectedBalances); | ||||
|                 verifyEvents(txReceipt, orders.map(order => expectedFillEvent(order)), ExchangeEvents.Fill); | ||||
|                 verifyEvents( | ||||
|                     txReceipt, | ||||
|                     orders.map(order => expectedFillEvent(order)), | ||||
|                     ExchangeEvents.Fill, | ||||
|                 ); | ||||
|             }); | ||||
|             it(`${fnName} should fill the orders if called by approver (mixed fees, refund)`, async () => { | ||||
|                 await balanceStore.updateBalancesAsync(); | ||||
| @@ -293,7 +301,11 @@ blockchainTests.resets('Coordinator integration tests', env => { | ||||
|                 expectedBalances.simulateFills(orders, taker.address, txReceipt, deployment, value); | ||||
|                 await balanceStore.updateBalancesAsync(); | ||||
|                 balanceStore.assertEquals(expectedBalances); | ||||
|                 verifyEvents(txReceipt, orders.map(order => expectedFillEvent(order)), ExchangeEvents.Fill); | ||||
|                 verifyEvents( | ||||
|                     txReceipt, | ||||
|                     orders.map(order => expectedFillEvent(order)), | ||||
|                     ExchangeEvents.Fill, | ||||
|                 ); | ||||
|             }); | ||||
|             it(`${fnName} should revert with an invalid approval signature`, async () => { | ||||
|                 const approvalSignature = hexUtils.concat( | ||||
| @@ -360,7 +372,11 @@ blockchainTests.resets('Coordinator integration tests', env => { | ||||
|                 .executeTransaction(transaction, maker.address, transaction.signature, []) | ||||
|                 .awaitTransactionSuccessAsync({ from: maker.address }); | ||||
|  | ||||
|             verifyEvents(txReceipt, orders.map(order => expectedCancelEvent(order)), ExchangeEvents.Cancel); | ||||
|             verifyEvents( | ||||
|                 txReceipt, | ||||
|                 orders.map(order => expectedCancelEvent(order)), | ||||
|                 ExchangeEvents.Cancel, | ||||
|             ); | ||||
|         }); | ||||
|         it('cancelOrdersUpTo call should be successful without an approval', async () => { | ||||
|             const data = exchangeDataEncoder.encodeOrdersToExchangeData(ExchangeFunctionName.CancelOrdersUpTo, []); | ||||
|   | ||||
| @@ -63,11 +63,9 @@ blockchainTests.fork('DevUtils dydx order validation tests', env => { | ||||
|     let dai: ERC20TokenContract; | ||||
|     let usdc: ERC20TokenContract; | ||||
|     let devUtils: DevUtilsContract; | ||||
|     let accountOwner: string; | ||||
|     let minMarginRatio: number; | ||||
|  | ||||
|     before(async () => { | ||||
|         [accountOwner] = await env.getAccountAddressesAsync(); | ||||
|         dydx = new IDydxContract(DYDX_ADDRESS, env.provider, env.txDefaults); | ||||
|         dai = new ERC20TokenContract(DAI_ADDRESS, env.provider, env.txDefaults); | ||||
|         usdc = new ERC20TokenContract(USDC_ADDRESS, env.provider, env.txDefaults); | ||||
|   | ||||
| @@ -186,13 +186,13 @@ blockchainTests.resets('LibAssetData', env => { | ||||
|         }); | ||||
|  | ||||
|         it('should decode multiasset data', async () => { | ||||
|             expect(await devUtils.decodeMultiAssetData(KNOWN_MULTI_ASSET_ENCODING.assetData).callAsync()).to.deep.equal( | ||||
|                 [ | ||||
|                     AssetProxyId.MultiAsset, | ||||
|                     KNOWN_MULTI_ASSET_ENCODING.amounts, | ||||
|                     KNOWN_MULTI_ASSET_ENCODING.nestedAssetData, | ||||
|                 ], | ||||
|             ); | ||||
|             expect( | ||||
|                 await devUtils.decodeMultiAssetData(KNOWN_MULTI_ASSET_ENCODING.assetData).callAsync(), | ||||
|             ).to.deep.equal([ | ||||
|                 AssetProxyId.MultiAsset, | ||||
|                 KNOWN_MULTI_ASSET_ENCODING.amounts, | ||||
|                 KNOWN_MULTI_ASSET_ENCODING.nestedAssetData, | ||||
|             ]); | ||||
|         }); | ||||
|  | ||||
|         it('should encode StaticCall data', async () => { | ||||
|   | ||||
| @@ -278,15 +278,21 @@ blockchainTests.resets('matchOrders integration tests', env => { | ||||
|                 ExchangeRevertErrors.BatchMatchOrdersErrorCodes.InvalidLengthRightSignatures, | ||||
|             ); | ||||
|             let tx = deployment.exchange | ||||
|                 .batchMatchOrders(leftOrders, rightOrders, leftOrders.map(order => order.signature), [ | ||||
|                     rightOrders[0].signature, | ||||
|                 ]) | ||||
|                 .batchMatchOrders( | ||||
|                     leftOrders, | ||||
|                     rightOrders, | ||||
|                     leftOrders.map(order => order.signature), | ||||
|                     [rightOrders[0].signature], | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: matcher.address }); | ||||
|             await expect(tx).to.revertWith(expectedError); | ||||
|             tx = deployment.exchange | ||||
|                 .batchMatchOrdersWithMaximalFill(leftOrders, rightOrders, leftOrders.map(order => order.signature), [ | ||||
|                     rightOrders[0].signature, | ||||
|                 ]) | ||||
|                 .batchMatchOrdersWithMaximalFill( | ||||
|                     leftOrders, | ||||
|                     rightOrders, | ||||
|                     leftOrders.map(order => order.signature), | ||||
|                     [rightOrders[0].signature], | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: matcher.address }); | ||||
|             return expect(tx).to.revertWith(expectedError); | ||||
|         }); | ||||
| @@ -475,7 +481,10 @@ blockchainTests.resets('matchOrders integration tests', env => { | ||||
|                 ], | ||||
|                 leftOrdersTakerAssetFilledAmounts: [constants.ZERO_AMOUNT, constants.ZERO_AMOUNT], | ||||
|                 rightOrdersTakerAssetFilledAmounts: [constants.ZERO_AMOUNT], | ||||
|                 matchIndices: [[0, 0], [1, 0]], | ||||
|                 matchIndices: [ | ||||
|                     [0, 0], | ||||
|                     [1, 0], | ||||
|                 ], | ||||
|                 shouldMaximallyFill: false, | ||||
|             }); | ||||
|         }); | ||||
| @@ -524,7 +533,10 @@ blockchainTests.resets('matchOrders integration tests', env => { | ||||
|                 ], | ||||
|                 leftOrdersTakerAssetFilledAmounts: [constants.ZERO_AMOUNT], | ||||
|                 rightOrdersTakerAssetFilledAmounts: [constants.ZERO_AMOUNT, constants.ZERO_AMOUNT], | ||||
|                 matchIndices: [[0, 0], [0, 1]], | ||||
|                 matchIndices: [ | ||||
|                     [0, 0], | ||||
|                     [0, 1], | ||||
|                 ], | ||||
|                 shouldMaximallyFill: false, | ||||
|             }); | ||||
|         }); | ||||
| @@ -626,7 +638,11 @@ blockchainTests.resets('matchOrders integration tests', env => { | ||||
|                 ], | ||||
|                 leftOrdersTakerAssetFilledAmounts: [constants.ZERO_AMOUNT, constants.ZERO_AMOUNT], | ||||
|                 rightOrdersTakerAssetFilledAmounts: [constants.ZERO_AMOUNT, constants.ZERO_AMOUNT], | ||||
|                 matchIndices: [[0, 0], [0, 1], [1, 1]], | ||||
|                 matchIndices: [ | ||||
|                     [0, 0], | ||||
|                     [0, 1], | ||||
|                     [1, 1], | ||||
|                 ], | ||||
|                 shouldMaximallyFill: false, | ||||
|             }); | ||||
|         }); | ||||
| @@ -801,7 +817,11 @@ blockchainTests.resets('matchOrders integration tests', env => { | ||||
|                 ], | ||||
|                 leftOrdersTakerAssetFilledAmounts: [constants.ZERO_AMOUNT, constants.ZERO_AMOUNT], | ||||
|                 rightOrdersTakerAssetFilledAmounts: [constants.ZERO_AMOUNT, constants.ZERO_AMOUNT], | ||||
|                 matchIndices: [[0, 0], [1, 0], [1, 1]], | ||||
|                 matchIndices: [ | ||||
|                     [0, 0], | ||||
|                     [1, 0], | ||||
|                     [1, 1], | ||||
|                 ], | ||||
|                 shouldMaximallyFill: true, | ||||
|             }); | ||||
|         }); | ||||
|   | ||||
| @@ -106,7 +106,12 @@ blockchainTests.fork.resets('Forwarder mainnet tests', env => { | ||||
|                 orders[1].takerAssetAmount.dividedToIntegerBy(2), | ||||
|             ); | ||||
|             const [wethSpentAmount, makerAssetAcquiredAmount] = await forwarder | ||||
|                 .marketSellOrdersWithEth(orders, orders.map(o => o.signature), [], []) | ||||
|                 .marketSellOrdersWithEth( | ||||
|                     orders, | ||||
|                     orders.map(o => o.signature), | ||||
|                     [], | ||||
|                     [], | ||||
|                 ) | ||||
|                 .callAsync({ | ||||
|                     from: takerAddress, | ||||
|                     value: ethSellAmount, | ||||
| @@ -161,7 +166,13 @@ blockchainTests.fork.resets('Forwarder mainnet tests', env => { | ||||
|                 orders[1].makerAssetAmount.dividedToIntegerBy(2), | ||||
|             ); | ||||
|             const [wethSpentAmount, makerAssetAcquiredAmount] = await forwarder | ||||
|                 .marketBuyOrdersWithEth(orders, makerAssetBuyAmount, orders.map(o => o.signature), [], []) | ||||
|                 .marketBuyOrdersWithEth( | ||||
|                     orders, | ||||
|                     makerAssetBuyAmount, | ||||
|                     orders.map(o => o.signature), | ||||
|                     [], | ||||
|                     [], | ||||
|                 ) | ||||
|                 .callAsync({ | ||||
|                     from: takerAddress, | ||||
|                     value: ethSellAmount, | ||||
|   | ||||
| @@ -190,9 +190,14 @@ export function MakerMixin<TBase extends Constructor>(Base: TBase): TBase & Cons | ||||
|                 rightTakerAssetData, | ||||
|                 makerFeeAssetData, | ||||
|                 takerFeeAssetData, | ||||
|             ] = [leftMakerToken, leftTakerToken, rightMakerToken, rightTakerToken, makerFeeToken, takerFeeToken].map( | ||||
|                 token => encodeERC20AssetData(token.address), | ||||
|             ); | ||||
|             ] = [ | ||||
|                 leftMakerToken, | ||||
|                 leftTakerToken, | ||||
|                 rightMakerToken, | ||||
|                 rightTakerToken, | ||||
|                 makerFeeToken, | ||||
|                 takerFeeToken, | ||||
|             ].map(token => encodeERC20AssetData(token.address)); | ||||
|  | ||||
|             // Construct and sign the left order | ||||
|             const leftOrder = await this.signOrderAsync({ | ||||
|   | ||||
| @@ -8,7 +8,10 @@ import { Actor, Constructor } from './base'; | ||||
|  * Useful for BalanceStore. | ||||
|  */ | ||||
| export function actorAddressesByName(actors: Actor[]): ObjectMap<string> { | ||||
|     return _.zipObject(actors.map(actor => actor.name), actors.map(actor => actor.address)); | ||||
|     return _.zipObject( | ||||
|         actors.map(actor => actor.name), | ||||
|         actors.map(actor => actor.address), | ||||
|     ); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -19,5 +22,5 @@ export function filterActorsByRole<TClass extends Constructor>( | ||||
|     actors: Actor[], | ||||
|     role: TClass, | ||||
| ): Array<InstanceType<typeof role>> { | ||||
|     return actors.filter(actor => actor.mixins.includes(role.name)) as InstanceType<typeof role>; | ||||
|     return actors.filter(actor => actor.mixins.includes(role.name)) as Array<InstanceType<typeof role>>; | ||||
| } | ||||
|   | ||||
| @@ -77,19 +77,24 @@ tests('Exchange signature validation fuzz tests', env => { | ||||
|     before(async () => { | ||||
|         chainId = await env.web3Wrapper.getChainIdAsync(); | ||||
|         accounts = await env.getAccountAddressesAsync(); | ||||
|         privateKeys = _.zipObject(accounts, accounts.map((a, i) => constants.TESTRPC_PRIVATE_KEYS[i])); | ||||
|         privateKeys = _.zipObject( | ||||
|             accounts, | ||||
|             accounts.map((a, i) => constants.TESTRPC_PRIVATE_KEYS[i]), | ||||
|         ); | ||||
|         deployment = await DeploymentManager.deployAsync(env, { | ||||
|             numErc20TokensToDeploy: 0, | ||||
|             numErc721TokensToDeploy: 0, | ||||
|             numErc1155TokensToDeploy: 0, | ||||
|         }); | ||||
|         exchange = deployment.exchange; | ||||
|         walletContractAddress = (await TestSignatureValidationWalletContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.TestSignatureValidationWallet, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             {}, | ||||
|         )).address; | ||||
|         walletContractAddress = ( | ||||
|             await TestSignatureValidationWalletContract.deployFrom0xArtifactAsync( | ||||
|                 artifacts.TestSignatureValidationWallet, | ||||
|                 env.provider, | ||||
|                 env.txDefaults, | ||||
|                 {}, | ||||
|             ) | ||||
|         ).address; | ||||
|         // This just has to be a contract address that doesn't implement the | ||||
|         // wallet spec. | ||||
|         notWalletContractAddress = exchange.address; | ||||
| @@ -715,7 +720,7 @@ tests('Exchange signature validation fuzz tests', env => { | ||||
|             invalidTestTransactionMangledSignature(), | ||||
|         ]; | ||||
|         const simulationEnvironment = new SimulationEnvironment(deployment, new BlockchainBalanceStore({}, {}), []); | ||||
|         const simulation = new class extends Simulation { | ||||
|         const simulation = new (class extends Simulation { | ||||
|             // tslint:disable-next-line: prefer-function-over-method | ||||
|             protected async *_assertionGenerator(): AsyncIterableIterator<AssertionResult | void> { | ||||
|                 while (true) { | ||||
| @@ -723,7 +728,7 @@ tests('Exchange signature validation fuzz tests', env => { | ||||
|                     yield (await action!.next()).value; | ||||
|                 } | ||||
|             } | ||||
|         }(simulationEnvironment); | ||||
|         })(simulationEnvironment); | ||||
|         simulation.resets = true; | ||||
|         return simulation.fuzzAsync(); | ||||
|     }); | ||||
|   | ||||
| @@ -1,4 +1,94 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "4.1.35", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "4.1.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "4.1.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "4.1.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "4.1.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "4.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "4.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "4.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "4.1.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "4.1.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "4.1.25", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.1.35 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.34 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.33 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.32 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.31 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.30 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.29 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.28 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.27 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.26 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.25 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-multisig", | ||||
|     "version": "4.1.25", | ||||
|     "version": "4.1.35", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -49,18 +49,18 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/multisig", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.6", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -75,12 +75,12 @@ | ||||
|         "shx": "^0.2.2", | ||||
|         "solhint": "^1.4.1", | ||||
|         "tslint": "5.11.0", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,95 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "2.0.42", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "2.0.41", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "2.0.40", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "2.0.39", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "2.0.38", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "2.0.37", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Patch epoch finalization issue", | ||||
|                 "pr": 221 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1620214333 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "2.0.36", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "2.0.35", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "2.0.34", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "2.0.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "2.0.32", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v2.0.42 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.41 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.40 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.39 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.38 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.37 - _May 5, 2021_ | ||||
|  | ||||
|     * Patch epoch finalization issue (#221) | ||||
|  | ||||
| ## v2.0.36 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.35 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.34 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.33 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.32 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
							
								
								
									
										55
									
								
								contracts/staking/contracts/src/StakingPatch.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								contracts/staking/contracts/src/StakingPatch.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| /* | ||||
|  | ||||
|   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 "./interfaces/IStaking.sol"; | ||||
| import "./sys/MixinParams.sol"; | ||||
| import "./stake/MixinStake.sol"; | ||||
| import "./fees/MixinExchangeFees.sol"; | ||||
|  | ||||
|  | ||||
| contract StakingPatch is | ||||
|     IStaking, | ||||
|     MixinParams, | ||||
|     MixinStake, | ||||
|     MixinExchangeFees | ||||
| { | ||||
|     /// @dev Initialize storage owned by this contract. | ||||
|     ///      This function should not be called directly. | ||||
|     ///      The StakingProxy contract will call it in `attachStakingContract()`. | ||||
|     function init() | ||||
|         public | ||||
|         onlyAuthorized | ||||
|     { | ||||
|         uint256 currentEpoch_ = currentEpoch; | ||||
|         uint256 prevEpoch = currentEpoch_.safeSub(1); | ||||
|  | ||||
|         // Patch corrupted state | ||||
|         aggregatedStatsByEpoch[prevEpoch].numPoolsToFinalize = 0; | ||||
|         this.endEpoch(); | ||||
|  | ||||
|         uint256 lastPoolId_ = 57; | ||||
|         for (uint256 i = 1; i <= lastPoolId_; i++) { | ||||
|             this.finalizePool(bytes32(i)); | ||||
|         } | ||||
|         // Ensure that current epoch's state is not corrupted | ||||
|         aggregatedStatsByEpoch[currentEpoch_].numPoolsToFinalize = 0; | ||||
|     } | ||||
| } | ||||
| @@ -53,6 +53,10 @@ contract MixinExchangeFees is | ||||
|     { | ||||
|         _assertValidProtocolFee(protocolFee); | ||||
|  | ||||
|         if (protocolFee == 0) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // Transfer the protocol fee to this address if it should be paid in | ||||
|         // WETH. | ||||
|         if (msg.value == 0) { | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-staking", | ||||
|     "version": "2.0.32", | ||||
|     "version": "2.0.42", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -41,7 +41,7 @@ | ||||
|     "config": { | ||||
|         "publicInterfaceContracts": "IStaking,IStakingEvents,IStakingProxy,IZrxVault,LibStakingRichErrors,Staking,StakingProxy,ZrxVault,TestStaking", | ||||
|         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", | ||||
|         "abis": "./test/generated-artifacts/@(IStaking|IStakingEvents|IStakingProxy|IStorage|IStorageInit|IStructs|IZrxVault|LibCobbDouglas|LibFixedMath|LibFixedMathRichErrors|LibSafeDowncast|LibStakingRichErrors|MixinAbstract|MixinConstants|MixinCumulativeRewards|MixinDeploymentConstants|MixinExchangeFees|MixinExchangeManager|MixinFinalizer|MixinParams|MixinScheduler|MixinStake|MixinStakeBalances|MixinStakeStorage|MixinStakingPool|MixinStakingPoolRewards|MixinStorage|Staking|StakingProxy|TestAssertStorageParams|TestCobbDouglas|TestCumulativeRewardTracking|TestDelegatorRewards|TestExchangeManager|TestFinalizer|TestInitTarget|TestLibFixedMath|TestLibSafeDowncast|TestMixinCumulativeRewards|TestMixinParams|TestMixinScheduler|TestMixinStake|TestMixinStakeBalances|TestMixinStakeStorage|TestMixinStakingPool|TestMixinStakingPoolRewards|TestProtocolFees|TestProxyDestination|TestStaking|TestStakingNoWETH|TestStakingProxy|TestStakingProxyUnit|TestStorageLayoutAndConstants|ZrxVault).json" | ||||
|         "abis": "./test/generated-artifacts/@(IStaking|IStakingEvents|IStakingProxy|IStorage|IStorageInit|IStructs|IZrxVault|LibCobbDouglas|LibFixedMath|LibFixedMathRichErrors|LibSafeDowncast|LibStakingRichErrors|MixinAbstract|MixinConstants|MixinCumulativeRewards|MixinDeploymentConstants|MixinExchangeFees|MixinExchangeManager|MixinFinalizer|MixinParams|MixinScheduler|MixinStake|MixinStakeBalances|MixinStakeStorage|MixinStakingPool|MixinStakingPoolRewards|MixinStorage|Staking|StakingPatch|StakingProxy|TestAssertStorageParams|TestCobbDouglas|TestCumulativeRewardTracking|TestDelegatorRewards|TestExchangeManager|TestFinalizer|TestInitTarget|TestLibFixedMath|TestLibSafeDowncast|TestMixinCumulativeRewards|TestMixinParams|TestMixinScheduler|TestMixinStake|TestMixinStakeBalances|TestMixinStakeStorage|TestMixinStakingPool|TestMixinStakingPoolRewards|TestProtocolFees|TestProxyDestination|TestStaking|TestStakingNoWETH|TestStakingProxy|TestStakingProxyUnit|TestStorageLayoutAndConstants|ZrxVault).json" | ||||
|     }, | ||||
|     "repository": { | ||||
|         "type": "git", | ||||
| @@ -53,20 +53,20 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.19", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.6", | ||||
|         "@0x/contracts-dev-utils": "^1.3.23", | ||||
|         "@0x/contracts-erc20": "^3.3.3", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.24", | ||||
|         "@0x/contracts-gen": "^2.0.30", | ||||
|         "@0x/contracts-utils": "^4.7.3", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-dev-utils": "^1.3.33", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.34", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-utils": "^4.7.13", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/node": "12.12.54", | ||||
|         "chai": "^4.0.1", | ||||
| @@ -84,15 +84,15 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.21", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^5.1.1" | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import { DecodedLogArgs, LogWithDecodedArgs } from 'ethereum-types'; | ||||
|  | ||||
| import { constants as stakingConstants } from './constants'; | ||||
|  | ||||
| export { Numberish } from '@0x/contracts-test-utils'; | ||||
| // tslint:disable:max-classes-per-file | ||||
|  | ||||
| export interface StakingParams { | ||||
| @@ -259,5 +260,3 @@ export class AggregatedStats { | ||||
| export interface AggregatedStatsByEpoch { | ||||
|     [epoch: string]: AggregatedStats; | ||||
| } | ||||
|  | ||||
| export type Numberish = Numberish; | ||||
|   | ||||
| @@ -157,11 +157,11 @@ export class FinalizerActor extends BaseActor { | ||||
|             const delegators = delegatorsByPoolId[poolId]; | ||||
|             delegatorBalancesByPoolId[poolId] = {}; | ||||
|             for (const delegator of delegators) { | ||||
|                 delegatorBalancesByPoolId[poolId][ | ||||
|                     delegator | ||||
|                 ] = (await this._stakingApiWrapper.stakingContract | ||||
|                     .getStakeDelegatedToPoolByOwner(delegator, poolId) | ||||
|                     .callAsync()).currentEpochBalance; | ||||
|                 delegatorBalancesByPoolId[poolId][delegator] = ( | ||||
|                     await this._stakingApiWrapper.stakingContract | ||||
|                         .getStakeDelegatedToPoolByOwner(delegator, poolId) | ||||
|                         .callAsync() | ||||
|                 ).currentEpochBalance; | ||||
|             } | ||||
|         } | ||||
|         return delegatorBalancesByPoolId; | ||||
| @@ -253,7 +253,10 @@ export class FinalizerActor extends BaseActor { | ||||
|         const totalFeesCollected = BigNumber.sum(...activePools.map(p => p.feesCollected)); | ||||
|         const totalWeightedStake = BigNumber.sum(...activePools.map(p => p.weightedStake)); | ||||
|         if (totalRewards.eq(0) || totalFeesCollected.eq(0) || totalWeightedStake.eq(0)) { | ||||
|             return _.zipObject(poolIds, _.times(poolIds.length, () => new BigNumber(0))); | ||||
|             return _.zipObject( | ||||
|                 poolIds, | ||||
|                 _.times(poolIds.length, () => new BigNumber(0)), | ||||
|             ); | ||||
|         } | ||||
|         const rewards = await Promise.all( | ||||
|             activePools.map(async pool => | ||||
|   | ||||
| @@ -33,6 +33,7 @@ import * as MixinStakingPool from '../test/generated-artifacts/MixinStakingPool. | ||||
| import * as MixinStakingPoolRewards from '../test/generated-artifacts/MixinStakingPoolRewards.json'; | ||||
| import * as MixinStorage from '../test/generated-artifacts/MixinStorage.json'; | ||||
| import * as Staking from '../test/generated-artifacts/Staking.json'; | ||||
| import * as StakingPatch from '../test/generated-artifacts/StakingPatch.json'; | ||||
| import * as StakingProxy from '../test/generated-artifacts/StakingProxy.json'; | ||||
| import * as TestAssertStorageParams from '../test/generated-artifacts/TestAssertStorageParams.json'; | ||||
| import * as TestCobbDouglas from '../test/generated-artifacts/TestCobbDouglas.json'; | ||||
| @@ -61,6 +62,7 @@ import * as TestStorageLayoutAndConstants from '../test/generated-artifacts/Test | ||||
| import * as ZrxVault from '../test/generated-artifacts/ZrxVault.json'; | ||||
| export const artifacts = { | ||||
|     Staking: Staking as ContractArtifact, | ||||
|     StakingPatch: StakingPatch as ContractArtifact, | ||||
|     StakingProxy: StakingProxy as ContractArtifact, | ||||
|     ZrxVault: ZrxVault as ContractArtifact, | ||||
|     MixinExchangeFees: MixinExchangeFees as ContractArtifact, | ||||
|   | ||||
| @@ -102,13 +102,15 @@ blockchainTests('Migration tests', env => { | ||||
|             }); | ||||
|  | ||||
|             it('should set the correct initial params', async () => { | ||||
|                 const stakingProxyContractAddress = (await StakingProxyContract.deployFrom0xArtifactAsync( | ||||
|                     artifacts.StakingProxy, | ||||
|                     env.provider, | ||||
|                     env.txDefaults, | ||||
|                     artifacts, | ||||
|                     stakingContract.address, | ||||
|                 )).address; | ||||
|                 const stakingProxyContractAddress = ( | ||||
|                     await StakingProxyContract.deployFrom0xArtifactAsync( | ||||
|                         artifacts.StakingProxy, | ||||
|                         env.provider, | ||||
|                         env.txDefaults, | ||||
|                         artifacts, | ||||
|                         stakingContract.address, | ||||
|                     ) | ||||
|                 ).address; | ||||
|  | ||||
|                 const stakingProxyContract = new StakingContract( | ||||
|                     stakingProxyContractAddress, | ||||
|   | ||||
							
								
								
									
										66
									
								
								contracts/staking/test/patch_mainnet_test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								contracts/staking/test/patch_mainnet_test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| import { blockchainTests, constants, expect, filterLogsToArguments } from '@0x/contracts-test-utils'; | ||||
| import { BigNumber, logUtils } from '@0x/utils'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
| import { StakingEvents, StakingPatchContract, StakingProxyContract, StakingProxyEvents } from './wrappers'; | ||||
|  | ||||
| const abis = _.mapValues(artifacts, v => v.compilerOutput.abi); | ||||
| const STAKING_PROXY = '0xa26e80e7dea86279c6d778d702cc413e6cffa777'; | ||||
| const STAKING_OWNER = '0x7d3455421bbc5ed534a83c88fd80387dc8271392'; | ||||
| const EXCHANGE_PROXY = '0xdef1c0ded9bec7f1a1670819833240f027b25eff'; | ||||
| blockchainTests.configure({ | ||||
|     fork: { | ||||
|         unlockedAccounts: [STAKING_OWNER, EXCHANGE_PROXY], | ||||
|     }, | ||||
| }); | ||||
|  | ||||
| blockchainTests.fork('Staking patch mainnet fork tests', env => { | ||||
|     let stakingProxyContract: StakingProxyContract; | ||||
|     let patchedStakingPatchContract: StakingPatchContract; | ||||
|  | ||||
|     before(async () => { | ||||
|         stakingProxyContract = new StakingProxyContract(STAKING_PROXY, env.provider, undefined, abis); | ||||
|         patchedStakingPatchContract = await StakingPatchContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.Staking, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             artifacts, | ||||
|         ); | ||||
|     }); | ||||
|  | ||||
|     it('Staking proxy successfully attaches to patched logic', async () => { | ||||
|         const tx = await stakingProxyContract | ||||
|             .attachStakingContract(patchedStakingPatchContract.address) | ||||
|             .awaitTransactionSuccessAsync({ from: STAKING_OWNER, gasPrice: 0 }, { shouldValidate: false }); | ||||
|         expect(filterLogsToArguments(tx.logs, StakingProxyEvents.StakingContractAttachedToProxy)).to.deep.equal([ | ||||
|             { | ||||
|                 newStakingPatchContractAddress: patchedStakingPatchContract.address, | ||||
|             }, | ||||
|         ]); | ||||
|         expect(filterLogsToArguments(tx.logs, StakingEvents.EpochEnded).length).to.equal(1); | ||||
|         expect(filterLogsToArguments(tx.logs, StakingEvents.EpochFinalized).length).to.equal(1); | ||||
|         logUtils.log(`${tx.gasUsed} gas used`); | ||||
|     }); | ||||
|  | ||||
|     it('Patched staking handles 0 gas protocol fees', async () => { | ||||
|         const staking = new StakingPatchContract(STAKING_PROXY, env.provider, undefined, abis); | ||||
|         const maker = '0x7b1886e49ab5433bb46f7258548092dc8cdca28b'; | ||||
|         const zeroFeeTx = await staking | ||||
|             .payProtocolFee(maker, constants.NULL_ADDRESS, constants.ZERO_AMOUNT) | ||||
|             .awaitTransactionSuccessAsync({ from: EXCHANGE_PROXY, gasPrice: 0 }, { shouldValidate: false }); | ||||
|         // StakingPoolEarnedRewardsInEpoch should _not_ be emitted for a zero protocol fee. | ||||
|         // tslint:disable-next-line:no-unused-expression | ||||
|         expect(filterLogsToArguments(zeroFeeTx.logs, StakingEvents.StakingPoolEarnedRewardsInEpoch)).to.be.empty; | ||||
|  | ||||
|         // Coincidentally there's some ETH in the ExchangeProxy | ||||
|         const nonZeroFeeTx = await staking | ||||
|             .payProtocolFee(maker, constants.NULL_ADDRESS, new BigNumber(1)) | ||||
|             .awaitTransactionSuccessAsync({ from: EXCHANGE_PROXY, gasPrice: 0, value: 1 }, { shouldValidate: false }); | ||||
|         // StakingPoolEarnedRewardsInEpoch _should_ be emitted for a non-zero protocol fee. | ||||
|         expect( | ||||
|             filterLogsToArguments(nonZeroFeeTx.logs, StakingEvents.StakingPoolEarnedRewardsInEpoch), | ||||
|         ).to.have.lengthOf(1); | ||||
|     }); | ||||
| }); | ||||
| // tslint:enable:no-unnecessary-type-assertion | ||||
| @@ -12,7 +12,6 @@ import { | ||||
|  | ||||
| blockchainTests.resets('Exchange Unit Tests', env => { | ||||
|     // Addresses | ||||
|     let nonOwner: string; | ||||
|     let owner: string; | ||||
|     let nonExchange: string; | ||||
|     let exchange: string; | ||||
| @@ -24,7 +23,7 @@ blockchainTests.resets('Exchange Unit Tests', env => { | ||||
|  | ||||
|     before(async () => { | ||||
|         // Set up addresses for testing. | ||||
|         [nonOwner, owner, nonExchange, exchange, nonAuthority, authority] = await env.getAccountAddressesAsync(); | ||||
|         [, owner, nonExchange, exchange, nonAuthority, authority] = await env.getAccountAddressesAsync(); | ||||
|  | ||||
|         // Deploy the Exchange Manager contract. | ||||
|         exchangeManager = await TestExchangeManagerContract.deployFrom0xArtifactAsync( | ||||
|   | ||||
| @@ -543,7 +543,7 @@ blockchainTests.resets('Finalizer unit tests', env => { | ||||
|             const expectedPoolRewards = await calculatePoolRewardsAsync(INITIAL_BALANCE, pools); | ||||
|             const [pool, reward] = _.sampleSize(shortZip(pools, expectedPoolRewards), 1)[0]; | ||||
|             return assertUnfinalizedPoolRewardsAsync(pool.poolId, { | ||||
|                 totalReward: (reward as any) as BigNumber, | ||||
|                 totalReward: reward, | ||||
|                 membersStake: pool.membersStake, | ||||
|             }); | ||||
|         }); | ||||
|   | ||||
| @@ -12,17 +12,13 @@ import * as _ from 'lodash'; | ||||
| import { artifacts } from '../artifacts'; | ||||
| import { TestCobbDouglasContract } from '../wrappers'; | ||||
|  | ||||
| // tslint:disable: no-unnecessary-type-assertion | ||||
| blockchainTests('LibCobbDouglas unit tests', env => { | ||||
|     const FUZZ_COUNT = 1024; | ||||
|     const PRECISION = 15; | ||||
|  | ||||
|     let testContract: TestCobbDouglasContract; | ||||
|     let ownerAddress: string; | ||||
|     let notOwnerAddress: string; | ||||
|  | ||||
|     before(async () => { | ||||
|         [ownerAddress, notOwnerAddress] = await env.getAccountAddressesAsync(); | ||||
|         testContract = await TestCobbDouglasContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.TestCobbDouglas, | ||||
|             env.provider, | ||||
| @@ -211,4 +207,3 @@ blockchainTests('LibCobbDouglas unit tests', env => { | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
| // tslint:enable:no-unnecessary-type-assertion | ||||
|   | ||||
| @@ -31,6 +31,7 @@ export * from '../test/generated-wrappers/mixin_staking_pool'; | ||||
| export * from '../test/generated-wrappers/mixin_staking_pool_rewards'; | ||||
| export * from '../test/generated-wrappers/mixin_storage'; | ||||
| export * from '../test/generated-wrappers/staking'; | ||||
| export * from '../test/generated-wrappers/staking_patch'; | ||||
| export * from '../test/generated-wrappers/staking_proxy'; | ||||
| export * from '../test/generated-wrappers/test_assert_storage_params'; | ||||
| export * from '../test/generated-wrappers/test_cobb_douglas'; | ||||
|   | ||||
| @@ -40,6 +40,7 @@ | ||||
|         "test/generated-artifacts/MixinStakingPoolRewards.json", | ||||
|         "test/generated-artifacts/MixinStorage.json", | ||||
|         "test/generated-artifacts/Staking.json", | ||||
|         "test/generated-artifacts/StakingPatch.json", | ||||
|         "test/generated-artifacts/StakingProxy.json", | ||||
|         "test/generated-artifacts/TestAssertStorageParams.json", | ||||
|         "test/generated-artifacts/TestCobbDouglas.json", | ||||
|   | ||||
| @@ -1,4 +1,95 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "5.4.5", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "5.4.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "5.4.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "5.4.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "5.4.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "5.4.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Set default ganache gas limit to 100e6", | ||||
|                 "pr": 197 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1620214333 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "5.3.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "5.3.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "5.3.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "5.3.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "5.3.21", | ||||
|   | ||||
| @@ -5,6 +5,46 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v5.4.5 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.4 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.3 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.2 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.1 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.0 - _May 5, 2021_ | ||||
|  | ||||
|     * Set default ganache gas limit to 100e6 (#197) | ||||
|  | ||||
| ## v5.3.25 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.24 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.23 - _March 17, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.22 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.21 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-test-utils", | ||||
|     "version": "5.3.21", | ||||
|     "version": "5.4.5", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -34,28 +34,28 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/sol-compiler": "^4.5.2", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "shx": "^0.2.2", | ||||
|         "tslint": "5.11.0", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.21", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contract-addresses": "^5.10.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/json-schemas": "^5.4.1", | ||||
|         "@0x/order-utils": "^10.4.16", | ||||
|         "@0x/sol-coverage": "^4.0.29", | ||||
|         "@0x/sol-profiler": "^4.1.19", | ||||
|         "@0x/sol-trace": "^3.0.29", | ||||
|         "@0x/subproviders": "^6.4.1", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@0x/assert": "^3.0.27", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contract-addresses": "^6.4.0", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/json-schemas": "^6.1.3", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/sol-coverage": "^4.0.37", | ||||
|         "@0x/sol-profiler": "^4.1.27", | ||||
|         "@0x/sol-trace": "^3.0.37", | ||||
|         "@0x/subproviders": "^6.5.3", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/bn.js": "^4.11.0", | ||||
|         "@types/js-combinatorics": "^0.5.29", | ||||
|         "@types/lodash": "4.14.104", | ||||
| @@ -67,8 +67,8 @@ | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "decimal.js": "^10.2.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "ethers": "~4.0.4", | ||||
|         "js-combinatorics": "^0.5.3", | ||||
|         "lodash": "^4.17.11", | ||||
|   | ||||
| @@ -77,7 +77,7 @@ export const constants = { | ||||
|     ZERO_AMOUNT: new BigNumber(0), | ||||
|     PERCENTAGE_DENOMINATOR: new BigNumber(10).pow(18), | ||||
|     TIME_BUFFER: new BigNumber(1000), | ||||
|     KECCAK256_NULL: ethUtil.addHexPrefix(ethUtil.bufferToHex(ethUtil.SHA3_NULL)), | ||||
|     KECCAK256_NULL: ethUtil.bufferToHex(ethUtil.keccak256(Buffer.alloc(0))), | ||||
|     MAX_UINT256_ROOT: new BigNumber('340282366920938463463374607431768211456'), | ||||
|     ONE_ETHER: new BigNumber(1e18), | ||||
|     EIP712_DOMAIN_NAME: '0x Protocol', | ||||
|   | ||||
| @@ -14,6 +14,6 @@ export function shortZip<T1, T2>(a: T1[], b: T2[]): Array<[T1, T2]> { | ||||
| export function replaceKeysDeep(obj: {}, mapKeys: (key: string) => string | void): _.Dictionary<{}> { | ||||
|     return _.transform(obj, (result, value, key) => { | ||||
|         const currentKey = mapKeys(key) || key; | ||||
|         result[currentKey] = _.isObject(value) ? replaceKeysDeep(value, mapKeys) : value; | ||||
|         result[currentKey] = _.isObject(value) ? replaceKeysDeep(value as {}, mapKeys) : (value as {}); | ||||
|     }); | ||||
| } | ||||
|   | ||||
| @@ -22,14 +22,14 @@ export class OrderFactory { | ||||
|     ): Promise<SignedOrder> { | ||||
|         const fifteenMinutesInSeconds = 15 * 60; | ||||
|         const currentBlockTimestamp = await getLatestBlockTimestampAsync(); | ||||
|         const order = ({ | ||||
|         const order = { | ||||
|             takerAddress: constants.NULL_ADDRESS, | ||||
|             senderAddress: constants.NULL_ADDRESS, | ||||
|             expirationTimeSeconds: new BigNumber(currentBlockTimestamp).plus(fifteenMinutesInSeconds), | ||||
|             salt: generatePseudoRandomSalt(), | ||||
|             ...this._defaultOrderParams, | ||||
|             ...customOrderParams, | ||||
|         } as any) as Order; | ||||
|         } as Order; // tslint:disable-line:no-object-literal-type-assertion | ||||
|         const orderHashBuff = orderHashUtils.getOrderHashBuffer(order); | ||||
|         const signature = signingUtils.signMessage(orderHashBuff, this._privateKey, signatureType); | ||||
|         const signedOrder = { | ||||
|   | ||||
| @@ -30,7 +30,8 @@ export const orderUtils = { | ||||
|         return cancel; | ||||
|     }, | ||||
|     createOrderWithoutSignature(signedOrder: SignedOrder): Order { | ||||
|         return _.omit(signedOrder, ['signature']) as Order; | ||||
|         const { signature, ...order } = signedOrder; | ||||
|         return order; | ||||
|     }, | ||||
|     createBatchMatchOrders(signedOrdersLeft: SignedOrder[], signedOrdersRight: SignedOrder[]): BatchMatchOrder { | ||||
|         return { | ||||
|   | ||||
| @@ -108,9 +108,7 @@ export async function testWithReferenceFuncAsync( | ||||
|                     return expect.fail( | ||||
|                         actualError, | ||||
|                         expectedError, | ||||
|                         `${testCaseString}: expected error message '${actualError.message}' to equal '${ | ||||
|                             expectedError.message | ||||
|                         }'`, | ||||
|                         `${testCaseString}: expected error message '${actualError.message}' to equal '${expectedError.message}'`, | ||||
|                     ); | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -20,6 +20,7 @@ export let providerConfigs: Web3Config = { | ||||
|     shouldUseInProcessGanache: true, | ||||
|     shouldAllowUnlimitedContractSize: true, | ||||
|     hardfork: 'istanbul', | ||||
|     gasLimit: 100e6, | ||||
|     unlocked_accounts: [ | ||||
|         '0x6cc5f688a315f3dc28a7781717a9a798a59fda7b', | ||||
|         '0x55dc8f21d20d4c6ed3c82916a438a413ca68e335', | ||||
|   | ||||
| @@ -57,9 +57,7 @@ describe('Order hashing', () => { | ||||
|                 ...order, | ||||
|                 takerAddress: (null as any) as string, | ||||
|             }; | ||||
|             const expectedErrorMessage = `Order taker must be of type string. If you want anyone to be able to fill an order - pass ${ | ||||
|                 constants.NULL_ADDRESS | ||||
|             }`; | ||||
|             const expectedErrorMessage = `Expected order to conform to schema`; | ||||
|             expect(() => orderHashUtils.getOrderHashHex(orderWithInvalidtakerFormat)).to.throw(expectedErrorMessage); | ||||
|         }); | ||||
|     }); | ||||
|   | ||||
| @@ -1,4 +1,133 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "1.2.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "1.2.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "1.2.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "1.2.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Added proposal 0 params and test", | ||||
|                 "pr": 252 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1622154125 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "1.1.8", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "1.1.7", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "1.1.6", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "1.1.5", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Patched votingPower logic", | ||||
|                 "pr": 214 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1619825976 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "1.1.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619481586, | ||||
|         "version": "1.1.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1618259868, | ||||
|         "version": "1.1.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "1.1.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "1.1.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Make the proposal/quorum thresholds updatable", | ||||
|                 "pr": 165 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1616005394 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "1.0.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "1.0.1", | ||||
|   | ||||
| @@ -5,6 +5,62 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.2.3 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.2.2 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.2.1 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.2.0 - _May 27, 2021_ | ||||
|  | ||||
|     * Added proposal 0 params and test (#252) | ||||
|  | ||||
| ## v1.1.8 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.7 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.6 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.5 - _April 30, 2021_ | ||||
|  | ||||
|     * Patched votingPower logic (#214) | ||||
|  | ||||
| ## v1.1.4 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.3 - _April 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.2 - _April 12, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.1 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.0 - _March 17, 2021_ | ||||
|  | ||||
|     * Make the proposal/quorum thresholds updatable (#165) | ||||
|  | ||||
| ## v1.0.2 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.0.1 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -30,6 +30,7 @@ interface IZrxTreasury { | ||||
|         uint256 votingPeriod; | ||||
|         uint256 proposalThreshold; | ||||
|         uint256 quorumThreshold; | ||||
|         bytes32 defaultPoolId; | ||||
|     } | ||||
|  | ||||
|     struct ProposedAction { | ||||
| @@ -96,6 +97,18 @@ interface IZrxTreasury { | ||||
|         view | ||||
|         returns (uint256); | ||||
|  | ||||
|     /// @dev Updates the proposal and quorum thresholds to the given | ||||
|     ///      values. Note that this function is only callable by the | ||||
|     ///      treasury contract itself, so the threshold can only be | ||||
|     ///      updated via a successful treasury proposal. | ||||
|     /// @param newProposalThreshold The new value for the proposal threshold. | ||||
|     /// @param newQuorumThreshold The new value for the quorum threshold. | ||||
|     function updateThresholds( | ||||
|         uint256 newProposalThreshold, | ||||
|         uint256 newQuorumThreshold | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @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` | ||||
|   | ||||
| @@ -20,8 +20,6 @@ | ||||
| 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"; | ||||
| @@ -32,7 +30,6 @@ import "./IZrxTreasury.sol"; | ||||
| contract ZrxTreasury is | ||||
|     IZrxTreasury | ||||
| { | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|     using LibSafeMathV06 for uint256; | ||||
|     using LibRichErrorsV06 for bytes; | ||||
|     using LibBytesV06 for bytes; | ||||
| @@ -42,8 +39,8 @@ contract ZrxTreasury is | ||||
|     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; | ||||
|     uint256 public override proposalThreshold; | ||||
|     uint256 public override quorumThreshold; | ||||
|  | ||||
|     // Storage | ||||
|     Proposal[] public proposals; | ||||
| @@ -52,11 +49,9 @@ contract ZrxTreasury is | ||||
|     /// @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 | ||||
| @@ -66,15 +61,12 @@ contract ZrxTreasury is | ||||
|             "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; | ||||
|         defaultPoolId = params.defaultPoolId; | ||||
|         IStaking.Pool memory defaultPool = stakingProxy_.getStakingPool(params.defaultPoolId); | ||||
|         defaultPoolOperator = DefaultPoolOperator(defaultPool.operator); | ||||
|     } | ||||
|  | ||||
|     // solhint-disable | ||||
| @@ -82,6 +74,24 @@ contract ZrxTreasury is | ||||
|     receive() external payable {} | ||||
|     // solhint-enable | ||||
|  | ||||
|     /// @dev Updates the proposal and quorum thresholds to the given | ||||
|     ///      values. Note that this function is only callable by the | ||||
|     ///      treasury contract itself, so the threshold can only be | ||||
|     ///      updated via a successful treasury proposal. | ||||
|     /// @param newProposalThreshold The new value for the proposal threshold. | ||||
|     /// @param newQuorumThreshold The new value for the quorum threshold. | ||||
|     function updateThresholds( | ||||
|         uint256 newProposalThreshold, | ||||
|         uint256 newQuorumThreshold | ||||
|     ) | ||||
|         external | ||||
|         override | ||||
|     { | ||||
|         require(msg.sender == address(this), "updateThresholds/ONLY_SELF"); | ||||
|         proposalThreshold = newProposalThreshold; | ||||
|         quorumThreshold = newQuorumThreshold; | ||||
|     } | ||||
|  | ||||
|     /// @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` | ||||
| @@ -268,6 +278,12 @@ contract ZrxTreasury is | ||||
|  | ||||
|         // Add voting power for operated staking pools. | ||||
|         for (uint256 i = 0; i != operatedPoolIds.length; i++) { | ||||
|             for (uint256 j = 0; j != i; j++) { | ||||
|                 require( | ||||
|                     operatedPoolIds[i] != operatedPoolIds[j], | ||||
|                     "getVotingPower/DUPLICATE_POOL_ID" | ||||
|                 ); | ||||
|             } | ||||
|             IStaking.Pool memory pool = stakingProxy.getStakingPool(operatedPoolIds[i]); | ||||
|             require( | ||||
|                 pool.operator == account, | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-treasury", | ||||
|     "version": "1.0.1", | ||||
|     "version": "1.2.3", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -46,16 +46,16 @@ | ||||
|     }, | ||||
|     "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/abi-gen": "^5.6.0", | ||||
|         "@0x/contract-addresses": "^6.4.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.16", | ||||
|         "@0x/contracts-erc20": "^3.3.13", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-staking": "^2.0.42", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@types/isomorphic-fetch": "^0.0.35", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -69,18 +69,18 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "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" | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/protocol-utils": "^1.7.2", | ||||
|         "@0x/subproviders": "^6.5.3", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
							
								
								
									
										35
									
								
								contracts/treasury/src/proposals.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								contracts/treasury/src/proposals.ts
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										154
									
								
								contracts/treasury/test/proposal_test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								contracts/treasury/test/proposal_test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,154 @@ | ||||
| import { artifacts as erc20Artifacts, ERC20TokenEvents } from '@0x/contracts-erc20'; | ||||
| import { StakingContract, StakingProxyContract } from '@0x/contracts-staking'; | ||||
| import { blockchainTests, constants, verifyEventsFromLogs } from '@0x/contracts-test-utils'; | ||||
| import { BigNumber, hexUtils, logUtils } from '@0x/utils'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { proposals } from '../src/proposals'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
| import { ZrxTreasuryContract, ZrxTreasuryEvents } from './wrappers'; | ||||
|  | ||||
| const SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/mzhu25/zeroex-staking'; | ||||
| const STAKING_PROXY_ADDRESS = '0xa26e80e7dea86279c6d778d702cc413e6cffa777'; | ||||
| const TREASURY_ADDRESS = '0x0bb1810061c2f5b2088054ee184e6c79e1591101'; | ||||
| const PROPOSER = process.env.PROPOSER || constants.NULL_ADDRESS; | ||||
| const VOTER = '0xba4f44e774158408e2dc6c5cb65bc995f0a89180'; | ||||
| const VOTER_OPERATED_POOLS = ['0x0000000000000000000000000000000000000000000000000000000000000017']; | ||||
| blockchainTests.configure({ | ||||
|     fork: { | ||||
|         unlockedAccounts: [PROPOSER, VOTER], | ||||
|     }, | ||||
| }); | ||||
|  | ||||
| async function querySubgraphAsync(operatorAddress: string): Promise<string[]> { | ||||
|     const query = ` | ||||
|         { | ||||
|             stakingActor(id: "${operatorAddress}") { | ||||
|                 operatedPools { | ||||
|                     id | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     `; | ||||
|     const response = await fetch(SUBGRAPH_URL, { | ||||
|         method: 'POST', | ||||
|         headers: { | ||||
|             Accept: 'application/json', | ||||
|             'Content-Type': 'application/json', | ||||
|         }, | ||||
|         body: JSON.stringify({ | ||||
|             query, | ||||
|         }), | ||||
|     }); | ||||
|     const { | ||||
|         data: { stakingActor }, | ||||
|     } = await response.json(); | ||||
|     if (stakingActor) { | ||||
|         return stakingActor.operatedPools.map((pool: { id: string }) => hexUtils.leftPad(pool.id)); | ||||
|     } else { | ||||
|         return []; | ||||
|     } | ||||
| } | ||||
|  | ||||
| blockchainTests.fork.skip('Treasury proposal mainnet fork tests', env => { | ||||
|     let staking: StakingContract; | ||||
|     let stakingProxy: StakingProxyContract; | ||||
|     let treasury: ZrxTreasuryContract; | ||||
|     let votingPeriod: BigNumber; | ||||
|  | ||||
|     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(); | ||||
|         const lastPoolId = new BigNumber(await staking.lastPoolId().callAsync(), 16); | ||||
|         const batchExecuteCalldata = [ | ||||
|             ...[...new Array(lastPoolId.toNumber())].map((_x, i) => | ||||
|                 staking.finalizePool(hexUtils.leftPad(i + 1)).getABIEncodedTransactionData(), | ||||
|             ), | ||||
|             staking.endEpoch().getABIEncodedTransactionData(), | ||||
|             ...[...new Array(lastPoolId.toNumber())].map((_x, i) => | ||||
|                 staking.finalizePool(hexUtils.leftPad(i + 1)).getABIEncodedTransactionData(), | ||||
|             ), | ||||
|             ...[...new Array(lastPoolId.toNumber())].map((_x, i) => | ||||
|                 staking.finalizePool(hexUtils.leftPad(i + 1)).getABIEncodedTransactionData(), | ||||
|             ), | ||||
|         ]; | ||||
|         await stakingProxy.batchExecute(batchExecuteCalldata).awaitTransactionSuccessAsync(); | ||||
|     } | ||||
|  | ||||
|     before(async () => { | ||||
|         const abis = _.mapValues({ ...artifacts, ...erc20Artifacts }, v => v.compilerOutput.abi); | ||||
|         treasury = new ZrxTreasuryContract(TREASURY_ADDRESS, env.provider, env.txDefaults, abis); | ||||
|         votingPeriod = await treasury.votingPeriod().callAsync(); | ||||
|         staking = new StakingContract(STAKING_PROXY_ADDRESS, env.provider, env.txDefaults); | ||||
|         stakingProxy = new StakingProxyContract(STAKING_PROXY_ADDRESS, env.provider, env.txDefaults); | ||||
|     }); | ||||
|  | ||||
|     describe('Proposal 0', () => { | ||||
|         it('works', async () => { | ||||
|             const proposal = proposals[0]; | ||||
|             let executionEpoch: BigNumber; | ||||
|             if (proposal.executionEpoch) { | ||||
|                 executionEpoch = proposal.executionEpoch; | ||||
|             } else { | ||||
|                 const currentEpoch = await staking.currentEpoch().callAsync(); | ||||
|                 executionEpoch = currentEpoch.plus(2); | ||||
|             } | ||||
|             const pools = await querySubgraphAsync(PROPOSER); | ||||
|             const proposeTx = treasury.propose(proposal.actions, executionEpoch, proposal.description, pools); | ||||
|  | ||||
|             const calldata = proposeTx.getABIEncodedTransactionData(); | ||||
|             logUtils.log('ZrxTreasury.propose calldata:'); | ||||
|             logUtils.log(calldata); | ||||
|  | ||||
|             const proposalId = await proposeTx.callAsync({ from: PROPOSER }); | ||||
|             const receipt = await proposeTx.awaitTransactionSuccessAsync({ from: PROPOSER }); | ||||
|             verifyEventsFromLogs( | ||||
|                 receipt.logs, | ||||
|                 [ | ||||
|                     { | ||||
|                         ...proposal, | ||||
|                         proposalId, | ||||
|                         executionEpoch, | ||||
|                         proposer: PROPOSER, | ||||
|                         operatedPoolIds: pools, | ||||
|                     }, | ||||
|                 ], | ||||
|                 ZrxTreasuryEvents.ProposalCreated, | ||||
|             ); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await treasury | ||||
|                 .castVote(proposalId, true, VOTER_OPERATED_POOLS) | ||||
|                 .awaitTransactionSuccessAsync({ from: VOTER }); | ||||
|             await env.web3Wrapper.increaseTimeAsync(votingPeriod.plus(1).toNumber()); | ||||
|             await env.web3Wrapper.mineBlockAsync(); | ||||
|             const executeTx = await treasury.execute(proposalId, proposal.actions).awaitTransactionSuccessAsync(); | ||||
|             verifyEventsFromLogs( | ||||
|                 executeTx.logs, | ||||
|                 [ | ||||
|                     { | ||||
|                         proposalId, | ||||
|                     }, | ||||
|                 ], | ||||
|                 ZrxTreasuryEvents.ProposalExecuted, | ||||
|             ); | ||||
|             const recipient = '0xf9347f751a6a1467abc722ec7d80ba2698dd9d6c'; | ||||
|             verifyEventsFromLogs( | ||||
|                 executeTx.logs, | ||||
|                 [ | ||||
|                     { | ||||
|                         _from: TREASURY_ADDRESS, | ||||
|                         _to: recipient, | ||||
|                         _value: new BigNumber(400_000).times('1e18'), | ||||
|                     }, | ||||
|                 ], | ||||
|                 ERC20TokenEvents.Transfer, | ||||
|             ); | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
| @@ -28,6 +28,7 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|         votingPeriod: new BigNumber(3).times(stakingConstants.ONE_DAY_IN_SECONDS), | ||||
|         proposalThreshold: new BigNumber(100), | ||||
|         quorumThreshold: new BigNumber(1000), | ||||
|         defaultPoolId: stakingConstants.INITIAL_POOL_ID, | ||||
|     }; | ||||
|     const PROPOSAL_DESCRIPTION = 'A very compelling proposal!'; | ||||
|     const TREASURY_BALANCE = constants.INITIAL_ERC20_BALANCE; | ||||
| @@ -135,6 +136,16 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|             .approve(erc20ProxyContract.address, constants.INITIAL_ERC20_ALLOWANCE) | ||||
|             .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|  | ||||
|         defaultPoolOperator = await DefaultPoolOperatorContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.DefaultPoolOperator, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             { ...artifacts, ...erc20Artifacts }, | ||||
|             staking.address, | ||||
|             weth.address, | ||||
|         ); | ||||
|         defaultPoolId = stakingConstants.INITIAL_POOL_ID; | ||||
|  | ||||
|         const createStakingPoolTx = staking.createStakingPool(stakingConstants.PPM, false); | ||||
|         nonDefaultPoolId = await createStakingPoolTx.callAsync({ from: poolOperator }); | ||||
|         await createStakingPoolTx.awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
| @@ -145,9 +156,9 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|             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 = [ | ||||
| @@ -166,10 +177,6 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|                 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 () => { | ||||
| @@ -222,6 +229,19 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|             const operatorVotingPower = await treasury.getVotingPower(poolOperator, [nonDefaultPoolId]).callAsync(); | ||||
|             expect(operatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.dividedBy(2)); | ||||
|         }); | ||||
|         it('Reverts if given duplicate pool IDs', 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 tx = treasury.getVotingPower(poolOperator, [nonDefaultPoolId, nonDefaultPoolId]).callAsync(); | ||||
|             return expect(tx).to.revertWith('getVotingPower/DUPLICATE_POOL_ID'); | ||||
|         }); | ||||
|         it('Correctly sums voting power delegated to multiple pools', async () => { | ||||
|             await staking | ||||
|                 .stake(TREASURY_PARAMS.proposalThreshold.times(2)) | ||||
| @@ -580,4 +600,47 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|             expect(await weth.balanceOf(staking.address).callAsync()).to.bignumber.equal(wethAmount); | ||||
|         }); | ||||
|     }); | ||||
|     describe('Can update thresholds via proposal', () => { | ||||
|         it('Updates proposal and quorum thresholds', async () => { | ||||
|             // Delegator has enough ZRX to create and pass a proposal | ||||
|             await staking.stake(TREASURY_PARAMS.quorumThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     TREASURY_PARAMS.quorumThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||
|             const newProposalThreshold = new BigNumber(420); | ||||
|             const newQuorumThreshold = new BigNumber(1337); | ||||
|             const updateThresholdsAction = { | ||||
|                 target: treasury.address, | ||||
|                 data: treasury | ||||
|                     .updateThresholds(newProposalThreshold, newQuorumThreshold) | ||||
|                     .getABIEncodedTransactionData(), | ||||
|                 value: constants.ZERO_AMOUNT, | ||||
|             }; | ||||
|             const tx = treasury.propose( | ||||
|                 [updateThresholdsAction], | ||||
|                 currentEpoch.plus(3), | ||||
|                 `Updates proposal threshold to ${newProposalThreshold} and quorum threshold to ${newQuorumThreshold}`, | ||||
|                 [], | ||||
|             ); | ||||
|             const proposalId = await tx.callAsync({ from: delegator }); | ||||
|             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await treasury.castVote(proposalId, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await treasury | ||||
|                 .execute(proposalId, [updateThresholdsAction]) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             const proposalThreshold = await treasury.proposalThreshold().callAsync(); | ||||
|             const quorumThreshold = await treasury.quorumThreshold().callAsync(); | ||||
|             expect(proposalThreshold).to.bignumber.equal(newProposalThreshold); | ||||
|             expect(quorumThreshold).to.bignumber.equal(newQuorumThreshold); | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user