Compare commits
	
		
			97 Commits
		
	
	
		
			@0x/contra
			...
			protocol@c
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 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 | 
| @@ -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: | ||||
|   | ||||
| @@ -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,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-asset-proxy", | ||||
|     "version": "3.7.10", | ||||
|     "version": "3.7.16", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -51,13 +51,13 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.5.2", | ||||
|         "@0x/contract-wrappers": "^13.16.0", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@types/lodash": "4.14.104", | ||||
| @@ -79,16 +79,16 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/contracts-erc1155": "^2.1.28", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-erc721": "^3.1.28", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.28", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@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.2", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|   | ||||
| @@ -1,4 +1,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-broker", | ||||
|     "version": "1.1.28", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-erc721": "^3.1.28", | ||||
|         "@0x/contracts-exchange": "^3.2.29", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.28", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -84,10 +84,10 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -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,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-coordinator", | ||||
|     "version": "3.1.29", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-dev-utils": "^1.3.27", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -82,16 +82,16 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.26", | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/contract-addresses": "^6.0.0", | ||||
|         "@0x/contracts-exchange": "^3.2.29", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/json-schemas": "^6.1.2", | ||||
|         "@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.2", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "http-status-codes": "^1.3.2" | ||||
|     }, | ||||
|   | ||||
| @@ -1,4 +1,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-dev-utils", | ||||
|     "version": "1.3.27", | ||||
|     "version": "1.3.33", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -41,17 +41,17 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/dev-utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.5.2", | ||||
|         "@0x/assert": "^3.0.26", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethers": "~4.0.4", | ||||
|         "npm-run-all": "^4.1.2", | ||||
| @@ -63,7 +63,7 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@types/node": "12.12.54" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc1155", | ||||
|     "version": "2.1.28", | ||||
|     "version": "2.1.34", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,11 +52,11 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.5.2", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
| @@ -80,10 +80,10 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@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,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc20", | ||||
|     "version": "3.3.7", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@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", | ||||
| @@ -82,7 +82,7 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2" | ||||
|         "@0x/base-contract": "^6.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc721", | ||||
|     "version": "3.1.28", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@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", | ||||
| @@ -84,7 +84,7 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2" | ||||
|         "@0x/base-contract": "^6.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange-forwarder", | ||||
|     "version": "4.2.29", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-dev-utils": "^1.3.27", | ||||
|         "@0x/contracts-erc1155": "^2.1.28", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-erc721": "^3.1.28", | ||||
|         "@0x/contracts-exchange": "^3.2.29", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.28", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@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", | ||||
| @@ -90,7 +90,7 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|   | ||||
| @@ -1,4 +1,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange-libs", | ||||
|     "version": "4.3.28", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/sol-compiler": "^4.7.2", | ||||
|         "@0x/subproviders": "^6.5.2", | ||||
|         "@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.4", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -80,13 +80,13 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@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.2", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange", | ||||
|     "version": "3.2.29", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.28", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-multisig": "^4.1.29", | ||||
|         "@0x/contracts-staking": "^2.0.36", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -88,13 +88,13 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/contracts-dev-utils": "^1.3.27", | ||||
|         "@0x/contracts-erc1155": "^2.1.28", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-erc721": "^3.1.28", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@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') { | ||||
|   | ||||
| @@ -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( | ||||
|   | ||||
| @@ -1,4 +1,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-extensions", | ||||
|     "version": "6.2.23", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-dev-utils": "^1.3.27", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-erc721": "^3.1.28", | ||||
|         "@0x/contracts-exchange": "^3.2.29", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.28", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@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", | ||||
| @@ -90,8 +90,8 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-integrations", | ||||
|     "version": "2.7.37", | ||||
|     "version": "2.7.58", | ||||
|     "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.5.2", | ||||
|         "@0x/contract-addresses": "^6.0.0", | ||||
|         "@0x/contract-wrappers": "^13.16.0", | ||||
|         "@0x/contracts-broker": "^1.1.28", | ||||
|         "@0x/contracts-coordinator": "^3.1.29", | ||||
|         "@0x/contracts-dev-utils": "^1.3.27", | ||||
|         "@0x/contracts-exchange-forwarder": "^4.2.29", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.28", | ||||
|         "@0x/contracts-extensions": "^6.2.23", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@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.6", | ||||
|         "@0x/migrations": "^8.0.3", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@0x/protocol-utils": "^1.5.1", | ||||
|         "@0x/sol-compiler": "^4.7.2", | ||||
|         "@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.2", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@azure/core-asynciterator-polyfill": "^1.0.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -93,21 +93,21 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/asset-swapper": "^6.8.0", | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-erc1155": "^2.1.28", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-erc721": "^3.1.28", | ||||
|         "@0x/contracts-exchange": "^3.2.29", | ||||
|         "@0x/contracts-multisig": "^4.1.29", | ||||
|         "@0x/contracts-staking": "^2.0.36", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-zero-ex": "^0.22.1", | ||||
|         "@0x/subproviders": "^6.5.2", | ||||
|         "@0x/asset-swapper": "^16.21.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.2", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "lodash": "^4.17.11" | ||||
|   | ||||
| @@ -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, []); | ||||
|   | ||||
| @@ -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), | ||||
|     ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -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,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-multisig", | ||||
|     "version": "4.1.29", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/sol-compiler": "^4.7.2", | ||||
|         "@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.2", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@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", | ||||
| @@ -78,7 +78,7 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|   | ||||
| @@ -1,4 +1,59 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
							
								
								
									
										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.36", | ||||
|     "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.5.2", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-dev-utils": "^1.3.27", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.28", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-utils": "^4.7.7", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@0x/sol-compiler": "^4.7.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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/node": "12.12.54", | ||||
|         "chai": "^4.0.1", | ||||
| @@ -87,10 +87,10 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10" | ||||
|     }, | ||||
|   | ||||
| @@ -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 | ||||
| @@ -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,59 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ 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 | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-test-utils", | ||||
|     "version": "5.3.25", | ||||
|     "version": "5.4.5", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -34,7 +34,7 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/sol-compiler": "^4.7.2", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "shx": "^0.2.2", | ||||
| @@ -42,20 +42,20 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.26", | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/contract-addresses": "^6.0.0", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/json-schemas": "^6.1.2", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@0x/sol-coverage": "^4.0.36", | ||||
|         "@0x/sol-profiler": "^4.1.26", | ||||
|         "@0x/sol-trace": "^3.0.36", | ||||
|         "@0x/subproviders": "^6.5.2", | ||||
|         "@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.2", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@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", | ||||
|   | ||||
| @@ -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', | ||||
|   | ||||
| @@ -1,4 +1,78 @@ | ||||
| [ | ||||
|     { | ||||
|         "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", | ||||
|   | ||||
| @@ -5,6 +5,38 @@ 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 | ||||
|   | ||||
| @@ -30,6 +30,7 @@ interface IZrxTreasury { | ||||
|         uint256 votingPeriod; | ||||
|         uint256 proposalThreshold; | ||||
|         uint256 quorumThreshold; | ||||
|         bytes32 defaultPoolId; | ||||
|     } | ||||
|  | ||||
|     struct ProposedAction { | ||||
|   | ||||
| @@ -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; | ||||
| @@ -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 | ||||
| @@ -286,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.1.4", | ||||
|     "version": "1.2.3", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -46,14 +46,14 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.5.2", | ||||
|         "@0x/contract-addresses": "^6.0.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.10", | ||||
|         "@0x/contracts-erc20": "^3.3.7", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-staking": "^2.0.36", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/sol-compiler": "^4.7.2", | ||||
|         "@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.4", | ||||
|         "@types/isomorphic-fetch": "^0.0.35", | ||||
| @@ -72,13 +72,13 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/protocol-utils": "^1.5.1", | ||||
|         "@0x/subproviders": "^6.5.2", | ||||
|         "@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.2", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10" | ||||
|     }, | ||||
|   | ||||
							
								
								
									
										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)) | ||||
|   | ||||
| @@ -1,4 +1,58 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1624356181, | ||||
|         "version": "4.7.13", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "4.7.12", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1622609597, | ||||
|         "version": "4.7.11", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "4.7.10", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "4.7.9", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "4.7.8", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "4.7.7", | ||||
|   | ||||
| @@ -5,6 +5,30 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.7.13 - _June 22, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.12 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.11 - _June 2, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.10 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.9 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.8 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.7 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-utils", | ||||
|     "version": "4.7.7", | ||||
|     "version": "4.7.13", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -50,15 +50,15 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.5.2", | ||||
|         "@0x/contracts-gen": "^2.0.37", | ||||
|         "@0x/contracts-test-utils": "^5.3.25", | ||||
|         "@0x/dev-utils": "^4.2.6", | ||||
|         "@0x/order-utils": "^10.4.20", | ||||
|         "@0x/sol-compiler": "^4.7.2", | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.5", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.26", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/web3-wrapper": "^7.5.2", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@types/bn.js": "^4.11.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -79,9 +79,9 @@ | ||||
|         "typescript": "4.2.2" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.3.2", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.2", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "bn.js": "^4.11.8", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|     }, | ||||
|   | ||||
| @@ -536,7 +536,11 @@ blockchainTests('LibBytes', env => { | ||||
|             ])); | ||||
|  | ||||
|         describe('copies forward within one word and one byte overlap', () => | ||||
|             test([[0, 0, 1, 'one byte'], [10, 0, 11, 'eleven bytes'], [15, 0, 16, 'sixteen bytes']])); | ||||
|             test([ | ||||
|                 [0, 0, 1, 'one byte'], | ||||
|                 [10, 0, 11, 'eleven bytes'], | ||||
|                 [15, 0, 16, 'sixteen bytes'], | ||||
|             ])); | ||||
|  | ||||
|         describe('copies backward', () => | ||||
|             test([ | ||||
| @@ -603,7 +607,11 @@ blockchainTests('LibBytes', env => { | ||||
|             ])); | ||||
|  | ||||
|         describe('copies forward within one word and one byte overlap', () => | ||||
|             test([[0, 0, 1, 'one byte'], [0, 10, 11, 'eleven bytes'], [0, 15, 16, 'sixteen bytes']])); | ||||
|             test([ | ||||
|                 [0, 0, 1, 'one byte'], | ||||
|                 [0, 10, 11, 'eleven bytes'], | ||||
|                 [0, 15, 16, 'sixteen bytes'], | ||||
|             ])); | ||||
|     }); | ||||
|  | ||||
|     describe('slice', () => { | ||||
|   | ||||
| @@ -1,4 +1,88 @@ | ||||
| [ | ||||
|     { | ||||
|         "version": "0.26.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add Lido stETH deposit integration", | ||||
|                 "pr": 260 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1624356181 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1623382456, | ||||
|         "version": "0.25.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.25.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add OtcOrdersFeature", | ||||
|                 "pr": 244 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add UniswapV3 VIP feature", | ||||
|                 "pr": 237 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1622609597 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1621944788, | ||||
|         "version": "0.24.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.24.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add special selectors to selector collision test", | ||||
|                 "pr": 243 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1621600614 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.23.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Added ETH support to `MixinCurve`", | ||||
|                 "pr": 220 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add Balancer V2 integration", | ||||
|                 "pr": 206 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1620214333 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619830995, | ||||
|         "version": "0.22.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619825976, | ||||
|         "version": "0.22.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.22.1", | ||||
|         "changes": [ | ||||
| @@ -25,6 +109,10 @@ | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             }, | ||||
|             { | ||||
|                 "note": "BSC Uniswap clones (ApeSwap, CafeSwap, CheeseSwap, JulSwap)", | ||||
|                 "pr": 208 | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|   | ||||
| @@ -5,6 +5,40 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v0.26.0 - _June 22, 2021_ | ||||
|  | ||||
|     * Add Lido stETH deposit integration (#260) | ||||
|  | ||||
| ## v0.25.1 - _June 11, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.25.0 - _June 2, 2021_ | ||||
|  | ||||
|     * Add OtcOrdersFeature (#244) | ||||
|     * Add UniswapV3 VIP feature (#237) | ||||
|  | ||||
| ## v0.24.1 - _May 25, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.24.0 - _May 21, 2021_ | ||||
|  | ||||
|     * Add special selectors to selector collision test (#243) | ||||
|  | ||||
| ## v0.23.0 - _May 5, 2021_ | ||||
|  | ||||
|     * Added ETH support to `MixinCurve` (#220) | ||||
|     * Add Balancer V2 integration (#206) | ||||
|  | ||||
| ## v0.22.3 - _May 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.22.2 - _April 30, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.22.1 - _April 28, 2021_ | ||||
|  | ||||
|     * bump feature version to 1.2 (#213) | ||||
| @@ -16,6 +50,7 @@ CHANGELOG | ||||
| ## v0.21.1 - _April 12, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|     * BSC Uniswap clones (ApeSwap, CafeSwap, CheeseSwap, JulSwap) (#208) | ||||
|  | ||||
| ## v0.21.0 - _April 1, 2021_ | ||||
|  | ||||
|   | ||||
| @@ -26,11 +26,13 @@ import "./features/interfaces/ITokenSpenderFeature.sol"; | ||||
| import "./features/interfaces/ITransformERC20Feature.sol"; | ||||
| import "./features/interfaces/IMetaTransactionsFeature.sol"; | ||||
| import "./features/interfaces/IUniswapFeature.sol"; | ||||
| import "./features/interfaces/IUniswapV3Feature.sol"; | ||||
| import "./features/interfaces/IPancakeSwapFeature.sol"; | ||||
| import "./features/interfaces/ILiquidityProviderFeature.sol"; | ||||
| import "./features/interfaces/INativeOrdersFeature.sol"; | ||||
| import "./features/interfaces/IBatchFillNativeOrdersFeature.sol"; | ||||
| import "./features/interfaces/IMultiplexFeature.sol"; | ||||
| import "./features/interfaces/IOtcOrdersFeature.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev Interface for a fully featured Exchange Proxy. | ||||
| @@ -40,11 +42,13 @@ interface IZeroEx is | ||||
|     ITransformERC20Feature, | ||||
|     IMetaTransactionsFeature, | ||||
|     IUniswapFeature, | ||||
|     IUniswapV3Feature, | ||||
|     IPancakeSwapFeature, | ||||
|     ILiquidityProviderFeature, | ||||
|     INativeOrdersFeature, | ||||
|     IBatchFillNativeOrdersFeature, | ||||
|     IMultiplexFeature | ||||
|     IMultiplexFeature, | ||||
|     IOtcOrdersFeature | ||||
| { | ||||
|     // solhint-disable state-visibility | ||||
|  | ||||
|   | ||||
| @@ -88,6 +88,23 @@ library LibNativeOrdersRichErrors { | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function OrderNotSignedByTakerError( | ||||
|         bytes32 orderHash, | ||||
|         address signer, | ||||
|         address taker | ||||
|     ) | ||||
|         internal | ||||
|         pure | ||||
|         returns (bytes memory) | ||||
|     { | ||||
|         return abi.encodeWithSelector( | ||||
|             bytes4(keccak256("OrderNotSignedByTakerError(bytes32,address,address)")), | ||||
|             orderHash, | ||||
|             signer, | ||||
|             taker | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function InvalidSignerError( | ||||
|         address maker, | ||||
|         address signer | ||||
|   | ||||
| @@ -108,7 +108,7 @@ contract LiquidityProviderFeature is | ||||
|  | ||||
|         if (!LibERC20Transformer.isTokenETH(inputToken)) { | ||||
|             // Transfer input ERC20 tokens to the provider. | ||||
|             _transferERC20Tokens( | ||||
|             _transferERC20TokensFrom( | ||||
|                 inputToken, | ||||
|                 msg.sender, | ||||
|                 address(provider), | ||||
|   | ||||
| @@ -251,7 +251,7 @@ contract MetaTransactionsFeature is | ||||
|  | ||||
|         // Pay the fee to the sender. | ||||
|         if (state.mtx.feeAmount > 0) { | ||||
|             _transferERC20Tokens( | ||||
|             _transferERC20TokensFrom( | ||||
|                 state.mtx.feeToken, | ||||
|                 state.mtx.signer, | ||||
|                 state.sender, | ||||
|   | ||||
| @@ -36,6 +36,7 @@ import "./interfaces/IFeature.sol"; | ||||
| import "./interfaces/IMultiplexFeature.sol"; | ||||
| import "./interfaces/INativeOrdersFeature.sol"; | ||||
| import "./interfaces/ITransformERC20Feature.sol"; | ||||
| import "./interfaces/IUniswapV3Feature.sol"; | ||||
| import "./libs/LibNativeOrder.sol"; | ||||
|  | ||||
|  | ||||
| @@ -55,7 +56,7 @@ contract MultiplexFeature is | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "MultiplexFeature"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 1); | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 1, 0); | ||||
|  | ||||
|     /// @dev The WETH token contract. | ||||
|     IEtherTokenV06 private immutable weth; | ||||
| @@ -273,6 +274,22 @@ contract MultiplexFeature is | ||||
|                 // Increment the sold and bought amounts. | ||||
|                 soldAmount = soldAmount.safeAdd(inputTokenAmount); | ||||
|                 outputTokenAmount = outputTokenAmount.safeAdd(outputTokenAmount_); | ||||
|             } else if (wrappedCall.selector == IUniswapV3Feature.sellTokenForTokenToUniswapV3.selector) { | ||||
|                 (bool success, bytes memory resultData) = address(this).delegatecall( | ||||
|                     abi.encodeWithSelector( | ||||
|                         IUniswapV3Feature.sellTokenForTokenToUniswapV3.selector, | ||||
|                         wrappedCall.data, | ||||
|                         inputTokenAmount, | ||||
|                         0, | ||||
|                         msg.sender | ||||
|                     ) | ||||
|                 ); | ||||
|                 if (success) { | ||||
|                     uint256 outputTokenAmount_ = abi.decode(resultData, (uint256)); | ||||
|                     // Increment the sold and bought amounts. | ||||
|                     soldAmount = soldAmount.safeAdd(inputTokenAmount); | ||||
|                     outputTokenAmount = outputTokenAmount.safeAdd(outputTokenAmount_); | ||||
|                 } | ||||
|             } else if (wrappedCall.selector == this._sellToLiquidityProvider.selector) { | ||||
|                 (address provider, bytes memory auxiliaryData) = abi.decode( | ||||
|                     wrappedCall.data, | ||||
| @@ -289,7 +306,7 @@ contract MultiplexFeature is | ||||
|                     remainingEth -= inputTokenAmount; | ||||
|                 } else { | ||||
|                     // Transfer input ERC20 tokens to the provider. | ||||
|                     _transferERC20Tokens( | ||||
|                     _transferERC20TokensFrom( | ||||
|                         fillData.inputToken, | ||||
|                         msg.sender, | ||||
|                         provider, | ||||
| @@ -453,7 +470,7 @@ contract MultiplexFeature is | ||||
|                         _transferEth(payable(provider), outputTokenAmount); | ||||
|                         remainingEth -= outputTokenAmount; | ||||
|                     } else { | ||||
|                         _transferERC20Tokens( | ||||
|                         _transferERC20TokensFrom( | ||||
|                             IERC20TokenV06(fillData.tokens[i]), | ||||
|                             msg.sender, | ||||
|                             provider, | ||||
| @@ -512,7 +529,7 @@ contract MultiplexFeature is | ||||
|                     // send the output token to some address other than | ||||
|                     // msg.sender, so we must transfer the input token | ||||
|                     // to the FlashWallet here. | ||||
|                     _transferERC20Tokens( | ||||
|                     _transferERC20TokensFrom( | ||||
|                         args.inputToken, | ||||
|                         msg.sender, | ||||
|                         flashWallet, | ||||
| @@ -598,7 +615,7 @@ contract MultiplexFeature is | ||||
|  | ||||
|         if (pairAddress == address(0)) { | ||||
|             pairAddress = _computeUniswapPairAddress(tokens[0], tokens[1], isSushi); | ||||
|             _transferERC20Tokens( | ||||
|             _transferERC20TokensFrom( | ||||
|                 IERC20TokenV06(tokens[0]), | ||||
|                 msg.sender, | ||||
|                 pairAddress, | ||||
|   | ||||
							
								
								
									
										472
									
								
								contracts/zero-ex/contracts/src/features/OtcOrdersFeature.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										472
									
								
								contracts/zero-ex/contracts/src/features/OtcOrdersFeature.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,472 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2021 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/LibMathV06.sol"; | ||||
| import "../errors/LibNativeOrdersRichErrors.sol"; | ||||
| import "../fixins/FixinCommon.sol"; | ||||
| import "../fixins/FixinEIP712.sol"; | ||||
| import "../fixins/FixinTokenSpender.sol"; | ||||
| import "../migrations/LibMigrate.sol"; | ||||
| import "../storage/LibNativeOrdersStorage.sol"; | ||||
| import "../storage/LibOtcOrdersStorage.sol"; | ||||
| import "./interfaces/IFeature.sol"; | ||||
| import "./interfaces/IOtcOrdersFeature.sol"; | ||||
| import "./libs/LibNativeOrder.sol"; | ||||
| import "./libs/LibSignature.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev Feature for interacting with OTC orders. | ||||
| contract OtcOrdersFeature is | ||||
|     IFeature, | ||||
|     IOtcOrdersFeature, | ||||
|     FixinCommon, | ||||
|     FixinEIP712, | ||||
|     FixinTokenSpender | ||||
| { | ||||
|     using LibSafeMathV06 for uint256; | ||||
|     using LibSafeMathV06 for uint128; | ||||
|  | ||||
|     /// @dev Options for handling ETH/WETH conversion | ||||
|     /// @param LeaveAsWeth Neither unwrap nor wrap. | ||||
|     /// @param WrapEth Wrap attached ETH. | ||||
|     /// @param UnwrapWeth Unwrap WETH before transferring | ||||
|     ///        to taker. | ||||
|     enum WethOptions { | ||||
|         LeaveAsWeth, | ||||
|         WrapEth, | ||||
|         UnwrapWeth | ||||
|     } | ||||
|  | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "OtcOrders"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 0); | ||||
|     /// @dev The WETH token contract. | ||||
|     IEtherTokenV06 private immutable WETH; | ||||
|  | ||||
|     constructor(address zeroExAddress, IEtherTokenV06 weth) | ||||
|         public | ||||
|         FixinEIP712(zeroExAddress) | ||||
|     { | ||||
|         WETH = weth; | ||||
|     } | ||||
|  | ||||
|     /// @dev Initialize and register this feature. | ||||
|     ///      Should be delegatecalled by `Migrate.migrate()`. | ||||
|     /// @return success `LibMigrate.SUCCESS` on success. | ||||
|     function migrate() | ||||
|         external | ||||
|         returns (bytes4 success) | ||||
|     { | ||||
|         _registerFeatureFunction(this.fillOtcOrder.selector); | ||||
|         _registerFeatureFunction(this.fillOtcOrderWithEth.selector); | ||||
|         _registerFeatureFunction(this.fillTakerSignedOtcOrder.selector); | ||||
|         _registerFeatureFunction(this.getOtcOrderInfo.selector); | ||||
|         _registerFeatureFunction(this.getOtcOrderHash.selector); | ||||
|         _registerFeatureFunction(this.lastOtcTxOriginNonce.selector); | ||||
|         return LibMigrate.MIGRATE_SUCCESS; | ||||
|     } | ||||
|  | ||||
|     /// @dev Fill an OTC order for up to `takerTokenFillAmount` taker tokens. | ||||
|     /// @param order The OTC order. | ||||
|     /// @param makerSignature The order signature from the maker. | ||||
|     /// @param takerTokenFillAmount Maximum taker token amount to fill this | ||||
|     ///        order with. | ||||
|     /// @param unwrapWeth Whether or not to unwrap bought WETH into ETH | ||||
|     ///        before transferring it to the taker. Should be set to false | ||||
|     ///        if the maker token is not WETH. | ||||
|     /// @return takerTokenFilledAmount How much taker token was filled. | ||||
|     /// @return makerTokenFilledAmount How much maker token was filled. | ||||
|     function fillOtcOrder( | ||||
|         LibNativeOrder.OtcOrder memory order, | ||||
|         LibSignature.Signature memory makerSignature, | ||||
|         uint128 takerTokenFillAmount, | ||||
|         bool unwrapWeth | ||||
|     ) | ||||
|         public | ||||
|         override | ||||
|         returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount) | ||||
|     { | ||||
|         if (!_isSenderValidTaker(order.taker)) { | ||||
|             bytes32 orderHash = getOtcOrderHash(order); | ||||
|             LibNativeOrdersRichErrors.OrderNotFillableByTakerError( | ||||
|                 orderHash, | ||||
|                 msg.sender, | ||||
|                 order.taker | ||||
|             ).rrevert(); | ||||
|         } | ||||
|         LibSignature.Signature memory nullSignature; | ||||
|         return _fillOtcOrderPrivate( | ||||
|             order, | ||||
|             makerSignature, | ||||
|             nullSignature, | ||||
|             takerTokenFillAmount, | ||||
|             unwrapWeth ? WethOptions.UnwrapWeth : WethOptions.LeaveAsWeth | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Fill an OTC order whose taker token is WETH for up | ||||
|     ///      to `msg.value`. | ||||
|     /// @param order The OTC order. | ||||
|     /// @param makerSignature The order signature from the maker. | ||||
|     /// @return takerTokenFilledAmount How much taker token was filled. | ||||
|     /// @return makerTokenFilledAmount How much maker token was filled. | ||||
|     function fillOtcOrderWithEth( | ||||
|         LibNativeOrder.OtcOrder memory order, | ||||
|         LibSignature.Signature memory makerSignature | ||||
|     ) | ||||
|         public | ||||
|         override | ||||
|         payable | ||||
|         returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount) | ||||
|     { | ||||
|         if (!_isSenderValidTaker(order.taker)) { | ||||
|             bytes32 orderHash = getOtcOrderHash(order); | ||||
|             LibNativeOrdersRichErrors.OrderNotFillableByTakerError( | ||||
|                 orderHash, | ||||
|                 msg.sender, | ||||
|                 order.taker | ||||
|             ).rrevert(); | ||||
|         } | ||||
|         LibSignature.Signature memory nullSignature; | ||||
|         return _fillOtcOrderPrivate( | ||||
|             order, | ||||
|             makerSignature, | ||||
|             nullSignature, | ||||
|             msg.value.safeDowncastToUint128(), | ||||
|             WethOptions.WrapEth | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Fully fill an OTC order. "Meta-transaction" variant, | ||||
|     ///      requires order to be signed by both maker and taker. | ||||
|     /// @param order The OTC order. | ||||
|     /// @param makerSignature The order signature from the maker. | ||||
|     /// @param takerSignature The order signature from the taker. | ||||
|     /// @param unwrapWeth Whether or not to unwrap bought WETH into ETH | ||||
|     ///        before transferring it to the taker. Should be set to false | ||||
|     ///        if the maker token is not WETH. | ||||
|     /// @return takerTokenFilledAmount How much taker token was filled. | ||||
|     /// @return makerTokenFilledAmount How much maker token was filled. | ||||
|     function fillTakerSignedOtcOrder( | ||||
|         LibNativeOrder.OtcOrder memory order, | ||||
|         LibSignature.Signature memory makerSignature, | ||||
|         LibSignature.Signature memory takerSignature, | ||||
|         bool unwrapWeth | ||||
|     ) | ||||
|         public | ||||
|         override | ||||
|         returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount) | ||||
|     { | ||||
|         return _fillOtcOrderPrivate( | ||||
|             order, | ||||
|             makerSignature, | ||||
|             takerSignature, | ||||
|             order.takerAmount, | ||||
|             unwrapWeth ? WethOptions.UnwrapWeth : WethOptions.LeaveAsWeth | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Fill an OTC order. Private variant. | ||||
|     /// @param order The OTC order. | ||||
|     /// @param makerSignature The order signature from the maker. | ||||
|     /// @param takerSignature The order signature from the taker. | ||||
|     ///        Ignored if msg.sender == order.taker. | ||||
|     /// @param takerTokenFillAmount Maximum taker token amount to | ||||
|     ///        fill this order with. | ||||
|     /// @return takerTokenFilledAmount How much taker token was filled. | ||||
|     /// @return makerTokenFilledAmount How much maker token was filled. | ||||
|     function _fillOtcOrderPrivate( | ||||
|         LibNativeOrder.OtcOrder memory order, | ||||
|         LibSignature.Signature memory makerSignature, | ||||
|         LibSignature.Signature memory takerSignature, | ||||
|         uint128 takerTokenFillAmount, | ||||
|         WethOptions wethOptions | ||||
|     ) | ||||
|         private | ||||
|         returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount) | ||||
|     { | ||||
|         LibNativeOrder.OtcOrderInfo memory orderInfo = getOtcOrderInfo(order); | ||||
|  | ||||
|         // Must be fillable. | ||||
|         if (orderInfo.status != LibNativeOrder.OrderStatus.FILLABLE) { | ||||
|             LibNativeOrdersRichErrors.OrderNotFillableError( | ||||
|                 orderInfo.orderHash, | ||||
|                 uint8(orderInfo.status) | ||||
|             ).rrevert(); | ||||
|         } | ||||
|  | ||||
|         address taker = msg.sender; | ||||
|         { | ||||
|             LibNativeOrdersStorage.Storage storage stor = | ||||
|                 LibNativeOrdersStorage.getStorage(); | ||||
|  | ||||
|             // Must be fillable by the tx.origin. | ||||
|             if ( | ||||
|                 order.txOrigin != tx.origin && | ||||
|                 !stor.originRegistry[order.txOrigin][tx.origin] | ||||
|             ) { | ||||
|                 LibNativeOrdersRichErrors.OrderNotFillableByOriginError( | ||||
|                     orderInfo.orderHash, | ||||
|                     tx.origin, | ||||
|                     order.txOrigin | ||||
|                 ).rrevert(); | ||||
|             } | ||||
|  | ||||
|             // Maker signature must be valid for the order. | ||||
|             address makerSigner = LibSignature.getSignerOfHash(orderInfo.orderHash, makerSignature); | ||||
|             if ( | ||||
|                 makerSigner != order.maker && | ||||
|                 !stor.orderSignerRegistry[order.maker][makerSigner] | ||||
|             ) { | ||||
|                 LibNativeOrdersRichErrors.OrderNotSignedByMakerError( | ||||
|                     orderInfo.orderHash, | ||||
|                     makerSigner, | ||||
|                     order.maker | ||||
|                 ).rrevert(); | ||||
|             } | ||||
|  | ||||
|             // If msg.sender is not the taker, validate the taker signature. | ||||
|             if (!_isSenderValidTaker(order.taker)) { | ||||
|                 address takerSigner = LibSignature.getSignerOfHash(orderInfo.orderHash, takerSignature); | ||||
|                 if ( | ||||
|                     takerSigner != order.taker && | ||||
|                     !stor.orderSignerRegistry[order.taker][takerSigner] | ||||
|                 ) { | ||||
|                     LibNativeOrdersRichErrors.OrderNotSignedByTakerError( | ||||
|                         orderInfo.orderHash, | ||||
|                         takerSigner, | ||||
|                         order.taker | ||||
|                     ).rrevert(); | ||||
|                 } | ||||
|                 taker = order.taker; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Settle between the maker and taker. | ||||
|         (takerTokenFilledAmount, makerTokenFilledAmount) = _settleOtcOrder( | ||||
|             order, | ||||
|             taker, | ||||
|             takerTokenFillAmount, | ||||
|             wethOptions | ||||
|         ); | ||||
|  | ||||
|         emit OtcOrderFilled( | ||||
|             orderInfo.orderHash, | ||||
|             order.maker, | ||||
|             taker, | ||||
|             address(order.makerToken), | ||||
|             address(order.takerToken), | ||||
|             takerTokenFilledAmount, | ||||
|             makerTokenFilledAmount | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Settle the trade between an OTC order's maker and taker. | ||||
|     /// @param order The OTC order. | ||||
|     /// @param takerTokenFillAmount Maximum taker token amount to fill this | ||||
|     ///        order with. | ||||
|     /// @return takerTokenFilledAmount How much taker token was filled. | ||||
|     /// @return makerTokenFilledAmount How much maker token was filled. | ||||
|     function _settleOtcOrder( | ||||
|         LibNativeOrder.OtcOrder memory order, | ||||
|         address taker, | ||||
|         uint128 takerTokenFillAmount, | ||||
|         WethOptions wethOptions | ||||
|     ) | ||||
|         private | ||||
|         returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount) | ||||
|     { | ||||
|         { | ||||
|             // Unpack nonce fields | ||||
|             uint64 nonceBucket = uint64(order.expiryAndNonce >> 128); | ||||
|             uint128 nonce = uint128(order.expiryAndNonce); | ||||
|             // Update tx origin nonce for the order | ||||
|             LibOtcOrdersStorage.getStorage().txOriginNonces | ||||
|                 [order.txOrigin][nonceBucket] = nonce; | ||||
|         } | ||||
|  | ||||
|         if (takerTokenFillAmount == order.takerAmount) { | ||||
|             takerTokenFilledAmount = order.takerAmount; | ||||
|             makerTokenFilledAmount = order.makerAmount; | ||||
|         } else { | ||||
|             // Clamp the taker token fill amount to the fillable amount. | ||||
|             takerTokenFilledAmount = LibSafeMathV06.min128( | ||||
|                 takerTokenFillAmount, | ||||
|                 order.takerAmount | ||||
|             ); | ||||
|             // Compute the maker token amount. | ||||
|             // This should never overflow because the values are all clamped to | ||||
|             // (2^128-1). | ||||
|             makerTokenFilledAmount = uint128(LibMathV06.getPartialAmountFloor( | ||||
|                 uint256(takerTokenFilledAmount), | ||||
|                 uint256(order.takerAmount), | ||||
|                 uint256(order.makerAmount) | ||||
|             )); | ||||
|         } | ||||
|  | ||||
|         if (wethOptions == WethOptions.WrapEth) { | ||||
|             require( | ||||
|                 order.takerToken == WETH, | ||||
|                 "OtcOrdersFeature/INVALID_WRAP_ETH" | ||||
|             ); | ||||
|             // Wrap ETH | ||||
|             WETH.deposit{value: takerTokenFilledAmount}(); | ||||
|             // Transfer WETH to maker | ||||
|             WETH.transfer(order.maker, takerTokenFilledAmount); | ||||
|             if (takerTokenFilledAmount < msg.value) { | ||||
|                 // Refund unused ETH | ||||
|                 _transferEth( | ||||
|                     msg.sender, | ||||
|                     msg.value - uint256(takerTokenFilledAmount) | ||||
|                 ); | ||||
|             } | ||||
|         } else { | ||||
|             // Transfer taker -> maker | ||||
|             _transferERC20TokensFrom( | ||||
|                 order.takerToken, | ||||
|                 taker, | ||||
|                 order.maker, | ||||
|                 takerTokenFilledAmount | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         if (wethOptions == WethOptions.UnwrapWeth) { | ||||
|             require( | ||||
|                 order.makerToken == WETH, | ||||
|                 "OtcOrdersFeature/INVALID_UNWRAP_WETH" | ||||
|             ); | ||||
|             // Transfer maker tokens in | ||||
|             _transferERC20TokensFrom( | ||||
|                 order.makerToken, | ||||
|                 order.maker, | ||||
|                 address(this), | ||||
|                 makerTokenFilledAmount | ||||
|             ); | ||||
|             // Unwrap WETH | ||||
|             WETH.withdraw(makerTokenFilledAmount); | ||||
|             // Transfer ETH to taker | ||||
|             _transferEth(taker, makerTokenFilledAmount); | ||||
|         } else { | ||||
|             // Transfer maker -> taker. | ||||
|             _transferERC20TokensFrom( | ||||
|                 order.makerToken, | ||||
|                 order.maker, | ||||
|                 taker, | ||||
|                 makerTokenFilledAmount | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Get the order info for an OTC order. | ||||
|     /// @param order The OTC order. | ||||
|     /// @return orderInfo Info about the order. | ||||
|     function getOtcOrderInfo(LibNativeOrder.OtcOrder memory order) | ||||
|         public | ||||
|         override | ||||
|         view | ||||
|         returns (LibNativeOrder.OtcOrderInfo memory orderInfo) | ||||
|     { | ||||
|         // compute order hash. | ||||
|         orderInfo.orderHash = getOtcOrderHash(order); | ||||
|  | ||||
|         LibOtcOrdersStorage.Storage storage stor = | ||||
|             LibOtcOrdersStorage.getStorage(); | ||||
|  | ||||
|         // Unpack expiry and nonce fields | ||||
|         uint64 expiry = uint64(order.expiryAndNonce >> 192); | ||||
|         uint64 nonceBucket = uint64(order.expiryAndNonce >> 128); | ||||
|         uint128 nonce = uint128(order.expiryAndNonce); | ||||
|  | ||||
|         // check tx origin nonce | ||||
|         uint128 lastNonce = stor.txOriginNonces | ||||
|             [order.txOrigin] | ||||
|             [nonceBucket]; | ||||
|         if (nonce <= lastNonce) { | ||||
|             orderInfo.status = LibNativeOrder.OrderStatus.INVALID; | ||||
|             return orderInfo; | ||||
|         } | ||||
|  | ||||
|         // Check for expiration. | ||||
|         if (expiry <= uint64(block.timestamp)) { | ||||
|             orderInfo.status = LibNativeOrder.OrderStatus.EXPIRED; | ||||
|             return orderInfo; | ||||
|         } | ||||
|  | ||||
|         orderInfo.status = LibNativeOrder.OrderStatus.FILLABLE; | ||||
|         return orderInfo; | ||||
|     } | ||||
|  | ||||
|     /// @dev Get the canonical hash of an OTC order. | ||||
|     /// @param order The OTC order. | ||||
|     /// @return orderHash The order hash. | ||||
|     function getOtcOrderHash(LibNativeOrder.OtcOrder memory order) | ||||
|         public | ||||
|         override | ||||
|         view | ||||
|         returns (bytes32 orderHash) | ||||
|     { | ||||
|         return _getEIP712Hash( | ||||
|             LibNativeOrder.getOtcOrderStructHash(order) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Get the last nonce used for a particular | ||||
|     ///      tx.origin address and nonce bucket. | ||||
|     /// @param txOrigin The address. | ||||
|     /// @param nonceBucket The nonce bucket index. | ||||
|     /// @return lastNonce The last nonce value used. | ||||
|     function lastOtcTxOriginNonce(address txOrigin, uint64 nonceBucket) | ||||
|         public | ||||
|         override | ||||
|         view | ||||
|         returns (uint128 lastNonce) | ||||
|     { | ||||
|         LibOtcOrdersStorage.Storage storage stor = | ||||
|             LibOtcOrdersStorage.getStorage(); | ||||
|         return stor.txOriginNonces | ||||
|             [txOrigin] | ||||
|             [nonceBucket]; | ||||
|     } | ||||
|  | ||||
|     function _transferEth(address recipient, uint256 amount) | ||||
|         private | ||||
|     { | ||||
|         // Transfer ETH to recipient | ||||
|         (bool success, bytes memory revertData) = | ||||
|             recipient.call{value: amount}(""); | ||||
|         // Revert on failure | ||||
|         if (!success) { | ||||
|             revertData.rrevert(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function _isSenderValidTaker(address orderTaker) | ||||
|         private | ||||
|         view | ||||
|         returns (bool) | ||||
|     { | ||||
|         return orderTaker == address(0) || orderTaker == msg.sender; | ||||
|     } | ||||
| } | ||||
| @@ -37,22 +37,44 @@ contract PancakeSwapFeature is | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "PancakeSwapFeature"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 1); | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 2); | ||||
|     /// @dev WBNB contract. | ||||
|     IEtherTokenV06 private immutable WBNB; | ||||
|  | ||||
|     // 0xFF + address of the PancakeSwap factory contract. | ||||
|     uint256 constant private FF_PANCAKESWAP_FACTORY = 0xffbcfccbde45ce874adcb698cc183debcf179528120000000000000000000000; | ||||
|     // 0xFF + address of the PancakeSwapV2 factory contract. | ||||
|     uint256 constant private FF_PANCAKESWAPV2_FACTORY = 0xffca143ce32fe78f1f7019d7d551a6402fc5350c730000000000000000000000; | ||||
|     // 0xFF + address of the BakerySwap factory contract. | ||||
|     uint256 constant private FF_BAKERYSWAP_FACTORY = 0xff01bf7c66c6bd861915cdaae475042d3c4bae16a70000000000000000000000; | ||||
|     // 0xFF + address of the SushiSwap factory contract. | ||||
|     uint256 constant private FF_SUSHISWAP_FACTORY = 0xffc35DADB65012eC5796536bD9864eD8773aBc74C40000000000000000000000; | ||||
|     // 0xFF + address of the ApeSwap factory contract. | ||||
|     uint256 constant private FF_APESWAP_FACTORY = 0xff0841bd0b734e4f5853f0dd8d7ea041c241fb0da60000000000000000000000; | ||||
|     // 0xFF + address of the CafeSwap factory contract. | ||||
|     uint256 constant private FF_CAFESWAP_FACTORY = 0xff3e708fdbe3ada63fc94f8f61811196f1302137ad0000000000000000000000; | ||||
|     // 0xFF + address of the CheeseSwap factory contract. | ||||
|     uint256 constant private FF_CHEESESWAP_FACTORY = 0xffdd538e4fd1b69b7863e1f741213276a6cf1efb3b0000000000000000000000; | ||||
|     // 0xFF + address of the JulSwap factory contract. | ||||
|     uint256 constant private FF_JULSWAP_FACTORY = 0xff553990f2cba90272390f62c5bdb1681ffc8996750000000000000000000000; | ||||
|  | ||||
|     // Init code hash of the PancakeSwap pair contract. | ||||
|     uint256 constant private PANCAKESWAP_PAIR_INIT_CODE_HASH = 0xd0d4c4cd0848c93cb4fd1f498d7013ee6bfb25783ea21593d5834f5d250ece66; | ||||
|     // Init code hash of the PancakeSwapV2 pair contract. | ||||
|     uint256 constant private PANCAKESWAPV2_PAIR_INIT_CODE_HASH = 0x00fb7f630766e6a796048ea87d01acd3068e8ff67d078148a3fa3f4a84f69bd5; | ||||
|     // Init code hash of the BakerySwap pair contract. | ||||
|     uint256 constant private BAKERYSWAP_PAIR_INIT_CODE_HASH = 0xe2e87433120e32c4738a7d8f3271f3d872cbe16241d67537139158d90bac61d3; | ||||
|     // Init code hash of the SushiSwap pair contract. | ||||
|     uint256 constant private SUSHISWAP_PAIR_INIT_CODE_HASH = 0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303; | ||||
|     // Init code hash of the ApeSwap pair contract. | ||||
|     uint256 constant private APESWAP_PAIR_INIT_CODE_HASH = 0xf4ccce374816856d11f00e4069e7cada164065686fbef53c6167a63ec2fd8c5b; | ||||
|     // Init code hash of the CafeSwap pair contract. | ||||
|     uint256 constant private CAFESWAP_PAIR_INIT_CODE_HASH = 0x90bcdb5d0bf0e8db3852b0b7d7e05cc8f7c6eb6d511213c5ba02d1d1dbeda8d3; | ||||
|     // Init code hash of the CheeseSwap pair contract. | ||||
|     uint256 constant private CHEESESWAP_PAIR_INIT_CODE_HASH = 0xf52c5189a89e7ca2ef4f19f2798e3900fba7a316de7cef6c5a9446621ba86286; | ||||
|     // Init code hash of the JulSwap pair contract. | ||||
|     uint256 constant private JULSWAP_PAIR_INIT_CODE_HASH = 0xb1e98e21a5335633815a8cfb3b580071c2e4561c50afd57a8746def9ed890b18; | ||||
|  | ||||
|     // Mask of the lower 20 bytes of a bytes32. | ||||
|     uint256 constant private ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff; | ||||
|     // BNB pseudo-token address. | ||||
| @@ -258,7 +280,7 @@ contract PancakeSwapFeature is | ||||
|  | ||||
|                 // Call pair.swap() | ||||
|                 switch mload(0xA20) // fork | ||||
|                     case 1 { | ||||
|                     case 2 { | ||||
|                         mstore(0xB00, BAKERYSWAP_PAIR_SWAP_CALL_SELECTOR_32) | ||||
|                     } | ||||
|                     default { | ||||
| @@ -352,15 +374,40 @@ contract PancakeSwapFeature is | ||||
|                         mstore(0xB35, PANCAKESWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 1 { | ||||
|                         mstore(0xB00, FF_PANCAKESWAPV2_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, PANCAKESWAPV2_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 2 { | ||||
|                         mstore(0xB00, FF_BAKERYSWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, BAKERYSWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     default { | ||||
|                     case 3 { | ||||
|                         mstore(0xB00, FF_SUSHISWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, SUSHISWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 4 { | ||||
|                         mstore(0xB00, FF_APESWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, APESWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 5 { | ||||
|                         mstore(0xB00, FF_CAFESWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, CAFESWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 6 { | ||||
|                         mstore(0xB00, FF_CHEESESWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, CHEESESWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     default { | ||||
|                         mstore(0xB00, FF_JULSWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, JULSWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                 pair := and(ADDRESS_MASK, keccak256(0xB00, 0x55)) | ||||
|             } | ||||
|  | ||||
|   | ||||
| @@ -312,7 +312,7 @@ contract TransformERC20Feature is | ||||
|         // Transfer input tokens. | ||||
|         if (!LibERC20Transformer.isTokenETH(inputToken) && amount != 0) { | ||||
|             // Token is not ETH, so pull ERC20 tokens. | ||||
|             _transferERC20Tokens( | ||||
|             _transferERC20TokensFrom( | ||||
|                 inputToken, | ||||
|                 from, | ||||
|                 to, | ||||
|   | ||||
							
								
								
									
										419
									
								
								contracts/zero-ex/contracts/src/features/UniswapV3Feature.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										419
									
								
								contracts/zero-ex/contracts/src/features/UniswapV3Feature.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,419 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2021 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; | ||||
| import "../vendor/IUniswapV3Pool.sol"; | ||||
| import "../migrations/LibMigrate.sol"; | ||||
| import "../fixins/FixinCommon.sol"; | ||||
| import "../fixins/FixinTokenSpender.sol"; | ||||
| import "./interfaces/IFeature.sol"; | ||||
| import "./interfaces/IUniswapV3Feature.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev VIP uniswap fill functions. | ||||
| contract UniswapV3Feature is | ||||
|     IFeature, | ||||
|     IUniswapV3Feature, | ||||
|     FixinCommon, | ||||
|     FixinTokenSpender | ||||
| { | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "UniswapV3Feature"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 0); | ||||
|     /// @dev WETH contract. | ||||
|     IEtherTokenV06 private immutable WETH; | ||||
|     /// @dev UniswapV3 Factory contract address prepended with '0xff' and left-aligned. | ||||
|     bytes32 private immutable UNI_FF_FACTORY_ADDRESS; | ||||
|     /// @dev UniswapV3 pool init code hash. | ||||
|     bytes32 private immutable UNI_POOL_INIT_CODE_HASH; | ||||
|     /// @dev Minimum size of an encoded swap path: | ||||
|     ///      sizeof(address(inputToken) | uint24(fee) | address(outputToken)) | ||||
|     uint256 private constant SINGLE_HOP_PATH_SIZE = 20 + 3 + 20; | ||||
|     /// @dev How many bytes to skip ahead in an encoded path to start at the next hop: | ||||
|     ///      sizeof(address(inputToken) | uint24(fee)) | ||||
|     uint256 private constant PATH_SKIP_HOP_SIZE = 20 + 3; | ||||
|     /// @dev The size of the swap callback data. | ||||
|     uint256 private constant SWAP_CALLBACK_DATA_SIZE = 128; | ||||
|     /// @dev Minimum tick price sqrt ratio. | ||||
|     uint160 internal constant MIN_PRICE_SQRT_RATIO = 4295128739; | ||||
|     /// @dev Minimum tick price sqrt ratio. | ||||
|     uint160 internal constant MAX_PRICE_SQRT_RATIO = 1461446703485210103287273052203988822378723970342; | ||||
|     /// @dev Mask of lower 20 bytes. | ||||
|     uint256 private constant ADDRESS_MASK = 0x00ffffffffffffffffffffffffffffffffffffffff; | ||||
|     /// @dev Mask of lower 3 bytes. | ||||
|     uint256 private constant UINT24_MASK = 0xffffff; | ||||
|  | ||||
|     /// @dev Construct this contract. | ||||
|     /// @param weth The WETH contract. | ||||
|     /// @param uniFactory The UniswapV3 factory contract. | ||||
|     /// @param poolInitCodeHash The UniswapV3 pool init code hash. | ||||
|     constructor( | ||||
|         IEtherTokenV06 weth, | ||||
|         address uniFactory, | ||||
|         bytes32 poolInitCodeHash | ||||
|     ) public { | ||||
|         WETH = weth; | ||||
|         UNI_FF_FACTORY_ADDRESS = bytes32((uint256(0xff) << 248) | (uint256(uniFactory) << 88)); | ||||
|         UNI_POOL_INIT_CODE_HASH = poolInitCodeHash; | ||||
|     } | ||||
|  | ||||
|     /// @dev Initialize and register this feature. | ||||
|     ///      Should be delegatecalled by `Migrate.migrate()`. | ||||
|     /// @return success `LibMigrate.SUCCESS` on success. | ||||
|     function migrate() | ||||
|         external | ||||
|         returns (bytes4 success) | ||||
|     { | ||||
|         _registerFeatureFunction(this.sellEthForTokenToUniswapV3.selector); | ||||
|         _registerFeatureFunction(this.sellTokenForEthToUniswapV3.selector); | ||||
|         _registerFeatureFunction(this.sellTokenForTokenToUniswapV3.selector); | ||||
|         _registerFeatureFunction(this.uniswapV3SwapCallback.selector); | ||||
|         return LibMigrate.MIGRATE_SUCCESS; | ||||
|     } | ||||
|  | ||||
|     /// @dev Sell attached ETH directly against uniswap v3. | ||||
|     /// @param encodedPath Uniswap-encoded path, where the first token is WETH. | ||||
|     /// @param recipient The recipient of the bought tokens. Can be zero for sender. | ||||
|     /// @param minBuyAmount Minimum amount of the last token in the path to buy. | ||||
|     /// @return buyAmount Amount of the last token in the path bought. | ||||
|     function sellEthForTokenToUniswapV3( | ||||
|         bytes memory encodedPath, | ||||
|         uint256 minBuyAmount, | ||||
|         address recipient | ||||
|     ) | ||||
|         public | ||||
|         payable | ||||
|         override | ||||
|         returns (uint256 buyAmount) | ||||
|     { | ||||
|         // Wrap ETH. | ||||
|         WETH.deposit{ value: msg.value }(); | ||||
|         return _swap( | ||||
|             encodedPath, | ||||
|             msg.value, | ||||
|             minBuyAmount, | ||||
|             address(this), // we are payer because we hold the WETH | ||||
|             _normalizeRecipient(recipient) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Sell a token for ETH directly against uniswap v3. | ||||
|     /// @param encodedPath Uniswap-encoded path, where the last token is WETH. | ||||
|     /// @param sellAmount amount of the first token in the path to sell. | ||||
|     /// @param minBuyAmount Minimum amount of ETH to buy. | ||||
|     /// @param recipient The recipient of the bought tokens. Can be zero for sender. | ||||
|     /// @return buyAmount Amount of ETH bought. | ||||
|     function sellTokenForEthToUniswapV3( | ||||
|         bytes memory encodedPath, | ||||
|         uint256 sellAmount, | ||||
|         uint256 minBuyAmount, | ||||
|         address payable recipient | ||||
|     ) | ||||
|         public | ||||
|         override | ||||
|         returns (uint256 buyAmount) | ||||
|     { | ||||
|         buyAmount = _swap( | ||||
|             encodedPath, | ||||
|             sellAmount, | ||||
|             minBuyAmount, | ||||
|             msg.sender, | ||||
|             address(this) // we are recipient because we need to unwrap WETH | ||||
|         ); | ||||
|         WETH.withdraw(buyAmount); | ||||
|         // Transfer ETH to recipient. | ||||
|         (bool success, bytes memory revertData) = | ||||
|             _normalizeRecipient(recipient).call{ value: buyAmount }(""); | ||||
|         if (!success) { | ||||
|             revertData.rrevert(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Sell a token for another token directly against uniswap v3. | ||||
|     /// @param encodedPath Uniswap-encoded path. | ||||
|     /// @param sellAmount amount of the first token in the path to sell. | ||||
|     /// @param minBuyAmount Minimum amount of the last token in the path to buy. | ||||
|     /// @param recipient The recipient of the bought tokens. Can be zero for sender. | ||||
|     /// @return buyAmount Amount of the last token in the path bought. | ||||
|     function sellTokenForTokenToUniswapV3( | ||||
|         bytes memory encodedPath, | ||||
|         uint256 sellAmount, | ||||
|         uint256 minBuyAmount, | ||||
|         address recipient | ||||
|     ) | ||||
|         public | ||||
|         override | ||||
|         returns (uint256 buyAmount) | ||||
|     { | ||||
|         buyAmount = _swap( | ||||
|             encodedPath, | ||||
|             sellAmount, | ||||
|             minBuyAmount, | ||||
|             msg.sender, | ||||
|             _normalizeRecipient(recipient) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev The UniswapV3 pool swap callback which pays the funds requested | ||||
|     ///      by the caller/pool to the pool. Can only be called by a valid | ||||
|     ///      UniswapV3 pool. | ||||
|     /// @param amount0Delta Token0 amount owed. | ||||
|     /// @param amount1Delta Token1 amount owed. | ||||
|     /// @param data Arbitrary data forwarded from swap() caller. An ABI-encoded | ||||
|     ///        struct of: inputToken, outputToken, fee, payer | ||||
|     function uniswapV3SwapCallback( | ||||
|         int256 amount0Delta, | ||||
|         int256 amount1Delta, | ||||
|         bytes calldata data | ||||
|     ) | ||||
|         external | ||||
|         override | ||||
|     { | ||||
|         IERC20TokenV06 token0; | ||||
|         IERC20TokenV06 token1; | ||||
|         address payer; | ||||
|         { | ||||
|             uint24 fee; | ||||
|             // Decode the data. | ||||
|             require(data.length == SWAP_CALLBACK_DATA_SIZE, "UniswapFeature/INVALID_SWAP_CALLBACK_DATA"); | ||||
|             assembly { | ||||
|                 let p := add(36, calldataload(68)) | ||||
|                 token0 := calldataload(p) | ||||
|                 token1 := calldataload(add(p, 32)) | ||||
|                 fee := calldataload(add(p, 64)) | ||||
|                 payer := calldataload(add(p, 96)) | ||||
|             } | ||||
|             (token0, token1) = token0 < token1 | ||||
|                 ? (token0, token1) | ||||
|                 : (token1, token0); | ||||
|             // Only a valid pool contract can call this function. | ||||
|             require( | ||||
|                 msg.sender == address(_toPool(token0, fee, token1)), | ||||
|                 "UniswapV3Feature/INVALID_SWAP_CALLBACK_CALLER" | ||||
|             ); | ||||
|         } | ||||
|         // Pay the amount owed to the pool. | ||||
|         if (amount0Delta > 0) { | ||||
|             _pay(token0, payer, msg.sender, uint256(amount0Delta)); | ||||
|         } else if (amount1Delta > 0) { | ||||
|             _pay(token1, payer, msg.sender, uint256(amount1Delta)); | ||||
|         } else { | ||||
|             revert("UniswapV3Feature/INVALID_SWAP_AMOUNTS"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Executes successive swaps along an encoded uniswap path. | ||||
|     function _swap( | ||||
|         bytes memory encodedPath, | ||||
|         uint256 sellAmount, | ||||
|         uint256 minBuyAmount, | ||||
|         address payer, | ||||
|         address recipient | ||||
|     ) | ||||
|         private | ||||
|         returns (uint256 buyAmount) | ||||
|     { | ||||
|         if (sellAmount != 0) { | ||||
|             require(sellAmount <= uint256(type(int256).max), "UniswapV3Feature/SELL_AMOUNT_OVERFLOW"); | ||||
|  | ||||
|             // Perform a swap for each hop in the path. | ||||
|             bytes memory swapCallbackData = new bytes(SWAP_CALLBACK_DATA_SIZE); | ||||
|             while (true) { | ||||
|                 bool isPathMultiHop = _isPathMultiHop(encodedPath); | ||||
|                 bool zeroForOne; | ||||
|                 IUniswapV3Pool pool; | ||||
|                 { | ||||
|                     ( | ||||
|                         IERC20TokenV06 inputToken, | ||||
|                         uint24 fee, | ||||
|                         IERC20TokenV06 outputToken | ||||
|                     ) = _decodeFirstPoolInfoFromPath(encodedPath); | ||||
|                     pool = _toPool(inputToken, fee, outputToken); | ||||
|                     zeroForOne = inputToken < outputToken; | ||||
|                     _updateSwapCallbackData( | ||||
|                         swapCallbackData, | ||||
|                         inputToken, | ||||
|                         outputToken, | ||||
|                         fee, | ||||
|                         payer | ||||
|                     ); | ||||
|                 } | ||||
|                 (int256 amount0, int256 amount1) = pool.swap( | ||||
|                     // Intermediate tokens go to this contract. | ||||
|                     isPathMultiHop ? address(this) : recipient, | ||||
|                     zeroForOne, | ||||
|                     int256(sellAmount), | ||||
|                     zeroForOne | ||||
|                         ? MIN_PRICE_SQRT_RATIO + 1 | ||||
|                         : MAX_PRICE_SQRT_RATIO - 1, | ||||
|                     swapCallbackData | ||||
|                 ); | ||||
|                 { | ||||
|                     int256 _buyAmount = -(zeroForOne ? amount1 : amount0); | ||||
|                     require(_buyAmount >= 0, "UniswapV3Feature/INVALID_BUY_AMOUNT"); | ||||
|                     buyAmount = uint256(_buyAmount); | ||||
|                 } | ||||
|                 if (!isPathMultiHop) { | ||||
|                     // Done. | ||||
|                     break; | ||||
|                 } | ||||
|                 // Continue with next hop. | ||||
|                 payer = address(this); // Subsequent hops are paid for by us. | ||||
|                 sellAmount = buyAmount; | ||||
|                 // Skip to next hop along path. | ||||
|                 encodedPath = _shiftHopFromPathInPlace(encodedPath); | ||||
|             } | ||||
|         } | ||||
|         require(minBuyAmount <= buyAmount, "UniswapV3Feature/UNDERBOUGHT"); | ||||
|     } | ||||
|  | ||||
|     // Pay tokens from `payer` to `to`, using `transferFrom()` if | ||||
|     // `payer` != this contract. | ||||
|     function _pay( | ||||
|         IERC20TokenV06 token, | ||||
|         address payer, | ||||
|         address to, | ||||
|         uint256 amount | ||||
|     ) | ||||
|         private | ||||
|     { | ||||
|         if (payer != address(this)) { | ||||
|             _transferERC20TokensFrom(token, payer, to, amount); | ||||
|         } else { | ||||
|             _transferERC20Tokens(token, to, amount); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Update `swapCallbackData` in place with new values. | ||||
|     function _updateSwapCallbackData( | ||||
|         bytes memory swapCallbackData, | ||||
|         IERC20TokenV06 inputToken, | ||||
|         IERC20TokenV06 outputToken, | ||||
|         uint24 fee, | ||||
|         address payer | ||||
|     ) | ||||
|         private | ||||
|         pure | ||||
|     { | ||||
|         assembly { | ||||
|             let p := add(swapCallbackData, 32) | ||||
|             mstore(p, inputToken) | ||||
|             mstore(add(p, 32), outputToken) | ||||
|             mstore(add(p, 64), and(UINT24_MASK, fee)) | ||||
|             mstore(add(p, 96), and(ADDRESS_MASK, payer)) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Compute the pool address given two tokens and a fee. | ||||
|     function _toPool( | ||||
|         IERC20TokenV06 inputToken, | ||||
|         uint24 fee, | ||||
|         IERC20TokenV06 outputToken | ||||
|     ) | ||||
|         private | ||||
|         view | ||||
|         returns (IUniswapV3Pool pool) | ||||
|     { | ||||
|         // address(keccak256(abi.encodePacked( | ||||
|         //     hex"ff", | ||||
|         //     UNI_FACTORY_ADDRESS, | ||||
|         //     keccak256(abi.encode(inputToken, outputToken, fee)), | ||||
|         //     UNI_POOL_INIT_CODE_HASH | ||||
|         // ))) | ||||
|         bytes32 ffFactoryAddress = UNI_FF_FACTORY_ADDRESS; | ||||
|         bytes32 poolInitCodeHash = UNI_POOL_INIT_CODE_HASH; | ||||
|         (IERC20TokenV06 token0, IERC20TokenV06 token1) = inputToken < outputToken | ||||
|             ? (inputToken, outputToken) | ||||
|             : (outputToken, inputToken); | ||||
|         assembly { | ||||
|             let s := mload(0x40) | ||||
|             let p := s | ||||
|             mstore(p, ffFactoryAddress) | ||||
|             p := add(p, 21) | ||||
|             // Compute the inner hash in-place | ||||
|                 mstore(p, token0) | ||||
|                 mstore(add(p, 32), token1) | ||||
|                 mstore(add(p, 64), and(UINT24_MASK, fee)) | ||||
|                 mstore(p, keccak256(p, 96)) | ||||
|             p := add(p, 32) | ||||
|             mstore(p, poolInitCodeHash) | ||||
|             pool := and(ADDRESS_MASK, keccak256(s, 85)) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Return whether or not an encoded uniswap path contains more than one hop. | ||||
|     function _isPathMultiHop(bytes memory encodedPath) | ||||
|         private | ||||
|         pure | ||||
|         returns (bool isMultiHop) | ||||
|     { | ||||
|         return encodedPath.length > SINGLE_HOP_PATH_SIZE; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     // Return the first input token, output token, and fee of an encoded uniswap path. | ||||
|     function _decodeFirstPoolInfoFromPath(bytes memory encodedPath) | ||||
|         private | ||||
|         pure | ||||
|         returns ( | ||||
|             IERC20TokenV06 inputToken, | ||||
|             uint24 fee, | ||||
|             IERC20TokenV06 outputToken | ||||
|         ) | ||||
|     { | ||||
|         require(encodedPath.length >= SINGLE_HOP_PATH_SIZE, "UniswapV3Feature/BAD_PATH_ENCODING"); | ||||
|         assembly { | ||||
|             let p := add(encodedPath, 32) | ||||
|             inputToken := shr(96, mload(p)) | ||||
|             p := add(p, 20) | ||||
|             fee := shr(232, mload(p)) | ||||
|             p := add(p, 3) | ||||
|             outputToken := shr(96, mload(p)) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Skip past the first hop of an encoded uniswap path in-place. | ||||
|     function _shiftHopFromPathInPlace(bytes memory encodedPath) | ||||
|         private | ||||
|         pure | ||||
|         returns (bytes memory shiftedEncodedPath) | ||||
|     { | ||||
|         require(encodedPath.length >= PATH_SKIP_HOP_SIZE, "UniswapV3Feature/BAD_PATH_ENCODING"); | ||||
|         uint256 shiftSize = PATH_SKIP_HOP_SIZE; | ||||
|         uint256 newSize = encodedPath.length - shiftSize; | ||||
|         assembly { | ||||
|             shiftedEncodedPath := add(encodedPath, shiftSize) | ||||
|             mstore(shiftedEncodedPath, newSize) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Convert null address values to msg.sender. | ||||
|     function _normalizeRecipient(address recipient) | ||||
|         private | ||||
|         view | ||||
|         returns (address payable normalizedRecipient) | ||||
|     { | ||||
|         return recipient == address(0) ? msg.sender : payable(recipient); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,122 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2021 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "../libs/LibNativeOrder.sol"; | ||||
| import "../libs/LibSignature.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev Feature for interacting with OTC orders. | ||||
| interface IOtcOrdersFeature { | ||||
|  | ||||
|     /// @dev Emitted whenever an `OtcOrder` is filled. | ||||
|     /// @param orderHash The canonical hash of the order. | ||||
|     /// @param maker The maker of the order. | ||||
|     /// @param taker The taker of the order. | ||||
|     /// @param takerTokenFilledAmount How much taker token was filled. | ||||
|     /// @param makerTokenFilledAmount How much maker token was filled. | ||||
|     event OtcOrderFilled( | ||||
|         bytes32 orderHash, | ||||
|         address maker, | ||||
|         address taker, | ||||
|         address makerToken, | ||||
|         address takerToken, | ||||
|         uint128 takerTokenFilledAmount, | ||||
|         uint128 makerTokenFilledAmount | ||||
|     ); | ||||
|  | ||||
|     /// @dev Fill an OTC order for up to `takerTokenFillAmount` taker tokens. | ||||
|     /// @param order The OTC order. | ||||
|     /// @param makerSignature The order signature from the maker. | ||||
|     /// @param takerTokenFillAmount Maximum taker token amount to fill this | ||||
|     ///        order with. | ||||
|     /// @param unwrapWeth Whether or not to unwrap bought WETH into ETH | ||||
|     ///        before transferring it to the taker. Should be set to false | ||||
|     /// @return takerTokenFilledAmount How much taker token was filled. | ||||
|     /// @return makerTokenFilledAmount How much maker token was filled. | ||||
|     function fillOtcOrder( | ||||
|         LibNativeOrder.OtcOrder calldata order, | ||||
|         LibSignature.Signature calldata makerSignature, | ||||
|         uint128 takerTokenFillAmount, | ||||
|         bool unwrapWeth | ||||
|     ) | ||||
|         external | ||||
|         returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount); | ||||
|  | ||||
|     /// @dev Fill an OTC order whose taker token is WETH for up | ||||
|     ///      to `msg.value`. | ||||
|     /// @param order The OTC order. | ||||
|     /// @param makerSignature The order signature from the maker. | ||||
|     /// @return takerTokenFilledAmount How much taker token was filled. | ||||
|     /// @return makerTokenFilledAmount How much maker token was filled. | ||||
|     function fillOtcOrderWithEth( | ||||
|         LibNativeOrder.OtcOrder calldata order, | ||||
|         LibSignature.Signature calldata makerSignature | ||||
|     ) | ||||
|         external | ||||
|         payable | ||||
|         returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount); | ||||
|  | ||||
|     /// @dev Fully fill an OTC order. "Meta-transaction" variant, | ||||
|     ///      requires order to be signed by both maker and taker. | ||||
|     /// @param order The OTC order. | ||||
|     /// @param makerSignature The order signature from the maker. | ||||
|     /// @param takerSignature The order signature from the taker. | ||||
|     /// @param unwrapWeth Whether or not to unwrap bought WETH into ETH | ||||
|     ///        before transferring it to the taker. Should be set to false | ||||
|     ///        if the maker token is not WETH. | ||||
|     /// @return takerTokenFilledAmount How much taker token was filled. | ||||
|     /// @return makerTokenFilledAmount How much maker token was filled. | ||||
|     function fillTakerSignedOtcOrder( | ||||
|         LibNativeOrder.OtcOrder calldata order, | ||||
|         LibSignature.Signature calldata makerSignature, | ||||
|         LibSignature.Signature calldata takerSignature, | ||||
|         bool unwrapWeth | ||||
|     ) | ||||
|         external | ||||
|         returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount); | ||||
|  | ||||
|     /// @dev Get the order info for an OTC order. | ||||
|     /// @param order The OTC order. | ||||
|     /// @return orderInfo Info about the order. | ||||
|     function getOtcOrderInfo(LibNativeOrder.OtcOrder calldata order) | ||||
|         external | ||||
|         view | ||||
|         returns (LibNativeOrder.OtcOrderInfo memory orderInfo); | ||||
|  | ||||
|     /// @dev Get the canonical hash of an OTC order. | ||||
|     /// @param order The OTC order. | ||||
|     /// @return orderHash The order hash. | ||||
|     function getOtcOrderHash(LibNativeOrder.OtcOrder calldata order) | ||||
|         external | ||||
|         view | ||||
|         returns (bytes32 orderHash); | ||||
|  | ||||
|     /// @dev Get the last nonce used for a particular | ||||
|     ///      tx.origin address and nonce bucket. | ||||
|     /// @param txOrigin The address. | ||||
|     /// @param nonceBucket The nonce bucket index. | ||||
|     /// @return lastNonce The last nonce value used. | ||||
|     function lastOtcTxOriginNonce(address txOrigin, uint64 nonceBucket) | ||||
|         external | ||||
|         view | ||||
|         returns (uint128 lastNonce); | ||||
| } | ||||
| @@ -23,16 +23,21 @@ pragma experimental ABIEncoderV2; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev VIP PancakeSwap/BakerySwap/SushiSwap fill functions. | ||||
| /// @dev VIP PancakeSwap (and forks) fill functions. | ||||
| interface IPancakeSwapFeature { | ||||
|  | ||||
|     enum ProtocolFork { | ||||
|         PancakeSwap, | ||||
|         PancakeSwapV2, | ||||
|         BakerySwap, | ||||
|         SushiSwap | ||||
|         SushiSwap, | ||||
|         ApeSwap, | ||||
|         CafeSwap, | ||||
|         CheeseSwap, | ||||
|         JulSwap | ||||
|     } | ||||
|  | ||||
|     /// @dev Efficiently sell directly to PancakeSwap/BakerySwap/Sushiswap. | ||||
|     /// @dev Efficiently sell directly to PancakeSwap (and forks). | ||||
|     /// @param tokens Sell path. | ||||
|     /// @param sellAmount of `tokens[0]` Amount to sell. | ||||
|     /// @param minBuyAmount Minimum amount of `tokens[-1]` to buy. | ||||
|   | ||||
| @@ -0,0 +1,86 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev VIP uniswap v3 fill functions. | ||||
| interface IUniswapV3Feature { | ||||
|  | ||||
|     /// @dev Sell attached ETH directly against uniswap v3. | ||||
|     /// @param encodedPath Uniswap-encoded path, where the first token is WETH. | ||||
|     /// @param minBuyAmount Minimum amount of the last token in the path to buy. | ||||
|     /// @param recipient The recipient of the bought tokens. Can be zero for sender. | ||||
|     /// @return buyAmount Amount of the last token in the path bought. | ||||
|     function sellEthForTokenToUniswapV3( | ||||
|         bytes memory encodedPath, | ||||
|         uint256 minBuyAmount, | ||||
|         address recipient | ||||
|     ) | ||||
|         external | ||||
|         payable | ||||
|         returns (uint256 buyAmount); | ||||
|  | ||||
|     /// @dev Sell a token for ETH directly against uniswap v3. | ||||
|     /// @param encodedPath Uniswap-encoded path, where the last token is WETH. | ||||
|     /// @param sellAmount amount of the first token in the path to sell. | ||||
|     /// @param minBuyAmount Minimum amount of ETH to buy. | ||||
|     /// @param recipient The recipient of the bought tokens. Can be zero for sender. | ||||
|     /// @return buyAmount Amount of ETH bought. | ||||
|     function sellTokenForEthToUniswapV3( | ||||
|         bytes memory encodedPath, | ||||
|         uint256 sellAmount, | ||||
|         uint256 minBuyAmount, | ||||
|         address payable recipient | ||||
|     ) | ||||
|         external | ||||
|         returns (uint256 buyAmount); | ||||
|  | ||||
|     /// @dev Sell a token for another token directly against uniswap v3. | ||||
|     /// @param encodedPath Uniswap-encoded path. | ||||
|     /// @param sellAmount amount of the first token in the path to sell. | ||||
|     /// @param minBuyAmount Minimum amount of the last token in the path to buy. | ||||
|     /// @param recipient The recipient of the bought tokens. Can be zero for sender. | ||||
|     /// @return buyAmount Amount of the last token in the path bought. | ||||
|     function sellTokenForTokenToUniswapV3( | ||||
|         bytes memory encodedPath, | ||||
|         uint256 sellAmount, | ||||
|         uint256 minBuyAmount, | ||||
|         address recipient | ||||
|     ) | ||||
|         external | ||||
|         returns (uint256 buyAmount); | ||||
|  | ||||
|     /// @dev The UniswapV3 pool swap callback which pays the funds requested | ||||
|     ///      by the caller/pool to the pool. Can only be called by a valid | ||||
|     ///      UniswapV3 pool. | ||||
|     /// @param amount0Delta Token0 amount owed. | ||||
|     /// @param amount1Delta Token1 amount owed. | ||||
|     /// @param data Arbitrary data forwarded from swap() caller. An ABI-encoded | ||||
|     ///        struct of: inputToken, outputToken, fee, payer | ||||
|     function uniswapV3SwapCallback( | ||||
|         int256 amount0Delta, | ||||
|         int256 amount1Delta, | ||||
|         bytes calldata data | ||||
|     ) | ||||
|         external; | ||||
| } | ||||
| @@ -69,6 +69,18 @@ library LibNativeOrder { | ||||
|         uint256 salt; | ||||
|     } | ||||
|  | ||||
|     /// @dev An OTC limit order. | ||||
|     struct OtcOrder { | ||||
|         IERC20TokenV06 makerToken; | ||||
|         IERC20TokenV06 takerToken; | ||||
|         uint128 makerAmount; | ||||
|         uint128 takerAmount; | ||||
|         address maker; | ||||
|         address taker; | ||||
|         address txOrigin; | ||||
|         uint256 expiryAndNonce; // [uint64 expiry, uint64 nonceBucket, uint128 nonce] | ||||
|     } | ||||
|  | ||||
|     /// @dev Info on a limit or RFQ order. | ||||
|     struct OrderInfo { | ||||
|         bytes32 orderHash; | ||||
| @@ -76,6 +88,12 @@ library LibNativeOrder { | ||||
|         uint128 takerTokenFilledAmount; | ||||
|     } | ||||
|  | ||||
|     /// @dev Info on an OTC order. | ||||
|     struct OtcOrderInfo { | ||||
|         bytes32 orderHash; | ||||
|         OrderStatus status; | ||||
|     } | ||||
|  | ||||
|     uint256 private constant UINT_128_MASK = (1 << 128) - 1; | ||||
|     uint256 private constant UINT_64_MASK = (1 << 64) - 1; | ||||
|     uint256 private constant ADDRESS_MASK = (1 << 160) - 1; | ||||
| @@ -118,6 +136,22 @@ library LibNativeOrder { | ||||
|     uint256 private constant _RFQ_ORDER_TYPEHASH = | ||||
|         0xe593d3fdfa8b60e5e17a1b2204662ecbe15c23f2084b9ad5bae40359540a7da9; | ||||
|  | ||||
|     // The type hash for OTC orders, which is: | ||||
|     // keccak256(abi.encodePacked( | ||||
|     //     "OtcOrder(", | ||||
|     //       "address makerToken,", | ||||
|     //       "address takerToken,", | ||||
|     //       "uint128 makerAmount,", | ||||
|     //       "uint128 takerAmount,", | ||||
|     //       "address maker,", | ||||
|     //       "address taker,", | ||||
|     //       "address txOrigin,", | ||||
|     //       "uint256 expiryAndNonce" | ||||
|     //     ")" | ||||
|     // )) | ||||
|     uint256 private constant _OTC_ORDER_TYPEHASH = | ||||
|         0x2f754524de756ae72459efbe1ec88c19a745639821de528ac3fb88f9e65e35c8; | ||||
|  | ||||
|     /// @dev Get the struct hash of a limit order. | ||||
|     /// @param order The limit order. | ||||
|     /// @return structHash The struct hash of the order. | ||||
| @@ -222,6 +256,49 @@ library LibNativeOrder { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Get the struct hash of an OTC order. | ||||
|     /// @param order The OTC order. | ||||
|     /// @return structHash The struct hash of the order. | ||||
|     function getOtcOrderStructHash(OtcOrder memory order) | ||||
|         internal | ||||
|         pure | ||||
|         returns (bytes32 structHash) | ||||
|     { | ||||
|         // The struct hash is: | ||||
|         // keccak256(abi.encode( | ||||
|         //   TYPE_HASH, | ||||
|         //   order.makerToken, | ||||
|         //   order.takerToken, | ||||
|         //   order.makerAmount, | ||||
|         //   order.takerAmount, | ||||
|         //   order.maker, | ||||
|         //   order.taker, | ||||
|         //   order.txOrigin, | ||||
|         //   order.expiryAndNonce, | ||||
|         // )) | ||||
|         assembly { | ||||
|             let mem := mload(0x40) | ||||
|             mstore(mem, _OTC_ORDER_TYPEHASH) | ||||
|             // order.makerToken; | ||||
|             mstore(add(mem, 0x20), and(ADDRESS_MASK, mload(order))) | ||||
|             // order.takerToken; | ||||
|             mstore(add(mem, 0x40), and(ADDRESS_MASK, mload(add(order, 0x20)))) | ||||
|             // order.makerAmount; | ||||
|             mstore(add(mem, 0x60), and(UINT_128_MASK, mload(add(order, 0x40)))) | ||||
|             // order.takerAmount; | ||||
|             mstore(add(mem, 0x80), and(UINT_128_MASK, mload(add(order, 0x60)))) | ||||
|             // order.maker; | ||||
|             mstore(add(mem, 0xA0), and(ADDRESS_MASK, mload(add(order, 0x80)))) | ||||
|             // order.taker; | ||||
|             mstore(add(mem, 0xC0), and(ADDRESS_MASK, mload(add(order, 0xA0)))) | ||||
|             // order.txOrigin; | ||||
|             mstore(add(mem, 0xE0), and(ADDRESS_MASK, mload(add(order, 0xC0)))) | ||||
|             // order.expiryAndNonce; | ||||
|             mstore(add(mem, 0x100), mload(add(order, 0xE0))) | ||||
|             structHash := keccak256(mem, 0x120) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Refund any leftover protocol fees in `msg.value` to `msg.sender`. | ||||
|     /// @param ethProtocolFeePaid How much ETH was paid in protocol fees. | ||||
|     function refundExcessProtocolFeeToSender(uint256 ethProtocolFeePaid) | ||||
|   | ||||
| @@ -404,7 +404,7 @@ abstract contract NativeOrdersSettlement is | ||||
|                 params.order.takerAmount, | ||||
|                 params.order.takerTokenFeeAmount | ||||
|             )); | ||||
|             _transferERC20Tokens( | ||||
|             _transferERC20TokensFrom( | ||||
|                 params.order.takerToken, | ||||
|                 params.taker, | ||||
|                 params.order.feeRecipient, | ||||
| @@ -550,7 +550,7 @@ abstract contract NativeOrdersSettlement is | ||||
|                 settleInfo.takerTokenFilledAmount.safeAdd128(takerTokenFilledAmount); | ||||
|  | ||||
|         // Transfer taker -> maker. | ||||
|         _transferERC20Tokens( | ||||
|         _transferERC20TokensFrom( | ||||
|             settleInfo.takerToken, | ||||
|             settleInfo.taker, | ||||
|             settleInfo.maker, | ||||
| @@ -558,7 +558,7 @@ abstract contract NativeOrdersSettlement is | ||||
|         ); | ||||
|  | ||||
|         // Transfer maker -> taker. | ||||
|         _transferERC20Tokens( | ||||
|         _transferERC20TokensFrom( | ||||
|             settleInfo.makerToken, | ||||
|             settleInfo.maker, | ||||
|             settleInfo.taker, | ||||
|   | ||||
| @@ -35,7 +35,7 @@ abstract contract FixinTokenSpender { | ||||
|     /// @param owner The owner of the tokens. | ||||
|     /// @param to The recipient of the tokens. | ||||
|     /// @param amount The amount of `token` to transfer. | ||||
|     function _transferERC20Tokens( | ||||
|     function _transferERC20TokensFrom( | ||||
|         IERC20TokenV06 token, | ||||
|         address owner, | ||||
|         address to, | ||||
| @@ -87,6 +87,60 @@ abstract contract FixinTokenSpender { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Transfers ERC20 tokens from ourselves to `to`. | ||||
|     /// @param token The token to spend. | ||||
|     /// @param to The recipient of the tokens. | ||||
|     /// @param amount The amount of `token` to transfer. | ||||
|     function _transferERC20Tokens( | ||||
|         IERC20TokenV06 token, | ||||
|         address to, | ||||
|         uint256 amount | ||||
|     ) | ||||
|         internal | ||||
|     { | ||||
|         require(address(token) != address(this), "FixinTokenSpender/CANNOT_INVOKE_SELF"); | ||||
|  | ||||
|         assembly { | ||||
|             let ptr := mload(0x40) // free memory pointer | ||||
|  | ||||
|             // selector for transfer(address,uint256) | ||||
|             mstore(ptr, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) | ||||
|             mstore(add(ptr, 0x04), and(to, ADDRESS_MASK)) | ||||
|             mstore(add(ptr, 0x24), amount) | ||||
|  | ||||
|             let success := call( | ||||
|                 gas(), | ||||
|                 and(token, ADDRESS_MASK), | ||||
|                 0, | ||||
|                 ptr, | ||||
|                 0x44, | ||||
|                 ptr, | ||||
|                 32 | ||||
|             ) | ||||
|  | ||||
|             let rdsize := returndatasize() | ||||
|  | ||||
|             // Check for ERC20 success. ERC20 tokens should return a boolean, | ||||
|             // but some don't. We accept 0-length return data as success, or at | ||||
|             // least 32 bytes that starts with a 32-byte boolean true. | ||||
|             success := and( | ||||
|                 success,                             // call itself succeeded | ||||
|                 or( | ||||
|                     iszero(rdsize),                  // no return data, or | ||||
|                     and( | ||||
|                         iszero(lt(rdsize, 32)),      // at least 32 bytes | ||||
|                         eq(mload(ptr), 1)            // starts with uint256(1) | ||||
|                     ) | ||||
|                 ) | ||||
|             ) | ||||
|  | ||||
|             if iszero(success) { | ||||
|                 returndatacopy(ptr, 0, rdsize) | ||||
|                 revert(ptr, rdsize) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Gets the maximum amount of an ERC20 token `token` that can be | ||||
|     ///      pulled from `owner` by this address. | ||||
|     /// @param token The token to spend. | ||||
|   | ||||
| @@ -0,0 +1,45 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./LibStorage.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev Storage helpers for `OtcOrdersFeature`. | ||||
| library LibOtcOrdersStorage { | ||||
|  | ||||
|     /// @dev Storage bucket for this feature. | ||||
|     struct Storage { | ||||
|         // tx origin => nonce buckets => min nonce | ||||
|         mapping(address => mapping(uint64 => uint128)) txOriginNonces; | ||||
|     } | ||||
|  | ||||
|     /// @dev Get the storage bucket for this contract. | ||||
|     function getStorage() internal pure returns (Storage storage stor) { | ||||
|         uint256 storageSlot = LibStorage.getStorageSlot( | ||||
|             LibStorage.StorageId.OtcOrders | ||||
|         ); | ||||
|         // Dip into assembly to change the slot pointed to by the local | ||||
|         // variable `stor`. | ||||
|         // See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries | ||||
|         assembly { stor_slot := storageSlot } | ||||
|     } | ||||
| } | ||||
| @@ -38,7 +38,8 @@ library LibStorage { | ||||
|         TransformERC20, | ||||
|         MetaTransactions, | ||||
|         ReentrancyGuard, | ||||
|         NativeOrders | ||||
|         NativeOrders, | ||||
|         OtcOrders | ||||
|     } | ||||
|  | ||||
|     /// @dev Get the storage slot given a storage ID. We assign unique, well-spaced | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user