Compare commits
	
		
			111 Commits
		
	
	
		
			@0x/contra
			...
			protocol@4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4bf6a23d23 | ||
| 
						 | 
					aaaf0d02de | ||
| 
						 | 
					825cc4d035 | ||
| 
						 | 
					c2d44e5c10 | ||
| 
						 | 
					0efd0860c8 | ||
| 
						 | 
					a890a06664 | ||
| 
						 | 
					5befb87071 | ||
| 
						 | 
					12ba4c373a | ||
| 
						 | 
					7fd25be02e | ||
| 
						 | 
					aa688c4a92 | ||
| 
						 | 
					fb437551c9 | ||
| 
						 | 
					6fa1de7889 | ||
| 
						 | 
					7a42df9a65 | ||
| 
						 | 
					15a508f3ea | ||
| 
						 | 
					b3c20ff909 | ||
| 
						 | 
					682c07cb73 | ||
| 
						 | 
					602605ab4b | ||
| 
						 | 
					0eff2548d5 | ||
| 
						 | 
					93ee681204 | ||
| 
						 | 
					d7bea98075 | ||
| 
						 | 
					437a3b048d | ||
| 
						 | 
					f55a9454b5 | ||
| 
						 | 
					3b03ad0db4 | ||
| 
						 | 
					27d679e1f1 | ||
| 
						 | 
					1e16d59c23 | ||
| 
						 | 
					1e7c9bbb1f | ||
| 
						 | 
					edda1edc50 | ||
| 
						 | 
					d1eb6279b4 | ||
| 
						 | 
					4ace79d947 | ||
| 
						 | 
					e5eee96487 | ||
| 
						 | 
					907adf9145 | ||
| 
						 | 
					c046fe6220 | ||
| 
						 | 
					84bf20de41 | ||
| 
						 | 
					f5a6f74d9a | ||
| 
						 | 
					7c7fc51ccf | ||
| 
						 | 
					fa22f6de0d | ||
| 
						 | 
					4f41214af2 | ||
| 
						 | 
					607b7169bc | ||
| 
						 | 
					1253490a38 | ||
| 
						 | 
					0a37a588e8 | ||
| 
						 | 
					23ee108089 | ||
| 
						 | 
					64feeeea75 | ||
| 
						 | 
					2ebef23b8c | ||
| 
						 | 
					cc9f43ba3b | ||
| 
						 | 
					5f1c139176 | ||
| 
						 | 
					9eea7de340 | ||
| 
						 | 
					4480f84efa | ||
| 
						 | 
					5a8b8afff1 | ||
| 
						 | 
					67c95bc0b7 | ||
| 
						 | 
					e70ec02be8 | ||
| 
						 | 
					db81a94adb | ||
| 
						 | 
					475b608338 | ||
| 
						 | 
					27e36b112e | ||
| 
						 | 
					f698721484 | ||
| 
						 | 
					0c08353b2c | ||
| 
						 | 
					a074b49732 | ||
| 
						 | 
					43b75c7953 | ||
| 
						 | 
					84a78eafc4 | ||
| 
						 | 
					3c1ab889dd | ||
| 
						 | 
					012fff46f6 | ||
| 
						 | 
					6307ebc3a2 | ||
| 
						 | 
					88d7e73eba | ||
| 
						 | 
					9653eb9e70 | ||
| 
						 | 
					ad337271d3 | ||
| 
						 | 
					7591e99316 | ||
| 
						 | 
					ca20df4752 | ||
| 
						 | 
					841e4ee666 | ||
| 
						 | 
					e2ee3414ea | ||
| 
						 | 
					5306cc03e9 | ||
| 
						 | 
					85f5d32de2 | ||
| 
						 | 
					ab698cec14 | ||
| 
						 | 
					b463a39bfa | ||
| 
						 | 
					018e25345b | ||
| 
						 | 
					b60fa8a7d7 | ||
| 
						 | 
					048d8dee60 | ||
| 
						 | 
					927fe2b58b | ||
| 
						 | 
					89948b360c | ||
| 
						 | 
					561b60a24d | ||
| 
						 | 
					4f82543bdf | ||
| 
						 | 
					3133c509f9 | ||
| 
						 | 
					426c15692d | ||
| 
						 | 
					8c87a77faa | ||
| 
						 | 
					d2018f07a2 | ||
| 
						 | 
					d2e57d8163 | ||
| 
						 | 
					7403c0255a | ||
| 
						 | 
					75dcd687e2 | ||
| 
						 | 
					afd4805421 | ||
| 
						 | 
					6aa582d140 | ||
| 
						 | 
					534d92fa00 | ||
| 
						 | 
					37aae134ab | ||
| 
						 | 
					36bd8f68c9 | ||
| 
						 | 
					c3ad42221e | ||
| 
						 | 
					602ac1f626 | ||
| 
						 | 
					3126795efe | ||
| 
						 | 
					dbcb221a59 | ||
| 
						 | 
					6bbc179f52 | ||
| 
						 | 
					48e7a391c8 | ||
| 
						 | 
					2334e64d0c | ||
| 
						 | 
					14f920ee84 | ||
| 
						 | 
					e10a81023a | ||
| 
						 | 
					f4709ed1cb | ||
| 
						 | 
					e2e14a977a | ||
| 
						 | 
					866f958a10 | ||
| 
						 | 
					717db99b38 | ||
| 
						 | 
					02006118c7 | ||
| 
						 | 
					9816019bc5 | ||
| 
						 | 
					9c821dbfc3 | ||
| 
						 | 
					af1b890423 | ||
| 
						 | 
					673835d2de | ||
| 
						 | 
					500b57e935 | ||
| 
						 | 
					3f7d0580c1 | 
@@ -82,4 +82,5 @@ lib
 | 
			
		||||
/packages/asset-swapper/test/generated-wrappers
 | 
			
		||||
package.json
 | 
			
		||||
packages/*/docs
 | 
			
		||||
docs/
 | 
			
		||||
*.sol
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								.readthedocs.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.readthedocs.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
# Read the Docs configuration file
 | 
			
		||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
 | 
			
		||||
 | 
			
		||||
# Required
 | 
			
		||||
version: 2
 | 
			
		||||
 | 
			
		||||
# Build documentation in the docs/ directory with Sphinx
 | 
			
		||||
sphinx:
 | 
			
		||||
  configuration: docs/conf.py
 | 
			
		||||
 | 
			
		||||
# Build documentation with MkDocs
 | 
			
		||||
#mkdocs:
 | 
			
		||||
#  configuration: mkdocs.yml
 | 
			
		||||
 | 
			
		||||
# Optionally build your docs in additional formats such as PDF
 | 
			
		||||
#formats:
 | 
			
		||||
#  - pdf
 | 
			
		||||
 | 
			
		||||
# Optionally set the version of Python and requirements required to build your docs
 | 
			
		||||
python:
 | 
			
		||||
  version: 3.7
 | 
			
		||||
  install:
 | 
			
		||||
    - requirements: docs/requirements.txt
 | 
			
		||||
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							@@ -8,7 +8,7 @@ This repository is a monorepo including the 0x protocol smart contracts and nume
 | 
			
		||||
 | 
			
		||||
[website-url]: https://0x.org
 | 
			
		||||
 | 
			
		||||
[](https://circleci.com/gh/0xProject/0x-monorepo)
 | 
			
		||||
[](https://circleci.com/gh/0xProject/protocool)
 | 
			
		||||
[](https://coveralls.io/github/0xProject/0x-monorepo?branch=development)
 | 
			
		||||
[](https://discordapp.com/invite/d3FTX3M)
 | 
			
		||||
[](https://opensource.org/licenses/Apache-2.0)
 | 
			
		||||
@@ -92,7 +92,7 @@ yarn build
 | 
			
		||||
To build a specific package:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
PKG=@0x/web3-wrapper yarn build
 | 
			
		||||
PKG=@0x/contract-wrappers yarn build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
To build all contracts packages:
 | 
			
		||||
@@ -115,7 +115,7 @@ To watch a specific package and all it's dependent packages:
 | 
			
		||||
PKG=[NPM_PACKAGE_NAME] yarn watch
 | 
			
		||||
 | 
			
		||||
e.g
 | 
			
		||||
PKG=@0x/web3-wrapper yarn watch
 | 
			
		||||
PKG=@0x/contract-wrappers yarn watch
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Clean
 | 
			
		||||
@@ -143,7 +143,7 @@ yarn rebuild
 | 
			
		||||
To re-build (clean & build) a specific package & it's deps:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
PKG=0x.js yarn rebuild
 | 
			
		||||
PKG=@0x/contract-wrappers yarn rebuild
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Lint
 | 
			
		||||
@@ -157,7 +157,7 @@ yarn lint
 | 
			
		||||
Lint a specific package:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
PKG=0x.js yarn lint
 | 
			
		||||
PKG=@0x/contract-wrappers yarn lint
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Run Tests
 | 
			
		||||
@@ -171,7 +171,7 @@ yarn test
 | 
			
		||||
Run a specific package's test:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
PKG=@0x/web3-wrapper yarn test
 | 
			
		||||
PKG=@0x/contract-wrappers yarn test
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Run all contracts packages tests:
 | 
			
		||||
 
 | 
			
		||||
@@ -13,9 +13,11 @@
 | 
			
		||||
        "indent": ["error", 4],
 | 
			
		||||
        "max-line-length": ["warn", 160],
 | 
			
		||||
        "no-inline-assembly": false,
 | 
			
		||||
        "no-empty-blocks": false,
 | 
			
		||||
        "quotes": ["error", "double"],
 | 
			
		||||
        "separate-by-one-line-in-contract": "error",
 | 
			
		||||
        "space-after-comma": "error",
 | 
			
		||||
        "statement-indent": "error"
 | 
			
		||||
        "statement-indent": "error",
 | 
			
		||||
        "no-empty-blocks": false
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,113 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.7.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.7.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "3.7.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Fix Bancor support of ETH",
 | 
			
		||||
                "pr": 88
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1608105788
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.6.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.6.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.6.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.6.6",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.6.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.6.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "3.6.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "3.6.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "3.6.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "3.6.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,54 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.7.2 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.1 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.7.0 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Fix Bancor support of ETH (#88)
 | 
			
		||||
 | 
			
		||||
## v3.6.9 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.8 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.7 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.6 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.5 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.4 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.3 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.2 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.1 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.6.0 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Add `SwerveBridge` and `SnowSwapBridge` (duplicate of `CurveBridge`) (#2707)
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ pragma solidity ^0.5.9;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol";
 | 
			
		||||
import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol";
 | 
			
		||||
@@ -36,6 +37,20 @@ contract BancorBridge is
 | 
			
		||||
    struct TransferState {
 | 
			
		||||
        address bancorNetworkAddress;
 | 
			
		||||
        address[] path;
 | 
			
		||||
        IEtherToken weth;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Bancor ETH pseudo-address.
 | 
			
		||||
    address constant public BANCOR_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
 | 
			
		||||
 | 
			
		||||
    // solhint-disable no-empty-blocks
 | 
			
		||||
    /// @dev Payable fallback to receive ETH from Bancor/WETH.
 | 
			
		||||
    function ()
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
    {
 | 
			
		||||
        // Poor man's receive in 0.5.9
 | 
			
		||||
        require(msg.data.length == 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of
 | 
			
		||||
@@ -60,7 +75,6 @@ contract BancorBridge is
 | 
			
		||||
    {
 | 
			
		||||
        // hold variables to get around stack depth limitations
 | 
			
		||||
        TransferState memory state;
 | 
			
		||||
 | 
			
		||||
        // Decode the bridge data.
 | 
			
		||||
        (
 | 
			
		||||
            state.path,
 | 
			
		||||
@@ -68,34 +82,42 @@ contract BancorBridge is
 | 
			
		||||
        // solhint-disable indent
 | 
			
		||||
        ) = abi.decode(bridgeData, (address[], address));
 | 
			
		||||
        // solhint-enable indent
 | 
			
		||||
        state.weth = IEtherToken(_getWethAddress());
 | 
			
		||||
 | 
			
		||||
        require(state.path.length > 0, "BancorBridge/PATH_MUST_EXIST");
 | 
			
		||||
        // Just transfer the tokens if they're the same.
 | 
			
		||||
        if (state.path[0] == toTokenAddress) {
 | 
			
		||||
            LibERC20Token.transfer(state.path[0], to, amount);
 | 
			
		||||
            return BRIDGE_SUCCESS;
 | 
			
		||||
        require(state.path.length >= 2, "BancorBridge/PATH_LENGTH_MUST_BE_GREATER_THAN_TWO");
 | 
			
		||||
 | 
			
		||||
        // Grant an allowance to the Bancor Network to spend `fromTokenAddress` token.
 | 
			
		||||
        uint256 fromTokenBalance;
 | 
			
		||||
        uint256 payableAmount = 0;
 | 
			
		||||
        // If it's ETH in the path then withdraw from WETH
 | 
			
		||||
        // The Bancor path will have ETH as the 0xeee address
 | 
			
		||||
        // Bancor expects to be paid in ETH not WETH
 | 
			
		||||
        if (state.path[0] == BANCOR_ETH_ADDRESS) {
 | 
			
		||||
            fromTokenBalance = state.weth.balanceOf(address(this));
 | 
			
		||||
            state.weth.withdraw(fromTokenBalance);
 | 
			
		||||
            payableAmount = fromTokenBalance;
 | 
			
		||||
        } else {
 | 
			
		||||
            fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this));
 | 
			
		||||
            LibERC20Token.approveIfBelow(state.path[0], state.bancorNetworkAddress, fromTokenBalance);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Otherwise use Bancor to convert
 | 
			
		||||
        require(state.path.length > 2, "BancorBridge/PATH_LENGTH_MUST_BE_GREATER_THAN_TWO");
 | 
			
		||||
        require(state.path[state.path.length - 1] == toTokenAddress, "BancorBridge/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN");
 | 
			
		||||
        
 | 
			
		||||
        // // Grant an allowance to the Bancor Network to spend `fromTokenAddress` token.
 | 
			
		||||
        uint256 fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this));
 | 
			
		||||
        LibERC20Token.approveIfBelow(state.path[0], state.bancorNetworkAddress, fromTokenBalance);
 | 
			
		||||
 | 
			
		||||
        // Convert the tokens
 | 
			
		||||
        uint256 boughtAmount = IBancorNetwork(state.bancorNetworkAddress).convertByPath(
 | 
			
		||||
        uint256 boughtAmount = IBancorNetwork(state.bancorNetworkAddress).convertByPath.value(payableAmount)(
 | 
			
		||||
            state.path, // path originating with source token and terminating in destination token
 | 
			
		||||
            fromTokenBalance, // amount of source token to trade
 | 
			
		||||
            amount, // minimum amount of destination token expected to receive
 | 
			
		||||
            to, // beneficiary
 | 
			
		||||
            state.path[state.path.length-1] == BANCOR_ETH_ADDRESS ? address(this) : to, // beneficiary
 | 
			
		||||
            address(0), // affiliateAccount; no fee paid
 | 
			
		||||
            0 // affiliateFee; no fee paid
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if (state.path[state.path.length-1] == BANCOR_ETH_ADDRESS) {
 | 
			
		||||
            state.weth.deposit.value(boughtAmount)();
 | 
			
		||||
            state.weth.transfer(to, boughtAmount);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        emit ERC20BridgeTransfer(
 | 
			
		||||
            state.path[0], // fromTokenAddress
 | 
			
		||||
            state.path[0] == BANCOR_ETH_ADDRESS ? address(state.weth) : state.path[0],
 | 
			
		||||
            toTokenAddress,
 | 
			
		||||
            fromTokenBalance,
 | 
			
		||||
            boughtAmount,
 | 
			
		||||
@@ -118,5 +140,5 @@ contract BancorBridge is
 | 
			
		||||
    {
 | 
			
		||||
        return LEGACY_WALLET_MAGIC_VALUE;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										136
									
								
								contracts/asset-proxy/contracts/src/bridges/CryptoComBridge.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								contracts/asset-proxy/contracts/src/bridges/CryptoComBridge.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.5.9;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol";
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol";
 | 
			
		||||
import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/LibAddressArray.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol";
 | 
			
		||||
import "../interfaces/IUniswapV2Router01.sol";
 | 
			
		||||
import "../interfaces/IERC20Bridge.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// solhint-disable space-after-comma
 | 
			
		||||
// solhint-disable not-rely-on-time
 | 
			
		||||
contract CryptoComBridge is
 | 
			
		||||
    IERC20Bridge,
 | 
			
		||||
    IWallet,
 | 
			
		||||
    DeploymentConstants
 | 
			
		||||
{
 | 
			
		||||
    struct TransferState {
 | 
			
		||||
        address[] path;
 | 
			
		||||
        address router;
 | 
			
		||||
        uint256 fromTokenBalance;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of
 | 
			
		||||
    ///      `toTokenAddress` tokens by selling the entirety of the `fromTokenAddress`
 | 
			
		||||
    ///      token encoded in the bridge data.
 | 
			
		||||
    /// @param toTokenAddress The token to buy and transfer to `to`.
 | 
			
		||||
    /// @param from The maker (this contract).
 | 
			
		||||
    /// @param to The recipient of the bought tokens.
 | 
			
		||||
    /// @param amount Minimum amount of `toTokenAddress` tokens to buy.
 | 
			
		||||
    /// @param bridgeData The abi-encoded path of token addresses. Last element must be toTokenAddress
 | 
			
		||||
    /// @return success The magic bytes if successful.
 | 
			
		||||
    function bridgeTransferFrom(
 | 
			
		||||
        address toTokenAddress,
 | 
			
		||||
        address from,
 | 
			
		||||
        address to,
 | 
			
		||||
        uint256 amount,
 | 
			
		||||
        bytes calldata bridgeData
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        returns (bytes4 success)
 | 
			
		||||
    {
 | 
			
		||||
        // hold variables to get around stack depth limitations
 | 
			
		||||
        TransferState memory state;
 | 
			
		||||
 | 
			
		||||
        // Decode the bridge data to get the `fromTokenAddress`.
 | 
			
		||||
        // solhint-disable indent
 | 
			
		||||
        (state.path, state.router) = abi.decode(bridgeData, (address[], address));
 | 
			
		||||
        // solhint-enable indent
 | 
			
		||||
 | 
			
		||||
        require(state.path.length >= 2, "CryptoComBridge/PATH_LENGTH_MUST_BE_AT_LEAST_TWO");
 | 
			
		||||
        require(state.path[state.path.length - 1] == toTokenAddress, "CryptoComBridge/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN");
 | 
			
		||||
 | 
			
		||||
        // Just transfer the tokens if they're the same.
 | 
			
		||||
        if (state.path[0] == toTokenAddress) {
 | 
			
		||||
            LibERC20Token.transfer(state.path[0], to, amount);
 | 
			
		||||
            return BRIDGE_SUCCESS;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Get our balance of `fromTokenAddress` token.
 | 
			
		||||
        state.fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this));
 | 
			
		||||
 | 
			
		||||
        // Grant the SushiSwap router an allowance.
 | 
			
		||||
        LibERC20Token.approveIfBelow(
 | 
			
		||||
            state.path[0],
 | 
			
		||||
            state.router,
 | 
			
		||||
            state.fromTokenBalance
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Buy as much `toTokenAddress` token with `fromTokenAddress` token
 | 
			
		||||
        // and transfer it to `to`.
 | 
			
		||||
        IUniswapV2Router01 router = IUniswapV2Router01(state.router);
 | 
			
		||||
        uint[] memory amounts = router.swapExactTokensForTokens(
 | 
			
		||||
             // Sell all tokens we hold.
 | 
			
		||||
            state.fromTokenBalance,
 | 
			
		||||
             // Minimum buy amount.
 | 
			
		||||
            amount,
 | 
			
		||||
            // Convert `fromTokenAddress` to `toTokenAddress`.
 | 
			
		||||
            state.path,
 | 
			
		||||
            // Recipient is `to`.
 | 
			
		||||
            to,
 | 
			
		||||
            // Expires after this block.
 | 
			
		||||
            block.timestamp
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        emit ERC20BridgeTransfer(
 | 
			
		||||
            // input token
 | 
			
		||||
            state.path[0],
 | 
			
		||||
            // output token
 | 
			
		||||
            toTokenAddress,
 | 
			
		||||
            // input token amount
 | 
			
		||||
            state.fromTokenBalance,
 | 
			
		||||
            // output token amount
 | 
			
		||||
            amounts[amounts.length - 1],
 | 
			
		||||
            from,
 | 
			
		||||
            to
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return BRIDGE_SUCCESS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker
 | 
			
		||||
    ///      and sign for itself in orders. Always succeeds.
 | 
			
		||||
    /// @return magicValue Success bytes, always.
 | 
			
		||||
    function isValidSignature(
 | 
			
		||||
        bytes32,
 | 
			
		||||
        bytes calldata
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (bytes4 magicValue)
 | 
			
		||||
    {
 | 
			
		||||
        return LEGACY_WALLET_MAGIC_VALUE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -56,11 +56,14 @@ contract KyberBridge is
 | 
			
		||||
    uint256 constant private KYBER_RATE_BASE = 10 ** 18;
 | 
			
		||||
 | 
			
		||||
    // solhint-disable no-empty-blocks
 | 
			
		||||
    /// @dev Payable fallback to receive ETH from Kyber.
 | 
			
		||||
    /// @dev Payable fallback to receive ETH from Kyber/WETH.
 | 
			
		||||
    function ()
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
    {}
 | 
			
		||||
    {
 | 
			
		||||
        // Poor man's receive in 0.5.9
 | 
			
		||||
        require(msg.data.length == 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Callback for `IKyberBridge`. Tries to buy `amount` of
 | 
			
		||||
    ///      `toTokenAddress` tokens by selling the entirety of the opposing asset
 | 
			
		||||
 
 | 
			
		||||
@@ -51,16 +51,15 @@ contract ShellBridge is
 | 
			
		||||
        external
 | 
			
		||||
        returns (bytes4 success)
 | 
			
		||||
    {
 | 
			
		||||
        // Decode the bridge data to get the `fromTokenAddress`.
 | 
			
		||||
        (address fromTokenAddress) = abi.decode(bridgeData, (address));
 | 
			
		||||
        // Decode the bridge data to get the `fromTokenAddress` and `pool`.
 | 
			
		||||
        (address fromTokenAddress, address pool) = abi.decode(bridgeData, (address, address));
 | 
			
		||||
 | 
			
		||||
        uint256 fromTokenBalance = IERC20Token(fromTokenAddress).balanceOf(address(this));
 | 
			
		||||
        IShell exchange = IShell(_getShellAddress());
 | 
			
		||||
        // Grant an allowance to the exchange to spend `fromTokenAddress` token.
 | 
			
		||||
        LibERC20Token.approveIfBelow(fromTokenAddress, address(exchange), fromTokenBalance);
 | 
			
		||||
        LibERC20Token.approveIfBelow(fromTokenAddress, pool, fromTokenBalance);
 | 
			
		||||
 | 
			
		||||
        // Try to sell all of this contract's `fromTokenAddress` token balance.
 | 
			
		||||
        uint256 boughtAmount = exchange.originSwap(
 | 
			
		||||
        uint256 boughtAmount = IShell(pool).originSwap(
 | 
			
		||||
            fromTokenAddress,
 | 
			
		||||
            toTokenAddress,
 | 
			
		||||
            fromTokenBalance,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-asset-proxy",
 | 
			
		||||
    "version": "3.6.0",
 | 
			
		||||
    "version": "3.7.2",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -38,7 +38,7 @@
 | 
			
		||||
        "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES"
 | 
			
		||||
    },
 | 
			
		||||
    "config": {
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(BalancerBridge|BancorBridge|ChaiBridge|CreamBridge|CurveBridge|DODOBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IBancorNetwork|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IMooniswap|IShell|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MooniswapBridge|MultiAssetProxy|Ownable|ShellBridge|SnowSwapBridge|StaticCallProxy|SushiSwapBridge|SwerveBridge|TestBancorBridge|TestChaiBridge|TestDexForwarderBridge|TestDydxBridge|TestERC20Bridge|TestEth2DaiBridge|TestKyberBridge|TestStaticCallTarget|TestUniswapBridge|TestUniswapV2Bridge|UniswapBridge|UniswapV2Bridge).json",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(BalancerBridge|BancorBridge|ChaiBridge|CreamBridge|CryptoComBridge|CurveBridge|DODOBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IBancorNetwork|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IMooniswap|IShell|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MooniswapBridge|MultiAssetProxy|Ownable|ShellBridge|SnowSwapBridge|StaticCallProxy|SushiSwapBridge|SwerveBridge|TestBancorBridge|TestChaiBridge|TestDexForwarderBridge|TestDydxBridge|TestERC20Bridge|TestEth2DaiBridge|TestKyberBridge|TestStaticCallTarget|TestUniswapBridge|TestUniswapV2Bridge|UniswapBridge|UniswapV2Bridge).json",
 | 
			
		||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually."
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
@@ -51,13 +51,13 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.9.1",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.11.2",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
@@ -79,17 +79,17 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.9",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.9",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.9",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.20",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.20",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.20",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ import * as BalancerBridge from '../generated-artifacts/BalancerBridge.json';
 | 
			
		||||
import * as BancorBridge from '../generated-artifacts/BancorBridge.json';
 | 
			
		||||
import * as ChaiBridge from '../generated-artifacts/ChaiBridge.json';
 | 
			
		||||
import * as CreamBridge from '../generated-artifacts/CreamBridge.json';
 | 
			
		||||
import * as CryptoComBridge from '../generated-artifacts/CryptoComBridge.json';
 | 
			
		||||
import * as CurveBridge from '../generated-artifacts/CurveBridge.json';
 | 
			
		||||
import * as DexForwarderBridge from '../generated-artifacts/DexForwarderBridge.json';
 | 
			
		||||
import * as DODOBridge from '../generated-artifacts/DODOBridge.json';
 | 
			
		||||
@@ -77,6 +78,7 @@ export const artifacts = {
 | 
			
		||||
    BancorBridge: BancorBridge as ContractArtifact,
 | 
			
		||||
    ChaiBridge: ChaiBridge as ContractArtifact,
 | 
			
		||||
    CreamBridge: CreamBridge as ContractArtifact,
 | 
			
		||||
    CryptoComBridge: CryptoComBridge as ContractArtifact,
 | 
			
		||||
    CurveBridge: CurveBridge as ContractArtifact,
 | 
			
		||||
    DODOBridge: DODOBridge as ContractArtifact,
 | 
			
		||||
    DexForwarderBridge: DexForwarderBridge as ContractArtifact,
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ export * from '../generated-wrappers/balancer_bridge';
 | 
			
		||||
export * from '../generated-wrappers/bancor_bridge';
 | 
			
		||||
export * from '../generated-wrappers/chai_bridge';
 | 
			
		||||
export * from '../generated-wrappers/cream_bridge';
 | 
			
		||||
export * from '../generated-wrappers/crypto_com_bridge';
 | 
			
		||||
export * from '../generated-wrappers/curve_bridge';
 | 
			
		||||
export * from '../generated-wrappers/d_o_d_o_bridge';
 | 
			
		||||
export * from '../generated-wrappers/dex_forwarder_bridge';
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ import * as BalancerBridge from '../test/generated-artifacts/BalancerBridge.json
 | 
			
		||||
import * as BancorBridge from '../test/generated-artifacts/BancorBridge.json';
 | 
			
		||||
import * as ChaiBridge from '../test/generated-artifacts/ChaiBridge.json';
 | 
			
		||||
import * as CreamBridge from '../test/generated-artifacts/CreamBridge.json';
 | 
			
		||||
import * as CryptoComBridge from '../test/generated-artifacts/CryptoComBridge.json';
 | 
			
		||||
import * as CurveBridge from '../test/generated-artifacts/CurveBridge.json';
 | 
			
		||||
import * as DexForwarderBridge from '../test/generated-artifacts/DexForwarderBridge.json';
 | 
			
		||||
import * as DODOBridge from '../test/generated-artifacts/DODOBridge.json';
 | 
			
		||||
@@ -77,6 +78,7 @@ export const artifacts = {
 | 
			
		||||
    BancorBridge: BancorBridge as ContractArtifact,
 | 
			
		||||
    ChaiBridge: ChaiBridge as ContractArtifact,
 | 
			
		||||
    CreamBridge: CreamBridge as ContractArtifact,
 | 
			
		||||
    CryptoComBridge: CryptoComBridge as ContractArtifact,
 | 
			
		||||
    CurveBridge: CurveBridge as ContractArtifact,
 | 
			
		||||
    DODOBridge: DODOBridge as ContractArtifact,
 | 
			
		||||
    DexForwarderBridge: DexForwarderBridge as ContractArtifact,
 | 
			
		||||
 
 | 
			
		||||
@@ -12,13 +12,11 @@ import { DecodedLogs } from 'ethereum-types';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { artifacts } from './artifacts';
 | 
			
		||||
 | 
			
		||||
import { TestBancorBridgeContract } from './generated-wrappers/test_bancor_bridge';
 | 
			
		||||
import {
 | 
			
		||||
    TestBancorBridgeConvertByPathInputEventArgs as ConvertByPathArgs,
 | 
			
		||||
    TestBancorBridgeEvents as ContractEvents,
 | 
			
		||||
    TestBancorBridgeTokenApproveEventArgs as TokenApproveArgs,
 | 
			
		||||
    TestBancorBridgeTokenTransferEventArgs as TokenTransferArgs,
 | 
			
		||||
} from './wrappers';
 | 
			
		||||
 | 
			
		||||
blockchainTests.resets('Bancor unit tests', env => {
 | 
			
		||||
@@ -128,24 +126,6 @@ blockchainTests.resets('Bancor unit tests', env => {
 | 
			
		||||
            expect(result).to.eq(AssetProxyId.ERC20Bridge);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('performs transfer when both tokens are the same', async () => {
 | 
			
		||||
            const createTokenFn = testContract.createToken(constants.NULL_ADDRESS);
 | 
			
		||||
            const tokenAddress = await createTokenFn.callAsync();
 | 
			
		||||
            await createTokenFn.awaitTransactionSuccessAsync();
 | 
			
		||||
 | 
			
		||||
            const { opts, result, logs } = await transferFromAsync({
 | 
			
		||||
                tokenAddressesPath: [tokenAddress, tokenAddress],
 | 
			
		||||
            });
 | 
			
		||||
            expect(result).to.eq(AssetProxyId.ERC20Bridge, 'asset proxy id');
 | 
			
		||||
            const transfers = filterLogsToArguments<TokenTransferArgs>(logs, ContractEvents.TokenTransfer);
 | 
			
		||||
 | 
			
		||||
            expect(transfers.length).to.eq(1);
 | 
			
		||||
            expect(transfers[0].token).to.eq(tokenAddress, 'input token address');
 | 
			
		||||
            expect(transfers[0].from).to.eq(testContract.address);
 | 
			
		||||
            expect(transfers[0].to).to.eq(opts.toAddress, 'recipient address');
 | 
			
		||||
            expect(transfers[0].amount).to.bignumber.eq(opts.amount, 'amount');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        describe('token -> token', async () => {
 | 
			
		||||
            it('calls BancorNetwork.convertByPath()', async () => {
 | 
			
		||||
                const { opts, result, logs } = await transferFromAsync();
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ export * from '../test/generated-wrappers/balancer_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/bancor_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/chai_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/cream_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/crypto_com_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/curve_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/d_o_d_o_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/dex_forwarder_bridge';
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
        "generated-artifacts/BancorBridge.json",
 | 
			
		||||
        "generated-artifacts/ChaiBridge.json",
 | 
			
		||||
        "generated-artifacts/CreamBridge.json",
 | 
			
		||||
        "generated-artifacts/CryptoComBridge.json",
 | 
			
		||||
        "generated-artifacts/CurveBridge.json",
 | 
			
		||||
        "generated-artifacts/DODOBridge.json",
 | 
			
		||||
        "generated-artifacts/DexForwarderBridge.json",
 | 
			
		||||
@@ -65,6 +66,7 @@
 | 
			
		||||
        "test/generated-artifacts/BancorBridge.json",
 | 
			
		||||
        "test/generated-artifacts/ChaiBridge.json",
 | 
			
		||||
        "test/generated-artifacts/CreamBridge.json",
 | 
			
		||||
        "test/generated-artifacts/CryptoComBridge.json",
 | 
			
		||||
        "test/generated-artifacts/CurveBridge.json",
 | 
			
		||||
        "test/generated-artifacts/DODOBridge.json",
 | 
			
		||||
        "test/generated-artifacts/DexForwarderBridge.json",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,112 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "1.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "1.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "1.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "1.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "1.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "1.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "1.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "1.1.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "1.1.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "1.1.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "1.1.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "1.1.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "1.1.8",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,54 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v1.1.20 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.19 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.18 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.17 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.16 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.15 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.14 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.13 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.12 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.11 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.10 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.9 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.1.8 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-broker",
 | 
			
		||||
    "version": "1.1.8",
 | 
			
		||||
    "version": "1.1.20",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -51,20 +51,20 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.0",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.9",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.9",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.9",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.2",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.20",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.21",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.20",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -84,11 +84,11 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,112 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.1.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "3.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.1.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "3.1.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "3.1.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "3.1.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "3.1.9",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,54 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.1.21 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.20 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.19 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.12 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.11 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.10 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.9 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-coordinator",
 | 
			
		||||
    "version": "3.1.9",
 | 
			
		||||
    "version": "3.1.21",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,17 +52,17 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.0",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.7",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.2",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.19",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -82,17 +82,17 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/assert": "^3.0.13",
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/contract-addresses": "^5.0.0",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.9",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/json-schemas": "^5.2.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/assert": "^3.0.19",
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/contract-addresses": "^5.8.0",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.21",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/json-schemas": "^5.3.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "http-status-codes": "^1.3.2"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,112 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "1.3.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "1.3.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "1.3.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "1.3.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "1.3.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "1.3.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "1.3.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "1.3.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "1.3.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "1.3.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "1.3.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "1.3.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "1.3.7",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,54 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v1.3.19 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.18 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.17 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.16 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.15 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.14 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.13 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.12 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.11 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.10 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.9 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.8 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v1.3.7 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-dev-utils",
 | 
			
		||||
    "version": "1.3.7",
 | 
			
		||||
    "version": "1.3.19",
 | 
			
		||||
    "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.3",
 | 
			
		||||
        "@0x/assert": "^3.0.13",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.0",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/assert": "^3.0.19",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.2",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethers": "~4.0.4",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
        "shx": "^0.2.2",
 | 
			
		||||
@@ -63,7 +63,7 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@types/node": "12.12.54"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,103 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "2.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "2.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "2.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "2.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "2.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "2.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "2.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "2.1.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "2.1.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "2.1.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "2.1.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "2.1.9",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,50 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v2.1.20 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.19 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.12 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.11 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.10 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.1.9 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-erc1155",
 | 
			
		||||
    "version": "2.1.9",
 | 
			
		||||
    "version": "2.1.20",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,15 +52,15 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@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.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
@@ -80,10 +80,10 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,103 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.2.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.2.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.2.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.2.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.2.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.2.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.2.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.2.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "3.2.6",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "3.2.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "3.2.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "3.2.3",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,50 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.2.14 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.13 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.12 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.11 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.10 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.9 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.8 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.7 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.6 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.5 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.4 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.3 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-erc20",
 | 
			
		||||
    "version": "3.2.3",
 | 
			
		||||
    "version": "3.2.14",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -51,18 +51,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@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.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -82,7 +82,7 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7"
 | 
			
		||||
        "@0x/base-contract": "^6.2.14"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,103 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.1.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "3.1.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "3.1.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "3.1.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "3.1.9",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,50 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.1.20 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.19 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.12 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.11 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.10 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.1.9 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-erc721",
 | 
			
		||||
    "version": "3.1.9",
 | 
			
		||||
    "version": "3.1.20",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,18 +52,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@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.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "lodash": "^4.17.11",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
        "mocha": "^6.2.0",
 | 
			
		||||
@@ -84,7 +84,7 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7"
 | 
			
		||||
        "@0x/base-contract": "^6.2.14"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,112 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "4.2.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "4.2.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "4.2.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "4.2.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "4.2.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "4.2.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "4.2.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "4.2.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "4.2.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "4.2.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "4.2.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "4.2.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "4.2.9",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,54 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.2.21 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.20 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.19 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.12 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.11 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.10 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.2.9 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-exchange-forwarder",
 | 
			
		||||
    "version": "4.2.9",
 | 
			
		||||
    "version": "4.2.21",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,25 +52,25 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.0",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.7",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.9",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.9",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.9",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.9",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.2",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.19",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.20",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.20",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.21",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.20",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -90,9 +90,9 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,103 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "4.3.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "4.3.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "4.3.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "4.3.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "4.3.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "4.3.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "4.3.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "4.3.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "4.3.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "4.3.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "4.3.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "4.3.9",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,50 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.3.20 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.19 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.12 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.11 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.10 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.3.9 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-exchange-libs",
 | 
			
		||||
    "version": "4.3.9",
 | 
			
		||||
    "version": "4.3.20",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,14 +52,14 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/libs",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/subproviders": "^6.1.5",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/subproviders": "^6.2.3",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -80,14 +80,14 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,112 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "3.2.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "3.2.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "3.2.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "3.2.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "3.2.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "3.2.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "3.2.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "3.2.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "3.2.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "3.2.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "3.2.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "3.2.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "3.2.9",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,54 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v3.2.21 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.20 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.19 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.12 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.11 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.10 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v3.2.9 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-exchange",
 | 
			
		||||
    "version": "3.2.9",
 | 
			
		||||
    "version": "3.2.21",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,21 +52,21 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.0",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.9",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.9",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.16",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.2",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.20",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.21",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.28",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -74,7 +74,7 @@
 | 
			
		||||
        "chai-as-promised": "^7.1.0",
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "js-combinatorics": "^0.5.3",
 | 
			
		||||
        "make-promises-safe": "^1.1.0",
 | 
			
		||||
@@ -88,13 +88,13 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.7",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.9",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.9",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.19",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.20",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.20",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,112 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "6.2.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "6.2.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "6.2.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "6.2.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "6.2.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "6.2.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "6.2.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "6.2.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "6.2.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "6.2.6",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "6.2.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "6.2.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "6.2.3",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,54 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v6.2.15 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.14 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.13 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.12 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.11 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.10 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.9 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.8 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.7 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.6 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.5 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.4 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v6.2.3 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-extensions",
 | 
			
		||||
    "version": "6.2.3",
 | 
			
		||||
    "version": "6.2.15",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -52,23 +52,23 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.0",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.7",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.9",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.9",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.9",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.2",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.19",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.20",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.21",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.20",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -90,10 +90,10 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,76 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "2.7.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605320370,
 | 
			
		||||
        "version": "2.7.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "2.7.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604620645,
 | 
			
		||||
        "version": "2.7.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "2.7.6",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "2.7.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "2.7.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "2.7.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "2.7.2",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,38 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v2.7.10 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.9 - _November 14, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.8 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.7 - _November 5, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.6 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.5 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.4 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.3 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.7.2 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-zero-ex/contracts/test/TestFixinProtocolFees.sol";
 | 
			
		||||
import "@0x/contracts-zero-ex/contracts/src/external/FeeCollectorController.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract TestFixinProtocolFeesIntegration is TestFixinProtocolFees {
 | 
			
		||||
    constructor(
 | 
			
		||||
        IEtherTokenV06 weth,
 | 
			
		||||
        IStaking staking,
 | 
			
		||||
        uint32 protocolFeeMultiplier
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        TestFixinProtocolFees(
 | 
			
		||||
            weth,
 | 
			
		||||
            staking,
 | 
			
		||||
            new FeeCollectorController(weth, staking),
 | 
			
		||||
            protocolFeeMultiplier
 | 
			
		||||
        )
 | 
			
		||||
    {}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										110
									
								
								contracts/integrations/contracts/test/TestStaking.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								contracts/integrations/contracts/test/TestStaking.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,110 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2019 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.5.9;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-staking/contracts/src/Staking.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract TestStaking is
 | 
			
		||||
    Staking
 | 
			
		||||
{
 | 
			
		||||
    IEtherToken public testWeth;
 | 
			
		||||
 | 
			
		||||
    struct TestPool {
 | 
			
		||||
        uint96 operatorStake;
 | 
			
		||||
        uint96 membersStake;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mapping(bytes32 => TestPool) private _testPools;
 | 
			
		||||
 | 
			
		||||
    constructor(address exchangeAddress, IEtherToken _testWeth) public {
 | 
			
		||||
        testWeth = _testWeth;
 | 
			
		||||
 | 
			
		||||
        _addAuthorizedAddress(msg.sender);
 | 
			
		||||
        init();
 | 
			
		||||
        validExchanges[exchangeAddress] = true;
 | 
			
		||||
        _removeAuthorizedAddressAtIndex(msg.sender, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function advanceEpoch()
 | 
			
		||||
        external
 | 
			
		||||
    {
 | 
			
		||||
        currentEpoch += 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Create a test pool.
 | 
			
		||||
    function createTestPool(
 | 
			
		||||
        bytes32 poolId,
 | 
			
		||||
        uint96 operatorStake,
 | 
			
		||||
        uint96 membersStake
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
    {
 | 
			
		||||
        TestPool storage pool = _testPools[poolId];
 | 
			
		||||
        pool.operatorStake = operatorStake;
 | 
			
		||||
        pool.membersStake = membersStake;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getAggregatedStatsForCurrentEpoch()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (IStructs.AggregatedStats memory)
 | 
			
		||||
    {
 | 
			
		||||
        return aggregatedStatsByEpoch[currentEpoch];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Overridden to use test pools.
 | 
			
		||||
    function getTotalStakeDelegatedToPool(bytes32 poolId)
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (IStructs.StoredBalance memory balance)
 | 
			
		||||
    {
 | 
			
		||||
        TestPool memory pool = _testPools[poolId];
 | 
			
		||||
        uint96 stake = pool.operatorStake + pool.membersStake;
 | 
			
		||||
        return IStructs.StoredBalance({
 | 
			
		||||
            currentEpoch: currentEpoch.downcastToUint64(),
 | 
			
		||||
            currentEpochBalance: stake,
 | 
			
		||||
            nextEpochBalance: stake
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Overridden to use test pools.
 | 
			
		||||
    function getStakeDelegatedToPoolByOwner(address, bytes32 poolId)
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (IStructs.StoredBalance memory balance)
 | 
			
		||||
    {
 | 
			
		||||
        TestPool memory pool = _testPools[poolId];
 | 
			
		||||
        return IStructs.StoredBalance({
 | 
			
		||||
            currentEpoch: currentEpoch.downcastToUint64(),
 | 
			
		||||
            currentEpochBalance: pool.operatorStake,
 | 
			
		||||
            nextEpochBalance: pool.operatorStake
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getWethContract()
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (IEtherToken wethContract)
 | 
			
		||||
    {
 | 
			
		||||
        return testWeth;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-zero-ex/contracts/test/TestWeth.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract TestWethIntegration is TestWeth {}
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-integrations",
 | 
			
		||||
    "version": "2.7.2",
 | 
			
		||||
    "version": "2.7.20",
 | 
			
		||||
    "private": true,
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -38,7 +39,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "config": {
 | 
			
		||||
        "publicInterfaceContracts": "TestFramework",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(ChainlinkStopLimit|IChainlinkAggregator|TestChainlinkAggregator|TestContractWrapper|TestDydxUser|TestEth2Dai|TestEth2DaiBridge|TestFramework|TestMainnetAggregatorFills|TestSignatureValidationWallet|TestUniswapBridge|TestUniswapExchange|TestUniswapExchangeFactory).json",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(ChainlinkStopLimit|IChainlinkAggregator|TestChainlinkAggregator|TestContractWrapper|TestDydxUser|TestEth2Dai|TestEth2DaiBridge|TestFixinProtocolFeesIntegration|TestFramework|TestMainnetAggregatorFills|TestSignatureValidationWallet|TestStaking|TestUniswapBridge|TestUniswapExchange|TestUniswapExchangeFactory|TestWethIntegration).json",
 | 
			
		||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually."
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
@@ -51,24 +52,25 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contract-addresses": "^5.0.0",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.9.1",
 | 
			
		||||
        "@0x/contracts-broker": "^1.1.8",
 | 
			
		||||
        "@0x/contracts-coordinator": "^3.1.9",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.7",
 | 
			
		||||
        "@0x/contracts-exchange-forwarder": "^4.2.9",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.9",
 | 
			
		||||
        "@0x/contracts-extensions": "^6.2.3",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contract-addresses": "^5.8.0",
 | 
			
		||||
        "@0x/contract-wrappers": "^13.11.2",
 | 
			
		||||
        "@0x/contracts-broker": "^1.1.20",
 | 
			
		||||
        "@0x/contracts-coordinator": "^3.1.21",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.19",
 | 
			
		||||
        "@0x/contracts-exchange-forwarder": "^4.2.21",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.20",
 | 
			
		||||
        "@0x/contracts-extensions": "^6.2.15",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/coordinator-server": "^1.0.5",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/migrations": "^6.4.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/migrations": "^6.5.8",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/protocol-utils": "^1.1.2",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@azure/core-asynciterator-polyfill": "^1.0.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
@@ -91,22 +93,22 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/asset-swapper": "^4.8.0",
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.0",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.9",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.9",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.9",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.9",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.16",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-zero-ex": "^0.5.0",
 | 
			
		||||
        "@0x/subproviders": "^6.1.5",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/asset-swapper": "^5.6.0",
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.2",
 | 
			
		||||
        "@0x/contracts-erc1155": "^2.1.20",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-erc721": "^3.1.20",
 | 
			
		||||
        "@0x/contracts-exchange": "^3.2.21",
 | 
			
		||||
        "@0x/contracts-multisig": "^4.1.21",
 | 
			
		||||
        "@0x/contracts-staking": "^2.0.28",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-zero-ex": "^0.16.0",
 | 
			
		||||
        "@0x/subproviders": "^6.2.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^6.2.0",
 | 
			
		||||
        "lodash": "^4.17.11"
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -12,12 +12,15 @@ import * as TestContractWrapper from '../test/generated-artifacts/TestContractWr
 | 
			
		||||
import * as TestDydxUser from '../test/generated-artifacts/TestDydxUser.json';
 | 
			
		||||
import * as TestEth2Dai from '../test/generated-artifacts/TestEth2Dai.json';
 | 
			
		||||
import * as TestEth2DaiBridge from '../test/generated-artifacts/TestEth2DaiBridge.json';
 | 
			
		||||
import * as TestFixinProtocolFeesIntegration from '../test/generated-artifacts/TestFixinProtocolFeesIntegration.json';
 | 
			
		||||
import * as TestFramework from '../test/generated-artifacts/TestFramework.json';
 | 
			
		||||
import * as TestMainnetAggregatorFills from '../test/generated-artifacts/TestMainnetAggregatorFills.json';
 | 
			
		||||
import * as TestSignatureValidationWallet from '../test/generated-artifacts/TestSignatureValidationWallet.json';
 | 
			
		||||
import * as TestStaking from '../test/generated-artifacts/TestStaking.json';
 | 
			
		||||
import * as TestUniswapBridge from '../test/generated-artifacts/TestUniswapBridge.json';
 | 
			
		||||
import * as TestUniswapExchange from '../test/generated-artifacts/TestUniswapExchange.json';
 | 
			
		||||
import * as TestUniswapExchangeFactory from '../test/generated-artifacts/TestUniswapExchangeFactory.json';
 | 
			
		||||
import * as TestWethIntegration from '../test/generated-artifacts/TestWethIntegration.json';
 | 
			
		||||
export const artifacts = {
 | 
			
		||||
    ChainlinkStopLimit: ChainlinkStopLimit as ContractArtifact,
 | 
			
		||||
    IChainlinkAggregator: IChainlinkAggregator as ContractArtifact,
 | 
			
		||||
@@ -26,10 +29,13 @@ export const artifacts = {
 | 
			
		||||
    TestDydxUser: TestDydxUser as ContractArtifact,
 | 
			
		||||
    TestEth2Dai: TestEth2Dai as ContractArtifact,
 | 
			
		||||
    TestEth2DaiBridge: TestEth2DaiBridge as ContractArtifact,
 | 
			
		||||
    TestFixinProtocolFeesIntegration: TestFixinProtocolFeesIntegration as ContractArtifact,
 | 
			
		||||
    TestFramework: TestFramework as ContractArtifact,
 | 
			
		||||
    TestMainnetAggregatorFills: TestMainnetAggregatorFills as ContractArtifact,
 | 
			
		||||
    TestSignatureValidationWallet: TestSignatureValidationWallet as ContractArtifact,
 | 
			
		||||
    TestStaking: TestStaking as ContractArtifact,
 | 
			
		||||
    TestUniswapBridge: TestUniswapBridge as ContractArtifact,
 | 
			
		||||
    TestUniswapExchange: TestUniswapExchange as ContractArtifact,
 | 
			
		||||
    TestUniswapExchangeFactory: TestUniswapExchangeFactory as ContractArtifact,
 | 
			
		||||
    TestWethIntegration: TestWethIntegration as ContractArtifact,
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -6,24 +6,31 @@ import {
 | 
			
		||||
    artifacts as exchangeProxyArtifacts,
 | 
			
		||||
    IZeroExContract,
 | 
			
		||||
    LogMetadataTransformerContract,
 | 
			
		||||
    signCallData,
 | 
			
		||||
} from '@0x/contracts-zero-ex';
 | 
			
		||||
import { migrateOnceAsync } from '@0x/migrations';
 | 
			
		||||
import { assetDataUtils, signatureUtils, SignedExchangeProxyMetaTransaction } from '@0x/order-utils';
 | 
			
		||||
import {
 | 
			
		||||
    assetDataUtils,
 | 
			
		||||
    encodeFillQuoteTransformerData,
 | 
			
		||||
    encodePayTakerTransformerData,
 | 
			
		||||
    ETH_TOKEN_ADDRESS,
 | 
			
		||||
    FillQuoteTransformerSide,
 | 
			
		||||
    findTransformerNonce,
 | 
			
		||||
    signatureUtils,
 | 
			
		||||
    SignedExchangeProxyMetaTransaction,
 | 
			
		||||
} from '@0x/order-utils';
 | 
			
		||||
    Signature,
 | 
			
		||||
} from '@0x/protocol-utils';
 | 
			
		||||
import { AssetProxyId, Order, SignedOrder } from '@0x/types';
 | 
			
		||||
import { BigNumber, hexUtils, ZeroExRevertErrors } from '@0x/utils';
 | 
			
		||||
import { BigNumber, hexUtils } from '@0x/utils';
 | 
			
		||||
import * as ethjs from 'ethereumjs-util';
 | 
			
		||||
 | 
			
		||||
const { MAX_UINT256, NULL_ADDRESS, NULL_BYTES, NULL_BYTES32, ZERO_AMOUNT } = constants;
 | 
			
		||||
const { MAX_UINT256, NULL_ADDRESS, NULL_BYTES, ZERO_AMOUNT } = constants;
 | 
			
		||||
 | 
			
		||||
function sigstruct(signature: string): Signature {
 | 
			
		||||
    return {
 | 
			
		||||
        v: parseInt(hexUtils.slice(signature, 0, 1), 16),
 | 
			
		||||
        signatureType: parseInt(hexUtils.slice(signature, 65, 66), 16),
 | 
			
		||||
        r: hexUtils.slice(signature, 1, 33),
 | 
			
		||||
        s: hexUtils.slice(signature, 33, 65),
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
    const quoteSignerKey = hexUtils.random();
 | 
			
		||||
@@ -188,21 +195,6 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
            .getABIEncodedTransactionData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getSignedSwapData(swap: SwapInfo, signerKey?: string): string {
 | 
			
		||||
        return signCallData(
 | 
			
		||||
            zeroEx
 | 
			
		||||
                .transformERC20(
 | 
			
		||||
                    swap.inputTokenAddress,
 | 
			
		||||
                    swap.outputTokenAddress,
 | 
			
		||||
                    swap.inputTokenAmount,
 | 
			
		||||
                    swap.minOutputTokenAmount,
 | 
			
		||||
                    swap.transformations,
 | 
			
		||||
                )
 | 
			
		||||
                .getABIEncodedTransactionData(),
 | 
			
		||||
            signerKey ? signerKey : quoteSignerKey,
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async function createMetaTransactionAsync(
 | 
			
		||||
        data: string,
 | 
			
		||||
        value: BigNumber,
 | 
			
		||||
@@ -232,15 +224,13 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    it('can call `transformERC20()` with signed calldata and no relayer fee', async () => {
 | 
			
		||||
    it('can call `transformERC20()` with calldata and no relayer fee', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync();
 | 
			
		||||
        const callDataHash = hexUtils.hash(getSwapData(swap));
 | 
			
		||||
        const signedSwapData = getSignedSwapData(swap);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee, 0);
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(getSwapData(swap), _protocolFee, 0);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .executeMetaTransaction(mtx, sigstruct(mtx.signature))
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
@@ -259,7 +249,6 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    callDataHash,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
@@ -268,15 +257,13 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('can call `transformERC20()` with signed calldata and a relayer fee', async () => {
 | 
			
		||||
    it('can call `transformERC20()` with calldata and a relayer fee', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync();
 | 
			
		||||
        const callDataHash = hexUtils.hash(getSwapData(swap));
 | 
			
		||||
        const signedSwapData = getSignedSwapData(swap);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee);
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(getSwapData(swap), _protocolFee);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .executeMetaTransaction(mtx, sigstruct(mtx.signature))
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
@@ -295,7 +282,6 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    callDataHash,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
@@ -304,51 +290,13 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('can call `transformERC20()` with wrongly signed calldata and a relayer fee', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync();
 | 
			
		||||
        const signedSwapData = getSignedSwapData(swap, hexUtils.random());
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
            .minus(GAS_PRICE.times(receipt.gasUsed));
 | 
			
		||||
        // Ensure the relayer got back the unused protocol fees.
 | 
			
		||||
        expect(relayerEthRefund).to.bignumber.eq(protocolFee.times(GAS_PRICE));
 | 
			
		||||
        // Ensure the relayer got paid mtx fees.
 | 
			
		||||
        expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(mtx.feeAmount);
 | 
			
		||||
        // Ensure the taker got output tokens.
 | 
			
		||||
        expect(await outputToken.balanceOf(taker).callAsync()).to.bignumber.eq(swap.minOutputTokenAmount);
 | 
			
		||||
        // Ensure the maker got input tokens.
 | 
			
		||||
        expect(await inputToken.balanceOf(maker).callAsync()).to.bignumber.eq(swap.inputTokenAmount);
 | 
			
		||||
        // Check events.
 | 
			
		||||
        verifyEventsFromLogs(
 | 
			
		||||
            receipt.logs,
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    // Only signed calldata should have a nonzero hash.
 | 
			
		||||
                    callDataHash: NULL_BYTES32,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
            'TransformerMetadata',
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('`transformERC20()` can fill RFQT order if calldata is signed', async () => {
 | 
			
		||||
    it('`transformERC20()` can fill RFQT order', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync({}, true);
 | 
			
		||||
        const callDataHash = hexUtils.hash(getSwapData(swap));
 | 
			
		||||
        const signedSwapData = getSignedSwapData(swap);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(signedSwapData, _protocolFee, 0);
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(getSwapData(swap), _protocolFee, 0);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .executeMetaTransaction(mtx, sigstruct(mtx.signature))
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
@@ -367,7 +315,6 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    callDataHash,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
@@ -376,16 +323,15 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('`transformERC20()` can fill RFQT order if calldata is not signed but no quote signer configured', async () => {
 | 
			
		||||
    it('`transformERC20()` can fill RFQT order if quote signer configured', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync({}, true);
 | 
			
		||||
        const callData = getSwapData(swap);
 | 
			
		||||
        const callDataHash = hexUtils.hash(callData);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(callData, _protocolFee, 0);
 | 
			
		||||
        const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer);
 | 
			
		||||
        await zeroEx.setQuoteSigner(NULL_ADDRESS).awaitTransactionSuccessAsync({ from: owner });
 | 
			
		||||
        const receipt = await zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .executeMetaTransaction(mtx, sigstruct(mtx.signature))
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        const relayerEthRefund = relayerEthBalanceBefore
 | 
			
		||||
            .minus(await env.web3Wrapper.getBalanceInWeiAsync(relayer))
 | 
			
		||||
@@ -404,7 +350,6 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
            [
 | 
			
		||||
                {
 | 
			
		||||
                    taker,
 | 
			
		||||
                    callDataHash,
 | 
			
		||||
                    sender: zeroEx.address,
 | 
			
		||||
                    data: NULL_BYTES,
 | 
			
		||||
                },
 | 
			
		||||
@@ -412,15 +357,4 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => {
 | 
			
		||||
            'TransformerMetadata',
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('`transformERC20()` cannot fill RFQT order if calldata is not signed', async () => {
 | 
			
		||||
        const swap = await generateSwapAsync({}, true);
 | 
			
		||||
        const callData = getSwapData(swap);
 | 
			
		||||
        const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed.
 | 
			
		||||
        const mtx = await createMetaTransactionAsync(callData, _protocolFee, 0);
 | 
			
		||||
        const tx = zeroEx
 | 
			
		||||
            .executeMetaTransaction(mtx, mtx.signature)
 | 
			
		||||
            .awaitTransactionSuccessAsync({ from: relayer, value: mtx.value, gasPrice: GAS_PRICE });
 | 
			
		||||
        return expect(tx).to.revertWith(new ZeroExRevertErrors.MetaTransactions.MetaTransactionCallFailedError());
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -10,9 +10,12 @@ export * from '../test/generated-wrappers/test_contract_wrapper';
 | 
			
		||||
export * from '../test/generated-wrappers/test_dydx_user';
 | 
			
		||||
export * from '../test/generated-wrappers/test_eth2_dai';
 | 
			
		||||
export * from '../test/generated-wrappers/test_eth2_dai_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/test_fixin_protocol_fees_integration';
 | 
			
		||||
export * from '../test/generated-wrappers/test_framework';
 | 
			
		||||
export * from '../test/generated-wrappers/test_mainnet_aggregator_fills';
 | 
			
		||||
export * from '../test/generated-wrappers/test_signature_validation_wallet';
 | 
			
		||||
export * from '../test/generated-wrappers/test_staking';
 | 
			
		||||
export * from '../test/generated-wrappers/test_uniswap_bridge';
 | 
			
		||||
export * from '../test/generated-wrappers/test_uniswap_exchange';
 | 
			
		||||
export * from '../test/generated-wrappers/test_uniswap_exchange_factory';
 | 
			
		||||
export * from '../test/generated-wrappers/test_weth_integration';
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,85 @@
 | 
			
		||||
import { blockchainTests, constants, expect } from '@0x/contracts-test-utils';
 | 
			
		||||
import { BigNumber, hexUtils } from '@0x/utils';
 | 
			
		||||
 | 
			
		||||
import { artifacts } from '../artifacts';
 | 
			
		||||
import {
 | 
			
		||||
    TestFixinProtocolFeesIntegrationContract,
 | 
			
		||||
    TestStakingContract,
 | 
			
		||||
    TestWethIntegrationContract,
 | 
			
		||||
} from '../wrappers';
 | 
			
		||||
 | 
			
		||||
blockchainTests.resets('ProtocolFeeIntegration', env => {
 | 
			
		||||
    const FEE_MULTIPLIER = 70e3;
 | 
			
		||||
    let owner: string;
 | 
			
		||||
    let taker: string;
 | 
			
		||||
    let protocolFees: TestFixinProtocolFeesIntegrationContract;
 | 
			
		||||
    let staking: TestStakingContract;
 | 
			
		||||
    let weth: TestWethIntegrationContract;
 | 
			
		||||
    let singleFeeAmount: BigNumber;
 | 
			
		||||
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        [owner, taker] = await env.getAccountAddressesAsync();
 | 
			
		||||
        weth = await TestWethIntegrationContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            artifacts.TestWethIntegration,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            artifacts,
 | 
			
		||||
        );
 | 
			
		||||
        staking = await TestStakingContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            artifacts.TestStaking,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            env.txDefaults,
 | 
			
		||||
            artifacts,
 | 
			
		||||
            constants.NULL_ADDRESS, // exchange address, which we don't know yet
 | 
			
		||||
            weth.address,
 | 
			
		||||
        );
 | 
			
		||||
        protocolFees = await TestFixinProtocolFeesIntegrationContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            artifacts.TestFixinProtocolFeesIntegration,
 | 
			
		||||
            env.provider,
 | 
			
		||||
            { ...env.txDefaults, from: taker },
 | 
			
		||||
            artifacts,
 | 
			
		||||
            weth.address,
 | 
			
		||||
            staking.address,
 | 
			
		||||
            FEE_MULTIPLIER,
 | 
			
		||||
        );
 | 
			
		||||
        await staking.addAuthorizedAddress(owner).awaitTransactionSuccessAsync();
 | 
			
		||||
        await staking.addExchangeAddress(protocolFees.address).awaitTransactionSuccessAsync({ from: owner });
 | 
			
		||||
        await weth.mint(taker, constants.ONE_ETHER).awaitTransactionSuccessAsync();
 | 
			
		||||
        await weth.approve(protocolFees.address, constants.ONE_ETHER).awaitTransactionSuccessAsync({ from: taker });
 | 
			
		||||
 | 
			
		||||
        singleFeeAmount = await protocolFees.getSingleProtocolFee().callAsync();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('fee collection integration', () => {
 | 
			
		||||
        const pool0 = constants.NULL_BYTES32;
 | 
			
		||||
        const poolId = hexUtils.random();
 | 
			
		||||
 | 
			
		||||
        it('should collect fees for pool 0', async () => {
 | 
			
		||||
            await protocolFees.collectProtocolFee(pool0).awaitTransactionSuccessAsync({ value: singleFeeAmount });
 | 
			
		||||
            await protocolFees.transferFeesForPool(pool0).awaitTransactionSuccessAsync();
 | 
			
		||||
 | 
			
		||||
            // Fees in the pool bytes32(0) don't get attributed to a pool.
 | 
			
		||||
            await expect(
 | 
			
		||||
                (await staking.getStakingPoolStatsThisEpoch(pool0).callAsync()).feesCollected,
 | 
			
		||||
            ).to.bignumber.equal(constants.ZERO_AMOUNT);
 | 
			
		||||
 | 
			
		||||
            // Expected amount is singleFeeAmount - 1 because we leave 1 wei of WETH behind for future gas savings.
 | 
			
		||||
            return expect(await weth.balanceOf(staking.address).callAsync()).to.bignumber.equal(
 | 
			
		||||
                singleFeeAmount.minus(1),
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should collect fees for non-zero pool', async () => {
 | 
			
		||||
            const eth100 = constants.ONE_ETHER.multipliedBy(100);
 | 
			
		||||
            await staking.createTestPool(poolId, eth100, eth100).awaitTransactionSuccessAsync();
 | 
			
		||||
 | 
			
		||||
            await protocolFees.collectProtocolFee(poolId).awaitTransactionSuccessAsync({ value: singleFeeAmount });
 | 
			
		||||
            await protocolFees.transferFeesForPool(poolId).awaitTransactionSuccessAsync();
 | 
			
		||||
 | 
			
		||||
            // Expected amount is singleFeeAmount - 1 because we leave 1 wei of WETH behind for future gas savings.
 | 
			
		||||
            return expect(
 | 
			
		||||
                (await staking.getStakingPoolStatsThisEpoch(poolId).callAsync()).feesCollected,
 | 
			
		||||
            ).to.bignumber.equal(singleFeeAmount.minus(1));
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -11,11 +11,14 @@
 | 
			
		||||
        "test/generated-artifacts/TestDydxUser.json",
 | 
			
		||||
        "test/generated-artifacts/TestEth2Dai.json",
 | 
			
		||||
        "test/generated-artifacts/TestEth2DaiBridge.json",
 | 
			
		||||
        "test/generated-artifacts/TestFixinProtocolFeesIntegration.json",
 | 
			
		||||
        "test/generated-artifacts/TestFramework.json",
 | 
			
		||||
        "test/generated-artifacts/TestMainnetAggregatorFills.json",
 | 
			
		||||
        "test/generated-artifacts/TestSignatureValidationWallet.json",
 | 
			
		||||
        "test/generated-artifacts/TestStaking.json",
 | 
			
		||||
        "test/generated-artifacts/TestUniswapBridge.json",
 | 
			
		||||
        "test/generated-artifacts/TestUniswapExchange.json",
 | 
			
		||||
        "test/generated-artifacts/TestUniswapExchangeFactory.json"
 | 
			
		||||
        "test/generated-artifacts/TestUniswapExchangeFactory.json",
 | 
			
		||||
        "test/generated-artifacts/TestWethIntegration.json"
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,112 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "4.1.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "4.1.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "4.1.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "4.1.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "4.1.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "4.1.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "4.1.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "4.1.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "4.1.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "4.1.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "4.1.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "4.1.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "4.1.9",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,54 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.1.21 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.20 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.19 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.18 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.17 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.16 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.15 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.14 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.13 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.12 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.11 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.10 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.1.9 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-multisig",
 | 
			
		||||
    "version": "4.1.9",
 | 
			
		||||
    "version": "4.1.21",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -49,18 +49,18 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/multisig",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.0",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.2",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
@@ -78,9 +78,9 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,112 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "2.0.28",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "2.0.27",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608105788,
 | 
			
		||||
        "version": "2.0.26",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "2.0.25",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "2.0.24",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "2.0.23",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "2.0.22",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "2.0.21",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "2.0.20",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "2.0.19",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "2.0.18",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "2.0.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "2.0.16",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,54 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v2.0.28 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.27 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.26 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.25 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.24 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.23 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.22 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.21 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.20 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.19 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.18 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.17 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v2.0.16 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
    "artifactsDir": "./test/generated-artifacts",
 | 
			
		||||
    "contractsDir": "./contracts",
 | 
			
		||||
    "useDockerisedSolc": false,
 | 
			
		||||
    "isOfflineMode": true,
 | 
			
		||||
    "isOfflineMode": false,
 | 
			
		||||
    "shouldSaveStandardInput": true,
 | 
			
		||||
    "compilerSettings": {
 | 
			
		||||
        "evmVersion": "istanbul",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-staking",
 | 
			
		||||
    "version": "2.0.16",
 | 
			
		||||
    "version": "2.0.28",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -53,20 +53,20 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.6.0",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.7",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.3",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.9",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-utils": "^4.5.3",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-asset-proxy": "^3.7.2",
 | 
			
		||||
        "@0x/contracts-dev-utils": "^1.3.19",
 | 
			
		||||
        "@0x/contracts-erc20": "^3.2.14",
 | 
			
		||||
        "@0x/contracts-exchange-libs": "^4.3.20",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-utils": "^4.6.5",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/ts-doc-gen": "^0.0.28",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/node": "12.12.54",
 | 
			
		||||
        "chai": "^4.0.1",
 | 
			
		||||
@@ -87,11 +87,11 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,103 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "5.3.17",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "5.3.16",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "5.3.15",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "5.3.14",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "5.3.13",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605763885,
 | 
			
		||||
        "version": "5.3.12",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "5.3.11",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "5.3.10",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "5.3.9",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "5.3.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "5.3.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "5.3.6",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,50 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v5.3.17 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.16 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.15 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.14 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.13 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.12 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.11 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.10 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.9 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.8 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.7 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v5.3.6 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-test-utils",
 | 
			
		||||
    "version": "5.3.6",
 | 
			
		||||
    "version": "5.3.17",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -34,7 +34,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "npm-run-all": "^4.1.2",
 | 
			
		||||
        "shx": "^0.2.2",
 | 
			
		||||
@@ -42,20 +42,20 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/assert": "^3.0.13",
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/contract-addresses": "^5.0.0",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/json-schemas": "^5.2.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/sol-coverage": "^4.0.14",
 | 
			
		||||
        "@0x/sol-profiler": "^4.1.4",
 | 
			
		||||
        "@0x/sol-trace": "^3.0.14",
 | 
			
		||||
        "@0x/subproviders": "^6.1.5",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/assert": "^3.0.19",
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/contract-addresses": "^5.8.0",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/json-schemas": "^5.3.4",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/sol-coverage": "^4.0.24",
 | 
			
		||||
        "@0x/sol-profiler": "^4.1.14",
 | 
			
		||||
        "@0x/sol-trace": "^3.0.24",
 | 
			
		||||
        "@0x/subproviders": "^6.2.3",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/bn.js": "^4.11.0",
 | 
			
		||||
        "@types/js-combinatorics": "^0.5.29",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
@@ -67,7 +67,7 @@
 | 
			
		||||
        "chai-bignumber": "^3.0.0",
 | 
			
		||||
        "decimal.js": "^10.2.0",
 | 
			
		||||
        "dirty-chai": "^2.0.1",
 | 
			
		||||
        "ethereum-types": "^3.3.3",
 | 
			
		||||
        "ethereum-types": "^3.4.0",
 | 
			
		||||
        "ethereumjs-util": "^5.1.1",
 | 
			
		||||
        "ethers": "~4.0.4",
 | 
			
		||||
        "js-combinatorics": "^0.5.3",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,104 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608692071,
 | 
			
		||||
        "version": "4.6.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1608245516,
 | 
			
		||||
        "version": "4.6.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607485227,
 | 
			
		||||
        "version": "4.6.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "4.6.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1606961263,
 | 
			
		||||
        "version": "4.6.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "4.6.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add `uint128` functions to `LibSafeMathV06`",
 | 
			
		||||
                "pr": 27
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1605763885
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1605302002,
 | 
			
		||||
        "version": "4.5.8",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604385937,
 | 
			
		||||
        "version": "4.5.7",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604376968,
 | 
			
		||||
        "version": "4.5.6",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1604355662,
 | 
			
		||||
        "version": "4.5.5",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "4.5.4",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603833198,
 | 
			
		||||
        "version": "4.5.3",
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,50 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v4.6.5 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.4 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.3 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.2 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.1 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.6.0 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Add `uint128` functions to `LibSafeMathV06` (#27)
 | 
			
		||||
 | 
			
		||||
## v4.5.8 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.5.7 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.5.6 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.5.5 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.5.4 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v4.5.3 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 
 | 
			
		||||
@@ -56,8 +56,6 @@ contract DeploymentConstants {
 | 
			
		||||
    address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;
 | 
			
		||||
    /// @dev Mainnet address of the Mooniswap Registry contract
 | 
			
		||||
    address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;
 | 
			
		||||
    /// @dev Mainnet address of the Shell contract
 | 
			
		||||
    address constant private SHELL_CONTRACT = 0x2E703D658f8dd21709a7B458967aB4081F8D3d05;
 | 
			
		||||
    /// @dev Mainnet address of the DODO Registry (ZOO) contract
 | 
			
		||||
    address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;
 | 
			
		||||
    /// @dev Mainnet address of the DODO Helper contract
 | 
			
		||||
@@ -303,16 +301,6 @@ contract DeploymentConstants {
 | 
			
		||||
        return MOONISWAP_REGISTRY;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev An overridable way to retrieve the Shell contract address.
 | 
			
		||||
    /// @return registry The Shell contract address.
 | 
			
		||||
    function _getShellAddress()
 | 
			
		||||
        internal
 | 
			
		||||
        view
 | 
			
		||||
        returns (address)
 | 
			
		||||
    {
 | 
			
		||||
        return SHELL_CONTRACT;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev An overridable way to retrieve the DODO Registry contract address.
 | 
			
		||||
    /// @return registry The DODO Registry contract address.
 | 
			
		||||
    function _getDODORegistryAddress()
 | 
			
		||||
 
 | 
			
		||||
@@ -105,4 +105,86 @@ library LibSafeMathV06 {
 | 
			
		||||
    {
 | 
			
		||||
        return a < b ? a : b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function safeMul128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        if (a == 0) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        uint128 c = a * b;
 | 
			
		||||
        if (c / a != b) {
 | 
			
		||||
            LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(
 | 
			
		||||
                LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,
 | 
			
		||||
                a,
 | 
			
		||||
                b
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
        return c;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function safeDiv128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        if (b == 0) {
 | 
			
		||||
            LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(
 | 
			
		||||
                LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,
 | 
			
		||||
                a,
 | 
			
		||||
                b
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
        uint128 c = a / b;
 | 
			
		||||
        return c;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function safeSub128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        if (b > a) {
 | 
			
		||||
            LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(
 | 
			
		||||
                LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,
 | 
			
		||||
                a,
 | 
			
		||||
                b
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
        return a - b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function safeAdd128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        uint128 c = a + b;
 | 
			
		||||
        if (c < a) {
 | 
			
		||||
            LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(
 | 
			
		||||
                LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,
 | 
			
		||||
                a,
 | 
			
		||||
                b
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
        return c;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function max128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        return a >= b ? a : b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function min128(uint128 a, uint128 b)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (uint128)
 | 
			
		||||
    {
 | 
			
		||||
        return a < b ? a : b;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@0x/contracts-utils",
 | 
			
		||||
    "version": "4.5.3",
 | 
			
		||||
    "version": "4.6.5",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=6.12"
 | 
			
		||||
    },
 | 
			
		||||
@@ -50,15 +50,15 @@
 | 
			
		||||
    },
 | 
			
		||||
    "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/utils",
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@0x/abi-gen": "^5.4.3",
 | 
			
		||||
        "@0x/contracts-gen": "2.0.13",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.6",
 | 
			
		||||
        "@0x/dev-utils": "^3.3.4",
 | 
			
		||||
        "@0x/order-utils": "^10.4.1",
 | 
			
		||||
        "@0x/sol-compiler": "^4.2.3",
 | 
			
		||||
        "@0x/abi-gen": "^5.4.13",
 | 
			
		||||
        "@0x/contracts-gen": "^2.0.24",
 | 
			
		||||
        "@0x/contracts-test-utils": "^5.3.17",
 | 
			
		||||
        "@0x/dev-utils": "^4.1.3",
 | 
			
		||||
        "@0x/order-utils": "^10.4.12",
 | 
			
		||||
        "@0x/sol-compiler": "^4.4.1",
 | 
			
		||||
        "@0x/tslint-config": "^4.1.3",
 | 
			
		||||
        "@0x/types": "^3.2.4",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.2.4",
 | 
			
		||||
        "@0x/types": "^3.3.1",
 | 
			
		||||
        "@0x/web3-wrapper": "^7.3.0",
 | 
			
		||||
        "@types/bn.js": "^4.11.0",
 | 
			
		||||
        "@types/lodash": "4.14.104",
 | 
			
		||||
        "@types/mocha": "^5.2.7",
 | 
			
		||||
@@ -79,11 +79,11 @@
 | 
			
		||||
        "typescript": "3.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@0x/base-contract": "^6.2.7",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.5",
 | 
			
		||||
        "@0x/utils": "^5.6.3",
 | 
			
		||||
        "@0x/base-contract": "^6.2.14",
 | 
			
		||||
        "@0x/typescript-typings": "^5.1.6",
 | 
			
		||||
        "@0x/utils": "^6.1.1",
 | 
			
		||||
        "bn.js": "^4.11.8",
 | 
			
		||||
        "ethereum-types": "^3.3.3"
 | 
			
		||||
        "ethereum-types": "^3.4.0"
 | 
			
		||||
    },
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
 
 | 
			
		||||
@@ -8,3 +8,4 @@
 | 
			
		||||
# Blacklist tests in lib
 | 
			
		||||
/lib/test/*
 | 
			
		||||
# Package specific ignore
 | 
			
		||||
/lib/scripts/*
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,235 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.16.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Fix CryptoCom rollup"
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1608692071
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.15.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add MixinBancor to BridgeAdapter",
 | 
			
		||||
                "pr": 91
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add MixinCoFiX to BridgeAdapter",
 | 
			
		||||
                "pr": 92
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1608245516
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.14.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Use the `MetaTransaction` class from `@0x/protocol-utils` in tests.",
 | 
			
		||||
                "pr": 90
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1608149382
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.13.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Address audit feedback in UniswapFeature",
 | 
			
		||||
                "pr": 82
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Always transfer `msg.value` to the liquidity provider contract in LiquidityProviderFeature to",
 | 
			
		||||
                "pr": 82
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Remove backwards compatibility with old PLP/bridge interface in `LiquidityProviderFeature` and `MixinZeroExBridge`",
 | 
			
		||||
                "pr": 85
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1608105788
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.12.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add test for selector collisions on the proxy",
 | 
			
		||||
                "pr": 74
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Move tooling out into `@0x/protocol-utils`.",
 | 
			
		||||
                "pr": 76
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1607485227
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1607381756,
 | 
			
		||||
        "version": "0.11.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.11.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Turn `LibTokenSpender` into `FixinTokenSpender`",
 | 
			
		||||
                "pr": 38
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Use bloom filters to check if a token is greedy and do not optimistically fall through transferFrom() if so",
 | 
			
		||||
                "pr": 38
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Revert to original proxy implementation",
 | 
			
		||||
                "pr": 38
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Fix incorrect cancel order event param",
 | 
			
		||||
                "pr": 38
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add a gas limit to first `LibTokenSpender` and `UniswapFeature` transfer",
 | 
			
		||||
                "pr": 38
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Convert metatransactions to use `LibSignature`",
 | 
			
		||||
                "pr": 31
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add metatransaction support for limit orders",
 | 
			
		||||
                "pr": 44
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Require RFQ orders to specify a transaction origin, and allow approved alternative addresses",
 | 
			
		||||
                "pr": 47
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Do not try to pull all tokens if selling all ETH in `TransformERC20Feature`",
 | 
			
		||||
                "pr": 46
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Remove protocol fees from all RFQ orders and add `taker` field to RFQ orders",
 | 
			
		||||
                "pr": 45
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Fix getRfqOrderInfo() to return status INVALID when missing txOrigin",
 | 
			
		||||
                "pr": 50
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Remove calldata signing functionality",
 | 
			
		||||
                "pr": 51
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add a permissionless transformer deployer",
 | 
			
		||||
                "pr": 55
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add Crypto.com to `BridgeAdapter`",
 | 
			
		||||
                "pr": 43
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Use `FeeCollectorController` contract for deploying `FeeCollector`s",
 | 
			
		||||
                "pr": 59
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1606961263
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.10.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add `checkAllowance` flag to LibTokenSpender.spendERC20Tokens",
 | 
			
		||||
                "pr": 39
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Use new `checkAllowance` flag in LiquidityProviderFeature, TransformERC20Feature, and MetaTransactionsFeature",
 | 
			
		||||
                "pr": 39
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add native orders features",
 | 
			
		||||
                "pr": 27
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1605763885
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.9.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Rewrite the ZeroEx contract in Yul",
 | 
			
		||||
                "pr": 23
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Update LiquidityProviderFeature to use off-chain registry and sandbox",
 | 
			
		||||
                "pr": 16
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Update ILiquidityProvider interface",
 | 
			
		||||
                "pr": 16
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Update ProtocolFeeUnfunded event to emit order hash",
 | 
			
		||||
                "pr": 16
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1605302002
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.8.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Trust LP boughtAmount return value",
 | 
			
		||||
                "pr": 29
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1604385937
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.7.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Change `ProtocolFeeUnfunded` event in FQT",
 | 
			
		||||
                "pr": 28
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Use new PLP interface in FQT.",
 | 
			
		||||
                "pr": 28
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1604376968
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.6.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add support for collecting protocol fees in ETH or WETH",
 | 
			
		||||
                "pr": 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add `LibSignature` library",
 | 
			
		||||
                "pr": 21
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Add `LimitOrdersFeature`",
 | 
			
		||||
                "pr": 27
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "timestamp": 1604355662
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1603851023,
 | 
			
		||||
        "version": "0.5.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Dependencies updated"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "0.5.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,84 @@ Edit the package's CHANGELOG.json file only.
 | 
			
		||||
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
## v0.16.0 - _December 23, 2020_
 | 
			
		||||
 | 
			
		||||
    * Fix CryptoCom rollup
 | 
			
		||||
 | 
			
		||||
## v0.15.0 - _December 17, 2020_
 | 
			
		||||
 | 
			
		||||
    * Add MixinBancor to BridgeAdapter (#91)
 | 
			
		||||
    * Add MixinCoFiX to BridgeAdapter (#92)
 | 
			
		||||
 | 
			
		||||
## v0.14.0 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Use the `MetaTransaction` class from `@0x/protocol-utils` in tests. (#90)
 | 
			
		||||
 | 
			
		||||
## v0.13.0 - _December 16, 2020_
 | 
			
		||||
 | 
			
		||||
    * Address audit feedback in UniswapFeature (#82)
 | 
			
		||||
    * Always transfer `msg.value` to the liquidity provider contract in LiquidityProviderFeature to (#82)
 | 
			
		||||
    * Remove backwards compatibility with old PLP/bridge interface in `LiquidityProviderFeature` and `MixinZeroExBridge` (#85)
 | 
			
		||||
 | 
			
		||||
## v0.12.0 - _December 9, 2020_
 | 
			
		||||
 | 
			
		||||
    * Add test for selector collisions on the proxy (#74)
 | 
			
		||||
    * Move tooling out into `@0x/protocol-utils`. (#76)
 | 
			
		||||
 | 
			
		||||
## v0.11.1 - _December 7, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v0.11.0 - _December 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Turn `LibTokenSpender` into `FixinTokenSpender` (#38)
 | 
			
		||||
    * Use bloom filters to check if a token is greedy and do not optimistically fall through transferFrom() if so (#38)
 | 
			
		||||
    * Revert to original proxy implementation (#38)
 | 
			
		||||
    * Fix incorrect cancel order event param (#38)
 | 
			
		||||
    * Add a gas limit to first `LibTokenSpender` and `UniswapFeature` transfer (#38)
 | 
			
		||||
    * Convert metatransactions to use `LibSignature` (#31)
 | 
			
		||||
    * Add metatransaction support for limit orders (#44)
 | 
			
		||||
    * Require RFQ orders to specify a transaction origin, and allow approved alternative addresses (#47)
 | 
			
		||||
    * Do not try to pull all tokens if selling all ETH in `TransformERC20Feature` (#46)
 | 
			
		||||
    * Remove protocol fees from all RFQ orders and add `taker` field to RFQ orders (#45)
 | 
			
		||||
    * Fix getRfqOrderInfo() to return status INVALID when missing txOrigin (#50)
 | 
			
		||||
    * Remove calldata signing functionality (#51)
 | 
			
		||||
    * Add a permissionless transformer deployer (#55)
 | 
			
		||||
    * Add Crypto.com to `BridgeAdapter` (#43)
 | 
			
		||||
    * Use `FeeCollectorController` contract for deploying `FeeCollector`s (#59)
 | 
			
		||||
 | 
			
		||||
## v0.10.0 - _November 19, 2020_
 | 
			
		||||
 | 
			
		||||
    * Add `checkAllowance` flag to LibTokenSpender.spendERC20Tokens (#39)
 | 
			
		||||
    * Use new `checkAllowance` flag in LiquidityProviderFeature, TransformERC20Feature, and MetaTransactionsFeature (#39)
 | 
			
		||||
    * Add native orders features (#27)
 | 
			
		||||
 | 
			
		||||
## v0.9.0 - _November 13, 2020_
 | 
			
		||||
 | 
			
		||||
    * Rewrite the ZeroEx contract in Yul (#23)
 | 
			
		||||
    * Update LiquidityProviderFeature to use off-chain registry and sandbox (#16)
 | 
			
		||||
    * Update ILiquidityProvider interface (#16)
 | 
			
		||||
    * Update ProtocolFeeUnfunded event to emit order hash (#16)
 | 
			
		||||
 | 
			
		||||
## v0.8.0 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Trust LP boughtAmount return value (#29)
 | 
			
		||||
 | 
			
		||||
## v0.7.0 - _November 3, 2020_
 | 
			
		||||
 | 
			
		||||
    * Change `ProtocolFeeUnfunded` event in FQT (#28)
 | 
			
		||||
    * Use new PLP interface in FQT. (#28)
 | 
			
		||||
 | 
			
		||||
## v0.6.0 - _November 2, 2020_
 | 
			
		||||
 | 
			
		||||
    * Add support for collecting protocol fees in ETH or WETH (#2)
 | 
			
		||||
    * Add `LibSignature` library (#21)
 | 
			
		||||
    * Add `LimitOrdersFeature` (#27)
 | 
			
		||||
 | 
			
		||||
## v0.5.1 - _October 28, 2020_
 | 
			
		||||
 | 
			
		||||
    * Dependencies updated
 | 
			
		||||
 | 
			
		||||
## v0.5.0 - _October 27, 2020_
 | 
			
		||||
 | 
			
		||||
    * Add `Swerve`, `SnowSwap`, `DODO` and `SushiSwap` into FQT (#7)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
    "useDockerisedSolc": false,
 | 
			
		||||
    "isOfflineMode": false,
 | 
			
		||||
    "shouldSaveStandardInput": true,
 | 
			
		||||
    "shouldCompileIndependently": true,
 | 
			
		||||
    "compilerSettings": {
 | 
			
		||||
        "evmVersion": "istanbul",
 | 
			
		||||
        "optimizer": {
 | 
			
		||||
@@ -19,7 +20,8 @@
 | 
			
		||||
                    "evm.bytecode.object",
 | 
			
		||||
                    "evm.bytecode.sourceMap",
 | 
			
		||||
                    "evm.deployedBytecode.object",
 | 
			
		||||
                    "evm.deployedBytecode.sourceMap"
 | 
			
		||||
                    "evm.deployedBytecode.sourceMap",
 | 
			
		||||
                    "evm.methodIdentifiers"
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ import "./features/ITransformERC20Feature.sol";
 | 
			
		||||
import "./features/IMetaTransactionsFeature.sol";
 | 
			
		||||
import "./features/IUniswapFeature.sol";
 | 
			
		||||
import "./features/ILiquidityProviderFeature.sol";
 | 
			
		||||
import "./features/INativeOrdersFeature.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev Interface for a fully featured Exchange Proxy.
 | 
			
		||||
@@ -38,20 +39,11 @@ interface IZeroEx is
 | 
			
		||||
    ITransformERC20Feature,
 | 
			
		||||
    IMetaTransactionsFeature,
 | 
			
		||||
    IUniswapFeature,
 | 
			
		||||
    ILiquidityProviderFeature
 | 
			
		||||
    ILiquidityProviderFeature,
 | 
			
		||||
    INativeOrdersFeature
 | 
			
		||||
{
 | 
			
		||||
    // solhint-disable state-visibility
 | 
			
		||||
 | 
			
		||||
    /// @dev Fallback for just receiving ether.
 | 
			
		||||
    receive() external payable;
 | 
			
		||||
 | 
			
		||||
    // solhint-enable state-visibility
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the implementation contract of a registered function.
 | 
			
		||||
    /// @param selector The function selector.
 | 
			
		||||
    /// @return impl The implementation contract address.
 | 
			
		||||
    function getFunctionImplementation(bytes4 selector)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (address impl);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										91
									
								
								contracts/zero-ex/contracts/src/ZeroExOptimized.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								contracts/zero-ex/contracts/src/ZeroExOptimized.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "./features/BootstrapFeature.sol";
 | 
			
		||||
import "./storage/LibProxyStorage.sol";
 | 
			
		||||
 | 
			
		||||
/// @dev An extensible proxy contract that serves as a universal entry point for
 | 
			
		||||
///      interacting with the 0x protocol. Optimized version of ZeroEx.
 | 
			
		||||
contract ZeroExOptimized {
 | 
			
		||||
    /// @dev Construct this contract and register the `BootstrapFeature` feature.
 | 
			
		||||
    ///      After constructing this contract, `bootstrap()` should be called
 | 
			
		||||
    ///      by `bootstrap()` to seed the initial feature set.
 | 
			
		||||
    /// @param bootstrapper Who can call `bootstrap()`.
 | 
			
		||||
    constructor(address bootstrapper) public {
 | 
			
		||||
        // Temporarily create and register the bootstrap feature.
 | 
			
		||||
        // It will deregister itself after `bootstrap()` has been called.
 | 
			
		||||
        BootstrapFeature bootstrap = new BootstrapFeature(bootstrapper);
 | 
			
		||||
        LibProxyStorage.getStorage().impls[bootstrap.bootstrap.selector] =
 | 
			
		||||
            address(bootstrap);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // solhint-disable state-visibility
 | 
			
		||||
 | 
			
		||||
    /// @dev Forwards calls to the appropriate implementation contract.
 | 
			
		||||
    fallback() external payable {
 | 
			
		||||
        // This is used in assembly below as impls_slot.
 | 
			
		||||
        mapping(bytes4 => address) storage impls =
 | 
			
		||||
            LibProxyStorage.getStorage().impls;
 | 
			
		||||
 | 
			
		||||
        assembly {
 | 
			
		||||
            let cdlen := calldatasize()
 | 
			
		||||
 | 
			
		||||
            // equivalent of receive() external payable {}
 | 
			
		||||
            if iszero(cdlen) {
 | 
			
		||||
                return(0, 0)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Store at 0x40, to leave 0x00-0x3F for slot calculation below.
 | 
			
		||||
            calldatacopy(0x40, 0, cdlen)
 | 
			
		||||
            let selector := and(mload(0x40), 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)
 | 
			
		||||
 | 
			
		||||
            // Slot for impls[selector] is keccak256(selector . impls_slot).
 | 
			
		||||
            mstore(0, selector)
 | 
			
		||||
            mstore(0x20, impls_slot)
 | 
			
		||||
            let slot := keccak256(0, 0x40)
 | 
			
		||||
 | 
			
		||||
            let delegate := sload(slot)
 | 
			
		||||
            if iszero(delegate) {
 | 
			
		||||
                // Revert with:
 | 
			
		||||
                // abi.encodeWithSelector(
 | 
			
		||||
                //   bytes4(keccak256("NotImplementedError(bytes4)")),
 | 
			
		||||
                //   selector)
 | 
			
		||||
                mstore(0, 0x734e6e1c00000000000000000000000000000000000000000000000000000000)
 | 
			
		||||
                mstore(4, selector)
 | 
			
		||||
                revert(0, 0x24)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let success := delegatecall(
 | 
			
		||||
                gas(),
 | 
			
		||||
                delegate,
 | 
			
		||||
                0x40, cdlen,
 | 
			
		||||
                0, 0
 | 
			
		||||
            )
 | 
			
		||||
            let rdlen := returndatasize()
 | 
			
		||||
            returndatacopy(0, 0, rdlen)
 | 
			
		||||
            if success {
 | 
			
		||||
                return(0, rdlen)
 | 
			
		||||
            }
 | 
			
		||||
            revert(0, rdlen)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -45,19 +45,4 @@ library LibLiquidityProviderRichErrors {
 | 
			
		||||
            minBuyAmount
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function NoLiquidityProviderForMarketError(
 | 
			
		||||
        address xAsset,
 | 
			
		||||
        address yAsset
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("NoLiquidityProviderForMarketError(address,address)")),
 | 
			
		||||
            xAsset,
 | 
			
		||||
            yAsset
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,172 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
library LibNativeOrdersRichErrors {
 | 
			
		||||
 | 
			
		||||
    // solhint-disable func-name-mixedcase
 | 
			
		||||
 | 
			
		||||
    function ProtocolFeeRefundFailed(
 | 
			
		||||
        address receiver,
 | 
			
		||||
        uint256 refundAmount
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("ProtocolFeeRefundFailed(address,uint256)")),
 | 
			
		||||
            receiver,
 | 
			
		||||
            refundAmount
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function OrderNotFillableByOriginError(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        address txOrigin,
 | 
			
		||||
        address orderTxOrigin
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("OrderNotFillableByOriginError(bytes32,address,address)")),
 | 
			
		||||
            orderHash,
 | 
			
		||||
            txOrigin,
 | 
			
		||||
            orderTxOrigin
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function OrderNotFillableError(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        uint8 orderStatus
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("OrderNotFillableError(bytes32,uint8)")),
 | 
			
		||||
            orderHash,
 | 
			
		||||
            orderStatus
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function OrderNotSignedByMakerError(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        address signer,
 | 
			
		||||
        address maker
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("OrderNotSignedByMakerError(bytes32,address,address)")),
 | 
			
		||||
            orderHash,
 | 
			
		||||
            signer,
 | 
			
		||||
            maker
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function OrderNotFillableBySenderError(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        address sender,
 | 
			
		||||
        address orderSender
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("OrderNotFillableBySenderError(bytes32,address,address)")),
 | 
			
		||||
            orderHash,
 | 
			
		||||
            sender,
 | 
			
		||||
            orderSender
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function OrderNotFillableByTakerError(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        address taker,
 | 
			
		||||
        address orderTaker
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("OrderNotFillableByTakerError(bytes32,address,address)")),
 | 
			
		||||
            orderHash,
 | 
			
		||||
            taker,
 | 
			
		||||
            orderTaker
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function CancelSaltTooLowError(
 | 
			
		||||
        uint256 minValidSalt,
 | 
			
		||||
        uint256 oldMinValidSalt
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("CancelSaltTooLowError(uint256,uint256)")),
 | 
			
		||||
            minValidSalt,
 | 
			
		||||
            oldMinValidSalt
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function FillOrKillFailedError(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        uint256 takerTokenFilledAmount,
 | 
			
		||||
        uint256 takerTokenFillAmount
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("FillOrKillFailedError(bytes32,uint256,uint256)")),
 | 
			
		||||
            orderHash,
 | 
			
		||||
            takerTokenFilledAmount,
 | 
			
		||||
            takerTokenFillAmount
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function OnlyOrderMakerAllowed(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        address sender,
 | 
			
		||||
        address maker
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("OnlyOrderMakerAllowed(bytes32,address,address)")),
 | 
			
		||||
            orderHash,
 | 
			
		||||
            sender,
 | 
			
		||||
            maker
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -26,7 +26,8 @@ library LibSignatureRichErrors {
 | 
			
		||||
        INVALID_LENGTH,
 | 
			
		||||
        UNSUPPORTED,
 | 
			
		||||
        ILLEGAL,
 | 
			
		||||
        WRONG_SIGNER
 | 
			
		||||
        WRONG_SIGNER,
 | 
			
		||||
        BAD_SIGNATURE_DATA
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // solhint-disable func-name-mixedcase
 | 
			
		||||
@@ -49,4 +50,19 @@ library LibSignatureRichErrors {
 | 
			
		||||
            signature
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function SignatureValidationError(
 | 
			
		||||
        SignatureValidationErrorCodes code,
 | 
			
		||||
        bytes32 hash
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory)
 | 
			
		||||
    {
 | 
			
		||||
        return abi.encodeWithSelector(
 | 
			
		||||
            bytes4(keccak256("SignatureValidationError(uint8,bytes32)")),
 | 
			
		||||
            code,
 | 
			
		||||
            hash
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								contracts/zero-ex/contracts/src/external/FeeCollector.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								contracts/zero-ex/contracts/src/external/FeeCollector.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/AuthorizableV06.sol";
 | 
			
		||||
import "../vendor/v3/IStaking.sol";
 | 
			
		||||
 | 
			
		||||
/// @dev The collector contract for protocol fees
 | 
			
		||||
contract FeeCollector is AuthorizableV06 {
 | 
			
		||||
    /// @dev Allow ether transfers to the collector.
 | 
			
		||||
    receive() external payable { }
 | 
			
		||||
 | 
			
		||||
    constructor() public {
 | 
			
		||||
        _addAuthorizedAddress(msg.sender);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev   Approve the staking contract and join a pool. Only an authority
 | 
			
		||||
    ///        can call this.
 | 
			
		||||
    /// @param weth The WETH contract.
 | 
			
		||||
    /// @param staking The staking contract.
 | 
			
		||||
    /// @param poolId The pool ID this contract is collecting fees for.
 | 
			
		||||
    function initialize(
 | 
			
		||||
        IEtherTokenV06 weth,
 | 
			
		||||
        IStaking staking,
 | 
			
		||||
        bytes32 poolId
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        onlyAuthorized
 | 
			
		||||
    {
 | 
			
		||||
        weth.approve(address(staking), type(uint256).max);
 | 
			
		||||
        staking.joinStakingPoolAsMaker(poolId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Convert all held ether to WETH. Only an authority can call this.
 | 
			
		||||
    /// @param weth The WETH contract.
 | 
			
		||||
    function convertToWeth(
 | 
			
		||||
        IEtherTokenV06 weth
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        onlyAuthorized
 | 
			
		||||
    {
 | 
			
		||||
        if (address(this).balance > 0) {
 | 
			
		||||
            weth.deposit{value: address(this).balance}();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										92
									
								
								contracts/zero-ex/contracts/src/external/FeeCollectorController.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								contracts/zero-ex/contracts/src/external/FeeCollectorController.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol";
 | 
			
		||||
import "../vendor/v3/IStaking.sol";
 | 
			
		||||
import "./FeeCollector.sol";
 | 
			
		||||
import "./LibFeeCollector.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev A contract that manages `FeeCollector` contracts.
 | 
			
		||||
contract FeeCollectorController {
 | 
			
		||||
 | 
			
		||||
    /// @dev Hash of the fee collector init code.
 | 
			
		||||
    bytes32 public immutable FEE_COLLECTOR_INIT_CODE_HASH;
 | 
			
		||||
    /// @dev The WETH contract.
 | 
			
		||||
    IEtherTokenV06 private immutable WETH;
 | 
			
		||||
    /// @dev The staking contract.
 | 
			
		||||
    IStaking private immutable STAKING;
 | 
			
		||||
 | 
			
		||||
    constructor(
 | 
			
		||||
        IEtherTokenV06 weth,
 | 
			
		||||
        IStaking staking
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
    {
 | 
			
		||||
        FEE_COLLECTOR_INIT_CODE_HASH = keccak256(type(FeeCollector).creationCode);
 | 
			
		||||
        WETH = weth;
 | 
			
		||||
        STAKING = staking;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Deploy (if needed) a `FeeCollector` contract for `poolId`
 | 
			
		||||
    ///      and wrap its ETH into WETH. Anyone may call this.
 | 
			
		||||
    /// @param poolId The pool ID associated with the staking pool.
 | 
			
		||||
    /// @return feeCollector The `FeeCollector` contract instance.
 | 
			
		||||
    function prepareFeeCollectorToPayFees(bytes32 poolId)
 | 
			
		||||
        external
 | 
			
		||||
        returns (FeeCollector feeCollector)
 | 
			
		||||
    {
 | 
			
		||||
        feeCollector = getFeeCollector(poolId);
 | 
			
		||||
        uint256 codeSize;
 | 
			
		||||
        assembly {
 | 
			
		||||
            codeSize := extcodesize(feeCollector)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (codeSize == 0) {
 | 
			
		||||
            // Create and initialize the contract if necessary.
 | 
			
		||||
            new FeeCollector{salt: bytes32(poolId)}();
 | 
			
		||||
            feeCollector.initialize(WETH, STAKING, poolId);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (address(feeCollector).balance > 1) {
 | 
			
		||||
            feeCollector.convertToWeth(WETH);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return feeCollector;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the `FeeCollector` contract for a given pool ID. The contract
 | 
			
		||||
    ///      will not actually exist until `prepareFeeCollectorToPayFees()`
 | 
			
		||||
    ///      has been called once.
 | 
			
		||||
    /// @param poolId The pool ID associated with the staking pool.
 | 
			
		||||
    /// @return feeCollector The `FeeCollector` contract instance.
 | 
			
		||||
    function getFeeCollector(bytes32 poolId)
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (FeeCollector feeCollector)
 | 
			
		||||
    {
 | 
			
		||||
        return FeeCollector(LibFeeCollector.getFeeCollectorAddress(
 | 
			
		||||
            address(this),
 | 
			
		||||
            FEE_COLLECTOR_INIT_CODE_HASH,
 | 
			
		||||
            poolId
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								contracts/zero-ex/contracts/src/external/ILiquidityProviderSandbox.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								contracts/zero-ex/contracts/src/external/ILiquidityProviderSandbox.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
interface ILiquidityProviderSandbox {
 | 
			
		||||
 | 
			
		||||
    /// @dev Calls `sellTokenForToken` on the given `provider` contract to
 | 
			
		||||
    ///      trigger a trade.
 | 
			
		||||
    /// @param provider The address of the on-chain liquidity provider.
 | 
			
		||||
    /// @param inputToken The token being sold.
 | 
			
		||||
    /// @param outputToken The token being bought.
 | 
			
		||||
    /// @param recipient The recipient of the bought tokens.
 | 
			
		||||
    /// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.
 | 
			
		||||
    /// @param auxiliaryData Auxiliary data supplied to the `provider` contract.
 | 
			
		||||
    function executeSellTokenForToken(
 | 
			
		||||
        address provider,
 | 
			
		||||
        address inputToken,
 | 
			
		||||
        address outputToken,
 | 
			
		||||
        address recipient,
 | 
			
		||||
        uint256 minBuyAmount,
 | 
			
		||||
        bytes calldata auxiliaryData
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Calls `sellEthForToken` on the given `provider` contract to
 | 
			
		||||
    ///      trigger a trade.
 | 
			
		||||
    /// @param provider The address of the on-chain liquidity provider.
 | 
			
		||||
    /// @param outputToken The token being bought.
 | 
			
		||||
    /// @param recipient The recipient of the bought tokens.
 | 
			
		||||
    /// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.
 | 
			
		||||
    /// @param auxiliaryData Auxiliary data supplied to the `provider` contract.
 | 
			
		||||
    function executeSellEthForToken(
 | 
			
		||||
        address provider,
 | 
			
		||||
        address outputToken,
 | 
			
		||||
        address recipient,
 | 
			
		||||
        uint256 minBuyAmount,
 | 
			
		||||
        bytes calldata auxiliaryData
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Calls `sellTokenForEth` on the given `provider` contract to
 | 
			
		||||
    ///      trigger a trade.
 | 
			
		||||
    /// @param provider The address of the on-chain liquidity provider.
 | 
			
		||||
    /// @param inputToken The token being sold.
 | 
			
		||||
    /// @param recipient The recipient of the bought tokens.
 | 
			
		||||
    /// @param minBuyAmount The minimum acceptable amount of ETH to buy.
 | 
			
		||||
    /// @param auxiliaryData Auxiliary data supplied to the `provider` contract.
 | 
			
		||||
    function executeSellTokenForEth(
 | 
			
		||||
        address provider,
 | 
			
		||||
        address inputToken,
 | 
			
		||||
        address recipient,
 | 
			
		||||
        uint256 minBuyAmount,
 | 
			
		||||
        bytes calldata auxiliaryData
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								contracts/zero-ex/contracts/src/external/LibFeeCollector.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								contracts/zero-ex/contracts/src/external/LibFeeCollector.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev Helpers for computing `FeeCollector` contract addresses.
 | 
			
		||||
library LibFeeCollector {
 | 
			
		||||
 | 
			
		||||
    /// @dev Compute the CREATE2 address for a fee collector.
 | 
			
		||||
    /// @param controller The address of the `FeeCollectorController` contract.
 | 
			
		||||
    /// @param initCodeHash The init code hash of the `FeeCollector` contract.
 | 
			
		||||
    /// @param poolId The fee collector's pool ID.
 | 
			
		||||
    function getFeeCollectorAddress(address controller, bytes32 initCodeHash, bytes32 poolId)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (address payable feeCollectorAddress)
 | 
			
		||||
    {
 | 
			
		||||
        // Compute the CREATE2 address for the fee collector.
 | 
			
		||||
        return address(uint256(keccak256(abi.encodePacked(
 | 
			
		||||
            byte(0xff),
 | 
			
		||||
            controller,
 | 
			
		||||
            poolId, // pool ID is salt
 | 
			
		||||
            initCodeHash
 | 
			
		||||
        ))));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										131
									
								
								contracts/zero-ex/contracts/src/external/LiquidityProviderSandbox.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								contracts/zero-ex/contracts/src/external/LiquidityProviderSandbox.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,131 @@
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/errors/LibOwnableRichErrorsV06.sol";
 | 
			
		||||
import "../vendor/ILiquidityProvider.sol";
 | 
			
		||||
import "../vendor/v3/IERC20Bridge.sol";
 | 
			
		||||
import "./ILiquidityProviderSandbox.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev A permissionless contract through which the ZeroEx contract can
 | 
			
		||||
///      safely trigger a trade on an external `ILiquidityProvider` contract.
 | 
			
		||||
contract LiquidityProviderSandbox is
 | 
			
		||||
    ILiquidityProviderSandbox
 | 
			
		||||
{
 | 
			
		||||
    using LibRichErrorsV06 for bytes;
 | 
			
		||||
 | 
			
		||||
    /// @dev Store the owner as an immutable.
 | 
			
		||||
    address public immutable owner;
 | 
			
		||||
 | 
			
		||||
    constructor(address owner_)
 | 
			
		||||
        public
 | 
			
		||||
    {
 | 
			
		||||
        owner = owner_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Allows only the (immutable) owner to call a function.
 | 
			
		||||
    modifier onlyOwner() virtual {
 | 
			
		||||
        if (msg.sender != owner) {
 | 
			
		||||
            LibOwnableRichErrorsV06.OnlyOwnerError(
 | 
			
		||||
                msg.sender,
 | 
			
		||||
                owner
 | 
			
		||||
            ).rrevert();
 | 
			
		||||
        }
 | 
			
		||||
        _;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Calls `sellTokenForToken` on the given `provider` contract to
 | 
			
		||||
    ///      trigger a trade.
 | 
			
		||||
    /// @param provider The address of the on-chain liquidity provider.
 | 
			
		||||
    /// @param inputToken The token being sold.
 | 
			
		||||
    /// @param outputToken The token being bought.
 | 
			
		||||
    /// @param recipient The recipient of the bought tokens.
 | 
			
		||||
    /// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.
 | 
			
		||||
    /// @param auxiliaryData Auxiliary data supplied to the `provider` contract.
 | 
			
		||||
    function executeSellTokenForToken(
 | 
			
		||||
        address provider,
 | 
			
		||||
        address inputToken,
 | 
			
		||||
        address outputToken,
 | 
			
		||||
        address recipient,
 | 
			
		||||
        uint256 minBuyAmount,
 | 
			
		||||
        bytes calldata auxiliaryData
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        onlyOwner
 | 
			
		||||
        override
 | 
			
		||||
    {
 | 
			
		||||
        ILiquidityProvider(provider).sellTokenForToken(
 | 
			
		||||
            inputToken,
 | 
			
		||||
            outputToken,
 | 
			
		||||
            recipient,
 | 
			
		||||
            minBuyAmount,
 | 
			
		||||
            auxiliaryData
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Calls `sellEthForToken` on the given `provider` contract to
 | 
			
		||||
    ///      trigger a trade.
 | 
			
		||||
    /// @param provider The address of the on-chain liquidity provider.
 | 
			
		||||
    /// @param outputToken The token being bought.
 | 
			
		||||
    /// @param recipient The recipient of the bought tokens.
 | 
			
		||||
    /// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.
 | 
			
		||||
    /// @param auxiliaryData Auxiliary data supplied to the `provider` contract.
 | 
			
		||||
    function executeSellEthForToken(
 | 
			
		||||
        address provider,
 | 
			
		||||
        address outputToken,
 | 
			
		||||
        address recipient,
 | 
			
		||||
        uint256 minBuyAmount,
 | 
			
		||||
        bytes calldata auxiliaryData
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        onlyOwner
 | 
			
		||||
        override
 | 
			
		||||
    {
 | 
			
		||||
        ILiquidityProvider(provider).sellEthForToken(
 | 
			
		||||
            outputToken,
 | 
			
		||||
            recipient,
 | 
			
		||||
            minBuyAmount,
 | 
			
		||||
            auxiliaryData
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Calls `sellTokenForEth` on the given `provider` contract to
 | 
			
		||||
    ///      trigger a trade.
 | 
			
		||||
    /// @param provider The address of the on-chain liquidity provider.
 | 
			
		||||
    /// @param inputToken The token being sold.
 | 
			
		||||
    /// @param recipient The recipient of the bought tokens.
 | 
			
		||||
    /// @param minBuyAmount The minimum acceptable amount of ETH to buy.
 | 
			
		||||
    /// @param auxiliaryData Auxiliary data supplied to the `provider` contract.
 | 
			
		||||
    function executeSellTokenForEth(
 | 
			
		||||
        address provider,
 | 
			
		||||
        address inputToken,
 | 
			
		||||
        address recipient,
 | 
			
		||||
        uint256 minBuyAmount,
 | 
			
		||||
        bytes calldata auxiliaryData
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        onlyOwner
 | 
			
		||||
        override
 | 
			
		||||
    {
 | 
			
		||||
        ILiquidityProvider(provider).sellTokenForEth(
 | 
			
		||||
            inputToken,
 | 
			
		||||
            payable(recipient),
 | 
			
		||||
            minBuyAmount,
 | 
			
		||||
            auxiliaryData
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										114
									
								
								contracts/zero-ex/contracts/src/external/PermissionlessTransformerDeployer.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								contracts/zero-ex/contracts/src/external/PermissionlessTransformerDeployer.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,114 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev Deployer contract for ERC20 transformers.
 | 
			
		||||
contract PermissionlessTransformerDeployer {
 | 
			
		||||
    /// @dev Emitted when a contract is deployed via `deploy()`.
 | 
			
		||||
    /// @param deployedAddress The address of the deployed contract.
 | 
			
		||||
    /// @param salt The deployment salt.
 | 
			
		||||
    /// @param sender The caller of `deploy()`.
 | 
			
		||||
    event Deployed(address deployedAddress, bytes32 salt, address sender);
 | 
			
		||||
 | 
			
		||||
    // @dev Mapping of deployed contract address to the deployment salt.
 | 
			
		||||
    mapping (address => bytes32) public toDeploymentSalt;
 | 
			
		||||
    // @dev Mapping of deployed contract address to the init code hash.
 | 
			
		||||
    mapping (address => bytes32) public toInitCodeHash;
 | 
			
		||||
 | 
			
		||||
    /// @dev Deploy a new contract. Any attached ETH will be forwarded.
 | 
			
		||||
    function deploy(bytes memory bytecode, bytes32 salt)
 | 
			
		||||
        public
 | 
			
		||||
        payable
 | 
			
		||||
        returns (address deployedAddress)
 | 
			
		||||
    {
 | 
			
		||||
        assembly {
 | 
			
		||||
            deployedAddress := create2(callvalue(), add(bytecode, 32), mload(bytecode), salt)
 | 
			
		||||
        }
 | 
			
		||||
        require(deployedAddress != address(0), 'PermissionlessTransformerDeployer/DEPLOY_FAILED');
 | 
			
		||||
        require(isDelegateCallSafe(deployedAddress), 'PermissionlessTransformerDeployer/UNSAFE_CODE');
 | 
			
		||||
        toDeploymentSalt[deployedAddress] = salt;
 | 
			
		||||
        toInitCodeHash[deployedAddress] = keccak256(bytecode);
 | 
			
		||||
        emit Deployed(deployedAddress, salt, msg.sender);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Checks whether a given address is safe to be called via
 | 
			
		||||
    ///      delegatecall. A contract is considered unsafe if it includes any
 | 
			
		||||
    ///      of the following opcodes: CALLCODE, DELEGATECALL, SELFDESTRUCT,
 | 
			
		||||
    ///      CREATE, CREATE2, SLOAD, and STORE. This code is adapted from
 | 
			
		||||
    ///      https://github.com/dharma-eng/dharma-smart-wallet/blob/master/contracts/helpers/IndestructibleRegistry.sol
 | 
			
		||||
    /// @param target The address to check.
 | 
			
		||||
    /// @return True if the contract is considered safe for delegatecall.
 | 
			
		||||
    function isDelegateCallSafe(address target) public view returns (bool) {
 | 
			
		||||
        uint256 size;
 | 
			
		||||
        assembly { size := extcodesize(target) }
 | 
			
		||||
        require(size > 0, 'PermissionlessTransformerDeployer/NO_CODE');
 | 
			
		||||
 | 
			
		||||
        bytes memory extcode = new bytes(size);
 | 
			
		||||
        assembly {
 | 
			
		||||
            extcodecopy(target, add(extcode, 32), 0, size)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Look for any reachable, impermissible opcodes.
 | 
			
		||||
        bool reachable = true;
 | 
			
		||||
        for (uint256 i = 0; i < extcode.length; i++) {
 | 
			
		||||
            uint8 op = uint8(extcode[i]);
 | 
			
		||||
 | 
			
		||||
            // If the opcode is a PUSH, skip over the push data.
 | 
			
		||||
            if (op > 95 && op < 128) { // pushN
 | 
			
		||||
                i += (op - 95);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (reachable) {
 | 
			
		||||
                // If execution is halted, mark subsequent opcodes unreachable.
 | 
			
		||||
                if (
 | 
			
		||||
                    op == 254 || // invalid
 | 
			
		||||
                    op == 243 || // return
 | 
			
		||||
                    op == 253 || // revert
 | 
			
		||||
                    op == 86  || // jump
 | 
			
		||||
                    op == 0      // stop
 | 
			
		||||
                ) {
 | 
			
		||||
                    reachable = false;
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // If opcode is impermissible, contract is unsafe.
 | 
			
		||||
                if (
 | 
			
		||||
                    op == 242 || // callcode
 | 
			
		||||
                    op == 244 || // delegatecall
 | 
			
		||||
                    op == 255 || // selfdestruct
 | 
			
		||||
                    op == 240 || // create
 | 
			
		||||
                    op == 245 || // create2
 | 
			
		||||
                    op == 84  || // sload
 | 
			
		||||
                    op == 85     // sstore
 | 
			
		||||
                ) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (op == 91) { // jumpdest
 | 
			
		||||
                // After a JUMPDEST, opcodes are reachable again.
 | 
			
		||||
                reachable = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return true; // No impermissible opcodes found.
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -22,45 +22,30 @@ pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
/// @dev Feature to swap directly with an on-chain liquidity provider.
 | 
			
		||||
interface ILiquidityProviderFeature {
 | 
			
		||||
    event LiquidityProviderForMarketUpdated(
 | 
			
		||||
        address indexed xAsset,
 | 
			
		||||
        address indexed yAsset,
 | 
			
		||||
        address providerAddress
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    /// @dev Sells `sellAmount` of `inputToken` to the liquidity provider
 | 
			
		||||
    ///      at the given `provider` address.
 | 
			
		||||
    /// @param inputToken The token being sold.
 | 
			
		||||
    /// @param outputToken The token being bought.
 | 
			
		||||
    /// @param provider The address of the on-chain liquidity provider
 | 
			
		||||
    ///        to trade with.
 | 
			
		||||
    /// @param recipient The recipient of the bought tokens. If equal to
 | 
			
		||||
    ///        address(0), `msg.sender` is assumed to be the recipient.
 | 
			
		||||
    /// @param sellAmount The amount of `inputToken` to sell.
 | 
			
		||||
    /// @param minBuyAmount The minimum acceptable amount of `outputToken` to
 | 
			
		||||
    ///        buy. Reverts if this amount is not satisfied.
 | 
			
		||||
    /// @param auxiliaryData Auxiliary data supplied to the `provider` contract.
 | 
			
		||||
    /// @return boughtAmount The amount of `outputToken` bought.
 | 
			
		||||
    function sellToLiquidityProvider(
 | 
			
		||||
        address makerToken,
 | 
			
		||||
        address takerToken,
 | 
			
		||||
        address payable recipient,
 | 
			
		||||
        address inputToken,
 | 
			
		||||
        address outputToken,
 | 
			
		||||
        address payable provider,
 | 
			
		||||
        address recipient,
 | 
			
		||||
        uint256 sellAmount,
 | 
			
		||||
        uint256 minBuyAmount
 | 
			
		||||
        uint256 minBuyAmount,
 | 
			
		||||
        bytes calldata auxiliaryData
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
        returns (uint256 boughtAmount);
 | 
			
		||||
 | 
			
		||||
    /// @dev Sets address of the liquidity provider for a market given
 | 
			
		||||
    ///      (xAsset, yAsset).
 | 
			
		||||
    /// @param xAsset First asset managed by the liquidity provider.
 | 
			
		||||
    /// @param yAsset Second asset managed by the liquidity provider.
 | 
			
		||||
    /// @param providerAddress Address of the liquidity provider.
 | 
			
		||||
    function setLiquidityProviderForMarket(
 | 
			
		||||
        address xAsset,
 | 
			
		||||
        address yAsset,
 | 
			
		||||
        address providerAddress
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns the address of the liquidity provider for a market given
 | 
			
		||||
    ///     (xAsset, yAsset), or reverts if pool does not exist.
 | 
			
		||||
    /// @param xAsset First asset managed by the liquidity provider.
 | 
			
		||||
    /// @param yAsset Second asset managed by the liquidity provider.
 | 
			
		||||
    /// @return providerAddress Address of the liquidity provider.
 | 
			
		||||
    function getLiquidityProviderForMarket(
 | 
			
		||||
        address xAsset,
 | 
			
		||||
        address yAsset
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (address providerAddress);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,11 +20,10 @@ pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
 | 
			
		||||
 | 
			
		||||
import "./libs/LibSignature.sol";
 | 
			
		||||
 | 
			
		||||
/// @dev Meta-transactions feature.
 | 
			
		||||
interface IMetaTransactionsFeature {
 | 
			
		||||
 | 
			
		||||
    /// @dev Describes an exchange proxy meta transaction.
 | 
			
		||||
    struct MetaTransactionData {
 | 
			
		||||
        // Signer of meta-transaction. On whose behalf to execute the MTX.
 | 
			
		||||
@@ -68,7 +67,7 @@ interface IMetaTransactionsFeature {
 | 
			
		||||
    /// @return returnResult The ABI-encoded result of the underlying call.
 | 
			
		||||
    function executeMetaTransaction(
 | 
			
		||||
        MetaTransactionData calldata mtx,
 | 
			
		||||
        bytes calldata signature
 | 
			
		||||
        LibSignature.Signature calldata signature
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
@@ -80,7 +79,7 @@ interface IMetaTransactionsFeature {
 | 
			
		||||
    /// @return returnResults The ABI-encoded results of the underlying calls.
 | 
			
		||||
    function batchExecuteMetaTransactions(
 | 
			
		||||
        MetaTransactionData[] calldata mtxs,
 | 
			
		||||
        bytes[] calldata signatures
 | 
			
		||||
        LibSignature.Signature[] calldata signatures
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
@@ -88,14 +87,14 @@ interface IMetaTransactionsFeature {
 | 
			
		||||
 | 
			
		||||
    /// @dev Execute a meta-transaction via `sender`. Privileged variant.
 | 
			
		||||
    ///      Only callable from within.
 | 
			
		||||
    /// @param sender Who is executing the meta-transaction..
 | 
			
		||||
    /// @param sender Who is executing the meta-transaction.
 | 
			
		||||
    /// @param mtx The meta-transaction.
 | 
			
		||||
    /// @param signature The signature by `mtx.signer`.
 | 
			
		||||
    /// @return returnResult The ABI-encoded result of the underlying call.
 | 
			
		||||
    function _executeMetaTransaction(
 | 
			
		||||
        address sender,
 | 
			
		||||
        MetaTransactionData calldata mtx,
 | 
			
		||||
        bytes calldata signature
 | 
			
		||||
        MetaTransactionData memory mtx,
 | 
			
		||||
        LibSignature.Signature memory signature
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,349 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
 | 
			
		||||
import "./libs/LibSignature.sol";
 | 
			
		||||
import "./libs/LibNativeOrder.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev Feature for interacting with limit orders.
 | 
			
		||||
interface INativeOrdersFeature {
 | 
			
		||||
 | 
			
		||||
    /// @dev Emitted whenever a `LimitOrder` is filled.
 | 
			
		||||
    /// @param orderHash The canonical hash of the order.
 | 
			
		||||
    /// @param maker The maker of the order.
 | 
			
		||||
    /// @param taker The taker of the order.
 | 
			
		||||
    /// @param feeRecipient Fee recipient of the order.
 | 
			
		||||
    /// @param takerTokenFilledAmount How much taker token was filled.
 | 
			
		||||
    /// @param makerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    /// @param protocolFeePaid How much protocol fee was paid.
 | 
			
		||||
    /// @param pool The fee pool associated with this order.
 | 
			
		||||
    event LimitOrderFilled(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        address maker,
 | 
			
		||||
        address taker,
 | 
			
		||||
        address feeRecipient,
 | 
			
		||||
        address makerToken,
 | 
			
		||||
        address takerToken,
 | 
			
		||||
        uint128 takerTokenFilledAmount,
 | 
			
		||||
        uint128 makerTokenFilledAmount,
 | 
			
		||||
        uint128 takerTokenFeeFilledAmount,
 | 
			
		||||
        uint256 protocolFeePaid,
 | 
			
		||||
        bytes32 pool
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    /// @dev Emitted whenever an `RfqOrder` is filled.
 | 
			
		||||
    /// @param orderHash The canonical hash of the order.
 | 
			
		||||
    /// @param maker The maker of the order.
 | 
			
		||||
    /// @param taker The taker of the order.
 | 
			
		||||
    /// @param takerTokenFilledAmount How much taker token was filled.
 | 
			
		||||
    /// @param makerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    /// @param pool The fee pool associated with this order.
 | 
			
		||||
    event RfqOrderFilled(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        address maker,
 | 
			
		||||
        address taker,
 | 
			
		||||
        address makerToken,
 | 
			
		||||
        address takerToken,
 | 
			
		||||
        uint128 takerTokenFilledAmount,
 | 
			
		||||
        uint128 makerTokenFilledAmount,
 | 
			
		||||
        bytes32 pool
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    /// @dev Emitted whenever a limit or RFQ order is cancelled.
 | 
			
		||||
    /// @param orderHash The canonical hash of the order.
 | 
			
		||||
    /// @param maker The order maker.
 | 
			
		||||
    event OrderCancelled(
 | 
			
		||||
        bytes32 orderHash,
 | 
			
		||||
        address maker
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    /// @dev Emitted whenever Limit orders are cancelled by pair by a maker.
 | 
			
		||||
    /// @param maker The maker of the order.
 | 
			
		||||
    /// @param makerToken The maker token in a pair for the orders cancelled.
 | 
			
		||||
    /// @param takerToken The taker token in a pair for the orders cancelled.
 | 
			
		||||
    /// @param minValidSalt The new minimum valid salt an order with this pair must
 | 
			
		||||
    ///        have.
 | 
			
		||||
    event PairCancelledLimitOrders(
 | 
			
		||||
        address maker,
 | 
			
		||||
        address makerToken,
 | 
			
		||||
        address takerToken,
 | 
			
		||||
        uint256 minValidSalt
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    /// @dev Emitted whenever RFQ orders are cancelled by pair by a maker.
 | 
			
		||||
    /// @param maker The maker of the order.
 | 
			
		||||
    /// @param makerToken The maker token in a pair for the orders cancelled.
 | 
			
		||||
    /// @param takerToken The taker token in a pair for the orders cancelled.
 | 
			
		||||
    /// @param minValidSalt The new minimum valid salt an order with this pair must
 | 
			
		||||
    ///        have.
 | 
			
		||||
    event PairCancelledRfqOrders(
 | 
			
		||||
        address maker,
 | 
			
		||||
        address makerToken,
 | 
			
		||||
        address takerToken,
 | 
			
		||||
        uint256 minValidSalt
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    /// @dev Emitted when new addresses are allowed or disallowed to fill
 | 
			
		||||
    ///      orders with a given txOrigin.
 | 
			
		||||
    /// @param origin The address doing the allowing.
 | 
			
		||||
    /// @param addrs The address being allowed/disallowed.
 | 
			
		||||
    /// @param allowed Indicates whether the address should be allowed.
 | 
			
		||||
    event RfqOrderOriginsAllowed(
 | 
			
		||||
        address origin,
 | 
			
		||||
        address[] addrs,
 | 
			
		||||
        bool allowed
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    /// @dev Transfers protocol fees from the `FeeCollector` pools into
 | 
			
		||||
    ///      the staking contract.
 | 
			
		||||
    /// @param poolIds Staking pool IDs
 | 
			
		||||
    function transferProtocolFeesForPools(bytes32[] calldata poolIds)
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Fill a limit order. The taker and sender will be the caller.
 | 
			
		||||
    /// @param order The limit order. ETH protocol fees can be
 | 
			
		||||
    ///      attached to this call. Any unspent ETH will be refunded to
 | 
			
		||||
    ///      the caller.
 | 
			
		||||
    /// @param signature The order signature.
 | 
			
		||||
    /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.
 | 
			
		||||
    /// @return takerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    /// @return makerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    function fillLimitOrder(
 | 
			
		||||
        LibNativeOrder.LimitOrder calldata order,
 | 
			
		||||
        LibSignature.Signature calldata signature,
 | 
			
		||||
        uint128 takerTokenFillAmount
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
        returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);
 | 
			
		||||
 | 
			
		||||
    /// @dev Fill an RFQ order for up to `takerTokenFillAmount` taker tokens.
 | 
			
		||||
    ///      The taker will be the caller.
 | 
			
		||||
    /// @param order The RFQ order.
 | 
			
		||||
    /// @param signature The order signature.
 | 
			
		||||
    /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.
 | 
			
		||||
    /// @return takerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    /// @return makerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    function fillRfqOrder(
 | 
			
		||||
        LibNativeOrder.RfqOrder calldata order,
 | 
			
		||||
        LibSignature.Signature calldata signature,
 | 
			
		||||
        uint128 takerTokenFillAmount
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);
 | 
			
		||||
 | 
			
		||||
    /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.
 | 
			
		||||
    ///      The taker will be the caller. ETH protocol fees can be
 | 
			
		||||
    ///      attached to this call. Any unspent ETH will be refunded to
 | 
			
		||||
    ///      the caller.
 | 
			
		||||
    /// @param order The limit order.
 | 
			
		||||
    /// @param signature The order signature.
 | 
			
		||||
    /// @param takerTokenFillAmount How much taker token to fill this order with.
 | 
			
		||||
    /// @return makerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    function fillOrKillLimitOrder(
 | 
			
		||||
        LibNativeOrder.LimitOrder calldata order,
 | 
			
		||||
        LibSignature.Signature calldata signature,
 | 
			
		||||
        uint128 takerTokenFillAmount
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
        returns (uint128 makerTokenFilledAmount);
 | 
			
		||||
 | 
			
		||||
    /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.
 | 
			
		||||
    ///      The taker will be the caller.
 | 
			
		||||
    /// @param order The RFQ order.
 | 
			
		||||
    /// @param signature The order signature.
 | 
			
		||||
    /// @param takerTokenFillAmount How much taker token to fill this order with.
 | 
			
		||||
    /// @return makerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    function fillOrKillRfqOrder(
 | 
			
		||||
        LibNativeOrder.RfqOrder calldata order,
 | 
			
		||||
        LibSignature.Signature calldata signature,
 | 
			
		||||
        uint128 takerTokenFillAmount
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        returns (uint128 makerTokenFilledAmount);
 | 
			
		||||
 | 
			
		||||
    /// @dev Fill a limit order. Internal variant. ETH protocol fees can be
 | 
			
		||||
    ///      attached to this call. Any unspent ETH will be refunded to
 | 
			
		||||
    ///      `msg.sender` (not `sender`).
 | 
			
		||||
    /// @param order The limit order.
 | 
			
		||||
    /// @param signature The order signature.
 | 
			
		||||
    /// @param takerTokenFillAmount Maximum taker token to fill this order with.
 | 
			
		||||
    /// @param taker The order taker.
 | 
			
		||||
    /// @param sender The order sender.
 | 
			
		||||
    /// @return takerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    /// @return makerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    function _fillLimitOrder(
 | 
			
		||||
        LibNativeOrder.LimitOrder calldata order,
 | 
			
		||||
        LibSignature.Signature calldata signature,
 | 
			
		||||
        uint128 takerTokenFillAmount,
 | 
			
		||||
        address taker,
 | 
			
		||||
        address sender
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
        returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);
 | 
			
		||||
 | 
			
		||||
    /// @dev Fill an RFQ order. Internal variant.
 | 
			
		||||
    /// @param order The RFQ order.
 | 
			
		||||
    /// @param signature The order signature.
 | 
			
		||||
    /// @param takerTokenFillAmount Maximum taker token to fill this order with.
 | 
			
		||||
    /// @param taker The order taker.
 | 
			
		||||
    /// @return takerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    /// @return makerTokenFilledAmount How much maker token was filled.
 | 
			
		||||
    function _fillRfqOrder(
 | 
			
		||||
        LibNativeOrder.RfqOrder calldata order,
 | 
			
		||||
        LibSignature.Signature calldata signature,
 | 
			
		||||
        uint128 takerTokenFillAmount,
 | 
			
		||||
        address taker
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);
 | 
			
		||||
 | 
			
		||||
    /// @dev Cancel a single limit order. The caller must be the maker.
 | 
			
		||||
    ///      Silently succeeds if the order has already been cancelled.
 | 
			
		||||
    /// @param order The limit order.
 | 
			
		||||
    function cancelLimitOrder(LibNativeOrder.LimitOrder calldata order)
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Cancel a single RFQ order. The caller must be the maker.
 | 
			
		||||
    ///      Silently succeeds if the order has already been cancelled.
 | 
			
		||||
    /// @param order The RFQ order.
 | 
			
		||||
    function cancelRfqOrder(LibNativeOrder.RfqOrder calldata order)
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Mark what tx.origin addresses are allowed to fill an order that
 | 
			
		||||
    ///      specifies the message sender as its txOrigin.
 | 
			
		||||
    /// @param origins An array of origin addresses to update.
 | 
			
		||||
    /// @param allowed True to register, false to unregister.
 | 
			
		||||
    function registerAllowedRfqOrigins(address[] memory origins, bool allowed)
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Cancel multiple limit orders. The caller must be the maker.
 | 
			
		||||
    ///      Silently succeeds if the order has already been cancelled.
 | 
			
		||||
    /// @param orders The limit orders.
 | 
			
		||||
    function batchCancelLimitOrders(LibNativeOrder.LimitOrder[] calldata orders)
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Cancel multiple RFQ orders. The caller must be the maker.
 | 
			
		||||
    ///      Silently succeeds if the order has already been cancelled.
 | 
			
		||||
    /// @param orders The RFQ orders.
 | 
			
		||||
    function batchCancelRfqOrders(LibNativeOrder.RfqOrder[] calldata orders)
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Cancel all limit orders for a given maker and pair with a salt less
 | 
			
		||||
    ///      than the value provided. The caller must be the maker. Subsequent
 | 
			
		||||
    ///      calls to this function with the same caller and pair require the
 | 
			
		||||
    ///      new salt to be >= the old salt.
 | 
			
		||||
    /// @param makerToken The maker token.
 | 
			
		||||
    /// @param takerToken The taker token.
 | 
			
		||||
    /// @param minValidSalt The new minimum valid salt.
 | 
			
		||||
    function cancelPairLimitOrders(
 | 
			
		||||
        IERC20TokenV06 makerToken,
 | 
			
		||||
        IERC20TokenV06 takerToken,
 | 
			
		||||
        uint256 minValidSalt
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Cancel all limit orders for a given maker and pair with a salt less
 | 
			
		||||
    ///      than the value provided. The caller must be the maker. Subsequent
 | 
			
		||||
    ///      calls to this function with the same caller and pair require the
 | 
			
		||||
    ///      new salt to be >= the old salt.
 | 
			
		||||
    /// @param makerTokens The maker tokens.
 | 
			
		||||
    /// @param takerTokens The taker tokens.
 | 
			
		||||
    /// @param minValidSalts The new minimum valid salts.
 | 
			
		||||
    function batchCancelPairLimitOrders(
 | 
			
		||||
        IERC20TokenV06[] calldata makerTokens,
 | 
			
		||||
        IERC20TokenV06[] calldata takerTokens,
 | 
			
		||||
        uint256[] calldata minValidSalts
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Cancel all RFQ orders for a given maker and pair with a salt less
 | 
			
		||||
    ///      than the value provided. The caller must be the maker. Subsequent
 | 
			
		||||
    ///      calls to this function with the same caller and pair require the
 | 
			
		||||
    ///      new salt to be >= the old salt.
 | 
			
		||||
    /// @param makerToken The maker token.
 | 
			
		||||
    /// @param takerToken The taker token.
 | 
			
		||||
    /// @param minValidSalt The new minimum valid salt.
 | 
			
		||||
    function cancelPairRfqOrders(
 | 
			
		||||
        IERC20TokenV06 makerToken,
 | 
			
		||||
        IERC20TokenV06 takerToken,
 | 
			
		||||
        uint256 minValidSalt
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Cancel all RFQ orders for a given maker and pair with a salt less
 | 
			
		||||
    ///      than the value provided. The caller must be the maker. Subsequent
 | 
			
		||||
    ///      calls to this function with the same caller and pair require the
 | 
			
		||||
    ///      new salt to be >= the old salt.
 | 
			
		||||
    /// @param makerTokens The maker tokens.
 | 
			
		||||
    /// @param takerTokens The taker tokens.
 | 
			
		||||
    /// @param minValidSalts The new minimum valid salts.
 | 
			
		||||
    function batchCancelPairRfqOrders(
 | 
			
		||||
        IERC20TokenV06[] calldata makerTokens,
 | 
			
		||||
        IERC20TokenV06[] calldata takerTokens,
 | 
			
		||||
        uint256[] calldata minValidSalts
 | 
			
		||||
    )
 | 
			
		||||
        external;
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the order info for a limit order.
 | 
			
		||||
    /// @param order The limit order.
 | 
			
		||||
    /// @return orderInfo Info about the order.
 | 
			
		||||
    function getLimitOrderInfo(LibNativeOrder.LimitOrder calldata order)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (LibNativeOrder.OrderInfo memory orderInfo);
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the order info for an RFQ order.
 | 
			
		||||
    /// @param order The RFQ order.
 | 
			
		||||
    /// @return orderInfo Info about the order.
 | 
			
		||||
    function getRfqOrderInfo(LibNativeOrder.RfqOrder calldata order)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (LibNativeOrder.OrderInfo memory orderInfo);
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the canonical hash of a limit order.
 | 
			
		||||
    /// @param order The limit order.
 | 
			
		||||
    /// @return orderHash The order hash.
 | 
			
		||||
    function getLimitOrderHash(LibNativeOrder.LimitOrder calldata order)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (bytes32 orderHash);
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the canonical hash of an RFQ order.
 | 
			
		||||
    /// @param order The RFQ order.
 | 
			
		||||
    /// @return orderHash The order hash.
 | 
			
		||||
    function getRfqOrderHash(LibNativeOrder.RfqOrder calldata order)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (bytes32 orderHash);
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the protocol fee multiplier. This should be multiplied by the
 | 
			
		||||
    ///      gas price to arrive at the required protocol fee to fill a native order.
 | 
			
		||||
    /// @return multiplier The protocol fee multiplier.
 | 
			
		||||
    function getProtocolFeeMultiplier()
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint32 multiplier);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -58,10 +58,6 @@ interface ITransformERC20Feature {
 | 
			
		||||
        // The transformations to execute on the token balance(s)
 | 
			
		||||
        // in sequence.
 | 
			
		||||
        Transformation[] transformations;
 | 
			
		||||
        // The hash of the calldata for the `transformERC20()` call.
 | 
			
		||||
        bytes32 callDataHash;
 | 
			
		||||
        // The signature for `callDataHash` signed by `getQuoteSigner()`.
 | 
			
		||||
        bytes callDataSignature;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Raised upon a successful `transformERC20`.
 | 
			
		||||
 
 | 
			
		||||
@@ -20,46 +20,53 @@ 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 "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
 | 
			
		||||
import "../errors/LibLiquidityProviderRichErrors.sol";
 | 
			
		||||
import "../external/ILiquidityProviderSandbox.sol";
 | 
			
		||||
import "../external/LiquidityProviderSandbox.sol";
 | 
			
		||||
import "../fixins/FixinCommon.sol";
 | 
			
		||||
import "../fixins/FixinTokenSpender.sol";
 | 
			
		||||
import "../migrations/LibMigrate.sol";
 | 
			
		||||
import "../storage/LibLiquidityProviderStorage.sol";
 | 
			
		||||
import "../vendor/v3/IERC20Bridge.sol";
 | 
			
		||||
import "./IFeature.sol";
 | 
			
		||||
import "./ILiquidityProviderFeature.sol";
 | 
			
		||||
import "./libs/LibTokenSpender.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract LiquidityProviderFeature is
 | 
			
		||||
    IFeature,
 | 
			
		||||
    ILiquidityProviderFeature,
 | 
			
		||||
    FixinCommon
 | 
			
		||||
    FixinCommon,
 | 
			
		||||
    FixinTokenSpender
 | 
			
		||||
{
 | 
			
		||||
    using LibERC20TokenV06 for IERC20TokenV06;
 | 
			
		||||
    using LibSafeMathV06 for uint256;
 | 
			
		||||
    using LibRichErrorsV06 for bytes;
 | 
			
		||||
 | 
			
		||||
    /// @dev Name of this feature.
 | 
			
		||||
    string public constant override FEATURE_NAME = "LiquidityProviderFeature";
 | 
			
		||||
    /// @dev Version of this feature.
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 0);
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 2);
 | 
			
		||||
 | 
			
		||||
    /// @dev ETH pseudo-token address.
 | 
			
		||||
    address constant internal ETH_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
 | 
			
		||||
    /// @dev The WETH contract address.
 | 
			
		||||
    IEtherTokenV06 public immutable weth;
 | 
			
		||||
    /// @dev The sandbox contract address.
 | 
			
		||||
    ILiquidityProviderSandbox public immutable sandbox;
 | 
			
		||||
 | 
			
		||||
    /// @dev Store the WETH address in an immutable.
 | 
			
		||||
    /// @param weth_ The weth token.
 | 
			
		||||
    constructor(IEtherTokenV06 weth_)
 | 
			
		||||
    /// @dev Event for data pipeline.
 | 
			
		||||
    event LiquidityProviderSwap(
 | 
			
		||||
        address inputToken,
 | 
			
		||||
        address outputToken,
 | 
			
		||||
        uint256 inputTokenAmount,
 | 
			
		||||
        uint256 outputTokenAmount,
 | 
			
		||||
        address provider,
 | 
			
		||||
        address recipient
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    constructor(LiquidityProviderSandbox sandbox_, bytes32 greedyTokensBloomFilter)
 | 
			
		||||
        public
 | 
			
		||||
        FixinCommon()
 | 
			
		||||
        FixinTokenSpender(greedyTokensBloomFilter)
 | 
			
		||||
    {
 | 
			
		||||
        weth = weth_;
 | 
			
		||||
        sandbox = sandbox_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Initialize and register this feature.
 | 
			
		||||
@@ -70,131 +77,106 @@ contract LiquidityProviderFeature is
 | 
			
		||||
        returns (bytes4 success)
 | 
			
		||||
    {
 | 
			
		||||
        _registerFeatureFunction(this.sellToLiquidityProvider.selector);
 | 
			
		||||
        _registerFeatureFunction(this.setLiquidityProviderForMarket.selector);
 | 
			
		||||
        _registerFeatureFunction(this.getLiquidityProviderForMarket.selector);
 | 
			
		||||
        return LibMigrate.MIGRATE_SUCCESS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Sells `sellAmount` of `inputToken` to the liquidity provider
 | 
			
		||||
    ///      at the given `provider` address.
 | 
			
		||||
    /// @param inputToken The token being sold.
 | 
			
		||||
    /// @param outputToken The token being bought.
 | 
			
		||||
    /// @param provider The address of the on-chain liquidity provider
 | 
			
		||||
    ///        to trade with.
 | 
			
		||||
    /// @param recipient The recipient of the bought tokens. If equal to
 | 
			
		||||
    ///        address(0), `msg.sender` is assumed to be the recipient.
 | 
			
		||||
    /// @param sellAmount The amount of `inputToken` to sell.
 | 
			
		||||
    /// @param minBuyAmount The minimum acceptable amount of `outputToken` to
 | 
			
		||||
    ///        buy. Reverts if this amount is not satisfied.
 | 
			
		||||
    /// @param auxiliaryData Auxiliary data supplied to the `provider` contract.
 | 
			
		||||
    /// @return boughtAmount The amount of `outputToken` bought.
 | 
			
		||||
    function sellToLiquidityProvider(
 | 
			
		||||
        address makerToken,
 | 
			
		||||
        address takerToken,
 | 
			
		||||
        address payable recipient,
 | 
			
		||||
        address inputToken,
 | 
			
		||||
        address outputToken,
 | 
			
		||||
        address payable provider,
 | 
			
		||||
        address recipient,
 | 
			
		||||
        uint256 sellAmount,
 | 
			
		||||
        uint256 minBuyAmount
 | 
			
		||||
        uint256 minBuyAmount,
 | 
			
		||||
        bytes calldata auxiliaryData
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        override
 | 
			
		||||
        payable
 | 
			
		||||
        returns (uint256 boughtAmount)
 | 
			
		||||
    {
 | 
			
		||||
        address providerAddress = getLiquidityProviderForMarket(makerToken, takerToken);
 | 
			
		||||
        if (recipient == address(0)) {
 | 
			
		||||
            recipient = msg.sender;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (takerToken == ETH_TOKEN_ADDRESS) {
 | 
			
		||||
            // Wrap ETH.
 | 
			
		||||
            weth.deposit{value: sellAmount}();
 | 
			
		||||
            weth.transfer(providerAddress, sellAmount);
 | 
			
		||||
        } else {
 | 
			
		||||
            LibTokenSpender.spendERC20Tokens(
 | 
			
		||||
                IERC20TokenV06(takerToken),
 | 
			
		||||
        // Forward all attached ETH to the provider.
 | 
			
		||||
        if (msg.value > 0) {
 | 
			
		||||
            provider.transfer(msg.value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (inputToken != ETH_TOKEN_ADDRESS) {
 | 
			
		||||
            // Transfer input ERC20 tokens to the provider.
 | 
			
		||||
            _transferERC20Tokens(
 | 
			
		||||
                IERC20TokenV06(inputToken),
 | 
			
		||||
                msg.sender,
 | 
			
		||||
                providerAddress,
 | 
			
		||||
                provider,
 | 
			
		||||
                sellAmount
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (makerToken == ETH_TOKEN_ADDRESS) {
 | 
			
		||||
            uint256 balanceBefore = weth.balanceOf(address(this));
 | 
			
		||||
            IERC20Bridge(providerAddress).bridgeTransferFrom(
 | 
			
		||||
                address(weth),
 | 
			
		||||
                address(0),
 | 
			
		||||
                address(this),
 | 
			
		||||
                minBuyAmount,
 | 
			
		||||
                ""
 | 
			
		||||
            );
 | 
			
		||||
            boughtAmount = weth.balanceOf(address(this)).safeSub(balanceBefore);
 | 
			
		||||
            // Unwrap wETH and send ETH to recipient.
 | 
			
		||||
            weth.withdraw(boughtAmount);
 | 
			
		||||
            recipient.transfer(boughtAmount);
 | 
			
		||||
        } else {
 | 
			
		||||
            uint256 balanceBefore = IERC20TokenV06(makerToken).balanceOf(recipient);
 | 
			
		||||
            IERC20Bridge(providerAddress).bridgeTransferFrom(
 | 
			
		||||
                makerToken,
 | 
			
		||||
                address(0),
 | 
			
		||||
        if (inputToken == ETH_TOKEN_ADDRESS) {
 | 
			
		||||
            uint256 balanceBefore = IERC20TokenV06(outputToken).balanceOf(recipient);
 | 
			
		||||
            sandbox.executeSellEthForToken(
 | 
			
		||||
                provider,
 | 
			
		||||
                outputToken,
 | 
			
		||||
                recipient,
 | 
			
		||||
                minBuyAmount,
 | 
			
		||||
                ""
 | 
			
		||||
                auxiliaryData
 | 
			
		||||
            );
 | 
			
		||||
            boughtAmount = IERC20TokenV06(makerToken).balanceOf(recipient).safeSub(balanceBefore);
 | 
			
		||||
            boughtAmount = IERC20TokenV06(outputToken).balanceOf(recipient).safeSub(balanceBefore);
 | 
			
		||||
        } else if (outputToken == ETH_TOKEN_ADDRESS) {
 | 
			
		||||
            uint256 balanceBefore = recipient.balance;
 | 
			
		||||
            sandbox.executeSellTokenForEth(
 | 
			
		||||
                provider,
 | 
			
		||||
                inputToken,
 | 
			
		||||
                recipient,
 | 
			
		||||
                minBuyAmount,
 | 
			
		||||
                auxiliaryData
 | 
			
		||||
            );
 | 
			
		||||
            boughtAmount = recipient.balance.safeSub(balanceBefore);
 | 
			
		||||
        } else {
 | 
			
		||||
            uint256 balanceBefore = IERC20TokenV06(outputToken).balanceOf(recipient);
 | 
			
		||||
            sandbox.executeSellTokenForToken(
 | 
			
		||||
                provider,
 | 
			
		||||
                inputToken,
 | 
			
		||||
                outputToken,
 | 
			
		||||
                recipient,
 | 
			
		||||
                minBuyAmount,
 | 
			
		||||
                auxiliaryData
 | 
			
		||||
            );
 | 
			
		||||
            boughtAmount = IERC20TokenV06(outputToken).balanceOf(recipient).safeSub(balanceBefore);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (boughtAmount < minBuyAmount) {
 | 
			
		||||
            LibLiquidityProviderRichErrors.LiquidityProviderIncompleteSellError(
 | 
			
		||||
                providerAddress,
 | 
			
		||||
                makerToken,
 | 
			
		||||
                takerToken,
 | 
			
		||||
                provider,
 | 
			
		||||
                outputToken,
 | 
			
		||||
                inputToken,
 | 
			
		||||
                sellAmount,
 | 
			
		||||
                boughtAmount,
 | 
			
		||||
                minBuyAmount
 | 
			
		||||
            ).rrevert();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Sets address of the liquidity provider for a market given
 | 
			
		||||
    ///      (xAsset, yAsset).
 | 
			
		||||
    /// @param xAsset First asset managed by the liquidity provider.
 | 
			
		||||
    /// @param yAsset Second asset managed by the liquidity provider.
 | 
			
		||||
    /// @param providerAddress Address of the liquidity provider.
 | 
			
		||||
    function setLiquidityProviderForMarket(
 | 
			
		||||
        address xAsset,
 | 
			
		||||
        address yAsset,
 | 
			
		||||
        address providerAddress
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        override
 | 
			
		||||
        onlyOwner
 | 
			
		||||
    {
 | 
			
		||||
        LibLiquidityProviderStorage.getStorage()
 | 
			
		||||
            .addressBook[xAsset][yAsset] = providerAddress;
 | 
			
		||||
        LibLiquidityProviderStorage.getStorage()
 | 
			
		||||
            .addressBook[yAsset][xAsset] = providerAddress;
 | 
			
		||||
        emit LiquidityProviderForMarketUpdated(
 | 
			
		||||
            xAsset,
 | 
			
		||||
            yAsset,
 | 
			
		||||
            providerAddress
 | 
			
		||||
        emit LiquidityProviderSwap(
 | 
			
		||||
            inputToken,
 | 
			
		||||
            outputToken,
 | 
			
		||||
            sellAmount,
 | 
			
		||||
            boughtAmount,
 | 
			
		||||
            provider,
 | 
			
		||||
            recipient
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Returns the address of the liquidity provider for a market given
 | 
			
		||||
    ///     (xAsset, yAsset), or reverts if pool does not exist.
 | 
			
		||||
    /// @param xAsset First asset managed by the liquidity provider.
 | 
			
		||||
    /// @param yAsset Second asset managed by the liquidity provider.
 | 
			
		||||
    /// @return providerAddress Address of the liquidity provider.
 | 
			
		||||
    function getLiquidityProviderForMarket(
 | 
			
		||||
        address xAsset,
 | 
			
		||||
        address yAsset
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        override
 | 
			
		||||
        returns (address providerAddress)
 | 
			
		||||
    {
 | 
			
		||||
        if (xAsset == ETH_TOKEN_ADDRESS) {
 | 
			
		||||
            providerAddress = LibLiquidityProviderStorage.getStorage()
 | 
			
		||||
                .addressBook[address(weth)][yAsset];
 | 
			
		||||
        } else if (yAsset == ETH_TOKEN_ADDRESS) {
 | 
			
		||||
            providerAddress = LibLiquidityProviderStorage.getStorage()
 | 
			
		||||
                .addressBook[xAsset][address(weth)];
 | 
			
		||||
        } else {
 | 
			
		||||
            providerAddress = LibLiquidityProviderStorage.getStorage()
 | 
			
		||||
                .addressBook[xAsset][yAsset];
 | 
			
		||||
        }
 | 
			
		||||
        if (providerAddress == address(0)) {
 | 
			
		||||
            LibLiquidityProviderRichErrors.NoLiquidityProviderForMarketError(
 | 
			
		||||
                xAsset,
 | 
			
		||||
                yAsset
 | 
			
		||||
            ).rrevert();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,16 +25,16 @@ import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
 | 
			
		||||
import "../errors/LibMetaTransactionsRichErrors.sol";
 | 
			
		||||
import "../fixins/FixinCommon.sol";
 | 
			
		||||
import "../fixins/FixinReentrancyGuard.sol";
 | 
			
		||||
import "../fixins/FixinTokenSpender.sol";
 | 
			
		||||
import "../fixins/FixinEIP712.sol";
 | 
			
		||||
import "../migrations/LibMigrate.sol";
 | 
			
		||||
import "../storage/LibMetaTransactionsStorage.sol";
 | 
			
		||||
import "./libs/LibSignedCallData.sol";
 | 
			
		||||
import "./IMetaTransactionsFeature.sol";
 | 
			
		||||
import "./ITransformERC20Feature.sol";
 | 
			
		||||
import "./libs/LibSignature.sol";
 | 
			
		||||
import "./ISignatureValidatorFeature.sol";
 | 
			
		||||
import "./IFeature.sol";
 | 
			
		||||
import "./libs/LibTokenSpender.sol";
 | 
			
		||||
 | 
			
		||||
import "./INativeOrdersFeature.sol";
 | 
			
		||||
 | 
			
		||||
/// @dev MetaTransactions feature.
 | 
			
		||||
contract MetaTransactionsFeature is
 | 
			
		||||
@@ -42,13 +42,13 @@ contract MetaTransactionsFeature is
 | 
			
		||||
    IMetaTransactionsFeature,
 | 
			
		||||
    FixinCommon,
 | 
			
		||||
    FixinReentrancyGuard,
 | 
			
		||||
    FixinEIP712
 | 
			
		||||
    FixinEIP712,
 | 
			
		||||
    FixinTokenSpender
 | 
			
		||||
{
 | 
			
		||||
    using LibBytesV06 for bytes;
 | 
			
		||||
    using LibRichErrorsV06 for bytes;
 | 
			
		||||
 | 
			
		||||
    /// @dev Intermediate state vars used by `_executeMetaTransactionPrivate()`
 | 
			
		||||
    ///      to avoid stack overflows.
 | 
			
		||||
    /// @dev Describes the state of a meta transaction.
 | 
			
		||||
    struct ExecuteState {
 | 
			
		||||
        // Sender of the meta-transaction.
 | 
			
		||||
        address sender;
 | 
			
		||||
@@ -57,7 +57,7 @@ contract MetaTransactionsFeature is
 | 
			
		||||
        // The meta-transaction data.
 | 
			
		||||
        MetaTransactionData mtx;
 | 
			
		||||
        // The meta-transaction signature (by `mtx.signer`).
 | 
			
		||||
        bytes signature;
 | 
			
		||||
        LibSignature.Signature signature;
 | 
			
		||||
        // The selector of the function being called.
 | 
			
		||||
        bytes4 selector;
 | 
			
		||||
        // The ETH balance of this contract before performing the call.
 | 
			
		||||
@@ -78,7 +78,7 @@ contract MetaTransactionsFeature is
 | 
			
		||||
    /// @dev Name of this feature.
 | 
			
		||||
    string public constant override FEATURE_NAME = "MetaTransactions";
 | 
			
		||||
    /// @dev Version of this feature.
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 0);
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 1, 0);
 | 
			
		||||
    /// @dev EIP712 typehash of the `MetaTransactionData` struct.
 | 
			
		||||
    bytes32 public immutable MTX_EIP712_TYPEHASH = keccak256(
 | 
			
		||||
        "MetaTransactionData("
 | 
			
		||||
@@ -105,10 +105,11 @@ contract MetaTransactionsFeature is
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    constructor(address zeroExAddress)
 | 
			
		||||
    constructor(address zeroExAddress, bytes32 greedyTokensBloomFilter)
 | 
			
		||||
        public
 | 
			
		||||
        FixinCommon()
 | 
			
		||||
        FixinEIP712(zeroExAddress)
 | 
			
		||||
        FixinTokenSpender(greedyTokensBloomFilter)
 | 
			
		||||
    {
 | 
			
		||||
        // solhint-disable-next-line no-empty-blocks
 | 
			
		||||
    }
 | 
			
		||||
@@ -135,7 +136,7 @@ contract MetaTransactionsFeature is
 | 
			
		||||
    /// @return returnResult The ABI-encoded result of the underlying call.
 | 
			
		||||
    function executeMetaTransaction(
 | 
			
		||||
        MetaTransactionData memory mtx,
 | 
			
		||||
        bytes memory signature
 | 
			
		||||
        LibSignature.Signature memory signature
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        payable
 | 
			
		||||
@@ -144,11 +145,13 @@ contract MetaTransactionsFeature is
 | 
			
		||||
        refundsAttachedEth
 | 
			
		||||
        returns (bytes memory returnResult)
 | 
			
		||||
    {
 | 
			
		||||
        returnResult = _executeMetaTransactionPrivate(
 | 
			
		||||
            msg.sender,
 | 
			
		||||
            mtx,
 | 
			
		||||
            signature
 | 
			
		||||
        );
 | 
			
		||||
        ExecuteState memory state;
 | 
			
		||||
        state.sender = msg.sender;
 | 
			
		||||
        state.mtx = mtx;
 | 
			
		||||
        state.hash = getMetaTransactionHash(mtx);
 | 
			
		||||
        state.signature = signature;
 | 
			
		||||
 | 
			
		||||
        returnResult = _executeMetaTransactionPrivate(state);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Execute multiple meta-transactions.
 | 
			
		||||
@@ -157,7 +160,7 @@ contract MetaTransactionsFeature is
 | 
			
		||||
    /// @return returnResults The ABI-encoded results of the underlying calls.
 | 
			
		||||
    function batchExecuteMetaTransactions(
 | 
			
		||||
        MetaTransactionData[] memory mtxs,
 | 
			
		||||
        bytes[] memory signatures
 | 
			
		||||
        LibSignature.Signature[] memory signatures
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        payable
 | 
			
		||||
@@ -174,11 +177,13 @@ contract MetaTransactionsFeature is
 | 
			
		||||
        }
 | 
			
		||||
        returnResults = new bytes[](mtxs.length);
 | 
			
		||||
        for (uint256 i = 0; i < mtxs.length; ++i) {
 | 
			
		||||
            returnResults[i] = _executeMetaTransactionPrivate(
 | 
			
		||||
                msg.sender,
 | 
			
		||||
                mtxs[i],
 | 
			
		||||
                signatures[i]
 | 
			
		||||
            );
 | 
			
		||||
            ExecuteState memory state;
 | 
			
		||||
            state.sender = msg.sender;
 | 
			
		||||
            state.mtx = mtxs[i];
 | 
			
		||||
            state.hash = getMetaTransactionHash(mtxs[i]);
 | 
			
		||||
            state.signature = signatures[i];
 | 
			
		||||
 | 
			
		||||
            returnResults[i] = _executeMetaTransactionPrivate(state);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -191,7 +196,7 @@ contract MetaTransactionsFeature is
 | 
			
		||||
    function _executeMetaTransaction(
 | 
			
		||||
        address sender,
 | 
			
		||||
        MetaTransactionData memory mtx,
 | 
			
		||||
        bytes memory signature
 | 
			
		||||
        LibSignature.Signature memory signature
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        payable
 | 
			
		||||
@@ -199,7 +204,13 @@ contract MetaTransactionsFeature is
 | 
			
		||||
        onlySelf
 | 
			
		||||
        returns (bytes memory returnResult)
 | 
			
		||||
    {
 | 
			
		||||
        return _executeMetaTransactionPrivate(sender, mtx, signature);
 | 
			
		||||
        ExecuteState memory state;
 | 
			
		||||
        state.sender = sender;
 | 
			
		||||
        state.mtx = mtx;
 | 
			
		||||
        state.hash = getMetaTransactionHash(mtx);
 | 
			
		||||
        state.signature = signature;
 | 
			
		||||
 | 
			
		||||
        return _executeMetaTransactionPrivate(state);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the block at which a meta-transaction has been executed.
 | 
			
		||||
@@ -251,24 +262,13 @@ contract MetaTransactionsFeature is
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Execute a meta-transaction by `sender`. Low-level, hidden variant.
 | 
			
		||||
    /// @param sender Who is executing the meta-transaction..
 | 
			
		||||
    /// @param mtx The meta-transaction.
 | 
			
		||||
    /// @param signature The signature by `mtx.signer`.
 | 
			
		||||
    /// @param state The `ExecuteState` for this metatransaction, with `sender`,
 | 
			
		||||
    ///              `hash`, `mtx`, and `signature` fields filled.
 | 
			
		||||
    /// @return returnResult The ABI-encoded result of the underlying call.
 | 
			
		||||
    function _executeMetaTransactionPrivate(
 | 
			
		||||
        address sender,
 | 
			
		||||
        MetaTransactionData memory mtx,
 | 
			
		||||
        bytes memory signature
 | 
			
		||||
    )
 | 
			
		||||
    function _executeMetaTransactionPrivate(ExecuteState memory state)
 | 
			
		||||
        private
 | 
			
		||||
        returns (bytes memory returnResult)
 | 
			
		||||
    {
 | 
			
		||||
        ExecuteState memory state;
 | 
			
		||||
        state.sender = sender;
 | 
			
		||||
        state.hash = getMetaTransactionHash(mtx);
 | 
			
		||||
        state.mtx = mtx;
 | 
			
		||||
        state.signature = signature;
 | 
			
		||||
 | 
			
		||||
        _validateMetaTransaction(state);
 | 
			
		||||
 | 
			
		||||
        // Mark the transaction executed by storing the block at which it was executed.
 | 
			
		||||
@@ -278,19 +278,23 @@ contract MetaTransactionsFeature is
 | 
			
		||||
            .mtxHashToExecutedBlockNumber[state.hash] = block.number;
 | 
			
		||||
 | 
			
		||||
        // Pay the fee to the sender.
 | 
			
		||||
        if (mtx.feeAmount > 0) {
 | 
			
		||||
            LibTokenSpender.spendERC20Tokens(
 | 
			
		||||
                mtx.feeToken,
 | 
			
		||||
                mtx.signer,
 | 
			
		||||
                sender,
 | 
			
		||||
                mtx.feeAmount
 | 
			
		||||
        if (state.mtx.feeAmount > 0) {
 | 
			
		||||
            _transferERC20Tokens(
 | 
			
		||||
                state.mtx.feeToken,
 | 
			
		||||
                state.mtx.signer,
 | 
			
		||||
                state.sender,
 | 
			
		||||
                state.mtx.feeAmount
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Execute the call based on the selector.
 | 
			
		||||
        state.selector = mtx.callData.readBytes4(0);
 | 
			
		||||
        state.selector = state.mtx.callData.readBytes4(0);
 | 
			
		||||
        if (state.selector == ITransformERC20Feature.transformERC20.selector) {
 | 
			
		||||
            returnResult = _executeTransformERC20Call(state);
 | 
			
		||||
        } else if (state.selector == INativeOrdersFeature.fillLimitOrder.selector) {
 | 
			
		||||
            returnResult = _executeFillLimitOrderCall(state);
 | 
			
		||||
        } else if (state.selector == INativeOrdersFeature.fillRfqOrder.selector) {
 | 
			
		||||
            returnResult = _executeFillRfqOrderCall(state);
 | 
			
		||||
        } else {
 | 
			
		||||
            LibMetaTransactionsRichErrors
 | 
			
		||||
                .MetaTransactionUnsupportedFunctionError(state.hash, state.selector)
 | 
			
		||||
@@ -299,8 +303,8 @@ contract MetaTransactionsFeature is
 | 
			
		||||
        emit MetaTransactionExecuted(
 | 
			
		||||
            state.hash,
 | 
			
		||||
            state.selector,
 | 
			
		||||
            mtx.signer,
 | 
			
		||||
            mtx.sender
 | 
			
		||||
            state.mtx.signer,
 | 
			
		||||
            state.mtx.sender
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -347,18 +351,17 @@ contract MetaTransactionsFeature is
 | 
			
		||||
                    state.mtx.value
 | 
			
		||||
                ).rrevert();
 | 
			
		||||
        }
 | 
			
		||||
        // Must be signed by signer.
 | 
			
		||||
        try
 | 
			
		||||
            ISignatureValidatorFeature(address(this))
 | 
			
		||||
                .validateHashSignature(state.hash, state.mtx.signer, state.signature)
 | 
			
		||||
        {}
 | 
			
		||||
        catch (bytes memory err) {
 | 
			
		||||
            LibMetaTransactionsRichErrors
 | 
			
		||||
                .MetaTransactionInvalidSignatureError(
 | 
			
		||||
                    state.hash,
 | 
			
		||||
                    state.signature,
 | 
			
		||||
                    err
 | 
			
		||||
                ).rrevert();
 | 
			
		||||
 | 
			
		||||
        if (LibSignature.getSignerOfHash(state.hash, state.signature) !=
 | 
			
		||||
                state.mtx.signer) {
 | 
			
		||||
            LibSignatureRichErrors.SignatureValidationError(
 | 
			
		||||
                LibSignatureRichErrors.SignatureValidationErrorCodes.WRONG_SIGNER,
 | 
			
		||||
                state.hash,
 | 
			
		||||
                state.mtx.signer,
 | 
			
		||||
                // TODO: Remove this field from SignatureValidationError
 | 
			
		||||
                //       when rich reverts are part of the protocol repo.
 | 
			
		||||
                ""
 | 
			
		||||
            ).rrevert();
 | 
			
		||||
        }
 | 
			
		||||
        // Transaction must not have been already executed.
 | 
			
		||||
        state.executedBlockNumber = LibMetaTransactionsStorage
 | 
			
		||||
@@ -429,10 +432,6 @@ contract MetaTransactionsFeature is
 | 
			
		||||
            // Decode call args for `ITransformERC20Feature.transformERC20()` as a struct.
 | 
			
		||||
            args = abi.decode(encodedStructArgs, (ExternalTransformERC20Args));
 | 
			
		||||
        }
 | 
			
		||||
        // Parse the signature and hash out of the calldata so `_transformERC20()`
 | 
			
		||||
        // can authenticate it.
 | 
			
		||||
        (bytes32 callDataHash, bytes memory callDataSignature) =
 | 
			
		||||
            LibSignedCallData.parseCallData(state.mtx.callData);
 | 
			
		||||
        // Call `ITransformERC20Feature._transformERC20()` (internal variant).
 | 
			
		||||
        return _callSelf(
 | 
			
		||||
            state.hash,
 | 
			
		||||
@@ -444,15 +443,95 @@ contract MetaTransactionsFeature is
 | 
			
		||||
                    outputToken: args.outputToken,
 | 
			
		||||
                    inputTokenAmount: args.inputTokenAmount,
 | 
			
		||||
                    minOutputTokenAmount: args.minOutputTokenAmount,
 | 
			
		||||
                    transformations: args.transformations,
 | 
			
		||||
                    callDataHash: callDataHash,
 | 
			
		||||
                    callDataSignature: callDataSignature
 | 
			
		||||
                    transformations: args.transformations
 | 
			
		||||
              })
 | 
			
		||||
            ),
 | 
			
		||||
            state.mtx.value
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Extract arguments from call data by copying everything after the
 | 
			
		||||
    ///      4-byte selector into a new byte array.
 | 
			
		||||
    /// @param callData The call data from which arguments are to be extracted.
 | 
			
		||||
    /// @return args The extracted arguments as a byte array.
 | 
			
		||||
    function _extractArgumentsFromCallData(
 | 
			
		||||
        bytes memory callData
 | 
			
		||||
    )
 | 
			
		||||
        private
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes memory args)
 | 
			
		||||
    {
 | 
			
		||||
        args = new bytes(callData.length - 4);
 | 
			
		||||
        uint256 fromMem;
 | 
			
		||||
        uint256 toMem;
 | 
			
		||||
 | 
			
		||||
        assembly {
 | 
			
		||||
            fromMem := add(callData, 36) // skip length and 4-byte selector
 | 
			
		||||
            toMem := add(args, 32)       // write after length prefix
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        LibBytesV06.memCopy(toMem, fromMem, args.length);
 | 
			
		||||
 | 
			
		||||
        return args;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Execute a `INativeOrdersFeature.fillLimitOrder()` meta-transaction call
 | 
			
		||||
    ///      by decoding the call args and translating the call to the internal
 | 
			
		||||
    ///      `INativeOrdersFeature._fillLimitOrder()` variant, where we can override
 | 
			
		||||
    ///      the taker address.
 | 
			
		||||
    function _executeFillLimitOrderCall(ExecuteState memory state)
 | 
			
		||||
        private
 | 
			
		||||
        returns (bytes memory returnResult)
 | 
			
		||||
    {
 | 
			
		||||
        LibNativeOrder.LimitOrder memory order;
 | 
			
		||||
        LibSignature.Signature memory signature;
 | 
			
		||||
        uint128 takerTokenFillAmount;
 | 
			
		||||
 | 
			
		||||
        bytes memory args = _extractArgumentsFromCallData(state.mtx.callData);
 | 
			
		||||
        (order, signature, takerTokenFillAmount) = abi.decode(args, (LibNativeOrder.LimitOrder, LibSignature.Signature, uint128));
 | 
			
		||||
 | 
			
		||||
        return _callSelf(
 | 
			
		||||
            state.hash,
 | 
			
		||||
            abi.encodeWithSelector(
 | 
			
		||||
                INativeOrdersFeature._fillLimitOrder.selector,
 | 
			
		||||
                order,
 | 
			
		||||
                signature,
 | 
			
		||||
                takerTokenFillAmount,
 | 
			
		||||
                state.mtx.signer, // taker is mtx signer
 | 
			
		||||
                msg.sender
 | 
			
		||||
            ),
 | 
			
		||||
            state.mtx.value
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Execute a `INativeOrdersFeature.fillRfqOrder()` meta-transaction call
 | 
			
		||||
    ///      by decoding the call args and translating the call to the internal
 | 
			
		||||
    ///      `INativeOrdersFeature._fillRfqOrder()` variant, where we can overrideunimpleme
 | 
			
		||||
    ///      the taker address.
 | 
			
		||||
    function _executeFillRfqOrderCall(ExecuteState memory state)
 | 
			
		||||
        private
 | 
			
		||||
        returns (bytes memory returnResult)
 | 
			
		||||
    {
 | 
			
		||||
        LibNativeOrder.RfqOrder memory order;
 | 
			
		||||
        LibSignature.Signature memory signature;
 | 
			
		||||
        uint128 takerTokenFillAmount;
 | 
			
		||||
 | 
			
		||||
        bytes memory args = _extractArgumentsFromCallData(state.mtx.callData);
 | 
			
		||||
        (order, signature, takerTokenFillAmount) = abi.decode(args, (LibNativeOrder.RfqOrder, LibSignature.Signature, uint128));
 | 
			
		||||
 | 
			
		||||
        return _callSelf(
 | 
			
		||||
            state.hash,
 | 
			
		||||
            abi.encodeWithSelector(
 | 
			
		||||
                INativeOrdersFeature._fillRfqOrder.selector,
 | 
			
		||||
                order,
 | 
			
		||||
                signature,
 | 
			
		||||
                takerTokenFillAmount,
 | 
			
		||||
                state.mtx.signer // taker is mtx signer
 | 
			
		||||
            ),
 | 
			
		||||
            state.mtx.value
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Make an arbitrary internal, meta-transaction call.
 | 
			
		||||
    ///      Warning: Do not let unadulterated `callData` into this function.
 | 
			
		||||
    function _callSelf(bytes32 hash, bytes memory callData, uint256 value)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1024
									
								
								contracts/zero-ex/contracts/src/features/NativeOrdersFeature.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1024
									
								
								contracts/zero-ex/contracts/src/features/NativeOrdersFeature.sol
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -25,24 +25,24 @@ import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol";
 | 
			
		||||
import "../errors/LibTransformERC20RichErrors.sol";
 | 
			
		||||
import "../fixins/FixinCommon.sol";
 | 
			
		||||
import "../fixins/FixinTokenSpender.sol";
 | 
			
		||||
import "../migrations/LibMigrate.sol";
 | 
			
		||||
import "../external/IFlashWallet.sol";
 | 
			
		||||
import "../external/FlashWallet.sol";
 | 
			
		||||
import "../storage/LibTransformERC20Storage.sol";
 | 
			
		||||
import "../transformers/IERC20Transformer.sol";
 | 
			
		||||
import "../transformers/LibERC20Transformer.sol";
 | 
			
		||||
import "./libs/LibSignedCallData.sol";
 | 
			
		||||
import "./ITransformERC20Feature.sol";
 | 
			
		||||
import "./IFeature.sol";
 | 
			
		||||
import "./ISignatureValidatorFeature.sol";
 | 
			
		||||
import "./libs/LibTokenSpender.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev Feature to composably transform between ERC20 tokens.
 | 
			
		||||
contract TransformERC20Feature is
 | 
			
		||||
    IFeature,
 | 
			
		||||
    ITransformERC20Feature,
 | 
			
		||||
    FixinCommon
 | 
			
		||||
    FixinCommon,
 | 
			
		||||
    FixinTokenSpender
 | 
			
		||||
{
 | 
			
		||||
    using LibSafeMathV06 for uint256;
 | 
			
		||||
    using LibRichErrorsV06 for bytes;
 | 
			
		||||
@@ -58,7 +58,12 @@ contract TransformERC20Feature is
 | 
			
		||||
    /// @dev Name of this feature.
 | 
			
		||||
    string public constant override FEATURE_NAME = "TransformERC20";
 | 
			
		||||
    /// @dev Version of this feature.
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 2, 0);
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 3, 1);
 | 
			
		||||
 | 
			
		||||
    constructor(bytes32 greedyTokensBloomFilter)
 | 
			
		||||
        public
 | 
			
		||||
        FixinTokenSpender(greedyTokensBloomFilter)
 | 
			
		||||
    {}
 | 
			
		||||
 | 
			
		||||
    /// @dev Initialize and register this feature.
 | 
			
		||||
    ///      Should be delegatecalled by `Migrate.migrate()`.
 | 
			
		||||
@@ -171,8 +176,6 @@ contract TransformERC20Feature is
 | 
			
		||||
        payable
 | 
			
		||||
        returns (uint256 outputTokenAmount)
 | 
			
		||||
    {
 | 
			
		||||
        (bytes32 callDataHash, bytes memory callDataSignature) =
 | 
			
		||||
            LibSignedCallData.parseCallData(msg.data);
 | 
			
		||||
        return _transformERC20Private(
 | 
			
		||||
            TransformERC20Args({
 | 
			
		||||
                taker: msg.sender,
 | 
			
		||||
@@ -180,9 +183,7 @@ contract TransformERC20Feature is
 | 
			
		||||
                outputToken: outputToken,
 | 
			
		||||
                inputTokenAmount: inputTokenAmount,
 | 
			
		||||
                minOutputTokenAmount: minOutputTokenAmount,
 | 
			
		||||
                transformations: transformations,
 | 
			
		||||
                callDataHash: callDataHash,
 | 
			
		||||
                callDataSignature: callDataSignature
 | 
			
		||||
                transformations: transformations
 | 
			
		||||
            })
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -208,13 +209,19 @@ contract TransformERC20Feature is
 | 
			
		||||
        private
 | 
			
		||||
        returns (uint256 outputTokenAmount)
 | 
			
		||||
    {
 | 
			
		||||
        // If the input token amount is -1, transform the taker's entire
 | 
			
		||||
        // spendable balance.
 | 
			
		||||
        // If the input token amount is -1 and we are not selling ETH,
 | 
			
		||||
        // transform the taker's entire spendable balance.
 | 
			
		||||
        if (args.inputTokenAmount == uint256(-1)) {
 | 
			
		||||
            args.inputTokenAmount = LibTokenSpender.getSpendableERC20BalanceOf(
 | 
			
		||||
                args.inputToken,
 | 
			
		||||
                args.taker
 | 
			
		||||
            );
 | 
			
		||||
            if (LibERC20Transformer.isTokenETH(args.inputToken)) {
 | 
			
		||||
                // We can't pull more ETH from the taker, so we just set the
 | 
			
		||||
                // input token amount to the value attached to the call.
 | 
			
		||||
                args.inputTokenAmount = msg.value;
 | 
			
		||||
            } else {
 | 
			
		||||
                args.inputTokenAmount = _getSpendableERC20BalanceOf(
 | 
			
		||||
                    args.inputToken,
 | 
			
		||||
                    args.taker
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TransformERC20PrivateState memory state;
 | 
			
		||||
@@ -234,22 +241,13 @@ contract TransformERC20Feature is
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        {
 | 
			
		||||
            // Validate that the calldata was signed by the quote signer.
 | 
			
		||||
            // `validCallDataHash` will be 0x0 if not.
 | 
			
		||||
            bytes32 validCallDataHash = _getValidCallDataHash(
 | 
			
		||||
                args.callDataHash,
 | 
			
		||||
                args.callDataSignature
 | 
			
		||||
            );
 | 
			
		||||
            // Perform transformations.
 | 
			
		||||
            for (uint256 i = 0; i < args.transformations.length; ++i) {
 | 
			
		||||
                _executeTransformation(
 | 
			
		||||
                    state.wallet,
 | 
			
		||||
                    args.transformations[i],
 | 
			
		||||
                    state.transformerDeployer,
 | 
			
		||||
                    args.taker,
 | 
			
		||||
                    // Transformers will receive a null calldata hash if
 | 
			
		||||
                    // the calldata was not properly signed.
 | 
			
		||||
                    validCallDataHash
 | 
			
		||||
                    args.taker
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -317,7 +315,12 @@ contract TransformERC20Feature is
 | 
			
		||||
        // Transfer input tokens.
 | 
			
		||||
        if (!LibERC20Transformer.isTokenETH(inputToken)) {
 | 
			
		||||
            // Token is not ETH, so pull ERC20 tokens.
 | 
			
		||||
            LibTokenSpender.spendERC20Tokens(inputToken, from, to, amount);
 | 
			
		||||
            _transferERC20Tokens(
 | 
			
		||||
                inputToken,
 | 
			
		||||
                from,
 | 
			
		||||
                to,
 | 
			
		||||
                amount
 | 
			
		||||
            );
 | 
			
		||||
        } else if (msg.value < amount) {
 | 
			
		||||
             // Token is ETH, so the caller must attach enough ETH to the call.
 | 
			
		||||
            LibTransformERC20RichErrors.InsufficientEthAttachedError(
 | 
			
		||||
@@ -332,13 +335,11 @@ contract TransformERC20Feature is
 | 
			
		||||
    /// @param transformation The transformation.
 | 
			
		||||
    /// @param transformerDeployer The address of the transformer deployer.
 | 
			
		||||
    /// @param taker The taker address.
 | 
			
		||||
    /// @param callDataHash Hash of the calldata.
 | 
			
		||||
    function _executeTransformation(
 | 
			
		||||
        IFlashWallet wallet,
 | 
			
		||||
        Transformation memory transformation,
 | 
			
		||||
        address transformerDeployer,
 | 
			
		||||
        address payable taker,
 | 
			
		||||
        bytes32 callDataHash
 | 
			
		||||
        address payable taker
 | 
			
		||||
    )
 | 
			
		||||
        private
 | 
			
		||||
    {
 | 
			
		||||
@@ -355,7 +356,6 @@ contract TransformERC20Feature is
 | 
			
		||||
            abi.encodeWithSelector(
 | 
			
		||||
                IERC20Transformer.transform.selector,
 | 
			
		||||
                IERC20Transformer.TransformContext({
 | 
			
		||||
                    callDataHash: callDataHash,
 | 
			
		||||
                    sender: msg.sender,
 | 
			
		||||
                    taker: taker,
 | 
			
		||||
                    data: transformation.data
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,9 @@ contract UniswapFeature is
 | 
			
		||||
    /// @dev Name of this feature.
 | 
			
		||||
    string public constant override FEATURE_NAME = "UniswapFeature";
 | 
			
		||||
    /// @dev Version of this feature.
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 0);
 | 
			
		||||
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 1, 1);
 | 
			
		||||
    /// @dev A bloom filter for tokens that consume all gas when `transferFrom()` fails.
 | 
			
		||||
    bytes32 public immutable GREEDY_TOKENS_BLOOM_FILTER;
 | 
			
		||||
    /// @dev WETH contract.
 | 
			
		||||
    IEtherTokenV06 private immutable WETH;
 | 
			
		||||
    /// @dev AllowanceTarget instance.
 | 
			
		||||
@@ -66,6 +68,8 @@ contract UniswapFeature is
 | 
			
		||||
    uint256 constant private UNISWAP_PAIR_SWAP_CALL_SELECTOR_32 = 0x022c0d9f00000000000000000000000000000000000000000000000000000000;
 | 
			
		||||
    // bytes4(keccak256("transferFrom(address,address,uint256)"))
 | 
			
		||||
    uint256 constant private TRANSFER_FROM_CALL_SELECTOR_32 = 0x23b872dd00000000000000000000000000000000000000000000000000000000;
 | 
			
		||||
    // bytes4(keccak256("allowance(address,address)"))
 | 
			
		||||
    uint256 constant private ALLOWANCE_CALL_SELECTOR_32 = 0xdd62ed3e00000000000000000000000000000000000000000000000000000000;
 | 
			
		||||
    // bytes4(keccak256("withdraw(uint256)"))
 | 
			
		||||
    uint256 constant private WETH_WITHDRAW_CALL_SELECTOR_32 = 0x2e1a7d4d00000000000000000000000000000000000000000000000000000000;
 | 
			
		||||
    // bytes4(keccak256("deposit()"))
 | 
			
		||||
@@ -76,9 +80,15 @@ contract UniswapFeature is
 | 
			
		||||
    /// @dev Construct this contract.
 | 
			
		||||
    /// @param weth The WETH contract.
 | 
			
		||||
    /// @param allowanceTarget The AllowanceTarget contract.
 | 
			
		||||
    constructor(IEtherTokenV06 weth, IAllowanceTarget allowanceTarget) public {
 | 
			
		||||
    /// @param greedyTokensBloomFilter The bloom filter for greedy tokens.
 | 
			
		||||
    constructor(
 | 
			
		||||
        IEtherTokenV06 weth,
 | 
			
		||||
        IAllowanceTarget allowanceTarget,
 | 
			
		||||
        bytes32 greedyTokensBloomFilter
 | 
			
		||||
    ) public {
 | 
			
		||||
        WETH = weth;
 | 
			
		||||
        ALLOWANCE_TARGET = allowanceTarget;
 | 
			
		||||
        GREEDY_TOKENS_BLOOM_FILTER = greedyTokensBloomFilter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Initialize and register this feature.
 | 
			
		||||
@@ -114,6 +124,7 @@ contract UniswapFeature is
 | 
			
		||||
            // Load immutables onto the stack.
 | 
			
		||||
            IEtherTokenV06 weth = WETH;
 | 
			
		||||
            IAllowanceTarget allowanceTarget = ALLOWANCE_TARGET;
 | 
			
		||||
            bytes32 greedyTokensBloomFilter = GREEDY_TOKENS_BLOOM_FILTER;
 | 
			
		||||
 | 
			
		||||
            // Store some vars in memory to get around stack limits.
 | 
			
		||||
            assembly {
 | 
			
		||||
@@ -125,6 +136,8 @@ contract UniswapFeature is
 | 
			
		||||
                mstore(0xA40, weth)
 | 
			
		||||
                // mload(0xA60) == ALLOWANCE_TARGET
 | 
			
		||||
                mstore(0xA60, allowanceTarget)
 | 
			
		||||
                // mload(0xA80) == GREEDY_TOKENS_BLOOM_FILTER
 | 
			
		||||
                mstore(0xA80, greedyTokensBloomFilter)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -154,53 +167,16 @@ contract UniswapFeature is
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if iszero(i) {
 | 
			
		||||
                    // This is the first token in the path.
 | 
			
		||||
                    switch eq(sellToken, ETH_TOKEN_ADDRESS_32)
 | 
			
		||||
                        case 0 {
 | 
			
		||||
                        case 0 { // Not selling ETH. Selling an ERC20 instead.
 | 
			
		||||
                            // Make sure ETH was not attached to the call.
 | 
			
		||||
                            if gt(callvalue(), 0) {
 | 
			
		||||
                                revert(0, 0)
 | 
			
		||||
                            }
 | 
			
		||||
                            // For the first pair we need to transfer sellTokens into the
 | 
			
		||||
                            // pair contract.
 | 
			
		||||
                            mstore(0xB00, TRANSFER_FROM_CALL_SELECTOR_32)
 | 
			
		||||
                            mstore(0xB04, caller())
 | 
			
		||||
                            mstore(0xB24, pair)
 | 
			
		||||
                            mstore(0xB44, sellAmount)
 | 
			
		||||
 | 
			
		||||
                            // Copy only the first 32 bytes of return data. We
 | 
			
		||||
                            // only care about reading a boolean in the success
 | 
			
		||||
                            // case, and we discard the return data in the
 | 
			
		||||
                            // failure case.
 | 
			
		||||
                            let success := call(gas(), sellToken, 0, 0xB00, 0x64, 0xC00, 0x20)
 | 
			
		||||
 | 
			
		||||
                            let rdsize := returndatasize()
 | 
			
		||||
 | 
			
		||||
                            // Check for ERC20 success. ERC20 tokens should
 | 
			
		||||
                            // return a boolean, but some return nothing or
 | 
			
		||||
                            // extra data. We accept 0-length return data as
 | 
			
		||||
                            // success, or at least 32 bytes that starts with
 | 
			
		||||
                            // a 32-byte boolean true.
 | 
			
		||||
                            success := and(
 | 
			
		||||
                                success,                         // call itself succeeded
 | 
			
		||||
                                or(
 | 
			
		||||
                                    iszero(rdsize),              // no return data, or
 | 
			
		||||
                                    and(
 | 
			
		||||
                                        iszero(lt(rdsize, 32)),  // at least 32 bytes
 | 
			
		||||
                                        eq(mload(0xC00), 1)      // starts with uint256(1)
 | 
			
		||||
                                    )
 | 
			
		||||
                                )
 | 
			
		||||
                            )
 | 
			
		||||
 | 
			
		||||
                            if iszero(success) {
 | 
			
		||||
                                // Try to fall back to the allowance target.
 | 
			
		||||
                                mstore(0xB00, ALLOWANCE_TARGET_EXECUTE_CALL_SELECTOR_32)
 | 
			
		||||
                                mstore(0xB04, sellToken)
 | 
			
		||||
                                mstore(0xB24, 0x40)
 | 
			
		||||
                                mstore(0xB44, 0x64)
 | 
			
		||||
                                mstore(0xB64, TRANSFER_FROM_CALL_SELECTOR_32)
 | 
			
		||||
                                mstore(0xB68, caller())
 | 
			
		||||
                                mstore(0xB88, pair)
 | 
			
		||||
                                mstore(0xBA8, sellAmount)
 | 
			
		||||
                                if iszero(call(gas(), mload(0xA60), 0, 0xB00, 0xC8, 0x00, 0x0)) {
 | 
			
		||||
                                    bubbleRevert()
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            moveTakerTokensTo(sellToken, pair, sellAmount)
 | 
			
		||||
                        }
 | 
			
		||||
                        default {
 | 
			
		||||
                            // If selling ETH, we need to wrap it to WETH and transfer to the
 | 
			
		||||
@@ -232,6 +208,10 @@ contract UniswapFeature is
 | 
			
		||||
                if iszero(staticcall(gas(), pair, 0xB00, 0x4, 0xC00, 0x40)) {
 | 
			
		||||
                    bubbleRevert()
 | 
			
		||||
                }
 | 
			
		||||
                // Revert if the pair contract does not return two words.
 | 
			
		||||
                if iszero(eq(returndatasize(), 0x40)) {
 | 
			
		||||
                    revert(0,0)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Sell amount for this hop is the previous buy amount.
 | 
			
		||||
                let pairSellAmount := buyAmount
 | 
			
		||||
@@ -389,6 +369,110 @@ contract UniswapFeature is
 | 
			
		||||
                returndatacopy(0, 0, returndatasize())
 | 
			
		||||
                revert(0, returndatasize())
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Move `amount` tokens from the taker/caller to `to`.
 | 
			
		||||
            function moveTakerTokensTo(token, to, amount) {
 | 
			
		||||
 | 
			
		||||
                // If the token is possibly greedy, we check the allowance rather
 | 
			
		||||
                // than relying on letting the transferFrom() call fail and
 | 
			
		||||
                // falling through to legacy allowance target because the token
 | 
			
		||||
                // will eat all our gas.
 | 
			
		||||
                if isTokenPossiblyGreedy(token) {
 | 
			
		||||
                    // Check if we have enough direct allowance by calling
 | 
			
		||||
                    // `token.allowance()``
 | 
			
		||||
                    mstore(0xB00, ALLOWANCE_CALL_SELECTOR_32)
 | 
			
		||||
                    mstore(0xB04, caller())
 | 
			
		||||
                    mstore(0xB24, address())
 | 
			
		||||
                    let success := staticcall(gas(), token, 0xB00, 0x44, 0xC00, 0x20)
 | 
			
		||||
                    if iszero(success) {
 | 
			
		||||
                        // Call to allowance() failed.
 | 
			
		||||
                        bubbleRevert()
 | 
			
		||||
                    }
 | 
			
		||||
                    // Make sure the allowance call returned a single word.
 | 
			
		||||
                    if iszero(eq(returndatasize(), 0x20)) {
 | 
			
		||||
                        revert(0, 0)
 | 
			
		||||
                    }
 | 
			
		||||
                    // Call succeeded.
 | 
			
		||||
                    // Result is stored in 0xC00-0xC20.
 | 
			
		||||
                    if lt(mload(0xC00), amount) {
 | 
			
		||||
                        // We don't have enough direct allowance, so try
 | 
			
		||||
                        // going through the legacy allowance taregt.
 | 
			
		||||
                        moveTakerTokensToWithLegacyAllowanceTarget(token, to, amount)
 | 
			
		||||
                        leave
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Otherwise we will optimistically try to perform a `transferFrom()`
 | 
			
		||||
                // directly then if it fails we will go through the legacy allowance target.
 | 
			
		||||
                mstore(0xB00, TRANSFER_FROM_CALL_SELECTOR_32)
 | 
			
		||||
                mstore(0xB04, caller())
 | 
			
		||||
                mstore(0xB24, to)
 | 
			
		||||
                mstore(0xB44, amount)
 | 
			
		||||
 | 
			
		||||
                let success := call(
 | 
			
		||||
                    gas(),
 | 
			
		||||
                    token,
 | 
			
		||||
                    0,
 | 
			
		||||
                    0xB00,
 | 
			
		||||
                    0x64,
 | 
			
		||||
                    0xC00,
 | 
			
		||||
                    // Copy only the first 32 bytes of return data. We
 | 
			
		||||
                    // only care about reading a boolean in the success
 | 
			
		||||
                    // case, and we discard the return data in the
 | 
			
		||||
                    // failure case.
 | 
			
		||||
                    0x20
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
                let rdsize := returndatasize()
 | 
			
		||||
 | 
			
		||||
                // Check for ERC20 success. ERC20 tokens should
 | 
			
		||||
                // return a boolean, but some return nothing or
 | 
			
		||||
                // extra data. We accept 0-length return data as
 | 
			
		||||
                // success, or at least 32 bytes that starts with
 | 
			
		||||
                // a 32-byte boolean true.
 | 
			
		||||
                success := and(
 | 
			
		||||
                    success,                         // call itself succeeded
 | 
			
		||||
                    or(
 | 
			
		||||
                        iszero(rdsize),              // no return data, or
 | 
			
		||||
                        and(
 | 
			
		||||
                            iszero(lt(rdsize, 32)),  // at least 32 bytes
 | 
			
		||||
                            eq(mload(0xC00), 1)      // starts with uint256(1)
 | 
			
		||||
                        )
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
                if iszero(success) {
 | 
			
		||||
                    // Try to fall back to the allowance target.
 | 
			
		||||
                    moveTakerTokensToWithLegacyAllowanceTarget(token, to, amount)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Move tokens by going through the legacy allowance target contract.
 | 
			
		||||
            function moveTakerTokensToWithLegacyAllowanceTarget(token, to, amount) {
 | 
			
		||||
                mstore(0xB00, ALLOWANCE_TARGET_EXECUTE_CALL_SELECTOR_32)
 | 
			
		||||
                mstore(0xB04, token)
 | 
			
		||||
                mstore(0xB24, 0x40)
 | 
			
		||||
                mstore(0xB44, 0x64)
 | 
			
		||||
                mstore(0xB64, TRANSFER_FROM_CALL_SELECTOR_32)
 | 
			
		||||
                mstore(0xB68, caller())
 | 
			
		||||
                mstore(0xB88, to)
 | 
			
		||||
                mstore(0xBA8, amount)
 | 
			
		||||
                if iszero(call(gas(), mload(0xA60), 0, 0xB00, 0xC8, 0x00, 0x0)) {
 | 
			
		||||
                    bubbleRevert()
 | 
			
		||||
                }
 | 
			
		||||
                // If this fall back failed, the swap will most likely fail
 | 
			
		||||
                // so there's no need to validate the result.
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Checks if a token possibly belongs to the GREEDY_TOKENS_BLOOM_FILTER
 | 
			
		||||
            // bloom filter.
 | 
			
		||||
            function isTokenPossiblyGreedy(token) -> isPossiblyGreedy {
 | 
			
		||||
                // The hash is given by:
 | 
			
		||||
                // (1 << (keccak256(token) % 256)) | (1 << (token % 256))
 | 
			
		||||
                mstore(0, token)
 | 
			
		||||
                let h := or(shl(mod(keccak256(0, 32), 256), 1), shl(mod(token, 256), 1))
 | 
			
		||||
                isPossiblyGreedy := eq(and(h, mload(0xA80)), h)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Revert if we bought too little.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										218
									
								
								contracts/zero-ex/contracts/src/features/libs/LibNativeOrder.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								contracts/zero-ex/contracts/src/features/libs/LibNativeOrder.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,218 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev A library for common native order operations.
 | 
			
		||||
library LibNativeOrder {
 | 
			
		||||
 | 
			
		||||
    enum OrderStatus {
 | 
			
		||||
        INVALID,
 | 
			
		||||
        FILLABLE,
 | 
			
		||||
        FILLED,
 | 
			
		||||
        CANCELLED,
 | 
			
		||||
        EXPIRED
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev A standard OTC or OO limit order.
 | 
			
		||||
    struct LimitOrder {
 | 
			
		||||
        IERC20TokenV06 makerToken;
 | 
			
		||||
        IERC20TokenV06 takerToken;
 | 
			
		||||
        uint128 makerAmount;
 | 
			
		||||
        uint128 takerAmount;
 | 
			
		||||
        uint128 takerTokenFeeAmount;
 | 
			
		||||
        address maker;
 | 
			
		||||
        address taker;
 | 
			
		||||
        address sender;
 | 
			
		||||
        address feeRecipient;
 | 
			
		||||
        bytes32 pool;
 | 
			
		||||
        uint64 expiry;
 | 
			
		||||
        uint256 salt;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev An RFQ limit order.
 | 
			
		||||
    struct RfqOrder {
 | 
			
		||||
        IERC20TokenV06 makerToken;
 | 
			
		||||
        IERC20TokenV06 takerToken;
 | 
			
		||||
        uint128 makerAmount;
 | 
			
		||||
        uint128 takerAmount;
 | 
			
		||||
        address maker;
 | 
			
		||||
        address taker;
 | 
			
		||||
        address txOrigin;
 | 
			
		||||
        bytes32 pool;
 | 
			
		||||
        uint64 expiry;
 | 
			
		||||
        uint256 salt;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Info on a limit or RFQ order.
 | 
			
		||||
    struct OrderInfo {
 | 
			
		||||
        bytes32 orderHash;
 | 
			
		||||
        OrderStatus status;
 | 
			
		||||
        uint128 takerTokenFilledAmount;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    uint256 private constant UINT_128_MASK = (1 << 128) - 1;
 | 
			
		||||
    uint256 private constant UINT_64_MASK = (1 << 64) - 1;
 | 
			
		||||
    uint256 private constant ADDRESS_MASK = (1 << 160) - 1;
 | 
			
		||||
 | 
			
		||||
    // The type hash for limit orders, which is:
 | 
			
		||||
    // keccak256(abi.encodePacked(
 | 
			
		||||
    //     "LimitOrder(",
 | 
			
		||||
    //       "address makerToken,",
 | 
			
		||||
    //       "address takerToken,",
 | 
			
		||||
    //       "uint128 makerAmount,",
 | 
			
		||||
    //       "uint128 takerAmount,",
 | 
			
		||||
    //       "uint128 takerTokenFeeAmount,",
 | 
			
		||||
    //       "address maker,",
 | 
			
		||||
    //       "address taker,",
 | 
			
		||||
    //       "address sender,",
 | 
			
		||||
    //       "address feeRecipient,",
 | 
			
		||||
    //       "bytes32 pool,",
 | 
			
		||||
    //       "uint64 expiry,",
 | 
			
		||||
    //       "uint256 salt"
 | 
			
		||||
    //     ")"
 | 
			
		||||
    // ))
 | 
			
		||||
    uint256 private constant _LIMIT_ORDER_TYPEHASH =
 | 
			
		||||
        0xce918627cb55462ddbb85e73de69a8b322f2bc88f4507c52fcad6d4c33c29d49;
 | 
			
		||||
 | 
			
		||||
    // The type hash for RFQ orders, which is:
 | 
			
		||||
    // keccak256(abi.encodePacked(
 | 
			
		||||
    //     "RfqOrder(",
 | 
			
		||||
    //       "address makerToken,",
 | 
			
		||||
    //       "address takerToken,",
 | 
			
		||||
    //       "uint128 makerAmount,",
 | 
			
		||||
    //       "uint128 takerAmount,",
 | 
			
		||||
    //       "address maker,",
 | 
			
		||||
    //       "address txOrigin,",
 | 
			
		||||
    //       "address taker,",
 | 
			
		||||
    //       "bytes32 pool,",
 | 
			
		||||
    //       "uint64 expiry,",
 | 
			
		||||
    //       "uint256 salt"
 | 
			
		||||
    //     ")"
 | 
			
		||||
    // ))
 | 
			
		||||
    uint256 private constant _RFQ_ORDER_TYPEHASH =
 | 
			
		||||
        0xe593d3fdfa8b60e5e17a1b2204662ecbe15c23f2084b9ad5bae40359540a7da9;
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the struct hash of a limit order.
 | 
			
		||||
    /// @param order The limit order.
 | 
			
		||||
    /// @return structHash The struct hash of the order.
 | 
			
		||||
    function getLimitOrderStructHash(LimitOrder memory order)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes32 structHash)
 | 
			
		||||
    {
 | 
			
		||||
        // The struct hash is:
 | 
			
		||||
        // keccak256(abi.encode(
 | 
			
		||||
        //   TYPE_HASH,
 | 
			
		||||
        //   order.makerToken,
 | 
			
		||||
        //   order.takerToken,
 | 
			
		||||
        //   order.makerAmount,
 | 
			
		||||
        //   order.takerAmount,
 | 
			
		||||
        //   order.takerTokenFeeAmount,
 | 
			
		||||
        //   order.maker,
 | 
			
		||||
        //   order.taker,
 | 
			
		||||
        //   order.sender,
 | 
			
		||||
        //   order.feeRecipient,
 | 
			
		||||
        //   order.pool,
 | 
			
		||||
        //   order.expiry,
 | 
			
		||||
        //   order.salt,
 | 
			
		||||
        // ))
 | 
			
		||||
        assembly {
 | 
			
		||||
            let mem := mload(0x40)
 | 
			
		||||
            mstore(mem, _LIMIT_ORDER_TYPEHASH)
 | 
			
		||||
            // order.makerToken;
 | 
			
		||||
            mstore(add(mem, 0x20), and(ADDRESS_MASK, mload(order)))
 | 
			
		||||
            // order.takerToken;
 | 
			
		||||
            mstore(add(mem, 0x40), and(ADDRESS_MASK, mload(add(order, 0x20))))
 | 
			
		||||
            // order.makerAmount;
 | 
			
		||||
            mstore(add(mem, 0x60), and(UINT_128_MASK, mload(add(order, 0x40))))
 | 
			
		||||
            // order.takerAmount;
 | 
			
		||||
            mstore(add(mem, 0x80), and(UINT_128_MASK, mload(add(order, 0x60))))
 | 
			
		||||
            // order.takerTokenFeeAmount;
 | 
			
		||||
            mstore(add(mem, 0xA0), and(UINT_128_MASK, mload(add(order, 0x80))))
 | 
			
		||||
            // order.maker;
 | 
			
		||||
            mstore(add(mem, 0xC0), and(ADDRESS_MASK, mload(add(order, 0xA0))))
 | 
			
		||||
            // order.taker;
 | 
			
		||||
            mstore(add(mem, 0xE0), and(ADDRESS_MASK, mload(add(order, 0xC0))))
 | 
			
		||||
            // order.sender;
 | 
			
		||||
            mstore(add(mem, 0x100), and(ADDRESS_MASK, mload(add(order, 0xE0))))
 | 
			
		||||
            // order.feeRecipient;
 | 
			
		||||
            mstore(add(mem, 0x120), and(ADDRESS_MASK, mload(add(order, 0x100))))
 | 
			
		||||
            // order.pool;
 | 
			
		||||
            mstore(add(mem, 0x140), mload(add(order, 0x120)))
 | 
			
		||||
            // order.expiry;
 | 
			
		||||
            mstore(add(mem, 0x160), and(UINT_64_MASK, mload(add(order, 0x140))))
 | 
			
		||||
            // order.salt;
 | 
			
		||||
            mstore(add(mem, 0x180), mload(add(order, 0x160)))
 | 
			
		||||
            structHash := keccak256(mem, 0x1A0)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Get the struct hash of a RFQ order.
 | 
			
		||||
    /// @param order The RFQ order.
 | 
			
		||||
    /// @return structHash The struct hash of the order.
 | 
			
		||||
    function getRfqOrderStructHash(RfqOrder memory order)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes32 structHash)
 | 
			
		||||
    {
 | 
			
		||||
        // The struct hash is:
 | 
			
		||||
        // keccak256(abi.encode(
 | 
			
		||||
        //   TYPE_HASH,
 | 
			
		||||
        //   order.makerToken,
 | 
			
		||||
        //   order.takerToken,
 | 
			
		||||
        //   order.makerAmount,
 | 
			
		||||
        //   order.takerAmount,
 | 
			
		||||
        //   order.maker,
 | 
			
		||||
        //   order.taker,
 | 
			
		||||
        //   order.txOrigin,
 | 
			
		||||
        //   order.pool,
 | 
			
		||||
        //   order.expiry,
 | 
			
		||||
        //   order.salt,
 | 
			
		||||
        // ))
 | 
			
		||||
        assembly {
 | 
			
		||||
            let mem := mload(0x40)
 | 
			
		||||
            mstore(mem, _RFQ_ORDER_TYPEHASH)
 | 
			
		||||
            // order.makerToken;
 | 
			
		||||
            mstore(add(mem, 0x20), and(ADDRESS_MASK, mload(order)))
 | 
			
		||||
            // order.takerToken;
 | 
			
		||||
            mstore(add(mem, 0x40), and(ADDRESS_MASK, mload(add(order, 0x20))))
 | 
			
		||||
            // order.makerAmount;
 | 
			
		||||
            mstore(add(mem, 0x60), and(UINT_128_MASK, mload(add(order, 0x40))))
 | 
			
		||||
            // order.takerAmount;
 | 
			
		||||
            mstore(add(mem, 0x80), and(UINT_128_MASK, mload(add(order, 0x60))))
 | 
			
		||||
            // order.maker;
 | 
			
		||||
            mstore(add(mem, 0xA0), and(ADDRESS_MASK, mload(add(order, 0x80))))
 | 
			
		||||
            // order.taker;
 | 
			
		||||
            mstore(add(mem, 0xC0), and(ADDRESS_MASK, mload(add(order, 0xA0))))
 | 
			
		||||
            // order.txOrigin;
 | 
			
		||||
            mstore(add(mem, 0xE0), and(ADDRESS_MASK, mload(add(order, 0xC0))))
 | 
			
		||||
            // order.pool;
 | 
			
		||||
            mstore(add(mem, 0x100), mload(add(order, 0xE0)))
 | 
			
		||||
            // order.expiry;
 | 
			
		||||
            mstore(add(mem, 0x120), and(UINT_64_MASK, mload(add(order, 0x100))))
 | 
			
		||||
            // order.salt;
 | 
			
		||||
            mstore(add(mem, 0x140), mload(add(order, 0x120)))
 | 
			
		||||
            structHash := keccak256(mem, 0x160)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										151
									
								
								contracts/zero-ex/contracts/src/features/libs/LibSignature.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								contracts/zero-ex/contracts/src/features/libs/LibSignature.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,151 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
 | 
			
		||||
import "../../errors/LibSignatureRichErrors.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev A library for validating signatures.
 | 
			
		||||
library LibSignature {
 | 
			
		||||
    using LibRichErrorsV06 for bytes;
 | 
			
		||||
 | 
			
		||||
    // '\x19Ethereum Signed Message:\n32\x00\x00\x00\x00' in a word.
 | 
			
		||||
    uint256 private constant ETH_SIGN_HASH_PREFIX =
 | 
			
		||||
        0x19457468657265756d205369676e6564204d6573736167653a0a333200000000;
 | 
			
		||||
    /// @dev Exclusive upper limit on ECDSA signatures 'R' values.
 | 
			
		||||
    ///      The valid range is given by fig (282) of the yellow paper.
 | 
			
		||||
    uint256 private constant ECDSA_SIGNATURE_R_LIMIT =
 | 
			
		||||
        uint256(0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141);
 | 
			
		||||
    /// @dev Exclusive upper limit on ECDSA signatures 'S' values.
 | 
			
		||||
    ///      The valid range is given by fig (283) of the yellow paper.
 | 
			
		||||
    uint256 private constant ECDSA_SIGNATURE_S_LIMIT = ECDSA_SIGNATURE_R_LIMIT / 2 + 1;
 | 
			
		||||
 | 
			
		||||
    /// @dev Allowed signature types.
 | 
			
		||||
    enum SignatureType {
 | 
			
		||||
        ILLEGAL,
 | 
			
		||||
        INVALID,
 | 
			
		||||
        EIP712,
 | 
			
		||||
        ETHSIGN
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Encoded EC signature.
 | 
			
		||||
    struct Signature {
 | 
			
		||||
        // How to validate the signature.
 | 
			
		||||
        SignatureType signatureType;
 | 
			
		||||
        // EC Signature data.
 | 
			
		||||
        uint8 v;
 | 
			
		||||
        // EC Signature data.
 | 
			
		||||
        bytes32 r;
 | 
			
		||||
        // EC Signature data.
 | 
			
		||||
        bytes32 s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Retrieve the signer of a signature.
 | 
			
		||||
    ///      Throws if the signature can't be validated.
 | 
			
		||||
    /// @param hash The hash that was signed.
 | 
			
		||||
    /// @param signature The signature.
 | 
			
		||||
    /// @return recovered The recovered signer address.
 | 
			
		||||
    function getSignerOfHash(
 | 
			
		||||
        bytes32 hash,
 | 
			
		||||
        Signature memory signature
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (address recovered)
 | 
			
		||||
    {
 | 
			
		||||
        // Ensure this is a signature type that can be validated against a hash.
 | 
			
		||||
        _validateHashCompatibleSignature(hash, signature);
 | 
			
		||||
 | 
			
		||||
        if (signature.signatureType == SignatureType.EIP712) {
 | 
			
		||||
            // Signed using EIP712
 | 
			
		||||
            recovered = ecrecover(
 | 
			
		||||
                hash,
 | 
			
		||||
                signature.v,
 | 
			
		||||
                signature.r,
 | 
			
		||||
                signature.s
 | 
			
		||||
            );
 | 
			
		||||
        } else if (signature.signatureType == SignatureType.ETHSIGN) {
 | 
			
		||||
            // Signed using `eth_sign`
 | 
			
		||||
            // Need to hash `hash` with "\x19Ethereum Signed Message:\n32" prefix
 | 
			
		||||
            // in packed encoding.
 | 
			
		||||
            bytes32 ethSignHash;
 | 
			
		||||
            assembly {
 | 
			
		||||
                // Use scratch space
 | 
			
		||||
                mstore(0, ETH_SIGN_HASH_PREFIX) // length of 28 bytes
 | 
			
		||||
                mstore(28, hash) // length of 32 bytes
 | 
			
		||||
                ethSignHash := keccak256(0, 60)
 | 
			
		||||
            }
 | 
			
		||||
            recovered = ecrecover(
 | 
			
		||||
                ethSignHash,
 | 
			
		||||
                signature.v,
 | 
			
		||||
                signature.r,
 | 
			
		||||
                signature.s
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        // `recovered` can be null if the signature values are out of range.
 | 
			
		||||
        if (recovered == address(0)) {
 | 
			
		||||
            LibSignatureRichErrors.SignatureValidationError(
 | 
			
		||||
                LibSignatureRichErrors.SignatureValidationErrorCodes.BAD_SIGNATURE_DATA,
 | 
			
		||||
                hash
 | 
			
		||||
            ).rrevert();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Validates that a signature is compatible with a hash signee.
 | 
			
		||||
    /// @param hash The hash that was signed.
 | 
			
		||||
    /// @param signature The signature.
 | 
			
		||||
    function _validateHashCompatibleSignature(
 | 
			
		||||
        bytes32 hash,
 | 
			
		||||
        Signature memory signature
 | 
			
		||||
    )
 | 
			
		||||
        private
 | 
			
		||||
        pure
 | 
			
		||||
    {
 | 
			
		||||
        // Ensure the r and s are within malleability limits.
 | 
			
		||||
        if (uint256(signature.r) >= ECDSA_SIGNATURE_R_LIMIT ||
 | 
			
		||||
            uint256(signature.s) >= ECDSA_SIGNATURE_S_LIMIT)
 | 
			
		||||
        {
 | 
			
		||||
            LibSignatureRichErrors.SignatureValidationError(
 | 
			
		||||
                LibSignatureRichErrors.SignatureValidationErrorCodes.BAD_SIGNATURE_DATA,
 | 
			
		||||
                hash
 | 
			
		||||
            ).rrevert();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Always illegal signature.
 | 
			
		||||
        if (signature.signatureType == SignatureType.ILLEGAL) {
 | 
			
		||||
            LibSignatureRichErrors.SignatureValidationError(
 | 
			
		||||
                LibSignatureRichErrors.SignatureValidationErrorCodes.ILLEGAL,
 | 
			
		||||
                hash
 | 
			
		||||
            ).rrevert();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Always invalid.
 | 
			
		||||
        if (signature.signatureType == SignatureType.INVALID) {
 | 
			
		||||
            LibSignatureRichErrors.SignatureValidationError(
 | 
			
		||||
                LibSignatureRichErrors.SignatureValidationErrorCodes.ALWAYS_INVALID,
 | 
			
		||||
                hash
 | 
			
		||||
            ).rrevert();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Solidity should check that the signature type is within enum range for us
 | 
			
		||||
        // when abi-decoding.
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2020 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6.5;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @dev Library for working with signed calldata.
 | 
			
		||||
library LibSignedCallData {
 | 
			
		||||
    using LibBytesV06 for bytes;
 | 
			
		||||
 | 
			
		||||
    // bytes4(keccak256('SignedCallDataSignature(bytes)'))
 | 
			
		||||
    bytes4 constant private SIGNATURE_SELECTOR = 0xf86d1d92;
 | 
			
		||||
 | 
			
		||||
    /// @dev Try to parse potentially signed calldata into its hash and signature
 | 
			
		||||
    ///      components. Signed calldata has signature data appended to it.
 | 
			
		||||
    /// @param callData the raw call data.
 | 
			
		||||
    /// @return callDataHash If a signature is detected, this will be the hash of
 | 
			
		||||
    ///         the bytes preceding the signature data. Otherwise, this
 | 
			
		||||
    ///         will be the hash of the entire `callData`.
 | 
			
		||||
    /// @return signature The signature bytes, if present.
 | 
			
		||||
    function parseCallData(bytes memory callData)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bytes32 callDataHash, bytes memory signature)
 | 
			
		||||
    {
 | 
			
		||||
        // Signed calldata has a 70 byte signature appended as:
 | 
			
		||||
        // ```
 | 
			
		||||
        //   abi.encodePacked(
 | 
			
		||||
        //     callData,
 | 
			
		||||
        //     bytes4(keccak256('SignedCallDataSignature(bytes)')),
 | 
			
		||||
        //     signature // 66 bytes
 | 
			
		||||
        //   );
 | 
			
		||||
        // ```
 | 
			
		||||
 | 
			
		||||
        // Try to detect an appended signature. This isn't foolproof, but an
 | 
			
		||||
        // accidental false positive should highly unlikely. Additinally, the
 | 
			
		||||
        // signature would also have to pass verification, so the risk here is
 | 
			
		||||
        // low.
 | 
			
		||||
        if (
 | 
			
		||||
            // Signed callData has to be at least 70 bytes long.
 | 
			
		||||
            callData.length < 70 ||
 | 
			
		||||
            // The bytes4 at offset -70 should equal `SIGNATURE_SELECTOR`.
 | 
			
		||||
            SIGNATURE_SELECTOR != callData.readBytes4(callData.length - 70)
 | 
			
		||||
        ) {
 | 
			
		||||
            return (keccak256(callData), signature);
 | 
			
		||||
        }
 | 
			
		||||
        // Consider everything before the signature selector as the original
 | 
			
		||||
        // calldata and everything after as the signature.
 | 
			
		||||
        assembly {
 | 
			
		||||
            callDataHash := keccak256(add(callData, 32), sub(mload(callData), 70))
 | 
			
		||||
        }
 | 
			
		||||
        signature = callData.slice(callData.length - 66, callData.length);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user