Compare commits
	
		
			92 Commits
		
	
	
		
			@0x/contra
			...
			@0x/contra
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 2a6d66cc2a | ||
|  | b02992a373 | ||
|  | 92ad924965 | ||
|  | 138383e95c | ||
|  | 0487cb7d39 | ||
|  | 22e1ed35d3 | ||
|  | dabe6fd793 | ||
|  | 3cc639c8d0 | ||
|  | 22c8e0b6db | ||
|  | f3ca4293bc | ||
|  | db3e076d03 | ||
|  | 1a6759820a | ||
|  | 61c5e7b948 | ||
|  | 5fd78ef32f | ||
|  | 14ff9b827c | ||
|  | 598dc2cd71 | ||
|  | 08e1c5109f | ||
|  | 6f7a843742 | ||
|  | c9c9615bb5 | ||
|  | f98609686d | ||
|  | 5b8bbc34e8 | ||
|  | 49cb00a9ab | ||
|  | 74b240fb88 | ||
|  | 514f9d2621 | ||
|  | fa78d1092a | ||
|  | 297342092b | ||
|  | 076f263a86 | ||
|  | 0c56207abc | ||
|  | 23953d8a5a | ||
|  | c6919eb25a | ||
|  | d509604b52 | ||
|  | a74a3450eb | ||
|  | 72c5399b9d | ||
|  | b29196b983 | ||
|  | ce76a7033d | ||
|  | 3f4bb933d1 | ||
|  | 501b7b9b65 | ||
|  | c0ea88e864 | ||
|  | 48f8bea460 | ||
|  | f4e5b6e38d | ||
|  | 477cb0a48d | ||
|  | d6bc0a3368 | ||
|  | e544a804c2 | ||
|  | 96e0ad7899 | ||
|  | 5a1fee5d31 | ||
|  | 3557a5e5a9 | ||
|  | 0bd43d5265 | ||
|  | 8fd7c1b386 | ||
|  | 50068750f5 | ||
|  | a7a905de4c | ||
|  | f283108586 | ||
|  | 9afe05095a | ||
|  | 3dab892978 | ||
|  | e40ddb800e | ||
|  | 72a74e7c66 | ||
|  | e8ae64673f | ||
|  | 2451f419c8 | ||
|  | 2394eb62aa | ||
|  | f9078bb1c3 | ||
|  | bf25c81f1c | ||
|  | 03ecc530c3 | ||
|  | d52b1d24d0 | ||
|  | 5083fab06a | ||
|  | 1249bf9ccc | ||
|  | 681f6b3f07 | ||
|  | d3ca1fe96b | ||
|  | 9e4f5815e4 | ||
|  | c3c27eaedc | ||
|  | 4bf6a23d23 | ||
|  | aaaf0d02de | ||
|  | 825cc4d035 | ||
|  | c2d44e5c10 | ||
|  | 0efd0860c8 | ||
|  | a890a06664 | ||
|  | 5befb87071 | ||
|  | 12ba4c373a | ||
|  | 7fd25be02e | ||
|  | aa688c4a92 | ||
|  | fb437551c9 | ||
|  | 6fa1de7889 | ||
|  | 7a42df9a65 | ||
|  | 15a508f3ea | ||
|  | b3c20ff909 | ||
|  | 682c07cb73 | ||
|  | 602605ab4b | ||
|  | 0eff2548d5 | ||
|  | 93ee681204 | ||
|  | d7bea98075 | ||
|  | 437a3b048d | ||
|  | f55a9454b5 | ||
|  | 3b03ad0db4 | ||
|  | 27d679e1f1 | 
							
								
								
									
										7
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
								
							| @@ -7,6 +7,9 @@ on: | ||||
|               description: 'required CI status' | ||||
|               default: 'success' | ||||
|               required: true | ||||
|           prerelease: | ||||
|               description: 'prerelease name' | ||||
|               required: false | ||||
|  | ||||
| jobs: | ||||
|     publish: | ||||
| @@ -21,7 +24,7 @@ jobs: | ||||
|                   (echo "::error ::${{ github.ref }} does not have a successful CI status" && false) | ||||
|             - uses: actions/checkout@v2 | ||||
|               with: | ||||
|                 ref: 'development' | ||||
|                 ref: ${{ github.ref }} | ||||
|                 fetch-depth: 0 | ||||
|             - uses: actions/setup-node@v1 | ||||
|               with: | ||||
| @@ -41,7 +44,9 @@ jobs: | ||||
|               env: | ||||
|                   NPM_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} | ||||
|                   GITHUB_TOKEN: ${{ github.token }} | ||||
|                   PUBLISH_PRERELEASE: ${{ github.event.inputs.prerelease }} | ||||
|             - name: 'merge into main branch' | ||||
|               if: github.event.inputs.prerelease == '' # unless it's a prerelease | ||||
|               run: | | ||||
|                   git checkout main && \ | ||||
|                   git merge ${{ github.ref }} && \ | ||||
|   | ||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -113,6 +113,8 @@ contracts/dev-utils/generated-artifacts/ | ||||
| contracts/dev-utils/test/generated-artifacts/ | ||||
| contracts/zero-ex/generated-artifacts/ | ||||
| contracts/zero-ex/test/generated-artifacts/ | ||||
| contracts/treasury/generated-artifacts/ | ||||
| contracts/treasury/test/generated-artifacts/ | ||||
|  | ||||
| # generated truffle contract artifacts/ | ||||
| contracts/broker/build/ | ||||
| @@ -167,6 +169,8 @@ contracts/dev-utils/generated-wrappers/ | ||||
| contracts/dev-utils/test/generated-wrappers/ | ||||
| contracts/zero-ex/generated-wrappers/ | ||||
| contracts/zero-ex/test/generated-wrappers/ | ||||
| contracts/treasury/generated-wrappers/ | ||||
| contracts/treasury/test/generated-wrappers/ | ||||
|  | ||||
| # Doc README copy | ||||
| packages/*/docs/README.md | ||||
|   | ||||
| @@ -64,6 +64,10 @@ lib | ||||
| /contracts/zero-ex/test/generated-wrappers | ||||
| /contracts/zero-ex/generated-artifacts | ||||
| /contracts/zero-ex/test/generated-artifacts | ||||
| /contracts/treasury/generated-wrappers | ||||
| /contracts/treasury/test/generated-wrappers | ||||
| /contracts/treasury/generated-artifacts | ||||
| /contracts/treasury/test/generated-artifacts | ||||
| /contracts/staking/build/ | ||||
| /contracts/coordinator/build/ | ||||
| /contracts/exchange/build/ | ||||
|   | ||||
| @@ -13,7 +13,6 @@ | ||||
|         "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", | ||||
|   | ||||
| @@ -1,4 +1,86 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.7.8-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.7.7", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.7.6", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "3.7.5", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "3.7.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "3.7.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "3.7.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "3.7.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "3.7.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Fix Bancor support of ETH", | ||||
|                 "pr": 88 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1608105788 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "3.6.9", | ||||
|   | ||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.7.8-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.7 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.6 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.5 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.4 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.3 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.2 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.1 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.0 - _December 16, 2020_ | ||||
|  | ||||
|     * Fix Bancor support of ETH (#88) | ||||
|  | ||||
| ## v3.6.9 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -21,6 +21,7 @@ pragma solidity ^0.5.9; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; | ||||
| import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | ||||
| @@ -36,6 +37,20 @@ contract BancorBridge is | ||||
|     struct TransferState { | ||||
|         address bancorNetworkAddress; | ||||
|         address[] path; | ||||
|         IEtherToken weth; | ||||
|     } | ||||
|  | ||||
|     /// @dev Bancor ETH pseudo-address. | ||||
|     address constant public BANCOR_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||
|  | ||||
|     // solhint-disable no-empty-blocks | ||||
|     /// @dev Payable fallback to receive ETH from Bancor/WETH. | ||||
|     function () | ||||
|         external | ||||
|         payable | ||||
|     { | ||||
|         // Poor man's receive in 0.5.9 | ||||
|         require(msg.data.length == 0); | ||||
|     } | ||||
|  | ||||
|     /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of | ||||
| @@ -60,7 +75,6 @@ contract BancorBridge is | ||||
|     { | ||||
|         // hold variables to get around stack depth limitations | ||||
|         TransferState memory state; | ||||
|  | ||||
|         // Decode the bridge data. | ||||
|         ( | ||||
|             state.path, | ||||
| @@ -68,34 +82,42 @@ contract BancorBridge is | ||||
|         // solhint-disable indent | ||||
|         ) = abi.decode(bridgeData, (address[], address)); | ||||
|         // solhint-enable indent | ||||
|         state.weth = IEtherToken(_getWethAddress()); | ||||
|  | ||||
|         require(state.path.length > 0, "BancorBridge/PATH_MUST_EXIST"); | ||||
|         // Just transfer the tokens if they're the same. | ||||
|         if (state.path[0] == toTokenAddress) { | ||||
|             LibERC20Token.transfer(state.path[0], to, amount); | ||||
|             return BRIDGE_SUCCESS; | ||||
|         require(state.path.length >= 2, "BancorBridge/PATH_LENGTH_MUST_BE_GREATER_THAN_TWO"); | ||||
|  | ||||
|         // Grant an allowance to the Bancor Network to spend `fromTokenAddress` token. | ||||
|         uint256 fromTokenBalance; | ||||
|         uint256 payableAmount = 0; | ||||
|         // If it's ETH in the path then withdraw from WETH | ||||
|         // The Bancor path will have ETH as the 0xeee address | ||||
|         // Bancor expects to be paid in ETH not WETH | ||||
|         if (state.path[0] == BANCOR_ETH_ADDRESS) { | ||||
|             fromTokenBalance = state.weth.balanceOf(address(this)); | ||||
|             state.weth.withdraw(fromTokenBalance); | ||||
|             payableAmount = fromTokenBalance; | ||||
|         } else { | ||||
|             fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this)); | ||||
|             LibERC20Token.approveIfBelow(state.path[0], state.bancorNetworkAddress, fromTokenBalance); | ||||
|         } | ||||
|  | ||||
|         // Otherwise use Bancor to convert | ||||
|         require(state.path.length > 2, "BancorBridge/PATH_LENGTH_MUST_BE_GREATER_THAN_TWO"); | ||||
|         require(state.path[state.path.length - 1] == toTokenAddress, "BancorBridge/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN"); | ||||
|          | ||||
|         // // Grant an allowance to the Bancor Network to spend `fromTokenAddress` token. | ||||
|         uint256 fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this)); | ||||
|         LibERC20Token.approveIfBelow(state.path[0], state.bancorNetworkAddress, fromTokenBalance); | ||||
|  | ||||
|         // Convert the tokens | ||||
|         uint256 boughtAmount = IBancorNetwork(state.bancorNetworkAddress).convertByPath( | ||||
|         uint256 boughtAmount = IBancorNetwork(state.bancorNetworkAddress).convertByPath.value(payableAmount)( | ||||
|             state.path, // path originating with source token and terminating in destination token | ||||
|             fromTokenBalance, // amount of source token to trade | ||||
|             amount, // minimum amount of destination token expected to receive | ||||
|             to, // beneficiary | ||||
|             state.path[state.path.length-1] == BANCOR_ETH_ADDRESS ? address(this) : to, // beneficiary | ||||
|             address(0), // affiliateAccount; no fee paid | ||||
|             0 // affiliateFee; no fee paid | ||||
|         ); | ||||
|  | ||||
|         if (state.path[state.path.length-1] == BANCOR_ETH_ADDRESS) { | ||||
|             state.weth.deposit.value(boughtAmount)(); | ||||
|             state.weth.transfer(to, boughtAmount); | ||||
|         } | ||||
|  | ||||
|         emit ERC20BridgeTransfer( | ||||
|             state.path[0], // fromTokenAddress | ||||
|             state.path[0] == BANCOR_ETH_ADDRESS ? address(state.weth) : state.path[0], | ||||
|             toTokenAddress, | ||||
|             fromTokenBalance, | ||||
|             boughtAmount, | ||||
|   | ||||
| @@ -56,11 +56,14 @@ contract KyberBridge is | ||||
|     uint256 constant private KYBER_RATE_BASE = 10 ** 18; | ||||
|  | ||||
|     // solhint-disable no-empty-blocks | ||||
|     /// @dev Payable fallback to receive ETH from Kyber. | ||||
|     /// @dev Payable fallback to receive ETH from Kyber/WETH. | ||||
|     function () | ||||
|         external | ||||
|         payable | ||||
|     {} | ||||
|     { | ||||
|         // Poor man's receive in 0.5.9 | ||||
|         require(msg.data.length == 0); | ||||
|     } | ||||
|  | ||||
|     /// @dev Callback for `IKyberBridge`. Tries to buy `amount` of | ||||
|     ///      `toTokenAddress` tokens by selling the entirety of the opposing asset | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-asset-proxy", | ||||
|     "version": "3.6.9", | ||||
|     "version": "3.7.8-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -51,13 +51,13 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contract-wrappers": "^13.11.0", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contract-wrappers": "^13.14.0-multiplex", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
| @@ -79,16 +79,16 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/contracts-erc1155": "^2.1.18", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-erc721": "^3.1.18", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.18", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-erc1155": "^2.1.26-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-erc721": "^3.1.26-multiplex.0", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.26-multiplex.0", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|   | ||||
| @@ -12,13 +12,11 @@ import { DecodedLogs } from 'ethereum-types'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
|  | ||||
| import { TestBancorBridgeContract } from './generated-wrappers/test_bancor_bridge'; | ||||
| import { | ||||
|     TestBancorBridgeConvertByPathInputEventArgs as ConvertByPathArgs, | ||||
|     TestBancorBridgeEvents as ContractEvents, | ||||
|     TestBancorBridgeTokenApproveEventArgs as TokenApproveArgs, | ||||
|     TestBancorBridgeTokenTransferEventArgs as TokenTransferArgs, | ||||
| } from './wrappers'; | ||||
|  | ||||
| blockchainTests.resets('Bancor unit tests', env => { | ||||
| @@ -128,24 +126,6 @@ blockchainTests.resets('Bancor unit tests', env => { | ||||
|             expect(result).to.eq(AssetProxyId.ERC20Bridge); | ||||
|         }); | ||||
|  | ||||
|         it('performs transfer when both tokens are the same', async () => { | ||||
|             const createTokenFn = testContract.createToken(constants.NULL_ADDRESS); | ||||
|             const tokenAddress = await createTokenFn.callAsync(); | ||||
|             await createTokenFn.awaitTransactionSuccessAsync(); | ||||
|  | ||||
|             const { opts, result, logs } = await transferFromAsync({ | ||||
|                 tokenAddressesPath: [tokenAddress, tokenAddress], | ||||
|             }); | ||||
|             expect(result).to.eq(AssetProxyId.ERC20Bridge, 'asset proxy id'); | ||||
|             const transfers = filterLogsToArguments<TokenTransferArgs>(logs, ContractEvents.TokenTransfer); | ||||
|  | ||||
|             expect(transfers.length).to.eq(1); | ||||
|             expect(transfers[0].token).to.eq(tokenAddress, 'input token address'); | ||||
|             expect(transfers[0].from).to.eq(testContract.address); | ||||
|             expect(transfers[0].to).to.eq(opts.toAddress, 'recipient address'); | ||||
|             expect(transfers[0].amount).to.bignumber.eq(opts.amount, 'amount'); | ||||
|         }); | ||||
|  | ||||
|         describe('token -> token', async () => { | ||||
|             it('calls BancorNetwork.convertByPath()', async () => { | ||||
|                 const { opts, result, logs } = await transferFromAsync(); | ||||
|   | ||||
| @@ -1,4 +1,85 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "1.1.26-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "1.1.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "1.1.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "1.1.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "1.1.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "1.1.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "1.1.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "1.1.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608105788, | ||||
|         "version": "1.1.18", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "1.1.17", | ||||
|   | ||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.1.26-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.25 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.24 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.23 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.22 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.21 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.20 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.19 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.18 - _December 16, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.17 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-broker", | ||||
|     "version": "1.1.17", | ||||
|     "version": "1.1.26-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -51,20 +51,20 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.9", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-erc721": "^3.1.18", | ||||
|         "@0x/contracts-exchange": "^3.2.18", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.18", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-erc721": "^3.1.26-multiplex.0", | ||||
|         "@0x/contracts-exchange": "^3.2.27-multiplex.0", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.26-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -84,10 +84,10 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,85 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.1.27-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.1.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.1.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "3.1.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "3.1.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "3.1.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "3.1.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "3.1.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608105788, | ||||
|         "version": "3.1.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "3.1.18", | ||||
|   | ||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.1.27-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.26 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.25 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.24 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.23 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.22 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.21 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.20 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.19 - _December 16, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.18 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-coordinator", | ||||
|     "version": "3.1.18", | ||||
|     "version": "3.1.27-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,17 +52,17 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.9", | ||||
|         "@0x/contracts-dev-utils": "^1.3.16", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-dev-utils": "^1.3.25-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -82,16 +82,16 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.19", | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/contract-addresses": "^5.6.0", | ||||
|         "@0x/contracts-exchange": "^3.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/json-schemas": "^5.3.4", | ||||
|         "@0x/assert": "^3.0.21", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contract-addresses": "^5.11.0", | ||||
|         "@0x/contracts-exchange": "^3.2.27-multiplex.0", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/json-schemas": "^5.4.1", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "http-status-codes": "^1.3.2" | ||||
|     }, | ||||
|   | ||||
| @@ -1,4 +1,85 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "1.3.25-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "1.3.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "1.3.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "1.3.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "1.3.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "1.3.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "1.3.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "1.3.18", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608105788, | ||||
|         "version": "1.3.17", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "1.3.16", | ||||
|   | ||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.3.25-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.24 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.23 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.22 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.21 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.20 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.19 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.18 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.17 - _December 16, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.16 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-dev-utils", | ||||
|     "version": "1.3.16", | ||||
|     "version": "1.3.25-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -41,17 +41,17 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/dev-utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/assert": "^3.0.19", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.9", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/assert": "^3.0.21", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethers": "~4.0.4", | ||||
|         "npm-run-all": "^4.1.2", | ||||
| @@ -63,7 +63,7 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@types/node": "12.12.54" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,76 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "2.1.26-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "2.1.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "2.1.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "2.1.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "2.1.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "2.1.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "2.1.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "2.1.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "2.1.18", | ||||
|   | ||||
| @@ -5,6 +5,38 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v2.1.26-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.25 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.24 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.23 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.22 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.21 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.20 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.19 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.18 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc1155", | ||||
|     "version": "2.1.18", | ||||
|     "version": "2.1.26-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,11 +52,11 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
| @@ -80,10 +80,10 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,81 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.3.5-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.3.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.3.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "3.3.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "3.3.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "3.3.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add SPDX license identifiers to solidity files", | ||||
|                 "pr": 105 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Allow for excess return data in `LibERC20TokenV06` compat* functions", | ||||
|                 "pr": 97 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1609802516 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "3.2.14", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "3.2.13", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "3.2.12", | ||||
|   | ||||
| @@ -5,6 +5,39 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.3.5-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.4 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.3 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.2 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.1 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.0 - _January 4, 2021_ | ||||
|  | ||||
|     * Add SPDX license identifiers to solidity files (#105) | ||||
|     * Allow for excess return data in `LibERC20TokenV06` compat* functions (#97) | ||||
|  | ||||
| ## v3.2.14 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.13 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.12 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
| @@ -118,7 +119,7 @@ library LibERC20TokenV06 { | ||||
|     { | ||||
|         tokenDecimals = 18; | ||||
|         (bool didSucceed, bytes memory resultData) = address(token).staticcall(DECIMALS_CALL_DATA); | ||||
|         if (didSucceed && resultData.length == 32) { | ||||
|         if (didSucceed && resultData.length >= 32) { | ||||
|             tokenDecimals = uint8(LibBytesV06.readUint256(resultData, 0)); | ||||
|         } | ||||
|     } | ||||
| @@ -141,7 +142,7 @@ library LibERC20TokenV06 { | ||||
|                 spender | ||||
|             ) | ||||
|         ); | ||||
|         if (didSucceed && resultData.length == 32) { | ||||
|         if (didSucceed && resultData.length >= 32) { | ||||
|             allowance_ = LibBytesV06.readUint256(resultData, 0); | ||||
|         } | ||||
|     } | ||||
| @@ -162,7 +163,7 @@ library LibERC20TokenV06 { | ||||
|                 owner | ||||
|             ) | ||||
|         ); | ||||
|         if (didSucceed && resultData.length == 32) { | ||||
|         if (didSucceed && resultData.length >= 32) { | ||||
|             balance = LibBytesV06.readUint256(resultData, 0); | ||||
|         } | ||||
|     } | ||||
| @@ -180,7 +181,7 @@ library LibERC20TokenV06 { | ||||
|         if (resultData.length == 0) { | ||||
|             return true; | ||||
|         } | ||||
|         if (resultData.length == 32) { | ||||
|         if (resultData.length >= 32) { | ||||
|             uint256 result = LibBytesV06.readUint256(resultData, 0); | ||||
|             if (result == 1) { | ||||
|                 return true; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc20", | ||||
|     "version": "3.2.12", | ||||
|     "version": "3.3.5-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -51,18 +51,18 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -82,7 +82,7 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14" | ||||
|         "@0x/base-contract": "^6.2.18" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -6,6 +6,7 @@ export { | ||||
|     WETH9Events, | ||||
|     WETH9DepositEventArgs, | ||||
|     WETH9TransferEventArgs, | ||||
|     WETH9WithdrawalEventArgs, | ||||
|     ZRXTokenContract, | ||||
|     DummyERC20TokenTransferEventArgs, | ||||
|     ERC20TokenEventArgs, | ||||
|   | ||||
| @@ -1,4 +1,76 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.1.26-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.1.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.1.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "3.1.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "3.1.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "3.1.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "3.1.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "3.1.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "3.1.18", | ||||
|   | ||||
| @@ -5,6 +5,38 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.1.26-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.25 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.24 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.23 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.22 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.21 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.20 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.19 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.18 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc721", | ||||
|     "version": "3.1.18", | ||||
|     "version": "3.1.26-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,18 +52,18 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -84,7 +84,7 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14" | ||||
|         "@0x/base-contract": "^6.2.18" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,4 +1,85 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "4.2.27-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "4.2.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "4.2.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "4.2.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "4.2.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "4.2.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "4.2.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "4.2.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608105788, | ||||
|         "version": "4.2.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "4.2.18", | ||||
|   | ||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.2.27-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.26 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.25 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.24 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.23 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.22 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.21 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.20 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.19 - _December 16, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.18 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange-forwarder", | ||||
|     "version": "4.2.18", | ||||
|     "version": "4.2.27-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,25 +52,25 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.9", | ||||
|         "@0x/contracts-dev-utils": "^1.3.16", | ||||
|         "@0x/contracts-erc1155": "^2.1.18", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-erc721": "^3.1.18", | ||||
|         "@0x/contracts-exchange": "^3.2.18", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.18", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-dev-utils": "^1.3.25-multiplex.0", | ||||
|         "@0x/contracts-erc1155": "^2.1.26-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-erc721": "^3.1.26-multiplex.0", | ||||
|         "@0x/contracts-exchange": "^3.2.27-multiplex.0", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.26-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -90,7 +90,7 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|   | ||||
| @@ -1,4 +1,76 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "4.3.26-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "4.3.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "4.3.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "4.3.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "4.3.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "4.3.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "4.3.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "4.3.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "4.3.18", | ||||
|   | ||||
| @@ -5,6 +5,38 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.3.26-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.25 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.24 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.23 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.22 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.21 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.20 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.19 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.18 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange-libs", | ||||
|     "version": "4.3.18", | ||||
|     "version": "4.3.26-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,14 +52,14 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/libs", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/subproviders": "^6.2.3", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/subproviders": "^6.4.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -80,13 +80,13 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,85 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.2.27-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "3.2.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "3.2.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "3.2.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "3.2.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "3.2.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "3.2.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "3.2.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608105788, | ||||
|         "version": "3.2.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "3.2.18", | ||||
|   | ||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.2.27-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.26 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.25 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.24 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.23 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.22 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.21 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.20 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.19 - _December 16, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.18 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange", | ||||
|     "version": "3.2.18", | ||||
|     "version": "3.2.27-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,21 +52,21 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.9", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.18", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-multisig": "^4.1.18", | ||||
|         "@0x/contracts-staking": "^2.0.25", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.26-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-multisig": "^4.1.27-multiplex.0", | ||||
|         "@0x/contracts-staking": "^2.0.34-multiplex.0", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -88,13 +88,13 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/contracts-dev-utils": "^1.3.16", | ||||
|         "@0x/contracts-erc1155": "^2.1.18", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-erc721": "^3.1.18", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-dev-utils": "^1.3.25-multiplex.0", | ||||
|         "@0x/contracts-erc1155": "^2.1.26-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-erc721": "^3.1.26-multiplex.0", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,85 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "6.2.21-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "6.2.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "6.2.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "6.2.18", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "6.2.17", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "6.2.16", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "6.2.15", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "6.2.14", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608105788, | ||||
|         "version": "6.2.13", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "6.2.12", | ||||
|   | ||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v6.2.21-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.20 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.19 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.18 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.17 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.16 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.15 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.14 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.13 - _December 16, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.12 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-extensions", | ||||
|     "version": "6.2.12", | ||||
|     "version": "6.2.21-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,23 +52,23 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.9", | ||||
|         "@0x/contracts-dev-utils": "^1.3.16", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-erc721": "^3.1.18", | ||||
|         "@0x/contracts-exchange": "^3.2.18", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.18", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-dev-utils": "^1.3.25-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-erc721": "^3.1.26-multiplex.0", | ||||
|         "@0x/contracts-exchange": "^3.2.27-multiplex.0", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.26-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -90,8 +90,8 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-integrations", | ||||
|     "version": "2.7.15", | ||||
|     "version": "2.7.29-multiplex.0", | ||||
|     "private": true, | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
| @@ -52,25 +52,25 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/extensions", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contract-addresses": "^5.6.0", | ||||
|         "@0x/contract-wrappers": "^13.11.0", | ||||
|         "@0x/contracts-broker": "^1.1.17", | ||||
|         "@0x/contracts-coordinator": "^3.1.18", | ||||
|         "@0x/contracts-dev-utils": "^1.3.16", | ||||
|         "@0x/contracts-exchange-forwarder": "^4.2.18", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.18", | ||||
|         "@0x/contracts-extensions": "^6.2.12", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contract-addresses": "^5.11.0", | ||||
|         "@0x/contract-wrappers": "^13.14.0-multiplex", | ||||
|         "@0x/contracts-broker": "^1.1.26-multiplex.0", | ||||
|         "@0x/contracts-coordinator": "^3.1.27-multiplex.0", | ||||
|         "@0x/contracts-dev-utils": "^1.3.25-multiplex.0", | ||||
|         "@0x/contracts-exchange-forwarder": "^4.2.27-multiplex.0", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.26-multiplex.0", | ||||
|         "@0x/contracts-extensions": "^6.2.21-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/coordinator-server": "^1.0.5", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/migrations": "^6.5.4", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/protocol-utils": "^1.0.1", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/migrations": "^7.0.1-multiplex.0", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/protocol-utils": "^1.3.1-multiplex.0", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@azure/core-asynciterator-polyfill": "^1.0.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -93,21 +93,21 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/asset-swapper": "^5.4.2", | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.9", | ||||
|         "@0x/contracts-erc1155": "^2.1.18", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-erc721": "^3.1.18", | ||||
|         "@0x/contracts-exchange": "^3.2.18", | ||||
|         "@0x/contracts-multisig": "^4.1.18", | ||||
|         "@0x/contracts-staking": "^2.0.25", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-zero-ex": "^0.12.0", | ||||
|         "@0x/subproviders": "^6.2.3", | ||||
|         "@0x/asset-swapper": "^6.3.0-multiplex", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-erc1155": "^2.1.26-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-erc721": "^3.1.26-multiplex.0", | ||||
|         "@0x/contracts-exchange": "^3.2.27-multiplex.0", | ||||
|         "@0x/contracts-multisig": "^4.1.27-multiplex.0", | ||||
|         "@0x/contracts-staking": "^2.0.34-multiplex.0", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-zero-ex": "^0.20.0-multiplex", | ||||
|         "@0x/subproviders": "^6.4.1", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^6.2.0", | ||||
|         "lodash": "^4.17.11" | ||||
|   | ||||
| @@ -1,239 +0,0 @@ | ||||
| import { MarketBuySwapQuote, MarketSellSwapQuote, Orderbook, SwapQuoter } from '@0x/asset-swapper'; | ||||
| import { blockchainTests, expect, Numberish } from '@0x/contracts-test-utils'; | ||||
| import { assetDataUtils } from '@0x/order-utils'; | ||||
| import { FillResults, SignedOrder } from '@0x/types'; | ||||
| import { BigNumber, logUtils } from '@0x/utils'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { TestMainnetAggregatorFillsContract } from '../wrappers'; | ||||
|  | ||||
| import { tokens } from './tokens'; | ||||
|  | ||||
| blockchainTests.live('Aggregator Mainnet Tests', env => { | ||||
|     // Mainnet address of the `TestMainnetAggregatorFills` contract. | ||||
|     const TEST_CONTRACT_ADDRESS = '0x37Ca306F42748b7fe105F89FCBb2CD03D27c8146'; | ||||
|     const TAKER_ADDRESS = '0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B'; // Vitalik | ||||
|     const ORDERBOOK_POLLING_MS = 1000; | ||||
|     const GAS_PRICE = new BigNumber(1); | ||||
|     const TAKER_ASSET_ETH_VALUE = 500e18; | ||||
|     const MIN_BALANCE = 500.1e18; | ||||
|     const SYMBOLS = ['ETH', 'DAI', 'USDC', 'FOAM']; | ||||
|     const TEST_PAIRS = _.flatten(SYMBOLS.map(m => SYMBOLS.filter(t => t !== m).map(t => [m, t]))); | ||||
|     const FILL_VALUES = [1, 10, 1e2, 1e3, 1e4, 2.5e4, 5e4]; | ||||
|  | ||||
|     let testContract: TestMainnetAggregatorFillsContract; | ||||
|     let swapQuoter: SwapQuoter; | ||||
|     let takerEthBalance: BigNumber; | ||||
|     const orderbooks: { [name: string]: Orderbook } = {}; | ||||
|  | ||||
|     async function getTakerOrdersAsync(takerAssetSymbol: string): Promise<SignedOrder[]> { | ||||
|         if (takerAssetSymbol === 'ETH') { | ||||
|             return []; | ||||
|         } | ||||
|         return getOrdersAsync(takerAssetSymbol, 'ETH'); | ||||
|     } | ||||
|  | ||||
|     // Fetches ETH -> taker asset orders for the forwarder contract. | ||||
|     async function getOrdersAsync(makerAssetSymbol: string, takerAssetSymbol: string): Promise<SignedOrder[]> { | ||||
|         const takerTokenAddress = tokens[takerAssetSymbol].address; | ||||
|         const makerTokenAddress = tokens[makerAssetSymbol].address; | ||||
|         const makerAssetData = assetDataUtils.encodeERC20AssetData(makerTokenAddress); | ||||
|         const takerAssetData = assetDataUtils.encodeERC20AssetData(takerTokenAddress); | ||||
|         const orders = _.flatten( | ||||
|             await Promise.all( | ||||
|                 Object.keys(orderbooks).map(async name => | ||||
|                     getOrdersFromOrderBookAsync(name, makerAssetData, takerAssetData), | ||||
|                 ), | ||||
|             ), | ||||
|         ); | ||||
|         const uniqueOrders: SignedOrder[] = []; | ||||
|         for (const order of orders) { | ||||
|             if (!order.makerFee.eq(0) || !order.takerFee.eq(0)) { | ||||
|                 continue; | ||||
|             } | ||||
|             if (uniqueOrders.findIndex(o => isSameOrder(order, o)) === -1) { | ||||
|                 uniqueOrders.push(order); | ||||
|             } | ||||
|         } | ||||
|         return uniqueOrders; | ||||
|     } | ||||
|  | ||||
|     async function getOrdersFromOrderBookAsync( | ||||
|         name: string, | ||||
|         makerAssetData: string, | ||||
|         takerAssetData: string, | ||||
|     ): Promise<SignedOrder[]> { | ||||
|         try { | ||||
|             return (await orderbooks[name].getOrdersAsync(makerAssetData, takerAssetData)).map(r => r.order); | ||||
|         } catch (err) { | ||||
|             logUtils.warn(`Failed to retrieve orders from orderbook "${name}".`); | ||||
|         } | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     function isSameOrder(a: SignedOrder, b: SignedOrder): boolean { | ||||
|         for (const [k, v] of Object.entries(a)) { | ||||
|             if (k in (b as any)) { | ||||
|                 if (BigNumber.isBigNumber(v) && !v.eq((b as any)[k])) { | ||||
|                     return false; | ||||
|                 } | ||||
|                 if (v !== (b as any)[k]) { | ||||
|                     return false; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     function toTokenUnits(symbol: string, weis: Numberish): BigNumber { | ||||
|         return new BigNumber(weis).div(new BigNumber(10).pow(tokens[symbol].decimals)); | ||||
|     } | ||||
|  | ||||
|     function fromTokenUnits(symbol: string, units: Numberish): BigNumber { | ||||
|         return new BigNumber(units) | ||||
|             .times(new BigNumber(10).pow(tokens[symbol].decimals)) | ||||
|             .integerValue(BigNumber.ROUND_DOWN); | ||||
|     } | ||||
|  | ||||
|     interface MarketOperationResult { | ||||
|         makerAssetBalanceBefore: BigNumber; | ||||
|         takerAssetBalanceBefore: BigNumber; | ||||
|         makerAssetBalanceAfter: BigNumber; | ||||
|         takerAssetBalanceAfter: BigNumber; | ||||
|         fillResults: FillResults; | ||||
|     } | ||||
|  | ||||
|     // Liquidity is low right now so it's possible we didn't have | ||||
|     // enough taker assets to cover the orders, so occasionally we'll get incomplete | ||||
|     // fills. This function will catch those cases. | ||||
|     // TODO(dorothy-zbornak): Remove this special case when liquidity is up. | ||||
|     function checkHadEnoughTakerAsset( | ||||
|         quote: MarketBuySwapQuote | MarketSellSwapQuote, | ||||
|         result: MarketOperationResult, | ||||
|     ): boolean { | ||||
|         if (result.takerAssetBalanceBefore.gte(quote.worstCaseQuoteInfo.takerAssetAmount)) { | ||||
|             return true; | ||||
|         } | ||||
|         const takerAssetPct = result.takerAssetBalanceBefore | ||||
|             .div(quote.worstCaseQuoteInfo.takerAssetAmount) | ||||
|             .times(100) | ||||
|             .toNumber() | ||||
|             .toFixed(1); | ||||
|         logUtils.warn(`Could not acquire enough taker asset to complete the fill: ${takerAssetPct}%`); | ||||
|         expect(result.fillResults.makerAssetFilledAmount).to.bignumber.lt(quote.worstCaseQuoteInfo.makerAssetAmount); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     before(async () => { | ||||
|         testContract = new TestMainnetAggregatorFillsContract(TEST_CONTRACT_ADDRESS, env.provider, { | ||||
|             ...env.txDefaults, | ||||
|             gasPrice: GAS_PRICE, | ||||
|             gas: 10e6, | ||||
|         }); | ||||
|         swapQuoter = SwapQuoter.getSwapQuoterForStandardRelayerAPIUrl(env.provider, 'https://api.0x.org/sra'); | ||||
|         // Pool orderbooks because we're desperate for liquidity. | ||||
|         orderbooks.swapQuoter = swapQuoter.orderbook; | ||||
|         orderbooks.bamboo = Orderbook.getOrderbookForPollingProvider({ | ||||
|             httpEndpoint: 'https://sra.bamboorelay.com/0x/v3', | ||||
|             pollingIntervalMs: ORDERBOOK_POLLING_MS, | ||||
|         }); | ||||
|         // TODO(dorothy-zbornak): Uncomment when radar's SRA is up. | ||||
|         // orderbooks.radar = Orderbook.getOrderbookForPollingProvider({ | ||||
|         //     httpEndpoint: 'https://api-v3.radarrelay.com/v3', | ||||
|         //     pollingIntervalMs: ORDERBOOK_POLLING_MS, | ||||
|         // }); | ||||
|         takerEthBalance = await env.web3Wrapper.getBalanceInWeiAsync(TAKER_ADDRESS); | ||||
|     }); | ||||
|  | ||||
|     it('taker has minimum ETH', async () => { | ||||
|         expect(takerEthBalance).to.bignumber.gte(MIN_BALANCE); | ||||
|     }); | ||||
|  | ||||
|     describe('market sells', () => { | ||||
|         for (const [makerSymbol, takerSymbol] of TEST_PAIRS) { | ||||
|             for (const fillValue of FILL_VALUES) { | ||||
|                 const fillAmount = fromTokenUnits(takerSymbol, new BigNumber(fillValue).div(tokens[takerSymbol].price)); | ||||
|                 it(`sell ${toTokenUnits(takerSymbol, fillAmount)} ${takerSymbol} for ${makerSymbol}`, async () => { | ||||
|                     const [quote, takerOrders] = await Promise.all([ | ||||
|                         swapQuoter.getMarketSellSwapQuoteAsync( | ||||
|                             tokens[makerSymbol].address, | ||||
|                             tokens[takerSymbol].address, | ||||
|                             fillAmount, | ||||
|                             { gasPrice: GAS_PRICE }, | ||||
|                         ), | ||||
|                         getTakerOrdersAsync(takerSymbol), | ||||
|                     ]); | ||||
|                     // Buy taker assets from `takerOrders` and and perform a | ||||
|                     // market sell on the bridge orders. | ||||
|                     const fill = await testContract | ||||
|                         .marketSell( | ||||
|                             tokens[makerSymbol].address, | ||||
|                             tokens[takerSymbol].address, | ||||
|                             quote.orders, | ||||
|                             takerOrders, | ||||
|                             quote.orders.map(o => o.signature), | ||||
|                             takerOrders.map(o => o.signature), | ||||
|                             quote.takerAssetFillAmount, | ||||
|                         ) | ||||
|                         .callAsync({ | ||||
|                             value: quote.worstCaseQuoteInfo.protocolFeeInWeiAmount.plus(TAKER_ASSET_ETH_VALUE), | ||||
|                             from: TAKER_ADDRESS, | ||||
|                             gasPrice: quote.gasPrice, | ||||
|                         }); | ||||
|                     if (checkHadEnoughTakerAsset(quote, fill)) { | ||||
|                         expect(fill.fillResults.makerAssetFilledAmount, 'makerAssetFilledAmount').to.bignumber.gte( | ||||
|                             quote.worstCaseQuoteInfo.makerAssetAmount, | ||||
|                         ); | ||||
|                         expect(fill.fillResults.takerAssetFilledAmount, 'takerAssetFilledAmount').to.bignumber.lte( | ||||
|                             quote.takerAssetFillAmount, | ||||
|                         ); | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     describe('market buys', () => { | ||||
|         for (const [makerSymbol, takerSymbol] of TEST_PAIRS) { | ||||
|             for (const fillValue of FILL_VALUES) { | ||||
|                 const fillAmount = fromTokenUnits(makerSymbol, new BigNumber(fillValue).div(tokens[makerSymbol].price)); | ||||
|                 it(`buy ${toTokenUnits(makerSymbol, fillAmount)} ${makerSymbol} with ${takerSymbol}`, async () => { | ||||
|                     const [quote, takerOrders] = await Promise.all([ | ||||
|                         swapQuoter.getMarketBuySwapQuoteAsync( | ||||
|                             tokens[makerSymbol].address, | ||||
|                             tokens[takerSymbol].address, | ||||
|                             fillAmount, | ||||
|                             { gasPrice: GAS_PRICE }, | ||||
|                         ), | ||||
|                         getTakerOrdersAsync(takerSymbol), | ||||
|                     ]); | ||||
|                     // Buy taker assets from `takerOrders` and and perform a | ||||
|                     // market buy on the bridge orders. | ||||
|                     const fill = await testContract | ||||
|                         .marketBuy( | ||||
|                             tokens[makerSymbol].address, | ||||
|                             tokens[takerSymbol].address, | ||||
|                             quote.orders, | ||||
|                             takerOrders, | ||||
|                             quote.orders.map(o => o.signature), | ||||
|                             takerOrders.map(o => o.signature), | ||||
|                             quote.makerAssetFillAmount, | ||||
|                         ) | ||||
|                         .callAsync({ | ||||
|                             value: quote.worstCaseQuoteInfo.protocolFeeInWeiAmount.plus(TAKER_ASSET_ETH_VALUE), | ||||
|                             from: TAKER_ADDRESS, | ||||
|                             gasPrice: quote.gasPrice, | ||||
|                         }); | ||||
|                     if (checkHadEnoughTakerAsset(quote, fill)) { | ||||
|                         expect(fill.fillResults.takerAssetFilledAmount, 'takerAssetFilledAmount').to.bignumber.lte( | ||||
|                             quote.worstCaseQuoteInfo.takerAssetAmount, | ||||
|                         ); | ||||
|                         expect(fill.fillResults.makerAssetFilledAmount, 'makerAssetFilledAmount').to.bignumber.gte( | ||||
|                             quote.makerAssetFillAmount, | ||||
|                         ); | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
| @@ -1,77 +0,0 @@ | ||||
| export const tokens: { [symbol: string]: { address: string; decimals: number; price: number } } = { | ||||
|     ETH: { | ||||
|         address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', | ||||
|         decimals: 18, | ||||
|         price: 133, | ||||
|     }, | ||||
|     SAI: { | ||||
|         address: '0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359', | ||||
|         decimals: 18, | ||||
|         price: 1, | ||||
|     }, | ||||
|     DAI: { | ||||
|         address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', | ||||
|         decimals: 18, | ||||
|         price: 1, | ||||
|     }, | ||||
|     USDC: { | ||||
|         address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', | ||||
|         decimals: 6, | ||||
|         price: 1, | ||||
|     }, | ||||
|     WBTC: { | ||||
|         address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', | ||||
|         decimals: 8, | ||||
|         price: 6900, | ||||
|     }, | ||||
|     MKR: { | ||||
|         address: '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2', | ||||
|         decimals: 18, | ||||
|         price: 454, | ||||
|     }, | ||||
|     BAT: { | ||||
|         address: '0x0D8775F648430679A709E98d2b0Cb6250d2887EF', | ||||
|         decimals: 18, | ||||
|         price: 0.17, | ||||
|     }, | ||||
|     OMG: { | ||||
|         address: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', | ||||
|         decimals: 18, | ||||
|         price: 0.65, | ||||
|     }, | ||||
|     ZRX: { | ||||
|         address: '0xE41d2489571d322189246DaFA5ebDe1F4699F498', | ||||
|         decimals: 18, | ||||
|         price: 0.19, | ||||
|     }, | ||||
|     ZIL: { | ||||
|         address: '0x05f4a42e251f2d52b8ed15E9FEdAacFcEF1FAD27', | ||||
|         decimals: 12, | ||||
|         price: 0.004, | ||||
|     }, | ||||
|     FOAM: { | ||||
|         address: '0x4946Fcea7C692606e8908002e55A582af44AC121', | ||||
|         decimals: 18, | ||||
|         price: 0.004, | ||||
|     }, | ||||
|     USDT: { | ||||
|         address: '0xdAC17F958D2ee523a2206206994597C13D831ec7', | ||||
|         decimals: 6, | ||||
|         price: 0.019, | ||||
|     }, | ||||
|     REP: { | ||||
|         address: '0x1985365e9f78359a9B6AD760e32412f4a445E862', | ||||
|         decimals: 18, | ||||
|         price: 8.9, | ||||
|     }, | ||||
|     MANA: { | ||||
|         address: '0x0F5D2fB29fb7d3CFeE444a200298f468908cC942', | ||||
|         decimals: 18, | ||||
|         price: 0.025, | ||||
|     }, | ||||
|     LINK: { | ||||
|         address: '0x514910771AF9Ca656af840dff83E8264EcF986CA', | ||||
|         decimals: 18, | ||||
|         price: 1.8, | ||||
|     }, | ||||
| }; | ||||
| @@ -1,360 +0,0 @@ | ||||
| import { ContractAddresses } from '@0x/contract-addresses'; | ||||
| import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contracts-erc20'; | ||||
| import { IExchangeContract } from '@0x/contracts-exchange'; | ||||
| import { blockchainTests, constants, expect, getRandomPortion, verifyEventsFromLogs } from '@0x/contracts-test-utils'; | ||||
| import { | ||||
|     artifacts as exchangeProxyArtifacts, | ||||
|     IZeroExContract, | ||||
|     LogMetadataTransformerContract, | ||||
| } from '@0x/contracts-zero-ex'; | ||||
| import { migrateOnceAsync } from '@0x/migrations'; | ||||
| import { assetDataUtils, signatureUtils, SignedExchangeProxyMetaTransaction } from '@0x/order-utils'; | ||||
| import { | ||||
|     encodeFillQuoteTransformerData, | ||||
|     encodePayTakerTransformerData, | ||||
|     ETH_TOKEN_ADDRESS, | ||||
|     FillQuoteTransformerSide, | ||||
|     findTransformerNonce, | ||||
|     Signature, | ||||
| } from '@0x/protocol-utils'; | ||||
| import { AssetProxyId, Order, SignedOrder } from '@0x/types'; | ||||
| import { BigNumber, hexUtils } from '@0x/utils'; | ||||
| import * as ethjs from 'ethereumjs-util'; | ||||
|  | ||||
| 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(); | ||||
|     const quoteSigner = hexUtils.toHex(ethjs.privateToAddress(ethjs.toBuffer(quoteSignerKey))); | ||||
|     let owner: string; | ||||
|     let relayer: string; | ||||
|     let maker: string; | ||||
|     let taker: string; | ||||
|     let flashWalletAddress: string; | ||||
|     let zeroEx: IZeroExContract; | ||||
|     let exchange: IExchangeContract; | ||||
|     let inputToken: DummyERC20TokenContract; | ||||
|     let outputToken: DummyERC20TokenContract; | ||||
|     let feeToken: DummyERC20TokenContract; | ||||
|     let addresses: ContractAddresses; | ||||
|     let protocolFee: BigNumber; | ||||
|     let metadataTransformer: LogMetadataTransformerContract; | ||||
|     const GAS_PRICE = new BigNumber('1e9'); | ||||
|     const MAKER_BALANCE = new BigNumber('100e18'); | ||||
|     const TAKER_BALANCE = new BigNumber('100e18'); | ||||
|     const TAKER_FEE_BALANCE = new BigNumber('100e18'); | ||||
|  | ||||
|     before(async () => { | ||||
|         [, relayer, maker, taker] = await env.getAccountAddressesAsync(); | ||||
|         addresses = await migrateOnceAsync(env.provider); | ||||
|         zeroEx = new IZeroExContract(addresses.exchangeProxy, env.provider, env.txDefaults, { | ||||
|             LogMetadataTransformer: LogMetadataTransformerContract.ABI(), | ||||
|             DummyERC20Token: DummyERC20TokenContract.ABI(), | ||||
|         }); | ||||
|         exchange = new IExchangeContract(addresses.exchange, env.provider, env.txDefaults); | ||||
|         [inputToken, outputToken, feeToken] = await Promise.all( | ||||
|             [...new Array(3)].map(i => | ||||
|                 DummyERC20TokenContract.deployFrom0xArtifactAsync( | ||||
|                     erc20Artifacts.DummyERC20Token, | ||||
|                     env.provider, | ||||
|                     env.txDefaults, | ||||
|                     {}, | ||||
|                     `DummyToken-${i}`, | ||||
|                     `TOK${i}`, | ||||
|                     new BigNumber(18), | ||||
|                     BigNumber.max(MAKER_BALANCE, TAKER_BALANCE), | ||||
|                 ), | ||||
|             ), | ||||
|         ); | ||||
|         // LogMetadataTransformer is not deployed in migrations. | ||||
|         metadataTransformer = await LogMetadataTransformerContract.deployFrom0xArtifactAsync( | ||||
|             exchangeProxyArtifacts.LogMetadataTransformer, | ||||
|             env.provider, | ||||
|             { | ||||
|                 ...env.txDefaults, | ||||
|                 from: addresses.exchangeProxyTransformerDeployer, | ||||
|             }, | ||||
|             {}, | ||||
|         ); | ||||
|         owner = await zeroEx.owner().callAsync(); | ||||
|         protocolFee = await exchange.protocolFeeMultiplier().callAsync(); | ||||
|         flashWalletAddress = await zeroEx.getTransformWallet().callAsync(); | ||||
|         const erc20Proxy = await exchange.getAssetProxy(AssetProxyId.ERC20).callAsync(); | ||||
|         const allowanceTarget = await zeroEx.getAllowanceTarget().callAsync(); | ||||
|         await outputToken.mint(MAKER_BALANCE).awaitTransactionSuccessAsync({ from: maker }); | ||||
|         await inputToken.mint(TAKER_BALANCE).awaitTransactionSuccessAsync({ from: taker }); | ||||
|         await feeToken.mint(TAKER_FEE_BALANCE).awaitTransactionSuccessAsync({ from: taker }); | ||||
|         await outputToken.approve(erc20Proxy, MAX_UINT256).awaitTransactionSuccessAsync({ from: maker }); | ||||
|         await inputToken.approve(allowanceTarget, MAX_UINT256).awaitTransactionSuccessAsync({ from: taker }); | ||||
|         await feeToken.approve(allowanceTarget, MAX_UINT256).awaitTransactionSuccessAsync({ from: taker }); | ||||
|         await zeroEx.setQuoteSigner(quoteSigner).awaitTransactionSuccessAsync({ from: owner }); | ||||
|     }); | ||||
|  | ||||
|     interface Transformation { | ||||
|         deploymentNonce: number; | ||||
|         data: string; | ||||
|     } | ||||
|  | ||||
|     interface SwapInfo { | ||||
|         inputTokenAddress: string; | ||||
|         outputTokenAddress: string; | ||||
|         inputTokenAmount: BigNumber; | ||||
|         minOutputTokenAmount: BigNumber; | ||||
|         transformations: Transformation[]; | ||||
|         orders: SignedOrder[]; | ||||
|     } | ||||
|  | ||||
|     async function generateSwapAsync(orderFields: Partial<Order> = {}, isRfqt: boolean = false): Promise<SwapInfo> { | ||||
|         const order = await signatureUtils.ecSignTypedDataOrderAsync( | ||||
|             env.provider, | ||||
|             { | ||||
|                 chainId: 1337, | ||||
|                 exchangeAddress: exchange.address, | ||||
|                 expirationTimeSeconds: new BigNumber(Date.now()), | ||||
|                 salt: new BigNumber(hexUtils.random()), | ||||
|                 feeRecipientAddress: NULL_ADDRESS, | ||||
|                 senderAddress: NULL_ADDRESS, | ||||
|                 takerAddress: isRfqt ? flashWalletAddress : NULL_ADDRESS, | ||||
|                 makerAddress: maker, | ||||
|                 makerAssetData: assetDataUtils.encodeERC20AssetData(outputToken.address), | ||||
|                 takerAssetData: assetDataUtils.encodeERC20AssetData(inputToken.address), | ||||
|                 makerFeeAssetData: NULL_BYTES, | ||||
|                 takerFeeAssetData: NULL_BYTES, | ||||
|                 takerAssetAmount: getRandomPortion(TAKER_BALANCE), | ||||
|                 makerAssetAmount: getRandomPortion(MAKER_BALANCE), | ||||
|                 makerFee: ZERO_AMOUNT, | ||||
|                 takerFee: ZERO_AMOUNT, | ||||
|                 ...orderFields, | ||||
|             }, | ||||
|             maker, | ||||
|         ); | ||||
|         const transformations = [ | ||||
|             { | ||||
|                 deploymentNonce: findTransformerNonce( | ||||
|                     addresses.transformers.fillQuoteTransformer, | ||||
|                     addresses.exchangeProxyTransformerDeployer, | ||||
|                 ), | ||||
|                 data: encodeFillQuoteTransformerData({ | ||||
|                     orders: [order], | ||||
|                     signatures: [order.signature], | ||||
|                     buyToken: outputToken.address, | ||||
|                     sellToken: inputToken.address, | ||||
|                     fillAmount: order.takerAssetAmount, | ||||
|                     maxOrderFillAmounts: [], | ||||
|                     refundReceiver: hexUtils.leftPad(2, 20), // Send refund to sender. | ||||
|                     rfqtTakerAddress: isRfqt ? taker : NULL_ADDRESS, | ||||
|                     side: FillQuoteTransformerSide.Sell, | ||||
|                 }), | ||||
|             }, | ||||
|             { | ||||
|                 deploymentNonce: findTransformerNonce( | ||||
|                     addresses.transformers.payTakerTransformer, | ||||
|                     addresses.exchangeProxyTransformerDeployer, | ||||
|                 ), | ||||
|                 data: encodePayTakerTransformerData({ | ||||
|                     tokens: [inputToken.address, outputToken.address, ETH_TOKEN_ADDRESS], | ||||
|                     amounts: [MAX_UINT256, MAX_UINT256, MAX_UINT256], | ||||
|                 }), | ||||
|             }, | ||||
|             { | ||||
|                 deploymentNonce: findTransformerNonce( | ||||
|                     metadataTransformer.address, | ||||
|                     addresses.exchangeProxyTransformerDeployer, | ||||
|                 ), | ||||
|                 data: NULL_BYTES, | ||||
|             }, | ||||
|         ]; | ||||
|         return { | ||||
|             transformations, | ||||
|             orders: [order], | ||||
|             inputTokenAddress: inputToken.address, | ||||
|             outputTokenAddress: outputToken.address, | ||||
|             inputTokenAmount: order.takerAssetAmount, | ||||
|             minOutputTokenAmount: order.makerAssetAmount, | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     function getSwapData(swap: SwapInfo): string { | ||||
|         return zeroEx | ||||
|             .transformERC20( | ||||
|                 swap.inputTokenAddress, | ||||
|                 swap.outputTokenAddress, | ||||
|                 swap.inputTokenAmount, | ||||
|                 swap.minOutputTokenAmount, | ||||
|                 swap.transformations, | ||||
|             ) | ||||
|             .getABIEncodedTransactionData(); | ||||
|     } | ||||
|  | ||||
|     async function createMetaTransactionAsync( | ||||
|         data: string, | ||||
|         value: BigNumber, | ||||
|         fee?: BigNumber | number, | ||||
|     ): Promise<SignedExchangeProxyMetaTransaction> { | ||||
|         return signatureUtils.ecSignTypedDataExchangeProxyMetaTransactionAsync( | ||||
|             env.provider, | ||||
|             { | ||||
|                 value, | ||||
|                 signer: taker, | ||||
|                 sender: relayer, | ||||
|                 minGasPrice: GAS_PRICE, | ||||
|                 maxGasPrice: GAS_PRICE, | ||||
|                 expirationTimeSeconds: new BigNumber(Math.floor(Date.now() / 1000) + 60), | ||||
|                 salt: new BigNumber(hexUtils.random()), | ||||
|                 callData: data, | ||||
|                 feeToken: feeToken.address, | ||||
|                 feeAmount: fee !== undefined ? new BigNumber(fee) : getRandomPortion(TAKER_FEE_BALANCE), | ||||
|                 domain: { | ||||
|                     chainId: 1, | ||||
|                     name: 'ZeroEx', | ||||
|                     version: '1.0.0', | ||||
|                     verifyingContract: zeroEx.address, | ||||
|                 }, | ||||
|             }, | ||||
|             taker, | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     it('can call `transformERC20()` with calldata and no relayer fee', async () => { | ||||
|         const swap = await generateSwapAsync(); | ||||
|         const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed. | ||||
|         const mtx = await createMetaTransactionAsync(getSwapData(swap), _protocolFee, 0); | ||||
|         const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer); | ||||
|         const receipt = await zeroEx | ||||
|             .executeMetaTransaction(mtx, sigstruct(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 no mtx fees. | ||||
|         expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(0); | ||||
|         // 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, | ||||
|                     sender: zeroEx.address, | ||||
|                     data: NULL_BYTES, | ||||
|                 }, | ||||
|             ], | ||||
|             'TransformerMetadata', | ||||
|         ); | ||||
|     }); | ||||
|  | ||||
|     it('can call `transformERC20()` with calldata and a relayer fee', async () => { | ||||
|         const swap = await generateSwapAsync(); | ||||
|         const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed. | ||||
|         const mtx = await createMetaTransactionAsync(getSwapData(swap), _protocolFee); | ||||
|         const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer); | ||||
|         const receipt = await zeroEx | ||||
|             .executeMetaTransaction(mtx, sigstruct(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, | ||||
|                     sender: zeroEx.address, | ||||
|                     data: NULL_BYTES, | ||||
|                 }, | ||||
|             ], | ||||
|             'TransformerMetadata', | ||||
|         ); | ||||
|     }); | ||||
|  | ||||
|     it('`transformERC20()` can fill RFQT order', async () => { | ||||
|         const swap = await generateSwapAsync({}, true); | ||||
|         const _protocolFee = protocolFee.times(GAS_PRICE).times(swap.orders.length + 1); // Pay a little more fee than needed. | ||||
|         const mtx = await createMetaTransactionAsync(getSwapData(swap), _protocolFee, 0); | ||||
|         const relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer); | ||||
|         const receipt = await zeroEx | ||||
|             .executeMetaTransaction(mtx, sigstruct(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 no mtx fees. | ||||
|         expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(0); | ||||
|         // 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, | ||||
|                     sender: zeroEx.address, | ||||
|                     data: NULL_BYTES, | ||||
|                 }, | ||||
|             ], | ||||
|             'TransformerMetadata', | ||||
|         ); | ||||
|     }); | ||||
|  | ||||
|     it('`transformERC20()` can fill RFQT order if quote signer configured', 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 relayerEthBalanceBefore = await env.web3Wrapper.getBalanceInWeiAsync(relayer); | ||||
|         await zeroEx.setQuoteSigner(NULL_ADDRESS).awaitTransactionSuccessAsync({ from: owner }); | ||||
|         const receipt = await zeroEx | ||||
|             .executeMetaTransaction(mtx, sigstruct(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 no mtx fees. | ||||
|         expect(await feeToken.balanceOf(relayer).callAsync()).to.bignumber.eq(0); | ||||
|         // 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, | ||||
|                     sender: zeroEx.address, | ||||
|                     data: NULL_BYTES, | ||||
|                 }, | ||||
|             ], | ||||
|             'TransformerMetadata', | ||||
|         ); | ||||
|     }); | ||||
| }); | ||||
| @@ -1,4 +1,85 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "4.1.27-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "4.1.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "4.1.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "4.1.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "4.1.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "4.1.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "4.1.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "4.1.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608105788, | ||||
|         "version": "4.1.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "4.1.18", | ||||
|   | ||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.1.27-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.26 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.25 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.24 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.23 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.22 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.21 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.20 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.19 - _December 16, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.18 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-multisig", | ||||
|     "version": "4.1.18", | ||||
|     "version": "4.1.27-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -49,18 +49,18 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/multisig", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.9", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -78,7 +78,7 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|   | ||||
| @@ -1,4 +1,85 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "2.0.34-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "2.0.33", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "2.0.32", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "2.0.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "2.0.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "2.0.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "2.0.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "2.0.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608105788, | ||||
|         "version": "2.0.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "2.0.25", | ||||
|   | ||||
| @@ -5,6 +5,42 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v2.0.34-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.33 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.32 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.31 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.30 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.29 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.28 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.27 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.26 - _December 16, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.25 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-staking", | ||||
|     "version": "2.0.25", | ||||
|     "version": "2.0.34-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -53,20 +53,20 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-asset-proxy": "^3.6.9", | ||||
|         "@0x/contracts-dev-utils": "^1.3.16", | ||||
|         "@0x/contracts-erc20": "^3.2.12", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.18", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-utils": "^4.6.3", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-dev-utils": "^1.3.25-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.26-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-utils": "^4.7.5-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/node": "12.12.54", | ||||
|         "chai": "^4.0.1", | ||||
| @@ -87,10 +87,10 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^5.1.1" | ||||
|     }, | ||||
|   | ||||
| @@ -1,4 +1,76 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "5.3.23-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "5.3.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "5.3.21", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "5.3.20", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "5.3.19", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1609802516, | ||||
|         "version": "5.3.18", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "5.3.17", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "5.3.16", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "5.3.15", | ||||
|   | ||||
| @@ -5,6 +5,38 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v5.3.23-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.22 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.21 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.20 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.19 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.18 - _January 4, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.17 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.16 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.15 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-test-utils", | ||||
|     "version": "5.3.15", | ||||
|     "version": "5.3.23-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -34,7 +34,7 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "shx": "^0.2.2", | ||||
| @@ -42,20 +42,20 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.19", | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/contract-addresses": "^5.6.0", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/json-schemas": "^5.3.4", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/sol-coverage": "^4.0.24", | ||||
|         "@0x/sol-profiler": "^4.1.14", | ||||
|         "@0x/sol-trace": "^3.0.24", | ||||
|         "@0x/subproviders": "^6.2.3", | ||||
|         "@0x/assert": "^3.0.21", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contract-addresses": "^5.11.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/json-schemas": "^5.4.1", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/sol-coverage": "^4.0.31", | ||||
|         "@0x/sol-profiler": "^4.1.21", | ||||
|         "@0x/sol-trace": "^3.0.31", | ||||
|         "@0x/subproviders": "^6.4.1", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/bn.js": "^4.11.0", | ||||
|         "@types/js-combinatorics": "^0.5.29", | ||||
|         "@types/lodash": "4.14.104", | ||||
|   | ||||
							
								
								
									
										10
									
								
								contracts/treasury/.npmignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								contracts/treasury/.npmignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| # Blacklist all files | ||||
| .* | ||||
| * | ||||
| # Whitelist lib | ||||
| !lib/**/* | ||||
| # Whitelist Solidity contracts | ||||
| !contracts/src/**/* | ||||
| # Blacklist tests in lib | ||||
| /lib/test/* | ||||
| # Package specific ignore | ||||
							
								
								
									
										40
									
								
								contracts/treasury/CHANGELOG.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								contracts/treasury/CHANGELOG.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| [ | ||||
|     { | ||||
|         "version": "1.1.0-multiplex", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Make the proposal/quorum thresholds updatable", | ||||
|                 "pr": 165 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1615932869 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "1.0.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "1.0.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "1.0.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Create this package", | ||||
|                 "pr": 120 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1611869778 | ||||
|     } | ||||
| ] | ||||
							
								
								
									
										22
									
								
								contracts/treasury/CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								contracts/treasury/CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| <!-- | ||||
| changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly. | ||||
| Edit the package's CHANGELOG.json file only. | ||||
| --> | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.1.0-multiplex - _March 16, 2021_ | ||||
|  | ||||
|     * Make the proposal/quorum thresholds updatable (#165) | ||||
|  | ||||
| ## v1.0.2 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.0.1 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.0.0 - _January 28, 2021_ | ||||
|  | ||||
|     * Create this package (#120) | ||||
							
								
								
									
										1
									
								
								contracts/treasury/DEPLOYS.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contracts/treasury/DEPLOYS.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| [] | ||||
							
								
								
									
										65
									
								
								contracts/treasury/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								contracts/treasury/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| ## Governance | ||||
|  | ||||
| This package contains contracts for the governance of the 0x ZRX treasury. | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
| **Install** | ||||
|  | ||||
| ```bash | ||||
| npm install @0x/contracts-treasury --save | ||||
| ``` | ||||
|  | ||||
| ## Contributing | ||||
|  | ||||
| We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. | ||||
|  | ||||
| For proposals regarding the 0x protocol's smart contract architecture, message format, or additional functionality, go to the [0x Improvement Proposals (ZEIPs)](https://github.com/0xProject/ZEIPs) repository and follow the contribution guidelines provided therein. | ||||
|  | ||||
| Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started. | ||||
|  | ||||
| ### Install Dependencies | ||||
|  | ||||
| If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them: | ||||
|  | ||||
| ```bash | ||||
| yarn config set workspaces-experimental true | ||||
| ``` | ||||
|  | ||||
| Then install dependencies | ||||
|  | ||||
| ```bash | ||||
| yarn install | ||||
| ``` | ||||
|  | ||||
| ### Build | ||||
|  | ||||
| To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory: | ||||
|  | ||||
| ```bash | ||||
| PKG=@0x/contracts-treasury yarn build | ||||
| ``` | ||||
|  | ||||
| Or continuously rebuild on change: | ||||
|  | ||||
| ```bash | ||||
| PKG=@0x/contracts-treasury yarn watch | ||||
| ``` | ||||
|  | ||||
| ### Clean | ||||
|  | ||||
| ```bash | ||||
| yarn clean | ||||
| ``` | ||||
|  | ||||
| ### Lint | ||||
|  | ||||
| ```bash | ||||
| yarn lint | ||||
| ``` | ||||
|  | ||||
| ### Run Tests | ||||
|  | ||||
| ```bash | ||||
| yarn test | ||||
| ``` | ||||
							
								
								
									
										29
									
								
								contracts/treasury/compiler.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								contracts/treasury/compiler.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| { | ||||
|     "artifactsDir": "./test/generated-artifacts", | ||||
|     "contractsDir": "./contracts", | ||||
|     "useDockerisedSolc": false, | ||||
|     "isOfflineMode": false, | ||||
|     "shouldSaveStandardInput": true, | ||||
|     "shouldCompileIndependently": true, | ||||
|     "compilerSettings": { | ||||
|         "evmVersion": "istanbul", | ||||
|         "optimizer": { | ||||
|             "enabled": true, | ||||
|             "runs": 1000000, | ||||
|             "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } | ||||
|         }, | ||||
|         "outputSelection": { | ||||
|             "*": { | ||||
|                 "*": [ | ||||
|                     "abi", | ||||
|                     "devdoc", | ||||
|                     "evm.bytecode.object", | ||||
|                     "evm.bytecode.sourceMap", | ||||
|                     "evm.deployedBytecode.object", | ||||
|                     "evm.deployedBytecode.sourceMap", | ||||
|                     "evm.methodIdentifiers" | ||||
|                 ] | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										63
									
								
								contracts/treasury/contracts/src/DefaultPoolOperator.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								contracts/treasury/contracts/src/DefaultPoolOperator.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2021 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.12; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "./IStaking.sol"; | ||||
|  | ||||
|  | ||||
| contract DefaultPoolOperator { | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|  | ||||
|     // Immutables | ||||
|     IStaking public immutable stakingProxy; | ||||
|     IERC20TokenV06 public immutable weth; | ||||
|     bytes32 public immutable poolId; | ||||
|  | ||||
|     /// @dev Initializes this contract and creates a staking pool. | ||||
|     /// @param stakingProxy_ The 0x staking proxy contract. | ||||
|     /// @param weth_ The WETH token contract. | ||||
|     constructor( | ||||
|         IStaking stakingProxy_, | ||||
|         IERC20TokenV06 weth_ | ||||
|     ) | ||||
|         public | ||||
|     { | ||||
|         stakingProxy = stakingProxy_; | ||||
|         weth = weth_; | ||||
|         // operator share = 100% | ||||
|         poolId = stakingProxy_.createStakingPool(10 ** 6, false); | ||||
|     } | ||||
|  | ||||
|     /// @dev Sends this contract's entire WETH balance to the | ||||
|     ///      staking proxy contract. This function exists in case | ||||
|     ///      someone joins the default staking pool and starts | ||||
|     ///      market making for some reason, thus earning this contract | ||||
|     ///      some staking rewards. Note that anyone can call this | ||||
|     ///      function at any time. | ||||
|     function returnStakingRewards() | ||||
|         external | ||||
|     { | ||||
|         uint256 wethBalance = weth.compatBalanceOf(address(this)); | ||||
|         weth.compatTransfer(address(stakingProxy), wethBalance); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										127
									
								
								contracts/treasury/contracts/src/IStaking.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								contracts/treasury/contracts/src/IStaking.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2021 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.12; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
|  | ||||
| interface IStaking { | ||||
|     /// @dev Statuses that stake can exist in. | ||||
|     ///      Any stake can be (re)delegated effective at the next epoch | ||||
|     ///      Undelegated stake can be withdrawn if it is available in both the current and next epoch | ||||
|     enum StakeStatus { | ||||
|         UNDELEGATED, | ||||
|         DELEGATED | ||||
|     } | ||||
|  | ||||
|     /// @dev Encapsulates a balance for the current and next epochs. | ||||
|     /// Note that these balances may be stale if the current epoch | ||||
|     /// is greater than `currentEpoch`. | ||||
|     /// @param currentEpoch The current epoch | ||||
|     /// @param currentEpochBalance Balance in the current epoch. | ||||
|     /// @param nextEpochBalance Balance in `currentEpoch+1`. | ||||
|     struct StoredBalance { | ||||
|         uint64 currentEpoch; | ||||
|         uint96 currentEpochBalance; | ||||
|         uint96 nextEpochBalance; | ||||
|     } | ||||
|  | ||||
|     /// @dev Holds the metadata for a staking pool. | ||||
|     /// @param operator Operator of the pool. | ||||
|     /// @param operatorShare Fraction of the total balance owned by the operator, in ppm. | ||||
|     struct Pool { | ||||
|         address operator; | ||||
|         uint32 operatorShare; | ||||
|     } | ||||
|  | ||||
|     /// @dev Create a new staking pool. The sender will be the operator of this pool. | ||||
|     /// Note that an operator must be payable. | ||||
|     /// @param operatorShare Portion of rewards owned by the operator, in ppm. | ||||
|     /// @param addOperatorAsMaker Adds operator to the created pool as a maker for convenience iff true. | ||||
|     /// @return poolId The unique pool id generated for this pool. | ||||
|     function createStakingPool(uint32 operatorShare, bool addOperatorAsMaker) | ||||
|         external | ||||
|         returns (bytes32 poolId); | ||||
|  | ||||
|     /// @dev Returns the current staking epoch number. | ||||
|     /// @return epoch The current epoch. | ||||
|     function currentEpoch() | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 epoch); | ||||
|  | ||||
|     /// @dev Returns the time (in seconds) at which the current staking epoch started. | ||||
|     /// @return startTime The start time of the current epoch, in seconds. | ||||
|     function currentEpochStartTimeInSeconds() | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 startTime); | ||||
|  | ||||
|     /// @dev Returns the duration of an epoch in seconds. This value can be updated. | ||||
|     /// @return duration The duration of an epoch, in seconds. | ||||
|     function epochDurationInSeconds() | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 duration); | ||||
|  | ||||
|     /// @dev Returns a staking pool | ||||
|     /// @param poolId Unique id of pool. | ||||
|     function getStakingPool(bytes32 poolId) | ||||
|         external | ||||
|         view | ||||
|         returns (Pool memory); | ||||
|  | ||||
|     /// @dev Gets global stake for a given status. | ||||
|     /// @param stakeStatus UNDELEGATED or DELEGATED | ||||
|     /// @return balance Global stake for given status. | ||||
|     function getGlobalStakeByStatus(StakeStatus stakeStatus) | ||||
|         external | ||||
|         view | ||||
|         returns (StoredBalance memory balance); | ||||
|  | ||||
|     /// @dev Gets an owner's stake balances by status. | ||||
|     /// @param staker Owner of stake. | ||||
|     /// @param stakeStatus UNDELEGATED or DELEGATED | ||||
|     /// @return balance Owner's stake balances for given status. | ||||
|     function getOwnerStakeByStatus( | ||||
|         address staker, | ||||
|         StakeStatus stakeStatus | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (StoredBalance memory balance); | ||||
|  | ||||
|     /// @dev Returns the total stake delegated to a specific staking pool, | ||||
|     ///      across all members. | ||||
|     /// @param poolId Unique Id of pool. | ||||
|     /// @return balance Total stake delegated to pool. | ||||
|     function getTotalStakeDelegatedToPool(bytes32 poolId) | ||||
|         external | ||||
|         view | ||||
|         returns (StoredBalance memory balance); | ||||
|  | ||||
|     /// @dev Returns the stake delegated to a specific staking pool, by a given staker. | ||||
|     /// @param staker of stake. | ||||
|     /// @param poolId Unique Id of pool. | ||||
|     /// @return balance Stake delegated to pool by staker. | ||||
|     function getStakeDelegatedToPoolByOwner(address staker, bytes32 poolId) | ||||
|         external | ||||
|         view | ||||
|         returns (StoredBalance memory balance); | ||||
| } | ||||
							
								
								
									
										181
									
								
								contracts/treasury/contracts/src/IZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								contracts/treasury/contracts/src/IZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,181 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2021 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.12; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./DefaultPoolOperator.sol"; | ||||
| import "./IStaking.sol"; | ||||
|  | ||||
|  | ||||
| interface IZrxTreasury { | ||||
|  | ||||
|     struct TreasuryParameters { | ||||
|         uint256 votingPeriod; | ||||
|         uint256 proposalThreshold; | ||||
|         uint256 quorumThreshold; | ||||
|     } | ||||
|  | ||||
|     struct ProposedAction { | ||||
|         address target; | ||||
|         bytes data; | ||||
|         uint256 value; | ||||
|     } | ||||
|  | ||||
|     struct Proposal { | ||||
|         bytes32 actionsHash; | ||||
|         uint256 executionEpoch; | ||||
|         uint256 voteEpoch; | ||||
|         uint256 votesFor; | ||||
|         uint256 votesAgainst; | ||||
|         bool executed; | ||||
|     } | ||||
|  | ||||
|     event ProposalCreated( | ||||
|         address proposer, | ||||
|         bytes32[] operatedPoolIds, | ||||
|         uint256 proposalId, | ||||
|         ProposedAction[] actions, | ||||
|         uint256 executionEpoch, | ||||
|         string description | ||||
|     ); | ||||
|  | ||||
|     event VoteCast( | ||||
|         address voter, | ||||
|         bytes32[] operatedPoolIds, | ||||
|         uint256 proposalId, | ||||
|         bool support, | ||||
|         uint256 votingPower | ||||
|     ); | ||||
|  | ||||
|     event ProposalExecuted(uint256 proposalId); | ||||
|  | ||||
|     function stakingProxy() | ||||
|         external | ||||
|         view | ||||
|         returns (IStaking); | ||||
|  | ||||
|     function defaultPoolOperator() | ||||
|         external | ||||
|         view | ||||
|         returns (DefaultPoolOperator); | ||||
|  | ||||
|     function defaultPoolId() | ||||
|         external | ||||
|         view | ||||
|         returns (bytes32); | ||||
|  | ||||
|     function votingPeriod() | ||||
|         external | ||||
|         view | ||||
|         returns (uint256); | ||||
|  | ||||
|     function proposalThreshold() | ||||
|         external | ||||
|         view | ||||
|         returns (uint256); | ||||
|  | ||||
|     function quorumThreshold() | ||||
|         external | ||||
|         view | ||||
|         returns (uint256); | ||||
|  | ||||
|     /// @dev Updates the proposal and quorum thresholds to the given | ||||
|     ///      values. Note that this function is only callable by the | ||||
|     ///      treasury contract itself, so the threshold can only be | ||||
|     ///      updated via a successful treasury proposal. | ||||
|     /// @param newProposalThreshold The new value for the proposal threshold. | ||||
|     /// @param newQuorumThreshold The new value for the quorum threshold. | ||||
|     function updateThresholds( | ||||
|         uint256 newProposalThreshold, | ||||
|         uint256 newQuorumThreshold | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Creates a proposal to send ZRX from this treasury on the | ||||
|     ///      the given actions. Must have at least `proposalThreshold` | ||||
|     ///      of voting power to call this function. See `getVotingPower` | ||||
|     ///      for how voting power is computed. If a proposal is successfully | ||||
|     ///      created, voting starts at the epoch after next (currentEpoch + 2). | ||||
|     ///      If the vote passes, the proposal is executable during the | ||||
|     ///      `executionEpoch`. See `hasProposalPassed` for the passing criteria. | ||||
|     /// @param actions The proposed ZRX actions. An action specifies a | ||||
|     ///        contract call. | ||||
|     /// @param executionEpoch The epoch during which the proposal is to | ||||
|     ///        be executed if it passes. Must be at least two epochs | ||||
|     ///        from the current epoch. | ||||
|     /// @param description A text description for the proposal. | ||||
|     /// @param operatedPoolIds The pools operated by `msg.sender`. The | ||||
|     ///        ZRX currently delegated to those pools will be accounted | ||||
|     ///        for in the voting power. | ||||
|     /// @return proposalId The ID of the newly created proposal. | ||||
|     function propose( | ||||
|         ProposedAction[] calldata actions, | ||||
|         uint256 executionEpoch, | ||||
|         string calldata description, | ||||
|         bytes32[] calldata operatedPoolIds | ||||
|     ) | ||||
|         external | ||||
|         returns (uint256 proposalId); | ||||
|  | ||||
|     /// @dev Casts a vote for the given proposal. Only callable | ||||
|     ///      during the voting period for that proposal. See | ||||
|     ///      `getVotingPower` for how voting power is computed. | ||||
|     /// @param proposalId The ID of the proposal to vote on. | ||||
|     /// @param support Whether to support the proposal or not. | ||||
|     /// @param operatedPoolIds The pools operated by `msg.sender`. The | ||||
|     ///        ZRX currently delegated to those pools will be accounted | ||||
|     ///        for in the voting power. | ||||
|     function castVote( | ||||
|         uint256 proposalId, | ||||
|         bool support, | ||||
|         bytes32[] calldata operatedPoolIds | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Executes a proposal that has passed and is | ||||
|     ///      currently executable. | ||||
|     /// @param proposalId The ID of the proposal to execute. | ||||
|     /// @param actions Actions associated with the proposal to execute. | ||||
|     function execute(uint256 proposalId, ProposedAction[] memory actions) | ||||
|         external | ||||
|         payable; | ||||
|  | ||||
|     /// @dev Returns the total number of proposals. | ||||
|     /// @return count The number of proposals. | ||||
|     function proposalCount() | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 count); | ||||
|  | ||||
|     /// @dev Computes the current voting power of the given account. | ||||
|     ///      Voting power is equal to: | ||||
|     ///      (ZRX delegated to the default pool) + | ||||
|     ///      0.5 * (ZRX delegated to other pools) + | ||||
|     ///      0.5 * (ZRX delegated to pools operated by account) | ||||
|     /// @param account The address of the account. | ||||
|     /// @param operatedPoolIds The pools operated by `account`. The | ||||
|     ///        ZRX currently delegated to those pools will be accounted | ||||
|     ///        for in the voting power. | ||||
|     /// @return votingPower The current voting power of the given account. | ||||
|     function getVotingPower(address account, bytes32[] calldata operatedPoolIds) | ||||
|         external | ||||
|         view | ||||
|         returns (uint256 votingPower); | ||||
| } | ||||
							
								
								
									
										378
									
								
								contracts/treasury/contracts/src/ZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										378
									
								
								contracts/treasury/contracts/src/ZrxTreasury.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,378 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2021 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.12; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol"; | ||||
| import "@0x/contracts-zero-ex/contracts/src/features/libs/LibSignature.sol"; | ||||
| import "./IZrxTreasury.sol"; | ||||
|  | ||||
|  | ||||
| contract ZrxTreasury is | ||||
|     IZrxTreasury | ||||
| { | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|     using LibSafeMathV06 for uint256; | ||||
|     using LibRichErrorsV06 for bytes; | ||||
|     using LibBytesV06 for bytes; | ||||
|  | ||||
|     // Immutables | ||||
|     IStaking public immutable override stakingProxy; | ||||
|     DefaultPoolOperator public immutable override defaultPoolOperator; | ||||
|     bytes32 public immutable override defaultPoolId; | ||||
|     uint256 public immutable override votingPeriod; | ||||
|     uint256 public override proposalThreshold; | ||||
|     uint256 public override quorumThreshold; | ||||
|  | ||||
|     // Storage | ||||
|     Proposal[] public proposals; | ||||
|     mapping (uint256 => mapping (address => bool)) public hasVoted; | ||||
|  | ||||
|     /// @dev Initializes the ZRX treasury and creates the default | ||||
|     ///      staking pool. | ||||
|     /// @param stakingProxy_ The 0x staking proxy contract. | ||||
|     /// @param weth_ The WETH token contract. | ||||
|     /// @param params Immutable treasury parameters. | ||||
|     constructor( | ||||
|         IStaking stakingProxy_, | ||||
|         IERC20TokenV06 weth_, | ||||
|         TreasuryParameters memory params | ||||
|     ) | ||||
|         public | ||||
|     { | ||||
|         require( | ||||
|             params.votingPeriod < stakingProxy_.epochDurationInSeconds(), | ||||
|             "VOTING_PERIOD_TOO_LONG" | ||||
|         ); | ||||
|         stakingProxy = stakingProxy_; | ||||
|         DefaultPoolOperator defaultPoolOperator_ = new DefaultPoolOperator( | ||||
|             stakingProxy_, | ||||
|             weth_ | ||||
|         ); | ||||
|         defaultPoolOperator = defaultPoolOperator_; | ||||
|         defaultPoolId = defaultPoolOperator_.poolId(); | ||||
|         votingPeriod = params.votingPeriod; | ||||
|         proposalThreshold = params.proposalThreshold; | ||||
|         quorumThreshold = params.quorumThreshold; | ||||
|     } | ||||
|  | ||||
|     // solhint-disable | ||||
|     /// @dev Allows this contract to receive ether. | ||||
|     receive() external payable {} | ||||
|     // solhint-enable | ||||
|  | ||||
|     /// @dev Updates the proposal and quorum thresholds to the given | ||||
|     ///      values. Note that this function is only callable by the | ||||
|     ///      treasury contract itself, so the threshold can only be | ||||
|     ///      updated via a successful treasury proposal. | ||||
|     /// @param newProposalThreshold The new value for the proposal threshold. | ||||
|     /// @param newQuorumThreshold The new value for the quorum threshold. | ||||
|     function updateThresholds( | ||||
|         uint256 newProposalThreshold, | ||||
|         uint256 newQuorumThreshold | ||||
|     ) | ||||
|         external | ||||
|         override | ||||
|     { | ||||
|         require(msg.sender == address(this), "updateThresholds/ONLY_SELF"); | ||||
|         proposalThreshold = newProposalThreshold; | ||||
|         quorumThreshold = newQuorumThreshold; | ||||
|     } | ||||
|  | ||||
|     /// @dev Creates a proposal to send ZRX from this treasury on the | ||||
|     ///      the given actions. Must have at least `proposalThreshold` | ||||
|     ///      of voting power to call this function. See `getVotingPower` | ||||
|     ///      for how voting power is computed. If a proposal is successfully | ||||
|     ///      created, voting starts at the epoch after next (currentEpoch + 2). | ||||
|     ///      If the vote passes, the proposal is executable during the | ||||
|     ///      `executionEpoch`. See `hasProposalPassed` for the passing criteria. | ||||
|     /// @param actions The proposed ZRX actions. An action specifies a | ||||
|     ///        contract call. | ||||
|     /// @param executionEpoch The epoch during which the proposal is to | ||||
|     ///        be executed if it passes. Must be at least two epochs | ||||
|     ///        from the current epoch. | ||||
|     /// @param description A text description for the proposal. | ||||
|     /// @param operatedPoolIds The pools operated by `msg.sender`. The | ||||
|     ///        ZRX currently delegated to those pools will be accounted | ||||
|     ///        for in the voting power. | ||||
|     /// @return proposalId The ID of the newly created proposal. | ||||
|     function propose( | ||||
|         ProposedAction[] memory actions, | ||||
|         uint256 executionEpoch, | ||||
|         string memory description, | ||||
|         bytes32[] memory operatedPoolIds | ||||
|     ) | ||||
|         public | ||||
|         override | ||||
|         returns (uint256 proposalId) | ||||
|     { | ||||
|         require( | ||||
|             getVotingPower(msg.sender, operatedPoolIds) >= proposalThreshold, | ||||
|             "propose/INSUFFICIENT_VOTING_POWER" | ||||
|         ); | ||||
|         require( | ||||
|             actions.length > 0, | ||||
|             "propose/NO_ACTIONS_PROPOSED" | ||||
|         ); | ||||
|         uint256 currentEpoch = stakingProxy.currentEpoch(); | ||||
|         require( | ||||
|             executionEpoch >= currentEpoch + 2, | ||||
|             "propose/INVALID_EXECUTION_EPOCH" | ||||
|         ); | ||||
|  | ||||
|         proposalId = proposalCount(); | ||||
|         Proposal storage newProposal = proposals.push(); | ||||
|         newProposal.actionsHash = keccak256(abi.encode(actions)); | ||||
|         newProposal.executionEpoch = executionEpoch; | ||||
|         newProposal.voteEpoch = currentEpoch + 2; | ||||
|  | ||||
|         emit ProposalCreated( | ||||
|             msg.sender, | ||||
|             operatedPoolIds, | ||||
|             proposalId, | ||||
|             actions, | ||||
|             executionEpoch, | ||||
|             description | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Casts a vote for the given proposal. Only callable | ||||
|     ///      during the voting period for that proposal. See | ||||
|     ///      `getVotingPower` for how voting power is computed. | ||||
|     /// @param proposalId The ID of the proposal to vote on. | ||||
|     /// @param support Whether to support the proposal or not. | ||||
|     /// @param operatedPoolIds The pools operated by `msg.sender`. The | ||||
|     ///        ZRX currently delegated to those pools will be accounted | ||||
|     ///        for in the voting power. | ||||
|     function castVote( | ||||
|         uint256 proposalId, | ||||
|         bool support, | ||||
|         bytes32[] memory operatedPoolIds | ||||
|     ) | ||||
|         public | ||||
|         override | ||||
|     { | ||||
|         if (proposalId >= proposalCount()) { | ||||
|             revert("castVote/INVALID_PROPOSAL_ID"); | ||||
|         } | ||||
|         if (hasVoted[proposalId][msg.sender]) { | ||||
|             revert("castVote/ALREADY_VOTED"); | ||||
|         } | ||||
|  | ||||
|         Proposal memory proposal = proposals[proposalId]; | ||||
|         if ( | ||||
|             proposal.voteEpoch != stakingProxy.currentEpoch() || | ||||
|             _hasVoteEnded(proposal.voteEpoch) | ||||
|         ) { | ||||
|             revert("castVote/VOTING_IS_CLOSED"); | ||||
|         } | ||||
|  | ||||
|         uint256 votingPower = getVotingPower(msg.sender, operatedPoolIds); | ||||
|         if (votingPower == 0) { | ||||
|             revert("castVote/NO_VOTING_POWER"); | ||||
|         } | ||||
|  | ||||
|         if (support) { | ||||
|             proposals[proposalId].votesFor = proposals[proposalId].votesFor | ||||
|                 .safeAdd(votingPower); | ||||
|             hasVoted[proposalId][msg.sender] = true; | ||||
|         } else { | ||||
|             proposals[proposalId].votesAgainst = proposals[proposalId].votesAgainst | ||||
|                 .safeAdd(votingPower); | ||||
|             hasVoted[proposalId][msg.sender] = true; | ||||
|         } | ||||
|  | ||||
|         emit VoteCast( | ||||
|             msg.sender, | ||||
|             operatedPoolIds, | ||||
|             proposalId, | ||||
|             support, | ||||
|             votingPower | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Executes a proposal that has passed and is | ||||
|     ///      currently executable. | ||||
|     /// @param proposalId The ID of the proposal to execute. | ||||
|     /// @param actions Actions associated with the proposal to execute. | ||||
|     function execute(uint256 proposalId, ProposedAction[] memory actions) | ||||
|         public | ||||
|         payable | ||||
|         override | ||||
|     { | ||||
|         if (proposalId >= proposalCount()) { | ||||
|             revert("execute/INVALID_PROPOSAL_ID"); | ||||
|         } | ||||
|         Proposal memory proposal = proposals[proposalId]; | ||||
|         _assertProposalExecutable(proposal, actions); | ||||
|  | ||||
|         proposals[proposalId].executed = true; | ||||
|  | ||||
|         for (uint256 i = 0; i != actions.length; i++) { | ||||
|             ProposedAction memory action = actions[i]; | ||||
|             (bool didSucceed, ) = action.target.call{value: action.value}(action.data); | ||||
|             require( | ||||
|                 didSucceed, | ||||
|                 "execute/ACTION_EXECUTION_FAILED" | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         emit ProposalExecuted(proposalId); | ||||
|     } | ||||
|  | ||||
|     /// @dev Returns the total number of proposals. | ||||
|     /// @return count The number of proposals. | ||||
|     function proposalCount() | ||||
|         public | ||||
|         override | ||||
|         view | ||||
|         returns (uint256 count) | ||||
|     { | ||||
|         return proposals.length; | ||||
|     } | ||||
|  | ||||
|     /// @dev Computes the current voting power of the given account. | ||||
|     ///      Voting power is equal to: | ||||
|     ///      (ZRX delegated to the default pool) + | ||||
|     ///      0.5 * (ZRX delegated to other pools) + | ||||
|     ///      0.5 * (ZRX delegated to pools operated by account) | ||||
|     /// @param account The address of the account. | ||||
|     /// @param operatedPoolIds The pools operated by `account`. The | ||||
|     ///        ZRX currently delegated to those pools will be accounted | ||||
|     ///        for in the voting power. | ||||
|     /// @return votingPower The current voting power of the given account. | ||||
|     function getVotingPower(address account, bytes32[] memory operatedPoolIds) | ||||
|         public | ||||
|         override | ||||
|         view | ||||
|         returns (uint256 votingPower) | ||||
|     { | ||||
|         uint256 delegatedBalance = stakingProxy.getOwnerStakeByStatus( | ||||
|             account, | ||||
|             IStaking.StakeStatus.DELEGATED | ||||
|         ).currentEpochBalance; | ||||
|         uint256 balanceDelegatedToDefaultPool = stakingProxy.getStakeDelegatedToPoolByOwner( | ||||
|             account, | ||||
|             defaultPoolId | ||||
|         ).currentEpochBalance; | ||||
|  | ||||
|         // Voting power for ZRX delegated to the default pool is not diluted, | ||||
|         // so we double-count the balance delegated to the default pool before | ||||
|         // dividing by 2. | ||||
|         votingPower = delegatedBalance | ||||
|             .safeAdd(balanceDelegatedToDefaultPool) | ||||
|             .safeDiv(2); | ||||
|  | ||||
|         // Add voting power for operated staking pools. | ||||
|         for (uint256 i = 0; i != operatedPoolIds.length; i++) { | ||||
|             IStaking.Pool memory pool = stakingProxy.getStakingPool(operatedPoolIds[i]); | ||||
|             require( | ||||
|                 pool.operator == account, | ||||
|                 "getVotingPower/POOL_NOT_OPERATED_BY_ACCOUNT" | ||||
|             ); | ||||
|             uint96 stakeDelegatedToPool = stakingProxy | ||||
|                 .getTotalStakeDelegatedToPool(operatedPoolIds[i]) | ||||
|                 .currentEpochBalance; | ||||
|             uint256 poolVotingPower = uint256(stakeDelegatedToPool).safeDiv(2); | ||||
|             votingPower = votingPower.safeAdd(poolVotingPower); | ||||
|         } | ||||
|  | ||||
|         return votingPower; | ||||
|     } | ||||
|  | ||||
|     /// @dev Checks whether the given proposal is executable. | ||||
|     ///      Reverts if not. | ||||
|     /// @param proposal The proposal to check. | ||||
|     function _assertProposalExecutable( | ||||
|         Proposal memory proposal, | ||||
|         ProposedAction[] memory actions | ||||
|     ) | ||||
|         private | ||||
|         view | ||||
|     { | ||||
|         require( | ||||
|             keccak256(abi.encode(actions)) == proposal.actionsHash, | ||||
|             "_assertProposalExecutable/INVALID_ACTIONS" | ||||
|         ); | ||||
|         require( | ||||
|             _hasProposalPassed(proposal), | ||||
|             "_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED" | ||||
|         ); | ||||
|         require( | ||||
|             !proposal.executed, | ||||
|             "_assertProposalExecutable/PROPOSAL_ALREADY_EXECUTED" | ||||
|         ); | ||||
|         require( | ||||
|             stakingProxy.currentEpoch() == proposal.executionEpoch, | ||||
|             "_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH" | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Checks whether the given proposal has passed or not. | ||||
|     /// @param proposal The proposal to check. | ||||
|     /// @return hasPassed Whether the proposal has passed. | ||||
|     function _hasProposalPassed(Proposal memory proposal) | ||||
|         private | ||||
|         view | ||||
|         returns (bool hasPassed) | ||||
|     { | ||||
|         // Proposal is not passed until the vote is over. | ||||
|         if (!_hasVoteEnded(proposal.voteEpoch)) { | ||||
|             return false; | ||||
|         } | ||||
|         // Must have >50% support. | ||||
|         if (proposal.votesFor <= proposal.votesAgainst) { | ||||
|             return false; | ||||
|         } | ||||
|         // Must reach quorum threshold. | ||||
|         if (proposal.votesFor < quorumThreshold) { | ||||
|             return false; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /// @dev Checks whether a vote starting at the given | ||||
|     ///      epoch has ended or not. | ||||
|     /// @param voteEpoch The epoch at which the vote started. | ||||
|     /// @return hasEnded Whether the vote has ended. | ||||
|     function _hasVoteEnded(uint256 voteEpoch) | ||||
|         private | ||||
|         view | ||||
|         returns (bool hasEnded) | ||||
|     { | ||||
|         uint256 currentEpoch = stakingProxy.currentEpoch(); | ||||
|         if (currentEpoch < voteEpoch) { | ||||
|             return false; | ||||
|         } | ||||
|         if (currentEpoch > voteEpoch) { | ||||
|             return true; | ||||
|         } | ||||
|         // voteEpoch == currentEpoch | ||||
|         // Vote ends at currentEpochStartTime + votingPeriod | ||||
|         uint256 voteEndTime = stakingProxy | ||||
|             .currentEpochStartTimeInSeconds() | ||||
|             .safeAdd(votingPeriod); | ||||
|         return block.timestamp > voteEndTime; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										88
									
								
								contracts/treasury/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								contracts/treasury/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-treasury", | ||||
|     "version": "1.1.0-multiplex", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
|     "description": "Smart contracts for governing the 0x ZRX treasury", | ||||
|     "main": "lib/src/index.js", | ||||
|     "directories": { | ||||
|         "test": "test" | ||||
|     }, | ||||
|     "scripts": { | ||||
|         "build": "yarn pre_build && yarn build:ts", | ||||
|         "build:ci": "yarn build", | ||||
|         "build:ts": "tsc -b", | ||||
|         "pre_build": "run-s compile contracts:gen generate_contract_wrappers contracts:copy", | ||||
|         "test": "yarn run_mocha", | ||||
|         "rebuild_and_test": "run-s build test", | ||||
|         "run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.js' --timeout 100000 --bail --exit", | ||||
|         "compile": "sol-compiler", | ||||
|         "watch": "sol-compiler -w", | ||||
|         "clean": "shx rm -rf lib test/generated-artifacts test/generated-wrappers generated-artifacts generated-wrappers", | ||||
|         "generate_contract_wrappers": "abi-gen --debug --abis  ${npm_package_config_abis} --output test/generated-wrappers --backend ethers", | ||||
|         "lint": "tslint --format stylish --project . --exclude ./generated-wrappers/**/* --exclude ./test/generated-wrappers/**/* --exclude ./generated-artifacts/**/* --exclude ./test/generated-artifacts/**/* --exclude **/lib/**/* && yarn lint-contracts", | ||||
|         "fix": "tslint --fix --format stylish --project . --exclude ./generated-wrappers/**/* --exclude ./generated-artifacts/**/* --exclude ./test/generated-wrappers/**/* --exclude ./test/generated-artifacts/**/* --exclude **/lib/**/* && yarn lint-contracts", | ||||
|         "test:circleci": "yarn test", | ||||
|         "contracts:gen": "contracts-gen generate", | ||||
|         "contracts:copy": "contracts-gen copy", | ||||
|         "lint-contracts": "#solhint -c ../.solhint.json contracts/**/**/**/**/*.sol", | ||||
|         "docs:md": "ts-doc-gen --sourceDir='$PROJECT_FILES' --output=$MD_FILE_DIR --fileExtension=mdx --tsconfig=./typedoc-tsconfig.json", | ||||
|         "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES", | ||||
|         "publish:private": "yarn build && gitpkg publish" | ||||
|     }, | ||||
|     "config": { | ||||
|         "publicInterfaceContracts": "ZrxTreasury,DefaultPoolOperator", | ||||
|         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", | ||||
|         "abis": "./test/generated-artifacts/@(DefaultPoolOperator|IStaking|IZrxTreasury|ZrxTreasury).json" | ||||
|     }, | ||||
|     "repository": { | ||||
|         "type": "git", | ||||
|         "url": "https://github.com/0xProject/protocol.git" | ||||
|     }, | ||||
|     "license": "Apache-2.0", | ||||
|     "bugs": { | ||||
|         "url": "https://github.com/0xProject/protocol/issues" | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contract-addresses": "^5.11.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.8-multiplex.0", | ||||
|         "@0x/contracts-erc20": "^3.3.5-multiplex.0", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-staking": "^2.0.34-multiplex.0", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/ts-doc-gen": "^0.0.28", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@types/isomorphic-fetch": "^0.0.35", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/prompts": "^2.0.9", | ||||
|         "isomorphic-fetch": "^3.0.0", | ||||
|         "lodash": "^4.17.11", | ||||
|         "mocha": "^6.2.0", | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "prompts": "^2.4.0", | ||||
|         "shx": "^0.2.2", | ||||
|         "solhint": "^1.4.1", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/protocol-utils": "^1.3.1-multiplex.0", | ||||
|         "@0x/subproviders": "^6.4.1", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^5.1.1" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|     } | ||||
| } | ||||
							
								
								
									
										13
									
								
								contracts/treasury/src/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								contracts/treasury/src/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| /* | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  * Warning: This file is auto-generated by contracts-gen. Don't edit manually. | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  */ | ||||
| import { ContractArtifact } from 'ethereum-types'; | ||||
|  | ||||
| import * as DefaultPoolOperator from '../generated-artifacts/DefaultPoolOperator.json'; | ||||
| import * as ZrxTreasury from '../generated-artifacts/ZrxTreasury.json'; | ||||
| export const artifacts = { | ||||
|     ZrxTreasury: ZrxTreasury as ContractArtifact, | ||||
|     DefaultPoolOperator: DefaultPoolOperator as ContractArtifact, | ||||
| }; | ||||
							
								
								
									
										2
									
								
								contracts/treasury/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								contracts/treasury/src/index.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| export { artifacts } from './artifacts'; | ||||
| export { DefaultPoolOperatorContract, ZrxTreasuryContract } from './wrappers'; | ||||
							
								
								
									
										7
									
								
								contracts/treasury/src/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								contracts/treasury/src/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| /* | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  * Warning: This file is auto-generated by contracts-gen. Don't edit manually. | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  */ | ||||
| export * from '../generated-wrappers/default_pool_operator'; | ||||
| export * from '../generated-wrappers/zrx_treasury'; | ||||
							
								
								
									
										17
									
								
								contracts/treasury/test/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								contracts/treasury/test/artifacts.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| /* | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  * Warning: This file is auto-generated by contracts-gen. Don't edit manually. | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  */ | ||||
| import { ContractArtifact } from 'ethereum-types'; | ||||
|  | ||||
| import * as DefaultPoolOperator from '../test/generated-artifacts/DefaultPoolOperator.json'; | ||||
| import * as IStaking from '../test/generated-artifacts/IStaking.json'; | ||||
| import * as IZrxTreasury from '../test/generated-artifacts/IZrxTreasury.json'; | ||||
| import * as ZrxTreasury from '../test/generated-artifacts/ZrxTreasury.json'; | ||||
| export const artifacts = { | ||||
|     DefaultPoolOperator: DefaultPoolOperator as ContractArtifact, | ||||
|     IStaking: IStaking as ContractArtifact, | ||||
|     IZrxTreasury: IZrxTreasury as ContractArtifact, | ||||
|     ZrxTreasury: ZrxTreasury as ContractArtifact, | ||||
| }; | ||||
							
								
								
									
										626
									
								
								contracts/treasury/test/treasury_test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										626
									
								
								contracts/treasury/test/treasury_test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,626 @@ | ||||
| import { artifacts as assetProxyArtifacts, ERC20ProxyContract } from '@0x/contracts-asset-proxy'; | ||||
| import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contracts-erc20'; | ||||
| import { | ||||
|     artifacts as stakingArtifacts, | ||||
|     constants as stakingConstants, | ||||
|     StakeInfo, | ||||
|     StakeStatus, | ||||
|     StakingProxyContract, | ||||
|     TestStakingContract, | ||||
|     ZrxVaultContract, | ||||
| } from '@0x/contracts-staking'; | ||||
| import { | ||||
|     blockchainTests, | ||||
|     constants, | ||||
|     expect, | ||||
|     getRandomInteger, | ||||
|     randomAddress, | ||||
|     verifyEventsFromLogs, | ||||
| } from '@0x/contracts-test-utils'; | ||||
| import { BigNumber } from '@0x/utils'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
| import { DefaultPoolOperatorContract, ZrxTreasuryContract, ZrxTreasuryEvents } from './wrappers'; | ||||
|  | ||||
| blockchainTests.resets('Treasury governance', env => { | ||||
|     const TREASURY_PARAMS = { | ||||
|         votingPeriod: new BigNumber(3).times(stakingConstants.ONE_DAY_IN_SECONDS), | ||||
|         proposalThreshold: new BigNumber(100), | ||||
|         quorumThreshold: new BigNumber(1000), | ||||
|     }; | ||||
|     const PROPOSAL_DESCRIPTION = 'A very compelling proposal!'; | ||||
|     const TREASURY_BALANCE = constants.INITIAL_ERC20_BALANCE; | ||||
|     const INVALID_PROPOSAL_ID = new BigNumber(999); | ||||
|     const GRANT_PROPOSALS = [ | ||||
|         { recipient: randomAddress(), amount: getRandomInteger(1, TREASURY_BALANCE.dividedToIntegerBy(2)) }, | ||||
|         { recipient: randomAddress(), amount: getRandomInteger(1, TREASURY_BALANCE.dividedToIntegerBy(2)) }, | ||||
|     ]; | ||||
|  | ||||
|     interface ProposedAction { | ||||
|         target: string; | ||||
|         data: string; | ||||
|         value: BigNumber; | ||||
|     } | ||||
|  | ||||
|     let zrx: DummyERC20TokenContract; | ||||
|     let weth: DummyERC20TokenContract; | ||||
|     let erc20ProxyContract: ERC20ProxyContract; | ||||
|     let staking: TestStakingContract; | ||||
|     let treasury: ZrxTreasuryContract; | ||||
|     let defaultPoolId: string; | ||||
|     let defaultPoolOperator: DefaultPoolOperatorContract; | ||||
|     let admin: string; | ||||
|     let nonDefaultPoolId: string; | ||||
|     let poolOperator: string; | ||||
|     let delegator: string; | ||||
|     let actions: ProposedAction[]; | ||||
|  | ||||
|     async function deployStakingAsync(): Promise<void> { | ||||
|         erc20ProxyContract = await ERC20ProxyContract.deployFrom0xArtifactAsync( | ||||
|             assetProxyArtifacts.ERC20Proxy, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             assetProxyArtifacts, | ||||
|         ); | ||||
|         const zrxVaultContract = await ZrxVaultContract.deployFrom0xArtifactAsync( | ||||
|             stakingArtifacts.ZrxVault, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             stakingArtifacts, | ||||
|             erc20ProxyContract.address, | ||||
|             zrx.address, | ||||
|         ); | ||||
|         await erc20ProxyContract.addAuthorizedAddress(zrxVaultContract.address).awaitTransactionSuccessAsync(); | ||||
|         await zrxVaultContract.addAuthorizedAddress(admin).awaitTransactionSuccessAsync(); | ||||
|         const stakingLogic = await TestStakingContract.deployFrom0xArtifactAsync( | ||||
|             stakingArtifacts.TestStaking, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             artifacts, | ||||
|             weth.address, | ||||
|             zrxVaultContract.address, | ||||
|         ); | ||||
|         const stakingProxyContract = await StakingProxyContract.deployFrom0xArtifactAsync( | ||||
|             stakingArtifacts.StakingProxy, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             artifacts, | ||||
|             stakingLogic.address, | ||||
|         ); | ||||
|         await stakingProxyContract.addAuthorizedAddress(admin).awaitTransactionSuccessAsync(); | ||||
|         await zrxVaultContract.setStakingProxy(stakingProxyContract.address).awaitTransactionSuccessAsync(); | ||||
|         staking = new TestStakingContract(stakingProxyContract.address, env.provider, env.txDefaults); | ||||
|     } | ||||
|  | ||||
|     async function fastForwardToNextEpochAsync(): Promise<void> { | ||||
|         const epochEndTime = await staking.getCurrentEpochEarliestEndTimeInSeconds().callAsync(); | ||||
|         const lastBlockTime = await env.web3Wrapper.getBlockTimestampAsync('latest'); | ||||
|         const dt = Math.max(0, epochEndTime.minus(lastBlockTime).toNumber()); | ||||
|         await env.web3Wrapper.increaseTimeAsync(dt); | ||||
|         // mine next block | ||||
|         await env.web3Wrapper.mineBlockAsync(); | ||||
|         await staking.endEpoch().awaitTransactionSuccessAsync(); | ||||
|     } | ||||
|  | ||||
|     before(async () => { | ||||
|         [admin, poolOperator, delegator] = await env.getAccountAddressesAsync(); | ||||
|         zrx = await DummyERC20TokenContract.deployFrom0xArtifactAsync( | ||||
|             erc20Artifacts.DummyERC20Token, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             erc20Artifacts, | ||||
|             constants.DUMMY_TOKEN_NAME, | ||||
|             constants.DUMMY_TOKEN_SYMBOL, | ||||
|             constants.DUMMY_TOKEN_DECIMALS, | ||||
|             constants.DUMMY_TOKEN_TOTAL_SUPPLY, | ||||
|         ); | ||||
|         weth = await DummyERC20TokenContract.deployFrom0xArtifactAsync( | ||||
|             erc20Artifacts.DummyERC20Token, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             erc20Artifacts, | ||||
|             constants.DUMMY_TOKEN_NAME, | ||||
|             constants.DUMMY_TOKEN_SYMBOL, | ||||
|             constants.DUMMY_TOKEN_DECIMALS, | ||||
|             constants.DUMMY_TOKEN_TOTAL_SUPPLY, | ||||
|         ); | ||||
|         await deployStakingAsync(); | ||||
|         await zrx.mint(constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|         await zrx.mint(constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|         await zrx | ||||
|             .approve(erc20ProxyContract.address, constants.INITIAL_ERC20_ALLOWANCE) | ||||
|             .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|         await zrx | ||||
|             .approve(erc20ProxyContract.address, constants.INITIAL_ERC20_ALLOWANCE) | ||||
|             .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|  | ||||
|         const createStakingPoolTx = staking.createStakingPool(stakingConstants.PPM, false); | ||||
|         nonDefaultPoolId = await createStakingPoolTx.callAsync({ from: poolOperator }); | ||||
|         await createStakingPoolTx.awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|  | ||||
|         treasury = await ZrxTreasuryContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.ZrxTreasury, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             { ...artifacts, ...erc20Artifacts }, | ||||
|             staking.address, | ||||
|             weth.address, | ||||
|             TREASURY_PARAMS, | ||||
|         ); | ||||
|         await zrx.mint(TREASURY_BALANCE).awaitTransactionSuccessAsync(); | ||||
|         await zrx.transfer(treasury.address, TREASURY_BALANCE).awaitTransactionSuccessAsync(); | ||||
|         actions = [ | ||||
|             { | ||||
|                 target: zrx.address, | ||||
|                 data: zrx | ||||
|                     .transfer(GRANT_PROPOSALS[0].recipient, GRANT_PROPOSALS[0].amount) | ||||
|                     .getABIEncodedTransactionData(), | ||||
|                 value: constants.ZERO_AMOUNT, | ||||
|             }, | ||||
|             { | ||||
|                 target: zrx.address, | ||||
|                 data: zrx | ||||
|                     .transfer(GRANT_PROPOSALS[1].recipient, GRANT_PROPOSALS[1].amount) | ||||
|                     .getABIEncodedTransactionData(), | ||||
|                 value: constants.ZERO_AMOUNT, | ||||
|             }, | ||||
|         ]; | ||||
|  | ||||
|         defaultPoolId = await treasury.defaultPoolId().callAsync(); | ||||
|         const defaultPoolOperatorAddress = await treasury.defaultPoolOperator().callAsync(); | ||||
|         defaultPoolOperator = new DefaultPoolOperatorContract(defaultPoolOperatorAddress, env.provider, env.txDefaults); | ||||
|     }); | ||||
|     describe('getVotingPower()', () => { | ||||
|         it('Unstaked ZRX has no voting power', async () => { | ||||
|             const votingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||
|             expect(votingPower).to.bignumber.equal(0); | ||||
|         }); | ||||
|         it('Staked but undelegated ZRX has no voting power', async () => { | ||||
|             await staking.stake(constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             const votingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||
|             expect(votingPower).to.bignumber.equal(0); | ||||
|         }); | ||||
|         it('ZRX delegated during epoch N has no voting power during Epoch N', async () => { | ||||
|             await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     TREASURY_PARAMS.proposalThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             const votingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||
|             expect(votingPower).to.bignumber.equal(0); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|         }); | ||||
|         it('ZRX delegated to the default pool retains full voting power', async () => { | ||||
|             await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     TREASURY_PARAMS.proposalThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const votingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||
|             expect(votingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold); | ||||
|         }); | ||||
|         it('ZRX delegated to a non-default pool splits voting power between delegator and pool operator', async () => { | ||||
|             await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, nonDefaultPoolId), | ||||
|                     TREASURY_PARAMS.proposalThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const delegatorVotingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||
|             expect(delegatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.dividedBy(2)); | ||||
|             const operatorVotingPower = await treasury.getVotingPower(poolOperator, [nonDefaultPoolId]).callAsync(); | ||||
|             expect(operatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.dividedBy(2)); | ||||
|         }); | ||||
|         it('Correctly sums voting power delegated to multiple pools', async () => { | ||||
|             await staking | ||||
|                 .stake(TREASURY_PARAMS.proposalThreshold.times(2)) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             // Delegate half of total stake to the default pool. | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     TREASURY_PARAMS.proposalThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             // Delegate the other half to a non-default pool. | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, nonDefaultPoolId), | ||||
|                     TREASURY_PARAMS.proposalThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const delegatorVotingPower = await treasury.getVotingPower(delegator, []).callAsync(); | ||||
|             expect(delegatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.times(1.5)); | ||||
|         }); | ||||
|         it('Correctly sums voting power for operator with multiple pools', async () => { | ||||
|             const createStakingPoolTx = staking.createStakingPool(stakingConstants.PPM, false); | ||||
|             const firstPool = nonDefaultPoolId; | ||||
|             const secondPool = await createStakingPoolTx.callAsync({ from: poolOperator }); | ||||
|             await createStakingPoolTx.awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|  | ||||
|             const amountDelegatedToDefaultPool = new BigNumber(1337); | ||||
|             const amountSelfDelegatedToFirstPool = new BigNumber(420); | ||||
|             const amountExternallyDelegatedToSecondPool = new BigNumber(2020); | ||||
|  | ||||
|             await staking | ||||
|                 .stake(amountDelegatedToDefaultPool.plus(amountSelfDelegatedToFirstPool)) | ||||
|                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     amountDelegatedToDefaultPool, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, firstPool), | ||||
|                     amountSelfDelegatedToFirstPool, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|             await staking | ||||
|                 .stake(amountExternallyDelegatedToSecondPool) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, secondPool), | ||||
|                     amountExternallyDelegatedToSecondPool, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|  | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const votingPower = await treasury.getVotingPower(poolOperator, [firstPool, secondPool]).callAsync(); | ||||
|             expect(votingPower).to.bignumber.equal( | ||||
|                 amountDelegatedToDefaultPool | ||||
|                     .plus(amountSelfDelegatedToFirstPool) | ||||
|                     .plus(amountExternallyDelegatedToSecondPool.dividedToIntegerBy(2)), | ||||
|             ); | ||||
|         }); | ||||
|     }); | ||||
|     describe('propose()', () => { | ||||
|         it('Cannot create proposal without sufficient voting power', async () => { | ||||
|             const votingPower = TREASURY_PARAMS.proposalThreshold.minus(1); | ||||
|             await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     votingPower, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||
|             const tx = treasury | ||||
|                 .propose(actions, currentEpoch.plus(2), PROPOSAL_DESCRIPTION, []) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             return expect(tx).to.revertWith('propose/INSUFFICIENT_VOTING_POWER'); | ||||
|         }); | ||||
|         it('Cannot create proposal with no actions', async () => { | ||||
|             const votingPower = TREASURY_PARAMS.proposalThreshold; | ||||
|             await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     votingPower, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||
|             const tx = treasury | ||||
|                 .propose([], currentEpoch.plus(2), PROPOSAL_DESCRIPTION, []) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             return expect(tx).to.revertWith('propose/NO_ACTIONS_PROPOSED'); | ||||
|         }); | ||||
|         it('Cannot create proposal with an invalid execution epoch', async () => { | ||||
|             const votingPower = TREASURY_PARAMS.proposalThreshold; | ||||
|             await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     votingPower, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||
|             const tx = treasury | ||||
|                 .propose(actions, currentEpoch.plus(1), PROPOSAL_DESCRIPTION, []) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             return expect(tx).to.revertWith('propose/INVALID_EXECUTION_EPOCH'); | ||||
|         }); | ||||
|         it('Can create a valid proposal', async () => { | ||||
|             const votingPower = TREASURY_PARAMS.proposalThreshold; | ||||
|             await staking.stake(votingPower).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     votingPower, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||
|             const executionEpoch = currentEpoch.plus(2); | ||||
|             const tx = await treasury | ||||
|                 .propose(actions, executionEpoch, PROPOSAL_DESCRIPTION, []) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             const proposalId = new BigNumber(0); | ||||
|             verifyEventsFromLogs( | ||||
|                 tx.logs, | ||||
|                 [ | ||||
|                     { | ||||
|                         proposer: delegator, | ||||
|                         operatedPoolIds: [], | ||||
|                         proposalId, | ||||
|                         actions, | ||||
|                         executionEpoch, | ||||
|                         description: PROPOSAL_DESCRIPTION, | ||||
|                     }, | ||||
|                 ], | ||||
|                 ZrxTreasuryEvents.ProposalCreated, | ||||
|             ); | ||||
|             expect(await treasury.proposalCount().callAsync()).to.bignumber.equal(1); | ||||
|         }); | ||||
|     }); | ||||
|     describe('castVote()', () => { | ||||
|         const VOTE_PROPOSAL_ID = new BigNumber(0); | ||||
|         const DELEGATOR_VOTING_POWER = new BigNumber(420); | ||||
|  | ||||
|         before(async () => { | ||||
|             await staking.stake(DELEGATOR_VOTING_POWER).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     DELEGATOR_VOTING_POWER, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||
|             await treasury | ||||
|                 .propose(actions, currentEpoch.plus(2), PROPOSAL_DESCRIPTION, []) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|         }); | ||||
|         it('Cannot vote on invalid proposalId', async () => { | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const tx = treasury | ||||
|                 .castVote(INVALID_PROPOSAL_ID, true, []) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             return expect(tx).to.revertWith('castVote/INVALID_PROPOSAL_ID'); | ||||
|         }); | ||||
|         it('Cannot vote before voting period starts', async () => { | ||||
|             const tx = treasury.castVote(VOTE_PROPOSAL_ID, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             return expect(tx).to.revertWith('castVote/VOTING_IS_CLOSED'); | ||||
|         }); | ||||
|         it('Cannot vote after voting period ends', async () => { | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await env.web3Wrapper.increaseTimeAsync(TREASURY_PARAMS.votingPeriod.plus(1).toNumber()); | ||||
|             await env.web3Wrapper.mineBlockAsync(); | ||||
|             const tx = treasury.castVote(VOTE_PROPOSAL_ID, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             return expect(tx).to.revertWith('castVote/VOTING_IS_CLOSED'); | ||||
|         }); | ||||
|         it('Cannot vote twice on same proposal', async () => { | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await treasury.castVote(VOTE_PROPOSAL_ID, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             const tx = treasury.castVote(VOTE_PROPOSAL_ID, false, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             return expect(tx).to.revertWith('castVote/ALREADY_VOTED'); | ||||
|         }); | ||||
|         it('Can cast a valid vote', async () => { | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const tx = await treasury | ||||
|                 .castVote(VOTE_PROPOSAL_ID, true, []) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             verifyEventsFromLogs( | ||||
|                 tx.logs, | ||||
|                 [ | ||||
|                     { | ||||
|                         voter: delegator, | ||||
|                         operatedPoolIds: [], | ||||
|                         proposalId: VOTE_PROPOSAL_ID, | ||||
|                         support: true, | ||||
|                         votingPower: DELEGATOR_VOTING_POWER, | ||||
|                     }, | ||||
|                 ], | ||||
|                 ZrxTreasuryEvents.VoteCast, | ||||
|             ); | ||||
|         }); | ||||
|     }); | ||||
|     describe('execute()', () => { | ||||
|         let passedProposalId: BigNumber; | ||||
|         let failedProposalId: BigNumber; | ||||
|         let defeatedProposalId: BigNumber; | ||||
|         let ongoingVoteProposalId: BigNumber; | ||||
|  | ||||
|         before(async () => { | ||||
|             // OPerator has enough ZRX to create and pass a proposal | ||||
|             await staking.stake(TREASURY_PARAMS.quorumThreshold).awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     TREASURY_PARAMS.quorumThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|             // Delegator only has enough ZRX to create a proposal | ||||
|             await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     TREASURY_PARAMS.proposalThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||
|             // Proposal 0 | ||||
|             let tx = treasury.propose(actions, currentEpoch.plus(4), PROPOSAL_DESCRIPTION, []); | ||||
|             passedProposalId = await tx.callAsync({ from: delegator }); | ||||
|             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             // Proposal 1 | ||||
|             tx = treasury.propose(actions, currentEpoch.plus(3), PROPOSAL_DESCRIPTION, []); | ||||
|             failedProposalId = await tx.callAsync({ from: delegator }); | ||||
|             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             // Proposal 2 | ||||
|             tx = treasury.propose(actions, currentEpoch.plus(3), PROPOSAL_DESCRIPTION, []); | ||||
|             defeatedProposalId = await tx.callAsync({ from: delegator }); | ||||
|             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||
|  | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             // Proposal 3 | ||||
|             tx = treasury.propose(actions, currentEpoch.plus(3), PROPOSAL_DESCRIPTION, []); | ||||
|             ongoingVoteProposalId = await tx.callAsync({ from: delegator }); | ||||
|             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||
|  | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             /********** Start Vote Epoch for Proposals 0, 1, 2 **********/ | ||||
|             // Proposal 0 passes | ||||
|             await treasury.castVote(passedProposalId, true, []).awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|             // Proposal 1 fails to reach quorum | ||||
|             await treasury.castVote(failedProposalId, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             // Proposal 2 is voted down | ||||
|             await treasury.castVote(defeatedProposalId, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await treasury.castVote(defeatedProposalId, false, []).awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|             /********** End Vote Epoch for Proposals 0, 1, 2 **********/ | ||||
|  | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             /********** Start Execution Epoch for Proposals 1, 2, 3 **********/ | ||||
|             /********** Start Vote Epoch for Proposal 3 **********************/ | ||||
|             // Proposal 3 has enough votes to pass, but the vote is ongoing | ||||
|             await treasury | ||||
|                 .castVote(ongoingVoteProposalId, true, []) | ||||
|                 .awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
|         }); | ||||
|         it('Cannot execute an invalid proposalId', async () => { | ||||
|             const tx = treasury.execute(INVALID_PROPOSAL_ID, actions).awaitTransactionSuccessAsync(); | ||||
|             return expect(tx).to.revertWith('execute/INVALID_PROPOSAL_ID'); | ||||
|         }); | ||||
|         it('Cannot execute a proposal whose vote is ongoing', async () => { | ||||
|             const tx = treasury.execute(ongoingVoteProposalId, actions).awaitTransactionSuccessAsync(); | ||||
|             return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED'); | ||||
|         }); | ||||
|         it('Cannot execute a proposal that failed to reach quorum', async () => { | ||||
|             const tx = treasury.execute(failedProposalId, actions).awaitTransactionSuccessAsync(); | ||||
|             return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED'); | ||||
|         }); | ||||
|         it('Cannot execute a proposal that was defeated in its vote', async () => { | ||||
|             const tx = treasury.execute(defeatedProposalId, actions).awaitTransactionSuccessAsync(); | ||||
|             return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_HAS_NOT_PASSED'); | ||||
|         }); | ||||
|         it('Cannot execute before or after the execution epoch', async () => { | ||||
|             const tooEarly = treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||
|             expect(tooEarly).to.revertWith('_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH'); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             // Proposal 0 is executable here | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const tooLate = treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||
|             return expect(tooLate).to.revertWith('_assertProposalExecutable/CANNOT_EXECUTE_THIS_EPOCH'); | ||||
|         }); | ||||
|         it('Cannot execute the same proposal twice', async () => { | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||
|             const tx = treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||
|             return expect(tx).to.revertWith('_assertProposalExecutable/PROPOSAL_ALREADY_EXECUTED'); | ||||
|         }); | ||||
|         it('Cannot execute actions that do not match the proposal `actionsHash`', async () => { | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const tx = treasury | ||||
|                 .execute(passedProposalId, [ | ||||
|                     { | ||||
|                         target: zrx.address, | ||||
|                         data: zrx.transfer(randomAddress(), GRANT_PROPOSALS[0].amount).getABIEncodedTransactionData(), | ||||
|                         value: constants.ZERO_AMOUNT, | ||||
|                     }, | ||||
|                 ]) | ||||
|                 .awaitTransactionSuccessAsync(); | ||||
|             return expect(tx).to.revertWith('_assertProposalExecutable/INVALID_ACTIONS'); | ||||
|         }); | ||||
|         it('Can execute a valid proposal', async () => { | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const tx = await treasury.execute(passedProposalId, actions).awaitTransactionSuccessAsync(); | ||||
|             verifyEventsFromLogs(tx.logs, [{ proposalId: passedProposalId }], ZrxTreasuryEvents.ProposalExecuted); | ||||
|             expect(await zrx.balanceOf(GRANT_PROPOSALS[0].recipient).callAsync()).to.bignumber.equal( | ||||
|                 GRANT_PROPOSALS[0].amount, | ||||
|             ); | ||||
|             expect(await zrx.balanceOf(GRANT_PROPOSALS[1].recipient).callAsync()).to.bignumber.equal( | ||||
|                 GRANT_PROPOSALS[1].amount, | ||||
|             ); | ||||
|         }); | ||||
|     }); | ||||
|     describe('Default pool operator contract', () => { | ||||
|         it('Returns WETH to the staking proxy', async () => { | ||||
|             const wethAmount = new BigNumber(1337); | ||||
|             await weth.mint(wethAmount).awaitTransactionSuccessAsync(); | ||||
|             // Some amount of WETH ends up in the default pool operator | ||||
|             // contract, e.g. from errant staking rewards. | ||||
|             await weth.transfer(defaultPoolOperator.address, wethAmount).awaitTransactionSuccessAsync(); | ||||
|             // This function should send all the WETH to the staking proxy. | ||||
|             await defaultPoolOperator.returnStakingRewards().awaitTransactionSuccessAsync(); | ||||
|             expect(await weth.balanceOf(defaultPoolOperator.address).callAsync()).to.bignumber.equal(0); | ||||
|             expect(await weth.balanceOf(staking.address).callAsync()).to.bignumber.equal(wethAmount); | ||||
|         }); | ||||
|     }); | ||||
|     describe('Can update thresholds via proposal', () => { | ||||
|         it('Updates proposal and quorum thresholds', async () => { | ||||
|             // Delegator has enough ZRX to create and pass a proposal | ||||
|             await staking.stake(TREASURY_PARAMS.quorumThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, defaultPoolId), | ||||
|                     TREASURY_PARAMS.quorumThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const currentEpoch = await staking.currentEpoch().callAsync(); | ||||
|             const newProposalThreshold = new BigNumber(420); | ||||
|             const newQuorumThreshold = new BigNumber(1337); | ||||
|             const updateThresholdsAction = { | ||||
|                 target: treasury.address, | ||||
|                 data: treasury | ||||
|                     .updateThresholds(newProposalThreshold, newQuorumThreshold) | ||||
|                     .getABIEncodedTransactionData(), | ||||
|                 value: constants.ZERO_AMOUNT, | ||||
|             }; | ||||
|             const tx = treasury.propose( | ||||
|                 [updateThresholdsAction], | ||||
|                 currentEpoch.plus(3), | ||||
|                 `Updates proposal threshold to ${newProposalThreshold} and quorum threshold to ${newQuorumThreshold}`, | ||||
|                 [], | ||||
|             ); | ||||
|             const proposalId = await tx.callAsync({ from: delegator }); | ||||
|             await tx.awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await treasury.castVote(proposalId, true, []).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             await treasury | ||||
|                 .execute(proposalId, [updateThresholdsAction]) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             const proposalThreshold = await treasury.proposalThreshold().callAsync(); | ||||
|             const quorumThreshold = await treasury.quorumThreshold().callAsync(); | ||||
|             expect(proposalThreshold).to.bignumber.equal(newProposalThreshold); | ||||
|             expect(quorumThreshold).to.bignumber.equal(newQuorumThreshold); | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
							
								
								
									
										9
									
								
								contracts/treasury/test/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								contracts/treasury/test/wrappers.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| /* | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  * Warning: This file is auto-generated by contracts-gen. Don't edit manually. | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  */ | ||||
| export * from '../test/generated-wrappers/default_pool_operator'; | ||||
| export * from '../test/generated-wrappers/i_staking'; | ||||
| export * from '../test/generated-wrappers/i_zrx_treasury'; | ||||
| export * from '../test/generated-wrappers/zrx_treasury'; | ||||
							
								
								
									
										14
									
								
								contracts/treasury/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								contracts/treasury/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| { | ||||
|     "extends": "../../tsconfig", | ||||
|     "compilerOptions": { "outDir": "lib", "rootDir": ".", "resolveJsonModule": true }, | ||||
|     "include": ["./src/**/*", "./test/**/*", "./generated-wrappers/**/*"], | ||||
|     "files": [ | ||||
|         "generated-artifacts/DefaultPoolOperator.json", | ||||
|         "generated-artifacts/ZrxTreasury.json", | ||||
|         "test/generated-artifacts/DefaultPoolOperator.json", | ||||
|         "test/generated-artifacts/IStaking.json", | ||||
|         "test/generated-artifacts/IZrxTreasury.json", | ||||
|         "test/generated-artifacts/ZrxTreasury.json" | ||||
|     ], | ||||
|     "exclude": ["./deploy/solc/solc_bin"] | ||||
| } | ||||
							
								
								
									
										13
									
								
								contracts/treasury/tslint.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								contracts/treasury/tslint.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| { | ||||
|     "extends": ["@0x/tslint-config"], | ||||
|     "rules": { | ||||
|         "custom-no-magic-numbers": false, | ||||
|         "max-file-line-count": false, | ||||
|         "no-non-null-assertion": false, | ||||
|         "no-unnecessary-type-assertion": false, | ||||
|         "number-literal-format": false | ||||
|     }, | ||||
|     "linterOptions": { | ||||
|         "exclude": ["src/artifacts.ts", "test/artifacts.ts"] | ||||
|     } | ||||
| } | ||||
| @@ -1,4 +1,81 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "4.7.5-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|         "version": "4.7.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1612950500, | ||||
|         "version": "4.7.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1611648096, | ||||
|         "version": "4.7.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1610510890, | ||||
|         "version": "4.7.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "4.7.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add `LibSafeMathV06.safeDowncastToUint128()`", | ||||
|                 "pr": 97 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add SPDX license identifiers to solidity files", | ||||
|                 "pr": 105 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1609802516 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608692071, | ||||
|         "version": "4.6.5", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1608245516, | ||||
|         "version": "4.6.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1607485227, | ||||
|         "version": "4.6.3", | ||||
|   | ||||
| @@ -5,6 +5,39 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.7.5-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.4 - _February 24, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.3 - _February 10, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.2 - _January 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.1 - _January 13, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.0 - _January 4, 2021_ | ||||
|  | ||||
|     * Add `LibSafeMathV06.safeDowncastToUint128()` (#97) | ||||
|     * Add SPDX license identifiers to solidity files (#105) | ||||
|  | ||||
| ## v4.6.5 - _December 23, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.6.4 - _December 17, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.6.3 - _December 9, 2020_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2019 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
| @@ -187,4 +188,18 @@ library LibSafeMathV06 { | ||||
|     { | ||||
|         return a < b ? a : b; | ||||
|     } | ||||
|  | ||||
|     function safeDowncastToUint128(uint256 a) | ||||
|         internal | ||||
|         pure | ||||
|         returns (uint128) | ||||
|     { | ||||
|         if (a > type(uint128).max) { | ||||
|             LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256DowncastError( | ||||
|                 LibSafeMathRichErrorsV06.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128, | ||||
|                 a | ||||
|             )); | ||||
|         } | ||||
|         return uint128(a); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2019 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
| @@ -39,7 +40,8 @@ library LibSafeMathRichErrorsV06 { | ||||
|     enum DowncastErrorCodes { | ||||
|         VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32, | ||||
|         VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64, | ||||
|         VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96 | ||||
|         VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96, | ||||
|         VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128 | ||||
|     } | ||||
|  | ||||
|     // solhint-disable func-name-mixedcase | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-utils", | ||||
|     "version": "4.6.3", | ||||
|     "version": "4.7.5-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -50,15 +50,15 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.4.13", | ||||
|         "@0x/contracts-gen": "^2.0.24", | ||||
|         "@0x/contracts-test-utils": "^5.3.15", | ||||
|         "@0x/dev-utils": "^4.1.3", | ||||
|         "@0x/order-utils": "^10.4.10", | ||||
|         "@0x/sol-compiler": "^4.4.1", | ||||
|         "@0x/abi-gen": "^5.4.21", | ||||
|         "@0x/contracts-gen": "^2.0.32", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/dev-utils": "^4.2.1", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/web3-wrapper": "^7.3.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/bn.js": "^4.11.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -79,9 +79,9 @@ | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.2.14", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.1.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "bn.js": "^4.11.8", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|   | ||||
| @@ -8,3 +8,4 @@ | ||||
| # Blacklist tests in lib | ||||
| /lib/test/* | ||||
| # Package specific ignore | ||||
| /lib/scripts/* | ||||
|   | ||||
| @@ -1,4 +1,155 @@ | ||||
| [ | ||||
|     { | ||||
|         "version": "0.20.0-multiplex", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add `MooniswapLiquidityProvider`", | ||||
|                 "pr": 143 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Emit `LiquidityProviderFill` event in `CurveLiquidityProvider`", | ||||
|                 "pr": 143 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add BatchFillNativeOrdersFeature and MultiplexFeature", | ||||
|                 "pr": 140 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Export MultiplexFeatureContract", | ||||
|                 "pr": 168 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1615932869 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.19.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add `CurveLiquidityProvider` and misc refactors", | ||||
|                 "pr": 127 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Export `CurveLiquidityProviderContract`", | ||||
|                 "pr": 144 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add `DodoV2`", | ||||
|                 "pr": 152 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add `Linkswap`", | ||||
|                 "pr": 153 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "refund ETH with no gas limit in FQT", | ||||
|                 "pr": 155 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Added an opt-in `PositiveSlippageAffiliateFee`", | ||||
|                 "pr": 101 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1614141718 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.18.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Update FQT for v4 native orders", | ||||
|                 "pr": 104 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1612950500 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.18.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Swallow reverts in `batchGetLimitOrderRelevantStates()` and `batchGetRfqOrderRelevantStates()`", | ||||
|                 "pr": 117 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1611648096 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.18.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Use consistent returndatasize checks in UniswapFeature", | ||||
|                 "pr": 96 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Remove `MetaTransactionsFeature._executeMetaTransaction()` and `SignatureValidatorFeature`", | ||||
|                 "pr": 109 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1610510890 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.17.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add DevUtils-like functions to `NativeOrdersFeature`", | ||||
|                 "pr": 97 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add SPDX license identifiers to solidity files", | ||||
|                 "pr": 105 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1609802516 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.16.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Fix CryptoCom rollup" | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1608692071 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.15.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add MixinBancor to BridgeAdapter", | ||||
|                 "pr": 91 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add MixinCoFiX to BridgeAdapter", | ||||
|                 "pr": 92 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1608245516 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.14.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Use the `MetaTransaction` class from `@0x/protocol-utils` in tests.", | ||||
|                 "pr": 90 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1608149382 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.13.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Address audit feedback in UniswapFeature", | ||||
|                 "pr": 82 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Always transfer `msg.value` to the liquidity provider contract in LiquidityProviderFeature to", | ||||
|                 "pr": 82 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Remove backwards compatibility with old PLP/bridge interface in `LiquidityProviderFeature` and `MixinZeroExBridge`", | ||||
|                 "pr": 85 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1608105788 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.12.0", | ||||
|         "changes": [ | ||||
|   | ||||
| @@ -5,6 +5,59 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v0.20.0-multiplex - _March 16, 2021_ | ||||
|  | ||||
|     * Add `MooniswapLiquidityProvider` (#143) | ||||
|     * Emit `LiquidityProviderFill` event in `CurveLiquidityProvider` (#143) | ||||
|     * Add BatchFillNativeOrdersFeature and MultiplexFeature (#140) | ||||
|     * Export MultiplexFeatureContract (#168) | ||||
|  | ||||
| ## v0.19.0 - _February 24, 2021_ | ||||
|  | ||||
|     * Add `CurveLiquidityProvider` and misc refactors (#127) | ||||
|     * Export `CurveLiquidityProviderContract` (#144) | ||||
|     * Add `DodoV2` (#152) | ||||
|     * Add `Linkswap` (#153) | ||||
|     * refund ETH with no gas limit in FQT (#155) | ||||
|     * Added an opt-in `PositiveSlippageAffiliateFee` (#101) | ||||
|  | ||||
| ## v0.18.2 - _February 10, 2021_ | ||||
|  | ||||
|     * Update FQT for v4 native orders (#104) | ||||
|  | ||||
| ## v0.18.1 - _January 26, 2021_ | ||||
|  | ||||
|     * Swallow reverts in `batchGetLimitOrderRelevantStates()` and `batchGetRfqOrderRelevantStates()` (#117) | ||||
|  | ||||
| ## v0.18.0 - _January 13, 2021_ | ||||
|  | ||||
|     * Use consistent returndatasize checks in UniswapFeature (#96) | ||||
|     * Remove `MetaTransactionsFeature._executeMetaTransaction()` and `SignatureValidatorFeature` (#109) | ||||
|  | ||||
| ## v0.17.0 - _January 4, 2021_ | ||||
|  | ||||
|     * Add DevUtils-like functions to `NativeOrdersFeature` (#97) | ||||
|     * Add SPDX license identifiers to solidity files (#105) | ||||
|  | ||||
| ## v0.16.0 - _December 23, 2020_ | ||||
|  | ||||
|     * Fix CryptoCom rollup | ||||
|  | ||||
| ## v0.15.0 - _December 17, 2020_ | ||||
|  | ||||
|     * Add MixinBancor to BridgeAdapter (#91) | ||||
|     * Add MixinCoFiX to BridgeAdapter (#92) | ||||
|  | ||||
| ## v0.14.0 - _December 16, 2020_ | ||||
|  | ||||
|     * Use the `MetaTransaction` class from `@0x/protocol-utils` in tests. (#90) | ||||
|  | ||||
| ## v0.13.0 - _December 16, 2020_ | ||||
|  | ||||
|     * Address audit feedback in UniswapFeature (#82) | ||||
|     * Always transfer `msg.value` to the liquidity provider contract in LiquidityProviderFeature to (#82) | ||||
|     * Remove backwards compatibility with old PLP/bridge interface in `LiquidityProviderFeature` and `MixinZeroExBridge` (#85) | ||||
|  | ||||
| ## v0.12.0 - _December 9, 2020_ | ||||
|  | ||||
|     * Add test for selector collisions on the proxy (#74) | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| ## ERC20BridgeSampler | ||||
| ## ZeroEx (ExchangeProxy) | ||||
|  | ||||
| This package contains contracts contracts for the ZeroEx extensible contract architecture. | ||||
| This package contains contracts for the ZeroEx extensible contract architecture. | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
| @@ -19,15 +20,16 @@ | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./features/IOwnableFeature.sol"; | ||||
| import "./features/ISimpleFunctionRegistryFeature.sol"; | ||||
| import "./features/ITokenSpenderFeature.sol"; | ||||
| import "./features/ISignatureValidatorFeature.sol"; | ||||
| import "./features/ITransformERC20Feature.sol"; | ||||
| import "./features/IMetaTransactionsFeature.sol"; | ||||
| import "./features/IUniswapFeature.sol"; | ||||
| import "./features/ILiquidityProviderFeature.sol"; | ||||
| import "./features/INativeOrdersFeature.sol"; | ||||
| import "./features/interfaces/IOwnableFeature.sol"; | ||||
| import "./features/interfaces/ISimpleFunctionRegistryFeature.sol"; | ||||
| import "./features/interfaces/ITokenSpenderFeature.sol"; | ||||
| import "./features/interfaces/ITransformERC20Feature.sol"; | ||||
| import "./features/interfaces/IMetaTransactionsFeature.sol"; | ||||
| import "./features/interfaces/IUniswapFeature.sol"; | ||||
| import "./features/interfaces/ILiquidityProviderFeature.sol"; | ||||
| import "./features/interfaces/INativeOrdersFeature.sol"; | ||||
| import "./features/interfaces/IBatchFillNativeOrdersFeature.sol"; | ||||
| import "./features/interfaces/IMultiplexFeature.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev Interface for a fully featured Exchange Proxy. | ||||
| @@ -35,12 +37,13 @@ interface IZeroEx is | ||||
|     IOwnableFeature, | ||||
|     ISimpleFunctionRegistryFeature, | ||||
|     ITokenSpenderFeature, | ||||
|     ISignatureValidatorFeature, | ||||
|     ITransformERC20Feature, | ||||
|     IMetaTransactionsFeature, | ||||
|     IUniswapFeature, | ||||
|     ILiquidityProviderFeature, | ||||
|     INativeOrdersFeature | ||||
|     INativeOrdersFeature, | ||||
|     IBatchFillNativeOrdersFeature, | ||||
|     IMultiplexFeature | ||||
| { | ||||
|     // solhint-disable state-visibility | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user