From b58cbca61a9efd37b62cf4702af5d706565b4cc4 Mon Sep 17 00:00:00 2001 From: Alex Towle Date: Tue, 12 Nov 2019 17:17:07 -0800 Subject: [PATCH] `@0x:contracts-integrations` Addressed review feedback --- .../test/forwarder/forwarder_test.ts | 9 +- .../match_orders_test.ts | 790 ++++++++------- .../test/utils/match_order_tester.ts | 901 +++++++++--------- 3 files changed, 811 insertions(+), 889 deletions(-) diff --git a/contracts/integrations/test/forwarder/forwarder_test.ts b/contracts/integrations/test/forwarder/forwarder_test.ts index de86ef7f73..b907984e14 100644 --- a/contracts/integrations/test/forwarder/forwarder_test.ts +++ b/contracts/integrations/test/forwarder/forwarder_test.ts @@ -414,14 +414,19 @@ blockchainTests('Forwarder integration tests', env => { it('should buy an ERC721 asset and pay a WETH fee', async () => { const erc721orderWithWethFee = await maker.signOrderAsync({ makerAssetAmount: new BigNumber(1), - makerAssetData: deployment.assetDataEncoder.ERC721Token.getABIEncodedTransactionData(erc721Token.address, nftId), + makerAssetData: deployment.assetDataEncoder.ERC721Token.getABIEncodedTransactionData( + erc721Token.address, + nftId, + ), takerFee: toBaseUnitAmount(1), takerFeeAssetData: wethAssetData, }); await testFactory.marketBuyTestAsync([erc721orderWithWethFee], 1); }); it('should fail to fill an order with a fee denominated in an asset other than makerAsset or WETH', async () => { - const takerFeeAssetData = deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData(anotherErc20Token.address); + const takerFeeAssetData = deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData( + anotherErc20Token.address, + ); const order = await maker.signOrderAsync({ takerFeeAssetData, takerFee: toBaseUnitAmount(1), diff --git a/contracts/integrations/test/internal-integration-tests/match_orders_test.ts b/contracts/integrations/test/internal-integration-tests/match_orders_test.ts index b1c397fa56..15499a1ca1 100644 --- a/contracts/integrations/test/internal-integration-tests/match_orders_test.ts +++ b/contracts/integrations/test/internal-integration-tests/match_orders_test.ts @@ -1,5 +1,3 @@ -import { IAssetDataContract } from '@0x/contracts-asset-proxy'; -import { DevUtilsContract } from '@0x/contracts-dev-utils'; import { BlockchainBalanceStore, TokenIds } from '@0x/contracts-exchange'; import { ReferenceFunctions as LibReferenceFunctions } from '@0x/contracts-exchange-libs'; import { blockchainTests, constants, expect, toBaseUnitAmount } from '@0x/contracts-test-utils'; @@ -7,8 +5,7 @@ import { ExchangeRevertErrors, orderHashUtils } from '@0x/order-utils'; import { Order, OrderStatus, SignedOrder } from '@0x/types'; import { BigNumber } from '@0x/utils'; -import { Actor } from '../actors/base'; -import { Maker } from '../actors/maker'; +import { Actor, actorAddressesByName, Maker } from '../actors'; import { DeploymentManager } from '../deployment_manager'; import { MatchOrderTester, MatchTransferAmounts } from '../utils/match_order_tester'; @@ -40,11 +37,6 @@ blockchainTests.resets('matchOrders integration tests', env => { let leftId: BigNumber; let rightId: BigNumber; - const assetDataEncoder = new IAssetDataContract(constants.NULL_ADDRESS, env.provider, env.txDefaults); - const devUtils = new DevUtilsContract(constants.NULL_ADDRESS, env.provider, env.txDefaults); - - const PROTOCOL_FEE = DeploymentManager.protocolFeeMultiplier.times(constants.DEFAULT_GAS_PRICE); - before(async () => { deployment = await DeploymentManager.deployAsync(env, { numErc20TokensToDeploy: 3, @@ -67,9 +59,11 @@ blockchainTests.resets('matchOrders integration tests', env => { }); // Encode the asset data. - makerAssetDataLeft = assetDataEncoder.ERC20Token.getABIEncodedTransactionData(makerAssetAddressLeft); - makerAssetDataRight = assetDataEncoder.ERC20Token.getABIEncodedTransactionData(makerAssetAddressRight); - feeAssetData = assetDataEncoder.ERC20Token.getABIEncodedTransactionData(feeAssetAddress); + makerAssetDataLeft = deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData(makerAssetAddressLeft); + makerAssetDataRight = deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData( + makerAssetAddressRight, + ); + feeAssetData = deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData(feeAssetAddress); // Create two market makers with compatible orders for matching. makerLeft = new Maker({ @@ -124,11 +118,7 @@ blockchainTests.resets('matchOrders integration tests', env => { const blockchainBalanceStore = new BlockchainBalanceStore( { - feeRecipientLeft: feeRecipientLeft.address, - feeRecipientRight: feeRecipientRight.address, - makerLeft: makerLeft.address, - makerRight: makerRight.address, - matcher: matcher.address, + ...actorAddressesByName([feeRecipientLeft, feeRecipientRight, makerLeft, makerRight, matcher]), stakingProxy: deployment.staking.stakingProxy.address, }, { @@ -148,7 +138,7 @@ blockchainTests.resets('matchOrders integration tests', env => { tokenIds, ); - matchOrderTester = new MatchOrderTester(assetDataEncoder, deployment, devUtils, blockchainBalanceStore); + matchOrderTester = new MatchOrderTester(deployment, blockchainBalanceStore); }); /** @@ -172,13 +162,13 @@ blockchainTests.resets('matchOrders integration tests', env => { }, { ...expectedTransferAmounts, - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, leftProtocolFeePaidByTakerInWethAmount: constants.ZERO_AMOUNT, rightProtocolFeePaidByTakerInWethAmount: constants.ZERO_AMOUNT, }, matcherAddress || matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), withMaximalFill, ); @@ -194,8 +184,8 @@ blockchainTests.resets('matchOrders integration tests', env => { ...expectedTransferAmounts, leftProtocolFeePaidByTakerInEthAmount: constants.ZERO_AMOUNT, rightProtocolFeePaidByTakerInEthAmount: constants.ZERO_AMOUNT, - leftProtocolFeePaidByTakerInWethAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInWethAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInWethAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInWethAmount: DeploymentManager.protocolFee, }, matcherAddress || matcher.address, constants.ZERO_AMOUNT, @@ -207,17 +197,17 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should transfer correct amounts when right order is fully filled and values pass isRoundingErrorFloor but fail isRoundingErrorCeil', async () => { // Create orders to match const signedOrderLeft = await makerLeft.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(17, 0), - takerAssetAmount: toBaseUnitAmount(98, 0), + makerAssetAmount: new BigNumber(17), + takerAssetAmount: new BigNumber(98), }); const signedOrderRight = await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(75, 0), - takerAssetAmount: toBaseUnitAmount(13, 0), + makerAssetAmount: new BigNumber(75), + takerAssetAmount: new BigNumber(13), }); // Assert is rounding error ceil & not rounding error floor // These assertions are taken from MixinMatchOrders::calculateMatchedFillResults - // The rounding error is derived computating how much the left maker will sell. + // The rounding error is derived by computing how much the left maker will sell. const numerator = signedOrderLeft.makerAssetAmount; const denominator = signedOrderLeft.takerAssetAmount; const target = signedOrderRight.makerAssetAmount; @@ -234,16 +224,16 @@ blockchainTests.resets('matchOrders integration tests', env => { // Fees can be thought of as a tax paid by the seller, derived from the sale price. const expectedTransferAmounts = { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(13, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(new BigNumber('76.4705882352941176'), 16), // 76.47% + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(13), + leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount('76.4705882352941176', 16), // 76.47% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(75, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(75), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('76.5306122448979591'), 16), // 76.53% + leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('76.5306122448979591', 16), // 76.53% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; await matchOrderTester.matchOrdersAndAssertEffectsAsync( @@ -253,7 +243,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), false, ); }); @@ -261,12 +251,12 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should transfer correct amounts when left order is fully filled and values pass isRoundingErrorCeil but fail isRoundingErrorFloor', async () => { // Create orders to match const signedOrderLeft = await makerLeft.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(15, 0), - takerAssetAmount: toBaseUnitAmount(90, 0), + makerAssetAmount: new BigNumber(15), + takerAssetAmount: new BigNumber(90), }); const signedOrderRight = await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(97, 0), - takerAssetAmount: toBaseUnitAmount(14, 0), + makerAssetAmount: new BigNumber(97), + takerAssetAmount: new BigNumber(14), }); // Assert is rounding error floor & not rounding error ceil @@ -287,18 +277,18 @@ blockchainTests.resets('matchOrders integration tests', env => { // Fees can be thought of as a tax paid by the seller, derived from the sale price. const expectedTransferAmounts = { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(15, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(15), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(13, 0), - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(90, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(new BigNumber('92.7835051546391752'), 16), // 92.78% + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(13), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(90), + rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount('92.7835051546391752', 16), // 92.78% // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetReceivedByTakerAmount: new BigNumber(2), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('92.8571428571428571'), 16), // 92.85% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('92.8571428571428571', 16), // 92.85% + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; await matchOrderTester.matchOrdersAndAssertEffectsAsync( @@ -308,7 +298,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), false, ); }); @@ -316,28 +306,25 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should give right maker a better buy price when rounding', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(16, 0), - takerAssetAmount: toBaseUnitAmount(22, 0), + makerAssetAmount: new BigNumber(16), + takerAssetAmount: new BigNumber(22), }, { - makerAssetAmount: toBaseUnitAmount(83, 0), - takerAssetAmount: toBaseUnitAmount(49, 0), + makerAssetAmount: new BigNumber(83), + takerAssetAmount: new BigNumber(49), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(16, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(16), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(22, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(13, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount( - new BigNumber('26.5060240963855421'), - 16, - ), // 26.506% + rightMakerAssetSoldByRightMakerAmount: new BigNumber(22), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(13), + rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount('26.5060240963855421', 16), // 26.506% // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(3, 0), + leftMakerAssetReceivedByTakerAmount: new BigNumber(3), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('26.5306122448979591'), 16), // 26.531% + rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('26.5306122448979591', 16), // 26.531% }, false, ); @@ -346,24 +333,24 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should give left maker a better sell price when rounding', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(12, 0), - takerAssetAmount: toBaseUnitAmount(97, 0), + makerAssetAmount: new BigNumber(12), + takerAssetAmount: new BigNumber(97), }, { - makerAssetAmount: toBaseUnitAmount(89, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(89), + takerAssetAmount: new BigNumber(1), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(11, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(new BigNumber('91.6666666666666666'), 16), // 91.6% + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(11), + leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount('91.6666666666666666', 16), // 91.6% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(89, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(89), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(10, 0), - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('91.7525773195876288'), 16), // 91.75% + leftMakerAssetReceivedByTakerAmount: new BigNumber(10), + leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('91.7525773195876288', 16), // 91.75% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% }, false, @@ -373,27 +360,27 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should give right maker and right taker a favorable fee price when rounding', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(16, 0), - takerAssetAmount: toBaseUnitAmount(22, 0), + makerAssetAmount: new BigNumber(16), + takerAssetAmount: new BigNumber(22), }, { - makerAssetAmount: toBaseUnitAmount(83, 0), - takerAssetAmount: toBaseUnitAmount(49, 0), - makerFee: toBaseUnitAmount(10000, 0), - takerFee: toBaseUnitAmount(10000, 0), + makerAssetAmount: new BigNumber(83), + takerAssetAmount: new BigNumber(49), + makerFee: new BigNumber(10000), + takerFee: new BigNumber(10000), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(16, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(16), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(22, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(13, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(2650, 0), // 2650.6 rounded down tro 2650 + rightMakerAssetSoldByRightMakerAmount: new BigNumber(22), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(13), + rightMakerFeeAssetPaidByRightMakerAmount: new BigNumber(2650), // 2650.6 rounded down to 2650 // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(3, 0), + leftMakerAssetReceivedByTakerAmount: new BigNumber(3), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(2653, 0), // 2653.1 rounded down to 2653 + rightTakerFeeAssetPaidByTakerAmount: new BigNumber(2653), // 2653.1 rounded down to 2653 }, false, ); @@ -402,26 +389,26 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should give left maker and left taker a favorable fee price when rounding', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(12, 0), - takerAssetAmount: toBaseUnitAmount(97, 0), - makerFee: toBaseUnitAmount(10000, 0), - takerFee: toBaseUnitAmount(10000, 0), + makerAssetAmount: new BigNumber(12), + takerAssetAmount: new BigNumber(97), + makerFee: new BigNumber(10000), + takerFee: new BigNumber(10000), }, { - makerAssetAmount: toBaseUnitAmount(89, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(89), + takerAssetAmount: new BigNumber(1), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(11, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(9166, 0), // 9166.6 rounded down to 9166 + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(11), + leftMakerFeeAssetPaidByLeftMakerAmount: new BigNumber(9166), // 9166.6 rounded down to 9166 // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(89, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(89), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(10, 0), - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(9175, 0), // 9175.2 rounded down to 9175 + leftMakerAssetReceivedByTakerAmount: new BigNumber(10), + leftTakerFeeAssetPaidByTakerAmount: new BigNumber(9175), // 9175.2 rounded down to 9175 rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% }, false, @@ -432,16 +419,16 @@ blockchainTests.resets('matchOrders integration tests', env => { from amount derived by \`Exchange.fillOrder\``, async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(1000, 0), - takerAssetAmount: toBaseUnitAmount(1005, 0), + makerAssetAmount: new BigNumber(1000), + takerAssetAmount: new BigNumber(1005), }, { - makerAssetAmount: toBaseUnitAmount(2126, 0), - takerAssetAmount: toBaseUnitAmount(1063, 0), + makerAssetAmount: new BigNumber(2126), + takerAssetAmount: new BigNumber(1063), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(1000, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(1000), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker // Notes: @@ -458,16 +445,13 @@ blockchainTests.resets('matchOrders integration tests', env => { // iv. // The right maker fee differs from the right taker fee because their exchange rate differs. // The right maker always receives the better exchange and fee price. - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1005, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(503, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount( - new BigNumber('47.2718720602069614'), - 16, - ), // 47.27% + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1005), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(503), + rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount('47.2718720602069614', 16), // 47.27% // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(497, 0), + leftMakerAssetReceivedByTakerAmount: new BigNumber(497), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('47.3189087488240827'), 16), // 47.31% + rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('47.3189087488240827', 16), // 47.31% }, false, ); @@ -605,8 +589,8 @@ blockchainTests.resets('matchOrders integration tests', env => { leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(3, 18), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(10, 16), // 10% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; // prettier-ignore const matchResults = await matchOrderTester.matchOrdersAndAssertEffectsAsync( @@ -616,7 +600,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), false, ); // Construct second right order @@ -638,8 +622,8 @@ blockchainTests.resets('matchOrders integration tests', env => { // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(90, 16), // 90% (10% paid earlier) rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(90, 16), // 90% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; await matchOrderTester.matchOrdersAndAssertEffectsAsync( @@ -650,7 +634,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts2, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), false, ); }); @@ -679,8 +663,8 @@ blockchainTests.resets('matchOrders integration tests', env => { leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(6, 18), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(4, 16), // 4% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; const matchResults = await matchOrderTester.matchOrdersAndAssertEffectsAsync( { @@ -689,7 +673,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), false, ); @@ -713,8 +697,8 @@ blockchainTests.resets('matchOrders integration tests', env => { // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(96, 16), // 96% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(96, 16), // 96% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; await matchOrderTester.matchOrdersAndAssertEffectsAsync( { @@ -724,7 +708,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts2, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), false, ); }); @@ -1005,9 +989,7 @@ blockchainTests.resets('matchOrders integration tests', env => { const orderHashHexLeft = orderHashUtils.getOrderHashHex(signedOrderLeft); // Cancel left order - await deployment.exchange.cancelOrder.awaitTransactionSuccessAsync(signedOrderLeft, { - from: makerLeft.address, - }); + await makerLeft.cancelOrderAsync(signedOrderLeft); // Match orders const expectedError = new ExchangeRevertErrors.OrderStatusError(orderHashHexLeft, OrderStatus.Cancelled); @@ -1034,9 +1016,7 @@ blockchainTests.resets('matchOrders integration tests', env => { const orderHashHexRight = orderHashUtils.getOrderHashHex(signedOrderRight); // Cancel right order - await deployment.exchange.cancelOrder.awaitTransactionSuccessAsync(signedOrderRight, { - from: makerRight.address, - }); + await makerRight.cancelOrderAsync(signedOrderRight); // Match orders const expectedError = new ExchangeRevertErrors.OrderStatusError(orderHashHexRight, OrderStatus.Cancelled); @@ -1082,7 +1062,9 @@ blockchainTests.resets('matchOrders integration tests', env => { takerAssetAmount: toBaseUnitAmount(10, 18), }); const signedOrderRight = await makerRight.signOrderAsync({ - takerAssetData: assetDataEncoder.ERC20Token.getABIEncodedTransactionData(makerAssetAddressRight), + takerAssetData: deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData( + makerAssetAddressRight, + ), makerAssetAmount: toBaseUnitAmount(10, 18), takerAssetAmount: toBaseUnitAmount(2, 18), }); @@ -1117,7 +1099,9 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should revert if the right maker asset is not equal to the left taker asset', async () => { // Create orders to match const signedOrderLeft = await makerLeft.signOrderAsync({ - takerAssetData: assetDataEncoder.ERC20Token.getABIEncodedTransactionData(makerAssetAddressLeft), + takerAssetData: deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData( + makerAssetAddressLeft, + ), makerAssetAmount: toBaseUnitAmount(5, 18), takerAssetAmount: toBaseUnitAmount(10, 18), }); @@ -1152,12 +1136,12 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should transfer correct amounts when right order is fully filled and values pass isRoundingErrorCeil but fail isRoundingErrorFloor', async () => { // Create orders to match const signedOrderLeft = await makerLeft.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(17, 0), - takerAssetAmount: toBaseUnitAmount(98, 0), + makerAssetAmount: new BigNumber(17), + takerAssetAmount: new BigNumber(98), }); const signedOrderRight = await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(75, 0), - takerAssetAmount: toBaseUnitAmount(13, 0), + makerAssetAmount: new BigNumber(75), + takerAssetAmount: new BigNumber(13), }); // Assert is rounding error ceil & not rounding error floor // These assertions are taken from MixinMatchOrders::calculateMatchedFillResults @@ -1177,16 +1161,16 @@ blockchainTests.resets('matchOrders integration tests', env => { // Fees can be thought of as a tax paid by the seller, derived from the sale price. const expectedTransferAmounts = { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(13, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(new BigNumber('76.4705882352941176'), 16), // 76.47% + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(13), + leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount('76.4705882352941176', 16), // 76.47% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(75, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(75), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('76.5306122448979591'), 16), // 76.53% + leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('76.5306122448979591', 16), // 76.53% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; await matchOrderTester.matchOrdersAndAssertEffectsAsync( { @@ -1195,7 +1179,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), true, ); }); @@ -1203,12 +1187,12 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should transfer correct amounts when left order is fully filled and values pass isRoundingErrorCeil and isRoundingErrorFloor', async () => { // Create orders to match const signedOrderLeft = await makerLeft.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(15, 0), - takerAssetAmount: toBaseUnitAmount(90, 0), + makerAssetAmount: new BigNumber(15), + takerAssetAmount: new BigNumber(90), }); const signedOrderRight = await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(196, 0), - takerAssetAmount: toBaseUnitAmount(28, 0), + makerAssetAmount: new BigNumber(196), + takerAssetAmount: new BigNumber(28), }); // Assert is rounding error floor @@ -1230,19 +1214,19 @@ blockchainTests.resets('matchOrders integration tests', env => { // Fees can be thought of as a tax paid by the seller, derived from the sale price. const expectedTransferAmounts = { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(15, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(15), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% - rightMakerAssetBoughtByLeftMakerAmount: toBaseUnitAmount(90, 0), + rightMakerAssetBoughtByLeftMakerAmount: new BigNumber(90), // Right Maker - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(15, 0), - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(105, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(new BigNumber('53.5714285714285714'), 16), // 53.57% + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(15), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(105), + rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount('53.5714285714285714', 16), // 53.57% // Taker - rightMakerAssetReceivedByTakerAmount: toBaseUnitAmount(15, 0), + rightMakerAssetReceivedByTakerAmount: new BigNumber(15), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('53.5714285714285714'), 16), // 53.57% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('53.5714285714285714', 16), // 53.57% + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; await matchOrderTester.matchOrdersAndAssertEffectsAsync( { @@ -1251,7 +1235,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), true, ); }); @@ -1259,29 +1243,26 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should transfer correct amounts when left order is fully filled', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(16, 0), - takerAssetAmount: toBaseUnitAmount(22, 0), + makerAssetAmount: new BigNumber(16), + takerAssetAmount: new BigNumber(22), }, { - makerAssetAmount: toBaseUnitAmount(87, 0), - takerAssetAmount: toBaseUnitAmount(48, 0), + makerAssetAmount: new BigNumber(87), + takerAssetAmount: new BigNumber(48), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(16, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(16), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% - rightMakerAssetBoughtByLeftMakerAmount: toBaseUnitAmount(22, 0), + rightMakerAssetBoughtByLeftMakerAmount: new BigNumber(22), // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(29, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(16, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount( - new BigNumber('33.3333333333333333'), - 16, - ), // 33.33% + rightMakerAssetSoldByRightMakerAmount: new BigNumber(29), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(16), + rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount('33.3333333333333333', 16), // 33.33% // Taker - rightMakerAssetReceivedByTakerAmount: toBaseUnitAmount(7, 0), + rightMakerAssetReceivedByTakerAmount: new BigNumber(7), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('33.3333333333333333'), 16), // 33.33% + rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('33.3333333333333333', 16), // 33.33% }, true, ); @@ -1290,25 +1271,25 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should fully fill both orders and pay out profit in both maker assets', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(7, 0), - takerAssetAmount: toBaseUnitAmount(4, 0), + makerAssetAmount: new BigNumber(7), + takerAssetAmount: new BigNumber(4), }, { - makerAssetAmount: toBaseUnitAmount(8, 0), - takerAssetAmount: toBaseUnitAmount(6, 0), + makerAssetAmount: new BigNumber(8), + takerAssetAmount: new BigNumber(6), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(7, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(7), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% - rightMakerAssetBoughtByLeftMakerAmount: toBaseUnitAmount(4, 0), // 100% + rightMakerAssetBoughtByLeftMakerAmount: new BigNumber(4), // 100% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(8, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(8), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(6, 0), // 100% + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(6), // 100% // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(1, 0), - rightMakerAssetReceivedByTakerAmount: toBaseUnitAmount(4, 0), + leftMakerAssetReceivedByTakerAmount: new BigNumber(1), + rightMakerAssetReceivedByTakerAmount: new BigNumber(4), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% }, @@ -1319,24 +1300,24 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should give left maker a better sell price when rounding', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(12, 0), - takerAssetAmount: toBaseUnitAmount(97, 0), + makerAssetAmount: new BigNumber(12), + takerAssetAmount: new BigNumber(97), }, { - makerAssetAmount: toBaseUnitAmount(89, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(89), + takerAssetAmount: new BigNumber(1), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(11, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(new BigNumber('91.6666666666666666'), 16), // 91.6% + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(11), + leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount('91.6666666666666666', 16), // 91.6% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(89, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(89), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(10, 0), - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('91.7525773195876288'), 16), // 91.75% + leftMakerAssetReceivedByTakerAmount: new BigNumber(10), + leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('91.7525773195876288', 16), // 91.75% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% }, true, @@ -1346,28 +1327,28 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should give right maker and right taker a favorable fee price when rounding', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(16, 0), - takerAssetAmount: toBaseUnitAmount(22, 0), + makerAssetAmount: new BigNumber(16), + takerAssetAmount: new BigNumber(22), }, { - makerAssetAmount: toBaseUnitAmount(87, 0), - takerAssetAmount: toBaseUnitAmount(48, 0), - makerFee: toBaseUnitAmount(10000, 0), - takerFee: toBaseUnitAmount(10000, 0), + makerAssetAmount: new BigNumber(87), + takerAssetAmount: new BigNumber(48), + makerFee: new BigNumber(10000), + takerFee: new BigNumber(10000), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(16, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(16), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% - rightMakerAssetBoughtByLeftMakerAmount: toBaseUnitAmount(22, 0), + rightMakerAssetBoughtByLeftMakerAmount: new BigNumber(22), // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(29, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(16, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(3333, 0), // 3333.3 repeating rounded down to 3333 + rightMakerAssetSoldByRightMakerAmount: new BigNumber(29), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(16), + rightMakerFeeAssetPaidByRightMakerAmount: new BigNumber(3333), // 3333.3 repeating rounded down to 3333 // Taker - rightMakerAssetReceivedByTakerAmount: toBaseUnitAmount(7, 0), + rightMakerAssetReceivedByTakerAmount: new BigNumber(7), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(3333, 0), // 3333.3 repeating rounded down to 3333 + rightTakerFeeAssetPaidByTakerAmount: new BigNumber(3333), // 3333.3 repeating rounded down to 3333 }, true, ); @@ -1376,26 +1357,26 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should give left maker and left taker a favorable fee price when rounding', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(12, 0), - takerAssetAmount: toBaseUnitAmount(97, 0), - makerFee: toBaseUnitAmount(10000, 0), - takerFee: toBaseUnitAmount(10000, 0), + makerAssetAmount: new BigNumber(12), + takerAssetAmount: new BigNumber(97), + makerFee: new BigNumber(10000), + takerFee: new BigNumber(10000), }, { - makerAssetAmount: toBaseUnitAmount(89, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(89), + takerAssetAmount: new BigNumber(1), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(11, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(9166, 0), // 9166.6 rounded down to 9166 + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(11), + leftMakerFeeAssetPaidByLeftMakerAmount: new BigNumber(9166), // 9166.6 rounded down to 9166 // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(89, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(89), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(10, 0), - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(9175, 0), // 9175.2 rounded down to 9175 + leftMakerAssetReceivedByTakerAmount: new BigNumber(10), + leftTakerFeeAssetPaidByTakerAmount: new BigNumber(9175), // 9175.2 rounded down to 9175 rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% }, true, @@ -1405,24 +1386,24 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should give left maker a better sell price when rounding', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(12, 0), - takerAssetAmount: toBaseUnitAmount(97, 0), + makerAssetAmount: new BigNumber(12), + takerAssetAmount: new BigNumber(97), }, { - makerAssetAmount: toBaseUnitAmount(89, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(89), + takerAssetAmount: new BigNumber(1), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(11, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(new BigNumber('91.6666666666666666'), 16), // 91.6% + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(11), + leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount('91.6666666666666666', 16), // 91.6% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(89, 0), - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(89), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker - leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(10, 0), - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('91.7525773195876288'), 16), // 91.75% + leftMakerAssetReceivedByTakerAmount: new BigNumber(10), + leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('91.7525773195876288', 16), // 91.75% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% }, true, @@ -1453,8 +1434,8 @@ blockchainTests.resets('matchOrders integration tests', env => { leftMakerAssetReceivedByTakerAmount: toBaseUnitAmount(3, 18), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(10, 16), // 10% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; // prettier-ignore const matchResults = await matchOrderTester.matchOrdersAndAssertEffectsAsync( @@ -1464,7 +1445,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), true, ); @@ -1488,8 +1469,8 @@ blockchainTests.resets('matchOrders integration tests', env => { // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(90, 16), // 90% (10% paid earlier) rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(90, 16), // 90% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; await matchOrderTester.matchOrdersAndAssertEffectsAsync( { @@ -1499,7 +1480,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts2, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), true, ); }); @@ -1507,17 +1488,17 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should transfer correct amounts when right order fill amount deviates from amount derived by `Exchange.fillOrder`', async () => { await testMatchOrdersAsync( { - makerAssetAmount: toBaseUnitAmount(1000, 0), - takerAssetAmount: toBaseUnitAmount(1005, 0), + makerAssetAmount: new BigNumber(1000), + takerAssetAmount: new BigNumber(1005), }, { - makerAssetAmount: toBaseUnitAmount(2126, 0), - takerAssetAmount: toBaseUnitAmount(1063, 0), + makerAssetAmount: new BigNumber(2126), + takerAssetAmount: new BigNumber(1063), }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(1000, 0), - rightMakerAssetBoughtByLeftMakerAmount: toBaseUnitAmount(1005, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(1000), + rightMakerAssetBoughtByLeftMakerAmount: new BigNumber(1005), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker // Notes: @@ -1534,15 +1515,12 @@ blockchainTests.resets('matchOrders integration tests', env => { // iv. // The right maker fee differs from the right taker fee because their exchange rate differs. // The right maker always receives the better exchange and fee price. - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(2000, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount( - new BigNumber('94.0733772342427093'), - 16, - ), // 94.07% + rightMakerAssetSoldByRightMakerAmount: new BigNumber(2000), + rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount('94.0733772342427093', 16), // 94.07% // Taker - rightMakerAssetReceivedByTakerAmount: toBaseUnitAmount(995, 0), + rightMakerAssetReceivedByTakerAmount: new BigNumber(995), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('94.0733772342427093'), 16), // 94.07% + rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('94.0733772342427093', 16), // 94.07% }, true, ); @@ -1599,8 +1577,8 @@ blockchainTests.resets('matchOrders integration tests', env => { rightMakerAssetReceivedByTakerAmount: toBaseUnitAmount(3, 18), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(10, 16), // 10% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; const matchResults = await matchOrderTester.matchOrdersAndAssertEffectsAsync( { @@ -1609,7 +1587,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), true, ); @@ -1633,8 +1611,8 @@ blockchainTests.resets('matchOrders integration tests', env => { // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(90, 16), // 96% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(90, 16), // 90% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; await matchOrderTester.matchOrdersAndAssertEffectsAsync( @@ -1645,7 +1623,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts2, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), true, ); }); @@ -1922,9 +1900,8 @@ blockchainTests.resets('matchOrders integration tests', env => { }); const orderHashHexLeft = orderHashUtils.getOrderHashHex(signedOrderLeft); // Cancel left order - await deployment.exchange.cancelOrder.awaitTransactionSuccessAsync(signedOrderLeft, { - from: makerLeft.address, - }); + await makerLeft.cancelOrderAsync(signedOrderLeft); + // Match orders const expectedError = new ExchangeRevertErrors.OrderStatusError(orderHashHexLeft, OrderStatus.Cancelled); const tx = deployment.exchange.matchOrdersWithMaximalFill.awaitTransactionSuccessAsync( @@ -1949,9 +1926,8 @@ blockchainTests.resets('matchOrders integration tests', env => { }); const orderHashHexRight = orderHashUtils.getOrderHashHex(signedOrderRight); // Cancel right order - await deployment.exchange.cancelOrder.awaitTransactionSuccessAsync(signedOrderRight, { - from: makerRight.address, - }); + await makerRight.cancelOrderAsync(signedOrderRight); + // Match orders const expectedError = new ExchangeRevertErrors.OrderStatusError(orderHashHexRight, OrderStatus.Cancelled); const tx = deployment.exchange.matchOrdersWithMaximalFill.awaitTransactionSuccessAsync( @@ -1995,7 +1971,9 @@ blockchainTests.resets('matchOrders integration tests', env => { takerAssetAmount: toBaseUnitAmount(10, 18), }); const signedOrderRight = await makerRight.signOrderAsync({ - takerAssetData: assetDataEncoder.ERC20Token.getABIEncodedTransactionData(makerAssetAddressRight), + takerAssetData: deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData( + makerAssetAddressRight, + ), makerAssetAmount: toBaseUnitAmount(10, 18), takerAssetAmount: toBaseUnitAmount(2, 18), }); @@ -2028,7 +2006,9 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should revert if the right maker asset is not equal to the left taker asset', async () => { // Create orders to match const signedOrderLeft = await makerLeft.signOrderAsync({ - takerAssetData: assetDataEncoder.ERC20Token.getABIEncodedTransactionData(makerAssetAddressLeft), + takerAssetData: deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData( + makerAssetAddressLeft, + ), makerAssetAmount: toBaseUnitAmount(5, 18), takerAssetAmount: toBaseUnitAmount(10, 18), }); @@ -2064,8 +2044,8 @@ blockchainTests.resets('matchOrders integration tests', env => { const leftOrders: SignedOrder[] = []; const rightOrders = [ await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }), ]; const expectedError = new ExchangeRevertErrors.BatchMatchOrdersError( @@ -2092,8 +2072,8 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should fail if there are zero rightOrders', async () => { const leftOrders = [ await makerLeft.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }), ]; const rightOrders: SignedOrder[] = []; @@ -2121,22 +2101,22 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should fail if there are a different number of left orders and signatures', async () => { const leftOrders = [ await makerLeft.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }), await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }), ]; const rightOrders = [ await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }), await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }), ]; const expectedError = new ExchangeRevertErrors.BatchMatchOrdersError( @@ -2163,22 +2143,22 @@ blockchainTests.resets('matchOrders integration tests', env => { it('should fail if there are a different number of right orders and signatures', async () => { const leftOrders = [ await makerLeft.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }), await makerLeft.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }), ]; const rightOrders = [ await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }), await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }), ]; const expectedError = new ExchangeRevertErrors.BatchMatchOrdersError( @@ -2231,13 +2211,13 @@ blockchainTests.resets('matchOrders integration tests', env => { rightOrdersTakerAssetFilledAmounts: args.rightOrdersTakerAssetFilledAmounts, }, args.matcherAddress || matcher.address, - PROTOCOL_FEE.times(args.matchIndices.length).times(2), + DeploymentManager.protocolFee.times(args.matchIndices.length).times(2), args.matchIndices, args.expectedTransferAmounts.map(transferAmounts => { return { ...transferAmounts, - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, leftProtocolFeePaidByTakerInWethAmount: constants.ZERO_AMOUNT, rightProtocolFeePaidByTakerInWethAmount: constants.ZERO_AMOUNT, }; @@ -2263,8 +2243,8 @@ blockchainTests.resets('matchOrders integration tests', env => { ...transferAmounts, leftProtocolFeePaidByTakerInEthAmount: constants.ZERO_AMOUNT, rightProtocolFeePaidByTakerInEthAmount: constants.ZERO_AMOUNT, - leftProtocolFeePaidByTakerInWethAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInWethAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInWethAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInWethAmount: DeploymentManager.protocolFee, }; }), args.shouldMaximallyFill, @@ -2276,23 +2256,23 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% @@ -2310,23 +2290,23 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(4, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(4), + takerAssetAmount: new BigNumber(2), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(50, 16), // 50% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(50, 16), // 50% @@ -2344,28 +2324,28 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }, { - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(4, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(4), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(2, 0), - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(2), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(50, 16), // 50% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 50% @@ -2373,11 +2353,11 @@ blockchainTests.resets('matchOrders integration tests', env => { }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 50% // Right Maker - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(2, 0), - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(2), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(50, 16), // 50% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 50% @@ -2395,27 +2375,27 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(4, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(4), + takerAssetAmount: new BigNumber(2), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }, { - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(50, 16), // 50% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(50, 16), // 50% @@ -2423,10 +2403,10 @@ blockchainTests.resets('matchOrders integration tests', env => { }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(50, 16), // 50% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(50, 16), // 50% @@ -2444,27 +2424,27 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }, { - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% @@ -2482,31 +2462,31 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(4, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(4), + takerAssetAmount: new BigNumber(2), }, { - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }, { - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(4, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(4), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(50, 16), // 50% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(50, 16), // 50% @@ -2514,10 +2494,10 @@ blockchainTests.resets('matchOrders integration tests', env => { }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(50, 16), // 50% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(50, 16), // 50% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(50, 16), // 50% @@ -2525,10 +2505,10 @@ blockchainTests.resets('matchOrders integration tests', env => { }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(50, 16), // 50% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% @@ -2548,29 +2528,26 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(17, 0), - takerAssetAmount: toBaseUnitAmount(98, 0), + makerAssetAmount: new BigNumber(17), + takerAssetAmount: new BigNumber(98), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(75, 0), - takerAssetAmount: toBaseUnitAmount(13, 0), + makerAssetAmount: new BigNumber(75), + takerAssetAmount: new BigNumber(13), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(13, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount( - new BigNumber('76.4705882352941176'), - 16, - ), // 76.47% + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(13), + leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount('76.4705882352941176', 16), // 76.47% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(75, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(75), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('76.5306122448979591'), 16), // 76.53% + leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('76.5306122448979591', 16), // 76.53% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% }, ], @@ -2585,33 +2562,30 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(15, 0), - takerAssetAmount: toBaseUnitAmount(90, 0), + makerAssetAmount: new BigNumber(15), + takerAssetAmount: new BigNumber(90), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(196, 0), - takerAssetAmount: toBaseUnitAmount(28, 0), + makerAssetAmount: new BigNumber(196), + takerAssetAmount: new BigNumber(28), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(15, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(15), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% - rightMakerAssetBoughtByLeftMakerAmount: toBaseUnitAmount(90, 0), + rightMakerAssetBoughtByLeftMakerAmount: new BigNumber(90), // Right Maker - leftMakerAssetBoughtByRightMakerAmount: toBaseUnitAmount(15, 0), - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(105, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount( - new BigNumber('53.5714285714285714'), - 16, - ), // 53.57% + leftMakerAssetBoughtByRightMakerAmount: new BigNumber(15), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(105), + rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount('53.5714285714285714', 16), // 53.57% // Taker - rightMakerAssetReceivedByTakerAmount: toBaseUnitAmount(15, 0), + rightMakerAssetReceivedByTakerAmount: new BigNumber(15), leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('53.5714285714285714'), 16), // 53.57% + rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('53.5714285714285714', 16), // 53.57% }, ], leftOrdersTakerAssetFilledAmounts: [constants.ZERO_AMOUNT], @@ -2625,27 +2599,27 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }, { - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(2, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(2), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% @@ -2663,68 +2637,56 @@ blockchainTests.resets('matchOrders integration tests', env => { await testBatchMatchOrdersAsync({ leftOrders: [ { - makerAssetAmount: toBaseUnitAmount(2, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(2), + takerAssetAmount: new BigNumber(1), }, { - makerAssetAmount: toBaseUnitAmount(72, 0), - takerAssetAmount: toBaseUnitAmount(36, 0), + makerAssetAmount: new BigNumber(72), + takerAssetAmount: new BigNumber(36), }, ], rightOrders: [ { - makerAssetAmount: toBaseUnitAmount(15, 0), - takerAssetAmount: toBaseUnitAmount(30, 0), + makerAssetAmount: new BigNumber(15), + takerAssetAmount: new BigNumber(30), }, { - makerAssetAmount: toBaseUnitAmount(22, 0), - takerAssetAmount: toBaseUnitAmount(44, 0), + makerAssetAmount: new BigNumber(22), + takerAssetAmount: new BigNumber(44), }, ], expectedTransferAmounts: [ { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(2, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(2), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount( - new BigNumber('6.6666666666666666'), - 16, - ), // 6.66% + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), + rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount('6.6666666666666666', 16), // 6.66% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('6.6666666666666666'), 16), // 6.66% + rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('6.6666666666666666', 16), // 6.66% }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(28, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount( - new BigNumber('38.8888888888888888'), - 16, - ), // 38.88% + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(28), + leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount('38.8888888888888888', 16), // 38.88% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(14, 0), - rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount( - new BigNumber('93.3333333333333333'), - 16, - ), // 93.33% + rightMakerAssetSoldByRightMakerAmount: new BigNumber(14), + rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount('93.3333333333333333', 16), // 93.33% // Taker - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('38.8888888888888888'), 16), // 38.88% - rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('93.3333333333333333'), 16), // 93.33% + leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('38.8888888888888888', 16), // 38.88% + rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('93.3333333333333333', 16), // 93.33% }, { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(44, 0), - leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount( - new BigNumber('61.1111111111111111'), - 16, - ), // 61.11% + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(44), + leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount('61.1111111111111111', 16), // 61.11% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(22, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(22), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker - leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(new BigNumber('61.1111111111111111'), 16), // 61.11% + leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount('61.1111111111111111', 16), // 61.11% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% }, ], @@ -2738,42 +2700,42 @@ blockchainTests.resets('matchOrders integration tests', env => { describe('token sanity checks', () => { it('should be able to match ERC721 tokens with ERC1155 tokens', async () => { - const leftMakerAssetData = assetDataEncoder.ERC1155Assets.getABIEncodedTransactionData( + const leftMakerAssetData = deployment.assetDataEncoder.ERC1155Assets.getABIEncodedTransactionData( deployment.tokens.erc1155[0].address, [leftId], [new BigNumber(1)], '0x', ); - const rightMakerAssetData = assetDataEncoder.ERC721Token.getABIEncodedTransactionData( + const rightMakerAssetData = deployment.assetDataEncoder.ERC721Token.getABIEncodedTransactionData( deployment.tokens.erc721[0].address, rightId, ); const signedOrderLeft = await makerLeft.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(100, 0), - takerAssetAmount: toBaseUnitAmount(1, 0), + makerAssetAmount: new BigNumber(100), + takerAssetAmount: new BigNumber(1), makerAssetData: leftMakerAssetData, takerAssetData: rightMakerAssetData, }); const signedOrderRight = await makerRight.signOrderAsync({ - makerAssetAmount: toBaseUnitAmount(1, 0), - takerAssetAmount: toBaseUnitAmount(100, 0), + makerAssetAmount: new BigNumber(1), + takerAssetAmount: new BigNumber(100), makerAssetData: rightMakerAssetData, takerAssetData: leftMakerAssetData, }); const expectedTransferAmounts = { // Left Maker - leftMakerAssetSoldByLeftMakerAmount: toBaseUnitAmount(100, 0), + leftMakerAssetSoldByLeftMakerAmount: new BigNumber(100), leftMakerFeeAssetPaidByLeftMakerAmount: toBaseUnitAmount(100, 16), // 100% // Right Maker - rightMakerAssetSoldByRightMakerAmount: toBaseUnitAmount(1, 0), + rightMakerAssetSoldByRightMakerAmount: new BigNumber(1), rightMakerFeeAssetPaidByRightMakerAmount: toBaseUnitAmount(100, 16), // 100% // Taker leftTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% rightTakerFeeAssetPaidByTakerAmount: toBaseUnitAmount(100, 16), // 100% - leftProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, - rightProtocolFeePaidByTakerInEthAmount: PROTOCOL_FEE, + leftProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, + rightProtocolFeePaidByTakerInEthAmount: DeploymentManager.protocolFee, }; await matchOrderTester.matchOrdersAndAssertEffectsAsync( @@ -2783,7 +2745,7 @@ blockchainTests.resets('matchOrders integration tests', env => { }, expectedTransferAmounts, matcher.address, - PROTOCOL_FEE.times(2), + DeploymentManager.protocolFee.times(2), false, ); }); diff --git a/contracts/integrations/test/utils/match_order_tester.ts b/contracts/integrations/test/utils/match_order_tester.ts index c670c034eb..a8e9eb863a 100644 --- a/contracts/integrations/test/utils/match_order_tester.ts +++ b/contracts/integrations/test/utils/match_order_tester.ts @@ -1,5 +1,4 @@ import { IAssetDataContract } from '@0x/contracts-asset-proxy'; -import { DevUtilsContract } from '@0x/contracts-dev-utils'; import { BlockchainBalanceStore, ExchangeContract, LocalBalanceStore } from '@0x/contracts-exchange'; import { constants, expect, OrderStatus } from '@0x/contracts-test-utils'; import { orderHashUtils } from '@0x/order-utils'; @@ -74,18 +73,17 @@ export class MatchOrderTester { * Constructs new MatchOrderTester. */ constructor( - protected readonly _assetDataEncoder: IAssetDataContract, protected readonly _deployment: DeploymentManager, - protected readonly _devUtils: DevUtilsContract, protected readonly _blockchainBalanceStore: BlockchainBalanceStore, ) {} /** * Performs batch order matching on a set of complementary orders and asserts results. * @param orders The list of orders and filled states + * @param takerAddress Address of taker (the address who matched the two orders) + * @param value The amount of value that should be sent in the contract call. * @param matchPairs An array of left and right indices that will be used to perform * the expected simulation. - * @param takerAddress Address of taker (the address who matched the two orders) * @param expectedTransferAmounts Expected amounts transferred as a result of each round of * order matching. Omitted fields are either set to 0 or their * complementary field. @@ -107,12 +105,12 @@ export class MatchOrderTester { expect(orders.rightOrders.length).to.be.eq(orders.rightOrdersTakerAssetFilledAmounts.length); // Ensure that the exchange is in the expected state. - await assertBatchOrderStatesAsync(orders, this._deployment.exchange); + await this._assertBatchOrderStatesAsync(orders); // Update the blockchain balance store and create a new local balance store // with the same initial balances. await this._blockchainBalanceStore.updateBalancesAsync(); - const localBalanceStore = LocalBalanceStore.create(this._devUtils, this._blockchainBalanceStore); + const localBalanceStore = LocalBalanceStore.create(this._deployment.devUtils, this._blockchainBalanceStore); // Execute `batchMatchOrders()` let actualBatchMatchResults; @@ -124,7 +122,7 @@ export class MatchOrderTester { orders.rightOrders, orders.leftOrders.map(order => order.signature), orders.rightOrders.map(order => order.signature), - { from: takerAddress, gasPrice: constants.DEFAULT_GAS_PRICE, value }, + { from: takerAddress, gasPrice: DeploymentManager.gasPrice, value }, ); } else { [actualBatchMatchResults, transactionReceipt] = await this._deployment.txHelper.getResultAndReceiptAsync( @@ -133,46 +131,38 @@ export class MatchOrderTester { orders.rightOrders, orders.leftOrders.map(order => order.signature), orders.rightOrders.map(order => order.signature), - { from: takerAddress, gasPrice: constants.DEFAULT_GAS_PRICE, value }, + { from: takerAddress, gasPrice: DeploymentManager.gasPrice, value }, ); } // Burn the gas used to execute the transaction in the local balance store. - localBalanceStore.burnGas(takerAddress, constants.DEFAULT_GAS_PRICE * transactionReceipt.gasUsed); + localBalanceStore.burnGas(takerAddress, DeploymentManager.gasPrice.times(transactionReceipt.gasUsed)); // Simulate the batch order match. - const expectedBatchMatchResults = await simulateBatchMatchOrdersAsync( + const expectedBatchMatchResults = await this._simulateBatchMatchOrdersAsync( orders, takerAddress, - this._deployment, - this._blockchainBalanceStore, - localBalanceStore, matchPairs, expectedTransferAmounts, - this._assetDataEncoder, + localBalanceStore, ); const expectedResults = convertToBatchMatchResults(expectedBatchMatchResults); expect(actualBatchMatchResults).to.be.eql(expectedResults); // Validate the simulation against reality. - await assertBatchMatchResultsAsync( - expectedBatchMatchResults, - transactionReceipt, - this._blockchainBalanceStore, - localBalanceStore, - this._deployment.exchange, - ); + await this._assertBatchMatchResultsAsync(expectedBatchMatchResults, transactionReceipt, localBalanceStore); return expectedBatchMatchResults; } /** * Matches two complementary orders and asserts results. * @param orders The matched orders and filled states. - * @param takerAddress Address of taker (the address who matched the two orders) * @param expectedTransferAmounts Expected amounts transferred as a result of order matching. * Omitted fields are either set to 0 or their complementary * field. + * @param takerAddress Address of taker (the address who matched the two orders) + * @param value The amount of value that should be sent in the contract call. * @param withMaximalFill A boolean that indicates whether the "maximal fill" order matching * strategy should be used. * @return Results of `matchOrders()`. @@ -184,12 +174,12 @@ export class MatchOrderTester { value: BigNumber, withMaximalFill: boolean, ): Promise { - await assertInitialOrderStatesAsync(orders, this._deployment.exchange); + await this._assertInitialOrderStatesAsync(orders); // Update the blockchain balance store and create a new local balance store // with the same initial balances. await this._blockchainBalanceStore.updateBalancesAsync(); - const localBalanceStore = LocalBalanceStore.create(this._devUtils, this._blockchainBalanceStore); + const localBalanceStore = LocalBalanceStore.create(this._deployment.devUtils, this._blockchainBalanceStore); // Execute `matchOrders()` let actualMatchResults; @@ -201,7 +191,7 @@ export class MatchOrderTester { orders.rightOrder, orders.leftOrder.signature, orders.rightOrder.signature, - { from: takerAddress, gasPrice: constants.DEFAULT_GAS_PRICE, value }, + { from: takerAddress, gasPrice: DeploymentManager.gasPrice, value }, ); } else { [actualMatchResults, transactionReceipt] = await this._deployment.txHelper.getResultAndReceiptAsync( @@ -210,34 +200,434 @@ export class MatchOrderTester { orders.rightOrder, orders.leftOrder.signature, orders.rightOrder.signature, - { from: takerAddress, gasPrice: constants.DEFAULT_GAS_PRICE, value }, + { from: takerAddress, gasPrice: DeploymentManager.gasPrice, value }, ); } - localBalanceStore.burnGas(takerAddress, constants.DEFAULT_GAS_PRICE * transactionReceipt.gasUsed); + localBalanceStore.burnGas(takerAddress, DeploymentManager.gasPrice.times(transactionReceipt.gasUsed)); // Simulate the fill. - const expectedMatchResults = await simulateMatchOrdersAsync( + const expectedMatchResults = await this._simulateMatchOrdersAsync( orders, takerAddress, - this._deployment, toFullMatchTransferAmounts(expectedTransferAmounts), - this._assetDataEncoder, - this._blockchainBalanceStore, localBalanceStore, ); const expectedResults = convertToMatchResults(expectedMatchResults); expect(actualMatchResults).to.be.eql(expectedResults); // Validate the simulation against reality. - await assertMatchResultsAsync( - expectedMatchResults, - transactionReceipt, - localBalanceStore, - this._blockchainBalanceStore, - this._deployment.exchange, - ); + await this._assertMatchResultsAsync(expectedMatchResults, transactionReceipt, localBalanceStore); return expectedMatchResults; } + + /** + * Simulates matching two orders by transferring amounts defined in + * `transferAmounts` and returns the results. + * @param orders The orders being matched and their filled states. + * @param takerAddress Address of taker (the address who matched the two orders) + * @param transferAmounts Amounts to transfer during the simulation. + * @param localBalanceStore The balance store to use for the simulation. + * @return The new account balances and fill events that occurred during the match. + */ + protected async _simulateMatchOrdersAsync( + orders: MatchedOrders, + takerAddress: string, + transferAmounts: MatchTransferAmounts, + localBalanceStore: LocalBalanceStore, + ): Promise { + // prettier-ignore + const matchResults = { + orders: { + leftOrder: orders.leftOrder, + leftOrderTakerAssetFilledAmount: + (orders.leftOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT).plus( + transferAmounts.rightMakerAssetBoughtByLeftMakerAmount, + ), + rightOrder: orders.rightOrder, + rightOrderTakerAssetFilledAmount: + (orders.rightOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT).plus( + transferAmounts.leftMakerAssetBoughtByRightMakerAmount, + ), + }, + fills: simulateFillEvents(orders, takerAddress, transferAmounts), + }; + + // Right maker asset -> left maker + await localBalanceStore.transferAssetAsync( + orders.rightOrder.makerAddress, + orders.leftOrder.makerAddress, + transferAmounts.rightMakerAssetBoughtByLeftMakerAmount, + orders.rightOrder.makerAssetData, + ); + + if (orders.leftOrder.makerAddress !== orders.leftOrder.feeRecipientAddress) { + // Left maker fees + await localBalanceStore.transferAssetAsync( + orders.leftOrder.makerAddress, + orders.leftOrder.feeRecipientAddress, + transferAmounts.leftMakerFeeAssetPaidByLeftMakerAmount, + orders.leftOrder.makerFeeAssetData, + ); + } + + // Left maker asset -> right maker + await localBalanceStore.transferAssetAsync( + orders.leftOrder.makerAddress, + orders.rightOrder.makerAddress, + transferAmounts.leftMakerAssetBoughtByRightMakerAmount, + orders.leftOrder.makerAssetData, + ); + + if (orders.rightOrder.makerAddress !== orders.rightOrder.feeRecipientAddress) { + // Right maker fees + await localBalanceStore.transferAssetAsync( + orders.rightOrder.makerAddress, + orders.rightOrder.feeRecipientAddress, + transferAmounts.rightMakerFeeAssetPaidByRightMakerAmount, + orders.rightOrder.makerFeeAssetData, + ); + } + + // Left taker profit + await localBalanceStore.transferAssetAsync( + orders.leftOrder.makerAddress, + takerAddress, + transferAmounts.leftMakerAssetReceivedByTakerAmount, + orders.leftOrder.makerAssetData, + ); + + // Right taker profit + await localBalanceStore.transferAssetAsync( + orders.rightOrder.makerAddress, + takerAddress, + transferAmounts.rightMakerAssetReceivedByTakerAmount, + orders.rightOrder.makerAssetData, + ); + + // Left taker fees + await localBalanceStore.transferAssetAsync( + takerAddress, + orders.leftOrder.feeRecipientAddress, + transferAmounts.leftTakerFeeAssetPaidByTakerAmount, + orders.leftOrder.takerFeeAssetData, + ); + + // Right taker fees + await localBalanceStore.transferAssetAsync( + takerAddress, + orders.rightOrder.feeRecipientAddress, + transferAmounts.rightTakerFeeAssetPaidByTakerAmount, + orders.rightOrder.takerFeeAssetData, + ); + + // Protocol Fee + const wethAssetData = this._deployment.assetDataEncoder.ERC20Token.getABIEncodedTransactionData( + this._deployment.tokens.weth.address, + ); + localBalanceStore.sendEth( + takerAddress, + this._deployment.staking.stakingProxy.address, + transferAmounts.leftProtocolFeePaidByTakerInEthAmount, + ); + localBalanceStore.sendEth( + takerAddress, + this._deployment.staking.stakingProxy.address, + transferAmounts.rightProtocolFeePaidByTakerInEthAmount, + ); + await localBalanceStore.transferAssetAsync( + takerAddress, + this._deployment.staking.stakingProxy.address, + transferAmounts.leftProtocolFeePaidByTakerInWethAmount, + wethAssetData, + ); + await localBalanceStore.transferAssetAsync( + takerAddress, + this._deployment.staking.stakingProxy.address, + transferAmounts.rightProtocolFeePaidByTakerInWethAmount, + wethAssetData, + ); + + return matchResults; + } + + /** + * Simulates matching a batch of orders by transferring amounts defined in + * `transferAmounts` and returns the results. + * @param orders The orders being batch matched and their filled states. + * @param takerAddress Address of taker (the address who matched the two orders) + * @param matchPairs The pairs of orders that are expected to be matched. + * @param transferAmounts Amounts to transfer during the simulation. + * @param localBalanceStore The balance store to use for the simulation. + * @return The new account balances and fill events that occurred during the match. + */ + protected async _simulateBatchMatchOrdersAsync( + orders: BatchMatchedOrders, + takerAddress: string, + matchPairs: Array<[number, number]>, + transferAmounts: Array>, + localBalanceStore: LocalBalanceStore, + ): Promise { + // Initialize variables + let leftIdx = 0; + let rightIdx = 0; + let lastLeftIdx = -1; + let lastRightIdx = -1; + let matchedOrders: MatchedOrders; + const batchMatchResults: BatchMatchResults = { + matches: [], + filledAmounts: [], + leftFilledResults: [], + rightFilledResults: [], + }; + + // Loop over all of the matched pairs from the round + for (let i = 0; i < matchPairs.length; i++) { + leftIdx = matchPairs[i][0]; + rightIdx = matchPairs[i][1]; + + // Construct a matched order out of the current left and right orders + matchedOrders = { + leftOrder: orders.leftOrders[leftIdx], + rightOrder: orders.rightOrders[rightIdx], + leftOrderTakerAssetFilledAmount: orders.leftOrdersTakerAssetFilledAmounts[leftIdx], + rightOrderTakerAssetFilledAmount: orders.rightOrdersTakerAssetFilledAmounts[rightIdx], + }; + + // If there has been a match recorded and one or both of the side indices have not changed, + // replace the side's taker asset filled amount + if (batchMatchResults.matches.length > 0) { + if (lastLeftIdx === leftIdx) { + matchedOrders.leftOrderTakerAssetFilledAmount = getLastMatch( + batchMatchResults, + ).orders.leftOrderTakerAssetFilledAmount; + } else { + batchMatchResults.filledAmounts.push([ + orders.leftOrders[lastLeftIdx], + getLastMatch(batchMatchResults).orders.leftOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT, + 'left', + ]); + } + if (lastRightIdx === rightIdx) { + matchedOrders.rightOrderTakerAssetFilledAmount = getLastMatch( + batchMatchResults, + ).orders.rightOrderTakerAssetFilledAmount; + } else { + batchMatchResults.filledAmounts.push([ + orders.rightOrders[lastRightIdx], + getLastMatch(batchMatchResults).orders.rightOrderTakerAssetFilledAmount || + constants.ZERO_AMOUNT, + 'right', + ]); + } + } + + // Add the latest match to the batch match results + batchMatchResults.matches.push( + await this._simulateMatchOrdersAsync( + matchedOrders, + takerAddress, + toFullMatchTransferAmounts(transferAmounts[i]), + localBalanceStore, + ), + ); + + // Update the left and right fill results + if (lastLeftIdx === leftIdx) { + addFillResults(batchMatchResults.leftFilledResults[leftIdx], getLastMatch(batchMatchResults).fills[0]); + } else { + batchMatchResults.leftFilledResults.push({ ...getLastMatch(batchMatchResults).fills[0] }); + } + if (lastRightIdx === rightIdx) { + addFillResults( + batchMatchResults.rightFilledResults[rightIdx], + getLastMatch(batchMatchResults).fills[1], + ); + } else { + batchMatchResults.rightFilledResults.push({ ...getLastMatch(batchMatchResults).fills[1] }); + } + + lastLeftIdx = leftIdx; + lastRightIdx = rightIdx; + } + + for (let i = leftIdx + 1; i < orders.leftOrders.length; i++) { + batchMatchResults.leftFilledResults.push(emptyFillEventArgs()); + } + + for (let i = rightIdx + 1; i < orders.rightOrders.length; i++) { + batchMatchResults.rightFilledResults.push(emptyFillEventArgs()); + } + + // The two orders indexed by lastLeftIdx and lastRightIdx were potentially + // filled; however, the TakerAssetFilledAmounts that pertain to these orders + // will not have been added to batchMatchResults, so we need to write them + // here. + batchMatchResults.filledAmounts.push([ + orders.leftOrders[lastLeftIdx], + getLastMatch(batchMatchResults).orders.leftOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT, + 'left', + ]); + batchMatchResults.filledAmounts.push([ + orders.rightOrders[lastRightIdx], + getLastMatch(batchMatchResults).orders.rightOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT, + 'right', + ]); + + // Return the batch match results + return batchMatchResults; + } + /** + * Checks that the results of `simulateBatchMatchOrders()` agrees with reality. + * @param batchMatchResults The results of a `simulateBatchMatchOrders()`. + * @param transactionReceipt The transaction receipt of a call to `matchOrders()`. + * @param localBalanceStore The balance store to use during the simulation. + */ + protected async _assertBatchMatchResultsAsync( + batchMatchResults: BatchMatchResults, + transactionReceipt: TransactionReceiptWithDecodedLogs, + localBalanceStore: LocalBalanceStore, + ): Promise { + // Ensure that the batchMatchResults contain at least one match + expect(batchMatchResults.matches.length).to.be.gt(0); + + // Check the fill events. + assertFillEvents( + batchMatchResults.matches.map(match => match.fills).reduce((total, fills) => total.concat(fills)), + transactionReceipt, + ); + + // Update the blockchain balance store balances. + await this._blockchainBalanceStore.updateBalancesAsync(); + + // Ensure that the actual and expected token balances are equivalent. + localBalanceStore.assertEquals(this._blockchainBalanceStore); + + // Check the Exchange state. + await this._assertPostBatchExchangeStateAsync(batchMatchResults); + } + + /** + * Checks that the results of `simulateMatchOrders()` agrees with reality. + * @param matchResults The results of a `simulateMatchOrders()`. + * @param transactionReceipt The transaction receipt of a call to `matchOrders()`. + * @param localBalanceStore The balance store to use during the simulation. + */ + protected async _assertMatchResultsAsync( + matchResults: MatchResults, + transactionReceipt: TransactionReceiptWithDecodedLogs, + localBalanceStore: LocalBalanceStore, + ): Promise { + // Check the fill events. + assertFillEvents(matchResults.fills, transactionReceipt); + + // Update the blockchain balance store balances. + await this._blockchainBalanceStore.updateBalancesAsync(); + + // Check the token balances. + localBalanceStore.assertEquals(this._blockchainBalanceStore); + + // Check the Exchange state. + await this._assertPostExchangeStateAsync(matchResults); + } + + /** + * Asserts the initial exchange state for batch matched orders. + * @param orders Batch matched orders with intial filled amounts. + */ + private async _assertBatchOrderStatesAsync(orders: BatchMatchedOrders): Promise { + for (let i = 0; i < orders.leftOrders.length; i++) { + await this._assertOrderFilledAmountAsync( + orders.leftOrders[i], + orders.leftOrdersTakerAssetFilledAmounts[i], + 'left', + ); + } + for (let i = 0; i < orders.rightOrders.length; i++) { + await this._assertOrderFilledAmountAsync( + orders.rightOrders[i], + orders.rightOrdersTakerAssetFilledAmounts[i], + 'right', + ); + } + } + + /** + * Asserts the initial exchange state for matched orders. + * @param orders Matched orders with intial filled amounts. + */ + private async _assertInitialOrderStatesAsync(orders: MatchedOrders): Promise { + const pairs = [ + [orders.leftOrder, orders.leftOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT], + [orders.rightOrder, orders.rightOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT], + ] as Array<[SignedOrder, BigNumber]>; + await Promise.all( + pairs.map(async ([order, expectedFilledAmount]) => { + const side = order === orders.leftOrder ? 'left' : 'right'; + await this._assertOrderFilledAmountAsync(order, expectedFilledAmount, side); + }), + ); + } + + /** + * Asserts the exchange state after a call to `batchMatchOrders()`. + * @param batchMatchResults Results from a call to `simulateBatchMatchOrders()`. + */ + private async _assertPostBatchExchangeStateAsync(batchMatchResults: BatchMatchResults): Promise { + await this._assertTriplesExchangeStateAsync(batchMatchResults.filledAmounts); + } + + /** + * Asserts the exchange state after a call to `matchOrders()`. + * @param matchResults Results from a call to `simulateMatchOrders()`. + */ + private async _assertPostExchangeStateAsync(matchResults: MatchResults): Promise { + const triples = [ + [matchResults.orders.leftOrder, matchResults.orders.leftOrderTakerAssetFilledAmount, 'left'], + [matchResults.orders.rightOrder, matchResults.orders.rightOrderTakerAssetFilledAmount, 'right'], + ] as Array<[SignedOrder, BigNumber, string]>; + await this._assertTriplesExchangeStateAsync(triples); + } + + /** + * Asserts the exchange state represented by provided sequence of triples. + * @param triples The sequence of triples to verifiy. Each triple consists + * of an `order`, a `takerAssetFilledAmount`, and a `side`, + * which will be used to determine if the exchange's state + * is valid. + */ + private async _assertTriplesExchangeStateAsync(triples: Array<[SignedOrder, BigNumber, string]>): Promise { + await Promise.all( + triples.map(async ([order, expectedFilledAmount, side]) => { + expect(['left', 'right']).to.include(side); + await this._assertOrderFilledAmountAsync(order, expectedFilledAmount, side); + }), + ); + } + + /** + * Asserts that the provided order's fill amount and order status + * are the expected values. + * @param order The order to verify for a correct state. + * @param expectedFilledAmount The amount that the order should + * have been filled. + * @param side The side that the provided order should be matched on. + */ + private async _assertOrderFilledAmountAsync( + order: SignedOrder, + expectedFilledAmount: BigNumber, + side: string, + ): Promise { + const orderInfo = await this._deployment.exchange.getOrderInfo.callAsync(order); + // Check filled amount of order. + const actualFilledAmount = orderInfo.orderTakerAssetFilledAmount; + expect(actualFilledAmount, `${side} order final filled amount`).to.be.bignumber.equal(expectedFilledAmount); + // Check status of order. + const expectedStatus = expectedFilledAmount.isGreaterThanOrEqualTo(order.takerAssetAmount) + ? OrderStatus.FullyFilled + : OrderStatus.Fillable; + const actualStatus = orderInfo.orderStatus; + expect(actualStatus, `${side} order final status`).to.equal(expectedStatus); + } } /** @@ -285,332 +675,11 @@ function toFullMatchTransferAmounts(partial: Partial): Mat }; } -/** - * Simulates matching a batch of orders by transferring amounts defined in - * `transferAmounts` and returns the results. - * @param orders The orders being batch matched and their filled states. - * @param takerAddress Address of taker (the address who matched the two orders) - * @param tokenBalances Current token balances. - * @param transferAmounts Amounts to transfer during the simulation. - * @return The new account balances and fill events that occurred during the match. - */ -async function simulateBatchMatchOrdersAsync( - orders: BatchMatchedOrders, - takerAddress: string, - deployment: DeploymentManager, - blockchainBalanceStore: BlockchainBalanceStore, - localBalanceStore: LocalBalanceStore, - matchPairs: Array<[number, number]>, - transferAmounts: Array>, - assetDataEncoder: IAssetDataContract, -): Promise { - // Initialize variables - let leftIdx = 0; - let rightIdx = 0; - let lastLeftIdx = -1; - let lastRightIdx = -1; - let matchedOrders: MatchedOrders; - const batchMatchResults: BatchMatchResults = { - matches: [], - filledAmounts: [], - leftFilledResults: [], - rightFilledResults: [], - }; - - // Loop over all of the matched pairs from the round - for (let i = 0; i < matchPairs.length; i++) { - leftIdx = matchPairs[i][0]; - rightIdx = matchPairs[i][1]; - - // Construct a matched order out of the current left and right orders - matchedOrders = { - leftOrder: orders.leftOrders[leftIdx], - rightOrder: orders.rightOrders[rightIdx], - leftOrderTakerAssetFilledAmount: orders.leftOrdersTakerAssetFilledAmounts[leftIdx], - rightOrderTakerAssetFilledAmount: orders.rightOrdersTakerAssetFilledAmounts[rightIdx], - }; - - // If there has been a match recorded and one or both of the side indices have not changed, - // replace the side's taker asset filled amount - if (batchMatchResults.matches.length > 0) { - if (lastLeftIdx === leftIdx) { - matchedOrders.leftOrderTakerAssetFilledAmount = getLastMatch( - batchMatchResults, - ).orders.leftOrderTakerAssetFilledAmount; - } else { - batchMatchResults.filledAmounts.push([ - orders.leftOrders[lastLeftIdx], - getLastMatch(batchMatchResults).orders.leftOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT, - 'left', - ]); - } - if (lastRightIdx === rightIdx) { - matchedOrders.rightOrderTakerAssetFilledAmount = getLastMatch( - batchMatchResults, - ).orders.rightOrderTakerAssetFilledAmount; - } else { - batchMatchResults.filledAmounts.push([ - orders.rightOrders[lastRightIdx], - getLastMatch(batchMatchResults).orders.rightOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT, - 'right', - ]); - } - } - - // Add the latest match to the batch match results - batchMatchResults.matches.push( - await simulateMatchOrdersAsync( - matchedOrders, - takerAddress, - deployment, - toFullMatchTransferAmounts(transferAmounts[i]), - assetDataEncoder, - blockchainBalanceStore, - localBalanceStore, - ), - ); - - // Update the left and right fill results - if (lastLeftIdx === leftIdx) { - addFillResults(batchMatchResults.leftFilledResults[leftIdx], getLastMatch(batchMatchResults).fills[0]); - } else { - batchMatchResults.leftFilledResults.push({ ...getLastMatch(batchMatchResults).fills[0] }); - } - if (lastRightIdx === rightIdx) { - addFillResults(batchMatchResults.rightFilledResults[rightIdx], getLastMatch(batchMatchResults).fills[1]); - } else { - batchMatchResults.rightFilledResults.push({ ...getLastMatch(batchMatchResults).fills[1] }); - } - - lastLeftIdx = leftIdx; - lastRightIdx = rightIdx; - } - - for (let i = leftIdx + 1; i < orders.leftOrders.length; i++) { - batchMatchResults.leftFilledResults.push(emptyFillEventArgs()); - } - - for (let i = rightIdx + 1; i < orders.rightOrders.length; i++) { - batchMatchResults.rightFilledResults.push(emptyFillEventArgs()); - } - - // The two orders indexed by lastLeftIdx and lastRightIdx were potentially - // filled; however, the TakerAssetFilledAmounts that pertain to these orders - // will not have been added to batchMatchResults, so we need to write them - // here. - batchMatchResults.filledAmounts.push([ - orders.leftOrders[lastLeftIdx], - getLastMatch(batchMatchResults).orders.leftOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT, - 'left', - ]); - batchMatchResults.filledAmounts.push([ - orders.rightOrders[lastRightIdx], - getLastMatch(batchMatchResults).orders.rightOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT, - 'right', - ]); - - // Return the batch match results - return batchMatchResults; -} - -/** - * Simulates matching two orders by transferring amounts defined in - * `transferAmounts` and returns the results. - * @param orders The orders being matched and their filled states. - * @param takerAddress Address of taker (the address who matched the two orders) - * @param tokenBalances Current token balances. - * @param transferAmounts Amounts to transfer during the simulation. - * @return The new account balances and fill events that occurred during the match. - */ -async function simulateMatchOrdersAsync( - orders: MatchedOrders, - takerAddress: string, - deployment: DeploymentManager, - transferAmounts: MatchTransferAmounts, - assetDataEncoder: IAssetDataContract, - blockchainBalanceStore: BlockchainBalanceStore, - localBalanceStore: LocalBalanceStore, -): Promise { - // prettier-ignore - const matchResults = { - orders: { - leftOrder: orders.leftOrder, - leftOrderTakerAssetFilledAmount: - (orders.leftOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT).plus( - transferAmounts.rightMakerAssetBoughtByLeftMakerAmount, - ), - rightOrder: orders.rightOrder, - rightOrderTakerAssetFilledAmount: - (orders.rightOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT).plus( - transferAmounts.leftMakerAssetBoughtByRightMakerAmount, - ), - }, - fills: simulateFillEvents(orders, takerAddress, transferAmounts), - }; - - // Right maker asset -> left maker - await localBalanceStore.transferAssetAsync( - orders.rightOrder.makerAddress, - orders.leftOrder.makerAddress, - transferAmounts.rightMakerAssetBoughtByLeftMakerAmount, - orders.rightOrder.makerAssetData, - ); - - if (orders.leftOrder.makerAddress !== orders.leftOrder.feeRecipientAddress) { - // Left maker fees - await localBalanceStore.transferAssetAsync( - orders.leftOrder.makerAddress, - orders.leftOrder.feeRecipientAddress, - transferAmounts.leftMakerFeeAssetPaidByLeftMakerAmount, - orders.leftOrder.makerFeeAssetData, - ); - } - - // Left maker asset -> right maker - await localBalanceStore.transferAssetAsync( - orders.leftOrder.makerAddress, - orders.rightOrder.makerAddress, - transferAmounts.leftMakerAssetBoughtByRightMakerAmount, - orders.leftOrder.makerAssetData, - ); - - if (orders.rightOrder.makerAddress !== orders.rightOrder.feeRecipientAddress) { - // Right maker fees - await localBalanceStore.transferAssetAsync( - orders.rightOrder.makerAddress, - orders.rightOrder.feeRecipientAddress, - transferAmounts.rightMakerFeeAssetPaidByRightMakerAmount, - orders.rightOrder.makerFeeAssetData, - ); - } - - // Left taker profit - await localBalanceStore.transferAssetAsync( - orders.leftOrder.makerAddress, - takerAddress, - transferAmounts.leftMakerAssetReceivedByTakerAmount, - orders.leftOrder.makerAssetData, - ); - - // Right taker profit - await localBalanceStore.transferAssetAsync( - orders.rightOrder.makerAddress, - takerAddress, - transferAmounts.rightMakerAssetReceivedByTakerAmount, - orders.rightOrder.makerAssetData, - ); - - // Left taker fees - await localBalanceStore.transferAssetAsync( - takerAddress, - orders.leftOrder.feeRecipientAddress, - transferAmounts.leftTakerFeeAssetPaidByTakerAmount, - orders.leftOrder.takerFeeAssetData, - ); - - // Right taker fees - await localBalanceStore.transferAssetAsync( - takerAddress, - orders.rightOrder.feeRecipientAddress, - transferAmounts.rightTakerFeeAssetPaidByTakerAmount, - orders.rightOrder.takerFeeAssetData, - ); - - // Protocol Fee - const wethAssetData = assetDataEncoder.ERC20Token.getABIEncodedTransactionData(deployment.tokens.weth.address); - localBalanceStore.sendEth( - takerAddress, - deployment.staking.stakingProxy.address, - transferAmounts.leftProtocolFeePaidByTakerInEthAmount, - ); - localBalanceStore.sendEth( - takerAddress, - deployment.staking.stakingProxy.address, - transferAmounts.rightProtocolFeePaidByTakerInEthAmount, - ); - await localBalanceStore.transferAssetAsync( - takerAddress, - deployment.staking.stakingProxy.address, - transferAmounts.leftProtocolFeePaidByTakerInWethAmount, - wethAssetData, - ); - await localBalanceStore.transferAssetAsync( - takerAddress, - deployment.staking.stakingProxy.address, - transferAmounts.rightProtocolFeePaidByTakerInWethAmount, - wethAssetData, - ); - - return matchResults; -} - -/** - * Checks that the results of `simulateBatchMatchOrders()` agrees with reality. - * @param batchMatchResults The results of a `simulateBatchMatchOrders()`. - * @param transactionReceipt The transaction receipt of a call to `matchOrders()`. - * @param actualTokenBalances The actual, on-chain token balances of known addresses. - * @param exchangeWrapper The ExchangeWrapper instance. - */ -async function assertBatchMatchResultsAsync( - batchMatchResults: BatchMatchResults, - transactionReceipt: TransactionReceiptWithDecodedLogs, - blockchainBalanceStore: BlockchainBalanceStore, - localBalanceStore: LocalBalanceStore, - exchange: ExchangeContract, -): Promise { - // Ensure that the batchMatchResults contain at least one match - expect(batchMatchResults.matches.length).to.be.gt(0); - - // Check the fill events. - assertFillEvents( - batchMatchResults.matches.map(match => match.fills).reduce((total, fills) => total.concat(fills)), - transactionReceipt, - ); - - // Update the blockchain balance store balances. - await blockchainBalanceStore.updateBalancesAsync(); - - // Ensure that the actual and expected token balances are equivalent. - localBalanceStore.assertEquals(blockchainBalanceStore); - - // Check the Exchange state. - await assertPostBatchExchangeStateAsync(batchMatchResults, exchange); -} - -/** - * Checks that the results of `simulateMatchOrders()` agrees with reality. - * @param matchResults The results of a `simulateMatchOrders()`. - * @param transactionReceipt The transaction receipt of a call to `matchOrders()`. - * @param actualTokenBalances The actual, on-chain token balances of known addresses. - * @param exchangeWrapper The ExchangeWrapper instance. - */ -async function assertMatchResultsAsync( - matchResults: MatchResults, - transactionReceipt: TransactionReceiptWithDecodedLogs, - localBalanceStore: LocalBalanceStore, - blockchainBalanceStore: BlockchainBalanceStore, - exchange: ExchangeContract, -): Promise { - // Check the fill events. - assertFillEvents(matchResults.fills, transactionReceipt); - - // Update the blockchain balance store balances. - await blockchainBalanceStore.updateBalancesAsync(); - - // Check the token balances. - localBalanceStore.assertEquals(blockchainBalanceStore); - - // Check the Exchange state. - await assertPostExchangeStateAsync(matchResults, exchange); -} - /** * Checks values from the logs produced by Exchange.matchOrders against * the expected transfer amounts. * @param orders The matched orders. - * @param takerAddress Address of taker (account that called Exchange.matchOrders) * @param transactionReceipt Transaction receipt and logs produced by Exchange.matchOrders. - * @param expectedTransferAmounts Expected amounts transferred as a result of order matching. */ function assertFillEvents(expectedFills: FillEventArgs[], transactionReceipt: TransactionReceiptWithDecodedLogs): void { // Extract the actual `Fill` events. @@ -703,120 +772,6 @@ function extractFillEventsfromReceipt(receipt: TransactionReceiptWithDecodedLogs })); } -/** - * Asserts the initial exchange state for batch matched orders. - * @param orders Batch matched orders with intial filled amounts. - * @param exchangeWrapper ExchangeWrapper instance. - */ -async function assertBatchOrderStatesAsync(orders: BatchMatchedOrders, exchange: ExchangeContract): Promise { - for (let i = 0; i < orders.leftOrders.length; i++) { - await assertOrderFilledAmountAsync( - orders.leftOrders[i], - orders.leftOrdersTakerAssetFilledAmounts[i], - 'left', - exchange, - ); - } - for (let i = 0; i < orders.rightOrders.length; i++) { - await assertOrderFilledAmountAsync( - orders.rightOrders[i], - orders.rightOrdersTakerAssetFilledAmounts[i], - 'right', - exchange, - ); - } -} - -/** - * Asserts the initial exchange state for matched orders. - * @param orders Matched orders with intial filled amounts. - * @param exchangeWrapper ExchangeWrapper instance. - */ -async function assertInitialOrderStatesAsync(orders: MatchedOrders, exchange: ExchangeContract): Promise { - const pairs = [ - [orders.leftOrder, orders.leftOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT], - [orders.rightOrder, orders.rightOrderTakerAssetFilledAmount || constants.ZERO_AMOUNT], - ] as Array<[SignedOrder, BigNumber]>; - await Promise.all( - pairs.map(async ([order, expectedFilledAmount]) => { - const side = order === orders.leftOrder ? 'left' : 'right'; - await assertOrderFilledAmountAsync(order, expectedFilledAmount, side, exchange); - }), - ); -} - -/** - * Asserts the exchange state after a call to `batchMatchOrders()`. - * @param batchMatchResults Results from a call to `simulateBatchMatchOrders()`. - * @param exchangeWrapper The ExchangeWrapper instance. - */ -async function assertPostBatchExchangeStateAsync( - batchMatchResults: BatchMatchResults, - exchange: ExchangeContract, -): Promise { - await assertTriplesExchangeStateAsync(batchMatchResults.filledAmounts, exchange); -} - -/** - * Asserts the exchange state after a call to `matchOrders()`. - * @param matchResults Results from a call to `simulateMatchOrders()`. - * @param exchangeWrapper The ExchangeWrapper instance. - */ -async function assertPostExchangeStateAsync(matchResults: MatchResults, exchange: ExchangeContract): Promise { - const triples = [ - [matchResults.orders.leftOrder, matchResults.orders.leftOrderTakerAssetFilledAmount, 'left'], - [matchResults.orders.rightOrder, matchResults.orders.rightOrderTakerAssetFilledAmount, 'right'], - ] as Array<[SignedOrder, BigNumber, string]>; - await assertTriplesExchangeStateAsync(triples, exchange); -} - -/** - * Asserts the exchange state represented by provided sequence of triples. - * @param triples The sequence of triples to verifiy. Each triple consists - * of an `order`, a `takerAssetFilledAmount`, and a `side`, - * which will be used to determine if the exchange's state - * is valid. - * @param exchangeWrapper The ExchangeWrapper instance. - */ -async function assertTriplesExchangeStateAsync( - triples: Array<[SignedOrder, BigNumber, string]>, - exchange: ExchangeContract, -): Promise { - await Promise.all( - triples.map(async ([order, expectedFilledAmount, side]) => { - expect(['left', 'right']).to.include(side); - await assertOrderFilledAmountAsync(order, expectedFilledAmount, side, exchange); - }), - ); -} - -/** - * Asserts that the provided order's fill amount and order status - * are the expected values. - * @param order The order to verify for a correct state. - * @param expectedFilledAmount The amount that the order should - * have been filled. - * @param side The side that the provided order should be matched on. - * @param exchange The exchange contract that is in the current deployment. - */ -async function assertOrderFilledAmountAsync( - order: SignedOrder, - expectedFilledAmount: BigNumber, - side: string, - exchange: ExchangeContract, -): Promise { - const orderInfo = await exchange.getOrderInfo.callAsync(order); - // Check filled amount of order. - const actualFilledAmount = orderInfo.orderTakerAssetFilledAmount; - expect(actualFilledAmount, `${side} order final filled amount`).to.be.bignumber.equal(expectedFilledAmount); - // Check status of order. - const expectedStatus = expectedFilledAmount.isGreaterThanOrEqualTo(order.takerAssetAmount) - ? OrderStatus.FullyFilled - : OrderStatus.Fillable; - const actualStatus = orderInfo.orderStatus; - expect(actualStatus, `${side} order final status`).to.equal(expectedStatus); -} - /** * Gets the last match in a BatchMatchResults object. * @param batchMatchResults The BatchMatchResults object.