Compare commits
	
		
			77 Commits
		
	
	
		
			@0x/contra
			...
			protocol@7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 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,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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) | ||||
|   | ||||
							
								
								
									
										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; | ||||
|     } | ||||
| } | ||||
| @@ -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.6.7", | ||||
|     "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.12", | ||||
|         "@0x/contract-wrappers": "^13.10.2", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.13", | ||||
|         "@0x/contracts-erc1155": "^2.1.16", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-erc721": "^3.1.16", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.16", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.2.10", | ||||
|         "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, | ||||
|   | ||||
| @@ -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,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.15", | ||||
|     "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.12", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.7", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-erc721": "^3.1.16", | ||||
|         "@0x/contracts-exchange": "^3.2.16", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.16", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.2.10", | ||||
|         "@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.13", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.16", | ||||
|     "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.12", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.7", | ||||
|         "@0x/contracts-dev-utils": "^1.3.14", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.2.4", | ||||
|         "@0x/web3-wrapper": "^7.2.10", | ||||
|         "@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.13", | ||||
|         "@0x/contract-addresses": "^5.5.0", | ||||
|         "@0x/contracts-exchange": "^3.2.16", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@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,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.14", | ||||
|     "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.12", | ||||
|         "@0x/assert": "^3.0.19", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.7", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.13", | ||||
|         "@types/node": "12.12.54" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.16", | ||||
|     "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.12", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.13", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.2.10", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.10", | ||||
|     "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.12", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.2.10", | ||||
|         "@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.13" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.16", | ||||
|     "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.12", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.2.10", | ||||
|         "@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.13" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.16", | ||||
|     "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.12", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.7", | ||||
|         "@0x/contracts-dev-utils": "^1.3.14", | ||||
|         "@0x/contracts-erc1155": "^2.1.16", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-erc721": "^3.1.16", | ||||
|         "@0x/contracts-exchange": "^3.2.16", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.16", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.2.10", | ||||
|         "@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.13", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.16", | ||||
|     "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.12", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@0x/subproviders": "^6.2.2", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.2.4", | ||||
|         "@0x/web3-wrapper": "^7.2.10", | ||||
|         "@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.13", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@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,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.16", | ||||
|     "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.12", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.7", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.16", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-multisig": "^4.1.16", | ||||
|         "@0x/contracts-staking": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.2.10", | ||||
|         "@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.13", | ||||
|         "@0x/contracts-dev-utils": "^1.3.14", | ||||
|         "@0x/contracts-erc1155": "^2.1.16", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-erc721": "^3.1.16", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.10", | ||||
|     "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.12", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.7", | ||||
|         "@0x/contracts-dev-utils": "^1.3.14", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-erc721": "^3.1.16", | ||||
|         "@0x/contracts-exchange": "^3.2.16", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.16", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.2.10", | ||||
|         "@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.13", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@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.13", | ||||
|     "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,24 @@ | ||||
|     }, | ||||
|     "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.12", | ||||
|         "@0x/contract-addresses": "^5.5.0", | ||||
|         "@0x/contract-wrappers": "^13.10.2", | ||||
|         "@0x/contracts-broker": "^1.1.15", | ||||
|         "@0x/contracts-coordinator": "^3.1.16", | ||||
|         "@0x/contracts-dev-utils": "^1.3.14", | ||||
|         "@0x/contracts-exchange-forwarder": "^4.2.16", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.16", | ||||
|         "@0x/contracts-extensions": "^6.2.10", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@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.2", | ||||
|         "@0x/migrations": "^6.5.2", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.2.4", | ||||
|         "@0x/web3-wrapper": "^7.2.10", | ||||
|         "@azure/core-asynciterator-polyfill": "^1.0.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -91,22 +92,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.4.0", | ||||
|         "@0x/base-contract": "^6.2.13", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.7", | ||||
|         "@0x/contracts-erc1155": "^2.1.16", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-erc721": "^3.1.16", | ||||
|         "@0x/contracts-exchange": "^3.2.16", | ||||
|         "@0x/contracts-multisig": "^4.1.16", | ||||
|         "@0x/contracts-staking": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-zero-ex": "^0.11.0", | ||||
|         "@0x/subproviders": "^6.2.2", | ||||
|         "@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,7 +6,7 @@ import { | ||||
|     artifacts as exchangeProxyArtifacts, | ||||
|     IZeroExContract, | ||||
|     LogMetadataTransformerContract, | ||||
|     signCallData, | ||||
|     Signature, | ||||
| } from '@0x/contracts-zero-ex'; | ||||
| import { migrateOnceAsync } from '@0x/migrations'; | ||||
| import { | ||||
| @@ -20,10 +20,19 @@ import { | ||||
|     SignedExchangeProxyMetaTransaction, | ||||
| } from '@0x/order-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 +197,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 +226,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 +251,6 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => { | ||||
|             [ | ||||
|                 { | ||||
|                     taker, | ||||
|                     callDataHash, | ||||
|                     sender: zeroEx.address, | ||||
|                     data: NULL_BYTES, | ||||
|                 }, | ||||
| @@ -268,15 +259,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 +284,6 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => { | ||||
|             [ | ||||
|                 { | ||||
|                     taker, | ||||
|                     callDataHash, | ||||
|                     sender: zeroEx.address, | ||||
|                     data: NULL_BYTES, | ||||
|                 }, | ||||
| @@ -304,51 +292,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 +317,6 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => { | ||||
|             [ | ||||
|                 { | ||||
|                     taker, | ||||
|                     callDataHash, | ||||
|                     sender: zeroEx.address, | ||||
|                     data: NULL_BYTES, | ||||
|                 }, | ||||
| @@ -376,16 +325,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 +352,6 @@ blockchainTests.resets('exchange proxy - meta-transactions', env => { | ||||
|             [ | ||||
|                 { | ||||
|                     taker, | ||||
|                     callDataHash, | ||||
|                     sender: zeroEx.address, | ||||
|                     data: NULL_BYTES, | ||||
|                 }, | ||||
| @@ -412,15 +359,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,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.16", | ||||
|     "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.12", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.7", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.2.10", | ||||
|         "@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.13", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.23", | ||||
|     "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.12", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.7", | ||||
|         "@0x/contracts-dev-utils": "^1.3.14", | ||||
|         "@0x/contracts-erc20": "^3.2.10", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.16", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-utils": "^4.6.1", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.2.10", | ||||
|         "@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.13", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@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,67 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.13", | ||||
|     "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.0", | ||||
|         "@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.13", | ||||
|         "@0x/contract-addresses": "^5.5.0", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/json-schemas": "^5.3.4", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/sol-coverage": "^4.0.23", | ||||
|         "@0x/sol-profiler": "^4.1.13", | ||||
|         "@0x/sol-trace": "^3.0.23", | ||||
|         "@0x/subproviders": "^6.2.2", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.2.10", | ||||
|         "@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,68 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,34 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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.1", | ||||
|     "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.12", | ||||
|         "@0x/contracts-gen": "^2.0.23", | ||||
|         "@0x/contracts-test-utils": "^5.3.13", | ||||
|         "@0x/dev-utils": "^4.1.2", | ||||
|         "@0x/order-utils": "^10.4.8", | ||||
|         "@0x/sol-compiler": "^4.4.0", | ||||
|         "@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.2.10", | ||||
|         "@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.13", | ||||
|         "@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" | ||||
|   | ||||
| @@ -1,4 +1,161 @@ | ||||
| [ | ||||
|     { | ||||
|         "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,56 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## 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 | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										65
									
								
								contracts/zero-ex/contracts/src/external/FeeCollector.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								contracts/zero-ex/contracts/src/external/FeeCollector.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| /* | ||||
|  | ||||
|   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 | ||||
|     { | ||||
|         // Leave 1 wei behind to avoid expensive zero-->non-zero state change. | ||||
|         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 | ||||
|         )))); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										139
									
								
								contracts/zero-ex/contracts/src/external/LiquidityProviderSandbox.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								contracts/zero-ex/contracts/src/external/LiquidityProviderSandbox.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,139 @@ | ||||
| /* | ||||
|   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 | ||||
|     { | ||||
|         try ILiquidityProvider(provider).sellTokenForToken( | ||||
|             inputToken, | ||||
|             outputToken, | ||||
|             recipient, | ||||
|             minBuyAmount, | ||||
|             auxiliaryData | ||||
|         ) {} catch { | ||||
|             IERC20Bridge(provider).bridgeTransferFrom( | ||||
|                 outputToken, | ||||
|                 provider, | ||||
|                 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, 1); | ||||
|  | ||||
|     /// @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,102 @@ 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); | ||||
|         if (inputToken == ETH_TOKEN_ADDRESS) { | ||||
|             provider.transfer(sellAmount); | ||||
|         } else { | ||||
|             LibTokenSpender.spendERC20Tokens( | ||||
|                 IERC20TokenV06(takerToken), | ||||
|             _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, 0); | ||||
|     /// @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) | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -155,52 +168,10 @@ contract UniswapFeature is | ||||
|  | ||||
|                 if iszero(i) { | ||||
|                     switch eq(sellToken, ETH_TOKEN_ADDRESS_32) | ||||
|                         case 0 { | ||||
|                         case 0 { // Not selling ETH. Selling an ERC20 instead. | ||||
|                             // 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 | ||||
| @@ -389,6 +360,108 @@ 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 := call(gas(), token, 0, 0xB00, 0x44, 0xC00, 0x20) | ||||
|                     if iszero(success) { | ||||
|                         // Call to allowance() failed. | ||||
|                         bubbleRevert() | ||||
|                     } | ||||
|                     // 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( | ||||
|                     // Cap the gas limit to prvent all gas being consumed | ||||
|                     // if the token reverts. | ||||
|                     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); | ||||
|     } | ||||
| } | ||||
| @@ -1,128 +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-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol"; | ||||
| import "../../errors/LibSpenderRichErrors.sol"; | ||||
| import "../ITokenSpenderFeature.sol"; | ||||
|  | ||||
| library LibTokenSpender { | ||||
|     using LibRichErrorsV06 for bytes; | ||||
|  | ||||
|     /// @dev Transfers ERC20 tokens from `owner` to `to`. | ||||
|     /// @param token The token to spend. | ||||
|     /// @param owner The owner of the tokens. | ||||
|     /// @param to The recipient of the tokens. | ||||
|     /// @param amount The amount of `token` to transfer. | ||||
|     function spendERC20Tokens( | ||||
|         IERC20TokenV06 token, | ||||
|         address owner, | ||||
|         address to, | ||||
|         uint256 amount | ||||
|     ) | ||||
|         internal | ||||
|     { | ||||
|         bool success; | ||||
|         bytes memory revertData; | ||||
|  | ||||
|         require(address(token) != address(this), "LibTokenSpender/CANNOT_INVOKE_SELF"); | ||||
|  | ||||
|         assembly { | ||||
|             let ptr := mload(0x40) // free memory pointer | ||||
|  | ||||
|             // selector for transferFrom(address,address,uint256) | ||||
|             mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000) | ||||
|             mstore(add(ptr, 0x04), owner) | ||||
|             mstore(add(ptr, 0x24), to) | ||||
|             mstore(add(ptr, 0x44), amount) | ||||
|  | ||||
|             success := call(gas(), token, 0, ptr, 0x64, 0, 0) | ||||
|  | ||||
|             let rdsize := returndatasize() | ||||
|  | ||||
|             returndatacopy(add(ptr, 0x20), 0, rdsize) // reuse memory | ||||
|  | ||||
|             // Check for ERC20 success. ERC20 tokens should return a boolean, | ||||
|             // but some don't. We accept 0-length return data as success, or at | ||||
|             // least 32 bytes that starts with a 32-byte boolean true. | ||||
|             success := and( | ||||
|                 success,                             // call itself succeeded | ||||
|                 or( | ||||
|                     iszero(rdsize),                  // no return data, or | ||||
|                     and( | ||||
|                         iszero(lt(rdsize, 32)),      // at least 32 bytes | ||||
|                         eq(mload(add(ptr, 0x20)), 1) // starts with uint256(1) | ||||
|                     ) | ||||
|                 ) | ||||
|             ) | ||||
|  | ||||
|             if iszero(success) { | ||||
|                 // revertData is a bytes, so length-prefixed data | ||||
|                 mstore(ptr, rdsize) | ||||
|                 revertData := ptr | ||||
|  | ||||
|                 // update free memory pointer (ptr + 32-byte length + return data) | ||||
|                 mstore(0x40, add(add(ptr, 0x20), rdsize)) | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (!success) { | ||||
|             // Try the old AllowanceTarget. | ||||
|             try ITokenSpenderFeature(address(this))._spendERC20Tokens( | ||||
|                     token, | ||||
|                     owner, | ||||
|                     to, | ||||
|                     amount | ||||
|                 ) { | ||||
|             } catch { | ||||
|                 // Bubble up the first error message. (In general, the fallback to the | ||||
|                 // allowance target is opportunistic. We ignore the specific error | ||||
|                 // message if it fails.) | ||||
|                 LibSpenderRichErrors.SpenderERC20TransferFromFailedError( | ||||
|                     address(token), | ||||
|                     owner, | ||||
|                     to, | ||||
|                     amount, | ||||
|                     revertData | ||||
|                 ).rrevert(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Gets the maximum amount of an ERC20 token `token` that can be | ||||
|     ///      pulled from `owner` by this address. | ||||
|     /// @param token The token to spend. | ||||
|     /// @param owner The owner of the tokens. | ||||
|     /// @return amount The amount of tokens that can be pulled. | ||||
|     function getSpendableERC20BalanceOf( | ||||
|         IERC20TokenV06 token, | ||||
|         address owner | ||||
|     ) | ||||
|         internal | ||||
|         view | ||||
|         returns (uint256) | ||||
|     { | ||||
|         return LibSafeMathV06.min256( | ||||
|             token.allowance(owner, address(this)), | ||||
|             token.balanceOf(owner) | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										121
									
								
								contracts/zero-ex/contracts/src/fixins/FixinProtocolFees.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								contracts/zero-ex/contracts/src/fixins/FixinProtocolFees.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| /* | ||||
|  | ||||
|   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 "../external/FeeCollector.sol"; | ||||
| import "../external/FeeCollectorController.sol"; | ||||
| import "../external/LibFeeCollector.sol"; | ||||
| import "../vendor/v3/IStaking.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev Helpers for collecting protocol fees. | ||||
| abstract contract FixinProtocolFees { | ||||
|  | ||||
|     /// @dev The protocol fee multiplier. | ||||
|     uint32 public immutable PROTOCOL_FEE_MULTIPLIER; | ||||
|     /// @dev The `FeeCollectorController` contract. | ||||
|     FeeCollectorController private immutable FEE_COLLECTOR_CONTROLLER; | ||||
|     /// @dev Hash of the fee collector init code. | ||||
|     bytes32 private immutable FEE_COLLECTOR_INIT_CODE_HASH; | ||||
|     /// @dev The WETH token contract. | ||||
|     IEtherTokenV06 private immutable WETH; | ||||
|     /// @dev The staking contract. | ||||
|     IStaking private immutable STAKING; | ||||
|  | ||||
|     constructor( | ||||
|         IEtherTokenV06 weth, | ||||
|         IStaking staking, | ||||
|         FeeCollectorController feeCollectorController, | ||||
|         uint32 protocolFeeMultiplier | ||||
|     ) | ||||
|         internal | ||||
|     { | ||||
|         FEE_COLLECTOR_CONTROLLER = feeCollectorController; | ||||
|         FEE_COLLECTOR_INIT_CODE_HASH = | ||||
|             feeCollectorController.FEE_COLLECTOR_INIT_CODE_HASH(); | ||||
|         WETH = weth; | ||||
|         STAKING = staking; | ||||
|         PROTOCOL_FEE_MULTIPLIER = protocolFeeMultiplier; | ||||
|     } | ||||
|  | ||||
|     /// @dev   Collect the specified protocol fee in ETH. | ||||
|     ///        The fee is stored in a per-pool fee collector contract. | ||||
|     /// @param poolId The pool ID for which a fee is being collected. | ||||
|     /// @return ethProtocolFeePaid How much protocol fee was collected in ETH. | ||||
|     function _collectProtocolFee(bytes32 poolId) | ||||
|         internal | ||||
|         returns (uint256 ethProtocolFeePaid) | ||||
|     { | ||||
|         uint256 protocolFeePaid = _getSingleProtocolFee(); | ||||
|         if (protocolFeePaid == 0) { | ||||
|             // Nothing to do. | ||||
|             return 0; | ||||
|         } | ||||
|         FeeCollector feeCollector = _getFeeCollector(poolId); | ||||
|         (bool success,) = address(feeCollector).call{value: protocolFeePaid}(""); | ||||
|         require(success, "FixinProtocolFees/ETHER_TRANSFER_FALIED"); | ||||
|         return protocolFeePaid; | ||||
|     } | ||||
|  | ||||
|     /// @dev Transfer fees for a given pool to the staking contract. | ||||
|     /// @param poolId Identifies the pool whose fees are being paid. | ||||
|     function _transferFeesForPool(bytes32 poolId) | ||||
|         internal | ||||
|     { | ||||
|         // This will create a FeeCollector contract (if necessary) and wrap | ||||
|         // fees for the pool ID. | ||||
|         FeeCollector feeCollector = | ||||
|             FEE_COLLECTOR_CONTROLLER.prepareFeeCollectorToPayFees(poolId); | ||||
|         // All fees in the fee collector should be in WETH now. | ||||
|         uint256 bal = WETH.balanceOf(address(feeCollector)); | ||||
|         if (bal > 1) { | ||||
|             // Leave 1 wei behind to avoid high SSTORE cost of zero-->non-zero. | ||||
|             STAKING.payProtocolFee( | ||||
|                 address(feeCollector), | ||||
|                 address(feeCollector), | ||||
|                 bal - 1); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Compute the CREATE2 address for a fee collector. | ||||
|     /// @param poolId The fee collector's pool ID. | ||||
|     function _getFeeCollector(bytes32 poolId) | ||||
|         internal | ||||
|         view | ||||
|         returns (FeeCollector) | ||||
|     { | ||||
|         return FeeCollector(LibFeeCollector.getFeeCollectorAddress( | ||||
|             address(FEE_COLLECTOR_CONTROLLER), | ||||
|             FEE_COLLECTOR_INIT_CODE_HASH, | ||||
|             poolId | ||||
|         )); | ||||
|     } | ||||
|  | ||||
|     /// @dev Get the cost of a single protocol fee. | ||||
|     /// @return protocolFeeAmount The protocol fee amount, in ETH/WETH. | ||||
|     function _getSingleProtocolFee() | ||||
|         internal | ||||
|         view | ||||
|         returns (uint256 protocolFeeAmount) | ||||
|     { | ||||
|         return uint256(PROTOCOL_FEE_MULTIPLIER) * tx.gasprice; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										208
									
								
								contracts/zero-ex/contracts/src/fixins/FixinTokenSpender.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										208
									
								
								contracts/zero-ex/contracts/src/fixins/FixinTokenSpender.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,208 @@ | ||||
| /* | ||||
|  | ||||
|   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/LibSafeMathV06.sol"; | ||||
| import "../features/ITokenSpenderFeature.sol"; | ||||
| import "../errors/LibSpenderRichErrors.sol"; | ||||
| import "../external/FeeCollector.sol"; | ||||
| import "../vendor/v3/IStaking.sol"; | ||||
| import "../vendor/v3/IStaking.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev Helpers for moving tokens around. | ||||
| abstract contract FixinTokenSpender { | ||||
|     using LibRichErrorsV06 for bytes; | ||||
|  | ||||
|     // Mask of the lower 20 bytes of a bytes32. | ||||
|     uint256 constant private ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff; | ||||
|     /// @dev A bloom filter for tokens that consume all gas when `transferFrom()` fails. | ||||
|     bytes32 public immutable GREEDY_TOKENS_BLOOM_FILTER; | ||||
|  | ||||
|     /// @param greedyTokensBloomFilter The bloom filter for all greedy tokens. | ||||
|     constructor(bytes32 greedyTokensBloomFilter) | ||||
|         internal | ||||
|     { | ||||
|         GREEDY_TOKENS_BLOOM_FILTER = greedyTokensBloomFilter; | ||||
|     } | ||||
|  | ||||
|     /// @dev Transfers ERC20 tokens from `owner` to `to`. | ||||
|     /// @param token The token to spend. | ||||
|     /// @param owner The owner of the tokens. | ||||
|     /// @param to The recipient of the tokens. | ||||
|     /// @param amount The amount of `token` to transfer. | ||||
|     function _transferERC20Tokens( | ||||
|         IERC20TokenV06 token, | ||||
|         address owner, | ||||
|         address to, | ||||
|         uint256 amount | ||||
|     ) | ||||
|         internal | ||||
|     { | ||||
|         bool success; | ||||
|         bytes memory revertData; | ||||
|  | ||||
|         require(address(token) != address(this), "FixinTokenSpender/CANNOT_INVOKE_SELF"); | ||||
|  | ||||
|         // If the token eats all gas when failing, we do not want to perform | ||||
|         // optimistic fall through to the old AllowanceTarget contract if the | ||||
|         // direct transferFrom() fails. | ||||
|         if (_isTokenPossiblyGreedy(token)) { | ||||
|             // If the token does not have a direct allowance on us then we use | ||||
|             // the allowance target. | ||||
|             if (token.allowance(owner, address(this)) < amount) { | ||||
|                 _transferFromLegacyAllowanceTarget( | ||||
|                     token, | ||||
|                     owner, | ||||
|                     to, | ||||
|                     amount, | ||||
|                     "" | ||||
|                 ); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         assembly { | ||||
|             let ptr := mload(0x40) // free memory pointer | ||||
|  | ||||
|             // selector for transferFrom(address,address,uint256) | ||||
|             mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000) | ||||
|             mstore(add(ptr, 0x04), and(owner, ADDRESS_MASK)) | ||||
|             mstore(add(ptr, 0x24), and(to, ADDRESS_MASK)) | ||||
|             mstore(add(ptr, 0x44), amount) | ||||
|  | ||||
|             success := call( | ||||
|                 gas(), | ||||
|                 and(token, ADDRESS_MASK), | ||||
|                 0, | ||||
|                 ptr, | ||||
|                 0x64, | ||||
|                 0, | ||||
|                 0 | ||||
|             ) | ||||
|  | ||||
|             let rdsize := returndatasize() | ||||
|  | ||||
|             returndatacopy(add(ptr, 0x20), 0, rdsize) // reuse memory | ||||
|  | ||||
|             // Check for ERC20 success. ERC20 tokens should return a boolean, | ||||
|             // but some don't. We accept 0-length return data as success, or at | ||||
|             // least 32 bytes that starts with a 32-byte boolean true. | ||||
|             success := and( | ||||
|                 success,                             // call itself succeeded | ||||
|                 or( | ||||
|                     iszero(rdsize),                  // no return data, or | ||||
|                     and( | ||||
|                         iszero(lt(rdsize, 32)),      // at least 32 bytes | ||||
|                         eq(mload(add(ptr, 0x20)), 1) // starts with uint256(1) | ||||
|                     ) | ||||
|                 ) | ||||
|             ) | ||||
|  | ||||
|             if iszero(success) { | ||||
|                 // revertData is a bytes, so length-prefixed data | ||||
|                 mstore(ptr, rdsize) | ||||
|                 revertData := ptr | ||||
|  | ||||
|                 // update free memory pointer (ptr + 32-byte length + return data) | ||||
|                 mstore(0x40, add(add(ptr, 0x20), rdsize)) | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (!success) { | ||||
|             _transferFromLegacyAllowanceTarget( | ||||
|                 token, | ||||
|                 owner, | ||||
|                 to, | ||||
|                 amount, | ||||
|                 revertData | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Gets the maximum amount of an ERC20 token `token` that can be | ||||
|     ///      pulled from `owner` by this address. | ||||
|     /// @param token The token to spend. | ||||
|     /// @param owner The owner of the tokens. | ||||
|     /// @return amount The amount of tokens that can be pulled. | ||||
|     function _getSpendableERC20BalanceOf( | ||||
|         IERC20TokenV06 token, | ||||
|         address owner | ||||
|     ) | ||||
|         internal | ||||
|         view | ||||
|         returns (uint256) | ||||
|     { | ||||
|         return LibSafeMathV06.min256( | ||||
|             token.allowance(owner, address(this)), | ||||
|             token.balanceOf(owner) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Check if a token possibly belongs to the `GREEDY_TOKENS_BLOOM_FILTER` | ||||
|     ///      bloom filter. | ||||
|     function _isTokenPossiblyGreedy(IERC20TokenV06 token) | ||||
|         internal | ||||
|         view | ||||
|         returns (bool isPossiblyGreedy) | ||||
|     { | ||||
|         // The hash is given by: | ||||
|         // (1 << (keccak256(token) % 256)) | (1 << (token % 256)) | ||||
|         bytes32 h; | ||||
|         assembly { | ||||
|             mstore(0, token) | ||||
|             h := or(shl(mod(keccak256(0, 32), 256), 1), shl(mod(token, 256), 1)) | ||||
|         } | ||||
|         return (h & GREEDY_TOKENS_BLOOM_FILTER) == h; | ||||
|     } | ||||
|  | ||||
|     /// @dev Transfer tokens using the legacy allowance target instead of | ||||
|     ///      allowances directly set on the exchange proxy. | ||||
|     function _transferFromLegacyAllowanceTarget( | ||||
|         IERC20TokenV06 token, | ||||
|         address owner, | ||||
|         address to, | ||||
|         uint256 amount, | ||||
|         bytes memory initialRevertData | ||||
|     ) | ||||
|         private | ||||
|     { | ||||
|         // Try the old AllowanceTarget. | ||||
|         try ITokenSpenderFeature(address(this))._spendERC20Tokens( | ||||
|                 token, | ||||
|                 owner, | ||||
|                 to, | ||||
|                 amount | ||||
|             ) { | ||||
|         } catch (bytes memory revertData) { | ||||
|             // Bubble up the first error message. (In general, the fallback to the | ||||
|             // allowance target is opportunistic. We ignore the specific error | ||||
|             // message if it fails.) | ||||
|             LibSpenderRichErrors.SpenderERC20TransferFromFailedError( | ||||
|                 address(token), | ||||
|                 owner, | ||||
|                 to, | ||||
|                 amount, | ||||
|                 initialRevertData.length != 0 ? initialRevertData : revertData | ||||
|             ).rrevert(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -25,6 +25,7 @@ import "../features/TokenSpenderFeature.sol"; | ||||
| import "../features/TransformERC20Feature.sol"; | ||||
| import "../features/SignatureValidatorFeature.sol"; | ||||
| import "../features/MetaTransactionsFeature.sol"; | ||||
| import "../features/NativeOrdersFeature.sol"; | ||||
| import "../external/AllowanceTarget.sol"; | ||||
| import "./InitialMigration.sol"; | ||||
|  | ||||
| @@ -42,6 +43,7 @@ contract FullMigration { | ||||
|         TransformERC20Feature transformERC20; | ||||
|         SignatureValidatorFeature signatureValidator; | ||||
|         MetaTransactionsFeature metaTransactions; | ||||
|         NativeOrdersFeature nativeOrders; | ||||
|     } | ||||
|  | ||||
|     /// @dev Parameters needed to initialize features. | ||||
| @@ -84,7 +86,7 @@ contract FullMigration { | ||||
|     /// @param features Features to add to the proxy. | ||||
|     /// @return _zeroEx The configured ZeroEx contract. Same as the `zeroEx` parameter. | ||||
|     /// @param migrateOpts Parameters needed to initialize features. | ||||
|     function initializeZeroEx( | ||||
|     function migrateZeroEx( | ||||
|         address payable owner, | ||||
|         ZeroEx zeroEx, | ||||
|         Features memory features, | ||||
| @@ -195,5 +197,16 @@ contract FullMigration { | ||||
|                 address(this) | ||||
|             ); | ||||
|         } | ||||
|         // NativeOrdersFeature | ||||
|         { | ||||
|             // Register the feature. | ||||
|             ownable.migrate( | ||||
|                 address(features.nativeOrders), | ||||
|                 abi.encodeWithSelector( | ||||
|                     NativeOrdersFeature.migrate.selector | ||||
|                 ), | ||||
|                 address(this) | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user