From fe9fc6b4595ca7607560218cf765037f85e9f293 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Sun, 8 Dec 2019 21:02:17 -0800 Subject: [PATCH 01/24] Allow v2 orders to be filled if their makerAssetFeeData field uses a v2 order id --- .../contracts/src/Forwarder.sol | 2 + .../contracts/src/MixinExchangeWrapper.sol | 115 ++++++++++++++++-- .../contracts/src/interfaces/IExchangeV2.sol | 60 +++++++++ .../contracts/src/libs/LibConstants.sol | 26 +++- .../contracts/test/TestForwarder.sol | 1 + 5 files changed, 188 insertions(+), 16 deletions(-) create mode 100644 contracts/exchange-forwarder/contracts/src/interfaces/IExchangeV2.sol diff --git a/contracts/exchange-forwarder/contracts/src/Forwarder.sol b/contracts/exchange-forwarder/contracts/src/Forwarder.sol index dd83b57368..8ed8fa0b28 100644 --- a/contracts/exchange-forwarder/contracts/src/Forwarder.sol +++ b/contracts/exchange-forwarder/contracts/src/Forwarder.sol @@ -32,12 +32,14 @@ contract Forwarder is { constructor ( address _exchange, + address _exchangeV2, address _weth ) public Ownable() LibConstants( _exchange, + _exchangeV2, _weth ) MixinForwarderCore() diff --git a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol index fa905835f0..08b89587e0 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol @@ -30,6 +30,7 @@ import "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetData.sol"; import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol"; import "./libs/LibConstants.sol"; import "./libs/LibForwarderRichErrors.sol"; +import "./interfaces/IExchangeV2.sol"; import "./MixinAssets.sol"; @@ -54,23 +55,19 @@ contract MixinExchangeWrapper is internal returns (LibFillResults.FillResults memory fillResults) { - // ABI encode calldata for `fillOrder` - bytes memory fillOrderCalldata = abi.encodeWithSelector( - IExchange(address(0)).fillOrder.selector, + if (order.makerFeeAssetData.readBytes4(0) == EXCHANGE_V2_ORDER_ID) { + return _fillV2OrderNoThrow( + order, + takerAssetFillAmount, + signature + ); + } + + return _fillV3OrderNoThrow( order, takerAssetFillAmount, signature ); - - address exchange = address(EXCHANGE); - (bool didSucceed, bytes memory returnData) = exchange.call(fillOrderCalldata); - if (didSucceed) { - assert(returnData.length == 160); - fillResults = abi.decode(returnData, (LibFillResults.FillResults)); - } - - // fillResults values will be 0 by default if call was unsuccessful - return fillResults; } /// @dev Executes a single call of fillOrder according to the wethSellAmount and @@ -370,6 +367,98 @@ contract MixinExchangeWrapper is } } + /// @dev Fills the input ExchangeV2 order. The `makerFeeAssetData` must be + // equal to EXCHANGE_V2_ORDER_ID (0x770501f8). + /// Returns false if the transaction would otherwise revert. + /// @param order Order struct containing order specifications. + /// @param takerAssetFillAmount Desired amount of takerAsset to sell. + /// @param signature Proof that order has been created by maker. + /// @return Amounts filled and fees paid by maker and taker. + function _fillV2OrderNoThrow( + LibOrder.Order memory order, + uint256 takerAssetFillAmount, + bytes memory signature + ) + internal + returns (LibFillResults.FillResults memory fillResults) + { + // Strip v3 specific fields from order + IExchangeV2.Order memory v2Order = IExchangeV2.Order({ + makerAddress: order.makerAddress, + takerAddress: order.takerAddress, + feeRecipientAddress: order.feeRecipientAddress, + senderAddress: order.senderAddress, + makerAssetAmount: order.makerAssetAmount, + takerAssetAmount: order.takerAssetAmount, + makerFee: order.makerFee, + takerFee: order.makerFee, + expirationTimeSeconds: order.expirationTimeSeconds, + salt: order.salt, + makerAssetData: order.makerAssetData, + takerAssetData: order.takerAssetData + }); + + // ABI encode calldata for `fillOrder` + bytes memory fillOrderCalldata = abi.encodeWithSelector( + IExchangeV2(address(0)).fillOrder.selector, + v2Order, + takerAssetFillAmount, + signature + ); + + address exchange = address(EXCHANGE_V2); + (bool didSucceed, bytes memory returnData) = exchange.call(fillOrderCalldata); + if (didSucceed) { + assert(returnData.length == 128); + IExchangeV2.FillResults memory v2FillResults = abi.decode(returnData, (IExchangeV2.FillResults)); + + // Add `protocolFeePaid` field to v2 fill results + fillResults = LibFillResults.FillResults({ + makerAssetFilledAmount: v2FillResults.makerAssetFilledAmount, + takerAssetFilledAmount: v2FillResults.takerAssetFilledAmount, + makerFeePaid: v2FillResults.makerFeePaid, + takerFeePaid: v2FillResults.takerFeePaid, + protocolFeePaid: 0 + }); + } + + // fillResults values will be 0 by default if call was unsuccessful + return fillResults; + } + + /// @dev Fills the input ExchangeV3 order. + /// Returns false if the transaction would otherwise revert. + /// @param order Order struct containing order specifications. + /// @param takerAssetFillAmount Desired amount of takerAsset to sell. + /// @param signature Proof that order has been created by maker. + /// @return Amounts filled and fees paid by maker and taker. + function _fillV3OrderNoThrow( + LibOrder.Order memory order, + uint256 takerAssetFillAmount, + bytes memory signature + ) + internal + returns (LibFillResults.FillResults memory fillResults) + { + // ABI encode calldata for `fillOrder` + bytes memory fillOrderCalldata = abi.encodeWithSelector( + IExchange(address(0)).fillOrder.selector, + order, + takerAssetFillAmount, + signature + ); + + address exchange = address(EXCHANGE); + (bool didSucceed, bytes memory returnData) = exchange.call(fillOrderCalldata); + if (didSucceed) { + assert(returnData.length == 160); + fillResults = abi.decode(returnData, (LibFillResults.FillResults)); + } + + // fillResults values will be 0 by default if call was unsuccessful + return fillResults; + } + /// @dev Checks whether one asset is effectively equal to another asset. /// This is the case if they have the same ERC20Proxy/ERC20BridgeProxy asset data, or if /// one is the ERC20Bridge equivalent of the other. diff --git a/contracts/exchange-forwarder/contracts/src/interfaces/IExchangeV2.sol b/contracts/exchange-forwarder/contracts/src/interfaces/IExchangeV2.sol new file mode 100644 index 0000000000..ae7eb2dc3d --- /dev/null +++ b/contracts/exchange-forwarder/contracts/src/interfaces/IExchangeV2.sol @@ -0,0 +1,60 @@ +/* + + 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; + + +contract IExchangeV2 { + + // solhint-disable max-line-length + struct Order { + address makerAddress; // Address that created the order. + address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. + address feeRecipientAddress; // Address that will recieve fees when order is filled. + address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods. + uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. + uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. + uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted. + uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted. + uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. + uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. + bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy. + bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy. + } + // solhint-enable max-line-length + + struct FillResults { + uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled. + uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled. + uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s). + uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s). + } + + /// @dev Fills the input order. + /// @param order Order struct containing order specifications. + /// @param takerAssetFillAmount Desired amount of takerAsset to sell. + /// @param signature Proof that order has been created by maker. + /// @return Amounts filled and fees paid by maker and taker. + function fillOrder( + Order memory order, + uint256 takerAssetFillAmount, + bytes memory signature + ) + public; +} diff --git a/contracts/exchange-forwarder/contracts/src/libs/LibConstants.sol b/contracts/exchange-forwarder/contracts/src/libs/LibConstants.sol index 6b40475363..b167b665de 100644 --- a/contracts/exchange-forwarder/contracts/src/libs/LibConstants.sol +++ b/contracts/exchange-forwarder/contracts/src/libs/LibConstants.sol @@ -18,29 +18,49 @@ pragma solidity ^0.5.9; -import "@0x/contracts-utils/contracts/src/LibBytes.sol"; import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol"; import "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol"; +import "../interfaces/IExchangeV2.sol"; contract LibConstants { - using LibBytes for bytes; + uint256 constant internal MAX_UINT = uint256(-1); - uint256 constant internal MAX_UINT = 2**256 - 1; + // The v2 order id is the first 4 bytes of the ExchangeV2 order shema hash. + // bytes4(keccak256(abi.encodePacked( + // "Order(", + // "address makerAddress,", + // "address takerAddress,", + // "address feeRecipientAddress,", + // "address senderAddress,", + // "uint256 makerAssetAmount,", + // "uint256 takerAssetAmount,", + // "uint256 makerFee,", + // "uint256 takerFee,", + // "uint256 expirationTimeSeconds,", + // "uint256 salt,", + // "bytes makerAssetData,", + // "bytes takerAssetData", + // ")" + // ))); + bytes4 constant public EXCHANGE_V2_ORDER_ID = 0x770501f8; // solhint-disable var-name-mixedcase IExchange internal EXCHANGE; + IExchangeV2 internal EXCHANGE_V2; IEtherToken internal ETHER_TOKEN; // solhint-enable var-name-mixedcase constructor ( address _exchange, + address _exchangeV2, address _weth ) public { EXCHANGE = IExchange(_exchange); + EXCHANGE_V2 = IExchangeV2(_exchangeV2); ETHER_TOKEN = IEtherToken(_weth); } } diff --git a/contracts/exchange-forwarder/contracts/test/TestForwarder.sol b/contracts/exchange-forwarder/contracts/test/TestForwarder.sol index 593597da32..fcbfb44b03 100644 --- a/contracts/exchange-forwarder/contracts/test/TestForwarder.sol +++ b/contracts/exchange-forwarder/contracts/test/TestForwarder.sol @@ -31,6 +31,7 @@ contract TestForwarder is constructor () public LibConstants( + address(0), address(0), address(0) ) From c7c8a4891f83fd26176cd9252a755af8db4264da Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Sun, 8 Dec 2019 21:02:38 -0800 Subject: [PATCH 02/24] Update TS boilerplate --- contracts/exchange-forwarder/package.json | 2 +- contracts/exchange-forwarder/test/artifacts.ts | 2 ++ contracts/exchange-forwarder/test/wrappers.ts | 1 + contracts/exchange-forwarder/tsconfig.json | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/exchange-forwarder/package.json b/contracts/exchange-forwarder/package.json index 67b6ba6fa7..1852d1451a 100644 --- a/contracts/exchange-forwarder/package.json +++ b/contracts/exchange-forwarder/package.json @@ -39,7 +39,7 @@ }, "config": { "publicInterfaceContracts": "Forwarder", - "abis": "./test/generated-artifacts/@(Forwarder|IAssets|IForwarder|IForwarderCore|LibConstants|LibForwarderRichErrors|MixinAssets|MixinExchangeWrapper|MixinForwarderCore|MixinWeth|TestForwarder).json", + "abis": "./test/generated-artifacts/@(Forwarder|IAssets|IExchangeV2|IForwarder|IForwarderCore|LibConstants|LibForwarderRichErrors|MixinAssets|MixinExchangeWrapper|MixinForwarderCore|MixinWeth|TestForwarder).json", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." }, "repository": { diff --git a/contracts/exchange-forwarder/test/artifacts.ts b/contracts/exchange-forwarder/test/artifacts.ts index 4aee7980bd..f1ca2b9d64 100644 --- a/contracts/exchange-forwarder/test/artifacts.ts +++ b/contracts/exchange-forwarder/test/artifacts.ts @@ -7,6 +7,7 @@ import { ContractArtifact } from 'ethereum-types'; import * as Forwarder from '../test/generated-artifacts/Forwarder.json'; import * as IAssets from '../test/generated-artifacts/IAssets.json'; +import * as IExchangeV2 from '../test/generated-artifacts/IExchangeV2.json'; import * as IForwarder from '../test/generated-artifacts/IForwarder.json'; import * as IForwarderCore from '../test/generated-artifacts/IForwarderCore.json'; import * as LibConstants from '../test/generated-artifacts/LibConstants.json'; @@ -23,6 +24,7 @@ export const artifacts = { MixinForwarderCore: MixinForwarderCore as ContractArtifact, MixinWeth: MixinWeth as ContractArtifact, IAssets: IAssets as ContractArtifact, + IExchangeV2: IExchangeV2 as ContractArtifact, IForwarder: IForwarder as ContractArtifact, IForwarderCore: IForwarderCore as ContractArtifact, LibConstants: LibConstants as ContractArtifact, diff --git a/contracts/exchange-forwarder/test/wrappers.ts b/contracts/exchange-forwarder/test/wrappers.ts index 22b048ce75..68dfe360b0 100644 --- a/contracts/exchange-forwarder/test/wrappers.ts +++ b/contracts/exchange-forwarder/test/wrappers.ts @@ -5,6 +5,7 @@ */ export * from '../test/generated-wrappers/forwarder'; export * from '../test/generated-wrappers/i_assets'; +export * from '../test/generated-wrappers/i_exchange_v2'; export * from '../test/generated-wrappers/i_forwarder'; export * from '../test/generated-wrappers/i_forwarder_core'; export * from '../test/generated-wrappers/lib_constants'; diff --git a/contracts/exchange-forwarder/tsconfig.json b/contracts/exchange-forwarder/tsconfig.json index 94a8af37fc..9ebde3a67c 100644 --- a/contracts/exchange-forwarder/tsconfig.json +++ b/contracts/exchange-forwarder/tsconfig.json @@ -6,6 +6,7 @@ "generated-artifacts/Forwarder.json", "test/generated-artifacts/Forwarder.json", "test/generated-artifacts/IAssets.json", + "test/generated-artifacts/IExchangeV2.json", "test/generated-artifacts/IForwarder.json", "test/generated-artifacts/IForwarderCore.json", "test/generated-artifacts/LibConstants.json", From 30a2015a6836355a7e451f875745d81a069a5e40 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Sun, 15 Dec 2019 14:19:16 -0800 Subject: [PATCH 03/24] Fix build --- .../exchange-forwarder/contracts/src/libs/LibConstants.sol | 2 +- contracts/integrations/test/forwarder/deploy_forwarder.ts | 3 ++- contracts/integrations/test/forwarder/forwarder_test.ts | 1 + packages/migrations/src/migration.ts | 1 + packages/migrations/src/testnet_migrations.ts | 4 ++-- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/contracts/exchange-forwarder/contracts/src/libs/LibConstants.sol b/contracts/exchange-forwarder/contracts/src/libs/LibConstants.sol index b167b665de..05fe8d2c73 100644 --- a/contracts/exchange-forwarder/contracts/src/libs/LibConstants.sol +++ b/contracts/exchange-forwarder/contracts/src/libs/LibConstants.sol @@ -27,7 +27,7 @@ contract LibConstants { uint256 constant internal MAX_UINT = uint256(-1); - // The v2 order id is the first 4 bytes of the ExchangeV2 order shema hash. + // The v2 order id is the first 4 bytes of the ExchangeV2 order schema hash. // bytes4(keccak256(abi.encodePacked( // "Order(", // "address makerAddress,", diff --git a/contracts/integrations/test/forwarder/deploy_forwarder.ts b/contracts/integrations/test/forwarder/deploy_forwarder.ts index 9566ab35af..1654dd06ba 100644 --- a/contracts/integrations/test/forwarder/deploy_forwarder.ts +++ b/contracts/integrations/test/forwarder/deploy_forwarder.ts @@ -1,6 +1,6 @@ import { artifacts as exchangeArtifacts } from '@0x/contracts-exchange'; import { artifacts, ForwarderContract } from '@0x/contracts-exchange-forwarder'; -import { BlockchainTestsEnvironment } from '@0x/contracts-test-utils'; +import { BlockchainTestsEnvironment, constants } from '@0x/contracts-test-utils'; import { DeploymentManager } from '../framework/deployment_manager'; @@ -17,6 +17,7 @@ export async function deployForwarderAsync( deployment.txDefaults, { ...exchangeArtifacts, ...artifacts }, deployment.exchange.address, + constants.NULL_ADDRESS, // ExchangeV2 not tested on Ganache deployment.tokens.weth.address, ); } diff --git a/contracts/integrations/test/forwarder/forwarder_test.ts b/contracts/integrations/test/forwarder/forwarder_test.ts index 9ccb465415..68a50b2e58 100644 --- a/contracts/integrations/test/forwarder/forwarder_test.ts +++ b/contracts/integrations/test/forwarder/forwarder_test.ts @@ -125,6 +125,7 @@ blockchainTests('Forwarder integration tests', env => { env.txDefaults, {}, exchange.address, + constants.NULL_ADDRESS, deployment.tokens.weth.address, ); await expect(deployForwarder).to.revertWith( diff --git a/packages/migrations/src/migration.ts b/packages/migrations/src/migration.ts index d5c9765a0f..3db4cdf26f 100644 --- a/packages/migrations/src/migration.ts +++ b/packages/migrations/src/migration.ts @@ -243,6 +243,7 @@ export async function runMigrationsAsync( txDefaults, artifacts, exchange.address, + constants.NULL_ADDRESS, etherToken.address, ); diff --git a/packages/migrations/src/testnet_migrations.ts b/packages/migrations/src/testnet_migrations.ts index 3a8c91fc0a..2a96fc7f8a 100644 --- a/packages/migrations/src/testnet_migrations.ts +++ b/packages/migrations/src/testnet_migrations.ts @@ -238,15 +238,15 @@ export async function runMigrationsAsync(supportedProvider: SupportedProvider, t chainId, ); - const forwarder = await ForwarderContract.deployFrom0xArtifactAsync( + await ForwarderContract.deployFrom0xArtifactAsync( forwarderArtifacts.Forwarder, provider, txDefaults, forwarderArtifacts, exchange.address, + deployedAddresses.exchangeV2, deployedAddresses.etherToken, ); - await forwarder.approveMakerAssetProxy(deployedAddresses.etherToken).awaitTransactionSuccessAsync(); } (async () => { From 4a299c1f39664840af33a7f1ea038da43efbc3af Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Mon, 16 Dec 2019 07:44:33 -0800 Subject: [PATCH 04/24] Change EVM target to istanbul for all contract packages except erc-20 --- contracts/asset-proxy/compiler.json | 2 +- contracts/asset-proxy/truffle-config.js | 2 +- contracts/coordinator/compiler.json | 2 +- contracts/coordinator/truffle-config.js | 2 +- contracts/dev-utils/compiler.json | 2 +- contracts/dev-utils/truffle-config.js | 2 +- contracts/erc1155/compiler.json | 2 +- contracts/erc1155/truffle-config.js | 2 +- contracts/erc20-bridge-sampler/compiler.json | 2 +- contracts/erc20-bridge-sampler/truffle-config.js | 2 +- contracts/erc20/compiler.json | 2 +- contracts/erc721/compiler.json | 2 +- contracts/erc721/truffle-config.js | 2 +- contracts/exchange-forwarder/compiler.json | 2 +- contracts/exchange-forwarder/truffle-config.js | 2 +- contracts/exchange-libs/compiler.json | 2 +- contracts/exchange-libs/truffle-config.js | 2 +- contracts/exchange/compiler.json | 2 +- contracts/exchange/truffle-config.js | 2 +- contracts/extensions/compiler.json | 2 +- contracts/extensions/truffle-config.js | 2 +- contracts/integrations/compiler.json | 2 +- contracts/multisig/compiler.json | 2 +- contracts/multisig/contracts/test/TestRejectEther.sol | 2 +- contracts/multisig/truffle-config.js | 2 +- contracts/staking/compiler.json | 2 +- contracts/staking/truffle-config.js | 2 +- contracts/utils/compiler.json | 2 +- contracts/utils/truffle-config.js | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/contracts/asset-proxy/compiler.json b/contracts/asset-proxy/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/asset-proxy/compiler.json +++ b/contracts/asset-proxy/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/asset-proxy/truffle-config.js b/contracts/asset-proxy/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/asset-proxy/truffle-config.js +++ b/contracts/asset-proxy/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/coordinator/compiler.json b/contracts/coordinator/compiler.json index 4a8f61a09f..700f431289 100644 --- a/contracts/coordinator/compiler.json +++ b/contracts/coordinator/compiler.json @@ -3,7 +3,7 @@ "contractsDir": "./contracts", "useDockerisedSolc": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/coordinator/truffle-config.js b/contracts/coordinator/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/coordinator/truffle-config.js +++ b/contracts/coordinator/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/dev-utils/compiler.json b/contracts/dev-utils/compiler.json index 3dac040e77..d473413e33 100644 --- a/contracts/dev-utils/compiler.json +++ b/contracts/dev-utils/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200, diff --git a/contracts/dev-utils/truffle-config.js b/contracts/dev-utils/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/dev-utils/truffle-config.js +++ b/contracts/dev-utils/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/erc1155/compiler.json b/contracts/erc1155/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/erc1155/compiler.json +++ b/contracts/erc1155/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/erc1155/truffle-config.js b/contracts/erc1155/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/erc1155/truffle-config.js +++ b/contracts/erc1155/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/erc20-bridge-sampler/compiler.json b/contracts/erc20-bridge-sampler/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/erc20-bridge-sampler/compiler.json +++ b/contracts/erc20-bridge-sampler/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/erc20-bridge-sampler/truffle-config.js b/contracts/erc20-bridge-sampler/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/erc20-bridge-sampler/truffle-config.js +++ b/contracts/erc20-bridge-sampler/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/erc20/compiler.json b/contracts/erc20/compiler.json index e65c0e7194..7d150eaa46 100644 --- a/contracts/erc20/compiler.json +++ b/contracts/erc20/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/erc721/compiler.json b/contracts/erc721/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/erc721/compiler.json +++ b/contracts/erc721/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/erc721/truffle-config.js b/contracts/erc721/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/erc721/truffle-config.js +++ b/contracts/erc721/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/exchange-forwarder/compiler.json b/contracts/exchange-forwarder/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/exchange-forwarder/compiler.json +++ b/contracts/exchange-forwarder/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/exchange-forwarder/truffle-config.js b/contracts/exchange-forwarder/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/exchange-forwarder/truffle-config.js +++ b/contracts/exchange-forwarder/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/exchange-libs/compiler.json b/contracts/exchange-libs/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/exchange-libs/compiler.json +++ b/contracts/exchange-libs/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/exchange-libs/truffle-config.js b/contracts/exchange-libs/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/exchange-libs/truffle-config.js +++ b/contracts/exchange-libs/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/exchange/compiler.json b/contracts/exchange/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/exchange/compiler.json +++ b/contracts/exchange/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/exchange/truffle-config.js b/contracts/exchange/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/exchange/truffle-config.js +++ b/contracts/exchange/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/extensions/compiler.json b/contracts/extensions/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/extensions/compiler.json +++ b/contracts/extensions/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/extensions/truffle-config.js b/contracts/extensions/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/extensions/truffle-config.js +++ b/contracts/extensions/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/integrations/compiler.json b/contracts/integrations/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/integrations/compiler.json +++ b/contracts/integrations/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/multisig/compiler.json b/contracts/multisig/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/multisig/compiler.json +++ b/contracts/multisig/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/multisig/contracts/test/TestRejectEther.sol b/contracts/multisig/contracts/test/TestRejectEther.sol index e3179fcdff..7df961c20d 100644 --- a/contracts/multisig/contracts/test/TestRejectEther.sol +++ b/contracts/multisig/contracts/test/TestRejectEther.sol @@ -16,7 +16,7 @@ */ -pragma solidity 0.4.24; +pragma solidity ^0.5.9; // solhint-disable no-empty-blocks diff --git a/contracts/multisig/truffle-config.js b/contracts/multisig/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/multisig/truffle-config.js +++ b/contracts/multisig/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/staking/compiler.json b/contracts/staking/compiler.json index 86353989a3..f66848360b 100644 --- a/contracts/staking/compiler.json +++ b/contracts/staking/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": true, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/staking/truffle-config.js b/contracts/staking/truffle-config.js index a5eb0c0dd7..4942f2446e 100644 --- a/contracts/staking/truffle-config.js +++ b/contracts/staking/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.11', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, diff --git a/contracts/utils/compiler.json b/contracts/utils/compiler.json index 6d739870f0..2984f7fd9f 100644 --- a/contracts/utils/compiler.json +++ b/contracts/utils/compiler.json @@ -4,7 +4,7 @@ "useDockerisedSolc": false, "isOfflineMode": false, "compilerSettings": { - "evmVersion": "constantinople", + "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 1000000, diff --git a/contracts/utils/truffle-config.js b/contracts/utils/truffle-config.js index 2bcbbed1e2..8c95491cdc 100644 --- a/contracts/utils/truffle-config.js +++ b/contracts/utils/truffle-config.js @@ -84,7 +84,7 @@ module.exports = { solc: { version: '0.5.9', settings: { - evmVersion: 'constantinople', + evmVersion: 'istanbul', optimizer: { enabled: true, runs: 1000000, From fa99b75d1f4336c735bada1c18fc7d8e78225411 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Mon, 16 Dec 2019 09:40:13 -0800 Subject: [PATCH 05/24] Redeploy Forwarder and all bridges --- contracts/asset-proxy/src/index.ts | 2 ++ .../contracts/src/DeploymentConstants.sol | 4 ---- packages/contract-addresses/addresses.json | 9 +++++-- packages/contract-addresses/src/index.ts | 1 + packages/migrations/src/migration.ts | 1 + packages/migrations/src/testnet_migrations.ts | 24 +++++++++++++++++++ 6 files changed, 35 insertions(+), 6 deletions(-) diff --git a/contracts/asset-proxy/src/index.ts b/contracts/asset-proxy/src/index.ts index d9a69c68ef..8682fe2572 100644 --- a/contracts/asset-proxy/src/index.ts +++ b/contracts/asset-proxy/src/index.ts @@ -13,6 +13,8 @@ export { StaticCallProxyContract, TestStaticCallTargetContract, UniswapBridgeContract, + KyberBridgeContract, + ChaiBridgeContract, } from './wrappers'; export { ERC20Wrapper } from './erc20_wrapper'; diff --git a/contracts/utils/contracts/src/DeploymentConstants.sol b/contracts/utils/contracts/src/DeploymentConstants.sol index de92e1cccf..7662f3c6d8 100644 --- a/contracts/utils/contracts/src/DeploymentConstants.sol +++ b/contracts/utils/contracts/src/DeploymentConstants.sol @@ -18,10 +18,6 @@ pragma solidity ^0.5.9; -import "./interfaces/IOwnable.sol"; -import "./LibOwnableRichErrors.sol"; -import "./LibRichErrors.sol"; - contract DeploymentConstants { /// @dev Mainnet address of the WETH contract. diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index 1742da742a..b6fd8c3ab0 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -4,7 +4,7 @@ "exchange": "0x61935cbdd02287b511119ddb11aeb42f1593b7ef", "erc20Proxy": "0x95e6f48254609a6ee006f7d493c8e5fb97094cef", "erc721Proxy": "0xefc70a1b18c432bdc64b596838b4d138f6bc6cad", - "forwarder": "0xa3ac9844514b96bb502627ca9dceb57c4be289e3", + "forwarder": "0xbf1e3a8405906904b3692446e0fb4e309628a9fe", "orderValidator": "0x0000000000000000000000000000000000000000", "zrxToken": "0xe41d2489571d322189246dafa5ebde1f4699f498", "etherToken": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", @@ -22,9 +22,10 @@ "devUtils": "0xc7612135356ba8f75dbf517b55d88a91977492dc", "erc20BridgeProxy": "0x8ed95d1746bf1e4dab58d8ed4724f1ef95b20db0", "uniswapBridge": "0xb0dc61047847732a013ce27341228228a38655a0", - "eth2DaiBridge": "0x0ac2d6f5f5afc669d3ca38f830dad2b4f238ad3f", "erc20BridgeSampler": "0x1b402fdb5ee87f989c11e3963557e89cc313b6c0", "kyberBridge": "0x7253a80c1d3a3175283bad9ed04b2cecad0fe0d3", + "eth2DaiBridge": "0x1c36b06fc0d9354a96cf155b861b141ed10c3312", + "chaiBridge": "0x6a3b7c553d47c08651641ef00cb3befae97bf415", "dydxBridge": "0x96ddba19b69d6ea2549f6a12d005595167414744" }, "3": { @@ -53,6 +54,7 @@ "eth2DaiBridge": "0x0000000000000000000000000000000000000000", "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", "kyberBridge": "0x0000000000000000000000000000000000000000", + "chaiBridge": "0x0000000000000000000000000000000000000000", "dydxBridge": "0x0000000000000000000000000000000000000000" }, "4": { @@ -81,6 +83,7 @@ "eth2DaiBridge": "0x0000000000000000000000000000000000000000", "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", "kyberBridge": "0x0000000000000000000000000000000000000000", + "chaiBridge": "0x0000000000000000000000000000000000000000", "dydxBridge": "0x0000000000000000000000000000000000000000" }, "42": { @@ -109,6 +112,7 @@ "eth2DaiBridge": "0x0000000000000000000000000000000000000000", "erc20BridgeSampler": "0x551f0e213dcb71f676558d8b0ab559d1cdd103f2", "kyberBridge": "0x0000000000000000000000000000000000000000", + "chaiBridge": "0x0000000000000000000000000000000000000000", "dydxBridge": "0x0000000000000000000000000000000000000000" }, "1337": { @@ -137,6 +141,7 @@ "eth2DaiBridge": "0x0000000000000000000000000000000000000000", "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", "kyberBridge": "0x0000000000000000000000000000000000000000", + "chaiBridge": "0x0000000000000000000000000000000000000000", "dydxBridge": "0x0000000000000000000000000000000000000000" } } diff --git a/packages/contract-addresses/src/index.ts b/packages/contract-addresses/src/index.ts index 66ca55b2ab..56d231d8b0 100644 --- a/packages/contract-addresses/src/index.ts +++ b/packages/contract-addresses/src/index.ts @@ -26,6 +26,7 @@ export interface ContractAddresses { uniswapBridge: string; eth2DaiBridge: string; kyberBridge: string; + chaiBridge: string; dydxBridge: string; } diff --git a/packages/migrations/src/migration.ts b/packages/migrations/src/migration.ts index 3db4cdf26f..69d604d5b9 100644 --- a/packages/migrations/src/migration.ts +++ b/packages/migrations/src/migration.ts @@ -271,6 +271,7 @@ export async function runMigrationsAsync( eth2DaiBridge: constants.NULL_ADDRESS, kyberBridge: constants.NULL_ADDRESS, erc20BridgeSampler: constants.NULL_ADDRESS, + chaiBridge: constants.NULL_ADDRESS, dydxBridge: constants.NULL_ADDRESS, }; return contractAddresses; diff --git a/packages/migrations/src/testnet_migrations.ts b/packages/migrations/src/testnet_migrations.ts index 2a96fc7f8a..80a2e1f7a6 100644 --- a/packages/migrations/src/testnet_migrations.ts +++ b/packages/migrations/src/testnet_migrations.ts @@ -1,8 +1,11 @@ import { getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; import { artifacts as assetProxyArtifacts, + ChaiBridgeContract, + DydxBridgeContract, ERC20BridgeProxyContract, Eth2DaiBridgeContract, + KyberBridgeContract, UniswapBridgeContract, } from '@0x/contracts-asset-proxy'; import { artifacts as coordinatorArtifacts, CoordinatorContract } from '@0x/contracts-coordinator'; @@ -103,6 +106,27 @@ export async function runMigrationsAsync(supportedProvider: SupportedProvider, t assetProxyArtifacts, ); + await KyberBridgeContract.deployFrom0xArtifactAsync( + assetProxyArtifacts.KyberBridge, + provider, + txDefaults, + assetProxyArtifacts, + ); + + await ChaiBridgeContract.deployFrom0xArtifactAsync( + assetProxyArtifacts.ChaiBridge, + provider, + txDefaults, + assetProxyArtifacts, + ); + + await DydxBridgeContract.deployFrom0xArtifactAsync( + assetProxyArtifacts.DydxBridge, + provider, + txDefaults, + assetProxyArtifacts, + ); + const authorizableInterface = new IAuthorizableContract(constants.NULL_ADDRESS, provider, txDefaults); const ownableInterface = new IOwnableContract(constants.NULL_ADDRESS, provider, txDefaults); From 0f151db3551850bba08b7173da9b6ac07b36ac69 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Tue, 17 Dec 2019 08:25:46 -0800 Subject: [PATCH 06/24] Enable istanbul in Ganache --- contracts/test-utils/src/web3_wrapper.ts | 1 + package.json | 2 +- packages/dev-utils/src/web3_factory.ts | 2 + packages/subproviders/package.json | 2 +- yarn.lock | 817 +++++++++++++++++++++-- 5 files changed, 768 insertions(+), 56 deletions(-) diff --git a/contracts/test-utils/src/web3_wrapper.ts b/contracts/test-utils/src/web3_wrapper.ts index 9ac3dbbb42..c8e3efa66f 100644 --- a/contracts/test-utils/src/web3_wrapper.ts +++ b/contracts/test-utils/src/web3_wrapper.ts @@ -19,6 +19,7 @@ export let providerConfigs: Web3Config = { total_accounts: constants.NUM_TEST_ACCOUNTS, shouldUseInProcessGanache: true, shouldAllowUnlimitedContractSize: true, + hardfork: 'istanbul', }; export const provider: Web3ProviderEngine = web3Factory.getRpcProvider(providerConfigs); diff --git a/package.json b/package.json index 1e7fe872cc..df0a5c57fa 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "async-child-process": "^1.1.1", "bundlewatch": "^0.2.1", "coveralls": "^3.0.0", - "ganache-cli": "6.4.1", + "ganache-cli": "6.8.0-istanbul.0", "lcov-result-merger": "^3.0.0", "lerna": "^3.0.0-beta.25", "npm-run-all": "^4.1.2", diff --git a/packages/dev-utils/src/web3_factory.ts b/packages/dev-utils/src/web3_factory.ts index e2750389ec..2ce3088175 100644 --- a/packages/dev-utils/src/web3_factory.ts +++ b/packages/dev-utils/src/web3_factory.ts @@ -25,6 +25,7 @@ export interface Web3Config { blockTime?: number; locked?: boolean; unlocked_accounts?: string[]; + hardfork?: string; } export const web3Factory = { @@ -81,6 +82,7 @@ export const web3Factory = { blockTime: config.blockTime, locked: config.locked, unlocked_accounts: config.unlocked_accounts, + hardfork: config.hardfork, } as any), // TODO remove any once types are merged in DefinitelyTyped ); } else { diff --git a/packages/subproviders/package.json b/packages/subproviders/package.json index 6b6f40c4ec..a0e4d3e687 100644 --- a/packages/subproviders/package.json +++ b/packages/subproviders/package.json @@ -47,7 +47,7 @@ "ethereum-types": "^3.0.0", "ethereumjs-tx": "^1.3.5", "ethereumjs-util": "^5.1.1", - "ganache-core": "^2.6.0", + "ganache-core": "2.9.0-istanbul.0", "hdkey": "^0.7.1", "json-rpc-error": "2.0.0", "lodash": "^4.17.11", diff --git a/yarn.lock b/yarn.lock index c51ab50594..3e3e4d9582 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1903,6 +1903,11 @@ dependencies: any-observable "^0.3.0" +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + "@sinonjs/formatio@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" @@ -1926,6 +1931,13 @@ mime "^2.3.1" update-notifier "^2.5.0" +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + "@types/babel__core@^7.1.0": version "7.1.2" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" @@ -2620,6 +2632,11 @@ ansi-regex@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2946,6 +2963,13 @@ async@2.6.1, async@^2.1.4: dependencies: lodash "^4.17.10" +async@2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + async@^0.9.0, async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -4337,6 +4361,19 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + cachedown@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" @@ -4761,10 +4798,26 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + clone-stats@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" @@ -5461,6 +5514,14 @@ d@1: dependencies: es5-ext "^0.10.9" +d@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dargs@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" @@ -5677,6 +5738,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.1.1" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.1.tgz#88ae694b93f67b81815a2c8c769aef6574ac8f2f" + integrity sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ== + deferred-leveldown@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" @@ -6272,6 +6338,15 @@ es5-ext@^0.10.46: es6-symbol "~3.1.1" next-tick "^1.0.0" +es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" @@ -6301,6 +6376,14 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.1: d "1" es5-ext "~0.10.14" +es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + es6-weak-map@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" @@ -6480,6 +6563,14 @@ eth-block-tracker@^3.0.0: pify "^2.3.0" tape "^4.6.3" +eth-ens-namehash@2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" + integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= + dependencies: + idna-uts46-hx "^2.3.1" + js-sha3 "^0.5.7" + eth-json-rpc-infura@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.1.0.tgz#01b955a04d1a827b14c6cdc8a78b3a025d06a183" @@ -6554,6 +6645,18 @@ eth-sig-util@2.1.2: tweetnacl "^1.0.0" tweetnacl-util "^0.15.0" +eth-sig-util@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.3.0.tgz#c54a6ac8e8796f7e25f59cf436982a930e645231" + integrity sha512-ugD1AvaggvKaZDgnS19W5qOfepjGc7qHrt7TrAaL54gJw9SHvgIXJ3r2xOMW30RWJZNP+1GlTOy5oye7yXA4xA== + dependencies: + buffer "^5.2.1" + elliptic "^6.4.0" + ethereumjs-abi "0.6.5" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.0" + tweetnacl-util "^0.15.0" + eth-sig-util@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" @@ -6617,6 +6720,14 @@ ethereumjs-abi@0.6.5: bn.js "^4.10.0" ethereumjs-util "^4.3.0" +ethereumjs-abi@0.6.7: + version "0.6.7" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.7.tgz#d1d1c5cdb8d910a7d97645ba9e93be5d153bba2e" + integrity sha512-EMLOA8ICO5yAaXDhjVEfYjsJIXYutY8ufTE93eEKwsVtp2usQreKwsDTJ9zvam3omYqNuffr8IONIqb2uUslGQ== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": version "0.6.5" resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#00ba8463a7f7a67fcad737ff9c2ebd95643427f7" @@ -6632,14 +6743,7 @@ ethereumjs-account@2.0.5: rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-account@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.4.tgz#f8c30231bcb707f4514d8a052c1f9da103624d47" - dependencies: - ethereumjs-util "^4.0.1" - rlp "^2.0.0" - -ethereumjs-account@^3.0.0: +ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" dependencies: @@ -6647,6 +6751,13 @@ ethereumjs-account@^3.0.0: rlp "^2.2.1" safe-buffer "^5.1.1" +ethereumjs-account@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.4.tgz#f8c30231bcb707f4514d8a052c1f9da103624d47" + dependencies: + ethereumjs-util "^4.0.1" + rlp "^2.0.0" + ethereumjs-block@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.1.0.tgz#71d1b19e18061f14cf6371bf34ba31a359931360" @@ -6657,6 +6768,16 @@ ethereumjs-block@2.1.0: ethereumjs-util "^5.0.0" merkle-patricia-tree "^2.1.2" +ethereumjs-block@2.2.0, ethereumjs-block@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz#8c6c3ab4a5eff0a16d9785fbeedbe643f4dbcbef" + dependencies: + async "^2.0.1" + ethereumjs-common "^1.1.0" + ethereumjs-tx "^1.2.2" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0, ethereumjs-block@~1.7.0: version "1.7.1" resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" @@ -6667,16 +6788,6 @@ ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0, ether ethereumjs-util "^5.0.0" merkle-patricia-tree "^2.1.2" -ethereumjs-block@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz#8c6c3ab4a5eff0a16d9785fbeedbe643f4dbcbef" - dependencies: - async "^2.0.1" - ethereumjs-common "^1.1.0" - ethereumjs-tx "^1.2.2" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - ethereumjs-blockchain@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.1.tgz#db113dfed4fcc5197d223391f10adbc5a1b3536b" @@ -6712,6 +6823,11 @@ ethereumjs-common@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.3.1.tgz#a5cffac41beb7ad393283b2e5aa71fadf8a9cc73" +ethereumjs-common@^1.3.1, ethereumjs-common@^1.3.2: + version "1.5.0" + resolved "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" + integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ== + ethereumjs-tx@1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" @@ -6733,6 +6849,14 @@ ethereumjs-tx@^2.1.0: ethereumjs-common "^1.3.0" ethereumjs-util "^6.0.0" +ethereumjs-tx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.1.tgz#7d204e2b319156c9bc6cec67e9529424a26e8ccc" + integrity sha512-QtVriNqowCFA19X9BCRPMgdVNJ0/gMBS91TQb1DfrhsbR748g4STwxZptFAwfqehMyrF8rDwB23w87PQwru0wA== + dependencies: + ethereumjs-common "^1.3.1" + ethereumjs-util "^6.0.0" + ethereumjs-util@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" @@ -6745,6 +6869,19 @@ ethereumjs-util@5.2.0: safe-buffer "^5.1.1" secp256k1 "^3.0.1" +ethereumjs-util@6.1.0, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@~6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8" + integrity sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + ethjs-util "0.1.6" + keccak "^1.0.2" + rlp "^2.0.0" + safe-buffer "^5.1.1" + secp256k1 "^3.0.1" + ethereumjs-util@^4.0.1, ethereumjs-util@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6" @@ -6767,18 +6904,6 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum safe-buffer "^5.1.1" secp256k1 "^3.0.1" -ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@~6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8" - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "0.1.6" - keccak "^1.0.2" - rlp "^2.0.0" - safe-buffer "^5.1.1" - secp256k1 "^3.0.1" - ethereumjs-util@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz#23ec79b2488a7d041242f01e25f24e5ad0357960" @@ -6808,6 +6933,27 @@ ethereumjs-vm@2.6.0: rustbn.js "~0.2.0" safe-buffer "^5.1.1" +ethereumjs-vm@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-4.1.0.tgz#359ed3592636390a5b2909a28d955c908830daa5" + integrity sha512-qvgmKkyF+eZ6NvtqTV74z9oRB7UxUStA0gShEbXftovpukVIYVzhvCl9KvUi64Rpo8jufze6Z0zHhiQpZN0Izw== + dependencies: + async "^2.1.2" + async-eventemitter "^0.2.2" + core-js-pure "^3.0.1" + ethereumjs-account "^3.0.0" + ethereumjs-block "~2.2.0" + ethereumjs-blockchain "^4.0.1" + ethereumjs-common "^1.3.2" + ethereumjs-tx "^2.1.1" + ethereumjs-util "^6.1.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "^2.3.2" + rustbn.js "~0.2.0" + safe-buffer "^5.1.1" + util.promisify "^1.0.0" + ethereumjs-vm@^2.0.2, ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.3.4.tgz#f635d7cb047571a1840a6e9a74d29de4488f8ad6" @@ -6858,6 +7004,22 @@ ethereumjs-wallet@0.6.3: utf8 "^3.0.0" uuid "^3.3.2" +ethers@4.0.0-beta.3: + version "4.0.0-beta.3" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz#15bef14e57e94ecbeb7f9b39dd0a4bd435bc9066" + integrity sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog== + dependencies: + "@types/node" "^10.3.2" + aes-js "3.0.0" + bn.js "^4.4.0" + elliptic "6.3.3" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.3" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + ethers@~4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.4.tgz#d3f85e8b27f4b59537e06526439b0fb15b44dc65" @@ -6936,7 +7098,7 @@ eventemitter3@3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" -eventemitter3@^3.1.0: +eventemitter3@3.1.2, eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" @@ -7161,6 +7323,13 @@ express@^4.16.3: utils-merge "1.0.1" vary "~1.1.2" +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -7701,6 +7870,15 @@ fs-extra@^2.0.0, fs-extra@^2.1.2: graceful-fs "^4.1.2" jsonfile "^2.1.0" +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" @@ -7795,13 +7973,47 @@ functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" -ganache-cli@6.4.1: - version "6.4.1" - resolved "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.4.1.tgz#77c1682883a544dcad160b0e8155e282aefb4f1f" +ganache-cli@6.8.0-istanbul.0: + version "6.8.0-istanbul.0" + resolved "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.8.0-istanbul.0.tgz#ec19bc08ff30d250ae13c6f57c16069ecf583fa6" + integrity sha512-ELGCztyrqhSTQyPFAx5++iAFPODKCv8i3qoaPj7oq1DtyJQwZp6XjQb9Yu39kdW/VYR4rA0HuHW1oxRtTkmr9Q== dependencies: - bn.js "4.11.8" - source-map-support "0.5.9" - yargs "11.1.0" + ethereumjs-util "6.1.0" + source-map-support "0.5.12" + yargs "13.2.4" + +ganache-core@2.9.0-istanbul.0: + version "2.9.0-istanbul.0" + resolved "https://registry.npmjs.org/ganache-core/-/ganache-core-2.9.0-istanbul.0.tgz#bc336c770775a2b9fb06f5cae827088ecc194283" + integrity sha512-wqNWyxrfZe4QPxzaR/n4hGxIfa1iZAkymPg17wET0iWZ9uurMywGgpG4ZvxjVU9q7WCjIobOSzE1m9OT0dIYcQ== + dependencies: + abstract-leveldown "3.0.0" + async "2.6.2" + bip39 "2.5.0" + cachedown "1.0.0" + clone "2.1.2" + debug "3.2.6" + encoding-down "5.0.4" + eth-sig-util "2.3.0" + ethereumjs-abi "0.6.7" + ethereumjs-account "3.0.0" + ethereumjs-block "2.2.0" + ethereumjs-tx "1.3.7" + ethereumjs-util "6.1.0" + ethereumjs-vm "4.1.0" + heap "0.2.6" + level-sublevel "6.6.4" + levelup "3.1.1" + lodash "4.17.14" + merkle-patricia-tree "2.3.2" + seedrandom "3.0.1" + source-map-support "0.5.12" + tmp "0.1.0" + web3-provider-engine "14.2.1" + websocket "1.0.29" + optionalDependencies: + ethereumjs-wallet "0.6.3" + web3 "1.2.1" ganache-core@^2.6.0: version "2.6.0" @@ -7923,6 +8135,13 @@ get-stream@^4.0.0, get-stream@^4.1.0: dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -8238,6 +8457,23 @@ got@7.1.0, got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" +got@9.6.0: + version "9.6.0" + resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -8596,6 +8832,11 @@ http-cache-semantics@^3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" +http-cache-semantics@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" + integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -8729,6 +8970,13 @@ iconv-lite@^0.4.17, iconv-lite@~0.4.13: dependencies: safer-buffer "^2.1.0" +idna-uts46-hx@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" + integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== + dependencies: + punycode "2.1.0" + ieee754@1.1.8: version "1.1.8" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" @@ -10208,7 +10456,7 @@ js-sha3@0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" -js-sha3@0.5.7: +js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" @@ -10296,6 +10544,11 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -10450,6 +10703,13 @@ keccakjs@^0.2.0, keccakjs@^0.2.1: browserify-sha3 "^0.0.1" sha3 "^1.1.0" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + killable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" @@ -10982,6 +11242,11 @@ lodash@4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" +lodash@4.17.14: + version "4.17.14" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" + integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== + lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" @@ -11055,10 +11320,15 @@ lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" -lowercase-keys@^1.0.0: +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" @@ -11368,7 +11638,7 @@ merge@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" -merkle-patricia-tree@2.3.1, merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: +merkle-patricia-tree@2.3.1, merkle-patricia-tree@2.3.2, merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" dependencies: @@ -11478,6 +11748,11 @@ mimic-response@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" +mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -11531,6 +11806,14 @@ minipass@^2.3.5: safe-buffer "^5.1.2" yallist "^3.0.0" +minipass@^2.8.6: + version "2.9.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + minizlib@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" @@ -11818,7 +12101,7 @@ neo-async@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" -next-tick@1, next-tick@^1.0.0: +next-tick@1, next-tick@^1.0.0, next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -12090,6 +12373,11 @@ normalize-url@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + now-and-later@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" @@ -12431,6 +12719,13 @@ oboe@2.1.3: dependencies: http-https "^1.0.0" +oboe@2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" + integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= + dependencies: + http-https "^1.0.0" + obuf@^1.0.0, obuf@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -12622,6 +12917,11 @@ p-cancelable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -13149,6 +13449,11 @@ prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -13509,14 +13814,14 @@ punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" +punycode@2.1.0, punycode@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -punycode@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -14246,6 +14551,13 @@ resolve@~1.5.0: dependencies: path-parse "^1.0.5" +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -14524,6 +14836,11 @@ schema-utils@^2.2.0: ajv "^6.10.2" ajv-keywords "^3.4.1" +scrypt-js@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4" + integrity sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q= + scrypt-js@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" @@ -14549,6 +14866,11 @@ scrypt@^6.0.2: dependencies: nan "^2.0.8" +scryptsy@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" + integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== + scryptsy@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" @@ -14572,6 +14894,11 @@ seedrandom@2.4.4: version "2.4.4" resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.4.tgz#b25ea98632c73e45f58b77cfaa931678df01f9ba" +seedrandom@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" + integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== + seedrandom@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" @@ -14635,6 +14962,11 @@ semver-sort@0.0.4: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" + integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== + semver@^5.5.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" @@ -15057,6 +15389,14 @@ source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@0.5.12: + version "0.5.12" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@0.5.6, source-map-support@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" @@ -15358,6 +15698,15 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.0.0" +string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string.prototype.padend@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" @@ -15412,6 +15761,13 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.0.0" +strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -15602,6 +15958,24 @@ swarm-js@0.1.37: tar.gz "^1.0.5" xhr-request-promise "^0.1.2" +swarm-js@0.1.39: + version "0.1.39" + resolved "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz#79becb07f291d4b2a178c50fee7aa6e10342c0e8" + integrity sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg== + dependencies: + bluebird "^3.5.0" + buffer "^5.0.5" + decompress "^4.0.0" + eth-lib "^0.1.26" + fs-extra "^4.0.2" + got "^7.1.0" + mime-types "^2.1.16" + mkdirp-promise "^5.0.1" + mock-fs "^4.1.0" + setimmediate "^1.0.5" + tar "^4.0.2" + xhr-request-promise "^0.1.2" + symbol-observable@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" @@ -15708,6 +16082,19 @@ tar@^4, tar@^4.4.3: safe-buffer "^5.1.2" yallist "^3.0.2" +tar@^4.0.2: + version "4.4.13" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + tar@^4.4.10, tar@^4.4.8: version "4.4.10" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" @@ -15907,6 +16294,13 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -15940,6 +16334,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -16196,6 +16595,16 @@ type-is@~1.6.17: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + typedarray-to-buffer@^3.1.2, typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -16371,7 +16780,7 @@ underscore@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" -underscore@>=1.8.3, underscore@^1.9.1: +underscore@1.9.1, underscore@>=1.8.3, underscore@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" @@ -16517,6 +16926,13 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + url-parse@1.0.x: version "1.0.5" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" @@ -16574,7 +16990,7 @@ utf8@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.1.tgz#2e01db02f7d8d0944f77104f1609eb0c304cf768" -utf8@^3.0.0: +utf8@3.0.0, utf8@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" @@ -16637,14 +17053,14 @@ uuid@3.2.1, uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +uuid@3.3.2, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - v8-compile-cache@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" @@ -16794,6 +17210,15 @@ web3-bzz@1.0.0-beta.35: swarm-js "0.1.37" underscore "1.8.3" +web3-bzz@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.1.tgz#c3bd1e8f0c02a13cd6d4e3c3e9e1713f144f6f0d" + integrity sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw== + dependencies: + got "9.6.0" + swarm-js "0.1.39" + underscore "1.9.1" + web3-core-helpers@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.34.tgz#b168da00d3e19e156bc15ae203203dd4dfee2d03" @@ -16810,6 +17235,15 @@ web3-core-helpers@1.0.0-beta.35: web3-eth-iban "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-core-helpers@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d" + integrity sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw== + dependencies: + underscore "1.9.1" + web3-eth-iban "1.2.1" + web3-utils "1.2.1" + web3-core-helpers@2.0.0-alpha: version "2.0.0-alpha" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-2.0.0-alpha.tgz#76d720e50a6d5fbf91761a350060cc155fa9e3d3" @@ -16830,6 +17264,17 @@ web3-core-method@1.0.0-beta.35: web3-core-subscriptions "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-core-method@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a" + integrity sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.1" + web3-core-promievent "1.2.1" + web3-core-subscriptions "1.2.1" + web3-utils "1.2.1" + web3-core-method@2.0.0-alpha: version "2.0.0-alpha" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-2.0.0-alpha.tgz#453063885ab3cdd2bf63e5e586cdb3ee7d9cdfcb" @@ -16850,6 +17295,14 @@ web3-core-promievent@1.0.0-beta.35: any-promise "1.3.0" eventemitter3 "1.1.1" +web3-core-promievent@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838" + integrity sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw== + dependencies: + any-promise "1.3.0" + eventemitter3 "3.1.2" + web3-core-requestmanager@1.0.0-beta.35: version "1.0.0-beta.35" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.35.tgz#2b77cbf6303720ad68899b39fa7f584dc03dbc8f" @@ -16860,6 +17313,17 @@ web3-core-requestmanager@1.0.0-beta.35: web3-providers-ipc "1.0.0-beta.35" web3-providers-ws "1.0.0-beta.35" +web3-core-requestmanager@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d" + integrity sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.1" + web3-providers-http "1.2.1" + web3-providers-ipc "1.2.1" + web3-providers-ws "1.2.1" + web3-core-subscriptions@1.0.0-beta.35: version "1.0.0-beta.35" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.35.tgz#c1b76a2ad3c6e80f5d40b8ba560f01e0f4628758" @@ -16868,6 +17332,15 @@ web3-core-subscriptions@1.0.0-beta.35: underscore "1.8.3" web3-core-helpers "1.0.0-beta.35" +web3-core-subscriptions@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099" + integrity sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g== + dependencies: + eventemitter3 "3.1.2" + underscore "1.9.1" + web3-core-helpers "1.2.1" + web3-core-subscriptions@2.0.0-alpha: version "2.0.0-alpha" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-2.0.0-alpha.tgz#f8cb496af6e56b76bc0718213b7d777eeeacc741" @@ -16885,6 +17358,16 @@ web3-core@1.0.0-beta.35: web3-core-requestmanager "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-core@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9" + integrity sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg== + dependencies: + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-core-requestmanager "1.2.1" + web3-utils "1.2.1" + web3-core@2.0.0-alpha: version "2.0.0-alpha" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-2.0.0-alpha.tgz#79722bd65e5d9e28b47e2f43638c8994ed3f2b8e" @@ -16906,6 +17389,15 @@ web3-eth-abi@1.0.0-beta.35: web3-core-helpers "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth-abi@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689" + integrity sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g== + dependencies: + ethers "4.0.0-beta.3" + underscore "1.9.1" + web3-utils "1.2.1" + web3-eth-abi@^1.0.0-beta.24: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.34.tgz#034533e3aa2f7e59ff31793eaea685c0ed5af67a" @@ -16930,6 +17422,23 @@ web3-eth-accounts@1.0.0-beta.35: web3-core-method "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth-accounts@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf" + integrity sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ== + dependencies: + any-promise "1.3.0" + crypto-browserify "3.12.0" + eth-lib "0.2.7" + scryptsy "2.1.0" + semver "6.2.0" + underscore "1.9.1" + uuid "3.3.2" + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-utils "1.2.1" + web3-eth-contract@1.0.0-beta.35: version "1.0.0-beta.35" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.35.tgz#5276242d8a3358d9f1ce92b71575c74f9015935c" @@ -16943,6 +17452,34 @@ web3-eth-contract@1.0.0-beta.35: web3-eth-abi "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth-contract@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4" + integrity sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g== + dependencies: + underscore "1.9.1" + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-core-promievent "1.2.1" + web3-core-subscriptions "1.2.1" + web3-eth-abi "1.2.1" + web3-utils "1.2.1" + +web3-eth-ens@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5" + integrity sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q== + dependencies: + eth-ens-namehash "2.0.8" + underscore "1.9.1" + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-promievent "1.2.1" + web3-eth-abi "1.2.1" + web3-eth-contract "1.2.1" + web3-utils "1.2.1" + web3-eth-iban@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.34.tgz#9af458605867ccf74ea979aaf326b38ba6a5ba0c" @@ -16957,6 +17494,14 @@ web3-eth-iban@1.0.0-beta.35: bn.js "4.11.6" web3-utils "1.0.0-beta.35" +web3-eth-iban@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880" + integrity sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ== + dependencies: + bn.js "4.11.8" + web3-utils "1.2.1" + web3-eth-iban@2.0.0-alpha: version "2.0.0-alpha" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-2.0.0-alpha.tgz#87c164d964b50c000554b1c58e46dac8e2b04787" @@ -16975,6 +17520,17 @@ web3-eth-personal@1.0.0-beta.35: web3-net "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth-personal@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf" + integrity sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg== + dependencies: + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-net "1.2.1" + web3-utils "1.2.1" + web3-eth@1.0.0-beta.35: version "1.0.0-beta.35" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.35.tgz#c52c804afb95e6624b6f5e72a9af90fbf5005b68" @@ -16992,6 +17548,25 @@ web3-eth@1.0.0-beta.35: web3-net "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0" + integrity sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA== + dependencies: + underscore "1.9.1" + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-core-subscriptions "1.2.1" + web3-eth-abi "1.2.1" + web3-eth-accounts "1.2.1" + web3-eth-contract "1.2.1" + web3-eth-ens "1.2.1" + web3-eth-iban "1.2.1" + web3-eth-personal "1.2.1" + web3-net "1.2.1" + web3-utils "1.2.1" + web3-net@1.0.0-beta.35: version "1.0.0-beta.35" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.35.tgz#5c6688e0dea71fcd910ee9dc5437b94b7f6b3354" @@ -17000,6 +17575,15 @@ web3-net@1.0.0-beta.35: web3-core-method "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-net@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10" + integrity sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw== + dependencies: + web3-core "1.2.1" + web3-core-method "1.2.1" + web3-utils "1.2.1" + web3-provider-engine@14.0.6: version "14.0.6" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz#cbdd66fe20c0136a3a495cbe40d18b6c4160d5f0" @@ -17051,6 +17635,32 @@ web3-provider-engine@14.1.0: xhr "^2.2.0" xtend "^4.0.1" +web3-provider-engine@14.2.1: + version "14.2.1" + resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" + integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^3.0.0" + eth-json-rpc-infura "^3.1.0" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + web3-provider-engine@^13.3.2: version "13.8.0" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz#4c7c1ad2af5f1fe10343b8a65495879a2f9c00df" @@ -17082,6 +17692,14 @@ web3-providers-http@1.0.0-beta.35: web3-core-helpers "1.0.0-beta.35" xhr2-cookies "1.1.0" +web3-providers-http@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.1.tgz#c93ea003a42e7b894556f7e19dd3540f947f5013" + integrity sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ== + dependencies: + web3-core-helpers "1.2.1" + xhr2-cookies "1.1.0" + web3-providers-ipc@1.0.0-beta.35: version "1.0.0-beta.35" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.35.tgz#031afeb10fade2ebb0ef2fb82f5e58c04be842d9" @@ -17090,6 +17708,15 @@ web3-providers-ipc@1.0.0-beta.35: underscore "1.8.3" web3-core-helpers "1.0.0-beta.35" +web3-providers-ipc@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c" + integrity sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA== + dependencies: + oboe "2.1.4" + underscore "1.9.1" + web3-core-helpers "1.2.1" + web3-providers-ws@1.0.0-beta.35: version "1.0.0-beta.35" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.35.tgz#5d38603fd450243a26aae0ff7f680644e77fa240" @@ -17098,6 +17725,15 @@ web3-providers-ws@1.0.0-beta.35: web3-core-helpers "1.0.0-beta.35" websocket "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" +web3-providers-ws@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb" + integrity sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.1" + websocket "github:web3-js/WebSocket-Node#polyfill/globalThis" + web3-providers@2.0.0-alpha: version "2.0.0-alpha" resolved "https://registry.yarnpkg.com/web3-providers/-/web3-providers-2.0.0-alpha.tgz#6bce7f6e6d08fa874bd78214c6c54251cd7a81da" @@ -17123,6 +17759,16 @@ web3-shh@1.0.0-beta.35: web3-core-subscriptions "1.0.0-beta.35" web3-net "1.0.0-beta.35" +web3-shh@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c" + integrity sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA== + dependencies: + web3-core "1.2.1" + web3-core-method "1.2.1" + web3-core-subscriptions "1.2.1" + web3-net "1.2.1" + web3-typescript-typings@^0.10.2: version "0.10.2" resolved "https://registry.yarnpkg.com/web3-typescript-typings/-/web3-typescript-typings-0.10.2.tgz#a9903815d2a8a0dbd73fd5db374070de0bd30497" @@ -17153,6 +17799,19 @@ web3-utils@1.0.0-beta.35: underscore "1.8.3" utf8 "2.1.1" +web3-utils@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" + integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== + dependencies: + bn.js "4.11.8" + eth-lib "0.2.7" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randomhex "0.1.5" + underscore "1.9.1" + utf8 "3.0.0" + web3-utils@2.0.0-alpha: version "2.0.0-alpha" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-2.0.0-alpha.tgz#2e8b91f4887380672a270f8045826d72b58c12a4" @@ -17180,6 +17839,19 @@ web3@1.0.0-beta.35: web3-shh "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b" + integrity sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw== + dependencies: + web3-bzz "1.2.1" + web3-core "1.2.1" + web3-eth "1.2.1" + web3-eth-personal "1.2.1" + web3-net "1.2.1" + web3-shh "1.2.1" + web3-utils "1.2.1" + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -17327,7 +17999,7 @@ websocket@1.0.26: typedarray-to-buffer "^3.1.2" yaeti "^0.0.6" -websocket@^1.0.25, websocket@^1.0.28, websocket@^1.0.29: +websocket@1.0.29, websocket@^1.0.25, websocket@^1.0.28, websocket@^1.0.29: version "1.0.29" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.29.tgz#3f83e49d3279657c58b02a22d90749c806101b98" dependencies: @@ -17355,6 +18027,16 @@ websocket@^1.0.26: typedarray-to-buffer "^3.1.2" yaeti "^0.0.6" +"websocket@github:web3-js/WebSocket-Node#polyfill/globalThis": + version "1.0.29" + resolved "https://codeload.github.com/web3-js/WebSocket-Node/tar.gz/905deb4812572b344f5801f8c9ce8bb02799d82e" + dependencies: + debug "^2.2.0" + es5-ext "^0.10.50" + nan "^2.14.0" + typedarray-to-buffer "^3.1.5" + yaeti "^0.0.6" + whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.5" resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -17493,6 +18175,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -17731,9 +18422,10 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.0.0: +yargs-parser@^13.0.0, yargs-parser@^13.1.0: version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -17844,6 +18536,23 @@ yargs@13.2.2: y18n "^4.0.0" yargs-parser "^13.0.0" +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + yargs@^10.0.3: version "10.1.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" From b15a6290a7fee20a2891090f84ad26760955bb6e Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Sun, 22 Dec 2019 14:29:06 -0800 Subject: [PATCH 07/24] Handle v2 order edge cases --- .../contracts/src/MixinExchangeWrapper.sol | 32 +++++++++++-------- .../contracts/src/MixinForwarderCore.sol | 1 - .../contracts/src/MixinWeth.sol | 1 - .../contracts/src/interfaces/IExchangeV2.sol | 17 +++++++++- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol index 08b89587e0..9db005daf4 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol @@ -55,7 +55,7 @@ contract MixinExchangeWrapper is internal returns (LibFillResults.FillResults memory fillResults) { - if (order.makerFeeAssetData.readBytes4(0) == EXCHANGE_V2_ORDER_ID) { + if (_isV2Order(order)) { return _fillV2OrderNoThrow( order, takerAssetFillAmount, @@ -169,7 +169,7 @@ contract MixinExchangeWrapper is // The remaining amount of WETH to sell uint256 remainingTakerAssetFillAmount = wethSellAmount .safeSub(totalWethSpentAmount) - .safeSub(protocolFee); + .safeSub(_isV2Order(orders[i]) ? 0 : protocolFee); // If the maker asset is ERC20Bridge, take a snapshot of the Forwarder contract's balance. bytes4 makerAssetProxyId = orders[i].makerAssetData.readBytes4(0); @@ -390,8 +390,9 @@ contract MixinExchangeWrapper is senderAddress: order.senderAddress, makerAssetAmount: order.makerAssetAmount, takerAssetAmount: order.takerAssetAmount, - makerFee: order.makerFee, - takerFee: order.makerFee, + // NOTE: We assume fees are 0 for all v2 orders. Orders with non-zero fees will fail to be filled. + makerFee: 0, + takerFee: 0, expirationTimeSeconds: order.expirationTimeSeconds, salt: order.salt, makerAssetData: order.makerAssetData, @@ -410,16 +411,8 @@ contract MixinExchangeWrapper is (bool didSucceed, bytes memory returnData) = exchange.call(fillOrderCalldata); if (didSucceed) { assert(returnData.length == 128); - IExchangeV2.FillResults memory v2FillResults = abi.decode(returnData, (IExchangeV2.FillResults)); - - // Add `protocolFeePaid` field to v2 fill results - fillResults = LibFillResults.FillResults({ - makerAssetFilledAmount: v2FillResults.makerAssetFilledAmount, - takerAssetFilledAmount: v2FillResults.takerAssetFilledAmount, - makerFeePaid: v2FillResults.makerFeePaid, - takerFeePaid: v2FillResults.takerFeePaid, - protocolFeePaid: 0 - }); + // NOTE: makerFeePaid, takerFeePaid, and protocolFeePaid will always be 0 for v2 orders + (fillResults.makerAssetFilledAmount, fillResults.takerAssetFilledAmount) = abi.decode(returnData, (uint256, uint256)); } // fillResults values will be 0 by default if call was unsuccessful @@ -490,4 +483,15 @@ contract MixinExchangeWrapper is return false; } } + + /// @dev Checks whether an order is a v2 order. + /// @param order Order struct containing order specifications. + /// @return True if the order's `makerFeeAssetData` is set to the v2 order id. + function _isV2Order(LibOrder.Order memory order) + internal + pure + returns (bool) + { + return order.makerFeeAssetData.readBytes4(0) == EXCHANGE_V2_ORDER_ID; + } } diff --git a/contracts/exchange-forwarder/contracts/src/MixinForwarderCore.sol b/contracts/exchange-forwarder/contracts/src/MixinForwarderCore.sol index 545b43bc6d..ad12e5a34e 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinForwarderCore.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinForwarderCore.sol @@ -85,7 +85,6 @@ contract MixinForwarderCore is ethFeeAmounts, feeRecipients ); - // Spends up to wethRemaining to fill orders, transfers purchased assets to msg.sender, // and pays WETH order fees. ( diff --git a/contracts/exchange-forwarder/contracts/src/MixinWeth.sol b/contracts/exchange-forwarder/contracts/src/MixinWeth.sol index ecc7b6aba6..0b92c900e2 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinWeth.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinWeth.sol @@ -109,7 +109,6 @@ contract MixinWeth is if (wethRemaining > 0) { // Convert remaining WETH to ETH ETHER_TOKEN.withdraw(wethRemaining); - // Transfer remaining ETH to sender msg.sender.transfer(wethRemaining); } diff --git a/contracts/exchange-forwarder/contracts/src/interfaces/IExchangeV2.sol b/contracts/exchange-forwarder/contracts/src/interfaces/IExchangeV2.sol index ae7eb2dc3d..732e953f83 100644 --- a/contracts/exchange-forwarder/contracts/src/interfaces/IExchangeV2.sol +++ b/contracts/exchange-forwarder/contracts/src/interfaces/IExchangeV2.sol @@ -46,6 +46,12 @@ contract IExchangeV2 { uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s). } + struct OrderInfo { + uint8 orderStatus; // Status that describes order's validity and fillability. + bytes32 orderHash; // EIP712 typed data hash of the order (see LibOrder.getTypedDataHash). + uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled. + } + /// @dev Fills the input order. /// @param order Order struct containing order specifications. /// @param takerAssetFillAmount Desired amount of takerAsset to sell. @@ -56,5 +62,14 @@ contract IExchangeV2 { uint256 takerAssetFillAmount, bytes memory signature ) - public; + public + returns (FillResults memory fillResults); + + /// @dev Gets information about an order: status, hash, and amount filled. + /// @param order Order to gather information on. + /// @return OrderInfo Information about the order and its state. + /// See LibOrder.OrderInfo for a complete description. + function getOrderInfo(Order memory order) + public + returns (OrderInfo memory orderInfo); } From f371e3c8d3e73682be63dcf609a6dc416fe6c1b1 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Sun, 22 Dec 2019 14:30:27 -0800 Subject: [PATCH 08/24] Regenerate boilerplate --- contracts/exchange-forwarder/package.json | 2 +- contracts/exchange-forwarder/src/artifacts.ts | 3 ++- contracts/exchange-forwarder/src/index.ts | 2 +- contracts/exchange-forwarder/src/wrappers.ts | 1 + contracts/exchange-forwarder/tsconfig.json | 1 + 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/exchange-forwarder/package.json b/contracts/exchange-forwarder/package.json index 1852d1451a..8d137b6eb8 100644 --- a/contracts/exchange-forwarder/package.json +++ b/contracts/exchange-forwarder/package.json @@ -38,7 +38,7 @@ "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES" }, "config": { - "publicInterfaceContracts": "Forwarder", + "publicInterfaceContracts": "Forwarder,IExchangeV2", "abis": "./test/generated-artifacts/@(Forwarder|IAssets|IExchangeV2|IForwarder|IForwarderCore|LibConstants|LibForwarderRichErrors|MixinAssets|MixinExchangeWrapper|MixinForwarderCore|MixinWeth|TestForwarder).json", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." }, diff --git a/contracts/exchange-forwarder/src/artifacts.ts b/contracts/exchange-forwarder/src/artifacts.ts index a316777cb3..bdb4b1b56b 100644 --- a/contracts/exchange-forwarder/src/artifacts.ts +++ b/contracts/exchange-forwarder/src/artifacts.ts @@ -6,4 +6,5 @@ import { ContractArtifact } from 'ethereum-types'; import * as Forwarder from '../generated-artifacts/Forwarder.json'; -export const artifacts = { Forwarder: Forwarder as ContractArtifact }; +import * as IExchangeV2 from '../generated-artifacts/IExchangeV2.json'; +export const artifacts = { Forwarder: Forwarder as ContractArtifact, IExchangeV2: IExchangeV2 as ContractArtifact }; diff --git a/contracts/exchange-forwarder/src/index.ts b/contracts/exchange-forwarder/src/index.ts index dd06356a44..f859993391 100644 --- a/contracts/exchange-forwarder/src/index.ts +++ b/contracts/exchange-forwarder/src/index.ts @@ -1,5 +1,5 @@ export { artifacts } from './artifacts'; -export { ForwarderContract } from './wrappers'; +export { ForwarderContract, IExchangeV2Contract } from './wrappers'; export { ExchangeForwarderRevertErrors } from '@0x/utils'; export { ContractArtifact, diff --git a/contracts/exchange-forwarder/src/wrappers.ts b/contracts/exchange-forwarder/src/wrappers.ts index e77944402a..46d3326781 100644 --- a/contracts/exchange-forwarder/src/wrappers.ts +++ b/contracts/exchange-forwarder/src/wrappers.ts @@ -4,3 +4,4 @@ * ----------------------------------------------------------------------------- */ export * from '../generated-wrappers/forwarder'; +export * from '../generated-wrappers/i_exchange_v2'; diff --git a/contracts/exchange-forwarder/tsconfig.json b/contracts/exchange-forwarder/tsconfig.json index 9ebde3a67c..7fb86aa0f2 100644 --- a/contracts/exchange-forwarder/tsconfig.json +++ b/contracts/exchange-forwarder/tsconfig.json @@ -4,6 +4,7 @@ "include": ["./src/**/*", "./test/**/*", "./generated-wrappers/**/*"], "files": [ "generated-artifacts/Forwarder.json", + "generated-artifacts/IExchangeV2.json", "test/generated-artifacts/Forwarder.json", "test/generated-artifacts/IAssets.json", "test/generated-artifacts/IExchangeV2.json", From de8f19094548968fcaf4f4411caf9deae52d354b Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Sun, 22 Dec 2019 14:32:07 -0800 Subject: [PATCH 09/24] Change erc-20 package compiler target to istanbul --- contracts/erc20/contracts/src/WETH9.sol | 20 +- packages/web3-wrapper/package.json | 1 - yarn.lock | 487 ++---------------------- 3 files changed, 44 insertions(+), 464 deletions(-) diff --git a/contracts/erc20/contracts/src/WETH9.sol b/contracts/erc20/contracts/src/WETH9.sol index 17876b86dc..c9b04bb1e8 100644 --- a/contracts/erc20/contracts/src/WETH9.sol +++ b/contracts/erc20/contracts/src/WETH9.sol @@ -14,7 +14,7 @@ // along with this program. If not, see . // solhint-disable -pragma solidity ^0.4.18; +pragma solidity ^0.5.9; contract WETH9 { @@ -30,27 +30,27 @@ contract WETH9 { mapping (address => uint) public balanceOf; mapping (address => mapping (address => uint)) public allowance; - function() public payable { + function() external payable { deposit(); } function deposit() public payable { balanceOf[msg.sender] += msg.value; - Deposit(msg.sender, msg.value); + emit Deposit(msg.sender, msg.value); } function withdraw(uint wad) public { - require(balanceOf[msg.sender] >= wad); + require(balanceOf[msg.sender] >= wad, "WETH9/INSUFFICIENT_BALANCE"); balanceOf[msg.sender] -= wad; msg.sender.transfer(wad); - Withdrawal(msg.sender, wad); + emit Withdrawal(msg.sender, wad); } function totalSupply() public view returns (uint) { - return this.balance; + return address(this).balance; } function approve(address guy, uint wad) public returns (bool) { allowance[msg.sender][guy] = wad; - Approval(msg.sender, guy, wad); + emit Approval(msg.sender, guy, wad); return true; } @@ -62,17 +62,17 @@ contract WETH9 { public returns (bool) { - require(balanceOf[src] >= wad); + require(balanceOf[src] >= wad), "WETH9/INSUFFICIENT_BALANCE"; if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { - require(allowance[src][msg.sender] >= wad); + require(allowance[src][msg.sender] >= wad, "WETH9/INSUFFICIENT_ALLOWANCE"); allowance[src][msg.sender] -= wad; } balanceOf[src] -= wad; balanceOf[dst] += wad; - Transfer(src, dst, wad); + emit Transfer(src, dst, wad); return true; } diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json index 58993e09ac..308ed4a9c6 100644 --- a/packages/web3-wrapper/package.json +++ b/packages/web3-wrapper/package.json @@ -47,7 +47,6 @@ "chai-as-promised": "^7.1.0", "chai-bignumber": "^3.0.0", "dirty-chai": "^2.0.1", - "ganache-core": "^2.6.0", "make-promises-safe": "^1.1.0", "mocha": "^6.2.0", "npm-run-all": "^4.1.2", diff --git a/yarn.lock b/yarn.lock index 3e3e4d9582..f8fdc4c422 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2663,7 +2663,7 @@ any-observable@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" -any-promise@1.3.0, any-promise@^1.0.0, any-promise@^1.3.0: +any-promise@1.3.0, any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -2957,12 +2957,6 @@ async@1.x, async@^1.4.2, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@2.6.1, async@^2.1.4: - version "2.6.1" - resolved "https://registry.npmjs.org/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - dependencies: - lodash "^4.17.10" - async@2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" @@ -2980,6 +2974,12 @@ async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.0: dependencies: lodash "^4.14.0" +async@^2.1.4: + version "2.6.1" + resolved "https://registry.npmjs.org/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + async@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -3861,10 +3861,6 @@ bluebird@3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" -bluebird@^2.9.34: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - bluebird@^3.5.0, bluebird@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -4926,7 +4922,7 @@ commander@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" -commander@2.15.1, commander@^2.12.1, commander@^2.8.1: +commander@2.15.1, commander@^2.12.1: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" @@ -6634,17 +6630,6 @@ eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: json-rpc-random-id "^1.0.0" xtend "^4.0.1" -eth-sig-util@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.1.2.tgz#9b357395b5ca07fae6b430d3e534cf0a0f1df118" - dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" - tweetnacl-util "^0.15.0" - eth-sig-util@2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.3.0.tgz#c54a6ac8e8796f7e25f59cf436982a930e645231" @@ -6735,14 +6720,6 @@ ethereumjs-abi@0.6.7: bn.js "^4.10.0" ethereumjs-util "^5.0.0" -ethereumjs-account@2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" - dependencies: - ethereumjs-util "^5.0.0" - rlp "^2.0.0" - safe-buffer "^5.1.1" - ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" @@ -6758,16 +6735,6 @@ ethereumjs-account@^2.0.3: ethereumjs-util "^4.0.1" rlp "^2.0.0" -ethereumjs-block@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.1.0.tgz#71d1b19e18061f14cf6371bf34ba31a359931360" - dependencies: - async "^2.0.1" - ethereumjs-common "^0.6.0" - ethereumjs-tx "^1.2.2" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - ethereumjs-block@2.2.0, ethereumjs-block@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz#8c6c3ab4a5eff0a16d9785fbeedbe643f4dbcbef" @@ -6811,10 +6778,6 @@ ethereumjs-blockstream@^7.0.0: source-map-support "0.5.6" uuid "3.2.1" -ethereumjs-common@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-0.6.1.tgz#ec98edf315a7f107afb6acc48e937a8266979fae" - ethereumjs-common@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.1.0.tgz#5ec9086c314d619d8f05e79a0525829fcb0e93cb" @@ -6857,18 +6820,6 @@ ethereumjs-tx@^2.1.1: ethereumjs-common "^1.3.1" ethereumjs-util "^6.0.0" -ethereumjs-util@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "^0.1.3" - keccak "^1.0.2" - rlp "^2.0.0" - safe-buffer "^5.1.1" - secp256k1 "^3.0.1" - ethereumjs-util@6.1.0, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@~6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8" @@ -6917,22 +6868,6 @@ ethereumjs-util@^6.2.0: rlp "^2.2.3" secp256k1 "^3.0.1" -ethereumjs-vm@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - ethereumjs-account "^2.0.3" - ethereumjs-block "~2.2.0" - ethereumjs-common "^1.1.0" - ethereumjs-util "^6.0.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - ethereumjs-vm@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-4.1.0.tgz#359ed3592636390a5b2909a28d955c908830daa5" @@ -7086,10 +7021,6 @@ eventemitter2@0.4.14, eventemitter2@~0.4.14: version "0.4.14" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" -eventemitter3@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.1.1.tgz#47786bdaa087caf7b1b75e73abc5c7d540158cd0" - eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" @@ -7863,13 +7794,6 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^2.0.0, fs-extra@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -7908,15 +7832,6 @@ fs-mkdirp-stream@^1.0.0: graceful-fs "^4.1.11" through2 "^2.0.3" -fs-promise@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" - dependencies: - any-promise "^1.3.0" - fs-extra "^2.0.0" - mz "^2.6.0" - thenify-all "^1.6.0" - fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -7948,7 +7863,7 @@ fsevents@^2.0.6: version "2.0.7" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a" -fstream@^1.0.0, fstream@^1.0.2, fstream@^1.0.8: +fstream@^1.0.0, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" dependencies: @@ -8015,40 +7930,6 @@ ganache-core@2.9.0-istanbul.0: ethereumjs-wallet "0.6.3" web3 "1.2.1" -ganache-core@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.6.0.tgz#19001547893ff9f6d494fcaed66c52edd808f3c0" - dependencies: - abstract-leveldown "3.0.0" - async "2.6.1" - bip39 "2.5.0" - bn.js "4.11.8" - cachedown "1.0.0" - clone "2.1.2" - debug "3.1.0" - encoding-down "5.0.4" - eth-sig-util "2.1.2" - ethereumjs-abi "0.6.5" - ethereumjs-account "2.0.5" - ethereumjs-block "2.1.0" - ethereumjs-tx "1.3.7" - ethereumjs-util "5.2.0" - ethereumjs-vm "2.6.0" - heap "0.2.6" - level-sublevel "6.6.4" - levelup "3.1.1" - lodash "4.17.11" - merkle-patricia-tree "2.3.1" - rlp "2.1.0" - seedrandom "2.4.4" - source-map-support "0.5.9" - tmp "0.0.33" - web3-provider-engine "14.1.0" - websocket "1.0.26" - optionalDependencies: - ethereumjs-wallet "0.6.3" - web3 "1.0.0-beta.35" - gauge@~1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" @@ -8438,25 +8319,6 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" -got@7.1.0, got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - got@9.6.0: version "9.6.0" resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -8490,6 +8352,25 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" +got@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" @@ -11638,7 +11519,7 @@ merge@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" -merkle-patricia-tree@2.3.1, merkle-patricia-tree@2.3.2, merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: +merkle-patricia-tree@2.3.2, merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" dependencies: @@ -11950,10 +11831,6 @@ moo@^0.4.3: version "0.4.3" resolved "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" -mout@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/mout/-/mout-0.11.1.tgz#ba3611df5f0e5b1ffbfd01166b8f02d1f5fa2b99" - move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -12010,7 +11887,7 @@ mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -mz@^2.4.0, mz@^2.6.0: +mz@^2.4.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" dependencies: @@ -12018,7 +11895,7 @@ mz@^2.4.0, mz@^2.6.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@2.10.0, nan@^2.0.8, nan@^2.2.1, nan@^2.3.3, nan@^2.6.2, nan@^2.9.2: +nan@2.10.0, nan@^2.0.8, nan@^2.2.1, nan@^2.6.2, nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -12713,12 +12590,6 @@ object.values@^1.0.4: function-bind "^1.1.0" has "^1.0.1" -oboe@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.3.tgz#2b4865dbd46be81225713f4e9bfe4bcf4f680a4f" - dependencies: - http-https "^1.0.0" - oboe@2.1.4: version "2.1.4" resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" @@ -14613,12 +14484,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^2.0.0" inherits "^2.0.1" -rlp@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.1.0.tgz#e4f9886d5a982174f314543831e36e1a658460f9" - dependencies: - safe-buffer "^5.1.1" - rlp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.0.0.tgz#9db384ff4b89a8f61563d92395d8625b18f3afb0" @@ -14845,13 +14710,6 @@ scrypt-js@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" -scrypt.js@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.2.0.tgz#af8d1465b71e9990110bedfc593b9479e03a8ada" - dependencies: - scrypt "^6.0.2" - scryptsy "^1.2.1" - scrypt.js@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.3.0.tgz#6c62d61728ad533c8c376a2e5e3e86d41a95c4c0" @@ -14890,10 +14748,6 @@ secp256k1@^3.0.1: nan "^2.2.1" safe-buffer "^5.1.0" -seedrandom@2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.4.tgz#b25ea98632c73e45f58b77cfaa931678df01f9ba" - seedrandom@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" @@ -15404,13 +15258,6 @@ source-map-support@0.5.6, source-map-support@^0.5.6: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" @@ -15940,24 +15787,6 @@ swap-case@^1.1.0: lower-case "^1.1.1" upper-case "^1.1.1" -swarm-js@0.1.37: - version "0.1.37" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.37.tgz#27d485317a340bbeec40292af783cc10acfa4663" - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - decompress "^4.0.0" - eth-lib "^0.1.26" - fs-extra "^2.1.2" - fs-promise "^2.0.0" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar.gz "^1.0.5" - xhr-request-promise "^0.1.2" - swarm-js@0.1.39: version "0.1.39" resolved "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz#79becb07f291d4b2a178c50fee7aa6e10342c0e8" @@ -16052,17 +15881,7 @@ tar-stream@^1.1.2, tar-stream@^1.5.2: readable-stream "^2.0.0" xtend "^4.0.0" -tar.gz@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/tar.gz/-/tar.gz-1.0.7.tgz#577ef2c595faaa73452ef0415fed41113212257b" - dependencies: - bluebird "^2.9.34" - commander "^2.8.1" - fstream "^1.0.8" - mout "^0.11.0" - tar "^2.1.1" - -tar@^2.0.0, tar@^2.1.1: +tar@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -16205,7 +16024,7 @@ text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -thenify-all@^1.0.0, thenify-all@^1.6.0: +thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" dependencies: @@ -16605,7 +16424,7 @@ type@^2.0.0: resolved "https://registry.npmjs.org/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== -typedarray-to-buffer@^3.1.2, typedarray-to-buffer@^3.1.5: +typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" dependencies: @@ -17202,14 +17021,6 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" -web3-bzz@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.0.0-beta.35.tgz#9d5e1362b3db2afd77d65619b7cd46dd5845c192" - dependencies: - got "7.1.0" - swarm-js "0.1.37" - underscore "1.8.3" - web3-bzz@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.1.tgz#c3bd1e8f0c02a13cd6d4e3c3e9e1713f144f6f0d" @@ -17227,14 +17038,6 @@ web3-core-helpers@1.0.0-beta.34: web3-eth-iban "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-core-helpers@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.35.tgz#d681d218a0c6e3283ee1f99a078ab9d3eef037f1" - dependencies: - underscore "1.8.3" - web3-eth-iban "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-core-helpers@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d" @@ -17254,16 +17057,6 @@ web3-core-helpers@2.0.0-alpha: web3-eth-iban "2.0.0-alpha" web3-utils "2.0.0-alpha" -web3-core-method@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.35.tgz#fc10e2d546cf4886038e6130bd5726b0952a4e5f" - dependencies: - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-core-promievent "1.0.0-beta.35" - web3-core-subscriptions "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-core-method@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a" @@ -17288,13 +17081,6 @@ web3-core-method@2.0.0-alpha: web3-core-subscriptions "2.0.0-alpha" web3-utils "2.0.0-alpha" -web3-core-promievent@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.35.tgz#4f1b24737520fa423fee3afee110fbe82bcb8691" - dependencies: - any-promise "1.3.0" - eventemitter3 "1.1.1" - web3-core-promievent@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838" @@ -17303,16 +17089,6 @@ web3-core-promievent@1.2.1: any-promise "1.3.0" eventemitter3 "3.1.2" -web3-core-requestmanager@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.35.tgz#2b77cbf6303720ad68899b39fa7f584dc03dbc8f" - dependencies: - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-providers-http "1.0.0-beta.35" - web3-providers-ipc "1.0.0-beta.35" - web3-providers-ws "1.0.0-beta.35" - web3-core-requestmanager@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d" @@ -17324,14 +17100,6 @@ web3-core-requestmanager@1.2.1: web3-providers-ipc "1.2.1" web3-providers-ws "1.2.1" -web3-core-subscriptions@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.35.tgz#c1b76a2ad3c6e80f5d40b8ba560f01e0f4628758" - dependencies: - eventemitter3 "1.1.1" - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-core-subscriptions@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099" @@ -17349,15 +17117,6 @@ web3-core-subscriptions@2.0.0-alpha: eventemitter3 "^3.1.0" lodash "^4.17.11" -web3-core@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.35.tgz#0c44d3c50d23219b0b1531d145607a9bc7cd4b4f" - dependencies: - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-core-requestmanager "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-core@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9" @@ -17380,15 +17139,6 @@ web3-core@2.0.0-alpha: web3-providers "2.0.0-alpha" web3-utils "2.0.0-alpha" -web3-eth-abi@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.35.tgz#2eb9c1c7c7233db04010defcb192293e0db250e6" - dependencies: - bn.js "4.11.6" - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth-abi@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689" @@ -17407,21 +17157,6 @@ web3-eth-abi@^1.0.0-beta.24: web3-core-helpers "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-eth-accounts@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.35.tgz#7d0e5a69f510dc93874471599eb7abfa9ddf3e63" - dependencies: - any-promise "1.3.0" - crypto-browserify "3.12.0" - eth-lib "0.2.7" - scrypt.js "0.2.0" - underscore "1.8.3" - uuid "2.0.1" - web3-core "1.0.0-beta.35" - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth-accounts@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf" @@ -17439,19 +17174,6 @@ web3-eth-accounts@1.2.1: web3-core-method "1.2.1" web3-utils "1.2.1" -web3-eth-contract@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.35.tgz#5276242d8a3358d9f1ce92b71575c74f9015935c" - dependencies: - underscore "1.8.3" - web3-core "1.0.0-beta.35" - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-core-promievent "1.0.0-beta.35" - web3-core-subscriptions "1.0.0-beta.35" - web3-eth-abi "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth-contract@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4" @@ -17487,13 +17209,6 @@ web3-eth-iban@1.0.0-beta.34: bn.js "4.11.6" web3-utils "1.0.0-beta.34" -web3-eth-iban@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.35.tgz#5aa10327a9abb26bcfc4ba79d7bad18a002b332c" - dependencies: - bn.js "4.11.6" - web3-utils "1.0.0-beta.35" - web3-eth-iban@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880" @@ -17510,16 +17225,6 @@ web3-eth-iban@2.0.0-alpha: bn.js "4.11.8" web3-utils "2.0.0-alpha" -web3-eth-personal@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.35.tgz#ecac95b7a53d04a567447062d5cae5f49879e89f" - dependencies: - web3-core "1.0.0-beta.35" - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-net "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth-personal@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf" @@ -17531,23 +17236,6 @@ web3-eth-personal@1.2.1: web3-net "1.2.1" web3-utils "1.2.1" -web3-eth@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.35.tgz#c52c804afb95e6624b6f5e72a9af90fbf5005b68" - dependencies: - underscore "1.8.3" - web3-core "1.0.0-beta.35" - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-core-subscriptions "1.0.0-beta.35" - web3-eth-abi "1.0.0-beta.35" - web3-eth-accounts "1.0.0-beta.35" - web3-eth-contract "1.0.0-beta.35" - web3-eth-iban "1.0.0-beta.35" - web3-eth-personal "1.0.0-beta.35" - web3-net "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0" @@ -17567,14 +17255,6 @@ web3-eth@1.2.1: web3-net "1.2.1" web3-utils "1.2.1" -web3-net@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.35.tgz#5c6688e0dea71fcd910ee9dc5437b94b7f6b3354" - dependencies: - web3-core "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-net@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10" @@ -17610,31 +17290,6 @@ web3-provider-engine@14.0.6: xhr "^2.2.0" xtend "^4.0.1" -web3-provider-engine@14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.1.0.tgz#91590020f8b8c1b65846321310cbfdb039090fc6" - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^3.0.0" - eth-json-rpc-infura "^3.1.0" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - web3-provider-engine@14.2.1: version "14.2.1" resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" @@ -17685,13 +17340,6 @@ web3-provider-engine@^13.3.2: xhr "^2.2.0" xtend "^4.0.1" -web3-providers-http@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.0.0-beta.35.tgz#92059d9d6de6e9f82f4fae30b743efd841afc1e1" - dependencies: - web3-core-helpers "1.0.0-beta.35" - xhr2-cookies "1.1.0" - web3-providers-http@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.1.tgz#c93ea003a42e7b894556f7e19dd3540f947f5013" @@ -17700,14 +17348,6 @@ web3-providers-http@1.2.1: web3-core-helpers "1.2.1" xhr2-cookies "1.1.0" -web3-providers-ipc@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.35.tgz#031afeb10fade2ebb0ef2fb82f5e58c04be842d9" - dependencies: - oboe "2.1.3" - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-providers-ipc@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c" @@ -17717,14 +17357,6 @@ web3-providers-ipc@1.2.1: underscore "1.9.1" web3-core-helpers "1.2.1" -web3-providers-ws@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.35.tgz#5d38603fd450243a26aae0ff7f680644e77fa240" - dependencies: - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - websocket "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" - web3-providers-ws@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb" @@ -17750,15 +17382,6 @@ web3-providers@2.0.0-alpha: websocket "^1.0.28" xhr2-cookies "1.1.0" -web3-shh@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.35.tgz#7e4a585f8beee0c1927390937c6537748a5d1a58" - dependencies: - web3-core "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-core-subscriptions "1.0.0-beta.35" - web3-net "1.0.0-beta.35" - web3-shh@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c" @@ -17787,18 +17410,6 @@ web3-utils@1.0.0-beta.34: underscore "1.8.3" utf8 "2.1.1" -web3-utils@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.35.tgz#ced9e1df47c65581c441c5f2af76b05a37a273d7" - dependencies: - bn.js "4.11.6" - eth-lib "0.1.27" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randomhex "0.1.5" - underscore "1.8.3" - utf8 "2.1.1" - web3-utils@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" @@ -17827,18 +17438,6 @@ web3-utils@2.0.0-alpha: randombytes "^2.1.0" utf8 "2.1.1" -web3@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.35.tgz#6475095bd451a96e50a32b997ddee82279292f11" - dependencies: - web3-bzz "1.0.0-beta.35" - web3-core "1.0.0-beta.35" - web3-eth "1.0.0-beta.35" - web3-eth-personal "1.0.0-beta.35" - web3-net "1.0.0-beta.35" - web3-shh "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b" @@ -17990,15 +17589,6 @@ websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" -websocket@1.0.26: - version "1.0.26" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194" - dependencies: - debug "^2.2.0" - nan "^2.3.3" - typedarray-to-buffer "^3.1.2" - yaeti "^0.0.6" - websocket@1.0.29, websocket@^1.0.25, websocket@^1.0.28, websocket@^1.0.29: version "1.0.29" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.29.tgz#3f83e49d3279657c58b02a22d90749c806101b98" @@ -18018,15 +17608,6 @@ websocket@^1.0.26: typedarray-to-buffer "^3.1.5" yaeti "^0.0.6" -"websocket@git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible": - version "1.0.26" - resolved "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" - dependencies: - debug "^2.2.0" - nan "^2.3.3" - typedarray-to-buffer "^3.1.2" - yaeti "^0.0.6" - "websocket@github:web3-js/WebSocket-Node#polyfill/globalThis": version "1.0.29" resolved "https://codeload.github.com/web3-js/WebSocket-Node/tar.gz/905deb4812572b344f5801f8c9ce8bb02799d82e" From 1d5800c4f7a965268df25a3ef0acb77f2fc50e9d Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Mon, 23 Dec 2019 09:25:50 -0800 Subject: [PATCH 10/24] Fix WETH compilation --- contracts/erc20/contracts/src/WETH9.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/erc20/contracts/src/WETH9.sol b/contracts/erc20/contracts/src/WETH9.sol index c9b04bb1e8..4881ef6547 100644 --- a/contracts/erc20/contracts/src/WETH9.sol +++ b/contracts/erc20/contracts/src/WETH9.sol @@ -38,7 +38,7 @@ contract WETH9 { emit Deposit(msg.sender, msg.value); } function withdraw(uint wad) public { - require(balanceOf[msg.sender] >= wad, "WETH9/INSUFFICIENT_BALANCE"); + require(balanceOf[msg.sender] >= wad); balanceOf[msg.sender] -= wad; msg.sender.transfer(wad); emit Withdrawal(msg.sender, wad); @@ -62,10 +62,10 @@ contract WETH9 { public returns (bool) { - require(balanceOf[src] >= wad), "WETH9/INSUFFICIENT_BALANCE"; + require(balanceOf[src] >= wad); if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { - require(allowance[src][msg.sender] >= wad, "WETH9/INSUFFICIENT_ALLOWANCE"); + require(allowance[src][msg.sender] >= wad); allowance[src][msg.sender] -= wad; } From e515c91e5ecf972a0232f34ccfb61bdb56cb35fd Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Mon, 23 Dec 2019 19:36:54 -0800 Subject: [PATCH 11/24] Do not attempt to transfer asset if fill failed --- contracts/exchange-forwarder/contracts/src/MixinAssets.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/exchange-forwarder/contracts/src/MixinAssets.sol b/contracts/exchange-forwarder/contracts/src/MixinAssets.sol index eb0e5c1392..9b6a896d13 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinAssets.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinAssets.sol @@ -82,6 +82,10 @@ contract MixinAssets is ) internal { + if (amount == 0) { + return; + } + bytes4 proxyId = assetData.readBytes4(0); if ( From ff18852879f2fbbfd548179f36f07d0275233ca2 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Mon, 23 Dec 2019 19:37:29 -0800 Subject: [PATCH 12/24] Fix build --- packages/migrations/package.json | 1 + packages/migrations/src/migration.ts | 3 +-- packages/subproviders/package.json | 2 +- packages/web3-wrapper/package.json | 1 + packages/web3-wrapper/test/web3_wrapper_test.ts | 2 +- yarn.lock | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/migrations/package.json b/packages/migrations/package.json index 429342fa88..f42c8569e2 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -64,6 +64,7 @@ "@0x/base-contract": "^6.0.3", "@0x/contract-addresses": "^4.2.0", "@0x/contract-artifacts": "^3.3.0", + "@0x/contract-wrappers": "13.3.0", "@0x/contracts-asset-proxy": "^3.1.0", "@0x/contracts-coordinator": "^3.0.3", "@0x/contracts-dev-utils": "^1.0.3", diff --git a/packages/migrations/src/migration.ts b/packages/migrations/src/migration.ts index 69d604d5b9..e142a66188 100644 --- a/packages/migrations/src/migration.ts +++ b/packages/migrations/src/migration.ts @@ -1,5 +1,6 @@ import { ContractAddresses } from '@0x/contract-addresses'; import * as artifacts from '@0x/contract-artifacts'; +import { ForwarderContract } from '@0x/contract-wrappers'; import { ERC1155ProxyContract, ERC20BridgeProxyContract, @@ -14,7 +15,6 @@ import { ERC1155MintableContract } from '@0x/contracts-erc1155'; import { DummyERC20TokenContract, WETH9Contract } from '@0x/contracts-erc20'; import { DummyERC721TokenContract } from '@0x/contracts-erc721'; import { ExchangeContract } from '@0x/contracts-exchange'; -import { ForwarderContract } from '@0x/contracts-exchange-forwarder'; import { StakingProxyContract, TestStakingContract, ZrxVaultContract } from '@0x/contracts-staking'; import { Web3ProviderEngine } from '@0x/subproviders'; import { BigNumber, providerUtils } from '@0x/utils'; @@ -243,7 +243,6 @@ export async function runMigrationsAsync( txDefaults, artifacts, exchange.address, - constants.NULL_ADDRESS, etherToken.address, ); diff --git a/packages/subproviders/package.json b/packages/subproviders/package.json index a0e4d3e687..c1d603c8d2 100644 --- a/packages/subproviders/package.json +++ b/packages/subproviders/package.json @@ -47,7 +47,7 @@ "ethereum-types": "^3.0.0", "ethereumjs-tx": "^1.3.5", "ethereumjs-util": "^5.1.1", - "ganache-core": "2.9.0-istanbul.0", + "ganache-core": "^2.9.0-istanbul.0", "hdkey": "^0.7.1", "json-rpc-error": "2.0.0", "lodash": "^4.17.11", diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json index 308ed4a9c6..d4a68abac5 100644 --- a/packages/web3-wrapper/package.json +++ b/packages/web3-wrapper/package.json @@ -47,6 +47,7 @@ "chai-as-promised": "^7.1.0", "chai-bignumber": "^3.0.0", "dirty-chai": "^2.0.1", + "ganache-core": "^2.9.0-istanbul.0", "make-promises-safe": "^1.1.0", "mocha": "^6.2.0", "npm-run-all": "^4.1.2", diff --git a/packages/web3-wrapper/test/web3_wrapper_test.ts b/packages/web3-wrapper/test/web3_wrapper_test.ts index 7bdce5d059..7322f55481 100644 --- a/packages/web3-wrapper/test/web3_wrapper_test.ts +++ b/packages/web3-wrapper/test/web3_wrapper_test.ts @@ -35,7 +35,7 @@ describe('Web3Wrapper tests', () => { describe('#getNodeVersionAsync', () => { it('gets the node version', async () => { const nodeVersion = await web3Wrapper.getNodeVersionAsync(); - const NODE_VERSION = 'EthereumJS TestRPC/v2.6.0/ethereum-js'; + const NODE_VERSION = 'EthereumJS TestRPC/v2.9.0-istanbul.0/ethereum-js'; expect(nodeVersion).to.be.equal(NODE_VERSION); }); }); diff --git a/yarn.lock b/yarn.lock index f8fdc4c422..bd4639be17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7897,7 +7897,7 @@ ganache-cli@6.8.0-istanbul.0: source-map-support "0.5.12" yargs "13.2.4" -ganache-core@2.9.0-istanbul.0: +ganache-core@2.9.0-istanbul.0, ganache-core@^2.9.0-istanbul.0: version "2.9.0-istanbul.0" resolved "https://registry.npmjs.org/ganache-core/-/ganache-core-2.9.0-istanbul.0.tgz#bc336c770775a2b9fb06f5cae827088ecc194283" integrity sha512-wqNWyxrfZe4QPxzaR/n4hGxIfa1iZAkymPg17wET0iWZ9uurMywGgpG4ZvxjVU9q7WCjIobOSzE1m9OT0dIYcQ== From 27d09713fd089db0931b1df888915a33a3bfca36 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Mon, 23 Dec 2019 19:41:34 -0800 Subject: [PATCH 13/24] Add forwarder mainnet tests --- .../test/forwarder/forwarder_mainnet_test.ts | 201 ++++++++++++++++++ .../integrations/test/forwarder/types.ts | 22 ++ packages/contract-addresses/addresses.json | 2 +- 3 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 contracts/integrations/test/forwarder/forwarder_mainnet_test.ts create mode 100644 contracts/integrations/test/forwarder/types.ts diff --git a/contracts/integrations/test/forwarder/forwarder_mainnet_test.ts b/contracts/integrations/test/forwarder/forwarder_mainnet_test.ts new file mode 100644 index 0000000000..d1ecc14b09 --- /dev/null +++ b/contracts/integrations/test/forwarder/forwarder_mainnet_test.ts @@ -0,0 +1,201 @@ +import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contracts-erc20'; +import { ForwarderContract, IExchangeV2Contract } from '@0x/contracts-exchange-forwarder'; +import { + blockchainTests, + constants, + expect, + getLatestBlockTimestampAsync, + orderHashUtils, + signingUtils, +} from '@0x/contracts-test-utils'; +import { assetDataUtils, generatePseudoRandomSalt } from '@0x/order-utils'; +import { Order, SignatureType, SignedOrder } from '@0x/types'; +import { BigNumber } from '@0x/utils'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import * as ethUtil from 'ethereumjs-util'; + +import { contractAddresses } from '../mainnet_fork_utils'; + +import { SignedV2Order } from './types'; + +blockchainTests.fork.resets('Forwarder mainnet tests', env => { + const forwarder = new ForwarderContract(contractAddresses.forwarder, env.provider, env.txDefaults); + const exchangeV2 = new IExchangeV2Contract(contractAddresses.exchangeV2, env.provider, env.txDefaults); + const wethAssetData = assetDataUtils.encodeERC20AssetData(contractAddresses.etherToken); + const v2OrderId = '0x770501f8'; + let makerAddress: string; + let takerAddress: string; + let makerAssetData: string; + let makerToken: DummyERC20TokenContract; + let makerPrivateKey: Buffer; + + before(async () => { + [makerAddress, takerAddress] = await env.web3Wrapper.getAvailableAddressesAsync(); + makerToken = await DummyERC20TokenContract.deployFrom0xArtifactAsync( + erc20Artifacts.DummyERC20Token, + env.provider, + env.txDefaults, + erc20Artifacts, + constants.DUMMY_TOKEN_NAME, + constants.DUMMY_TOKEN_SYMBOL, + constants.DUMMY_TOKEN_DECIMALS, + constants.DUMMY_TOKEN_TOTAL_SUPPLY, + ); + await makerToken.setBalance(makerAddress, constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync(); + await makerToken + .approve(contractAddresses.erc20Proxy, constants.INITIAL_ERC20_ALLOWANCE) + .awaitTransactionSuccessAsync({ from: makerAddress }); + makerAssetData = assetDataUtils.encodeERC20AssetData(makerToken.address); + makerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[0]; + }); + + async function createOrderAsync(orderParams: Partial = {}): Promise { + const currentBlockTimestamp = await getLatestBlockTimestampAsync(); + const fifteenMinutesInSeconds = 15 * 60; + const order = { + chainId: 1, + exchangeAddress: contractAddresses.exchange, + makerAddress, + takerAddress: constants.NULL_ADDRESS, + senderAddress: constants.NULL_ADDRESS, + feeRecipientAddress: constants.NULL_ADDRESS, + expirationTimeSeconds: new BigNumber(currentBlockTimestamp).plus(fifteenMinutesInSeconds), + salt: generatePseudoRandomSalt(), + makerAssetData, + takerAssetData: wethAssetData, + makerFeeAssetData: makerAssetData, + takerFeeAssetData: wethAssetData, + makerAssetAmount: constants.INITIAL_ERC20_BALANCE.dividedToIntegerBy(2), + takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), + makerFee: constants.ZERO_AMOUNT, + takerFee: constants.ZERO_AMOUNT, + ...orderParams, + }; + const orderHashHex = + order.makerFeeAssetData === v2OrderId + ? (await exchangeV2.getOrderInfo(order).callAsync()).orderHash + : orderHashUtils.getOrderHashHex(order); + const signature = `0x${signingUtils + .signMessage(ethUtil.toBuffer(orderHashHex), makerPrivateKey, SignatureType.EthSign) + .toString('hex')}`; + return { + ...order, + signature, + }; + } + + describe('marketSellOrdersWithEth', () => { + it('should fill a single v2 order with no fees', async () => { + const order = await createOrderAsync({ makerFeeAssetData: v2OrderId }); + const [wethSpentAmount, makerAssetAcquiredAmount] = await forwarder + .marketSellOrdersWithEth([order], [order.signature], [], []) + .callAsync({ + from: takerAddress, + value: order.takerAssetAmount, + }); + expect(wethSpentAmount).to.bignumber.eq(order.takerAssetAmount); + expect(makerAssetAcquiredAmount).to.bignumber.eq(order.makerAssetAmount); + }); + it('should fill multiple v2 orders', async () => { + const orders = [ + await createOrderAsync({ makerFeeAssetData: v2OrderId }), + await createOrderAsync({ makerFeeAssetData: v2OrderId }), + ]; + const ethSellAmount = BigNumber.sum( + orders[0].takerAssetAmount, + orders[1].takerAssetAmount.dividedToIntegerBy(2), + ); + const [wethSpentAmount, makerAssetAcquiredAmount] = await forwarder + .marketSellOrdersWithEth(orders, orders.map(o => o.signature), [], []) + .callAsync({ + from: takerAddress, + value: ethSellAmount, + }); + expect(wethSpentAmount).to.bignumber.eq(ethSellAmount); + expect(makerAssetAcquiredAmount).to.bignumber.eq( + BigNumber.sum(orders[0].makerAssetAmount, orders[1].makerAssetAmount.dividedToIntegerBy(2)), + ); + }); + it.skip('should fill multiple v2/v3 orders', async () => { + const v2Order = await createOrderAsync({ makerFeeAssetData: v2OrderId }); + const v3Order = await createOrderAsync(); + const protocolFee = new BigNumber(150000).times(constants.DEFAULT_GAS_PRICE); + const ethSellAmount = BigNumber.sum( + v2Order.takerAssetAmount, + v3Order.takerAssetAmount.dividedToIntegerBy(2), + ); + const [wethSpentAmount, makerAssetAcquiredAmount] = await forwarder + .marketSellOrdersWithEth([v2Order, v3Order], [v2Order.signature, v3Order.signature], [], []) + .callAsync({ + from: takerAddress, + value: ethSellAmount.plus(protocolFee), + gasPrice: constants.DEFAULT_GAS_PRICE, + }); + expect(wethSpentAmount).to.bignumber.eq(ethSellAmount.plus(protocolFee)); + expect(makerAssetAcquiredAmount).to.bignumber.eq( + BigNumber.sum(v2Order.makerAssetAmount, v3Order.makerAssetAmount.dividedToIntegerBy(2)), + ); + }); + }); + + describe('marketBuyOrdersWithEth', () => { + it('should fill a single v2 order', async () => { + const order = await createOrderAsync({ makerFeeAssetData: v2OrderId }); + const [wethSpentAmount, makerAssetAcquiredAmount] = await forwarder + .marketBuyOrdersWithEth([order], order.makerAssetAmount, [order.signature], [], []) + .callAsync({ from: takerAddress, value: order.takerAssetAmount }); + expect(wethSpentAmount).to.bignumber.eq(order.takerAssetAmount); + expect(makerAssetAcquiredAmount).to.bignumber.eq(order.makerAssetAmount); + }); + it('should fill multiple v2 orders', async () => { + const orders = [ + await createOrderAsync({ makerFeeAssetData: v2OrderId }), + await createOrderAsync({ makerFeeAssetData: v2OrderId }), + ]; + const ethSellAmount = BigNumber.sum( + orders[0].takerAssetAmount, + orders[1].takerAssetAmount.dividedToIntegerBy(2), + ); + const makerAssetBuyAmount = BigNumber.sum( + orders[0].makerAssetAmount, + orders[1].makerAssetAmount.dividedToIntegerBy(2), + ); + const [wethSpentAmount, makerAssetAcquiredAmount] = await forwarder + .marketBuyOrdersWithEth(orders, makerAssetBuyAmount, orders.map(o => o.signature), [], []) + .callAsync({ + from: takerAddress, + value: ethSellAmount, + }); + expect(wethSpentAmount).to.bignumber.eq(ethSellAmount); + expect(makerAssetAcquiredAmount).to.bignumber.eq(makerAssetBuyAmount); + }); + it.skip('should fill multiple v2/v3 orders', async () => { + const v2Order = await createOrderAsync({ makerFeeAssetData: v2OrderId }); + const v3Order = await createOrderAsync(); + const protocolFee = new BigNumber(150000).times(constants.DEFAULT_GAS_PRICE); + const ethSellAmount = BigNumber.sum( + v2Order.takerAssetAmount, + v3Order.takerAssetAmount.dividedToIntegerBy(2), + ); + const makerAssetBuyAmount = BigNumber.sum( + v2Order.makerAssetAmount, + v3Order.makerAssetAmount.dividedToIntegerBy(2), + ); + const [wethSpentAmount, makerAssetAcquiredAmount] = await forwarder + .marketBuyOrdersWithEth( + [v2Order, v3Order], + makerAssetBuyAmount, + [v2Order.signature, v3Order.signature], + [], + [], + ) + .callAsync({ + from: takerAddress, + value: ethSellAmount.plus(protocolFee), + gasPrice: constants.DEFAULT_GAS_PRICE, + }); + expect(wethSpentAmount).to.bignumber.eq(ethSellAmount.plus(protocolFee)); + expect(makerAssetAcquiredAmount).to.bignumber.eq(makerAssetBuyAmount); + }); + }); +}); diff --git a/contracts/integrations/test/forwarder/types.ts b/contracts/integrations/test/forwarder/types.ts new file mode 100644 index 0000000000..47b01a0cab --- /dev/null +++ b/contracts/integrations/test/forwarder/types.ts @@ -0,0 +1,22 @@ +import { BigNumber } from '@0x/utils'; + +export interface V2Order { + makerAddress: string; + takerAddress: string; + senderAddress: string; + feeRecipientAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + salt: BigNumber; + expirationTimeSeconds: BigNumber; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; +} + +export interface SignedV2Order extends V2Order { + signature: string; +} diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index b6fd8c3ab0..e4aa1296c1 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -4,7 +4,7 @@ "exchange": "0x61935cbdd02287b511119ddb11aeb42f1593b7ef", "erc20Proxy": "0x95e6f48254609a6ee006f7d493c8e5fb97094cef", "erc721Proxy": "0xefc70a1b18c432bdc64b596838b4d138f6bc6cad", - "forwarder": "0xbf1e3a8405906904b3692446e0fb4e309628a9fe", + "forwarder": "0x9ea309d4f96d6433c75a6b9c5a596cf19a87edb8", "orderValidator": "0x0000000000000000000000000000000000000000", "zrxToken": "0xe41d2489571d322189246dafa5ebde1f4699f498", "etherToken": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", From b0aa5d3af2937988724df2fc63aab33a042e411e Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Thu, 2 Jan 2020 15:21:34 -0800 Subject: [PATCH 14/24] Check makerFeeAssetData length before attempting to read id --- .../exchange-forwarder/contracts/src/MixinExchangeWrapper.sol | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol index 9db005daf4..e05a407ad3 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol @@ -492,6 +492,6 @@ contract MixinExchangeWrapper is pure returns (bool) { - return order.makerFeeAssetData.readBytes4(0) == EXCHANGE_V2_ORDER_ID; + return order.makerFeeAssetData.length > 3 && order.makerFeeAssetData.readBytes4(0) == EXCHANGE_V2_ORDER_ID; } } diff --git a/yarn.lock b/yarn.lock index bd4639be17..596b623b34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7897,7 +7897,7 @@ ganache-cli@6.8.0-istanbul.0: source-map-support "0.5.12" yargs "13.2.4" -ganache-core@2.9.0-istanbul.0, ganache-core@^2.9.0-istanbul.0: +ganache-core@^2.9.0-istanbul.0: version "2.9.0-istanbul.0" resolved "https://registry.npmjs.org/ganache-core/-/ganache-core-2.9.0-istanbul.0.tgz#bc336c770775a2b9fb06f5cae827088ecc194283" integrity sha512-wqNWyxrfZe4QPxzaR/n4hGxIfa1iZAkymPg17wET0iWZ9uurMywGgpG4ZvxjVU9q7WCjIobOSzE1m9OT0dIYcQ== From 0c6d06e7bb29987eaedd9c5a425489e2e049230e Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Sat, 4 Jan 2020 18:24:58 -0800 Subject: [PATCH 15/24] Redeploy bridges and Forwarder on mainnet --- packages/contract-addresses/addresses.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index e4aa1296c1..ff3eff5d17 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -4,7 +4,7 @@ "exchange": "0x61935cbdd02287b511119ddb11aeb42f1593b7ef", "erc20Proxy": "0x95e6f48254609a6ee006f7d493c8e5fb97094cef", "erc721Proxy": "0xefc70a1b18c432bdc64b596838b4d138f6bc6cad", - "forwarder": "0x9ea309d4f96d6433c75a6b9c5a596cf19a87edb8", + "forwarder": "0xcd53c634e93fa1214d028acaaf6a12912ba26a2f", "orderValidator": "0x0000000000000000000000000000000000000000", "zrxToken": "0xe41d2489571d322189246dafa5ebde1f4699f498", "etherToken": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", @@ -21,12 +21,12 @@ "stakingProxy": "0xa26e80e7dea86279c6d778d702cc413e6cffa777", "devUtils": "0xc7612135356ba8f75dbf517b55d88a91977492dc", "erc20BridgeProxy": "0x8ed95d1746bf1e4dab58d8ed4724f1ef95b20db0", - "uniswapBridge": "0xb0dc61047847732a013ce27341228228a38655a0", + "uniswapBridge": "0x533344cfdf2a3e911e2cf4c6f5ed08e791f5355f", "erc20BridgeSampler": "0x1b402fdb5ee87f989c11e3963557e89cc313b6c0", - "kyberBridge": "0x7253a80c1d3a3175283bad9ed04b2cecad0fe0d3", - "eth2DaiBridge": "0x1c36b06fc0d9354a96cf155b861b141ed10c3312", - "chaiBridge": "0x6a3b7c553d47c08651641ef00cb3befae97bf415", - "dydxBridge": "0x96ddba19b69d6ea2549f6a12d005595167414744" + "kyberBridge": "0xf342f3a80fdc9b48713d58fe97e17f5cc764ee62", + "eth2DaiBridge": "0xe97ea901d034ba2e018155264f77c417ce7717f9", + "chaiBridge": "0x77c31eba23043b9a72d13470f3a3a311344d7438", + "dydxBridge": "0x55dc8f21d20d4c6ed3c82916a438a413ca68e335" }, "3": { "erc20Proxy": "0xb1408f4c245a23c31b98d2c626777d4c0d766caa", From f8bb94d7212123cc52411e4dfc1966eedcdb2ee8 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Mon, 6 Jan 2020 11:21:21 -0800 Subject: [PATCH 16/24] Remove unnecessary BigNumber cast --- contracts/integrations/test/forwarder/forwarder_mainnet_test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/integrations/test/forwarder/forwarder_mainnet_test.ts b/contracts/integrations/test/forwarder/forwarder_mainnet_test.ts index d1ecc14b09..cdbb5df160 100644 --- a/contracts/integrations/test/forwarder/forwarder_mainnet_test.ts +++ b/contracts/integrations/test/forwarder/forwarder_mainnet_test.ts @@ -66,7 +66,7 @@ blockchainTests.fork.resets('Forwarder mainnet tests', env => { makerFeeAssetData: makerAssetData, takerFeeAssetData: wethAssetData, makerAssetAmount: constants.INITIAL_ERC20_BALANCE.dividedToIntegerBy(2), - takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), + takerAssetAmount: Web3Wrapper.toBaseUnitAmount(0.001, 18), makerFee: constants.ZERO_AMOUNT, takerFee: constants.ZERO_AMOUNT, ...orderParams, From 8de3a9085168ff0b56fa53c049d041eee3c5f9f4 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Mon, 6 Jan 2020 11:31:07 -0800 Subject: [PATCH 17/24] Update CHANGELOG --- packages/contract-addresses/CHANGELOG.json | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/contract-addresses/CHANGELOG.json b/packages/contract-addresses/CHANGELOG.json index 1a536226ad..7a9915c7c0 100644 --- a/packages/contract-addresses/CHANGELOG.json +++ b/packages/contract-addresses/CHANGELOG.json @@ -12,15 +12,23 @@ }, { "note": "Added DydxBridge Contract to contract-addresses", - "pr": 2401 + "pr": 2390 }, { "note": "Update `UniswapBridge` mainnet address.", - "pr": 2412 + "pr": 2390 }, { "note": "Update `KyberBridge` mainnet address.", - "pr": 2412 + "pr": 2390 + }, + { + "note": "Update `Forwarder` mainnet address.", + "pr": 2390 + }, + { + "note": "Added ChaiBridge Contract to contract-addresses", + "pr": 2390 } ], "timestamp": 1578272714 From 8b27380feb5c4ed151827999f82e18e14f71a0df Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Mon, 6 Jan 2020 12:13:58 -0800 Subject: [PATCH 18/24] Fix dep version --- packages/migrations/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/migrations/package.json b/packages/migrations/package.json index f42c8569e2..9f8eb9be41 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -64,7 +64,7 @@ "@0x/base-contract": "^6.0.3", "@0x/contract-addresses": "^4.2.0", "@0x/contract-artifacts": "^3.3.0", - "@0x/contract-wrappers": "13.3.0", + "@0x/contract-wrappers": "^13.3.0", "@0x/contracts-asset-proxy": "^3.1.0", "@0x/contracts-coordinator": "^3.0.3", "@0x/contracts-dev-utils": "^1.0.3", From 2b8c6dc8f973240b2e8c47cda270cd31c10123fd Mon Sep 17 00:00:00 2001 From: Michael Zhu Date: Mon, 16 Dec 2019 11:23:48 -0800 Subject: [PATCH 19/24] Forwarder StaticCall and MultiAsset buy support --- .../contracts/src/MixinAssets.sol | 25 +++++++++++++- .../contracts/src/MixinExchangeWrapper.sol | 34 +++++++++++++++---- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/contracts/exchange-forwarder/contracts/src/MixinAssets.sol b/contracts/exchange-forwarder/contracts/src/MixinAssets.sol index 9b6a896d13..cfea0598bc 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinAssets.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinAssets.sol @@ -20,6 +20,7 @@ pragma solidity ^0.5.9; import "@0x/contracts-utils/contracts/src/LibBytes.sol"; import "@0x/contracts-utils/contracts/src/LibRichErrors.sol"; +import "@0x/contracts-utils/contracts/src/LibSafeMath.sol"; import "@0x/contracts-utils/contracts/src/Ownable.sol"; import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; import "@0x/contracts-erc721/contracts/src/interfaces/IERC721Token.sol"; @@ -35,6 +36,7 @@ contract MixinAssets is IAssets { using LibBytes for bytes; + using LibSafeMath for uint256; /// @dev Withdraws assets from this contract. It may be used by the owner to withdraw assets /// that were accidentally sent to this contract. @@ -95,7 +97,9 @@ contract MixinAssets is _transferERC20Token(assetData, amount); } else if (proxyId == IAssetData(address(0)).ERC721Token.selector) { _transferERC721Token(assetData, amount); - } else { + } else if (proxyId == IAssetData(address(0)).MultiAsset.selector) { + _transferMultiAsset(assetData, amount); + } else if (proxyId != IAssetData(address(0)).StaticCall.selector) { LibRichErrors.rrevert(LibForwarderRichErrors.UnsupportedAssetProxyError( proxyId )); @@ -141,4 +145,23 @@ contract MixinAssets is tokenId ); } + + function _transferMultiAsset( + bytes memory assetData, + uint256 amount + ) + internal + { + // solhint-disable indent + (uint256[] memory nestedAmounts, bytes[] memory nestedAssetData) = abi.decode( + assetData.slice(4, assetData.length), + (uint256[], bytes[]) + ); + // solhint-enable indent + + uint256 numNestedAssets = nestedAssetData.length; + for (uint256 i = 0; i != numNestedAssets; i++) { + _transferAssetToSender(nestedAssetData[i], amount.safeMul(nestedAmounts[i])); + } + } } diff --git a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol index e05a407ad3..0312c6b617 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol @@ -88,9 +88,10 @@ contract MixinExchangeWrapper is uint256 makerAssetAcquiredAmount ) { + bool noTakerFee = _noTakerFee(order.takerFee, order.takerFeeAssetData); // No taker fee or percentage fee if ( - order.takerFee == 0 || + noTakerFee || _areUnderlyingAssetsEqual(order.takerFeeAssetData, order.makerAssetData) ) { // Attempt to sell the remaining amount of WETH @@ -105,7 +106,7 @@ contract MixinExchangeWrapper is // Subtract fee from makerAssetFilledAmount for the net amount acquired. makerAssetAcquiredAmount = singleFillResults.makerAssetFilledAmount - .safeSub(singleFillResults.takerFeePaid); + .safeSub(noTakerFee ? 0 : singleFillResults.takerFeePaid); // WETH fee } else if (_areUnderlyingAssetsEqual(order.takerFeeAssetData, order.takerAssetData)) { @@ -230,9 +231,10 @@ contract MixinExchangeWrapper is uint256 makerAssetAcquiredAmount ) { + bool noTakerFee = _noTakerFee(order.takerFee, order.takerFeeAssetData); // No taker fee or WETH fee if ( - order.takerFee == 0 || + noTakerFee || _areUnderlyingAssetsEqual(order.takerFeeAssetData, order.takerAssetData) ) { // Calculate the remaining amount of takerAsset to sell @@ -251,7 +253,7 @@ contract MixinExchangeWrapper is // WETH is also spent on the protocol and taker fees, so we add it here. wethSpentAmount = singleFillResults.takerAssetFilledAmount - .safeAdd(singleFillResults.takerFeePaid) + .safeAdd(noTakerFee ? 0 : singleFillResults.takerFeePaid) .safeAdd(singleFillResults.protocolFeePaid); makerAssetAcquiredAmount = singleFillResults.makerAssetFilledAmount; @@ -419,7 +421,7 @@ contract MixinExchangeWrapper is return fillResults; } - /// @dev Fills the input ExchangeV3 order. + /// @dev Fills the input ExchangeV3 order. /// Returns false if the transaction would otherwise revert. /// @param order Order struct containing order specifications. /// @param takerAssetFillAmount Desired amount of takerAsset to sell. @@ -480,7 +482,7 @@ contract MixinExchangeWrapper is address token2 = assetData2.readAddress(16); return (token1 == token2); } else { - return false; + return assetData1.equals(assetData2); } } @@ -494,4 +496,24 @@ contract MixinExchangeWrapper is { return order.makerFeeAssetData.length > 3 && order.makerFeeAssetData.readBytes4(0) == EXCHANGE_V2_ORDER_ID; } + + /// @dev Checks whether one asset is effectively equal to another asset. + /// This is the case if they have the same ERC20Proxy/ERC20BridgeProxy asset data, or if + /// one is the ERC20Bridge equivalent of the other. + /// @param takerFee Byte array encoded for the takerFee asset proxy. + /// @param takerFeeAssetData Byte array encoded for the maker asset proxy. + /// @return Whether or not the underlying assets are equal. + function _noTakerFee( + uint256 takerFee, + bytes memory takerFeeAssetData + ) + internal + pure + returns (bool) + { + return ( + takerFee == 0 || + takerFeeAssetData.readBytes4(0) == IAssetData(address(0)).StaticCall.selector + ); + } } From 4bc55551c6e8c4978c173244811a5d8ddb5e6224 Mon Sep 17 00:00:00 2001 From: Michael Zhu Date: Mon, 16 Dec 2019 15:43:47 -0800 Subject: [PATCH 20/24] Add unit tests --- .../contracts/test/TestForwarder.sol | 13 ++ .../exchange-forwarder/test/asset_test.ts | 138 +++++++++++++++++- 2 files changed, 148 insertions(+), 3 deletions(-) diff --git a/contracts/exchange-forwarder/contracts/test/TestForwarder.sol b/contracts/exchange-forwarder/contracts/test/TestForwarder.sol index fcbfb44b03..4cfe4d6793 100644 --- a/contracts/exchange-forwarder/contracts/test/TestForwarder.sol +++ b/contracts/exchange-forwarder/contracts/test/TestForwarder.sol @@ -61,4 +61,17 @@ contract TestForwarder is amount ); } + + function noTakerFee( + uint256 takerFee, + bytes memory takerFeeAssetData + ) + public + returns (bool) + { + return _noTakerFee( + takerFee, + takerFeeAssetData + ); + } } diff --git a/contracts/exchange-forwarder/test/asset_test.ts b/contracts/exchange-forwarder/test/asset_test.ts index 5da23afbd4..48b447e356 100644 --- a/contracts/exchange-forwarder/test/asset_test.ts +++ b/contracts/exchange-forwarder/test/asset_test.ts @@ -20,11 +20,12 @@ import { verifyEventsFromLogs, } from '@0x/contracts-test-utils'; import { BigNumber, ExchangeForwarderRevertErrors, hexUtils } from '@0x/utils'; +import { LogWithDecodedArgs } from 'ethereum-types'; import { artifacts } from './artifacts'; import { TestForwarderContract } from './wrappers'; -blockchainTests('Supported asset type unit tests', env => { +blockchainTests.resets('Supported asset type unit tests', env => { let forwarder: TestForwarderContract; let assetDataEncoder: IAssetDataContract; let bridgeAddress: string; @@ -38,6 +39,8 @@ blockchainTests('Supported asset type unit tests', env => { let erc20AssetData: string; let erc721AssetData: string; let erc20BridgeAssetData: string; + let staticCallAssetData: string; + let multiAssetData: string; before(async () => { [receiver] = await env.getAccountAddressesAsync(); @@ -70,7 +73,7 @@ blockchainTests('Supported asset type unit tests', env => { constants.DUMMY_TOKEN_NAME, constants.DUMMY_TOKEN_SYMBOL, ); - nftId = getRandomInteger(constants.ZERO_AMOUNT, constants.MAX_UINT256); + nftId = getRandomInteger(0, constants.MAX_UINT256); erc721AssetData = assetDataEncoder.ERC721Token(erc721Token.address, nftId).getABIEncodedTransactionData(); bridgeAddress = randomAddress(); @@ -78,6 +81,14 @@ blockchainTests('Supported asset type unit tests', env => { erc20BridgeAssetData = assetDataEncoder .ERC20Bridge(erc20Token.address, bridgeAddress, bridgeData) .getABIEncodedTransactionData(); + + staticCallAssetData = assetDataEncoder + .StaticCall(randomAddress(), hexUtils.random(), constants.KECCAK256_NULL) + .getABIEncodedTransactionData(); + + multiAssetData = assetDataEncoder + .MultiAsset([new BigNumber(1)], [erc20AssetData]) + .getABIEncodedTransactionData(); }); describe('_areUnderlyingAssetsEqual', () => { @@ -115,8 +126,49 @@ blockchainTests('Supported asset type unit tests', env => { .callAsync(); expect(result).to.be.false(); }); - it('returns false if assetData1 == assetData2 are ERC721', async () => { + it('returns true if assetData1 == assetData2 are ERC721', async () => { const result = await forwarder.areUnderlyingAssetsEqual(erc721AssetData, erc721AssetData).callAsync(); + expect(result).to.be.true(); + }); + it('returns false if assetData1 != assetData2 are ERC721', async () => { + const differentErc721AssetData = assetDataEncoder + .ERC721Token(randomAddress(), getRandomInteger(0, constants.MAX_UINT256)) + .getABIEncodedTransactionData(); + const result = await forwarder + .areUnderlyingAssetsEqual(erc721AssetData, differentErc721AssetData) + .callAsync(); + expect(result).to.be.false(); + }); + it('returns true if assetData1 == assetData2 are StaticCall', async () => { + const result = await forwarder + .areUnderlyingAssetsEqual(staticCallAssetData, staticCallAssetData) + .callAsync(); + expect(result).to.be.true(); + }); + it('returns false if assetData1 != assetData2 are StaticCall', async () => { + const differentStaticCallAssetData = assetDataEncoder + .StaticCall(randomAddress(), hexUtils.random(), constants.KECCAK256_NULL) + .getABIEncodedTransactionData(); + const result = await forwarder + .areUnderlyingAssetsEqual(staticCallAssetData, differentStaticCallAssetData) + .callAsync(); + expect(result).to.be.false(); + }); + it('returns false if assetData1 is ERC20 and assetData2 is MultiAsset', async () => { + const result = await forwarder.areUnderlyingAssetsEqual(erc20AssetData, multiAssetData).callAsync(); + expect(result).to.be.false(); + }); + it('returns true if assetData1 == assetData2 are MultiAsset', async () => { + const result = await forwarder.areUnderlyingAssetsEqual(multiAssetData, multiAssetData).callAsync(); + expect(result).to.be.true(); + }); + it('returns false if assetData1 != assetData2 are MultiAsset', async () => { + const differentMultiAssetData = assetDataEncoder + .MultiAsset([getRandomInteger(0, constants.MAX_UINT256)], [erc721AssetData]) + .getABIEncodedTransactionData(); + const result = await forwarder + .areUnderlyingAssetsEqual(multiAssetData, differentMultiAssetData) + .callAsync(); expect(result).to.be.false(); }); }); @@ -158,6 +210,57 @@ blockchainTests('Supported asset type unit tests', env => { const expectedError = new ExchangeForwarderRevertErrors.Erc721AmountMustEqualOneError(invalidAmount); return expect(tx).to.revertWith(expectedError); }); + it('transfers a single ERC20 token wrapped as MultiAsset', async () => { + const nestedAmount = new BigNumber(1337); + const erc20MultiAssetData = assetDataEncoder + .MultiAsset([nestedAmount], [erc20AssetData]) + .getABIEncodedTransactionData(); + const multiAssetAmount = new BigNumber(2); + const txReceipt = await forwarder + .transferAssetToSender(erc20MultiAssetData, multiAssetAmount) + .awaitTransactionSuccessAsync({ from: receiver }); + verifyEventsFromLogs( + txReceipt.logs, + [{ _from: forwarder.address, _to: receiver, _value: multiAssetAmount.times(nestedAmount) }], + ERC20TokenEvents.Transfer, + ); + }); + it('transfers ERC20, ERC721, and StaticCall assets wrapped as MultiAsset', async () => { + const nestedAmounts = [new BigNumber(1337), TRANSFER_AMOUNT, TRANSFER_AMOUNT]; + const assortedMultiAssetData = assetDataEncoder + .MultiAsset(nestedAmounts, [erc20AssetData, erc721AssetData, staticCallAssetData]) + .getABIEncodedTransactionData(); + const txReceipt = await forwarder + .transferAssetToSender(assortedMultiAssetData, TRANSFER_AMOUNT) + .awaitTransactionSuccessAsync({ from: receiver }); + expect(txReceipt.logs.length).to.equal(2); + const erc20TransferEvent = (txReceipt.logs[0] as LogWithDecodedArgs).args; + const erc721TransferEvent = (txReceipt.logs[1] as LogWithDecodedArgs).args; + expect(erc20TransferEvent).to.deep.equal({ + _from: forwarder.address, + _to: receiver, + _value: nestedAmounts[0], + }); + expect(erc721TransferEvent).to.deep.equal({ _from: forwarder.address, _to: receiver, _tokenId: nftId }); + }); + it('performs nested MultiAsset transfers', async () => { + const nestedAmounts = [TRANSFER_AMOUNT, TRANSFER_AMOUNT, TRANSFER_AMOUNT]; + const assortedMultiAssetData = assetDataEncoder + .MultiAsset(nestedAmounts, [multiAssetData, erc721AssetData, staticCallAssetData]) + .getABIEncodedTransactionData(); + const txReceipt = await forwarder + .transferAssetToSender(assortedMultiAssetData, TRANSFER_AMOUNT) + .awaitTransactionSuccessAsync({ from: receiver }); + expect(txReceipt.logs.length).to.equal(2); + const erc20TransferEvent = (txReceipt.logs[0] as LogWithDecodedArgs).args; + const erc721TransferEvent = (txReceipt.logs[1] as LogWithDecodedArgs).args; + expect(erc20TransferEvent).to.deep.equal({ + _from: forwarder.address, + _to: receiver, + _value: TRANSFER_AMOUNT, + }); + expect(erc721TransferEvent).to.deep.equal({ _from: forwarder.address, _to: receiver, _tokenId: nftId }); + }); it('transfers an ERC20 token given ERC20Bridge assetData', async () => { const txReceipt = await forwarder .transferAssetToSender(erc20BridgeAssetData, TRANSFER_AMOUNT) @@ -168,6 +271,12 @@ blockchainTests('Supported asset type unit tests', env => { ERC20TokenEvents.Transfer, ); }); + it('noops (emits no events) for StaticCall assetData', async () => { + const txReceipt = await forwarder + .transferAssetToSender(staticCallAssetData, TRANSFER_AMOUNT) + .awaitTransactionSuccessAsync({ from: receiver }); + expect(txReceipt.logs.length).to.equal(0); + }); it('reverts if assetData is unsupported', async () => { const randomBytes = hexUtils.random(); const tx = forwarder @@ -179,4 +288,27 @@ blockchainTests('Supported asset type unit tests', env => { return expect(tx).to.revertWith(expectedError); }); }); + + describe('_noTakerFee', () => { + it('returns true if takerFee == 0 and takerFeeAssetData != StaticCall', async () => { + const result = await forwarder.noTakerFee(constants.ZERO_AMOUNT, erc20AssetData).callAsync(); + expect(result).to.be.true(); + }); + it('returns false if takerFee != 0 and takerFeeAssetData != StaticCall', async () => { + const result = await forwarder + .noTakerFee(getRandomInteger(1, constants.MAX_UINT256), erc20AssetData) + .callAsync(); + expect(result).to.be.false(); + }); + it('returns true if takerFee == 0 and takerFeeAssetData == StaticCall', async () => { + const result = await forwarder.noTakerFee(constants.ZERO_AMOUNT, staticCallAssetData).callAsync(); + expect(result).to.be.true(); + }); + it('returns true if takerFee != 0 and takerFeeAssetData == StaticCall', async () => { + const result = await forwarder + .noTakerFee(getRandomInteger(1, constants.MAX_UINT256), staticCallAssetData) + .callAsync(); + expect(result).to.be.true(); + }); + }); }); From 295811ed5ad8a6771f340a4b15c352a3f6ad756f Mon Sep 17 00:00:00 2001 From: Michael Zhu Date: Thu, 2 Jan 2020 18:49:07 -0500 Subject: [PATCH 21/24] add integrations tests --- .../contracts/src/MixinExchangeWrapper.sol | 5 +- .../exchange-forwarder/test/asset_test.ts | 4 + .../test/forwarder/forwarder_test.ts | 136 ++++++++++++++++-- .../test/forwarder/forwarder_test_factory.ts | 14 +- 4 files changed, 143 insertions(+), 16 deletions(-) diff --git a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol index 0312c6b617..87ff03020a 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol @@ -513,7 +513,10 @@ contract MixinExchangeWrapper is { return ( takerFee == 0 || - takerFeeAssetData.readBytes4(0) == IAssetData(address(0)).StaticCall.selector + ( + takerFeeAssetData.length > 3 && + takerFeeAssetData.readBytes4(0) == IAssetData(address(0)).StaticCall.selector + ) ); } } diff --git a/contracts/exchange-forwarder/test/asset_test.ts b/contracts/exchange-forwarder/test/asset_test.ts index 48b447e356..4a52b71d05 100644 --- a/contracts/exchange-forwarder/test/asset_test.ts +++ b/contracts/exchange-forwarder/test/asset_test.ts @@ -234,8 +234,10 @@ blockchainTests.resets('Supported asset type unit tests', env => { .transferAssetToSender(assortedMultiAssetData, TRANSFER_AMOUNT) .awaitTransactionSuccessAsync({ from: receiver }); expect(txReceipt.logs.length).to.equal(2); + // tslint:disable:no-unnecessary-type-assertion const erc20TransferEvent = (txReceipt.logs[0] as LogWithDecodedArgs).args; const erc721TransferEvent = (txReceipt.logs[1] as LogWithDecodedArgs).args; + // tslint:enable:no-unnecessary-type-assertion expect(erc20TransferEvent).to.deep.equal({ _from: forwarder.address, _to: receiver, @@ -252,8 +254,10 @@ blockchainTests.resets('Supported asset type unit tests', env => { .transferAssetToSender(assortedMultiAssetData, TRANSFER_AMOUNT) .awaitTransactionSuccessAsync({ from: receiver }); expect(txReceipt.logs.length).to.equal(2); + // tslint:disable:no-unnecessary-type-assertion const erc20TransferEvent = (txReceipt.logs[0] as LogWithDecodedArgs).args; const erc721TransferEvent = (txReceipt.logs[1] as LogWithDecodedArgs).args; + // tslint:enable:no-unnecessary-type-assertion expect(erc20TransferEvent).to.deep.equal({ _from: forwarder.address, _to: receiver, diff --git a/contracts/integrations/test/forwarder/forwarder_test.ts b/contracts/integrations/test/forwarder/forwarder_test.ts index 68a50b2e58..bd7d8d8c59 100644 --- a/contracts/integrations/test/forwarder/forwarder_test.ts +++ b/contracts/integrations/test/forwarder/forwarder_test.ts @@ -1,3 +1,4 @@ +import { artifacts as assetProxyArtifacts, TestStaticCallTargetContract } from '@0x/contracts-asset-proxy'; import { DummyERC20TokenContract } from '@0x/contracts-erc20'; import { DummyERC721TokenContract } from '@0x/contracts-erc721'; import { artifacts as exchangeArtifacts, ExchangeContract } from '@0x/contracts-exchange'; @@ -37,6 +38,8 @@ blockchainTests('Forwarder integration tests', env => { let nftId: BigNumber; let wethAssetData: string; let makerAssetData: string; + let staticCallSuccessAssetData: string; + let staticCallFailureAssetData: string; let maker: Maker; let taker: Taker; @@ -51,12 +54,33 @@ blockchainTests('Forwarder integration tests', env => { }); forwarder = await deployForwarderAsync(deployment, env); + const staticCallTarget = await TestStaticCallTargetContract.deployFrom0xArtifactAsync( + assetProxyArtifacts.TestStaticCallTarget, + env.provider, + env.txDefaults, + assetProxyArtifacts, + ); + [makerToken, makerFeeToken, anotherErc20Token] = deployment.tokens.erc20; [erc721Token] = deployment.tokens.erc721; wethAssetData = deployment.assetDataEncoder .ERC20Token(deployment.tokens.weth.address) .getABIEncodedTransactionData(); makerAssetData = deployment.assetDataEncoder.ERC20Token(makerToken.address).getABIEncodedTransactionData(); + staticCallSuccessAssetData = deployment.assetDataEncoder + .StaticCall( + staticCallTarget.address, + staticCallTarget.assertEvenNumber(new BigNumber(2)).getABIEncodedTransactionData(), + constants.KECCAK256_NULL, + ) + .getABIEncodedTransactionData(); + staticCallFailureAssetData = deployment.assetDataEncoder + .StaticCall( + staticCallTarget.address, + staticCallTarget.assertEvenNumber(new BigNumber(1)).getABIEncodedTransactionData(), + constants.KECCAK256_NULL, + ) + .getABIEncodedTransactionData(); taker = new Taker({ name: 'Taker', deployment }); orderFeeRecipient = new FeeRecipient({ @@ -266,14 +290,14 @@ blockchainTests('Forwarder integration tests', env => { makerAssetAmount: constants.ZERO_AMOUNT, }); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketSellTestAsync([unfillableOrder, fillableOrder], 1.5); + await testFactory.marketSellTestAsync([unfillableOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); it('should skip over an order with an invalid taker asset amount', async () => { const unfillableOrder = await maker.signOrderAsync({ takerAssetAmount: constants.ZERO_AMOUNT, }); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketSellTestAsync([unfillableOrder, fillableOrder], 1.5); + await testFactory.marketSellTestAsync([unfillableOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); it('should skip over an expired order', async () => { const currentTimestamp = await getLatestBlockTimestampAsync(); @@ -281,19 +305,65 @@ blockchainTests('Forwarder integration tests', env => { expirationTimeSeconds: new BigNumber(currentTimestamp).minus(10), }); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketSellTestAsync([expiredOrder, fillableOrder], 1.5); + await testFactory.marketSellTestAsync([expiredOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); it('should skip over a fully filled order', async () => { const fullyFilledOrder = await maker.signOrderAsync(); await testFactory.marketSellTestAsync([fullyFilledOrder], 1); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketSellTestAsync([fullyFilledOrder, fillableOrder], 1.5); + await testFactory.marketSellTestAsync([fullyFilledOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); it('should skip over a cancelled order', async () => { const cancelledOrder = await maker.signOrderAsync(); await maker.cancelOrderAsync(cancelledOrder); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketSellTestAsync([cancelledOrder, fillableOrder], 1.5); + await testFactory.marketSellTestAsync([cancelledOrder, fillableOrder], 1.5, { noopOrders: [0] }); + }); + for (const orderAssetData of ['makerAssetData', 'makerFeeAssetData', 'takerFeeAssetData']) { + it(`should fill an order with StaticCall ${orderAssetData} if the StaticCall succeeds`, async () => { + const staticCallOrder = await maker.signOrderAsync({ + [orderAssetData]: staticCallSuccessAssetData, + }); + const nonStaticCallOrder = await maker.signOrderAsync(); + await testFactory.marketSellTestAsync([staticCallOrder, nonStaticCallOrder], 1.5); + }); + it(`should not fill an order with StaticCall ${orderAssetData} if the StaticCall fails`, async () => { + const staticCallOrder = await maker.signOrderAsync({ + [orderAssetData]: staticCallFailureAssetData, + }); + const nonStaticCallOrder = await maker.signOrderAsync(); + await testFactory.marketSellTestAsync([staticCallOrder, nonStaticCallOrder], 1.5, { noopOrders: [0] }); + }); + } + it('should fill an order with multiAsset makerAssetData', async () => { + const multiAssetData = deployment.assetDataEncoder + .MultiAsset([new BigNumber(2)], [makerAssetData]) + .getABIEncodedTransactionData(); + const multiAssetOrder = await maker.signOrderAsync({ + makerAssetData: multiAssetData, + }); + const nonMultiAssetOrder = await maker.signOrderAsync(); + await testFactory.marketSellTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3); + }); + it('should fill an order with multiAsset makerAssetData (nested StaticCall succeeds)', async () => { + const multiAssetData = deployment.assetDataEncoder + .MultiAsset([new BigNumber(2), new BigNumber(3)], [makerAssetData, staticCallSuccessAssetData]) + .getABIEncodedTransactionData(); + const multiAssetOrder = await maker.signOrderAsync({ + makerAssetData: multiAssetData, + }); + const nonMultiAssetOrder = await maker.signOrderAsync(); + await testFactory.marketSellTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3); + }); + it('should skip over an order with multiAsset makerAssetData where the nested StaticCall fails', async () => { + const multiAssetData = deployment.assetDataEncoder + .MultiAsset([new BigNumber(2), new BigNumber(3)], [makerAssetData, staticCallFailureAssetData]) + .getABIEncodedTransactionData(); + const multiAssetOrder = await maker.signOrderAsync({ + makerAssetData: multiAssetData, + }); + const nonMultiAssetOrder = await maker.signOrderAsync(); + await testFactory.marketSellTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3, { noopOrders: [0] }); }); }); blockchainTests.resets('marketSellOrdersWithEth with extra fees', () => { @@ -495,14 +565,14 @@ blockchainTests('Forwarder integration tests', env => { makerAssetAmount: constants.ZERO_AMOUNT, }); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketBuyTestAsync([unfillableOrder, fillableOrder], 1.5); + await testFactory.marketBuyTestAsync([unfillableOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); it('should skip over an order with an invalid taker asset amount', async () => { const unfillableOrder = await maker.signOrderAsync({ takerAssetAmount: constants.ZERO_AMOUNT, }); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketBuyTestAsync([unfillableOrder, fillableOrder], 1.5); + await testFactory.marketBuyTestAsync([unfillableOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); it('should skip over an expired order', async () => { const currentTimestamp = await getLatestBlockTimestampAsync(); @@ -510,19 +580,19 @@ blockchainTests('Forwarder integration tests', env => { expirationTimeSeconds: new BigNumber(currentTimestamp).minus(10), }); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketBuyTestAsync([expiredOrder, fillableOrder], 1.5); + await testFactory.marketBuyTestAsync([expiredOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); it('should skip over a fully filled order', async () => { const fullyFilledOrder = await maker.signOrderAsync(); await testFactory.marketBuyTestAsync([fullyFilledOrder], 1); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketBuyTestAsync([fullyFilledOrder, fillableOrder], 1.5); + await testFactory.marketBuyTestAsync([fullyFilledOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); it('should skip over a cancelled order', async () => { const cancelledOrder = await maker.signOrderAsync(); await maker.cancelOrderAsync(cancelledOrder); const fillableOrder = await maker.signOrderAsync(); - await testFactory.marketBuyTestAsync([cancelledOrder, fillableOrder], 1.5); + await testFactory.marketBuyTestAsync([cancelledOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); it('Should buy slightly greater makerAsset when exchange rate is rounded', async () => { // The 0x Protocol contracts round the exchange rate in favor of the Maker. @@ -622,6 +692,52 @@ blockchainTests('Forwarder integration tests', env => { await balanceStore.updateBalancesAsync(); balanceStore.assertEquals(expectedBalances); }); + for (const orderAssetData of ['makerAssetData', 'makerFeeAssetData', 'takerFeeAssetData']) { + it(`should fill an order with StaticCall ${orderAssetData} if the StaticCall succeeds`, async () => { + const staticCallOrder = await maker.signOrderAsync({ + [orderAssetData]: staticCallSuccessAssetData, + }); + const nonStaticCallOrder = await maker.signOrderAsync(); + await testFactory.marketBuyTestAsync([staticCallOrder, nonStaticCallOrder], 1.5); + }); + it(`should not fill an order with StaticCall ${orderAssetData} if the StaticCall fails`, async () => { + const staticCallOrder = await maker.signOrderAsync({ + [orderAssetData]: staticCallFailureAssetData, + }); + const nonStaticCallOrder = await maker.signOrderAsync(); + await testFactory.marketBuyTestAsync([staticCallOrder, nonStaticCallOrder], 1.5, { noopOrders: [0] }); + }); + } + it('should fill an order with multiAsset makerAssetData', async () => { + const multiAssetData = deployment.assetDataEncoder + .MultiAsset([new BigNumber(2)], [makerAssetData]) + .getABIEncodedTransactionData(); + const multiAssetOrder = await maker.signOrderAsync({ + makerAssetData: multiAssetData, + }); + const nonMultiAssetOrder = await maker.signOrderAsync(); + await testFactory.marketBuyTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3); + }); + it('should fill an order with multiAsset makerAssetData (nested StaticCall succeeds)', async () => { + const multiAssetData = deployment.assetDataEncoder + .MultiAsset([new BigNumber(2), new BigNumber(3)], [makerAssetData, staticCallSuccessAssetData]) + .getABIEncodedTransactionData(); + const multiAssetOrder = await maker.signOrderAsync({ + makerAssetData: multiAssetData, + }); + const nonMultiAssetOrder = await maker.signOrderAsync(); + await testFactory.marketBuyTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3); + }); + it('should skip over an order with multiAsset makerAssetData where the nested StaticCall fails', async () => { + const multiAssetData = deployment.assetDataEncoder + .MultiAsset([new BigNumber(2), new BigNumber(3)], [makerAssetData, staticCallFailureAssetData]) + .getABIEncodedTransactionData(); + const multiAssetOrder = await maker.signOrderAsync({ + makerAssetData: multiAssetData, + }); + const nonMultiAssetOrder = await maker.signOrderAsync(); + await testFactory.marketBuyTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3, { noopOrders: [0] }); + }); }); blockchainTests.resets('marketBuyOrdersWithEth with extra fees', () => { it('should buy the asset and send fee to feeRecipient', async () => { diff --git a/contracts/integrations/test/forwarder/forwarder_test_factory.ts b/contracts/integrations/test/forwarder/forwarder_test_factory.ts index 1db48e7515..f90c7bccae 100644 --- a/contracts/integrations/test/forwarder/forwarder_test_factory.ts +++ b/contracts/integrations/test/forwarder/forwarder_test_factory.ts @@ -22,6 +22,7 @@ interface MarketSellOptions { forwarderFeeRecipientAddresses: string[]; revertError: RevertError; bridgeExcessBuyAmount: BigNumber; + noopOrders: number[]; // Indices of orders expected to noop on _fillOrderNoThrow (e.g. cancelled orders) } interface MarketBuyOptions extends MarketSellOptions { @@ -71,7 +72,7 @@ export class ForwarderTestFactory { orders.map(order => this._deployment.exchange.getOrderInfo(order).callAsync()), ); const expectedOrderStatuses = orderInfoBefore.map((orderInfo, i) => - fractionalNumberOfOrdersToFill >= i + 1 && orderInfo.orderStatus === OrderStatus.Fillable + fractionalNumberOfOrdersToFill >= i + 1 && !(options.noopOrders || []).includes(i) ? OrderStatus.FullyFilled : orderInfo.orderStatus, ); @@ -112,7 +113,7 @@ export class ForwarderTestFactory { orders.map(order => this._deployment.exchange.getOrderInfo(order).callAsync()), ); const expectedOrderStatuses = orderInfoBefore.map((orderInfo, i) => - fractionalNumberOfOrdersToFill >= i + 1 && orderInfo.orderStatus === OrderStatus.Fillable + fractionalNumberOfOrdersToFill >= i + 1 && !(options.noopOrders || []).includes(i) ? OrderStatus.FullyFilled : orderInfo.orderStatus, ); @@ -198,8 +199,8 @@ export class ForwarderTestFactory { for (const [i, order] of orders.entries()) { if (remainingOrdersToFill === 0) { break; - } else if (ordersInfoBefore[i].orderStatus !== OrderStatus.Fillable) { - // If the order is not fillable, skip over it but still count it towards fractionalNumberOfOrdersToFill + } else if ((options.noopOrders || []).includes(i)) { + // If the order won't be filled, skip over it but still count it towards fractionalNumberOfOrdersToFill remainingOrdersToFill = Math.max(remainingOrdersToFill - 1, 0); continue; } @@ -245,7 +246,10 @@ export class ForwarderTestFactory { const makerFeeFilled = takerAssetFilled.times(order.makerFee).dividedToIntegerBy(order.takerAssetAmount); makerFee = BigNumber.max(makerFee.minus(makerFeeFilled), 0); const takerFeeFilled = takerAssetFilled.times(order.takerFee).dividedToIntegerBy(order.takerAssetAmount); - takerFee = BigNumber.max(takerFee.minus(takerFeeFilled), 0); + takerFee = + hexUtils.slice(order.takerFeeAssetData, 0, 4) === AssetProxyId.StaticCall + ? constants.ZERO_AMOUNT + : BigNumber.max(takerFee.minus(takerFeeFilled), 0); makerAssetAmount = makerAssetAmount.plus(bridgeExcessBuyAmount); let wethSpentAmount = takerAssetAmount.plus(DeploymentManager.protocolFee); From b70cb726c5c822dd2aa9a01ed2865ae42c5ba132 Mon Sep 17 00:00:00 2001 From: Michael Zhu Date: Sun, 5 Jan 2020 22:38:16 -0500 Subject: [PATCH 22/24] remove _noTakerFee (i.e. disallow StaticCall takerFeeAssetData) --- .../contracts/src/MixinExchangeWrapper.sol | 33 +++---------------- .../contracts/test/TestForwarder.sol | 13 -------- .../exchange-forwarder/test/asset_test.ts | 23 ------------- .../test/forwarder/forwarder_test.ts | 2 +- .../test/forwarder/forwarder_test_factory.ts | 5 +-- 5 files changed, 6 insertions(+), 70 deletions(-) diff --git a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol index 87ff03020a..772b0887a1 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinExchangeWrapper.sol @@ -88,10 +88,9 @@ contract MixinExchangeWrapper is uint256 makerAssetAcquiredAmount ) { - bool noTakerFee = _noTakerFee(order.takerFee, order.takerFeeAssetData); // No taker fee or percentage fee if ( - noTakerFee || + order.takerFee == 0 || _areUnderlyingAssetsEqual(order.takerFeeAssetData, order.makerAssetData) ) { // Attempt to sell the remaining amount of WETH @@ -106,7 +105,7 @@ contract MixinExchangeWrapper is // Subtract fee from makerAssetFilledAmount for the net amount acquired. makerAssetAcquiredAmount = singleFillResults.makerAssetFilledAmount - .safeSub(noTakerFee ? 0 : singleFillResults.takerFeePaid); + .safeSub(singleFillResults.takerFeePaid); // WETH fee } else if (_areUnderlyingAssetsEqual(order.takerFeeAssetData, order.takerAssetData)) { @@ -231,10 +230,9 @@ contract MixinExchangeWrapper is uint256 makerAssetAcquiredAmount ) { - bool noTakerFee = _noTakerFee(order.takerFee, order.takerFeeAssetData); // No taker fee or WETH fee if ( - noTakerFee || + order.takerFee == 0 || _areUnderlyingAssetsEqual(order.takerFeeAssetData, order.takerAssetData) ) { // Calculate the remaining amount of takerAsset to sell @@ -253,7 +251,7 @@ contract MixinExchangeWrapper is // WETH is also spent on the protocol and taker fees, so we add it here. wethSpentAmount = singleFillResults.takerAssetFilledAmount - .safeAdd(noTakerFee ? 0 : singleFillResults.takerFeePaid) + .safeAdd(singleFillResults.takerFeePaid) .safeAdd(singleFillResults.protocolFeePaid); makerAssetAcquiredAmount = singleFillResults.makerAssetFilledAmount; @@ -496,27 +494,4 @@ contract MixinExchangeWrapper is { return order.makerFeeAssetData.length > 3 && order.makerFeeAssetData.readBytes4(0) == EXCHANGE_V2_ORDER_ID; } - - /// @dev Checks whether one asset is effectively equal to another asset. - /// This is the case if they have the same ERC20Proxy/ERC20BridgeProxy asset data, or if - /// one is the ERC20Bridge equivalent of the other. - /// @param takerFee Byte array encoded for the takerFee asset proxy. - /// @param takerFeeAssetData Byte array encoded for the maker asset proxy. - /// @return Whether or not the underlying assets are equal. - function _noTakerFee( - uint256 takerFee, - bytes memory takerFeeAssetData - ) - internal - pure - returns (bool) - { - return ( - takerFee == 0 || - ( - takerFeeAssetData.length > 3 && - takerFeeAssetData.readBytes4(0) == IAssetData(address(0)).StaticCall.selector - ) - ); - } } diff --git a/contracts/exchange-forwarder/contracts/test/TestForwarder.sol b/contracts/exchange-forwarder/contracts/test/TestForwarder.sol index 4cfe4d6793..fcbfb44b03 100644 --- a/contracts/exchange-forwarder/contracts/test/TestForwarder.sol +++ b/contracts/exchange-forwarder/contracts/test/TestForwarder.sol @@ -61,17 +61,4 @@ contract TestForwarder is amount ); } - - function noTakerFee( - uint256 takerFee, - bytes memory takerFeeAssetData - ) - public - returns (bool) - { - return _noTakerFee( - takerFee, - takerFeeAssetData - ); - } } diff --git a/contracts/exchange-forwarder/test/asset_test.ts b/contracts/exchange-forwarder/test/asset_test.ts index 4a52b71d05..96f84ba275 100644 --- a/contracts/exchange-forwarder/test/asset_test.ts +++ b/contracts/exchange-forwarder/test/asset_test.ts @@ -292,27 +292,4 @@ blockchainTests.resets('Supported asset type unit tests', env => { return expect(tx).to.revertWith(expectedError); }); }); - - describe('_noTakerFee', () => { - it('returns true if takerFee == 0 and takerFeeAssetData != StaticCall', async () => { - const result = await forwarder.noTakerFee(constants.ZERO_AMOUNT, erc20AssetData).callAsync(); - expect(result).to.be.true(); - }); - it('returns false if takerFee != 0 and takerFeeAssetData != StaticCall', async () => { - const result = await forwarder - .noTakerFee(getRandomInteger(1, constants.MAX_UINT256), erc20AssetData) - .callAsync(); - expect(result).to.be.false(); - }); - it('returns true if takerFee == 0 and takerFeeAssetData == StaticCall', async () => { - const result = await forwarder.noTakerFee(constants.ZERO_AMOUNT, staticCallAssetData).callAsync(); - expect(result).to.be.true(); - }); - it('returns true if takerFee != 0 and takerFeeAssetData == StaticCall', async () => { - const result = await forwarder - .noTakerFee(getRandomInteger(1, constants.MAX_UINT256), staticCallAssetData) - .callAsync(); - expect(result).to.be.true(); - }); - }); }); diff --git a/contracts/integrations/test/forwarder/forwarder_test.ts b/contracts/integrations/test/forwarder/forwarder_test.ts index bd7d8d8c59..a58e1aa2fd 100644 --- a/contracts/integrations/test/forwarder/forwarder_test.ts +++ b/contracts/integrations/test/forwarder/forwarder_test.ts @@ -319,7 +319,7 @@ blockchainTests('Forwarder integration tests', env => { const fillableOrder = await maker.signOrderAsync(); await testFactory.marketSellTestAsync([cancelledOrder, fillableOrder], 1.5, { noopOrders: [0] }); }); - for (const orderAssetData of ['makerAssetData', 'makerFeeAssetData', 'takerFeeAssetData']) { + for (const orderAssetData of ['makerAssetData', 'makerFeeAssetData']) { it(`should fill an order with StaticCall ${orderAssetData} if the StaticCall succeeds`, async () => { const staticCallOrder = await maker.signOrderAsync({ [orderAssetData]: staticCallSuccessAssetData, diff --git a/contracts/integrations/test/forwarder/forwarder_test_factory.ts b/contracts/integrations/test/forwarder/forwarder_test_factory.ts index f90c7bccae..46456086ab 100644 --- a/contracts/integrations/test/forwarder/forwarder_test_factory.ts +++ b/contracts/integrations/test/forwarder/forwarder_test_factory.ts @@ -246,10 +246,7 @@ export class ForwarderTestFactory { const makerFeeFilled = takerAssetFilled.times(order.makerFee).dividedToIntegerBy(order.takerAssetAmount); makerFee = BigNumber.max(makerFee.minus(makerFeeFilled), 0); const takerFeeFilled = takerAssetFilled.times(order.takerFee).dividedToIntegerBy(order.takerAssetAmount); - takerFee = - hexUtils.slice(order.takerFeeAssetData, 0, 4) === AssetProxyId.StaticCall - ? constants.ZERO_AMOUNT - : BigNumber.max(takerFee.minus(takerFeeFilled), 0); + takerFee = BigNumber.max(takerFee.minus(takerFeeFilled), 0); makerAssetAmount = makerAssetAmount.plus(bridgeExcessBuyAmount); let wethSpentAmount = takerAssetAmount.plus(DeploymentManager.protocolFee); From 87cd5fca9027e89ebe90b48588c522d4d79bc920 Mon Sep 17 00:00:00 2001 From: Michael Zhu Date: Mon, 6 Jan 2020 17:24:10 -0500 Subject: [PATCH 23/24] address comments --- .../exchange-forwarder/contracts/src/MixinAssets.sol | 3 +++ contracts/exchange-forwarder/test/asset_test.ts | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/contracts/exchange-forwarder/contracts/src/MixinAssets.sol b/contracts/exchange-forwarder/contracts/src/MixinAssets.sol index cfea0598bc..6fa6f69a8f 100644 --- a/contracts/exchange-forwarder/contracts/src/MixinAssets.sol +++ b/contracts/exchange-forwarder/contracts/src/MixinAssets.sol @@ -146,6 +146,9 @@ contract MixinAssets is ); } + /// @dev Decodes MultiAsset assetData and recursively transfers assets to sender. + /// @param assetData Byte array encoded for the respective asset proxy. + /// @param amount Amount of asset to transfer to sender. function _transferMultiAsset( bytes memory assetData, uint256 amount diff --git a/contracts/exchange-forwarder/test/asset_test.ts b/contracts/exchange-forwarder/test/asset_test.ts index 96f84ba275..51fe246e24 100644 --- a/contracts/exchange-forwarder/test/asset_test.ts +++ b/contracts/exchange-forwarder/test/asset_test.ts @@ -158,10 +158,20 @@ blockchainTests.resets('Supported asset type unit tests', env => { const result = await forwarder.areUnderlyingAssetsEqual(erc20AssetData, multiAssetData).callAsync(); expect(result).to.be.false(); }); - it('returns true if assetData1 == assetData2 are MultiAsset', async () => { + it('returns true if assetData1 == assetData2 are MultiAsset (single nested asset)', async () => { const result = await forwarder.areUnderlyingAssetsEqual(multiAssetData, multiAssetData).callAsync(); expect(result).to.be.true(); }); + it('returns true if assetData1 == assetData2 are MultiAsset (multiple nested assets)', async () => { + const assetData = assetDataEncoder + .MultiAsset( + [getRandomInteger(0, constants.MAX_UINT256), new BigNumber(1)], + [erc20AssetData, erc721AssetData], + ) + .getABIEncodedTransactionData(); + const result = await forwarder.areUnderlyingAssetsEqual(assetData, assetData).callAsync(); + expect(result).to.be.true(); + }); it('returns false if assetData1 != assetData2 are MultiAsset', async () => { const differentMultiAssetData = assetDataEncoder .MultiAsset([getRandomInteger(0, constants.MAX_UINT256)], [erc721AssetData]) From 2328e02d82a5a5ef3dc3391fc9e477d19ebe924f Mon Sep 17 00:00:00 2001 From: Amir Date: Mon, 6 Jan 2020 22:11:43 -0800 Subject: [PATCH 24/24] Redeploy Forwarder --- packages/contract-addresses/addresses.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index ff3eff5d17..83e18602ed 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -4,7 +4,7 @@ "exchange": "0x61935cbdd02287b511119ddb11aeb42f1593b7ef", "erc20Proxy": "0x95e6f48254609a6ee006f7d493c8e5fb97094cef", "erc721Proxy": "0xefc70a1b18c432bdc64b596838b4d138f6bc6cad", - "forwarder": "0xcd53c634e93fa1214d028acaaf6a12912ba26a2f", + "forwarder": "0x4ef40d1bf0983899892946830abf99eca2dbc5ce", "orderValidator": "0x0000000000000000000000000000000000000000", "zrxToken": "0xe41d2489571d322189246dafa5ebde1f4699f498", "etherToken": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",