Compare commits
	
		
			121 Commits
		
	
	
		
			@0x/contra
			...
			protocol@7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					719664c145 | ||
| 
						 | 
					f800d6c24c | ||
| 
						 | 
					a9a81bcafb | ||
| 
						 | 
					4280307a15 | ||
| 
						 | 
					7b57d3ae51 | ||
| 
						 | 
					8a8a5bbda0 | ||
| 
						 | 
					76987c8db1 | ||
| 
						 | 
					6f8971cc42 | ||
| 
						 | 
					71ab882143 | ||
| 
						 | 
					5a4961c8d9 | ||
| 
						 | 
					4c4fb99d87 | ||
| 
						 | 
					872abf09e9 | ||
| 
						 | 
					f10bfe7d04 | ||
| 
						 | 
					a74d8deff3 | ||
| 
						 | 
					835ee4e8de | ||
| 
						 | 
					63ec42303f | ||
| 
						 | 
					f789aebddc | ||
| 
						 | 
					efd83be779 | ||
| 
						 | 
					603bc1d51c | ||
| 
						 | 
					32a930a7fc | ||
| 
						 | 
					f464bf68d7 | ||
| 
						 | 
					ebdc4fb509 | ||
| 
						 | 
					7580719586 | ||
| 
						 | 
					aba9db2be7 | ||
| 
						 | 
					a6680411c8 | ||
| 
						 | 
					0d0e87de94 | ||
| 
						 | 
					ccf2000c09 | ||
| 
						 | 
					3eb2e0f56a | ||
| 
						 | 
					d07c7d5b69 | ||
| 
						 | 
					adf6684c29 | ||
| 
						 | 
					9bf889aa30 | ||
| 
						 | 
					e81c88564e | ||
| 
						 | 
					901d400d62 | ||
| 
						 | 
					289474e2ce | ||
| 
						 | 
					407ca21168 | ||
| 
						 | 
					5c68fc24d2 | ||
| 
						 | 
					548800e0a9 | ||
| 
						 | 
					bde3d6dc6a | ||
| 
						 | 
					56550a6acc | ||
| 
						 | 
					e51b83accc | ||
| 
						 | 
					d5ae971f1c | ||
| 
						 | 
					5a2f5f9a42 | ||
| 
						 | 
					75a3b70cef | ||
| 
						 | 
					803cf65ba1 | ||
| 
						 | 
					5d3947b838 | ||
| 
						 | 
					4397a59008 | ||
| 
						 | 
					966d54c935 | ||
| 
						 | 
					234ddb495d | ||
| 
						 | 
					a744acc7bc | ||
| 
						 | 
					27c624633c | ||
| 
						 | 
					7ef75101b4 | ||
| 
						 | 
					6f8aace00d | ||
| 
						 | 
					6c264b2f18 | ||
| 
						 | 
					df055e1958 | ||
| 
						 | 
					70d2117470 | ||
| 
						 | 
					2c173ccaf3 | ||
| 
						 | 
					d2f4a0c5f3 | ||
| 
						 | 
					0d6021e5e3 | ||
| 
						 | 
					bb04726e7f | ||
| 
						 | 
					220ca370c2 | ||
| 
						 | 
					63af4e3e98 | ||
| 
						 | 
					9754e12d82 | ||
| 
						 | 
					d72ebed246 | ||
| 
						 | 
					587fc71058 | ||
| 
						 | 
					7d34e09a12 | ||
| 
						 | 
					7d15baad0f | ||
| 
						 | 
					1e6476ada7 | ||
| 
						 | 
					1d6ca5f6b5 | ||
| 
						 | 
					fb249f02fc | ||
| 
						 | 
					fdf04ef275 | ||
| 
						 | 
					b0f5f634f2 | ||
| 
						 | 
					6ee0108565 | ||
| 
						 | 
					c73097e688 | ||
| 
						 | 
					a2d42b07b5 | ||
| 
						 | 
					f9a794af93 | ||
| 
						 | 
					a2643674ca | ||
| 
						 | 
					c00ce9daac | ||
| 
						 | 
					c68b5d7844 | ||
| 
						 | 
					09ed106d4c | ||
| 
						 | 
					a6b92fc658 | ||
| 
						 | 
					4be4a1a30b | ||
| 
						 | 
					9bede5d331 | ||
| 
						 | 
					b50d4aee6d | ||
| 
						 | 
					55bc367bd6 | ||
| 
						 | 
					7a59b7eafe | ||
| 
						 | 
					9e59d41e44 | ||
| 
						 | 
					475e6c7bca | ||
| 
						 | 
					dbc5a5293e | ||
| 
						 | 
					f4bd2bd0d8 | ||
| 
						 | 
					f1782a83ba | ||
| 
						 | 
					cbade0d558 | ||
| 
						 | 
					fe0c26387c | ||
| 
						 | 
					c03a014740 | ||
| 
						 | 
					84e6d788aa | ||
| 
						 | 
					cd296b8767 | ||
| 
						 | 
					5946d32a7d | ||
| 
						 | 
					842dd8572b | ||
| 
						 | 
					33e260f9db | ||
| 
						 | 
					c44f8d0060 | ||
| 
						 | 
					411548a33e | ||
| 
						 | 
					9a17ce1383 | ||
| 
						 | 
					2b120d0669 | ||
| 
						 | 
					6d877d5242 | ||
| 
						 | 
					e4abd690e7 | ||
| 
						 | 
					2a194384b6 | ||
| 
						 | 
					1e069e6f8a | ||
| 
						 | 
					a019bb913d | ||
| 
						 | 
					9ce73931f7 | ||
| 
						 | 
					97020df178 | ||
| 
						 | 
					dfb7b3de8f | ||
| 
						 | 
					9e152912fe | ||
| 
						 | 
					b2c2f1e1aa | ||
| 
						 | 
					629c7d8e92 | ||
| 
						 | 
					62f24d4356 | ||
| 
						 | 
					ae281c33ca | ||
| 
						 | 
					5d034dd106 | ||
| 
						 | 
					c1f8df0eca | ||
| 
						 | 
					76dda9eeda | ||
| 
						 | 
					a9b84a92ac | ||
| 
						 | 
					0f7e881899 | ||
| 
						 | 
					6045f777ab | 
@@ -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,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "3.7.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "3.7.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "3.7.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "3.7.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "3.7.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "3.7.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "3.7.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "3.7.9",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.7.16 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.15 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.14 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.13 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.12 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.11 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.10 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.9 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-asset-proxy",
 | 
			
		||||
    "version": "3.7.9",
 | 
			
		||||
    "version": "3.7.16",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -51,15 +51,15 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.15.0",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.17.2",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -67,7 +67,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "ethereumjs-util": "^7.0.10",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
@@ -79,17 +79,17 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.27",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.27",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.27",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.34",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.34",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.34",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -168,7 +168,7 @@ describe('StaticCallProxy', () => {
 | 
			
		||||
        it('should revert if the hash of the output is different than expected expected', async () => {
 | 
			
		||||
            const staticCallData = staticCallTarget.isOddNumber(new BigNumber(0)).getABIEncodedTransactionData();
 | 
			
		||||
            const trueAsBuffer = ethUtil.toBuffer('0x0000000000000000000000000000000000000000000000000000000000000001');
 | 
			
		||||
            const expectedResultHash = ethUtil.bufferToHex(ethUtil.sha3(trueAsBuffer));
 | 
			
		||||
            const expectedResultHash = ethUtil.bufferToHex(ethUtil.keccak256(trueAsBuffer));
 | 
			
		||||
            const assetData = assetDataInterface
 | 
			
		||||
                .StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
 | 
			
		||||
                .getABIEncodedTransactionData();
 | 
			
		||||
@@ -199,7 +199,7 @@ describe('StaticCallProxy', () => {
 | 
			
		||||
        it('should be successful if a function call with one static input returns the correct value', async () => {
 | 
			
		||||
            const staticCallData = staticCallTarget.isOddNumber(new BigNumber(1)).getABIEncodedTransactionData();
 | 
			
		||||
            const trueAsBuffer = ethUtil.toBuffer('0x0000000000000000000000000000000000000000000000000000000000000001');
 | 
			
		||||
            const expectedResultHash = ethUtil.bufferToHex(ethUtil.sha3(trueAsBuffer));
 | 
			
		||||
            const expectedResultHash = ethUtil.bufferToHex(ethUtil.keccak256(trueAsBuffer));
 | 
			
		||||
            const assetData = assetDataInterface
 | 
			
		||||
                .StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
 | 
			
		||||
                .getABIEncodedTransactionData();
 | 
			
		||||
@@ -232,7 +232,7 @@ describe('StaticCallProxy', () => {
 | 
			
		||||
            const offset = '0000000000000000000000000000000000000000000000000000000000000020';
 | 
			
		||||
            const encodedExpectedResultWithOffset = `0x${offset}${abiEncoder.encode(expectedResults).slice(2)}`;
 | 
			
		||||
            const expectedResultHash = ethUtil.bufferToHex(
 | 
			
		||||
                ethUtil.sha3(ethUtil.toBuffer(encodedExpectedResultWithOffset)),
 | 
			
		||||
                ethUtil.keccak256(ethUtil.toBuffer(encodedExpectedResultWithOffset)),
 | 
			
		||||
            );
 | 
			
		||||
            const assetData = assetDataInterface
 | 
			
		||||
                .StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "1.1.34",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "1.1.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "1.1.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "1.1.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "1.1.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "1.1.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "1.1.28",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "1.1.27",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v1.1.34 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.33 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.32 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.31 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.30 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.29 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.28 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.27 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-broker",
 | 
			
		||||
    "version": "1.1.27",
 | 
			
		||||
    "version": "1.1.34",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -51,20 +51,20 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.27",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.28",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.27",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.34",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.35",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.34",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -84,11 +84,11 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "ethereum-types": "^3.5.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,10 @@ export interface GodsUnchainedProperties {
 | 
			
		||||
    quality: BigNumber | number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const propertyDataEncoder = AbiEncoder.create([{ name: 'proto', type: 'uint16' }, { name: 'quality', type: 'uint8' }]);
 | 
			
		||||
const propertyDataEncoder = AbiEncoder.create([
 | 
			
		||||
    { name: 'proto', type: 'uint16' },
 | 
			
		||||
    { name: 'quality', type: 'uint8' },
 | 
			
		||||
]);
 | 
			
		||||
const brokerDataEncoder = AbiEncoder.create([
 | 
			
		||||
    { name: 'godsUnchainedAddress', type: 'address' },
 | 
			
		||||
    { name: 'validatorAddress', type: 'address' },
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "3.1.35",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "3.1.34",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "3.1.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "3.1.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "3.1.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "3.1.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "3.1.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "3.1.28",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.1.35 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.34 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.33 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.32 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.31 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.30 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.29 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.28 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-coordinator",
 | 
			
		||||
    "version": "3.1.28",
 | 
			
		||||
    "version": "3.1.35",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,17 +52,17 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.26",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.33",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -82,17 +82,17 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/assert": "^3.0.21",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contract-addresses": "^6.0.0",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.28",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/json-schemas": "^5.4.1",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "@0x/assert": "^3.0.27",
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/contract-addresses": "^6.4.0",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.35",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/json-schemas": "^6.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "http-status-codes": "^1.3.2"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,4 @@
 | 
			
		||||
import { assert as sharedAssert } from '@0x/assert';
 | 
			
		||||
// HACK: We need those two unused imports because they're actually used by sharedAssert which gets injected here
 | 
			
		||||
import { Schema } from '@0x/json-schemas'; // tslint:disable-line:no-unused-variable
 | 
			
		||||
import { Order } from '@0x/types'; // tslint:disable-line:no-unused-variable
 | 
			
		||||
import { BigNumber } from '@0x/utils'; // tslint:disable-line:no-unused-variable
 | 
			
		||||
import { Web3Wrapper } from '@0x/web3-wrapper';
 | 
			
		||||
 | 
			
		||||
export const assert = {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "1.3.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "1.3.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "1.3.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "1.3.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "1.3.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "1.3.28",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "1.3.27",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "1.3.26",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v1.3.33 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.32 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.31 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.30 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.29 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.28 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.27 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.26 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-dev-utils",
 | 
			
		||||
    "version": "1.3.26",
 | 
			
		||||
    "version": "1.3.33",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -41,18 +41,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/dev-utils",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/assert": "^3.0.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/assert": "^3.0.27",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "ethers": "~4.0.4",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
        "shx": "^0.2.2",
 | 
			
		||||
@@ -63,7 +63,7 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@types/node": "12.12.54"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "2.1.34",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "2.1.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "2.1.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "2.1.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "2.1.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "2.1.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "2.1.28",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "2.1.27",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v2.1.34 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.33 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.32 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.31 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.30 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.29 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.28 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.27 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-erc1155",
 | 
			
		||||
    "version": "2.1.27",
 | 
			
		||||
    "version": "2.1.34",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,15 +52,15 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -68,7 +68,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
@@ -80,10 +80,10 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "3.3.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "3.3.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "3.3.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "3.3.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "3.3.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "3.3.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "3.3.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "3.3.6",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.3.13 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.12 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.11 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.10 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.9 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.8 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.7 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.3.6 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-erc20",
 | 
			
		||||
    "version": "3.3.6",
 | 
			
		||||
    "version": "3.3.13",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -51,18 +51,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -70,7 +70,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -82,7 +82,7 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18"
 | 
			
		||||
        "@0x/base-contract": "^6.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "3.1.34",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "3.1.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "3.1.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "3.1.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "3.1.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "3.1.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "3.1.28",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "3.1.27",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.1.34 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.33 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.32 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.31 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.30 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.29 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.28 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.27 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-erc721",
 | 
			
		||||
    "version": "3.1.27",
 | 
			
		||||
    "version": "3.1.34",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,18 +52,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -71,7 +71,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -84,7 +84,7 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18"
 | 
			
		||||
        "@0x/base-contract": "^6.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "4.2.35",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "4.2.34",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "4.2.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "4.2.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "4.2.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "4.2.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "4.2.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "4.2.28",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.2.35 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.34 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.33 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.32 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.31 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.30 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.29 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.28 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-exchange-forwarder",
 | 
			
		||||
    "version": "4.2.28",
 | 
			
		||||
    "version": "4.2.35",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,25 +52,25 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.26",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.27",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.27",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.28",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.27",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.33",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.34",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.34",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.35",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.34",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -90,9 +90,9 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "ethereum-types": "^3.5.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "4.3.34",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "4.3.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "4.3.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "4.3.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "4.3.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "4.3.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "4.3.28",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "4.3.27",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.3.34 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.33 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.32 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.31 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.30 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.29 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.28 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.27 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-exchange-libs",
 | 
			
		||||
    "version": "4.3.27",
 | 
			
		||||
    "version": "4.3.34",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,14 +52,14 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/libs",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/subproviders": "^6.4.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/subproviders": "^6.5.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -67,7 +67,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "ethereumjs-util": "^7.0.10",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -80,14 +80,14 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "ethereum-types": "^3.5.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "3.2.35",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "3.2.34",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "3.2.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "3.2.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "3.2.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "3.2.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "3.2.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "3.2.28",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.2.35 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.34 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.33 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.32 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.31 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.30 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.29 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.28 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-exchange",
 | 
			
		||||
    "version": "3.2.28",
 | 
			
		||||
    "version": "3.2.35",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,21 +52,21 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.27",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.28",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.35",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.34",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.35",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.42",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -74,8 +74,8 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "ethereumjs-util": "^7.0.10",
 | 
			
		||||
        "js-combinatorics": "^0.5.3",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -88,13 +88,13 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.26",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.27",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.27",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.33",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.34",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.34",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,11 @@ export const exchangeDataEncoder = {
 | 
			
		||||
                .getABIEncodedTransactionData();
 | 
			
		||||
        } else if (constants.BATCH_FILL_FN_NAMES.indexOf(fnName) !== -1) {
 | 
			
		||||
            data = (exchangeInstance as any)
 | 
			
		||||
                [fnName](orders, orders.map(order => order.takerAssetAmount), orders.map(order => order.signature))
 | 
			
		||||
                [fnName](
 | 
			
		||||
                    orders,
 | 
			
		||||
                    orders.map(order => order.takerAssetAmount),
 | 
			
		||||
                    orders.map(order => order.signature),
 | 
			
		||||
                )
 | 
			
		||||
                .getABIEncodedTransactionData();
 | 
			
		||||
        } else if (constants.MARKET_FILL_FN_NAMES.indexOf(fnName) !== -1) {
 | 
			
		||||
            const fillAsset = /Buy/.test(fnName) ? 'makerAssetAmount' : 'takerAssetAmount';
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,10 @@ blockchainTests.resets('Reentrancy Tests', env => {
 | 
			
		||||
        // Handle tuples.
 | 
			
		||||
        if (item.type === 'tuple') {
 | 
			
		||||
            const tuple = item as TupleDataItem;
 | 
			
		||||
            return _.zipObject(tuple.components.map(c => c.name), tuple.components.map(createFunctionInputs));
 | 
			
		||||
            return _.zipObject(
 | 
			
		||||
                tuple.components.map(c => c.name),
 | 
			
		||||
                tuple.components.map(createFunctionInputs),
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        // Handle strings.
 | 
			
		||||
        if (item.type === 'string') {
 | 
			
		||||
 
 | 
			
		||||
@@ -86,7 +86,7 @@ blockchainTests.resets('MixinSignatureValidator', env => {
 | 
			
		||||
 | 
			
		||||
    const SIGNATURE_LENGTH = 65;
 | 
			
		||||
    const generateRandomSignature = (): string => hexUtils.random(SIGNATURE_LENGTH);
 | 
			
		||||
    const hashBytes = (bytesHex: string): string => ethUtil.bufferToHex(ethUtil.sha3(ethUtil.toBuffer(bytesHex)));
 | 
			
		||||
    const hashBytes = (bytesHex: string): string => hexUtils.hash(bytesHex);
 | 
			
		||||
    const signDataHex = (dataHex: string, privateKey: Buffer): string => {
 | 
			
		||||
        const ecSignature = ethUtil.ecsign(ethUtil.toBuffer(dataHex), privateKey);
 | 
			
		||||
        return hexUtils.concat(ecSignature.v, ecSignature.r, ecSignature.s);
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@ import { ReferenceFunctions as UtilReferenceFunctions, SafeMathRevertErrors } fr
 | 
			
		||||
import { FillResults, Order } from '@0x/types';
 | 
			
		||||
import { AnyRevertError, BigNumber, ExchangeRevertErrors, hexUtils, StringRevertError } from '@0x/utils';
 | 
			
		||||
import { LogEntry, LogWithDecodedArgs } from 'ethereum-types';
 | 
			
		||||
import * as ethjs from 'ethereumjs-util';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { artifacts } from './artifacts';
 | 
			
		||||
@@ -104,7 +103,7 @@ blockchainTests('Exchange wrapper functions unit tests.', env => {
 | 
			
		||||
    // Creates a deterministic order signature, even though no signature validation
 | 
			
		||||
    // actually occurs in the test contract.
 | 
			
		||||
    function createOrderSignature(order: Order): string {
 | 
			
		||||
        return ethjs.bufferToHex(ethjs.sha3(ethjs.toBuffer(orderHashUtils.getOrderHashHex(order))));
 | 
			
		||||
        return hexUtils.hash(orderHashUtils.getOrderHashHex(order));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Asserts that `_fillOrder()` was called in the same order and with the same
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "6.2.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "6.2.28",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "6.2.27",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "6.2.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "6.2.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "6.2.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "6.2.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "6.2.22",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v6.2.29 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.28 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.27 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.26 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.25 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.24 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.23 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.22 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-extensions",
 | 
			
		||||
    "version": "6.2.22",
 | 
			
		||||
    "version": "6.2.29",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,23 +52,23 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.26",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.27",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.28",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.27",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.33",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.34",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.35",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.34",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -77,7 +77,7 @@
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereumjs-abi": "0.6.5",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "ethereumjs-util": "^7.0.10",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -90,10 +90,10 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "ethereum-types": "^3.5.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-integrations",
 | 
			
		||||
    "version": "2.7.30",
 | 
			
		||||
    "version": "2.7.57",
 | 
			
		||||
    "private": true,
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
@@ -52,25 +52,25 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contract-addresses": "^6.0.0",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.15.0",
 | 
			
		||||
        "@0x/contracts-broker": "^1.1.27",
 | 
			
		||||
        "@0x/contracts-coordinator": "^3.1.28",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.26",
 | 
			
		||||
        "@0x/contracts-exchange-forwarder": "^4.2.28",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.27",
 | 
			
		||||
        "@0x/contracts-extensions": "^6.2.22",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contract-addresses": "^6.4.0",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.17.2",
 | 
			
		||||
        "@0x/contracts-broker": "^1.1.34",
 | 
			
		||||
        "@0x/contracts-coordinator": "^3.1.35",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.33",
 | 
			
		||||
        "@0x/contracts-exchange-forwarder": "^4.2.35",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.34",
 | 
			
		||||
        "@0x/contracts-extensions": "^6.2.29",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/coordinator-server": "^1.0.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/migrations": "^8.0.0",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/protocol-utils": "^1.4.0",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/migrations": "^8.0.11",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/protocol-utils": "^1.7.2",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@azure/core-asynciterator-polyfill": "^1.0.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
@@ -93,23 +93,23 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/asset-swapper": "^6.4.0",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.27",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.27",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.28",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.28",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.35",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-zero-ex": "^0.21.0",
 | 
			
		||||
        "@0x/subproviders": "^6.4.1",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^6.2.0",
 | 
			
		||||
        "@0x/asset-swapper": "^16.20.0",
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.34",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.34",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.35",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.35",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.42",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-zero-ex": "^0.26.0",
 | 
			
		||||
        "@0x/subproviders": "^6.5.3",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "ethereumjs-util": "^7.0.10",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -534,9 +534,14 @@ blockchainTests.skip('Coordinator Client', env => {
 | 
			
		||||
            const signedOrders = [signedOrder, signedOrderWithDifferentFeeRecipient];
 | 
			
		||||
            const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount, takerTokenFillAmount];
 | 
			
		||||
            await coordinatorClient
 | 
			
		||||
                .batchFillOrdersAsync(signedOrders, takerAssetFillAmounts, signedOrders.map(o => o.signature), {
 | 
			
		||||
                    from: takerAddress,
 | 
			
		||||
                })
 | 
			
		||||
                .batchFillOrdersAsync(
 | 
			
		||||
                    signedOrders,
 | 
			
		||||
                    takerAssetFillAmounts,
 | 
			
		||||
                    signedOrders.map(o => o.signature),
 | 
			
		||||
                    {
 | 
			
		||||
                        from: takerAddress,
 | 
			
		||||
                    },
 | 
			
		||||
                )
 | 
			
		||||
                .then(res => {
 | 
			
		||||
                    expect(res).to.be.undefined();
 | 
			
		||||
                })
 | 
			
		||||
@@ -570,9 +575,14 @@ blockchainTests.skip('Coordinator Client', env => {
 | 
			
		||||
            const signedOrders = [signedOrder, signedOrderWithDifferentCoordinatorOperator];
 | 
			
		||||
            const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount, takerTokenFillAmount];
 | 
			
		||||
            await coordinatorClient
 | 
			
		||||
                .batchFillOrdersAsync(signedOrders, takerAssetFillAmounts, signedOrders.map(o => o.signature), {
 | 
			
		||||
                    from: takerAddress,
 | 
			
		||||
                })
 | 
			
		||||
                .batchFillOrdersAsync(
 | 
			
		||||
                    signedOrders,
 | 
			
		||||
                    takerAssetFillAmounts,
 | 
			
		||||
                    signedOrders.map(o => o.signature),
 | 
			
		||||
                    {
 | 
			
		||||
                        from: takerAddress,
 | 
			
		||||
                    },
 | 
			
		||||
                )
 | 
			
		||||
                .then(res => {
 | 
			
		||||
                    expect(res).to.be.undefined();
 | 
			
		||||
                })
 | 
			
		||||
@@ -600,9 +610,14 @@ blockchainTests.skip('Coordinator Client', env => {
 | 
			
		||||
            const signedOrders = [signedOrder, signedOrderWithDifferentCoordinatorOperator];
 | 
			
		||||
            const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount, takerTokenFillAmount];
 | 
			
		||||
            await coordinatorClient
 | 
			
		||||
                .batchFillOrdersAsync(signedOrders, takerAssetFillAmounts, signedOrders.map(o => o.signature), {
 | 
			
		||||
                    from: takerAddress,
 | 
			
		||||
                })
 | 
			
		||||
                .batchFillOrdersAsync(
 | 
			
		||||
                    signedOrders,
 | 
			
		||||
                    takerAssetFillAmounts,
 | 
			
		||||
                    signedOrders.map(o => o.signature),
 | 
			
		||||
                    {
 | 
			
		||||
                        from: takerAddress,
 | 
			
		||||
                    },
 | 
			
		||||
                )
 | 
			
		||||
                .then(res => {
 | 
			
		||||
                    expect(res).to.be.undefined();
 | 
			
		||||
                })
 | 
			
		||||
 
 | 
			
		||||
@@ -267,7 +267,11 @@ blockchainTests.resets('Coordinator integration tests', env => {
 | 
			
		||||
                expectedBalances.simulateFills(orders, taker.address, txReceipt, deployment, value);
 | 
			
		||||
                await balanceStore.updateBalancesAsync();
 | 
			
		||||
                balanceStore.assertEquals(expectedBalances);
 | 
			
		||||
                verifyEvents(txReceipt, orders.map(order => expectedFillEvent(order)), ExchangeEvents.Fill);
 | 
			
		||||
                verifyEvents(
 | 
			
		||||
                    txReceipt,
 | 
			
		||||
                    orders.map(order => expectedFillEvent(order)),
 | 
			
		||||
                    ExchangeEvents.Fill,
 | 
			
		||||
                );
 | 
			
		||||
            });
 | 
			
		||||
            it(`${fnName} should fill the orders if called by approver (eth fee, no refund)`, async () => {
 | 
			
		||||
                await balanceStore.updateBalancesAsync();
 | 
			
		||||
@@ -280,7 +284,11 @@ blockchainTests.resets('Coordinator integration tests', env => {
 | 
			
		||||
                expectedBalances.simulateFills(orders, taker.address, txReceipt, deployment, value);
 | 
			
		||||
                await balanceStore.updateBalancesAsync();
 | 
			
		||||
                balanceStore.assertEquals(expectedBalances);
 | 
			
		||||
                verifyEvents(txReceipt, orders.map(order => expectedFillEvent(order)), ExchangeEvents.Fill);
 | 
			
		||||
                verifyEvents(
 | 
			
		||||
                    txReceipt,
 | 
			
		||||
                    orders.map(order => expectedFillEvent(order)),
 | 
			
		||||
                    ExchangeEvents.Fill,
 | 
			
		||||
                );
 | 
			
		||||
            });
 | 
			
		||||
            it(`${fnName} should fill the orders if called by approver (mixed fees, refund)`, async () => {
 | 
			
		||||
                await balanceStore.updateBalancesAsync();
 | 
			
		||||
@@ -293,7 +301,11 @@ blockchainTests.resets('Coordinator integration tests', env => {
 | 
			
		||||
                expectedBalances.simulateFills(orders, taker.address, txReceipt, deployment, value);
 | 
			
		||||
                await balanceStore.updateBalancesAsync();
 | 
			
		||||
                balanceStore.assertEquals(expectedBalances);
 | 
			
		||||
                verifyEvents(txReceipt, orders.map(order => expectedFillEvent(order)), ExchangeEvents.Fill);
 | 
			
		||||
                verifyEvents(
 | 
			
		||||
                    txReceipt,
 | 
			
		||||
                    orders.map(order => expectedFillEvent(order)),
 | 
			
		||||
                    ExchangeEvents.Fill,
 | 
			
		||||
                );
 | 
			
		||||
            });
 | 
			
		||||
            it(`${fnName} should revert with an invalid approval signature`, async () => {
 | 
			
		||||
                const approvalSignature = hexUtils.concat(
 | 
			
		||||
@@ -360,7 +372,11 @@ blockchainTests.resets('Coordinator integration tests', env => {
 | 
			
		||||
                .executeTransaction(transaction, maker.address, transaction.signature, [])
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: maker.address });
 | 
			
		||||
 | 
			
		||||
            verifyEvents(txReceipt, orders.map(order => expectedCancelEvent(order)), ExchangeEvents.Cancel);
 | 
			
		||||
            verifyEvents(
 | 
			
		||||
                txReceipt,
 | 
			
		||||
                orders.map(order => expectedCancelEvent(order)),
 | 
			
		||||
                ExchangeEvents.Cancel,
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
        it('cancelOrdersUpTo call should be successful without an approval', async () => {
 | 
			
		||||
            const data = exchangeDataEncoder.encodeOrdersToExchangeData(ExchangeFunctionName.CancelOrdersUpTo, []);
 | 
			
		||||
 
 | 
			
		||||
@@ -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,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "4.1.35",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "4.1.34",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "4.1.33",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "4.1.32",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "4.1.31",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "4.1.30",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "4.1.29",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "4.1.28",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.1.35 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.34 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.33 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.32 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.31 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.30 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.29 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.28 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-multisig",
 | 
			
		||||
    "version": "4.1.28",
 | 
			
		||||
    "version": "4.1.35",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -49,18 +49,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/multisig",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -78,9 +78,9 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "ethereum-types": "^3.5.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,68 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "2.0.42",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "2.0.41",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "2.0.40",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "2.0.39",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "2.0.38",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "2.0.37",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Patch epoch finalization issue",
 | 
			
		||||
                "pr": 221
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1620214333
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "2.0.36",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "2.0.35",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v2.0.42 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.41 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.40 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.39 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.38 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.37 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Patch epoch finalization issue (#221)
 | 
			
		||||
 | 
			
		||||
## v2.0.36 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.35 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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.35",
 | 
			
		||||
    "version": "2.0.42",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
    "config": {
 | 
			
		||||
        "publicInterfaceContracts": "IStaking,IStakingEvents,IStakingProxy,IZrxVault,LibStakingRichErrors,Staking,StakingProxy,ZrxVault,TestStaking",
 | 
			
		||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(IStaking|IStakingEvents|IStakingProxy|IStorage|IStorageInit|IStructs|IZrxVault|LibCobbDouglas|LibFixedMath|LibFixedMathRichErrors|LibSafeDowncast|LibStakingRichErrors|MixinAbstract|MixinConstants|MixinCumulativeRewards|MixinDeploymentConstants|MixinExchangeFees|MixinExchangeManager|MixinFinalizer|MixinParams|MixinScheduler|MixinStake|MixinStakeBalances|MixinStakeStorage|MixinStakingPool|MixinStakingPoolRewards|MixinStorage|Staking|StakingProxy|TestAssertStorageParams|TestCobbDouglas|TestCumulativeRewardTracking|TestDelegatorRewards|TestExchangeManager|TestFinalizer|TestInitTarget|TestLibFixedMath|TestLibSafeDowncast|TestMixinCumulativeRewards|TestMixinParams|TestMixinScheduler|TestMixinStake|TestMixinStakeBalances|TestMixinStakeStorage|TestMixinStakingPool|TestMixinStakingPoolRewards|TestProtocolFees|TestProxyDestination|TestStaking|TestStakingNoWETH|TestStakingProxy|TestStakingProxyUnit|TestStorageLayoutAndConstants|ZrxVault).json"
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(IStaking|IStakingEvents|IStakingProxy|IStorage|IStorageInit|IStructs|IZrxVault|LibCobbDouglas|LibFixedMath|LibFixedMathRichErrors|LibSafeDowncast|LibStakingRichErrors|MixinAbstract|MixinConstants|MixinCumulativeRewards|MixinDeploymentConstants|MixinExchangeFees|MixinExchangeManager|MixinFinalizer|MixinParams|MixinScheduler|MixinStake|MixinStakeBalances|MixinStakeStorage|MixinStakingPool|MixinStakingPoolRewards|MixinStorage|Staking|StakingPatch|StakingProxy|TestAssertStorageParams|TestCobbDouglas|TestCumulativeRewardTracking|TestDelegatorRewards|TestExchangeManager|TestFinalizer|TestInitTarget|TestLibFixedMath|TestLibSafeDowncast|TestMixinCumulativeRewards|TestMixinParams|TestMixinScheduler|TestMixinStake|TestMixinStakeBalances|TestMixinStakeStorage|TestMixinStakingPool|TestMixinStakingPoolRewards|TestProtocolFees|TestProxyDestination|TestStaking|TestStakingNoWETH|TestStakingProxy|TestStakingProxyUnit|TestStorageLayoutAndConstants|ZrxVault).json"
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
        "type": "git",
 | 
			
		||||
@@ -53,20 +53,20 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.26",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.27",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.6",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.33",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.34",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-utils": "^4.7.13",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
        "chai": "^4.0.1",
 | 
			
		||||
@@ -87,12 +87,12 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1"
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "ethereumjs-util": "^7.0.10"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -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,68 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "5.4.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "5.4.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "5.4.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "5.4.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "5.4.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "5.4.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Set default ganache gas limit to 100e6",
 | 
			
		||||
                "pr": 197
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1620214333
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "5.3.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "5.3.24",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v5.4.5 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.4.4 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.4.3 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.4.2 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.4.1 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.4.0 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Set default ganache gas limit to 100e6 (#197)
 | 
			
		||||
 | 
			
		||||
## v5.3.25 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.24 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-test-utils",
 | 
			
		||||
    "version": "5.3.24",
 | 
			
		||||
    "version": "5.4.5",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -34,28 +34,28 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
        "shx": "^0.2.2",
 | 
			
		||||
        "tslint": "5.11.0",
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/assert": "^3.0.21",
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/contract-addresses": "^6.0.0",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/json-schemas": "^5.4.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/sol-coverage": "^4.0.31",
 | 
			
		||||
        "@0x/sol-profiler": "^4.1.21",
 | 
			
		||||
        "@0x/sol-trace": "^3.0.31",
 | 
			
		||||
        "@0x/subproviders": "^6.4.1",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@0x/assert": "^3.0.27",
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/contract-addresses": "^6.4.0",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.7",
 | 
			
		||||
        "@0x/json-schemas": "^6.1.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.26",
 | 
			
		||||
        "@0x/sol-coverage": "^4.0.37",
 | 
			
		||||
        "@0x/sol-profiler": "^4.1.27",
 | 
			
		||||
        "@0x/sol-trace": "^3.0.37",
 | 
			
		||||
        "@0x/subproviders": "^6.5.3",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "@types/bn.js": "^4.11.0",
 | 
			
		||||
        "@types/js-combinatorics": "^0.5.29",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
@@ -67,8 +67,8 @@
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "decimal.js": "^10.2.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "ethereumjs-util": "^7.0.10",
 | 
			
		||||
        "ethers": "~4.0.4",
 | 
			
		||||
        "js-combinatorics": "^0.5.3",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ export const constants = {
 | 
			
		||||
    ZERO_AMOUNT: new BigNumber(0),
 | 
			
		||||
    PERCENTAGE_DENOMINATOR: new BigNumber(10).pow(18),
 | 
			
		||||
    TIME_BUFFER: new BigNumber(1000),
 | 
			
		||||
    KECCAK256_NULL: ethUtil.addHexPrefix(ethUtil.bufferToHex(ethUtil.SHA3_NULL)),
 | 
			
		||||
    KECCAK256_NULL: ethUtil.bufferToHex(ethUtil.keccak256(Buffer.alloc(0))),
 | 
			
		||||
    MAX_UINT256_ROOT: new BigNumber('340282366920938463463374607431768211456'),
 | 
			
		||||
    ONE_ETHER: new BigNumber(1e18),
 | 
			
		||||
    EIP712_DOMAIN_NAME: '0x Protocol',
 | 
			
		||||
 
 | 
			
		||||
@@ -108,9 +108,7 @@ export async function testWithReferenceFuncAsync(
 | 
			
		||||
                    return expect.fail(
 | 
			
		||||
                        actualError,
 | 
			
		||||
                        expectedError,
 | 
			
		||||
                        `${testCaseString}: expected error message '${actualError.message}' to equal '${
 | 
			
		||||
                            expectedError.message
 | 
			
		||||
                        }'`,
 | 
			
		||||
                        `${testCaseString}: expected error message '${actualError.message}' to equal '${expectedError.message}'`,
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@ export let providerConfigs: Web3Config = {
 | 
			
		||||
    shouldUseInProcessGanache: true,
 | 
			
		||||
    shouldAllowUnlimitedContractSize: true,
 | 
			
		||||
    hardfork: 'istanbul',
 | 
			
		||||
    gasLimit: 100e6,
 | 
			
		||||
    unlocked_accounts: [
 | 
			
		||||
        '0x6cc5f688a315f3dc28a7781717a9a798a59fda7b',
 | 
			
		||||
        '0x55dc8f21d20d4c6ed3c82916a438a413ca68e335',
 | 
			
		||||
 
 | 
			
		||||
@@ -57,9 +57,7 @@ describe('Order hashing', () => {
 | 
			
		||||
                ...order,
 | 
			
		||||
                takerAddress: (null as any) as string,
 | 
			
		||||
            };
 | 
			
		||||
            const expectedErrorMessage = `Order taker must be of type string. If you want anyone to be able to fill an order - pass ${
 | 
			
		||||
                constants.NULL_ADDRESS
 | 
			
		||||
            }`;
 | 
			
		||||
            const expectedErrorMessage = `Expected order to conform to schema`;
 | 
			
		||||
            expect(() => orderHashUtils.getOrderHashHex(orderWithInvalidtakerFormat)).to.throw(expectedErrorMessage);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,105 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1624356181,
 | 
			
		||||
        "version": "1.2.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1623382456,
 | 
			
		||||
        "version": "1.2.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1622609597,
 | 
			
		||||
        "version": "1.2.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "1.2.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Added proposal 0 params and test",
 | 
			
		||||
                "pr": 252
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1622154125
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621944788,
 | 
			
		||||
        "version": "1.1.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1621600614,
 | 
			
		||||
        "version": "1.1.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1620214333,
 | 
			
		||||
        "version": "1.1.6",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "1.1.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Patched votingPower logic",
 | 
			
		||||
                "pr": 214
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1619825976
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619596077,
 | 
			
		||||
        "version": "1.1.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1619481586,
 | 
			
		||||
        "version": "1.1.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1618259868,
 | 
			
		||||
        "version": "1.1.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "1.1.1",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,50 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v1.2.3 - _June 22, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.2.2 - _June 11, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.2.1 - _June 2, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.2.0 - _May 27, 2021_
 | 
			
		||||
 | 
			
		||||
    * Added proposal 0 params and test (#252)
 | 
			
		||||
 | 
			
		||||
## v1.1.8 - _May 25, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.7 - _May 21, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.6 - _May 5, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.5 - _April 30, 2021_
 | 
			
		||||
 | 
			
		||||
    * Patched votingPower logic (#214)
 | 
			
		||||
 | 
			
		||||
## v1.1.4 - _April 28, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.3 - _April 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.2 - _April 12, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.1 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -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.1",
 | 
			
		||||
    "version": "1.2.3",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -46,16 +46,16 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.21",
 | 
			
		||||
        "@0x/contract-addresses": "^6.0.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.9",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.6",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.35",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/abi-gen": "^5.6.0",
 | 
			
		||||
        "@0x/contract-addresses": "^6.4.0",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.16",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.3.13",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.38",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.42",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.4.5",
 | 
			
		||||
        "@0x/sol-compiler": "^4.7.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.4",
 | 
			
		||||
        "@types/isomorphic-fetch": "^0.0.35",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
@@ -72,15 +72,15 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/protocol-utils": "^1.4.0",
 | 
			
		||||
        "@0x/subproviders": "^6.4.1",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1"
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/protocol-utils": "^1.7.2",
 | 
			
		||||
        "@0x/subproviders": "^6.5.3",
 | 
			
		||||
        "@0x/types": "^3.3.3",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.5.3",
 | 
			
		||||
        "ethereum-types": "^3.5.0",
 | 
			
		||||
        "ethereumjs-util": "^7.0.10"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										35
									
								
								contracts/treasury/src/proposals.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								contracts/treasury/src/proposals.ts
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										154
									
								
								contracts/treasury/test/proposal_test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								contracts/treasury/test/proposal_test.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,154 @@
 | 
			
		||||
import { artifacts as erc20Artifacts, ERC20TokenEvents } from '@0x/contracts-erc20';
 | 
			
		||||
import { StakingContract, StakingProxyContract } from '@0x/contracts-staking';
 | 
			
		||||
import { blockchainTests, constants, verifyEventsFromLogs } from '@0x/contracts-test-utils';
 | 
			
		||||
import { BigNumber, hexUtils, logUtils } from '@0x/utils';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { proposals } from '../src/proposals';
 | 
			
		||||
 | 
			
		||||
import { artifacts } from './artifacts';
 | 
			
		||||
import { ZrxTreasuryContract, ZrxTreasuryEvents } from './wrappers';
 | 
			
		||||
 | 
			
		||||
const SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/mzhu25/zeroex-staking';
 | 
			
		||||
const STAKING_PROXY_ADDRESS = '0xa26e80e7dea86279c6d778d702cc413e6cffa777';
 | 
			
		||||
const TREASURY_ADDRESS = '0x0bb1810061c2f5b2088054ee184e6c79e1591101';
 | 
			
		||||
const PROPOSER = process.env.PROPOSER || constants.NULL_ADDRESS;
 | 
			
		||||
const VOTER = '0xba4f44e774158408e2dc6c5cb65bc995f0a89180';
 | 
			
		||||
const VOTER_OPERATED_POOLS = ['0x0000000000000000000000000000000000000000000000000000000000000017'];
 | 
			
		||||
blockchainTests.configure({
 | 
			
		||||
    fork: {
 | 
			
		||||
        unlockedAccounts: [PROPOSER, VOTER],
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
async function querySubgraphAsync(operatorAddress: string): Promise<string[]> {
 | 
			
		||||
    const query = `
 | 
			
		||||
        {
 | 
			
		||||
            stakingActor(id: "${operatorAddress}") {
 | 
			
		||||
                operatedPools {
 | 
			
		||||
                    id
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    `;
 | 
			
		||||
    const response = await fetch(SUBGRAPH_URL, {
 | 
			
		||||
        method: 'POST',
 | 
			
		||||
        headers: {
 | 
			
		||||
            Accept: 'application/json',
 | 
			
		||||
            'Content-Type': 'application/json',
 | 
			
		||||
        },
 | 
			
		||||
        body: JSON.stringify({
 | 
			
		||||
            query,
 | 
			
		||||
        }),
 | 
			
		||||
    });
 | 
			
		||||
    const {
 | 
			
		||||
        data: { stakingActor },
 | 
			
		||||
    } = await response.json();
 | 
			
		||||
    if (stakingActor) {
 | 
			
		||||
        return stakingActor.operatedPools.map((pool: { id: string }) => hexUtils.leftPad(pool.id));
 | 
			
		||||
    } else {
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
blockchainTests.fork.skip('Treasury proposal mainnet fork tests', env => {
 | 
			
		||||
    let staking: StakingContract;
 | 
			
		||||
    let stakingProxy: StakingProxyContract;
 | 
			
		||||
    let treasury: ZrxTreasuryContract;
 | 
			
		||||
    let votingPeriod: BigNumber;
 | 
			
		||||
 | 
			
		||||
    async function fastForwardToNextEpochAsync(): Promise<void> {
 | 
			
		||||
        const epochEndTime = await staking.getCurrentEpochEarliestEndTimeInSeconds().callAsync();
 | 
			
		||||
        const lastBlockTime = await env.web3Wrapper.getBlockTimestampAsync('latest');
 | 
			
		||||
        const dt = Math.max(0, epochEndTime.minus(lastBlockTime).toNumber());
 | 
			
		||||
        await env.web3Wrapper.increaseTimeAsync(dt);
 | 
			
		||||
        // mine next block
 | 
			
		||||
        await env.web3Wrapper.mineBlockAsync();
 | 
			
		||||
        const lastPoolId = new BigNumber(await staking.lastPoolId().callAsync(), 16);
 | 
			
		||||
        const batchExecuteCalldata = [
 | 
			
		||||
            ...[...new Array(lastPoolId.toNumber())].map((_x, i) =>
 | 
			
		||||
                staking.finalizePool(hexUtils.leftPad(i + 1)).getABIEncodedTransactionData(),
 | 
			
		||||
            ),
 | 
			
		||||
            staking.endEpoch().getABIEncodedTransactionData(),
 | 
			
		||||
            ...[...new Array(lastPoolId.toNumber())].map((_x, i) =>
 | 
			
		||||
                staking.finalizePool(hexUtils.leftPad(i + 1)).getABIEncodedTransactionData(),
 | 
			
		||||
            ),
 | 
			
		||||
            ...[...new Array(lastPoolId.toNumber())].map((_x, i) =>
 | 
			
		||||
                staking.finalizePool(hexUtils.leftPad(i + 1)).getABIEncodedTransactionData(),
 | 
			
		||||
            ),
 | 
			
		||||
        ];
 | 
			
		||||
        await stakingProxy.batchExecute(batchExecuteCalldata).awaitTransactionSuccessAsync();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        const abis = _.mapValues({ ...artifacts, ...erc20Artifacts }, v => v.compilerOutput.abi);
 | 
			
		||||
        treasury = new ZrxTreasuryContract(TREASURY_ADDRESS, env.provider, env.txDefaults, abis);
 | 
			
		||||
        votingPeriod = await treasury.votingPeriod().callAsync();
 | 
			
		||||
        staking = new StakingContract(STAKING_PROXY_ADDRESS, env.provider, env.txDefaults);
 | 
			
		||||
        stakingProxy = new StakingProxyContract(STAKING_PROXY_ADDRESS, env.provider, env.txDefaults);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('Proposal 0', () => {
 | 
			
		||||
        it('works', async () => {
 | 
			
		||||
            const proposal = proposals[0];
 | 
			
		||||
            let executionEpoch: BigNumber;
 | 
			
		||||
            if (proposal.executionEpoch) {
 | 
			
		||||
                executionEpoch = proposal.executionEpoch;
 | 
			
		||||
            } else {
 | 
			
		||||
                const currentEpoch = await staking.currentEpoch().callAsync();
 | 
			
		||||
                executionEpoch = currentEpoch.plus(2);
 | 
			
		||||
            }
 | 
			
		||||
            const pools = await querySubgraphAsync(PROPOSER);
 | 
			
		||||
            const proposeTx = treasury.propose(proposal.actions, executionEpoch, proposal.description, pools);
 | 
			
		||||
 | 
			
		||||
            const calldata = proposeTx.getABIEncodedTransactionData();
 | 
			
		||||
            logUtils.log('ZrxTreasury.propose calldata:');
 | 
			
		||||
            logUtils.log(calldata);
 | 
			
		||||
 | 
			
		||||
            const proposalId = await proposeTx.callAsync({ from: PROPOSER });
 | 
			
		||||
            const receipt = await proposeTx.awaitTransactionSuccessAsync({ from: PROPOSER });
 | 
			
		||||
            verifyEventsFromLogs(
 | 
			
		||||
                receipt.logs,
 | 
			
		||||
                [
 | 
			
		||||
                    {
 | 
			
		||||
                        ...proposal,
 | 
			
		||||
                        proposalId,
 | 
			
		||||
                        executionEpoch,
 | 
			
		||||
                        proposer: PROPOSER,
 | 
			
		||||
                        operatedPoolIds: pools,
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                ZrxTreasuryEvents.ProposalCreated,
 | 
			
		||||
            );
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            await treasury
 | 
			
		||||
                .castVote(proposalId, true, VOTER_OPERATED_POOLS)
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: VOTER });
 | 
			
		||||
            await env.web3Wrapper.increaseTimeAsync(votingPeriod.plus(1).toNumber());
 | 
			
		||||
            await env.web3Wrapper.mineBlockAsync();
 | 
			
		||||
            const executeTx = await treasury.execute(proposalId, proposal.actions).awaitTransactionSuccessAsync();
 | 
			
		||||
            verifyEventsFromLogs(
 | 
			
		||||
                executeTx.logs,
 | 
			
		||||
                [
 | 
			
		||||
                    {
 | 
			
		||||
                        proposalId,
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                ZrxTreasuryEvents.ProposalExecuted,
 | 
			
		||||
            );
 | 
			
		||||
            const recipient = '0xf9347f751a6a1467abc722ec7d80ba2698dd9d6c';
 | 
			
		||||
            verifyEventsFromLogs(
 | 
			
		||||
                executeTx.logs,
 | 
			
		||||
                [
 | 
			
		||||
                    {
 | 
			
		||||
                        _from: TREASURY_ADDRESS,
 | 
			
		||||
                        _to: recipient,
 | 
			
		||||
                        _value: new BigNumber(400_000).times('1e18'),
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                ERC20TokenEvents.Transfer,
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -28,6 +28,7 @@ blockchainTests.resets('Treasury governance', env => {
 | 
			
		||||
        votingPeriod: new BigNumber(3).times(stakingConstants.ONE_DAY_IN_SECONDS),
 | 
			
		||||
        proposalThreshold: new BigNumber(100),
 | 
			
		||||
        quorumThreshold: new BigNumber(1000),
 | 
			
		||||
        defaultPoolId: stakingConstants.INITIAL_POOL_ID,
 | 
			
		||||
    };
 | 
			
		||||
    const PROPOSAL_DESCRIPTION = 'A very compelling proposal!';
 | 
			
		||||
    const TREASURY_BALANCE = constants.INITIAL_ERC20_BALANCE;
 | 
			
		||||
@@ -135,6 +136,16 @@ blockchainTests.resets('Treasury governance', env => {
 | 
			
		||||
            .approve(erc20ProxyContract.address, constants.INITIAL_ERC20_ALLOWANCE)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
 | 
			
		||||
        defaultPoolOperator = await DefaultPoolOperatorContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            artifacts.DefaultPoolOperator,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            { ...artifacts, ...erc20Artifacts },
 | 
			
		||||
            staking.address,
 | 
			
		||||
            weth.address,
 | 
			
		||||
        );
 | 
			
		||||
        defaultPoolId = stakingConstants.INITIAL_POOL_ID;
 | 
			
		||||
 | 
			
		||||
        const createStakingPoolTx = staking.createStakingPool(stakingConstants.PPM, false);
 | 
			
		||||
        nonDefaultPoolId = await createStakingPoolTx.callAsync({ from: poolOperator });
 | 
			
		||||
        await createStakingPoolTx.awaitTransactionSuccessAsync({ from: poolOperator });
 | 
			
		||||
@@ -145,9 +156,9 @@ blockchainTests.resets('Treasury governance', env => {
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            { ...artifacts, ...erc20Artifacts },
 | 
			
		||||
            staking.address,
 | 
			
		||||
            weth.address,
 | 
			
		||||
            TREASURY_PARAMS,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        await zrx.mint(TREASURY_BALANCE).awaitTransactionSuccessAsync();
 | 
			
		||||
        await zrx.transfer(treasury.address, TREASURY_BALANCE).awaitTransactionSuccessAsync();
 | 
			
		||||
        actions = [
 | 
			
		||||
@@ -166,10 +177,6 @@ blockchainTests.resets('Treasury governance', env => {
 | 
			
		||||
                value: constants.ZERO_AMOUNT,
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        defaultPoolId = await treasury.defaultPoolId().callAsync();
 | 
			
		||||
        const defaultPoolOperatorAddress = await treasury.defaultPoolOperator().callAsync();
 | 
			
		||||
        defaultPoolOperator = new DefaultPoolOperatorContract(defaultPoolOperatorAddress, env.provider, env.txDefaults);
 | 
			
		||||
    });
 | 
			
		||||
    describe('getVotingPower()', () => {
 | 
			
		||||
        it('Unstaked ZRX has no voting power', async () => {
 | 
			
		||||
@@ -222,6 +229,19 @@ blockchainTests.resets('Treasury governance', env => {
 | 
			
		||||
            const operatorVotingPower = await treasury.getVotingPower(poolOperator, [nonDefaultPoolId]).callAsync();
 | 
			
		||||
            expect(operatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.dividedBy(2));
 | 
			
		||||
        });
 | 
			
		||||
        it('Reverts if given duplicate pool IDs', async () => {
 | 
			
		||||
            await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await staking
 | 
			
		||||
                .moveStake(
 | 
			
		||||
                    new StakeInfo(StakeStatus.Undelegated),
 | 
			
		||||
                    new StakeInfo(StakeStatus.Delegated, nonDefaultPoolId),
 | 
			
		||||
                    TREASURY_PARAMS.proposalThreshold,
 | 
			
		||||
                )
 | 
			
		||||
                .awaitTransactionSuccessAsync({ from: delegator });
 | 
			
		||||
            await fastForwardToNextEpochAsync();
 | 
			
		||||
            const tx = treasury.getVotingPower(poolOperator, [nonDefaultPoolId, nonDefaultPoolId]).callAsync();
 | 
			
		||||
            return expect(tx).to.revertWith('getVotingPower/DUPLICATE_POOL_ID');
 | 
			
		||||
        });
 | 
			
		||||
        it('Correctly sums voting power delegated to multiple pools', async () => {
 | 
			
		||||
            await staking
 | 
			
		||||
                .stake(TREASURY_PARAMS.proposalThreshold.times(2))
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,67 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "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",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1617311315,
 | 
			
		||||
        "version": "4.7.6",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,34 @@ 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
 | 
			
		||||
 | 
			
		||||
## v4.7.6 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-utils",
 | 
			
		||||
    "version": "4.7.6",
 | 
			
		||||
    "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.4.21",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.32",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.24",
 | 
			
		||||
        "@0x/dev-utils": "^4.2.1",
 | 
			
		||||
        "@0x/order-utils": "^10.4.19",
 | 
			
		||||
        "@0x/sol-compiler": "^4.6.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.4.1",
 | 
			
		||||
        "@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.3",
 | 
			
		||||
        "@types/bn.js": "^4.11.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
@@ -67,7 +67,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "ethereumjs-util": "^7.0.10",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -79,11 +79,11 @@
 | 
			
		||||
        "typescript": "4.2.2"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.18",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.2.0",
 | 
			
		||||
        "@0x/base-contract": "^6.4.0",
 | 
			
		||||
        "@0x/typescript-typings": "^5.2.0",
 | 
			
		||||
        "@0x/utils": "^6.4.3",
 | 
			
		||||
        "bn.js": "^4.11.8",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
        "ethereum-types": "^3.5.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -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', () => {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ import { chaiSetup, constants, provider, txDefaults, web3Wrapper } from '@0x/con
 | 
			
		||||
import { BlockchainLifecycle } from '@0x/dev-utils';
 | 
			
		||||
import { BigNumber, hexUtils, signTypedDataUtils } from '@0x/utils';
 | 
			
		||||
import * as chai from 'chai';
 | 
			
		||||
import * as ethUtil from 'ethereumjs-util';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { artifacts } from './artifacts';
 | 
			
		||||
@@ -78,7 +77,7 @@ describe('LibEIP712', () => {
 | 
			
		||||
 | 
			
		||||
        // Hash the provided input to get the expected hash
 | 
			
		||||
        const input = '0x1901'.concat(unprefixedDomainHash.concat(unprefixedHashStruct));
 | 
			
		||||
        const expectedHash = '0x'.concat(ethUtil.sha3(input).toString('hex'));
 | 
			
		||||
        const expectedHash = hexUtils.hash(input);
 | 
			
		||||
 | 
			
		||||
        // Get the actual hash by calling the smart contract
 | 
			
		||||
        const actualHash = await lib.externalHashEIP712Message(domainHash, hashStruct).callAsync();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,121 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "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": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "bump feature version to 1.2",
 | 
			
		||||
                "pr": 213
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1619596077
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.22.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add order signer registry to NativeOrdersFeature",
 | 
			
		||||
                "pr": 195
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1619481586
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1618259868,
 | 
			
		||||
        "version": "0.21.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "BSC Uniswap clones (ApeSwap, CafeSwap, CheeseSwap, JulSwap)",
 | 
			
		||||
                "pr": 208
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.21.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,53 @@ 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)
 | 
			
		||||
 | 
			
		||||
## v0.22.0 - _April 26, 2021_
 | 
			
		||||
 | 
			
		||||
    * Add order signer registry to NativeOrdersFeature (#195)
 | 
			
		||||
 | 
			
		||||
## v0.21.1 - _April 12, 2021_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
    * BSC Uniswap clones (ApeSwap, CafeSwap, CheeseSwap, JulSwap) (#208)
 | 
			
		||||
 | 
			
		||||
## v0.21.0 - _April 1, 2021_
 | 
			
		||||
 | 
			
		||||
    * Encoding protocol ID and source name in bridge source ID (#162)
 | 
			
		||||
 
 | 
			
		||||
@@ -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,38 @@ 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
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("InvalidSignerError(address,address)")),
 | 
			
		||||
            maker,
 | 
			
		||||
            signer
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function OrderNotFillableBySenderError(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        address sender,
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ contract NativeOrdersFeature is
 | 
			
		||||
    /// @dev Name of this feature.
 | 
			
		||||
    string public constant override FEATURE_NAME = "LimitOrders";
 | 
			
		||||
    /// @dev Version of this feature.
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 1, 0);
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 2, 0);
 | 
			
		||||
 | 
			
		||||
    constructor(
 | 
			
		||||
        address zeroExAddress,
 | 
			
		||||
@@ -74,9 +74,13 @@ contract NativeOrdersFeature is
 | 
			
		||||
        _registerFeatureFunction(this.batchCancelLimitOrders.selector);
 | 
			
		||||
        _registerFeatureFunction(this.batchCancelRfqOrders.selector);
 | 
			
		||||
        _registerFeatureFunction(this.cancelPairLimitOrders.selector);
 | 
			
		||||
        _registerFeatureFunction(this.cancelPairLimitOrdersWithSigner.selector);
 | 
			
		||||
        _registerFeatureFunction(this.batchCancelPairLimitOrders.selector);
 | 
			
		||||
        _registerFeatureFunction(this.batchCancelPairLimitOrdersWithSigner.selector);
 | 
			
		||||
        _registerFeatureFunction(this.cancelPairRfqOrders.selector);
 | 
			
		||||
        _registerFeatureFunction(this.cancelPairRfqOrdersWithSigner.selector);
 | 
			
		||||
        _registerFeatureFunction(this.batchCancelPairRfqOrders.selector);
 | 
			
		||||
        _registerFeatureFunction(this.batchCancelPairRfqOrdersWithSigner.selector);
 | 
			
		||||
        _registerFeatureFunction(this.getLimitOrderInfo.selector);
 | 
			
		||||
        _registerFeatureFunction(this.getRfqOrderInfo.selector);
 | 
			
		||||
        _registerFeatureFunction(this.getLimitOrderHash.selector);
 | 
			
		||||
@@ -87,6 +91,8 @@ contract NativeOrdersFeature is
 | 
			
		||||
        _registerFeatureFunction(this.getRfqOrderRelevantState.selector);
 | 
			
		||||
        _registerFeatureFunction(this.batchGetLimitOrderRelevantStates.selector);
 | 
			
		||||
        _registerFeatureFunction(this.batchGetRfqOrderRelevantStates.selector);
 | 
			
		||||
        _registerFeatureFunction(this.registerAllowedOrderSigner.selector);
 | 
			
		||||
        _registerFeatureFunction(this.isValidOrderSigner.selector);
 | 
			
		||||
        return LibMigrate.MIGRATE_SUCCESS;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user