Compare commits
	
		
			5 Commits
		
	
	
		
			@0x/protoc
			...
			@0x/contra
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 2a6d66cc2a | ||
|  | b02992a373 | ||
|  | 92ad924965 | ||
|  | 138383e95c | ||
|  | 0487cb7d39 | 
| @@ -1,25 +1,25 @@ | ||||
| version: 2.1 | ||||
| version: 2 | ||||
|  | ||||
| jobs: | ||||
|     build: | ||||
|         resource_class: xlarge | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         environment: | ||||
|             NODE_OPTIONS: '--max-old-space-size=16384' | ||||
|             CONTRACTS_COMMIT_HASH: '9ed05f5' | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - checkout | ||||
|             - run: echo 'export PATH=$HOME/CIRCLE_PROJECT_REPONAME/node_modules/.bin:$PATH' >> $BASH_ENV | ||||
|             - run: | ||||
|                   name: install-yarn | ||||
|                   command: npm install --force --global yarn@1.22.0 | ||||
|                   command: npm install --force --global yarn@1.17.0 | ||||
|             - run: | ||||
|                   name: yarn | ||||
|                   command: yarn --frozen-lockfile --ignore-engines install || yarn --frozen-lockfile --ignore-engines install | ||||
|             - setup_remote_docker | ||||
|             - run: yarn build:ci || yarn build:ci || yarn build:ci | ||||
|             - run: yarn build:ts || yarn build:ts || yarn build:ts | ||||
|             - run: yarn build:ci | ||||
|             - run: yarn build:ts | ||||
|             - save_cache: | ||||
|                   key: repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                   paths: | ||||
| @@ -31,59 +31,57 @@ jobs: | ||||
|     test-exchange-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun -p @0x/contracts-exchange -m --serial -c test:circleci | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-exchange | ||||
|     test-integrations-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun -p @0x/contracts-integrations -m --serial -c test:circleci | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-integrations | ||||
|     test-contracts-staking-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun -p @0x/contracts-staking -m --serial -c test:circleci | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-staking | ||||
|     test-contracts-extra-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun -p @0x/contracts-exchange-forwarder -p @0x/contracts-coordinator -m --serial -c test:circleci | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-exchange-forwarder @0x/contracts-coordinator | ||||
|     test-contracts-rest-ganache: | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun -p @0x/contracts-multisig -p @0x/contracts-utils -p @0x/contracts-exchange-libs -p  @0x/contracts-erc20 -p @0x/contracts-erc721 -p @0x/contracts-erc1155 -p @0x/contracts-asset-proxy -p @0x/contracts-broker -p @0x/contracts-zero-ex -m --serial -c test:circleci | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-multisig @0x/contracts-utils @0x/contracts-exchange-libs @0x/contracts-erc20 @0x/contracts-erc721 @0x/contracts-erc1155 @0x/contracts-asset-proxy @0x/contracts-broker @0x/contracts-zero-ex | ||||
|     test-publish: | ||||
|         resource_class: large | ||||
|         environment: | ||||
|             NODE_OPTIONS: '--max-old-space-size=6442' | ||||
|         resource_class: medium+ | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|             - image: 0xorg/verdaccio | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
| @@ -97,7 +95,7 @@ jobs: | ||||
|                   path: ~/.npm/_logs | ||||
|     test-doc-generation: | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
| @@ -108,18 +106,18 @@ jobs: | ||||
|                   no_output_timeout: 1200 | ||||
|     test-rest: | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
|                       - repo-{{ .Environment.CIRCLE_SHA1 }} | ||||
|             - run: yarn wsrun -p @0x/contracts-test-utils -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/contract-artifacts -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/contract-wrappers-test -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/migrations -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/order-utils -m --serial -c test:circleci | ||||
|             - run: yarn wsrun -p @0x/asset-swapper -m --serial -c test:circleci | ||||
|             - run: yarn wsrun test:circleci @0x/contracts-test-utils | ||||
|             - run: yarn wsrun test:circleci @0x/contract-artifacts | ||||
|             - run: yarn wsrun test:circleci @0x/contract-wrappers-test | ||||
|             - run: yarn wsrun test:circleci @0x/migrations | ||||
|             - run: yarn wsrun test:circleci @0x/order-utils | ||||
|             - run: yarn wsrun test:circleci @0x/asset-swapper | ||||
|             - save_cache: | ||||
|                   key: coverage-contract-wrappers-test-{{ .Environment.CIRCLE_SHA1 }} | ||||
|                   paths: | ||||
| @@ -136,7 +134,7 @@ jobs: | ||||
|         resource_class: large | ||||
|         working_directory: ~/repo | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|                   keys: | ||||
| @@ -147,7 +145,7 @@ jobs: | ||||
|             - run: yarn diff_md_docs:ci | ||||
|     submit-coverage: | ||||
|         docker: | ||||
|             - image: node:12 | ||||
|             - image: nikolaik/python-nodejs:python3.7-nodejs10 | ||||
|         working_directory: ~/repo | ||||
|         steps: | ||||
|             - restore_cache: | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.7.12", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.7.11", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.7.10", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.7.9", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.7.8", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.7.8-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.7.12 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.11 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.10 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.9 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.7.8 - _March 17, 2021_ | ||||
| ## v3.7.8-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-asset-proxy", | ||||
|     "version": "3.7.12", | ||||
|     "version": "3.7.8-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -51,15 +51,15 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/protocol", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contract-wrappers": "^13.16.2", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -67,7 +67,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
|         "npm-run-all": "^4.1.2", | ||||
| @@ -76,20 +76,20 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-erc1155": "^2.1.30", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-erc721": "^3.1.30", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.30", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "@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.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
							
								
								
									
										354
									
								
								contracts/asset-proxy/test/dex_forwarder_bridge.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										354
									
								
								contracts/asset-proxy/test/dex_forwarder_bridge.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,354 @@ | ||||
| import { ContractTxFunctionObj } from '@0x/contract-wrappers'; | ||||
| import { | ||||
|     blockchainTests, | ||||
|     constants, | ||||
|     expect, | ||||
|     filterLogsToArguments, | ||||
|     getRandomInteger, | ||||
|     randomAddress, | ||||
|     shortZip, | ||||
| } from '@0x/contracts-test-utils'; | ||||
| import { BigNumber, hexUtils, NULL_ADDRESS } from '@0x/utils'; | ||||
| import { DecodedLogs } from 'ethereum-types'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { DexForwarderBridgeCall, dexForwarderBridgeDataEncoder } from '../src/dex_forwarder_bridge'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
| import { | ||||
|     TestDexForwarderBridgeBridgeTransferFromCalledEventArgs as BtfCalledEventArgs, | ||||
|     TestDexForwarderBridgeContract, | ||||
|     TestDexForwarderBridgeEvents as TestEvents, | ||||
| } from './wrappers'; | ||||
|  | ||||
| const { ZERO_AMOUNT } = constants; | ||||
|  | ||||
| blockchainTests.resets('DexForwarderBridge unit tests', env => { | ||||
|     let testContract: TestDexForwarderBridgeContract; | ||||
|     let inputToken: string; | ||||
|     let outputToken: string; | ||||
|     const BRIDGE_SUCCESS = '0xdc1600f3'; | ||||
|     const BRIDGE_FAILURE = '0xffffffff'; | ||||
|     const BRIDGE_REVERT_ERROR = 'oopsie'; | ||||
|     const NOT_AUTHORIZED_REVERT = 'DexForwarderBridge/SENDER_NOT_AUTHORIZED'; | ||||
|     const DEFAULTS = { | ||||
|         toAddress: randomAddress(), | ||||
|     }; | ||||
|  | ||||
|     before(async () => { | ||||
|         testContract = await TestDexForwarderBridgeContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.TestDexForwarderBridge, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             artifacts, | ||||
|         ); | ||||
|         // Create test tokens. | ||||
|         [inputToken, outputToken] = [ | ||||
|             await callAndTransactAsync(testContract.createToken()), | ||||
|             await callAndTransactAsync(testContract.createToken()), | ||||
|         ]; | ||||
|         await callAndTransactAsync(testContract.setAuthorized(env.txDefaults.from as string)); | ||||
|     }); | ||||
|  | ||||
|     async function callAndTransactAsync<TResult>(fnCall: ContractTxFunctionObj<TResult>): Promise<TResult> { | ||||
|         const result = await fnCall.callAsync(); | ||||
|         await fnCall.awaitTransactionSuccessAsync({}, { shouldValidate: false }); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     function getRandomBridgeCall( | ||||
|         bridgeAddress: string, | ||||
|         fields: Partial<DexForwarderBridgeCall> = {}, | ||||
|     ): DexForwarderBridgeCall { | ||||
|         return { | ||||
|             target: bridgeAddress, | ||||
|             inputTokenAmount: getRandomInteger(1, '100e18'), | ||||
|             outputTokenAmount: getRandomInteger(1, '100e18'), | ||||
|             bridgeData: hexUtils.leftPad(inputToken), | ||||
|             ...fields, | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     describe('bridgeTransferFrom()', () => { | ||||
|         let goodBridgeCalls: DexForwarderBridgeCall[]; | ||||
|         let revertingBridgeCall: DexForwarderBridgeCall; | ||||
|         let failingBridgeCall: DexForwarderBridgeCall; | ||||
|         let allBridgeCalls: DexForwarderBridgeCall[]; | ||||
|         let totalFillableOutputAmount: BigNumber; | ||||
|         let totalFillableInputAmount: BigNumber; | ||||
|         let recipientOutputBalance: BigNumber; | ||||
|  | ||||
|         beforeEach(async () => { | ||||
|             goodBridgeCalls = []; | ||||
|             for (let i = 0; i < 4; ++i) { | ||||
|                 goodBridgeCalls.push(await createBridgeCallAsync({ returnCode: BRIDGE_SUCCESS })); | ||||
|             } | ||||
|             revertingBridgeCall = await createBridgeCallAsync({ revertError: BRIDGE_REVERT_ERROR }); | ||||
|             failingBridgeCall = await createBridgeCallAsync({ returnCode: BRIDGE_FAILURE }); | ||||
|             allBridgeCalls = _.shuffle([failingBridgeCall, revertingBridgeCall, ...goodBridgeCalls]); | ||||
|  | ||||
|             totalFillableInputAmount = BigNumber.sum(...goodBridgeCalls.map(c => c.inputTokenAmount)); | ||||
|             totalFillableOutputAmount = BigNumber.sum(...goodBridgeCalls.map(c => c.outputTokenAmount)); | ||||
|  | ||||
|             // Grant the taker some output tokens. | ||||
|             await testContract.setTokenBalance( | ||||
|                 outputToken, | ||||
|                 DEFAULTS.toAddress, | ||||
|                 (recipientOutputBalance = getRandomInteger(1, '100e18')), | ||||
|             ); | ||||
|         }); | ||||
|  | ||||
|         async function setForwarderInputBalanceAsync(amount: BigNumber): Promise<void> { | ||||
|             await testContract | ||||
|                 .setTokenBalance(inputToken, testContract.address, amount) | ||||
|                 .awaitTransactionSuccessAsync({}, { shouldValidate: false }); | ||||
|         } | ||||
|  | ||||
|         async function createBridgeCallAsync( | ||||
|             opts: Partial<{ | ||||
|                 returnCode: string; | ||||
|                 revertError: string; | ||||
|                 callFields: Partial<DexForwarderBridgeCall>; | ||||
|                 outputFillAmount: BigNumber; | ||||
|             }>, | ||||
|         ): Promise<DexForwarderBridgeCall> { | ||||
|             const { returnCode, revertError, callFields, outputFillAmount } = { | ||||
|                 returnCode: BRIDGE_SUCCESS, | ||||
|                 revertError: '', | ||||
|                 ...opts, | ||||
|             }; | ||||
|             const bridge = await callAndTransactAsync(testContract.createBridge(returnCode, revertError)); | ||||
|             const call = getRandomBridgeCall(bridge, callFields); | ||||
|             await testContract | ||||
|                 .setBridgeTransferAmount(call.target, outputFillAmount || call.outputTokenAmount) | ||||
|                 .awaitTransactionSuccessAsync({}, { shouldValidate: false }); | ||||
|             return call; | ||||
|         } | ||||
|  | ||||
|         async function callBridgeTransferFromAsync(opts: { | ||||
|             bridgeData: string; | ||||
|             sellAmount?: BigNumber; | ||||
|             buyAmount?: BigNumber; | ||||
|         }): Promise<DecodedLogs> { | ||||
|             // Fund the forwarder with input tokens to sell. | ||||
|             await setForwarderInputBalanceAsync(opts.sellAmount || totalFillableInputAmount); | ||||
|             const call = testContract.bridgeTransferFrom( | ||||
|                 outputToken, | ||||
|                 testContract.address, | ||||
|                 DEFAULTS.toAddress, | ||||
|                 opts.buyAmount || totalFillableOutputAmount, | ||||
|                 opts.bridgeData, | ||||
|             ); | ||||
|             const returnCode = await call.callAsync(); | ||||
|             if (returnCode !== BRIDGE_SUCCESS) { | ||||
|                 throw new Error('Expected BRIDGE_SUCCESS'); | ||||
|             } | ||||
|             const receipt = await call.awaitTransactionSuccessAsync({}, { shouldValidate: false }); | ||||
|             // tslint:disable-next-line: no-unnecessary-type-assertion | ||||
|             return receipt.logs as DecodedLogs; | ||||
|         } | ||||
|  | ||||
|         it('succeeds with no bridge calls and no input balance', async () => { | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls: [], | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData, sellAmount: ZERO_AMOUNT }); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds with bridge calls and no input balance', async () => { | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls: allBridgeCalls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData, sellAmount: ZERO_AMOUNT }); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds with no bridge calls and an input balance', async () => { | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls: [], | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ | ||||
|                 bridgeData, | ||||
|                 sellAmount: new BigNumber(1), | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds if entire input token balance is not consumed', async () => { | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls: allBridgeCalls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ | ||||
|                 bridgeData, | ||||
|                 sellAmount: totalFillableInputAmount.plus(1), | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         it('fails if not authorized', async () => { | ||||
|             const calls = goodBridgeCalls.slice(0, 1); | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callAndTransactAsync(testContract.setAuthorized(NULL_ADDRESS)); | ||||
|             return expect(callBridgeTransferFromAsync({ bridgeData, sellAmount: new BigNumber(1) })).to.revertWith( | ||||
|                 NOT_AUTHORIZED_REVERT, | ||||
|             ); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds with one bridge call', async () => { | ||||
|             const calls = goodBridgeCalls.slice(0, 1); | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData, sellAmount: calls[0].inputTokenAmount }); | ||||
|         }); | ||||
|  | ||||
|         it('succeeds with many bridge calls', async () => { | ||||
|             const calls = goodBridgeCalls; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData }); | ||||
|         }); | ||||
|  | ||||
|         it('swallows a failing bridge call', async () => { | ||||
|             const calls = _.shuffle([...goodBridgeCalls, failingBridgeCall]); | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData }); | ||||
|         }); | ||||
|  | ||||
|         it('consumes input tokens for output tokens', async () => { | ||||
|             const calls = allBridgeCalls; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const currentBridgeInputBalance = await testContract | ||||
|                 .balanceOf(inputToken, testContract.address) | ||||
|                 .callAsync(); | ||||
|             expect(currentBridgeInputBalance).to.bignumber.eq(0); | ||||
|             const currentRecipientOutputBalance = await testContract | ||||
|                 .balanceOf(outputToken, DEFAULTS.toAddress) | ||||
|                 .callAsync(); | ||||
|             expect(currentRecipientOutputBalance).to.bignumber.eq(totalFillableOutputAmount); | ||||
|         }); | ||||
|  | ||||
|         it("transfers only up to each call's input amount to each bridge", async () => { | ||||
|             const calls = goodBridgeCalls; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             for (const [call, btf] of shortZip(goodBridgeCalls, btfs)) { | ||||
|                 expect(btf.inputTokenBalance).to.bignumber.eq(call.inputTokenAmount); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         it('transfers only up to outstanding sell amount to each bridge', async () => { | ||||
|             // Prepend an extra bridge call. | ||||
|             const calls = [ | ||||
|                 await createBridgeCallAsync({ | ||||
|                     callFields: { | ||||
|                         inputTokenAmount: new BigNumber(1), | ||||
|                         outputTokenAmount: new BigNumber(1), | ||||
|                     }, | ||||
|                 }), | ||||
|                 ...goodBridgeCalls, | ||||
|             ]; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             expect(btfs).to.be.length(goodBridgeCalls.length + 1); | ||||
|             // The last call will receive 1 less token. | ||||
|             const lastCall = calls.slice(-1)[0]; | ||||
|             const lastBtf = btfs.slice(-1)[0]; | ||||
|             expect(lastBtf.inputTokenBalance).to.bignumber.eq(lastCall.inputTokenAmount.minus(1)); | ||||
|         }); | ||||
|  | ||||
|         it('recoups funds from a bridge that fails', async () => { | ||||
|             // Prepend a call that will take the whole input amount but will | ||||
|             // fail. | ||||
|             const badCall = await createBridgeCallAsync({ | ||||
|                 callFields: { inputTokenAmount: totalFillableInputAmount }, | ||||
|                 returnCode: BRIDGE_FAILURE, | ||||
|             }); | ||||
|             const calls = [badCall, ...goodBridgeCalls]; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             expect(btfs).to.be.length(goodBridgeCalls.length); | ||||
|         }); | ||||
|  | ||||
|         it('recoups funds from a bridge that reverts', async () => { | ||||
|             // Prepend a call that will take the whole input amount but will | ||||
|             // revert. | ||||
|             const badCall = await createBridgeCallAsync({ | ||||
|                 callFields: { inputTokenAmount: totalFillableInputAmount }, | ||||
|                 revertError: BRIDGE_REVERT_ERROR, | ||||
|             }); | ||||
|             const calls = [badCall, ...goodBridgeCalls]; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             expect(btfs).to.be.length(goodBridgeCalls.length); | ||||
|         }); | ||||
|  | ||||
|         it('recoups funds from a bridge that under-pays', async () => { | ||||
|             // Prepend a call that will take the whole input amount but will | ||||
|             // underpay the output amount.. | ||||
|             const badCall = await createBridgeCallAsync({ | ||||
|                 callFields: { | ||||
|                     inputTokenAmount: totalFillableInputAmount, | ||||
|                     outputTokenAmount: new BigNumber(2), | ||||
|                 }, | ||||
|                 outputFillAmount: new BigNumber(1), | ||||
|             }); | ||||
|             const calls = [badCall, ...goodBridgeCalls]; | ||||
|             const bridgeData = dexForwarderBridgeDataEncoder.encode({ | ||||
|                 inputToken, | ||||
|                 calls, | ||||
|             }); | ||||
|             const logs = await callBridgeTransferFromAsync({ bridgeData }); | ||||
|             const btfs = filterLogsToArguments<BtfCalledEventArgs>(logs, TestEvents.BridgeTransferFromCalled); | ||||
|             expect(btfs).to.be.length(goodBridgeCalls.length); | ||||
|         }); | ||||
|     }); | ||||
|  | ||||
|     describe('executeBridgeCall()', () => { | ||||
|         it('cannot be called externally', async () => { | ||||
|             return expect( | ||||
|                 testContract | ||||
|                     .executeBridgeCall( | ||||
|                         randomAddress(), | ||||
|                         randomAddress(), | ||||
|                         randomAddress(), | ||||
|                         randomAddress(), | ||||
|                         new BigNumber(1), | ||||
|                         new BigNumber(1), | ||||
|                         constants.NULL_BYTES, | ||||
|                     ) | ||||
|                     .callAsync(), | ||||
|             ).to.revertWith('DexForwarderBridge/ONLY_SELF'); | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
| @@ -168,7 +168,7 @@ describe('StaticCallProxy', () => { | ||||
|         it('should revert if the hash of the output is different than expected expected', async () => { | ||||
|             const staticCallData = staticCallTarget.isOddNumber(new BigNumber(0)).getABIEncodedTransactionData(); | ||||
|             const trueAsBuffer = ethUtil.toBuffer('0x0000000000000000000000000000000000000000000000000000000000000001'); | ||||
|             const expectedResultHash = ethUtil.bufferToHex(ethUtil.keccak256(trueAsBuffer)); | ||||
|             const expectedResultHash = ethUtil.bufferToHex(ethUtil.sha3(trueAsBuffer)); | ||||
|             const assetData = assetDataInterface | ||||
|                 .StaticCall(staticCallTarget.address, staticCallData, expectedResultHash) | ||||
|                 .getABIEncodedTransactionData(); | ||||
| @@ -199,7 +199,7 @@ describe('StaticCallProxy', () => { | ||||
|         it('should be successful if a function call with one static input returns the correct value', async () => { | ||||
|             const staticCallData = staticCallTarget.isOddNumber(new BigNumber(1)).getABIEncodedTransactionData(); | ||||
|             const trueAsBuffer = ethUtil.toBuffer('0x0000000000000000000000000000000000000000000000000000000000000001'); | ||||
|             const expectedResultHash = ethUtil.bufferToHex(ethUtil.keccak256(trueAsBuffer)); | ||||
|             const expectedResultHash = ethUtil.bufferToHex(ethUtil.sha3(trueAsBuffer)); | ||||
|             const assetData = assetDataInterface | ||||
|                 .StaticCall(staticCallTarget.address, staticCallData, expectedResultHash) | ||||
|                 .getABIEncodedTransactionData(); | ||||
| @@ -232,7 +232,7 @@ describe('StaticCallProxy', () => { | ||||
|             const offset = '0000000000000000000000000000000000000000000000000000000000000020'; | ||||
|             const encodedExpectedResultWithOffset = `0x${offset}${abiEncoder.encode(expectedResults).slice(2)}`; | ||||
|             const expectedResultHash = ethUtil.bufferToHex( | ||||
|                 ethUtil.keccak256(ethUtil.toBuffer(encodedExpectedResultWithOffset)), | ||||
|                 ethUtil.sha3(ethUtil.toBuffer(encodedExpectedResultWithOffset)), | ||||
|             ); | ||||
|             const assetData = assetDataInterface | ||||
|                 .StaticCall(staticCallTarget.address, staticCallData, expectedResultHash) | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "1.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "1.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "1.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "1.1.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "1.1.26", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "1.1.26-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.1.30 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.29 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.28 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.27 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.26 - _March 17, 2021_ | ||||
| ## v1.1.26-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-broker", | ||||
|     "version": "1.1.30", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-erc721": "^3.1.30", | ||||
|         "@0x/contracts-exchange": "^3.2.31", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.30", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -81,14 +81,14 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/order-utils": "^10.4.18-multiplex.0", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.1.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.1.27", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.1.27-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.1.31 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.30 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.29 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.28 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.27 - _March 17, 2021_ | ||||
| ## v3.1.27-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-coordinator", | ||||
|     "version": "3.1.31", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-dev-utils": "^1.3.29", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -79,20 +79,20 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.27", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contract-addresses": "^6.2.0", | ||||
|         "@0x/contracts-exchange": "^3.2.31", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/json-schemas": "^6.1.3", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "@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.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "http-status-codes": "^1.3.2" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,4 +1,8 @@ | ||||
| import { assert as sharedAssert } from '@0x/assert'; | ||||
| // HACK: We need those two unused imports because they're actually used by sharedAssert which gets injected here | ||||
| import { Schema } from '@0x/json-schemas'; // tslint:disable-line:no-unused-variable | ||||
| import { Order } from '@0x/types'; // tslint:disable-line:no-unused-variable | ||||
| import { BigNumber } from '@0x/utils'; // tslint:disable-line:no-unused-variable | ||||
| import { Web3Wrapper } from '@0x/web3-wrapper'; | ||||
|  | ||||
| export const assert = { | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "1.3.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "1.3.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "1.3.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "1.3.26", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "1.3.25", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "1.3.25-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.3.29 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.28 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.27 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.26 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.3.25 - _March 17, 2021_ | ||||
| ## v1.3.25-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-dev-utils", | ||||
|     "version": "1.3.29", | ||||
|     "version": "1.3.25-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -41,18 +41,18 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/dev-utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/assert": "^3.0.27", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethers": "~4.0.4", | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "shx": "^0.2.2", | ||||
| @@ -60,10 +60,10 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@types/node": "12.12.54" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "2.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "2.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "2.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "2.1.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "2.1.26", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "2.1.26-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v2.1.30 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.29 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.28 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.27 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.1.26 - _March 17, 2021_ | ||||
| ## v2.1.26-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc1155", | ||||
|     "version": "2.1.30", | ||||
|     "version": "2.1.26-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -52,15 +52,15 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -68,7 +68,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
|         "npm-run-all": "^4.1.2", | ||||
| @@ -77,13 +77,13 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@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,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.3.9", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.3.8", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.3.7", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.3.6", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.3.5", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.3.5-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.3.9 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.8 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.7 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.6 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.3.5 - _March 17, 2021_ | ||||
| ## v3.3.5-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc20", | ||||
|     "version": "3.3.9", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -70,7 +70,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -79,10 +79,10 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0" | ||||
|         "@0x/base-contract": "^6.2.18" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -39,8 +39,8 @@ describe('EtherToken', () => { | ||||
|             artifacts.WETH9, | ||||
|             provider, | ||||
|             { | ||||
|                 ...txDefaults, | ||||
|                 gasPrice, | ||||
|                 ...txDefaults, | ||||
|             }, | ||||
|             artifacts, | ||||
|         ); | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.1.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.1.26", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.1.26-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.1.30 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.29 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.28 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.27 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.1.26 - _March 17, 2021_ | ||||
| ## v3.1.26-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-erc721", | ||||
|     "version": "3.1.30", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -71,7 +71,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -81,10 +81,10 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0" | ||||
|         "@0x/base-contract": "^6.2.18" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "4.2.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "4.2.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "4.2.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "4.2.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "4.2.27", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "4.2.27-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.2.31 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.30 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.29 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.28 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.2.27 - _March 17, 2021_ | ||||
| ## v4.2.27-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange-forwarder", | ||||
|     "version": "4.2.31", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-dev-utils": "^1.3.29", | ||||
|         "@0x/contracts-erc1155": "^2.1.30", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-erc721": "^3.1.30", | ||||
|         "@0x/contracts-exchange": "^3.2.31", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.30", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@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", | ||||
| @@ -87,12 +87,12 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "4.3.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "4.3.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "4.3.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "4.3.27", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "4.3.26", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "4.3.26-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.3.30 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.29 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.28 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.27 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.3.26 - _March 17, 2021_ | ||||
| ## v4.3.26-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange-libs", | ||||
|     "version": "4.3.30", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/subproviders": "^6.5.3", | ||||
|         "@0x/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.4", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -67,7 +67,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -77,17 +77,17 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|         "@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.2.0", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "3.2.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "3.2.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "3.2.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "3.2.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "3.2.27", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "3.2.27-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v3.2.31 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.30 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.29 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.28 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v3.2.27 - _March 17, 2021_ | ||||
| ## v3.2.27-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-exchange", | ||||
|     "version": "3.2.31", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.30", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-multisig": "^4.1.31", | ||||
|         "@0x/contracts-staking": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -74,8 +74,8 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "js-combinatorics": "^0.5.3", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -85,16 +85,16 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-dev-utils": "^1.3.29", | ||||
|         "@0x/contracts-erc1155": "^2.1.30", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-erc721": "^3.1.30", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@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": { | ||||
|   | ||||
| @@ -86,7 +86,7 @@ blockchainTests.resets('MixinSignatureValidator', env => { | ||||
|  | ||||
|     const SIGNATURE_LENGTH = 65; | ||||
|     const generateRandomSignature = (): string => hexUtils.random(SIGNATURE_LENGTH); | ||||
|     const hashBytes = (bytesHex: string): string => hexUtils.hash(bytesHex); | ||||
|     const hashBytes = (bytesHex: string): string => ethUtil.bufferToHex(ethUtil.sha3(ethUtil.toBuffer(bytesHex))); | ||||
|     const signDataHex = (dataHex: string, privateKey: Buffer): string => { | ||||
|         const ecSignature = ethUtil.ecsign(ethUtil.toBuffer(dataHex), privateKey); | ||||
|         return hexUtils.concat(ecSignature.v, ecSignature.r, ecSignature.s); | ||||
|   | ||||
| @@ -12,12 +12,12 @@ export abstract class AbstractBalanceAndProxyAllowanceFetcher { | ||||
|      * @param userAddress Ethereum address for which to fetch the balance | ||||
|      * @return Balance amount in base units | ||||
|      */ | ||||
|     public abstract getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     /** | ||||
|      * Get the 0x asset proxy allowance of assetData for userAddress | ||||
|      * @param assetData AssetData for which to fetch the allowance | ||||
|      * @param userAddress Ethereum address for which to fetch the allowance | ||||
|      * @return Allowance amount in base units | ||||
|      */ | ||||
|     public abstract getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| import { BigNumber } from '@0x/utils'; | ||||
|  | ||||
| export abstract class AbstractBalanceAndProxyAllowanceLazyStore { | ||||
|     public abstract getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>; | ||||
|     public abstract setBalance(assetData: string, userAddress: string, balance: BigNumber): void; | ||||
|     public abstract deleteBalance(assetData: string, userAddress: string): void; | ||||
|     public abstract setProxyAllowance(assetData: string, userAddress: string, proxyAllowance: BigNumber): void; | ||||
|   | ||||
| @@ -11,5 +11,5 @@ export abstract class AbstractOrderFilledCancelledFetcher { | ||||
|      * @param orderHash OrderHash of order we are interested in | ||||
|      * @return FilledTakerAmount | ||||
|      */ | ||||
|     public abstract getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>; | ||||
|     public abstract async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>; | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import { BigNumber } from '@0x/utils'; | ||||
|  | ||||
| export abstract class AbstractOrderFilledCancelledLazyStore { | ||||
|     public abstract getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>; | ||||
|     public abstract async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>; | ||||
|     public abstract setFilledTakerAmount(orderHash: string, balance: BigNumber): void; | ||||
|     public abstract deleteFilledTakerAmount(orderHash: string): void; | ||||
|     public abstract setIsCancelled(orderHash: string, isCancelled: boolean): void; | ||||
|   | ||||
| @@ -18,7 +18,6 @@ import { | ||||
|     IsolatedExchangeFillEventArgs as FillEventArgs, | ||||
| } from '../wrappers'; | ||||
|  | ||||
| export { Order } from '@0x/types'; | ||||
| export interface AssetBalances { | ||||
|     [assetData: string]: { [address: string]: BigNumber }; | ||||
| } | ||||
| @@ -28,6 +27,7 @@ export interface IsolatedExchangeEvents { | ||||
|     transferFromCalls: DispatchTransferFromCallArgs[]; | ||||
| } | ||||
|  | ||||
| export type Order = Order; | ||||
| export type Numberish = string | number | BigNumber; | ||||
|  | ||||
| export const DEFAULT_GOOD_SIGNATURE = createGoodSignature(); | ||||
|   | ||||
| @@ -12,6 +12,7 @@ import { ReferenceFunctions as UtilReferenceFunctions, SafeMathRevertErrors } fr | ||||
| import { FillResults, Order } from '@0x/types'; | ||||
| import { AnyRevertError, BigNumber, ExchangeRevertErrors, hexUtils, StringRevertError } from '@0x/utils'; | ||||
| import { LogEntry, LogWithDecodedArgs } from 'ethereum-types'; | ||||
| import * as ethjs from 'ethereumjs-util'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
| @@ -103,7 +104,7 @@ blockchainTests('Exchange wrapper functions unit tests.', env => { | ||||
|     // Creates a deterministic order signature, even though no signature validation | ||||
|     // actually occurs in the test contract. | ||||
|     function createOrderSignature(order: Order): string { | ||||
|         return hexUtils.hash(orderHashUtils.getOrderHashHex(order)); | ||||
|         return ethjs.bufferToHex(ethjs.sha3(ethjs.toBuffer(orderHashUtils.getOrderHashHex(order)))); | ||||
|     } | ||||
|  | ||||
|     // Asserts that `_fillOrder()` was called in the same order and with the same | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "6.2.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "6.2.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "6.2.23", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "6.2.22", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "6.2.21", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "6.2.21-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v6.2.25 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.24 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.23 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.22 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v6.2.21 - _March 17, 2021_ | ||||
| ## v6.2.21-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-extensions", | ||||
|     "version": "6.2.25", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-dev-utils": "^1.3.29", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-erc721": "^3.1.30", | ||||
|         "@0x/contracts-exchange": "^3.2.31", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.30", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@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", | ||||
| @@ -77,7 +77,7 @@ | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereumjs-abi": "0.6.5", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -87,13 +87,13 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|         "@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" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-integrations", | ||||
|     "version": "2.7.45", | ||||
|     "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.6.0", | ||||
|         "@0x/contract-addresses": "^6.2.0", | ||||
|         "@0x/contract-wrappers": "^13.16.2", | ||||
|         "@0x/contracts-broker": "^1.1.30", | ||||
|         "@0x/contracts-coordinator": "^3.1.31", | ||||
|         "@0x/contracts-dev-utils": "^1.3.29", | ||||
|         "@0x/contracts-exchange-forwarder": "^4.2.31", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.30", | ||||
|         "@0x/contracts-extensions": "^6.2.25", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@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.2.7", | ||||
|         "@0x/migrations": "^8.0.7", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/protocol-utils": "^1.6.1", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@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.4.1", | ||||
|         "@azure/core-asynciterator-polyfill": "^1.0.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -90,26 +90,26 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/asset-swapper": "^6.15.0", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-erc1155": "^2.1.30", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-erc721": "^3.1.30", | ||||
|         "@0x/contracts-exchange": "^3.2.31", | ||||
|         "@0x/contracts-multisig": "^4.1.31", | ||||
|         "@0x/contracts-staking": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-zero-ex": "^0.24.0", | ||||
|         "@0x/subproviders": "^6.5.3", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "@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.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^6.2.0", | ||||
|         "lodash": "^4.17.11" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|   | ||||
| @@ -63,9 +63,11 @@ blockchainTests.fork('DevUtils dydx order validation tests', env => { | ||||
|     let dai: ERC20TokenContract; | ||||
|     let usdc: ERC20TokenContract; | ||||
|     let devUtils: DevUtilsContract; | ||||
|     let accountOwner: string; | ||||
|     let minMarginRatio: number; | ||||
|  | ||||
|     before(async () => { | ||||
|         [accountOwner] = await env.getAccountAddressesAsync(); | ||||
|         dydx = new IDydxContract(DYDX_ADDRESS, env.provider, env.txDefaults); | ||||
|         dai = new ERC20TokenContract(DAI_ADDRESS, env.provider, env.txDefaults); | ||||
|         usdc = new ERC20TokenContract(USDC_ADDRESS, env.provider, env.txDefaults); | ||||
|   | ||||
| @@ -19,5 +19,5 @@ export function filterActorsByRole<TClass extends Constructor>( | ||||
|     actors: Actor[], | ||||
|     role: TClass, | ||||
| ): Array<InstanceType<typeof role>> { | ||||
|     return actors.filter(actor => actor.mixins.includes(role.name)) as Array<InstanceType<typeof role>>; | ||||
|     return actors.filter(actor => actor.mixins.includes(role.name)) as InstanceType<typeof role>; | ||||
| } | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "4.1.31", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "4.1.30", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "4.1.29", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "4.1.28", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "4.1.27", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "4.1.27-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.1.31 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.30 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.29 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.28 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.1.27 - _March 17, 2021_ | ||||
| ## v4.1.27-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-multisig", | ||||
|     "version": "4.1.31", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@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.2.0", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
|         "@types/node": "12.12.54", | ||||
| @@ -75,12 +75,12 @@ | ||||
|         "shx": "^0.2.2", | ||||
|         "solhint": "^1.4.1", | ||||
|         "tslint": "5.11.0", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -1,44 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "2.0.38", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "2.0.37", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Patch epoch finalization issue", | ||||
|                 "pr": 221 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1620214333 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "2.0.36", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "2.0.35", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "2.0.34", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "2.0.34-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v2.0.38 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.37 - _May 5, 2021_ | ||||
|  | ||||
|     * Patch epoch finalization issue (#221) | ||||
|  | ||||
| ## v2.0.36 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.35 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v2.0.34 - _March 17, 2021_ | ||||
| ## v2.0.34-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,55 +0,0 @@ | ||||
| /* | ||||
|  | ||||
|   Copyright 2019 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.5.9; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "./interfaces/IStaking.sol"; | ||||
| import "./sys/MixinParams.sol"; | ||||
| import "./stake/MixinStake.sol"; | ||||
| import "./fees/MixinExchangeFees.sol"; | ||||
|  | ||||
|  | ||||
| contract StakingPatch is | ||||
|     IStaking, | ||||
|     MixinParams, | ||||
|     MixinStake, | ||||
|     MixinExchangeFees | ||||
| { | ||||
|     /// @dev Initialize storage owned by this contract. | ||||
|     ///      This function should not be called directly. | ||||
|     ///      The StakingProxy contract will call it in `attachStakingContract()`. | ||||
|     function init() | ||||
|         public | ||||
|         onlyAuthorized | ||||
|     { | ||||
|         uint256 currentEpoch_ = currentEpoch; | ||||
|         uint256 prevEpoch = currentEpoch_.safeSub(1); | ||||
|  | ||||
|         // Patch corrupted state | ||||
|         aggregatedStatsByEpoch[prevEpoch].numPoolsToFinalize = 0; | ||||
|         this.endEpoch(); | ||||
|  | ||||
|         uint256 lastPoolId_ = 57; | ||||
|         for (uint256 i = 1; i <= lastPoolId_; i++) { | ||||
|             this.finalizePool(bytes32(i)); | ||||
|         } | ||||
|         // Ensure that current epoch's state is not corrupted | ||||
|         aggregatedStatsByEpoch[currentEpoch_].numPoolsToFinalize = 0; | ||||
|     } | ||||
| } | ||||
| @@ -53,10 +53,6 @@ contract MixinExchangeFees is | ||||
|     { | ||||
|         _assertValidProtocolFee(protocolFee); | ||||
|  | ||||
|         if (protocolFee == 0) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // Transfer the protocol fee to this address if it should be paid in | ||||
|         // WETH. | ||||
|         if (msg.value == 0) { | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-staking", | ||||
|     "version": "2.0.38", | ||||
|     "version": "2.0.34-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -41,7 +41,7 @@ | ||||
|     "config": { | ||||
|         "publicInterfaceContracts": "IStaking,IStakingEvents,IStakingProxy,IZrxVault,LibStakingRichErrors,Staking,StakingProxy,ZrxVault,TestStaking", | ||||
|         "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", | ||||
|         "abis": "./test/generated-artifacts/@(IStaking|IStakingEvents|IStakingProxy|IStorage|IStorageInit|IStructs|IZrxVault|LibCobbDouglas|LibFixedMath|LibFixedMathRichErrors|LibSafeDowncast|LibStakingRichErrors|MixinAbstract|MixinConstants|MixinCumulativeRewards|MixinDeploymentConstants|MixinExchangeFees|MixinExchangeManager|MixinFinalizer|MixinParams|MixinScheduler|MixinStake|MixinStakeBalances|MixinStakeStorage|MixinStakingPool|MixinStakingPoolRewards|MixinStorage|Staking|StakingPatch|StakingProxy|TestAssertStorageParams|TestCobbDouglas|TestCumulativeRewardTracking|TestDelegatorRewards|TestExchangeManager|TestFinalizer|TestInitTarget|TestLibFixedMath|TestLibSafeDowncast|TestMixinCumulativeRewards|TestMixinParams|TestMixinScheduler|TestMixinStake|TestMixinStakeBalances|TestMixinStakeStorage|TestMixinStakingPool|TestMixinStakingPoolRewards|TestProtocolFees|TestProxyDestination|TestStaking|TestStakingNoWETH|TestStakingProxy|TestStakingProxyUnit|TestStorageLayoutAndConstants|ZrxVault).json" | ||||
|         "abis": "./test/generated-artifacts/@(IStaking|IStakingEvents|IStakingProxy|IStorage|IStorageInit|IStructs|IZrxVault|LibCobbDouglas|LibFixedMath|LibFixedMathRichErrors|LibSafeDowncast|LibStakingRichErrors|MixinAbstract|MixinConstants|MixinCumulativeRewards|MixinDeploymentConstants|MixinExchangeFees|MixinExchangeManager|MixinFinalizer|MixinParams|MixinScheduler|MixinStake|MixinStakeBalances|MixinStakeStorage|MixinStakingPool|MixinStakingPoolRewards|MixinStorage|Staking|StakingProxy|TestAssertStorageParams|TestCobbDouglas|TestCumulativeRewardTracking|TestDelegatorRewards|TestExchangeManager|TestFinalizer|TestInitTarget|TestLibFixedMath|TestLibSafeDowncast|TestMixinCumulativeRewards|TestMixinParams|TestMixinScheduler|TestMixinStake|TestMixinStakeBalances|TestMixinStakeStorage|TestMixinStakingPool|TestMixinStakingPoolRewards|TestProtocolFees|TestProxyDestination|TestStaking|TestStakingNoWETH|TestStakingProxy|TestStakingProxyUnit|TestStorageLayoutAndConstants|ZrxVault).json" | ||||
|     }, | ||||
|     "repository": { | ||||
|         "type": "git", | ||||
| @@ -53,20 +53,20 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/tokens", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-dev-utils": "^1.3.29", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-exchange-libs": "^4.3.30", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-utils": "^4.7.9", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@0x/types": "^3.3.1", | ||||
|         "@0x/web3-wrapper": "^7.4.1", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/node": "12.12.54", | ||||
|         "chai": "^4.0.1", | ||||
| @@ -84,15 +84,15 @@ | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10" | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/contracts-test-utils": "^5.3.23-multiplex.0", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^5.1.1" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -4,7 +4,6 @@ import { DecodedLogArgs, LogWithDecodedArgs } from 'ethereum-types'; | ||||
|  | ||||
| import { constants as stakingConstants } from './constants'; | ||||
|  | ||||
| export { Numberish } from '@0x/contracts-test-utils'; | ||||
| // tslint:disable:max-classes-per-file | ||||
|  | ||||
| export interface StakingParams { | ||||
| @@ -260,3 +259,5 @@ export class AggregatedStats { | ||||
| export interface AggregatedStatsByEpoch { | ||||
|     [epoch: string]: AggregatedStats; | ||||
| } | ||||
|  | ||||
| export type Numberish = Numberish; | ||||
|   | ||||
| @@ -33,7 +33,6 @@ import * as MixinStakingPool from '../test/generated-artifacts/MixinStakingPool. | ||||
| import * as MixinStakingPoolRewards from '../test/generated-artifacts/MixinStakingPoolRewards.json'; | ||||
| import * as MixinStorage from '../test/generated-artifacts/MixinStorage.json'; | ||||
| import * as Staking from '../test/generated-artifacts/Staking.json'; | ||||
| import * as StakingPatch from '../test/generated-artifacts/StakingPatch.json'; | ||||
| import * as StakingProxy from '../test/generated-artifacts/StakingProxy.json'; | ||||
| import * as TestAssertStorageParams from '../test/generated-artifacts/TestAssertStorageParams.json'; | ||||
| import * as TestCobbDouglas from '../test/generated-artifacts/TestCobbDouglas.json'; | ||||
| @@ -62,7 +61,6 @@ import * as TestStorageLayoutAndConstants from '../test/generated-artifacts/Test | ||||
| import * as ZrxVault from '../test/generated-artifacts/ZrxVault.json'; | ||||
| export const artifacts = { | ||||
|     Staking: Staking as ContractArtifact, | ||||
|     StakingPatch: StakingPatch as ContractArtifact, | ||||
|     StakingProxy: StakingProxy as ContractArtifact, | ||||
|     ZrxVault: ZrxVault as ContractArtifact, | ||||
|     MixinExchangeFees: MixinExchangeFees as ContractArtifact, | ||||
|   | ||||
| @@ -1,66 +0,0 @@ | ||||
| import { blockchainTests, constants, expect, filterLogsToArguments } from '@0x/contracts-test-utils'; | ||||
| import { BigNumber, logUtils } from '@0x/utils'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
| import { StakingEvents, StakingPatchContract, StakingProxyContract, StakingProxyEvents } from './wrappers'; | ||||
|  | ||||
| const abis = _.mapValues(artifacts, v => v.compilerOutput.abi); | ||||
| const STAKING_PROXY = '0xa26e80e7dea86279c6d778d702cc413e6cffa777'; | ||||
| const STAKING_OWNER = '0x7d3455421bbc5ed534a83c88fd80387dc8271392'; | ||||
| const EXCHANGE_PROXY = '0xdef1c0ded9bec7f1a1670819833240f027b25eff'; | ||||
| blockchainTests.configure({ | ||||
|     fork: { | ||||
|         unlockedAccounts: [STAKING_OWNER, EXCHANGE_PROXY], | ||||
|     }, | ||||
| }); | ||||
|  | ||||
| blockchainTests.fork('Staking patch mainnet fork tests', env => { | ||||
|     let stakingProxyContract: StakingProxyContract; | ||||
|     let patchedStakingPatchContract: StakingPatchContract; | ||||
|  | ||||
|     before(async () => { | ||||
|         stakingProxyContract = new StakingProxyContract(STAKING_PROXY, env.provider, undefined, abis); | ||||
|         patchedStakingPatchContract = await StakingPatchContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.Staking, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             artifacts, | ||||
|         ); | ||||
|     }); | ||||
|  | ||||
|     it('Staking proxy successfully attaches to patched logic', async () => { | ||||
|         const tx = await stakingProxyContract | ||||
|             .attachStakingContract(patchedStakingPatchContract.address) | ||||
|             .awaitTransactionSuccessAsync({ from: STAKING_OWNER, gasPrice: 0 }, { shouldValidate: false }); | ||||
|         expect(filterLogsToArguments(tx.logs, StakingProxyEvents.StakingContractAttachedToProxy)).to.deep.equal([ | ||||
|             { | ||||
|                 newStakingPatchContractAddress: patchedStakingPatchContract.address, | ||||
|             }, | ||||
|         ]); | ||||
|         expect(filterLogsToArguments(tx.logs, StakingEvents.EpochEnded).length).to.equal(1); | ||||
|         expect(filterLogsToArguments(tx.logs, StakingEvents.EpochFinalized).length).to.equal(1); | ||||
|         logUtils.log(`${tx.gasUsed} gas used`); | ||||
|     }); | ||||
|  | ||||
|     it('Patched staking handles 0 gas protocol fees', async () => { | ||||
|         const staking = new StakingPatchContract(STAKING_PROXY, env.provider, undefined, abis); | ||||
|         const maker = '0x7b1886e49ab5433bb46f7258548092dc8cdca28b'; | ||||
|         const zeroFeeTx = await staking | ||||
|             .payProtocolFee(maker, constants.NULL_ADDRESS, constants.ZERO_AMOUNT) | ||||
|             .awaitTransactionSuccessAsync({ from: EXCHANGE_PROXY, gasPrice: 0 }, { shouldValidate: false }); | ||||
|         // StakingPoolEarnedRewardsInEpoch should _not_ be emitted for a zero protocol fee. | ||||
|         // tslint:disable-next-line:no-unused-expression | ||||
|         expect(filterLogsToArguments(zeroFeeTx.logs, StakingEvents.StakingPoolEarnedRewardsInEpoch)).to.be.empty; | ||||
|  | ||||
|         // Coincidentally there's some ETH in the ExchangeProxy | ||||
|         const nonZeroFeeTx = await staking | ||||
|             .payProtocolFee(maker, constants.NULL_ADDRESS, new BigNumber(1)) | ||||
|             .awaitTransactionSuccessAsync({ from: EXCHANGE_PROXY, gasPrice: 0, value: 1 }, { shouldValidate: false }); | ||||
|         // StakingPoolEarnedRewardsInEpoch _should_ be emitted for a non-zero protocol fee. | ||||
|         expect( | ||||
|             filterLogsToArguments(nonZeroFeeTx.logs, StakingEvents.StakingPoolEarnedRewardsInEpoch), | ||||
|         ).to.have.lengthOf(1); | ||||
|     }); | ||||
| }); | ||||
| // tslint:enable:no-unnecessary-type-assertion | ||||
| @@ -12,6 +12,7 @@ import { | ||||
|  | ||||
| blockchainTests.resets('Exchange Unit Tests', env => { | ||||
|     // Addresses | ||||
|     let nonOwner: string; | ||||
|     let owner: string; | ||||
|     let nonExchange: string; | ||||
|     let exchange: string; | ||||
| @@ -23,7 +24,7 @@ blockchainTests.resets('Exchange Unit Tests', env => { | ||||
|  | ||||
|     before(async () => { | ||||
|         // Set up addresses for testing. | ||||
|         [, owner, nonExchange, exchange, nonAuthority, authority] = await env.getAccountAddressesAsync(); | ||||
|         [nonOwner, owner, nonExchange, exchange, nonAuthority, authority] = await env.getAccountAddressesAsync(); | ||||
|  | ||||
|         // Deploy the Exchange Manager contract. | ||||
|         exchangeManager = await TestExchangeManagerContract.deployFrom0xArtifactAsync( | ||||
|   | ||||
| @@ -543,7 +543,7 @@ blockchainTests.resets('Finalizer unit tests', env => { | ||||
|             const expectedPoolRewards = await calculatePoolRewardsAsync(INITIAL_BALANCE, pools); | ||||
|             const [pool, reward] = _.sampleSize(shortZip(pools, expectedPoolRewards), 1)[0]; | ||||
|             return assertUnfinalizedPoolRewardsAsync(pool.poolId, { | ||||
|                 totalReward: reward, | ||||
|                 totalReward: (reward as any) as BigNumber, | ||||
|                 membersStake: pool.membersStake, | ||||
|             }); | ||||
|         }); | ||||
|   | ||||
| @@ -12,13 +12,17 @@ import * as _ from 'lodash'; | ||||
| import { artifacts } from '../artifacts'; | ||||
| import { TestCobbDouglasContract } from '../wrappers'; | ||||
|  | ||||
| // tslint:disable: no-unnecessary-type-assertion | ||||
| blockchainTests('LibCobbDouglas unit tests', env => { | ||||
|     const FUZZ_COUNT = 1024; | ||||
|     const PRECISION = 15; | ||||
|  | ||||
|     let testContract: TestCobbDouglasContract; | ||||
|     let ownerAddress: string; | ||||
|     let notOwnerAddress: string; | ||||
|  | ||||
|     before(async () => { | ||||
|         [ownerAddress, notOwnerAddress] = await env.getAccountAddressesAsync(); | ||||
|         testContract = await TestCobbDouglasContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.TestCobbDouglas, | ||||
|             env.provider, | ||||
| @@ -207,3 +211,4 @@ blockchainTests('LibCobbDouglas unit tests', env => { | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
| // tslint:enable:no-unnecessary-type-assertion | ||||
|   | ||||
| @@ -31,7 +31,6 @@ export * from '../test/generated-wrappers/mixin_staking_pool'; | ||||
| export * from '../test/generated-wrappers/mixin_staking_pool_rewards'; | ||||
| export * from '../test/generated-wrappers/mixin_storage'; | ||||
| export * from '../test/generated-wrappers/staking'; | ||||
| export * from '../test/generated-wrappers/staking_patch'; | ||||
| export * from '../test/generated-wrappers/staking_proxy'; | ||||
| export * from '../test/generated-wrappers/test_assert_storage_params'; | ||||
| export * from '../test/generated-wrappers/test_cobb_douglas'; | ||||
|   | ||||
| @@ -40,7 +40,6 @@ | ||||
|         "test/generated-artifacts/MixinStakingPoolRewards.json", | ||||
|         "test/generated-artifacts/MixinStorage.json", | ||||
|         "test/generated-artifacts/Staking.json", | ||||
|         "test/generated-artifacts/StakingPatch.json", | ||||
|         "test/generated-artifacts/StakingProxy.json", | ||||
|         "test/generated-artifacts/TestAssertStorageParams.json", | ||||
|         "test/generated-artifacts/TestCobbDouglas.json", | ||||
|   | ||||
| @@ -1,44 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "5.4.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "5.4.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Set default ganache gas limit to 100e6", | ||||
|                 "pr": 197 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1620214333 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "5.3.25", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "5.3.24", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "5.3.23", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "5.3.23-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v5.4.1 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.4.0 - _May 5, 2021_ | ||||
|  | ||||
|     * Set default ganache gas limit to 100e6 (#197) | ||||
|  | ||||
| ## v5.3.25 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.24 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v5.3.23 - _March 17, 2021_ | ||||
| ## v5.3.23-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-test-utils", | ||||
|     "version": "5.4.1", | ||||
|     "version": "5.3.23-multiplex.0", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -34,28 +34,28 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/test-utils", | ||||
|     "devDependencies": { | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/sol-compiler": "^4.6.1", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "npm-run-all": "^4.1.2", | ||||
|         "shx": "^0.2.2", | ||||
|         "tslint": "5.11.0", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/assert": "^3.0.27", | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/contract-addresses": "^6.2.0", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/json-schemas": "^6.1.3", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/sol-coverage": "^4.0.37", | ||||
|         "@0x/sol-profiler": "^4.1.27", | ||||
|         "@0x/sol-trace": "^3.0.37", | ||||
|         "@0x/subproviders": "^6.5.3", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@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.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", | ||||
| @@ -67,8 +67,8 @@ | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "decimal.js": "^10.2.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "ethereum-types": "^3.4.0", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "ethers": "~4.0.4", | ||||
|         "js-combinatorics": "^0.5.3", | ||||
|         "lodash": "^4.17.11", | ||||
|   | ||||
| @@ -77,7 +77,7 @@ export const constants = { | ||||
|     ZERO_AMOUNT: new BigNumber(0), | ||||
|     PERCENTAGE_DENOMINATOR: new BigNumber(10).pow(18), | ||||
|     TIME_BUFFER: new BigNumber(1000), | ||||
|     KECCAK256_NULL: ethUtil.bufferToHex(ethUtil.keccak256(Buffer.alloc(0))), | ||||
|     KECCAK256_NULL: ethUtil.addHexPrefix(ethUtil.bufferToHex(ethUtil.SHA3_NULL)), | ||||
|     MAX_UINT256_ROOT: new BigNumber('340282366920938463463374607431768211456'), | ||||
|     ONE_ETHER: new BigNumber(1e18), | ||||
|     EIP712_DOMAIN_NAME: '0x Protocol', | ||||
|   | ||||
| @@ -14,6 +14,6 @@ export function shortZip<T1, T2>(a: T1[], b: T2[]): Array<[T1, T2]> { | ||||
| export function replaceKeysDeep(obj: {}, mapKeys: (key: string) => string | void): _.Dictionary<{}> { | ||||
|     return _.transform(obj, (result, value, key) => { | ||||
|         const currentKey = mapKeys(key) || key; | ||||
|         result[currentKey] = _.isObject(value) ? replaceKeysDeep(value as {}, mapKeys) : (value as {}); | ||||
|         result[currentKey] = _.isObject(value) ? replaceKeysDeep(value, mapKeys) : value; | ||||
|     }); | ||||
| } | ||||
|   | ||||
| @@ -22,14 +22,14 @@ export class OrderFactory { | ||||
|     ): Promise<SignedOrder> { | ||||
|         const fifteenMinutesInSeconds = 15 * 60; | ||||
|         const currentBlockTimestamp = await getLatestBlockTimestampAsync(); | ||||
|         const order = { | ||||
|         const order = ({ | ||||
|             takerAddress: constants.NULL_ADDRESS, | ||||
|             senderAddress: constants.NULL_ADDRESS, | ||||
|             expirationTimeSeconds: new BigNumber(currentBlockTimestamp).plus(fifteenMinutesInSeconds), | ||||
|             salt: generatePseudoRandomSalt(), | ||||
|             ...this._defaultOrderParams, | ||||
|             ...customOrderParams, | ||||
|         } as Order; // tslint:disable-line:no-object-literal-type-assertion | ||||
|         } as any) as Order; | ||||
|         const orderHashBuff = orderHashUtils.getOrderHashBuffer(order); | ||||
|         const signature = signingUtils.signMessage(orderHashBuff, this._privateKey, signatureType); | ||||
|         const signedOrder = { | ||||
|   | ||||
| @@ -30,8 +30,7 @@ export const orderUtils = { | ||||
|         return cancel; | ||||
|     }, | ||||
|     createOrderWithoutSignature(signedOrder: SignedOrder): Order { | ||||
|         const { signature, ...order } = signedOrder; | ||||
|         return order; | ||||
|         return _.omit(signedOrder, ['signature']) as Order; | ||||
|     }, | ||||
|     createBatchMatchOrders(signedOrdersLeft: SignedOrder[], signedOrdersRight: SignedOrder[]): BatchMatchOrder { | ||||
|         return { | ||||
|   | ||||
| @@ -20,7 +20,6 @@ export let providerConfigs: Web3Config = { | ||||
|     shouldUseInProcessGanache: true, | ||||
|     shouldAllowUnlimitedContractSize: true, | ||||
|     hardfork: 'istanbul', | ||||
|     gasLimit: 100e6, | ||||
|     unlocked_accounts: [ | ||||
|         '0x6cc5f688a315f3dc28a7781717a9a798a59fda7b', | ||||
|         '0x55dc8f21d20d4c6ed3c82916a438a413ca68e335', | ||||
|   | ||||
| @@ -57,7 +57,9 @@ describe('Order hashing', () => { | ||||
|                 ...order, | ||||
|                 takerAddress: (null as any) as string, | ||||
|             }; | ||||
|             const expectedErrorMessage = `Expected order to conform to schema`; | ||||
|             const expectedErrorMessage = `Order taker must be of type string. If you want anyone to be able to fill an order - pass ${ | ||||
|                 constants.NULL_ADDRESS | ||||
|             }`; | ||||
|             expect(() => orderHashUtils.getOrderHashHex(orderWithInvalidtakerFormat)).to.throw(expectedErrorMessage); | ||||
|         }); | ||||
|     }); | ||||
|   | ||||
| @@ -1,77 +1,13 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "1.1.7", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "1.1.6", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "1.1.5", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Patched votingPower logic", | ||||
|                 "pr": 214 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1619825976 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "1.1.4", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619481586, | ||||
|         "version": "1.1.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1618259868, | ||||
|         "version": "1.1.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "1.1.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "1.1.0", | ||||
|         "version": "1.1.0-multiplex", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Make the proposal/quorum thresholds updatable", | ||||
|                 "pr": 165 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1616005394 | ||||
|         "timestamp": 1615932869 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1614141718, | ||||
|   | ||||
| @@ -5,35 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v1.1.7 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.6 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.5 - _April 30, 2021_ | ||||
|  | ||||
|     * Patched votingPower logic (#214) | ||||
|  | ||||
| ## v1.1.4 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.3 - _April 26, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.2 - _April 12, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.1 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v1.1.0 - _March 17, 2021_ | ||||
| ## v1.1.0-multiplex - _March 16, 2021_ | ||||
|  | ||||
|     * Make the proposal/quorum thresholds updatable (#165) | ||||
|  | ||||
|   | ||||
| @@ -30,7 +30,6 @@ interface IZrxTreasury { | ||||
|         uint256 votingPeriod; | ||||
|         uint256 proposalThreshold; | ||||
|         uint256 quorumThreshold; | ||||
|         bytes32 defaultPoolId; | ||||
|     } | ||||
|  | ||||
|     struct ProposedAction { | ||||
|   | ||||
| @@ -20,6 +20,8 @@ | ||||
| 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"; | ||||
| @@ -30,6 +32,7 @@ import "./IZrxTreasury.sol"; | ||||
| contract ZrxTreasury is | ||||
|     IZrxTreasury | ||||
| { | ||||
|     using LibERC20TokenV06 for IERC20TokenV06; | ||||
|     using LibSafeMathV06 for uint256; | ||||
|     using LibRichErrorsV06 for bytes; | ||||
|     using LibBytesV06 for bytes; | ||||
| @@ -49,9 +52,11 @@ contract ZrxTreasury is | ||||
|     /// @dev Initializes the ZRX treasury and creates the default | ||||
|     ///      staking pool. | ||||
|     /// @param stakingProxy_ The 0x staking proxy contract. | ||||
|     /// @param weth_ The WETH token contract. | ||||
|     /// @param params Immutable treasury parameters. | ||||
|     constructor( | ||||
|         IStaking stakingProxy_, | ||||
|         IERC20TokenV06 weth_, | ||||
|         TreasuryParameters memory params | ||||
|     ) | ||||
|         public | ||||
| @@ -61,12 +66,15 @@ contract ZrxTreasury is | ||||
|             "VOTING_PERIOD_TOO_LONG" | ||||
|         ); | ||||
|         stakingProxy = stakingProxy_; | ||||
|         DefaultPoolOperator defaultPoolOperator_ = new DefaultPoolOperator( | ||||
|             stakingProxy_, | ||||
|             weth_ | ||||
|         ); | ||||
|         defaultPoolOperator = defaultPoolOperator_; | ||||
|         defaultPoolId = defaultPoolOperator_.poolId(); | ||||
|         votingPeriod = params.votingPeriod; | ||||
|         proposalThreshold = params.proposalThreshold; | ||||
|         quorumThreshold = params.quorumThreshold; | ||||
|         defaultPoolId = params.defaultPoolId; | ||||
|         IStaking.Pool memory defaultPool = stakingProxy_.getStakingPool(params.defaultPoolId); | ||||
|         defaultPoolOperator = DefaultPoolOperator(defaultPool.operator); | ||||
|     } | ||||
|  | ||||
|     // solhint-disable | ||||
| @@ -278,12 +286,6 @@ contract ZrxTreasury is | ||||
|  | ||||
|         // Add voting power for operated staking pools. | ||||
|         for (uint256 i = 0; i != operatedPoolIds.length; i++) { | ||||
|             for (uint256 j = 0; j != i; j++) { | ||||
|                 require( | ||||
|                     operatedPoolIds[i] != operatedPoolIds[j], | ||||
|                     "getVotingPower/DUPLICATE_POOL_ID" | ||||
|                 ); | ||||
|             } | ||||
|             IStaking.Pool memory pool = stakingProxy.getStakingPool(operatedPoolIds[i]); | ||||
|             require( | ||||
|                 pool.operator == account, | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-treasury", | ||||
|     "version": "1.1.7", | ||||
|     "version": "1.1.0-multiplex", | ||||
|     "engines": { | ||||
|         "node": ">=6.12" | ||||
|     }, | ||||
| @@ -46,16 +46,16 @@ | ||||
|     }, | ||||
|     "homepage": "https://github.com/0xProject/protocol/tree/main/contracts/treasury", | ||||
|     "devDependencies": { | ||||
|         "@0x/abi-gen": "^5.6.0", | ||||
|         "@0x/contract-addresses": "^6.2.0", | ||||
|         "@0x/contracts-asset-proxy": "^3.7.12", | ||||
|         "@0x/contracts-erc20": "^3.3.9", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-staking": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@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.4", | ||||
|         "@0x/tslint-config": "^4.1.3", | ||||
|         "@types/isomorphic-fetch": "^0.0.35", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -69,18 +69,18 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "tslint": "5.11.0", | ||||
|         "typedoc": "~0.16.11", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/protocol-utils": "^1.6.1", | ||||
|         "@0x/subproviders": "^6.5.3", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "ethereum-types": "^3.5.0", | ||||
|         "ethereumjs-util": "^7.0.10" | ||||
|         "@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" | ||||
|   | ||||
| @@ -28,7 +28,6 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|         votingPeriod: new BigNumber(3).times(stakingConstants.ONE_DAY_IN_SECONDS), | ||||
|         proposalThreshold: new BigNumber(100), | ||||
|         quorumThreshold: new BigNumber(1000), | ||||
|         defaultPoolId: stakingConstants.INITIAL_POOL_ID, | ||||
|     }; | ||||
|     const PROPOSAL_DESCRIPTION = 'A very compelling proposal!'; | ||||
|     const TREASURY_BALANCE = constants.INITIAL_ERC20_BALANCE; | ||||
| @@ -136,16 +135,6 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|             .approve(erc20ProxyContract.address, constants.INITIAL_ERC20_ALLOWANCE) | ||||
|             .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|  | ||||
|         defaultPoolOperator = await DefaultPoolOperatorContract.deployFrom0xArtifactAsync( | ||||
|             artifacts.DefaultPoolOperator, | ||||
|             env.provider, | ||||
|             env.txDefaults, | ||||
|             { ...artifacts, ...erc20Artifacts }, | ||||
|             staking.address, | ||||
|             weth.address, | ||||
|         ); | ||||
|         defaultPoolId = stakingConstants.INITIAL_POOL_ID; | ||||
|  | ||||
|         const createStakingPoolTx = staking.createStakingPool(stakingConstants.PPM, false); | ||||
|         nonDefaultPoolId = await createStakingPoolTx.callAsync({ from: poolOperator }); | ||||
|         await createStakingPoolTx.awaitTransactionSuccessAsync({ from: poolOperator }); | ||||
| @@ -156,9 +145,9 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|             env.txDefaults, | ||||
|             { ...artifacts, ...erc20Artifacts }, | ||||
|             staking.address, | ||||
|             weth.address, | ||||
|             TREASURY_PARAMS, | ||||
|         ); | ||||
|  | ||||
|         await zrx.mint(TREASURY_BALANCE).awaitTransactionSuccessAsync(); | ||||
|         await zrx.transfer(treasury.address, TREASURY_BALANCE).awaitTransactionSuccessAsync(); | ||||
|         actions = [ | ||||
| @@ -177,6 +166,10 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|                 value: constants.ZERO_AMOUNT, | ||||
|             }, | ||||
|         ]; | ||||
|  | ||||
|         defaultPoolId = await treasury.defaultPoolId().callAsync(); | ||||
|         const defaultPoolOperatorAddress = await treasury.defaultPoolOperator().callAsync(); | ||||
|         defaultPoolOperator = new DefaultPoolOperatorContract(defaultPoolOperatorAddress, env.provider, env.txDefaults); | ||||
|     }); | ||||
|     describe('getVotingPower()', () => { | ||||
|         it('Unstaked ZRX has no voting power', async () => { | ||||
| @@ -229,19 +222,6 @@ blockchainTests.resets('Treasury governance', env => { | ||||
|             const operatorVotingPower = await treasury.getVotingPower(poolOperator, [nonDefaultPoolId]).callAsync(); | ||||
|             expect(operatorVotingPower).to.bignumber.equal(TREASURY_PARAMS.proposalThreshold.dividedBy(2)); | ||||
|         }); | ||||
|         it('Reverts if given duplicate pool IDs', async () => { | ||||
|             await staking.stake(TREASURY_PARAMS.proposalThreshold).awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await staking | ||||
|                 .moveStake( | ||||
|                     new StakeInfo(StakeStatus.Undelegated), | ||||
|                     new StakeInfo(StakeStatus.Delegated, nonDefaultPoolId), | ||||
|                     TREASURY_PARAMS.proposalThreshold, | ||||
|                 ) | ||||
|                 .awaitTransactionSuccessAsync({ from: delegator }); | ||||
|             await fastForwardToNextEpochAsync(); | ||||
|             const tx = treasury.getVotingPower(poolOperator, [nonDefaultPoolId, nonDefaultPoolId]).callAsync(); | ||||
|             return expect(tx).to.revertWith('getVotingPower/DUPLICATE_POOL_ID'); | ||||
|         }); | ||||
|         it('Correctly sums voting power delegated to multiple pools', async () => { | ||||
|             await staking | ||||
|                 .stake(TREASURY_PARAMS.proposalThreshold.times(2)) | ||||
|   | ||||
| @@ -1,43 +1,7 @@ | ||||
| [ | ||||
|     { | ||||
|         "timestamp": 1621600614, | ||||
|         "version": "4.7.9", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1620214333, | ||||
|         "version": "4.7.8", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619596077, | ||||
|         "version": "4.7.7", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1617311315, | ||||
|         "version": "4.7.6", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1616005394, | ||||
|         "version": "4.7.5", | ||||
|         "timestamp": 1615932869, | ||||
|         "version": "4.7.5-multiplex.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|   | ||||
| @@ -5,23 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v4.7.9 - _May 21, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.8 - _May 5, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.7 - _April 28, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.6 - _April 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v4.7.5 - _March 17, 2021_ | ||||
| ## v4.7.5-multiplex.0 - _March 16, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "@0x/contracts-utils", | ||||
|     "version": "4.7.9", | ||||
|     "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.6.0", | ||||
|         "@0x/contracts-gen": "^2.0.38", | ||||
|         "@0x/contracts-test-utils": "^5.4.1", | ||||
|         "@0x/dev-utils": "^4.2.7", | ||||
|         "@0x/order-utils": "^10.4.22", | ||||
|         "@0x/sol-compiler": "^4.7.3", | ||||
|         "@0x/tslint-config": "^4.1.4", | ||||
|         "@0x/types": "^3.3.3", | ||||
|         "@0x/web3-wrapper": "^7.5.3", | ||||
|         "@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.4.1", | ||||
|         "@types/bn.js": "^4.11.0", | ||||
|         "@types/lodash": "4.14.104", | ||||
|         "@types/mocha": "^5.2.7", | ||||
| @@ -67,7 +67,7 @@ | ||||
|         "chai-as-promised": "^7.1.0", | ||||
|         "chai-bignumber": "^3.0.0", | ||||
|         "dirty-chai": "^2.0.1", | ||||
|         "ethereumjs-util": "^7.0.10", | ||||
|         "ethereumjs-util": "^5.1.1", | ||||
|         "lodash": "^4.17.11", | ||||
|         "make-promises-safe": "^1.1.0", | ||||
|         "mocha": "^6.2.0", | ||||
| @@ -76,14 +76,14 @@ | ||||
|         "solhint": "^1.4.1", | ||||
|         "truffle": "^5.0.32", | ||||
|         "tslint": "5.11.0", | ||||
|         "typescript": "4.2.2" | ||||
|         "typescript": "3.0.1" | ||||
|     }, | ||||
|     "dependencies": { | ||||
|         "@0x/base-contract": "^6.4.0", | ||||
|         "@0x/typescript-typings": "^5.2.0", | ||||
|         "@0x/utils": "^6.4.3", | ||||
|         "@0x/base-contract": "^6.2.18", | ||||
|         "@0x/typescript-typings": "^5.1.6", | ||||
|         "@0x/utils": "^6.2.0", | ||||
|         "bn.js": "^4.11.8", | ||||
|         "ethereum-types": "^3.5.0" | ||||
|         "ethereum-types": "^3.4.0" | ||||
|     }, | ||||
|     "publishConfig": { | ||||
|         "access": "public" | ||||
|   | ||||
| @@ -2,6 +2,7 @@ import { chaiSetup, constants, provider, txDefaults, web3Wrapper } from '@0x/con | ||||
| import { BlockchainLifecycle } from '@0x/dev-utils'; | ||||
| import { BigNumber, hexUtils, signTypedDataUtils } from '@0x/utils'; | ||||
| import * as chai from 'chai'; | ||||
| import * as ethUtil from 'ethereumjs-util'; | ||||
| import * as _ from 'lodash'; | ||||
|  | ||||
| import { artifacts } from './artifacts'; | ||||
| @@ -77,7 +78,7 @@ describe('LibEIP712', () => { | ||||
|  | ||||
|         // Hash the provided input to get the expected hash | ||||
|         const input = '0x1901'.concat(unprefixedDomainHash.concat(unprefixedHashStruct)); | ||||
|         const expectedHash = hexUtils.hash(input); | ||||
|         const expectedHash = '0x'.concat(ethUtil.sha3(input).toString('hex')); | ||||
|  | ||||
|         // Get the actual hash by calling the smart contract | ||||
|         const actualHash = await lib.externalHashEIP712Message(domainHash, hashStruct).callAsync(); | ||||
|   | ||||
| @@ -1,111 +1,6 @@ | ||||
| [ | ||||
|     { | ||||
|         "version": "0.24.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add special selectors to selector collision test", | ||||
|                 "pr": 243 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1621600614 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.23.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Added ETH support to `MixinCurve`", | ||||
|                 "pr": 220 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add Balancer V2 integration", | ||||
|                 "pr": 206 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1620214333 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619830995, | ||||
|         "version": "0.22.3", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1619825976, | ||||
|         "version": "0.22.2", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.22.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "bump feature version to 1.2", | ||||
|                 "pr": 213 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1619596077 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.22.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add order signer registry to NativeOrdersFeature", | ||||
|                 "pr": 195 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1619481586 | ||||
|     }, | ||||
|     { | ||||
|         "timestamp": 1618259868, | ||||
|         "version": "0.21.1", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Dependencies updated" | ||||
|             }, | ||||
|             { | ||||
|                 "note": "BSC Uniswap clones (ApeSwap, CafeSwap, CheeseSwap, JulSwap)", | ||||
|                 "pr": 208 | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.21.0", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Encoding protocol ID and source name in bridge source ID", | ||||
|                 "pr": 162 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Add PancakeSwapFeature", | ||||
|                 "pr": 164 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Remove TokenSpender/AllowanceTarget/greedy tokens stuff", | ||||
|                 "pr": 164 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Added Nerve in BridgeAdapter", | ||||
|                 "pr": 181 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Delete TokenSpenderFeature", | ||||
|                 "pr": 189 | ||||
|             }, | ||||
|             { | ||||
|                 "note": "Fix PancakeSwapFeature BakerySwap swap selector", | ||||
|                 "pr": 190 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1617311315 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.20.0", | ||||
|         "version": "0.20.0-multiplex", | ||||
|         "changes": [ | ||||
|             { | ||||
|                 "note": "Add `MooniswapLiquidityProvider`", | ||||
| @@ -124,7 +19,7 @@ | ||||
|                 "pr": 168 | ||||
|             } | ||||
|         ], | ||||
|         "timestamp": 1616005394 | ||||
|         "timestamp": 1615932869 | ||||
|     }, | ||||
|     { | ||||
|         "version": "0.19.0", | ||||
|   | ||||
| @@ -5,46 +5,7 @@ Edit the package's CHANGELOG.json file only. | ||||
|  | ||||
| CHANGELOG | ||||
|  | ||||
| ## v0.24.0 - _May 21, 2021_ | ||||
|  | ||||
|     * Add special selectors to selector collision test (#243) | ||||
|  | ||||
| ## v0.23.0 - _May 5, 2021_ | ||||
|  | ||||
|     * Added ETH support to `MixinCurve` (#220) | ||||
|     * Add Balancer V2 integration (#206) | ||||
|  | ||||
| ## v0.22.3 - _May 1, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.22.2 - _April 30, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|  | ||||
| ## v0.22.1 - _April 28, 2021_ | ||||
|  | ||||
|     * bump feature version to 1.2 (#213) | ||||
|  | ||||
| ## v0.22.0 - _April 26, 2021_ | ||||
|  | ||||
|     * Add order signer registry to NativeOrdersFeature (#195) | ||||
|  | ||||
| ## v0.21.1 - _April 12, 2021_ | ||||
|  | ||||
|     * Dependencies updated | ||||
|     * BSC Uniswap clones (ApeSwap, CafeSwap, CheeseSwap, JulSwap) (#208) | ||||
|  | ||||
| ## v0.21.0 - _April 1, 2021_ | ||||
|  | ||||
|     * Encoding protocol ID and source name in bridge source ID (#162) | ||||
|     * Add PancakeSwapFeature (#164) | ||||
|     * Remove TokenSpender/AllowanceTarget/greedy tokens stuff (#164) | ||||
|     * Added Nerve in BridgeAdapter (#181) | ||||
|     * Delete TokenSpenderFeature (#189) | ||||
|     * Fix PancakeSwapFeature BakerySwap swap selector (#190) | ||||
|  | ||||
| ## v0.20.0 - _March 17, 2021_ | ||||
| ## v0.20.0-multiplex - _March 16, 2021_ | ||||
|  | ||||
|     * Add `MooniswapLiquidityProvider` (#143) | ||||
|     * Emit `LiquidityProviderFill` event in `CurveLiquidityProvider` (#143) | ||||
|   | ||||
| @@ -26,7 +26,6 @@ import "./features/interfaces/ITokenSpenderFeature.sol"; | ||||
| import "./features/interfaces/ITransformERC20Feature.sol"; | ||||
| import "./features/interfaces/IMetaTransactionsFeature.sol"; | ||||
| import "./features/interfaces/IUniswapFeature.sol"; | ||||
| import "./features/interfaces/IPancakeSwapFeature.sol"; | ||||
| import "./features/interfaces/ILiquidityProviderFeature.sol"; | ||||
| import "./features/interfaces/INativeOrdersFeature.sol"; | ||||
| import "./features/interfaces/IBatchFillNativeOrdersFeature.sol"; | ||||
| @@ -37,10 +36,10 @@ import "./features/interfaces/IMultiplexFeature.sol"; | ||||
| interface IZeroEx is | ||||
|     IOwnableFeature, | ||||
|     ISimpleFunctionRegistryFeature, | ||||
|     ITokenSpenderFeature, | ||||
|     ITransformERC20Feature, | ||||
|     IMetaTransactionsFeature, | ||||
|     IUniswapFeature, | ||||
|     IPancakeSwapFeature, | ||||
|     ILiquidityProviderFeature, | ||||
|     INativeOrdersFeature, | ||||
|     IBatchFillNativeOrdersFeature, | ||||
|   | ||||
| @@ -88,21 +88,6 @@ library LibNativeOrdersRichErrors { | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function InvalidSignerError( | ||||
|         address maker, | ||||
|         address signer | ||||
|     ) | ||||
|         internal | ||||
|         pure | ||||
|         returns (bytes memory) | ||||
|     { | ||||
|         return abi.encodeWithSelector( | ||||
|             bytes4(keccak256("InvalidSignerError(address,address)")), | ||||
|             maker, | ||||
|             signer | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     function OrderNotFillableBySenderError( | ||||
|         bytes32 orderHash, | ||||
|         address sender, | ||||
|   | ||||
| @@ -0,0 +1,47 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
|  | ||||
|  | ||||
| library LibSpenderRichErrors { | ||||
|  | ||||
|     // solhint-disable func-name-mixedcase | ||||
|  | ||||
|     function SpenderERC20TransferFromFailedError( | ||||
|         address token, | ||||
|         address owner, | ||||
|         address to, | ||||
|         uint256 amount, | ||||
|         bytes memory errorData | ||||
|     ) | ||||
|         internal | ||||
|         pure | ||||
|         returns (bytes memory) | ||||
|     { | ||||
|         return abi.encodeWithSelector( | ||||
|             bytes4(keccak256("SpenderERC20TransferFromFailedError(address,address,address,uint256,bytes)")), | ||||
|             token, | ||||
|             owner, | ||||
|             to, | ||||
|             amount, | ||||
|             errorData | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										56
									
								
								contracts/zero-ex/contracts/src/external/AllowanceTarget.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								contracts/zero-ex/contracts/src/external/AllowanceTarget.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/AuthorizableV06.sol"; | ||||
| import "../errors/LibSpenderRichErrors.sol"; | ||||
| import "./IAllowanceTarget.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev The allowance target for the TokenSpender feature. | ||||
| contract AllowanceTarget is | ||||
|     IAllowanceTarget, | ||||
|     AuthorizableV06 | ||||
| { | ||||
|     // solhint-disable no-unused-vars,indent,no-empty-blocks | ||||
|     using LibRichErrorsV06 for bytes; | ||||
|  | ||||
|     /// @dev Execute an arbitrary call. Only an authority can call this. | ||||
|     /// @param target The call target. | ||||
|     /// @param callData The call data. | ||||
|     /// @return resultData The data returned by the call. | ||||
|     function executeCall( | ||||
|         address payable target, | ||||
|         bytes calldata callData | ||||
|     ) | ||||
|         external | ||||
|         override | ||||
|         onlyAuthorized | ||||
|         returns (bytes memory resultData) | ||||
|     { | ||||
|         bool success; | ||||
|         (success, resultData) = target.call(callData); | ||||
|         if (!success) { | ||||
|             resultData.rrevert(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										40
									
								
								contracts/zero-ex/contracts/src/external/IAllowanceTarget.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								contracts/zero-ex/contracts/src/external/IAllowanceTarget.sol
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-utils/contracts/src/v06/interfaces/IAuthorizableV06.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev The allowance target for the TokenSpender feature. | ||||
| interface IAllowanceTarget is | ||||
|     IAuthorizableV06 | ||||
| { | ||||
|     /// @dev Execute an arbitrary call. Only an authority can call this. | ||||
|     /// @param target The call target. | ||||
|     /// @param callData The call data. | ||||
|     /// @return resultData The data returned by the call. | ||||
|     function executeCall( | ||||
|         address payable target, | ||||
|         bytes calldata callData | ||||
|     ) | ||||
|         external | ||||
|         returns (bytes memory resultData); | ||||
| } | ||||
| @@ -47,14 +47,15 @@ contract LiquidityProviderFeature is | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "LiquidityProviderFeature"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 4); | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 3); | ||||
|  | ||||
|     /// @dev The sandbox contract address. | ||||
|     ILiquidityProviderSandbox public immutable sandbox; | ||||
|  | ||||
|     constructor(LiquidityProviderSandbox sandbox_) | ||||
|     constructor(LiquidityProviderSandbox sandbox_, bytes32 greedyTokensBloomFilter) | ||||
|         public | ||||
|         FixinCommon() | ||||
|         FixinTokenSpender(greedyTokensBloomFilter) | ||||
|     { | ||||
|         sandbox = sandbox_; | ||||
|     } | ||||
|   | ||||
| @@ -78,7 +78,7 @@ contract MetaTransactionsFeature is | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "MetaTransactions"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 1, 1); | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 1, 0); | ||||
|     /// @dev EIP712 typehash of the `MetaTransactionData` struct. | ||||
|     bytes32 public immutable MTX_EIP712_TYPEHASH = keccak256( | ||||
|         "MetaTransactionData(" | ||||
| @@ -105,10 +105,11 @@ contract MetaTransactionsFeature is | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     constructor(address zeroExAddress) | ||||
|     constructor(address zeroExAddress, bytes32 greedyTokensBloomFilter) | ||||
|         public | ||||
|         FixinCommon() | ||||
|         FixinEIP712(zeroExAddress) | ||||
|         FixinTokenSpender(greedyTokensBloomFilter) | ||||
|     { | ||||
|         // solhint-disable-next-line no-empty-blocks | ||||
|     } | ||||
|   | ||||
| @@ -55,7 +55,7 @@ contract MultiplexFeature is | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "MultiplexFeature"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 1); | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 0); | ||||
|  | ||||
|     /// @dev The WETH token contract. | ||||
|     IEtherTokenV06 private immutable weth; | ||||
| @@ -73,10 +73,12 @@ contract MultiplexFeature is | ||||
|     constructor( | ||||
|         address zeroExAddress, | ||||
|         IEtherTokenV06 weth_, | ||||
|         ILiquidityProviderSandbox sandbox_ | ||||
|         ILiquidityProviderSandbox sandbox_, | ||||
|         bytes32 greedyTokensBloomFilter | ||||
|     ) | ||||
|         public | ||||
|         FixinEIP712(zeroExAddress) | ||||
|         FixinTokenSpender(greedyTokensBloomFilter) | ||||
|     { | ||||
|         weth = weth_; | ||||
|         sandbox = sandbox_; | ||||
|   | ||||
| @@ -34,14 +34,15 @@ contract NativeOrdersFeature is | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "LimitOrders"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 2, 0); | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 1); | ||||
|  | ||||
|     constructor( | ||||
|         address zeroExAddress, | ||||
|         IEtherTokenV06 weth, | ||||
|         IStaking staking, | ||||
|         FeeCollectorController feeCollectorController, | ||||
|         uint32 protocolFeeMultiplier | ||||
|         uint32 protocolFeeMultiplier, | ||||
|         bytes32 greedyTokensBloomFilter | ||||
|     ) | ||||
|         public | ||||
|         NativeOrdersSettlement( | ||||
| @@ -49,7 +50,8 @@ contract NativeOrdersFeature is | ||||
|             weth, | ||||
|             staking, | ||||
|             feeCollectorController, | ||||
|             protocolFeeMultiplier | ||||
|             protocolFeeMultiplier, | ||||
|             greedyTokensBloomFilter | ||||
|         ) | ||||
|     { | ||||
|         // solhint-disable no-empty-blocks | ||||
| @@ -74,13 +76,9 @@ contract NativeOrdersFeature is | ||||
|         _registerFeatureFunction(this.batchCancelLimitOrders.selector); | ||||
|         _registerFeatureFunction(this.batchCancelRfqOrders.selector); | ||||
|         _registerFeatureFunction(this.cancelPairLimitOrders.selector); | ||||
|         _registerFeatureFunction(this.cancelPairLimitOrdersWithSigner.selector); | ||||
|         _registerFeatureFunction(this.batchCancelPairLimitOrders.selector); | ||||
|         _registerFeatureFunction(this.batchCancelPairLimitOrdersWithSigner.selector); | ||||
|         _registerFeatureFunction(this.cancelPairRfqOrders.selector); | ||||
|         _registerFeatureFunction(this.cancelPairRfqOrdersWithSigner.selector); | ||||
|         _registerFeatureFunction(this.batchCancelPairRfqOrders.selector); | ||||
|         _registerFeatureFunction(this.batchCancelPairRfqOrdersWithSigner.selector); | ||||
|         _registerFeatureFunction(this.getLimitOrderInfo.selector); | ||||
|         _registerFeatureFunction(this.getRfqOrderInfo.selector); | ||||
|         _registerFeatureFunction(this.getLimitOrderHash.selector); | ||||
| @@ -91,8 +89,6 @@ contract NativeOrdersFeature is | ||||
|         _registerFeatureFunction(this.getRfqOrderRelevantState.selector); | ||||
|         _registerFeatureFunction(this.batchGetLimitOrderRelevantStates.selector); | ||||
|         _registerFeatureFunction(this.batchGetRfqOrderRelevantStates.selector); | ||||
|         _registerFeatureFunction(this.registerAllowedOrderSigner.selector); | ||||
|         _registerFeatureFunction(this.isValidOrderSigner.selector); | ||||
|         return LibMigrate.MIGRATE_SUCCESS; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,470 +0,0 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2021 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; | ||||
| import "../migrations/LibMigrate.sol"; | ||||
| import "../fixins/FixinCommon.sol"; | ||||
| import "./interfaces/IFeature.sol"; | ||||
| import "./interfaces/IPancakeSwapFeature.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev VIP pancake fill functions. | ||||
| contract PancakeSwapFeature is | ||||
|     IFeature, | ||||
|     IPancakeSwapFeature, | ||||
|     FixinCommon | ||||
| { | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "PancakeSwapFeature"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 2); | ||||
|     /// @dev WBNB contract. | ||||
|     IEtherTokenV06 private immutable WBNB; | ||||
|  | ||||
|     // 0xFF + address of the PancakeSwap factory contract. | ||||
|     uint256 constant private FF_PANCAKESWAP_FACTORY = 0xffbcfccbde45ce874adcb698cc183debcf179528120000000000000000000000; | ||||
|     // 0xFF + address of the PancakeSwapV2 factory contract. | ||||
|     uint256 constant private FF_PANCAKESWAPV2_FACTORY = 0xffca143ce32fe78f1f7019d7d551a6402fc5350c730000000000000000000000; | ||||
|     // 0xFF + address of the BakerySwap factory contract. | ||||
|     uint256 constant private FF_BAKERYSWAP_FACTORY = 0xff01bf7c66c6bd861915cdaae475042d3c4bae16a70000000000000000000000; | ||||
|     // 0xFF + address of the SushiSwap factory contract. | ||||
|     uint256 constant private FF_SUSHISWAP_FACTORY = 0xffc35DADB65012eC5796536bD9864eD8773aBc74C40000000000000000000000; | ||||
|     // 0xFF + address of the ApeSwap factory contract. | ||||
|     uint256 constant private FF_APESWAP_FACTORY = 0xff0841bd0b734e4f5853f0dd8d7ea041c241fb0da60000000000000000000000; | ||||
|     // 0xFF + address of the CafeSwap factory contract. | ||||
|     uint256 constant private FF_CAFESWAP_FACTORY = 0xff3e708fdbe3ada63fc94f8f61811196f1302137ad0000000000000000000000; | ||||
|     // 0xFF + address of the CheeseSwap factory contract. | ||||
|     uint256 constant private FF_CHEESESWAP_FACTORY = 0xffdd538e4fd1b69b7863e1f741213276a6cf1efb3b0000000000000000000000; | ||||
|     // 0xFF + address of the JulSwap factory contract. | ||||
|     uint256 constant private FF_JULSWAP_FACTORY = 0xff553990f2cba90272390f62c5bdb1681ffc8996750000000000000000000000; | ||||
|  | ||||
|     // Init code hash of the PancakeSwap pair contract. | ||||
|     uint256 constant private PANCAKESWAP_PAIR_INIT_CODE_HASH = 0xd0d4c4cd0848c93cb4fd1f498d7013ee6bfb25783ea21593d5834f5d250ece66; | ||||
|     // Init code hash of the PancakeSwapV2 pair contract. | ||||
|     uint256 constant private PANCAKESWAPV2_PAIR_INIT_CODE_HASH = 0x00fb7f630766e6a796048ea87d01acd3068e8ff67d078148a3fa3f4a84f69bd5; | ||||
|     // Init code hash of the BakerySwap pair contract. | ||||
|     uint256 constant private BAKERYSWAP_PAIR_INIT_CODE_HASH = 0xe2e87433120e32c4738a7d8f3271f3d872cbe16241d67537139158d90bac61d3; | ||||
|     // Init code hash of the SushiSwap pair contract. | ||||
|     uint256 constant private SUSHISWAP_PAIR_INIT_CODE_HASH = 0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303; | ||||
|     // Init code hash of the ApeSwap pair contract. | ||||
|     uint256 constant private APESWAP_PAIR_INIT_CODE_HASH = 0xf4ccce374816856d11f00e4069e7cada164065686fbef53c6167a63ec2fd8c5b; | ||||
|     // Init code hash of the CafeSwap pair contract. | ||||
|     uint256 constant private CAFESWAP_PAIR_INIT_CODE_HASH = 0x90bcdb5d0bf0e8db3852b0b7d7e05cc8f7c6eb6d511213c5ba02d1d1dbeda8d3; | ||||
|     // Init code hash of the CheeseSwap pair contract. | ||||
|     uint256 constant private CHEESESWAP_PAIR_INIT_CODE_HASH = 0xf52c5189a89e7ca2ef4f19f2798e3900fba7a316de7cef6c5a9446621ba86286; | ||||
|     // Init code hash of the JulSwap pair contract. | ||||
|     uint256 constant private JULSWAP_PAIR_INIT_CODE_HASH = 0xb1e98e21a5335633815a8cfb3b580071c2e4561c50afd57a8746def9ed890b18; | ||||
|  | ||||
|     // Mask of the lower 20 bytes of a bytes32. | ||||
|     uint256 constant private ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff; | ||||
|     // BNB pseudo-token address. | ||||
|     uint256 constant private ETH_TOKEN_ADDRESS_32 = 0x000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee; | ||||
|     // Maximum token quantity that can be swapped against the PancakeSwapPair contract. | ||||
|     uint256 constant private MAX_SWAP_AMOUNT = 2**112; | ||||
|  | ||||
|     // bytes4(keccak256("executeCall(address,bytes)")) | ||||
|     uint256 constant private ALLOWANCE_TARGET_EXECUTE_CALL_SELECTOR_32 = 0xbca8c7b500000000000000000000000000000000000000000000000000000000; | ||||
|     // bytes4(keccak256("getReserves()")) | ||||
|     uint256 constant private PANCAKESWAP_PAIR_RESERVES_CALL_SELECTOR_32 = 0x0902f1ac00000000000000000000000000000000000000000000000000000000; | ||||
|     // bytes4(keccak256("swap(uint256,uint256,address,bytes)")) | ||||
|     uint256 constant private PANCAKESWAP_PAIR_SWAP_CALL_SELECTOR_32 = 0x022c0d9f00000000000000000000000000000000000000000000000000000000; | ||||
|     // bytes4(keccak256("swap(uint256,uint256,address)")) | ||||
|     uint256 constant private BAKERYSWAP_PAIR_SWAP_CALL_SELECTOR_32 = 0x6d9a640a00000000000000000000000000000000000000000000000000000000; | ||||
|     // bytes4(keccak256("transferFrom(address,address,uint256)")) | ||||
|     uint256 constant private TRANSFER_FROM_CALL_SELECTOR_32 = 0x23b872dd00000000000000000000000000000000000000000000000000000000; | ||||
|     // bytes4(keccak256("allowance(address,address)")) | ||||
|     uint256 constant private ALLOWANCE_CALL_SELECTOR_32 = 0xdd62ed3e00000000000000000000000000000000000000000000000000000000; | ||||
|     // bytes4(keccak256("withdraw(uint256)")) | ||||
|     uint256 constant private WETH_WITHDRAW_CALL_SELECTOR_32 = 0x2e1a7d4d00000000000000000000000000000000000000000000000000000000; | ||||
|     // bytes4(keccak256("deposit()")) | ||||
|     uint256 constant private WETH_DEPOSIT_CALL_SELECTOR_32 = 0xd0e30db000000000000000000000000000000000000000000000000000000000; | ||||
|     // bytes4(keccak256("transfer(address,uint256)")) | ||||
|     uint256 constant private ERC20_TRANSFER_CALL_SELECTOR_32 = 0xa9059cbb00000000000000000000000000000000000000000000000000000000; | ||||
|  | ||||
|     /// @dev Construct this contract. | ||||
|     /// @param wbnb The WBNB contract. | ||||
|     constructor(IEtherTokenV06 wbnb) public { | ||||
|         WBNB = wbnb; | ||||
|     } | ||||
|  | ||||
|     /// @dev Initialize and register this feature. | ||||
|     ///      Should be delegatecalled by `Migrate.migrate()`. | ||||
|     /// @return success `LibMigrate.SUCCESS` on success. | ||||
|     function migrate() | ||||
|         external | ||||
|         returns (bytes4 success) | ||||
|     { | ||||
|         _registerFeatureFunction(this.sellToPancakeSwap.selector); | ||||
|         return LibMigrate.MIGRATE_SUCCESS; | ||||
|     } | ||||
|  | ||||
|     /// @dev Efficiently sell directly to pancake/BakerySwap/SushiSwap. | ||||
|     /// @param tokens Sell path. | ||||
|     /// @param sellAmount of `tokens[0]` Amount to sell. | ||||
|     /// @param minBuyAmount Minimum amount of `tokens[-1]` to buy. | ||||
|     /// @param fork The protocol fork to use. | ||||
|     /// @return buyAmount Amount of `tokens[-1]` bought. | ||||
|     function sellToPancakeSwap( | ||||
|         IERC20TokenV06[] calldata tokens, | ||||
|         uint256 sellAmount, | ||||
|         uint256 minBuyAmount, | ||||
|         ProtocolFork fork | ||||
|     ) | ||||
|         external | ||||
|         payable | ||||
|         override | ||||
|         returns (uint256 buyAmount) | ||||
|     { | ||||
|         require(tokens.length > 1, "PancakeSwapFeature/InvalidTokensLength"); | ||||
|         { | ||||
|             // Load immutables onto the stack. | ||||
|             IEtherTokenV06 wbnb = WBNB; | ||||
|  | ||||
|             // Store some vars in memory to get around stack limits. | ||||
|             assembly { | ||||
|                 // calldataload(mload(0xA00)) == first element of `tokens` array | ||||
|                 mstore(0xA00, add(calldataload(0x04), 0x24)) | ||||
|                 // mload(0xA20) == fork | ||||
|                 mstore(0xA20, fork) | ||||
|                 // mload(0xA40) == WBNB | ||||
|                 mstore(0xA40, wbnb) | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         assembly { | ||||
|             // numPairs == tokens.length - 1 | ||||
|             let numPairs := sub(calldataload(add(calldataload(0x04), 0x4)), 1) | ||||
|             // We use the previous buy amount as the sell amount for the next | ||||
|             // pair in a path. So for the first swap we want to set it to `sellAmount`. | ||||
|             buyAmount := sellAmount | ||||
|             let buyToken | ||||
|             let nextPair := 0 | ||||
|  | ||||
|             for {let i := 0} lt(i, numPairs) {i := add(i, 1)} { | ||||
|                 // sellToken = tokens[i] | ||||
|                 let sellToken := loadTokenAddress(i) | ||||
|                 // buyToken = tokens[i+1] | ||||
|                 buyToken := loadTokenAddress(add(i, 1)) | ||||
|                 // The canonical ordering of this token pair. | ||||
|                 let pairOrder := lt(normalizeToken(sellToken), normalizeToken(buyToken)) | ||||
|  | ||||
|                 // Compute the pair address if it hasn't already been computed | ||||
|                 // from the last iteration. | ||||
|                 let pair := nextPair | ||||
|                 if iszero(pair) { | ||||
|                     pair := computePairAddress(sellToken, buyToken) | ||||
|                     nextPair := 0 | ||||
|                 } | ||||
|  | ||||
|                 if iszero(i) { | ||||
|                     // This is the first token in the path. | ||||
|                     switch eq(sellToken, ETH_TOKEN_ADDRESS_32) | ||||
|                         case 0 { // Not selling BNB. Selling an ERC20 instead. | ||||
|                             // Make sure BNB was not attached to the call. | ||||
|                             if gt(callvalue(), 0) { | ||||
|                                 revert(0, 0) | ||||
|                             } | ||||
|                             // For the first pair we need to transfer sellTokens into the | ||||
|                             // pair contract. | ||||
|                             moveTakerTokensTo(sellToken, pair, sellAmount) | ||||
|                         } | ||||
|                         default { | ||||
|                             // If selling BNB, we need to wrap it to WBNB and transfer to the | ||||
|                             // pair contract. | ||||
|                             if iszero(eq(callvalue(), sellAmount)) { | ||||
|                                 revert(0, 0) | ||||
|                             } | ||||
|                             sellToken := mload(0xA40)// Re-assign to WBNB | ||||
|                             // Call `WBNB.deposit{value: sellAmount}()` | ||||
|                             mstore(0xB00, WETH_DEPOSIT_CALL_SELECTOR_32) | ||||
|                             if iszero(call(gas(), sellToken, sellAmount, 0xB00, 0x4, 0x00, 0x0)) { | ||||
|                                 bubbleRevert() | ||||
|                             } | ||||
|                             // Call `WBNB.transfer(pair, sellAmount)` | ||||
|                             mstore(0xB00, ERC20_TRANSFER_CALL_SELECTOR_32) | ||||
|                             mstore(0xB04, pair) | ||||
|                             mstore(0xB24, sellAmount) | ||||
|                             if iszero(call(gas(), sellToken, 0, 0xB00, 0x44, 0x00, 0x0)) { | ||||
|                                 bubbleRevert() | ||||
|                             } | ||||
|                         } | ||||
|                     // No need to check results, if deposit/transfers failed the PancakeSwapPair will | ||||
|                     // reject our trade (or it may succeed if somehow the reserve was out of sync) | ||||
|                     // this is fine for the taker. | ||||
|                 } | ||||
|  | ||||
|                 // Call pair.getReserves(), store the results at `0xC00` | ||||
|                 mstore(0xB00, PANCAKESWAP_PAIR_RESERVES_CALL_SELECTOR_32) | ||||
|                 if iszero(staticcall(gas(), pair, 0xB00, 0x4, 0xC00, 0x40)) { | ||||
|                     bubbleRevert() | ||||
|                 } | ||||
|                 // Revert if the pair contract does not return at least two words. | ||||
|                 if lt(returndatasize(), 0x40) { | ||||
|                     mstore(0, pair) | ||||
|                     revert(0, 32) | ||||
|                 } | ||||
|  | ||||
|                 // Sell amount for this hop is the previous buy amount. | ||||
|                 let pairSellAmount := buyAmount | ||||
|                 // Compute the buy amount based on the pair reserves. | ||||
|                 { | ||||
|                     let sellReserve | ||||
|                     let buyReserve | ||||
|                     switch iszero(pairOrder) | ||||
|                         case 0 { | ||||
|                             // Transpose if pair order is different. | ||||
|                             sellReserve := mload(0xC00) | ||||
|                             buyReserve := mload(0xC20) | ||||
|                         } | ||||
|                         default { | ||||
|                             sellReserve := mload(0xC20) | ||||
|                             buyReserve := mload(0xC00) | ||||
|                         } | ||||
|                     // Ensure that the sellAmount is < 2¹¹². | ||||
|                     if gt(pairSellAmount, MAX_SWAP_AMOUNT) { | ||||
|                         revert(0, 0) | ||||
|                     } | ||||
|                     // Pairs are in the range (0, 2¹¹²) so this shouldn't overflow. | ||||
|                     // buyAmount = (pairSellAmount * 997 * buyReserve) / | ||||
|                     //     (pairSellAmount * 997 + sellReserve * 1000); | ||||
|                     let sellAmountWithFee := mul(pairSellAmount, 997) | ||||
|                     buyAmount := div( | ||||
|                         mul(sellAmountWithFee, buyReserve), | ||||
|                         add(sellAmountWithFee, mul(sellReserve, 1000)) | ||||
|                     ) | ||||
|                 } | ||||
|  | ||||
|                 let receiver | ||||
|                 // Is this the last pair contract? | ||||
|                 switch eq(add(i, 1), numPairs) | ||||
|                     case 0 { | ||||
|                         // Not the last pair contract, so forward bought tokens to | ||||
|                         // the next pair contract. | ||||
|                         nextPair := computePairAddress( | ||||
|                             buyToken, | ||||
|                             loadTokenAddress(add(i, 2)) | ||||
|                         ) | ||||
|                         receiver := nextPair | ||||
|                     } | ||||
|                     default { | ||||
|                         // The last pair contract. | ||||
|                         // Forward directly to taker UNLESS they want BNB back. | ||||
|                         switch eq(buyToken, ETH_TOKEN_ADDRESS_32) | ||||
|                             case 0 { | ||||
|                                 receiver := caller() | ||||
|                             } | ||||
|                             default { | ||||
|                                 receiver := address() | ||||
|                             } | ||||
|                     } | ||||
|  | ||||
|                 // Call pair.swap() | ||||
|                 switch mload(0xA20) // fork | ||||
|                     case 2 { | ||||
|                         mstore(0xB00, BAKERYSWAP_PAIR_SWAP_CALL_SELECTOR_32) | ||||
|                     } | ||||
|                     default { | ||||
|                         mstore(0xB00, PANCAKESWAP_PAIR_SWAP_CALL_SELECTOR_32) | ||||
|                     } | ||||
|                 switch pairOrder | ||||
|                     case 0 { | ||||
|                         mstore(0xB04, buyAmount) | ||||
|                         mstore(0xB24, 0) | ||||
|                     } | ||||
|                     default { | ||||
|                         mstore(0xB04, 0) | ||||
|                         mstore(0xB24, buyAmount) | ||||
|                     } | ||||
|                 mstore(0xB44, receiver) | ||||
|                 mstore(0xB64, 0x80) | ||||
|                 mstore(0xB84, 0) | ||||
|                 if iszero(call(gas(), pair, 0, 0xB00, 0xA4, 0, 0)) { | ||||
|                     bubbleRevert() | ||||
|                 } | ||||
|             } // End for-loop. | ||||
|  | ||||
|             // If buying BNB, unwrap the WBNB first | ||||
|             if eq(buyToken, ETH_TOKEN_ADDRESS_32) { | ||||
|                 // Call `WBNB.withdraw(buyAmount)` | ||||
|                 mstore(0xB00, WETH_WITHDRAW_CALL_SELECTOR_32) | ||||
|                 mstore(0xB04, buyAmount) | ||||
|                 if iszero(call(gas(), mload(0xA40), 0, 0xB00, 0x24, 0x00, 0x0)) { | ||||
|                     bubbleRevert() | ||||
|                 } | ||||
|                 // Transfer BNB to the caller. | ||||
|                 if iszero(call(gas(), caller(), buyAmount, 0xB00, 0x0, 0x00, 0x0)) { | ||||
|                     bubbleRevert() | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Functions /////////////////////////////////////////////////////// | ||||
|  | ||||
|             // Load a token address from the `tokens` calldata argument. | ||||
|             function loadTokenAddress(idx) -> addr { | ||||
|                 addr := and(ADDRESS_MASK, calldataload(add(mload(0xA00), mul(idx, 0x20)))) | ||||
|             } | ||||
|  | ||||
|             // Convert BNB pseudo-token addresses to WBNB. | ||||
|             function normalizeToken(token) -> normalized { | ||||
|                 normalized := token | ||||
|                 // Translate BNB pseudo-tokens to WBNB. | ||||
|                 if eq(token, ETH_TOKEN_ADDRESS_32) { | ||||
|                     normalized := mload(0xA40) | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Compute the address of the PancakeSwapPair contract given two | ||||
|             // tokens. | ||||
|             function computePairAddress(tokenA, tokenB) -> pair { | ||||
|                 // Convert BNB pseudo-token addresses to WBNB. | ||||
|                 tokenA := normalizeToken(tokenA) | ||||
|                 tokenB := normalizeToken(tokenB) | ||||
|                 // There is one contract for every combination of tokens, | ||||
|                 // which is deployed using CREATE2. | ||||
|                 // The derivation of this address is given by: | ||||
|                 //   address(keccak256(abi.encodePacked( | ||||
|                 //       bytes(0xFF), | ||||
|                 //       address(PANCAKESWAP_FACTORY_ADDRESS), | ||||
|                 //       keccak256(abi.encodePacked( | ||||
|                 //           tokenA < tokenB ? tokenA : tokenB, | ||||
|                 //           tokenA < tokenB ? tokenB : tokenA, | ||||
|                 //       )), | ||||
|                 //       bytes32(PANCAKESWAP_PAIR_INIT_CODE_HASH), | ||||
|                 //   ))); | ||||
|  | ||||
|                 // Compute the salt (the hash of the sorted tokens). | ||||
|                 // Tokens are written in reverse memory order to packed encode | ||||
|                 // them as two 20-byte values in a 40-byte chunk of memory | ||||
|                 // starting at 0xB0C. | ||||
|                 switch lt(tokenA, tokenB) | ||||
|                     case 0 { | ||||
|                         mstore(0xB14, tokenA) | ||||
|                         mstore(0xB00, tokenB) | ||||
|                     } | ||||
|                     default { | ||||
|                         mstore(0xB14, tokenB) | ||||
|                         mstore(0xB00, tokenA) | ||||
|                     } | ||||
|                 let salt := keccak256(0xB0C, 0x28) | ||||
|                 // Compute the pair address by hashing all the components together. | ||||
|                 switch mload(0xA20) // fork | ||||
|                     case 0 { | ||||
|                         mstore(0xB00, FF_PANCAKESWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, PANCAKESWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 1 { | ||||
|                         mstore(0xB00, FF_PANCAKESWAPV2_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, PANCAKESWAPV2_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 2 { | ||||
|                         mstore(0xB00, FF_BAKERYSWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, BAKERYSWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 3 { | ||||
|                         mstore(0xB00, FF_SUSHISWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, SUSHISWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 4 { | ||||
|                         mstore(0xB00, FF_APESWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, APESWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 5 { | ||||
|                         mstore(0xB00, FF_CAFESWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, CAFESWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     case 6 { | ||||
|                         mstore(0xB00, FF_CHEESESWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, CHEESESWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                     default { | ||||
|                         mstore(0xB00, FF_JULSWAP_FACTORY) | ||||
|                         mstore(0xB15, salt) | ||||
|                         mstore(0xB35, JULSWAP_PAIR_INIT_CODE_HASH) | ||||
|                     } | ||||
|                 pair := and(ADDRESS_MASK, keccak256(0xB00, 0x55)) | ||||
|             } | ||||
|  | ||||
|             // Revert with the return data from the most recent call. | ||||
|             function bubbleRevert() { | ||||
|                 returndatacopy(0, 0, returndatasize()) | ||||
|                 revert(0, returndatasize()) | ||||
|             } | ||||
|  | ||||
|             // Move `amount` tokens from the taker/caller to `to`. | ||||
|             function moveTakerTokensTo(token, to, amount) { | ||||
|                 // Perform a `transferFrom()` | ||||
|                 mstore(0xB00, TRANSFER_FROM_CALL_SELECTOR_32) | ||||
|                 mstore(0xB04, caller()) | ||||
|                 mstore(0xB24, to) | ||||
|                 mstore(0xB44, amount) | ||||
|  | ||||
|                 let success := call( | ||||
|                     gas(), | ||||
|                     token, | ||||
|                     0, | ||||
|                     0xB00, | ||||
|                     0x64, | ||||
|                     0xC00, | ||||
|                     // Copy only the first 32 bytes of return data. We | ||||
|                     // only care about reading a boolean in the success | ||||
|                     // case. We will use returndatacopy() in the failure case. | ||||
|                     0x20 | ||||
|                 ) | ||||
|  | ||||
|                 let rdsize := returndatasize() | ||||
|  | ||||
|                 // Check for ERC20 success. ERC20 tokens should | ||||
|                 // return a boolean, but some return nothing or | ||||
|                 // extra data. We accept 0-length return data as | ||||
|                 // success, or at least 32 bytes that starts with | ||||
|                 // a 32-byte boolean true. | ||||
|                 success := and( | ||||
|                     success,                         // call itself succeeded | ||||
|                     or( | ||||
|                         iszero(rdsize),              // no return data, or | ||||
|                         and( | ||||
|                             iszero(lt(rdsize, 32)),  // at least 32 bytes | ||||
|                             eq(mload(0xC00), 1)      // starts with uint256(1) | ||||
|                         ) | ||||
|                     ) | ||||
|                 ) | ||||
|  | ||||
|                 if iszero(success) { | ||||
|                     // Revert with the data returned from the transferFrom call. | ||||
|                     returndatacopy(0, 0, rdsize) | ||||
|                     revert(0, rdsize) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Revert if we bought too little. | ||||
|         require(buyAmount >= minBuyAmount, "PancakeSwapFeature/UnderBought"); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										137
									
								
								contracts/zero-ex/contracts/src/features/TokenSpenderFeature.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								contracts/zero-ex/contracts/src/features/TokenSpenderFeature.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
| /* | ||||
|  | ||||
|   Copyright 2020 ZeroEx Intl. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
| */ | ||||
|  | ||||
| pragma solidity ^0.6.5; | ||||
| pragma experimental ABIEncoderV2; | ||||
|  | ||||
| import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol"; | ||||
| import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||
| import "../errors/LibSpenderRichErrors.sol"; | ||||
| import "../fixins/FixinCommon.sol"; | ||||
| import "../migrations/LibMigrate.sol"; | ||||
| import "../external/IAllowanceTarget.sol"; | ||||
| import "../storage/LibTokenSpenderStorage.sol"; | ||||
| import "./interfaces/IFeature.sol"; | ||||
| import "./interfaces/ITokenSpenderFeature.sol"; | ||||
|  | ||||
|  | ||||
| /// @dev Feature that allows spending token allowances. | ||||
| contract TokenSpenderFeature is | ||||
|     IFeature, | ||||
|     ITokenSpenderFeature, | ||||
|     FixinCommon | ||||
| { | ||||
|     // solhint-disable | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "TokenSpender"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 0); | ||||
|     // solhint-enable | ||||
|  | ||||
|     using LibRichErrorsV06 for bytes; | ||||
|  | ||||
|     /// @dev Initialize and register this feature. Should be delegatecalled | ||||
|     ///      into during a `Migrate.migrate()`. | ||||
|     /// @param allowanceTarget An `allowanceTarget` instance, configured to have | ||||
|     ///        the ZeroeEx contract as an authority. | ||||
|     /// @return success `MIGRATE_SUCCESS` on success. | ||||
|     function migrate(IAllowanceTarget allowanceTarget) | ||||
|         external | ||||
|         returns (bytes4 success) | ||||
|     { | ||||
|         LibTokenSpenderStorage.getStorage().allowanceTarget = allowanceTarget; | ||||
|         _registerFeatureFunction(this.getAllowanceTarget.selector); | ||||
|         _registerFeatureFunction(this._spendERC20Tokens.selector); | ||||
|         _registerFeatureFunction(this.getSpendableERC20BalanceOf.selector); | ||||
|         return LibMigrate.MIGRATE_SUCCESS; | ||||
|     } | ||||
|  | ||||
|     /// @dev Transfers ERC20 tokens from `owner` to `to`. Only callable from within. | ||||
|     /// @param token The token to spend. | ||||
|     /// @param owner The owner of the tokens. | ||||
|     /// @param to The recipient of the tokens. | ||||
|     /// @param amount The amount of `token` to transfer. | ||||
|     function _spendERC20Tokens( | ||||
|         IERC20TokenV06 token, | ||||
|         address owner, | ||||
|         address to, | ||||
|         uint256 amount | ||||
|     ) | ||||
|         external | ||||
|         override | ||||
|         onlySelf | ||||
|     { | ||||
|         IAllowanceTarget spender = LibTokenSpenderStorage.getStorage().allowanceTarget; | ||||
|         // Have the allowance target execute an ERC20 `transferFrom()`. | ||||
|         (bool didSucceed, bytes memory resultData) = address(spender).call( | ||||
|             abi.encodeWithSelector( | ||||
|                 IAllowanceTarget.executeCall.selector, | ||||
|                 address(token), | ||||
|                 abi.encodeWithSelector( | ||||
|                     IERC20TokenV06.transferFrom.selector, | ||||
|                     owner, | ||||
|                     to, | ||||
|                     amount | ||||
|                 ) | ||||
|             ) | ||||
|         ); | ||||
|         if (didSucceed) { | ||||
|             resultData = abi.decode(resultData, (bytes)); | ||||
|         } | ||||
|         if (!didSucceed || !LibERC20TokenV06.isSuccessfulResult(resultData)) { | ||||
|             LibSpenderRichErrors.SpenderERC20TransferFromFailedError( | ||||
|                 address(token), | ||||
|                 owner, | ||||
|                 to, | ||||
|                 amount, | ||||
|                 resultData | ||||
|             ).rrevert(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// @dev Gets the maximum amount of an ERC20 token `token` that can be | ||||
|     ///      pulled from `owner` by the token spender. | ||||
|     /// @param token The token to spend. | ||||
|     /// @param owner The owner of the tokens. | ||||
|     /// @return amount The amount of tokens that can be pulled. | ||||
|     function getSpendableERC20BalanceOf(IERC20TokenV06 token, address owner) | ||||
|         external | ||||
|         override | ||||
|         view | ||||
|         returns (uint256 amount) | ||||
|     { | ||||
|         return LibSafeMathV06.min256( | ||||
|             token.allowance(owner, address(LibTokenSpenderStorage.getStorage().allowanceTarget)), | ||||
|             token.balanceOf(owner) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// @dev Get the address of the allowance target. | ||||
|     /// @return target The target of token allowances. | ||||
|     function getAllowanceTarget() | ||||
|         external | ||||
|         override | ||||
|         view | ||||
|         returns (address target) | ||||
|     { | ||||
|         return address(LibTokenSpenderStorage.getStorage().allowanceTarget); | ||||
|     } | ||||
| } | ||||
| @@ -60,7 +60,10 @@ contract TransformERC20Feature is | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 3, 1); | ||||
|  | ||||
|     constructor() public {} | ||||
|     constructor(bytes32 greedyTokensBloomFilter) | ||||
|         public | ||||
|         FixinTokenSpender(greedyTokensBloomFilter) | ||||
|     {} | ||||
|  | ||||
|     /// @dev Initialize and register this feature. | ||||
|     ///      Should be delegatecalled by `Migrate.migrate()`. | ||||
|   | ||||
| @@ -23,6 +23,7 @@ pragma experimental ABIEncoderV2; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||
| import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; | ||||
| import "../migrations/LibMigrate.sol"; | ||||
| import "../external/IAllowanceTarget.sol"; | ||||
| import "../fixins/FixinCommon.sol"; | ||||
| import "./interfaces/IFeature.sol"; | ||||
| import "./interfaces/IUniswapFeature.sol"; | ||||
| @@ -37,9 +38,13 @@ contract UniswapFeature is | ||||
|     /// @dev Name of this feature. | ||||
|     string public constant override FEATURE_NAME = "UniswapFeature"; | ||||
|     /// @dev Version of this feature. | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 1, 2); | ||||
|     uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 1, 1); | ||||
|     /// @dev A bloom filter for tokens that consume all gas when `transferFrom()` fails. | ||||
|     bytes32 public immutable GREEDY_TOKENS_BLOOM_FILTER; | ||||
|     /// @dev WETH contract. | ||||
|     IEtherTokenV06 private immutable WETH; | ||||
|     /// @dev AllowanceTarget instance. | ||||
|     IAllowanceTarget private immutable ALLOWANCE_TARGET; | ||||
|  | ||||
|     // 0xFF + address of the UniswapV2Factory contract. | ||||
|     uint256 constant private FF_UNISWAP_FACTORY = 0xFF5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f0000000000000000000000; | ||||
| @@ -75,8 +80,16 @@ contract UniswapFeature is | ||||
|  | ||||
|     /// @dev Construct this contract. | ||||
|     /// @param weth The WETH contract. | ||||
|     constructor(IEtherTokenV06 weth) public { | ||||
|     /// @param allowanceTarget The AllowanceTarget contract. | ||||
|     /// @param greedyTokensBloomFilter The bloom filter for greedy tokens. | ||||
|     constructor( | ||||
|         IEtherTokenV06 weth, | ||||
|         IAllowanceTarget allowanceTarget, | ||||
|         bytes32 greedyTokensBloomFilter | ||||
|     ) public { | ||||
|         WETH = weth; | ||||
|         ALLOWANCE_TARGET = allowanceTarget; | ||||
|         GREEDY_TOKENS_BLOOM_FILTER = greedyTokensBloomFilter; | ||||
|     } | ||||
|  | ||||
|     /// @dev Initialize and register this feature. | ||||
| @@ -111,6 +124,8 @@ contract UniswapFeature is | ||||
|         { | ||||
|             // Load immutables onto the stack. | ||||
|             IEtherTokenV06 weth = WETH; | ||||
|             IAllowanceTarget allowanceTarget = ALLOWANCE_TARGET; | ||||
|             bytes32 greedyTokensBloomFilter = GREEDY_TOKENS_BLOOM_FILTER; | ||||
|  | ||||
|             // Store some vars in memory to get around stack limits. | ||||
|             assembly { | ||||
| @@ -120,6 +135,10 @@ contract UniswapFeature is | ||||
|                 mstore(0xA20, isSushi) | ||||
|                 // mload(0xA40) == WETH | ||||
|                 mstore(0xA40, weth) | ||||
|                 // mload(0xA60) == ALLOWANCE_TARGET | ||||
|                 mstore(0xA60, allowanceTarget) | ||||
|                 // mload(0xA80) == GREEDY_TOKENS_BLOOM_FILTER | ||||
|                 mstore(0xA80, greedyTokensBloomFilter) | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -354,7 +373,38 @@ contract UniswapFeature is | ||||
|  | ||||
|             // Move `amount` tokens from the taker/caller to `to`. | ||||
|             function moveTakerTokensTo(token, to, amount) { | ||||
|                 // Perform a `transferFrom()` | ||||
|  | ||||
|                 // If the token is possibly greedy, we check the allowance rather | ||||
|                 // than relying on letting the transferFrom() call fail and | ||||
|                 // falling through to legacy allowance target because the token | ||||
|                 // will eat all our gas. | ||||
|                 if isTokenPossiblyGreedy(token) { | ||||
|                     // Check if we have enough direct allowance by calling | ||||
|                     // `token.allowance()` | ||||
|                     mstore(0xB00, ALLOWANCE_CALL_SELECTOR_32) | ||||
|                     mstore(0xB04, caller()) | ||||
|                     mstore(0xB24, address()) | ||||
|                     let success := staticcall(gas(), token, 0xB00, 0x44, 0xC00, 0x20) | ||||
|                     if iszero(success) { | ||||
|                         // Call to allowance() failed. | ||||
|                         bubbleRevert() | ||||
|                     } | ||||
|                     // Make sure the allowance call returned at least a word. | ||||
|                     if lt(returndatasize(), 0x20) { | ||||
|                         revert(0, 0) | ||||
|                     } | ||||
|                     // Call succeeded. | ||||
|                     // Result is stored in 0xC00-0xC20. | ||||
|                     if lt(mload(0xC00), amount) { | ||||
|                         // We don't have enough direct allowance, so try | ||||
|                         // going through the legacy allowance taregt. | ||||
|                         moveTakerTokensToWithLegacyAllowanceTarget(token, to, amount) | ||||
|                         leave | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 // Otherwise we will optimistically try to perform a `transferFrom()` | ||||
|                 // directly then if it fails we will go through the legacy allowance target. | ||||
|                 mstore(0xB00, TRANSFER_FROM_CALL_SELECTOR_32) | ||||
|                 mstore(0xB04, caller()) | ||||
|                 mstore(0xB24, to) | ||||
| @@ -369,7 +419,8 @@ contract UniswapFeature is | ||||
|                     0xC00, | ||||
|                     // Copy only the first 32 bytes of return data. We | ||||
|                     // only care about reading a boolean in the success | ||||
|                     // case. We will use returndatacopy() in the failure case. | ||||
|                     // case, and we discard the return data in the | ||||
|                     // failure case. | ||||
|                     0x20 | ||||
|                 ) | ||||
|  | ||||
| @@ -392,11 +443,37 @@ contract UniswapFeature is | ||||
|                 ) | ||||
|  | ||||
|                 if iszero(success) { | ||||
|                     // Revert with the data returned from the transferFrom call. | ||||
|                     returndatacopy(0, 0, rdsize) | ||||
|                     revert(0, rdsize) | ||||
|                     // Try to fall back to the allowance target. | ||||
|                     moveTakerTokensToWithLegacyAllowanceTarget(token, to, amount) | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Move tokens by going through the legacy allowance target contract. | ||||
|             function moveTakerTokensToWithLegacyAllowanceTarget(token, to, amount) { | ||||
|                 mstore(0xB00, ALLOWANCE_TARGET_EXECUTE_CALL_SELECTOR_32) | ||||
|                 mstore(0xB04, token) | ||||
|                 mstore(0xB24, 0x40) | ||||
|                 mstore(0xB44, 0x64) | ||||
|                 mstore(0xB64, TRANSFER_FROM_CALL_SELECTOR_32) | ||||
|                 mstore(0xB68, caller()) | ||||
|                 mstore(0xB88, to) | ||||
|                 mstore(0xBA8, amount) | ||||
|                 if iszero(call(gas(), mload(0xA60), 0, 0xB00, 0xC8, 0x00, 0x0)) { | ||||
|                     bubbleRevert() | ||||
|                 } | ||||
|                 // If this fall back failed, the swap will most likely fail | ||||
|                 // so there's no need to validate the result. | ||||
|             } | ||||
|  | ||||
|             // Checks if a token possibly belongs to the GREEDY_TOKENS_BLOOM_FILTER | ||||
|             // bloom filter. | ||||
|             function isTokenPossiblyGreedy(token) -> isPossiblyGreedy { | ||||
|                 // The hash is given by: | ||||
|                 // (1 << (keccak256(token) % 256)) | (1 << (token % 256)) | ||||
|                 mstore(0, token) | ||||
|                 let h := or(shl(mod(keccak256(0, 32), 256), 1), shl(mod(token, 256), 1)) | ||||
|                 isPossiblyGreedy := eq(and(h, mload(0xA80)), h) | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Revert if we bought too little. | ||||
|   | ||||
| @@ -113,14 +113,4 @@ interface INativeOrdersEvents { | ||||
|         address[] addrs, | ||||
|         bool allowed | ||||
|     ); | ||||
|  | ||||
|     /// @dev Emitted when new order signers are registered | ||||
|     /// @param maker The maker address that is registering a designated signer. | ||||
|     /// @param signer The address that will sign on behalf of maker. | ||||
|     /// @param allowed Indicates whether the address should be allowed. | ||||
|     event OrderSignerRegistered( | ||||
|         address maker, | ||||
|         address signer, | ||||
|         bool allowed | ||||
|     ); | ||||
| } | ||||
|   | ||||
| @@ -137,13 +137,13 @@ interface INativeOrdersFeature is | ||||
|         external | ||||
|         returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount); | ||||
|  | ||||
|     /// @dev Cancel a single limit order. The caller must be the maker or a valid order signer. | ||||
|     /// @dev Cancel a single limit order. The caller must be the maker. | ||||
|     ///      Silently succeeds if the order has already been cancelled. | ||||
|     /// @param order The limit order. | ||||
|     function cancelLimitOrder(LibNativeOrder.LimitOrder calldata order) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel a single RFQ order. The caller must be the maker or a valid order signer. | ||||
|     /// @dev Cancel a single RFQ order. The caller must be the maker. | ||||
|     ///      Silently succeeds if the order has already been cancelled. | ||||
|     /// @param order The RFQ order. | ||||
|     function cancelRfqOrder(LibNativeOrder.RfqOrder calldata order) | ||||
| @@ -156,13 +156,13 @@ interface INativeOrdersFeature is | ||||
|     function registerAllowedRfqOrigins(address[] memory origins, bool allowed) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel multiple limit orders. The caller must be the maker or a valid order signer. | ||||
|     /// @dev Cancel multiple limit orders. The caller must be the maker. | ||||
|     ///      Silently succeeds if the order has already been cancelled. | ||||
|     /// @param orders The limit orders. | ||||
|     function batchCancelLimitOrders(LibNativeOrder.LimitOrder[] calldata orders) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel multiple RFQ orders. The caller must be the maker or a valid order signer. | ||||
|     /// @dev Cancel multiple RFQ orders. The caller must be the maker. | ||||
|     ///      Silently succeeds if the order has already been cancelled. | ||||
|     /// @param orders The RFQ orders. | ||||
|     function batchCancelRfqOrders(LibNativeOrder.RfqOrder[] calldata orders) | ||||
| @@ -183,23 +183,7 @@ interface INativeOrdersFeature is | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel all limit orders for a given maker and pair with a salt less | ||||
|     ///      than the value provided. The caller must be a signer registered to the maker. | ||||
|     ///      Subsequent calls to this function with the same maker and pair require the | ||||
|     ///      new salt to be >= the old salt. | ||||
|     /// @param maker The maker for which to cancel. | ||||
|     /// @param makerToken The maker token. | ||||
|     /// @param takerToken The taker token. | ||||
|     /// @param minValidSalt The new minimum valid salt. | ||||
|     function cancelPairLimitOrdersWithSigner( | ||||
|         address maker, | ||||
|         IERC20TokenV06 makerToken, | ||||
|         IERC20TokenV06 takerToken, | ||||
|         uint256 minValidSalt | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel all limit orders for a given maker and pairs with salts less | ||||
|     ///      than the values provided. The caller must be the maker. Subsequent | ||||
|     ///      than the value provided. The caller must be the maker. Subsequent | ||||
|     ///      calls to this function with the same caller and pair require the | ||||
|     ///      new salt to be >= the old salt. | ||||
|     /// @param makerTokens The maker tokens. | ||||
| @@ -212,22 +196,6 @@ interface INativeOrdersFeature is | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel all limit orders for a given maker and pairs with salts less | ||||
|     ///      than the values provided. The caller must be a signer registered to the maker. | ||||
|     ///      Subsequent calls to this function with the same maker and pair require the | ||||
|     ///      new salt to be >= the old salt. | ||||
|     /// @param maker The maker for which to cancel. | ||||
|     /// @param makerTokens The maker tokens. | ||||
|     /// @param takerTokens The taker tokens. | ||||
|     /// @param minValidSalts The new minimum valid salts. | ||||
|     function batchCancelPairLimitOrdersWithSigner( | ||||
|         address maker, | ||||
|         IERC20TokenV06[] memory makerTokens, | ||||
|         IERC20TokenV06[] memory takerTokens, | ||||
|         uint256[] memory minValidSalts | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel all RFQ orders for a given maker and pair with a salt less | ||||
|     ///      than the value provided. The caller must be the maker. Subsequent | ||||
|     ///      calls to this function with the same caller and pair require the | ||||
| @@ -243,23 +211,7 @@ interface INativeOrdersFeature is | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel all RFQ orders for a given maker and pair with a salt less | ||||
|     ///      than the value provided. The caller must be a signer registered to the maker. | ||||
|     ///      Subsequent calls to this function with the same maker and pair require the | ||||
|     ///      new salt to be >= the old salt. | ||||
|     /// @param maker The maker for which to cancel. | ||||
|     /// @param makerToken The maker token. | ||||
|     /// @param takerToken The taker token. | ||||
|     /// @param minValidSalt The new minimum valid salt. | ||||
|     function cancelPairRfqOrdersWithSigner( | ||||
|         address maker, | ||||
|         IERC20TokenV06 makerToken, | ||||
|         IERC20TokenV06 takerToken, | ||||
|         uint256 minValidSalt | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel all RFQ orders for a given maker and pairs with salts less | ||||
|     ///      than the values provided. The caller must be the maker. Subsequent | ||||
|     ///      than the value provided. The caller must be the maker. Subsequent | ||||
|     ///      calls to this function with the same caller and pair require the | ||||
|     ///      new salt to be >= the old salt. | ||||
|     /// @param makerTokens The maker tokens. | ||||
| @@ -272,22 +224,6 @@ interface INativeOrdersFeature is | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Cancel all RFQ orders for a given maker and pairs with salts less | ||||
|     ///      than the values provided. The caller must be a signer registered to the maker. | ||||
|     ///      Subsequent calls to this function with the same maker and pair require the | ||||
|     ///      new salt to be >= the old salt. | ||||
|     /// @param maker The maker for which to cancel. | ||||
|     /// @param makerTokens The maker tokens. | ||||
|     /// @param takerTokens The taker tokens. | ||||
|     /// @param minValidSalts The new minimum valid salts. | ||||
|     function batchCancelPairRfqOrdersWithSigner( | ||||
|         address maker, | ||||
|         IERC20TokenV06[] memory makerTokens, | ||||
|         IERC20TokenV06[] memory takerTokens, | ||||
|         uint256[] memory minValidSalts | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @dev Get the order info for a limit order. | ||||
|     /// @param order The limit order. | ||||
|     /// @return orderInfo Info about the order. | ||||
| @@ -409,25 +345,4 @@ interface INativeOrdersFeature is | ||||
|             uint128[] memory actualFillableTakerTokenAmounts, | ||||
|             bool[] memory isSignatureValids | ||||
|         ); | ||||
|  | ||||
|     /// @dev Register a signer who can sign on behalf of msg.sender | ||||
|     ///      This allows one to sign on behalf of a contract that calls this function | ||||
|     /// @param signer The address from which you plan to generate signatures | ||||
|     /// @param allowed True to register, false to unregister. | ||||
|     function registerAllowedOrderSigner( | ||||
|         address signer, | ||||
|         bool allowed | ||||
|     ) | ||||
|         external; | ||||
|  | ||||
|     /// @dev checks if a given address is registered to sign on behalf of a maker address | ||||
|     /// @param maker The maker address encoded in an order (can be a contract) | ||||
|     /// @param signer The address that is providing a signature | ||||
|     function isValidOrderSigner( | ||||
|         address maker, | ||||
|         address signer | ||||
|     ) | ||||
|         external | ||||
|         view | ||||
|         returns (bool isAllowed); | ||||
| } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user