@0x/contracts-exchange: Fix broken match orders tests

This commit is contained in:
Lawrence Forman 2019-05-16 15:50:30 -04:00 committed by Amir Bandeali
parent d2f10d5834
commit 1ab62b7a80
2 changed files with 372 additions and 400 deletions

View File

@ -4,8 +4,6 @@ import { DummyERC721TokenContract } from '@0x/contracts-erc721';
import { import {
chaiSetup, chaiSetup,
constants, constants,
ERC20BalancesByOwner,
ERC721TokenIdsByOwner,
OrderFactory, OrderFactory,
provider, provider,
txDefaults, txDefaults,
@ -33,7 +31,7 @@ const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
chaiSetup.configure(); chaiSetup.configure();
const expect = chai.expect; const expect = chai.expect;
describe('matchOrders', () => { describe.only('matchOrders', () => {
let chainId: number; let chainId: number;
let makerAddressLeft: string; let makerAddressLeft: string;
let makerAddressRight: string; let makerAddressRight: string;
@ -51,8 +49,6 @@ describe('matchOrders', () => {
let erc20Proxy: ERC20ProxyContract; let erc20Proxy: ERC20ProxyContract;
let erc721Proxy: ERC721ProxyContract; let erc721Proxy: ERC721ProxyContract;
let erc20BalancesByOwner: ERC20BalancesByOwner;
let erc721TokenIdsByOwner: ERC721TokenIdsByOwner;
let exchangeWrapper: ExchangeWrapper; let exchangeWrapper: ExchangeWrapper;
let erc20Wrapper: ERC20Wrapper; let erc20Wrapper: ERC20Wrapper;
let erc721Wrapper: ERC721Wrapper; let erc721Wrapper: ERC721Wrapper;
@ -82,23 +78,14 @@ describe('matchOrders', () => {
chainId = await providerUtils.getChainIdAsync(provider); chainId = await providerUtils.getChainIdAsync(provider);
// Create accounts // Create accounts
const accounts = await web3Wrapper.getAvailableAddressesAsync(); const accounts = await web3Wrapper.getAvailableAddressesAsync();
// Hack(albrow): Both Prettier and TSLint insert a trailing comma below const usedAddresses = [
// but that is invalid syntax as of TypeScript version >= 2.8. We don't
// have the right fine-grained configuration options in TSLint,
// Prettier, or TypeScript, to reconcile this, so we will just have to
// wait for them to sort it out. We disable TSLint and Prettier for
// this part of the code for now. This occurs several times in this
// file. See https://github.com/prettier/prettier/issues/4624.
// prettier-ignore
const usedAddresses = ([
owner, owner,
makerAddressLeft, makerAddressLeft,
makerAddressRight, makerAddressRight,
takerAddress, takerAddress,
feeRecipientAddressLeft, feeRecipientAddressLeft,
// tslint:disable-next-line:trailing-comma feeRecipientAddressRight,
feeRecipientAddressRight ] = accounts;
] = _.slice(accounts, 0, 6));
// Create wrappers // Create wrappers
erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner); erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner); erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
@ -151,8 +138,8 @@ describe('matchOrders', () => {
// Set default addresses // Set default addresses
defaultERC20MakerAssetAddress = erc20TokenA.address; defaultERC20MakerAssetAddress = erc20TokenA.address;
defaultERC20TakerAssetAddress = erc20TokenB.address; defaultERC20TakerAssetAddress = erc20TokenB.address;
defaultFeeTokenAddress = feeToken.address;
defaultERC721AssetAddress = erc721Token.address; defaultERC721AssetAddress = erc721Token.address;
defaultFeeTokenAddress = feeToken.address;
const domain = { const domain = {
verifyingContractAddress: exchange.address, verifyingContractAddress: exchange.address,
chainId, chainId,
@ -198,11 +185,6 @@ describe('matchOrders', () => {
await blockchainLifecycle.revertAsync(); await blockchainLifecycle.revertAsync();
}); });
describe('matchOrders', () => { describe('matchOrders', () => {
beforeEach(async () => {
erc20BalancesByOwner = await erc20Wrapper.getBalancesAsync();
erc721TokenIdsByOwner = await erc721Wrapper.getBalancesAsync();
});
it('Should transfer correct amounts when right order is fully filled and values pass isRoundingErrorFloor but fail isRoundingErrorCeil', async () => { it('Should transfer correct amounts when right order is fully filled and values pass isRoundingErrorFloor but fail isRoundingErrorCeil', async () => {
// Create orders to match // Create orders to match
const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
@ -213,8 +195,6 @@ describe('matchOrders', () => {
}); });
const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight, makerAddress: makerAddressRight,
makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(75), 0), makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(75), 0),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0), takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0),
feeRecipientAddress: feeRecipientAddressRight, feeRecipientAddress: feeRecipientAddressRight,
@ -245,24 +225,21 @@ describe('matchOrders', () => {
// Fees can be thought of as a tax paid by the seller, derived from the sale price. // Fees can be thought of as a tax paid by the seller, derived from the sale price.
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(75), 0), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('76.4705882352941176'), 16), // 76.47%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber('76.4705882352941176'), 16), // 76.47%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(75), 0), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(75), 0),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0), rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), 0), leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('76.5306122448979591'), 16), // 76.53%
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber('76.5306122448979591'), 16), // 76.53% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -277,8 +254,6 @@ describe('matchOrders', () => {
}); });
const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
makerAddress: makerAddressRight, makerAddress: makerAddressRight,
makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(97), 0), makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(97), 0),
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(14), 0), takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(14), 0),
feeRecipientAddress: feeRecipientAddressRight, feeRecipientAddress: feeRecipientAddressRight,
@ -309,24 +284,23 @@ describe('matchOrders', () => {
// Fees can be thought of as a tax paid by the seller, derived from the sale price. // Fees can be thought of as a tax paid by the seller, derived from the sale price.
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(15), 0), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(15), 0),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 0), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 0), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 0),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber('92.7835051546391752'), 16), // 92.78% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('92.7835051546391752'), 16), // 92.78%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 0), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 0),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber('92.8571428571428571'), 16), // 92.85% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('92.8571428571428571'), 16), // 92.85%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -356,25 +330,24 @@ describe('matchOrders', () => {
// fee slightly lower than the right taker. // fee slightly lower than the right taker.
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(16), 0), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(16), 0),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(22), 0), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(22), 0), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(22), 0),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber('26.5060240963855421'), 16), // 26.506% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('26.5060240963855421'), 16), // 26.506%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 0), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 0),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber('26.5306122448979591'), 16), // 26.531% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('26.5306122448979591'), 16), // 26.531%
}; };
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -401,25 +374,24 @@ describe('matchOrders', () => {
// slightly lower than the left taker. // slightly lower than the left taker.
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(11), 0), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(11), 0),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(89), 0), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('91.6666666666666666'), 16), // 91.6%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber('91.6666666666666666'), 16), // 91.6%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(89), 0), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(89), 0),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 0), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 0),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber('91.7525773195876288'), 16), // 91.75% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('91.7525773195876288'), 16), // 91.75%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -448,25 +420,24 @@ describe('matchOrders', () => {
// fee slightly lower than the right taker. // fee slightly lower than the right taker.
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(16), 0), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(16), 0),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(22), 0), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(22), 0), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(22), 0),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2650), 0), // 2650.6 rounded down tro 2650 rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2650), 0), // 2650.6 rounded down tro 2650
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 0), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 0),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(2653), 0), // 2653.1 rounded down to 2653 rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2653), 0), // 2653.1 rounded down to 2653
}; };
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -495,25 +466,24 @@ describe('matchOrders', () => {
// fee slightly lower than the left taker. // fee slightly lower than the left taker.
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(11), 0), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(11), 0),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(89), 0), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(9166), 0), // 9166.6 rounded down to 9166
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(9166), 0), // 9166.6 rounded down to 9166
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(89), 0), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(89), 0),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 0), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 0),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(9175), 0), // 9175.2 rounded down to 9175 leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(9175), 0), // 9175.2 rounded down to 9175
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -536,9 +506,8 @@ describe('matchOrders', () => {
}); });
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(1000), 0), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1000), 0),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(1005), 0), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
// Notes: // Notes:
// i. // i.
@ -554,21 +523,21 @@ describe('matchOrders', () => {
// iv. // iv.
// The right maker fee differs from the right taker fee because their exchange rate differs. // 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. // The right maker always receives the better exchange and fee price.
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(1005), 0), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1005), 0),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(503), 0), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(503), 0),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber('47.2718720602069614'), 16), // 47.27% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('47.2718720602069614'), 16), // 47.27%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(497), 0), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(497), 0),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber('47.3189087488240827'), 16), // 47.31% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber('47.3189087488240827'), 16), // 47.31%
}; };
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -613,24 +582,23 @@ describe('matchOrders', () => {
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -648,25 +616,22 @@ describe('matchOrders', () => {
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), 18), leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -684,25 +649,24 @@ describe('matchOrders', () => {
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 16), // 50% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 16), // 50%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 16), // 50% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 16), // 50%
}; };
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -720,25 +684,24 @@ describe('matchOrders', () => {
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 16), // 10%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 16), // 10%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 16), // 10% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 16), // 10%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
// Match signedOrderLeft with signedOrderRight // Match signedOrderLeft with signedOrderRight
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -754,33 +717,26 @@ describe('matchOrders', () => {
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
}); });
// Match orders // Match orders
let newERC20BalancesByOwner: ERC20BalancesByOwner;
let newERC721TokenIdsByOwner: ERC721TokenIdsByOwner;
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 16), // 10%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 16), // 10%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 16), // 10% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 16), // 10%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
// prettier-ignore // prettier-ignore
[ const matchResults = await matchOrderTester.matchOrdersAndAssertEffectsAsync(
newERC20BalancesByOwner, {
// tslint:disable-next-line:trailing-comma leftOrder: signedOrderLeft,
newERC721TokenIdsByOwner rightOrder: signedOrderRight,
] = await matchOrderTester.matchOrdersAndAssertEffectsAsync( },
signedOrderLeft,
signedOrderRight,
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
// Construct second right order // Construct second right order
@ -792,31 +748,27 @@ describe('matchOrders', () => {
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18), takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
}); });
// Match signedOrderLeft with signedOrderRight2 // Match signedOrderLeft with signedOrderRight2
const leftTakerAssetFilledAmount = signedOrderRight.makerAssetAmount;
const rightTakerAssetFilledAmount = new BigNumber(0);
const expectedTransferAmounts2 = { const expectedTransferAmounts2 = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(45), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(45), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 16), // 90% (10% paid earlier)
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 16), // 90% (10% paid earlier)
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(45), 18), rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 16), // 90%
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 16), // 90%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), 18), leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 16), // 90% (10% paid earlier)
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 16), // 90% (10% paid earlier) rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 16), // 90%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(90), 16), // 90%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight2, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight2,
leftOrderTakerAssetFilledAmount: matchResults.orders.leftOrderTakerAssetFilledAmount,
},
takerAddress, takerAddress,
newERC20BalancesByOwner,
newERC721TokenIdsByOwner,
expectedTransferAmounts2, expectedTransferAmounts2,
leftTakerAssetFilledAmount, await matchOrderTester.getBalancesAsync(),
rightTakerAssetFilledAmount,
); );
}); });
@ -832,33 +784,25 @@ describe('matchOrders', () => {
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18), takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
}); });
// Match orders // Match orders
let newERC20BalancesByOwner: ERC20BalancesByOwner;
let newERC721TokenIdsByOwner: ERC721TokenIdsByOwner;
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(4), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(4), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(4), 16), // 4% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(4), 16), // 4%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(6), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(6), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(4), 16), // 4% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(4), 16), // 4%
}; };
// prettier-ignore const matchResults = await matchOrderTester.matchOrdersAndAssertEffectsAsync(
[ {
newERC20BalancesByOwner, leftOrder: signedOrderLeft,
// tslint:disable-next-line:trailing-comma rightOrder: signedOrderRight,
newERC721TokenIdsByOwner },
] = await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft,
signedOrderRight,
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
@ -871,34 +815,26 @@ describe('matchOrders', () => {
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18), takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
}); });
// Match signedOrderLeft2 with signedOrderRight // Match signedOrderLeft2 with signedOrderRight
const leftTakerAssetFilledAmount = new BigNumber(0);
const takerAmountReceived = newERC20BalancesByOwner[takerAddress][defaultERC20MakerAssetAddress].minus(
erc20BalancesByOwner[takerAddress][defaultERC20MakerAssetAddress],
);
const rightTakerAssetFilledAmount = signedOrderLeft.makerAssetAmount.minus(takerAmountReceived);
const expectedTransferAmounts2 = { const expectedTransferAmounts2 = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(48), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 16), // 96%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 16), // 96%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(48), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(48), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 18), rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 16), // 96%
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 16), // 96%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), 18), leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 16), // 96%
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 16), // 96% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 16), // 96%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(96), 16), // 96%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft2, {
signedOrderRight, leftOrder: signedOrderLeft2,
rightOrder: signedOrderRight,
rightOrderTakerAssetFilledAmount: matchResults.orders.rightOrderTakerAssetFilledAmount,
},
takerAddress, takerAddress,
newERC20BalancesByOwner,
newERC721TokenIdsByOwner,
expectedTransferAmounts2, expectedTransferAmounts2,
leftTakerAssetFilledAmount, await matchOrderTester.getBalancesAsync(),
rightTakerAssetFilledAmount,
); );
}); });
@ -917,24 +853,23 @@ describe('matchOrders', () => {
// Match orders // Match orders
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -953,24 +888,23 @@ describe('matchOrders', () => {
takerAddress = signedOrderLeft.makerAddress; takerAddress = signedOrderLeft.makerAddress;
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -989,24 +923,23 @@ describe('matchOrders', () => {
takerAddress = signedOrderRight.makerAddress; takerAddress = signedOrderRight.makerAddress;
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -1025,24 +958,23 @@ describe('matchOrders', () => {
takerAddress = feeRecipientAddressLeft; takerAddress = feeRecipientAddressLeft;
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -1061,24 +993,23 @@ describe('matchOrders', () => {
takerAddress = feeRecipientAddressRight; takerAddress = feeRecipientAddressRight;
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -1096,24 +1027,23 @@ describe('matchOrders', () => {
// Match orders // Match orders
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(3), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -1248,24 +1178,21 @@ describe('matchOrders', () => {
// Match orders // Match orders
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0), rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), 18), leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 50%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 50%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });
@ -1286,24 +1213,23 @@ describe('matchOrders', () => {
// Match orders // Match orders
const expectedTransferAmounts = { const expectedTransferAmounts = {
// Left Maker // Left Maker
amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18), leftMakerAssetSoldByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0), leftMakerFeeAssetPaidByLeftMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Right Maker // Right Maker
amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0), rightMakerAssetSoldByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 0),
amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(8), 18), leftMakerAssetBoughtByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(8), 18),
feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightMakerFeeAssetPaidByRightMakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
// Taker // Taker
amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18), leftMakerAssetReceivedByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% leftTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% rightTakerFeeAssetPaidByTakerAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100%
}; };
await matchOrderTester.matchOrdersAndAssertEffectsAsync( await matchOrderTester.matchOrdersAndAssertEffectsAsync(
signedOrderLeft, {
signedOrderRight, leftOrder: signedOrderLeft,
rightOrder: signedOrderRight,
},
takerAddress, takerAddress,
erc20BalancesByOwner,
erc721TokenIdsByOwner,
expectedTransferAmounts, expectedTransferAmounts,
); );
}); });

View File

@ -32,14 +32,22 @@ export interface FillEventArgs {
} }
export interface MatchTransferAmounts { export interface MatchTransferAmounts {
leftMakerAssetReceivedByRightMakerAmount: BigNumber; // Assets being traded.
rightMakerAssetReceivedByLeftMakerAmount: BigNumber; leftMakerAssetSoldByLeftMakerAmount: BigNumber; // leftMakerAssetBoughtByRightMakerAmount if omitted.
leftMakerFeeAssetPaidByLeftMakerAmount: BigNumber; rightMakerAssetSoldByRightMakerAmount: BigNumber; // rightMakerAssetBoughtByLeftMakerAmount if omitted.
rightMakerFeeAssetPaidByRightMakerAmount: BigNumber; rightMakerAssetBoughtByLeftMakerAmount: BigNumber; // rightMakerAssetSoldByRightMakerAmount if omitted.
leftMakerAssetReceivedByTakerAmount: BigNumber; leftMakerAssetBoughtByRightMakerAmount: BigNumber; // leftMakerAssetSoldByLeftMakerAmount if omitted.
rightMakerAssetReceivedByTakerAmount: BigNumber;
leftTakerFeeAssetPaidByTakerAmount: BigNumber; // Taker profit.
rightTakerFeeAssetPaidByTakerAmount: BigNumber; leftMakerAssetReceivedByTakerAmount: BigNumber; // 0 if omitted.
rightMakerAssetReceivedByTakerAmount: BigNumber; // 0 if omitted.
// Maker fees.
leftMakerFeeAssetPaidByLeftMakerAmount: BigNumber; // 0 if omitted.
rightMakerFeeAssetPaidByRightMakerAmount: BigNumber; // 0 if omitted.
// Taker fees.
leftTakerFeeAssetPaidByTakerAmount: BigNumber; // 0 if omitted.
rightTakerFeeAssetPaidByTakerAmount: BigNumber; // 0 if omitted.
} }
export interface MatchResults { export interface MatchResults {
@ -64,6 +72,7 @@ export class MatchOrderTester {
public erc20Wrapper: ERC20Wrapper; public erc20Wrapper: ERC20Wrapper;
public erc721Wrapper: ERC721Wrapper; public erc721Wrapper: ERC721Wrapper;
public matchOrdersCallAsync?: MatchOrdersAsyncCall; public matchOrdersCallAsync?: MatchOrdersAsyncCall;
private readonly _initialTokenBalancesPromise: Promise<TokenBalancesByOwner>;
/** /**
* @dev Constructs new MatchOrderTester. * @dev Constructs new MatchOrderTester.
@ -83,6 +92,7 @@ export class MatchOrderTester {
this.erc20Wrapper = erc20Wrapper; this.erc20Wrapper = erc20Wrapper;
this.erc721Wrapper = erc721Wrapper; this.erc721Wrapper = erc721Wrapper;
this.matchOrdersCallAsync = matchOrdersCallAsync; this.matchOrdersCallAsync = matchOrdersCallAsync;
this._initialTokenBalancesPromise = this.getBalancesAsync();
} }
/** /**
@ -90,16 +100,20 @@ export class MatchOrderTester {
* @param orders The matched orders and filled states. * @param orders The matched orders and filled states.
* @param takerAddress Address of taker (the address who matched the two orders) * @param takerAddress Address of taker (the address who matched the two orders)
* @param expectedTransferAmounts Expected amounts transferred as a result of order matching. * @param expectedTransferAmounts Expected amounts transferred as a result of order matching.
* Omitted fields are either set to 0 or their complementary
* field.
* @return Results of `matchOrders()`. * @return Results of `matchOrders()`.
*/ */
public async matchOrdersAndAssertEffectsAsync( public async matchOrdersAndAssertEffectsAsync(
orders: MatchedOrders, orders: MatchedOrders,
takerAddress: string, takerAddress: string,
expectedTransferAmounts: Partial<MatchTransferAmounts>, expectedTransferAmounts: Partial<MatchTransferAmounts>,
initialTokenBalances?: TokenBalancesByOwner,
): Promise<MatchResults> { ): Promise<MatchResults> {
await assertInitialOrderStatesAsync(orders, this.exchangeWrapper); await assertInitialOrderStatesAsync(orders, this.exchangeWrapper);
// Get the token balances before executing `matchOrders()`. // Get the token balances before executing `matchOrders()`.
const initialTokenBalances = await this._getBalancesAsync(); const _initialTokenBalances = initialTokenBalances ?
initialTokenBalances : await this._initialTokenBalancesPromise;
// Execute `matchOrders()` // Execute `matchOrders()`
const transactionReceipt = await this._executeMatchOrdersAsync( const transactionReceipt = await this._executeMatchOrdersAsync(
orders.leftOrder, orders.leftOrder,
@ -110,14 +124,14 @@ export class MatchOrderTester {
const matchResults = simulateMatchOrders( const matchResults = simulateMatchOrders(
orders, orders,
takerAddress, takerAddress,
initialTokenBalances, _initialTokenBalances,
toFullMatchTransferAmounts(expectedTransferAmounts), toFullMatchTransferAmounts(expectedTransferAmounts),
); );
// Validate the simulation against realit. // Validate the simulation against realit.
await assertMatchResultsAsync( await assertMatchResultsAsync(
matchResults, matchResults,
transactionReceipt, transactionReceipt,
await this._getBalancesAsync(), await this.getBalancesAsync(),
this.exchangeWrapper, this.exchangeWrapper,
); );
return matchResults; return matchResults;
@ -126,15 +140,8 @@ export class MatchOrderTester {
/** /**
* @dev Fetch the current token balances of all known accounts. * @dev Fetch the current token balances of all known accounts.
*/ */
private async _getBalancesAsync(): Promise<TokenBalancesByOwner> { public async getBalancesAsync(): Promise<TokenBalancesByOwner> {
const [ erc20, erc721 ] = await Promise.all([ return getTokenBalancesAsync(this.erc20Wrapper, this.erc721Wrapper);
this.erc20Wrapper.getBalancesAsync(),
this.erc721Wrapper.getBalancesAsync(),
]);
return {
erc20,
erc721,
};
} }
private async _executeMatchOrdersAsync( private async _executeMatchOrdersAsync(
@ -161,15 +168,36 @@ export class MatchOrderTester {
function toFullMatchTransferAmounts( function toFullMatchTransferAmounts(
partial: Partial<MatchTransferAmounts>, partial: Partial<MatchTransferAmounts>,
): MatchTransferAmounts { ): MatchTransferAmounts {
// prettier-ignore
return { return {
leftMakerAssetReceivedByRightMakerAmount: partial.leftMakerAssetReceivedByRightMakerAmount || ZERO, leftMakerAssetSoldByLeftMakerAmount:
rightMakerAssetReceivedByLeftMakerAmount: partial.rightMakerAssetReceivedByLeftMakerAmount || ZERO, partial.leftMakerAssetSoldByLeftMakerAmount ||
leftMakerFeeAssetPaidByLeftMakerAmount: partial.leftMakerFeeAssetPaidByLeftMakerAmount || ZERO, partial.leftMakerAssetBoughtByRightMakerAmount ||
rightMakerFeeAssetPaidByRightMakerAmount: partial.rightMakerFeeAssetPaidByRightMakerAmount || ZERO, ZERO,
leftMakerAssetReceivedByTakerAmount: partial.leftMakerAssetReceivedByTakerAmount || ZERO, rightMakerAssetSoldByRightMakerAmount:
rightMakerAssetReceivedByTakerAmount: partial.rightMakerAssetReceivedByTakerAmount || ZERO, partial.rightMakerAssetSoldByRightMakerAmount ||
leftTakerFeeAssetPaidByTakerAmount: partial.leftTakerFeeAssetPaidByTakerAmount || ZERO, partial.rightMakerAssetBoughtByLeftMakerAmount ||
rightTakerFeeAssetPaidByTakerAmount: partial.rightTakerFeeAssetPaidByTakerAmount || ZERO, ZERO,
rightMakerAssetBoughtByLeftMakerAmount:
partial.rightMakerAssetBoughtByLeftMakerAmount ||
partial.rightMakerAssetSoldByRightMakerAmount ||
ZERO,
leftMakerAssetBoughtByRightMakerAmount:
partial.leftMakerAssetBoughtByRightMakerAmount ||
partial.leftMakerAssetSoldByLeftMakerAmount ||
ZERO,
leftMakerFeeAssetPaidByLeftMakerAmount:
partial.leftMakerFeeAssetPaidByLeftMakerAmount || ZERO,
rightMakerFeeAssetPaidByRightMakerAmount:
partial.rightMakerFeeAssetPaidByRightMakerAmount || ZERO,
leftMakerAssetReceivedByTakerAmount:
partial.leftMakerAssetReceivedByTakerAmount || ZERO,
rightMakerAssetReceivedByTakerAmount:
partial.rightMakerAssetReceivedByTakerAmount || ZERO,
leftTakerFeeAssetPaidByTakerAmount:
partial.leftTakerFeeAssetPaidByTakerAmount || ZERO,
rightTakerFeeAssetPaidByTakerAmount:
partial.rightTakerFeeAssetPaidByTakerAmount || ZERO,
}; };
} }
@ -188,17 +216,18 @@ function simulateMatchOrders(
tokenBalances: TokenBalancesByOwner, tokenBalances: TokenBalancesByOwner,
transferAmounts: MatchTransferAmounts, transferAmounts: MatchTransferAmounts,
): MatchResults { ): MatchResults {
// prettier-ignore
const matchResults = { const matchResults = {
orders: { orders: {
leftOrder: orders.leftOrder, leftOrder: orders.leftOrder,
leftOrderTakerAssetFilledAmount: leftOrderTakerAssetFilledAmount:
(orders.leftOrderTakerAssetFilledAmount || ZERO).plus( (orders.leftOrderTakerAssetFilledAmount || ZERO).plus(
transferAmounts.rightMakerAssetReceivedByLeftMakerAmount, transferAmounts.rightMakerAssetBoughtByLeftMakerAmount,
), ),
rightOrder: orders.rightOrder, rightOrder: orders.rightOrder,
rightOrderTakerAssetFilledAmount: rightOrderTakerAssetFilledAmount:
(orders.rightOrderTakerAssetFilledAmount || ZERO).plus( (orders.rightOrderTakerAssetFilledAmount || ZERO).plus(
transferAmounts.leftMakerAssetReceivedByRightMakerAmount, transferAmounts.leftMakerAssetBoughtByRightMakerAmount,
), ),
}, },
fills: simulateFillEvents(orders, takerAddress, transferAmounts), fills: simulateFillEvents(orders, takerAddress, transferAmounts),
@ -208,7 +237,7 @@ function simulateMatchOrders(
transferAsset( transferAsset(
orders.leftOrder.makerAddress, orders.leftOrder.makerAddress,
orders.rightOrder.makerAddress, orders.rightOrder.makerAddress,
transferAmounts.leftMakerAssetReceivedByRightMakerAmount, transferAmounts.leftMakerAssetBoughtByRightMakerAmount,
orders.leftOrder.makerAssetData, orders.leftOrder.makerAssetData,
matchResults, matchResults,
); );
@ -216,7 +245,7 @@ function simulateMatchOrders(
transferAsset( transferAsset(
orders.rightOrder.makerAddress, orders.rightOrder.makerAddress,
orders.leftOrder.makerAddress, orders.leftOrder.makerAddress,
transferAmounts.rightMakerAssetReceivedByLeftMakerAmount, transferAmounts.rightMakerAssetBoughtByLeftMakerAmount,
orders.rightOrder.makerAssetData, orders.rightOrder.makerAssetData,
matchResults, matchResults,
); );
@ -364,13 +393,14 @@ function assertFillEvents(
// Validate event arguments. // Validate event arguments.
const fillPairs = _.zip(expectedFills, actualFills) as Array<[FillEventArgs, FillEventArgs]>; const fillPairs = _.zip(expectedFills, actualFills) as Array<[FillEventArgs, FillEventArgs]>;
for (const [expected, actual] of fillPairs) { for (const [expected, actual] of fillPairs) {
expect(actual.orderHash, 'Fill event: orderHash').to.equal(expected.orderHash); const side = expected === expectedFills[0] ? 'Left' : 'Right';
expect(actual.makerAddress, 'Fill event: makerAddress').to.equal(expected.makerAddress); expect(actual.orderHash, `${side} order Fill event orderHash`).to.equal(expected.orderHash);
expect(actual.takerAddress, 'Fill event: takerAddress').to.equal(expected.takerAddress); expect(actual.makerAddress, `${side} order Fill event makerAddress`).to.equal(expected.makerAddress);
expect(actual.makerAssetFilledAmount, 'Fill event: makerAssetFilledAmount').to.equal(expected.makerAssetFilledAmount); expect(actual.takerAddress, `${side} order Fill event takerAddress`).to.equal(expected.takerAddress);
expect(actual.takerAssetFilledAmount, 'Fill event: takerAssetFilledAmount').to.equal(expected.takerAssetFilledAmount); expect(actual.makerAssetFilledAmount, `${side} order Fill event makerAssetFilledAmount`).to.bignumber.equal(expected.makerAssetFilledAmount);
expect(actual.makerFeePaid, 'Fill event: makerFeePaid').to.equal(expected.makerFeePaid); expect(actual.takerAssetFilledAmount, `${side} order Fill event takerAssetFilledAmount`).to.bignumber.equal(expected.takerAssetFilledAmount);
expect(actual.takerFeePaid, 'Fill event: takerFeePaid').to.equal(expected.takerFeePaid); expect(actual.makerFeePaid, `${side} order Fill event makerFeePaid`).to.bignumber.equal(expected.makerFeePaid);
expect(actual.takerFeePaid, `${side} order Fill event takerFeePaid`).to.bignumber.equal(expected.takerFeePaid);
} }
} }
@ -382,14 +412,15 @@ function simulateFillEvents(
takerAddress: string, takerAddress: string,
transferAmounts: MatchTransferAmounts, transferAmounts: MatchTransferAmounts,
): [FillEventArgs, FillEventArgs] { ): [FillEventArgs, FillEventArgs] {
// prettier-ignore
return [ return [
// Left order Fill // Left order Fill
{ {
orderHash: orderHashUtils.getOrderHashHex(orders.leftOrder), orderHash: orderHashUtils.getOrderHashHex(orders.leftOrder),
makerAddress: orders.leftOrder.makerAddress, makerAddress: orders.leftOrder.makerAddress,
takerAddress, takerAddress,
makerAssetFilledAmount: transferAmounts.leftMakerAssetReceivedByRightMakerAmount, makerAssetFilledAmount: transferAmounts.leftMakerAssetSoldByLeftMakerAmount,
takerAssetFilledAmount: transferAmounts.rightMakerAssetReceivedByLeftMakerAmount, takerAssetFilledAmount: transferAmounts.rightMakerAssetBoughtByLeftMakerAmount,
makerFeePaid: transferAmounts.leftMakerFeeAssetPaidByLeftMakerAmount, makerFeePaid: transferAmounts.leftMakerFeeAssetPaidByLeftMakerAmount,
takerFeePaid: transferAmounts.leftTakerFeeAssetPaidByTakerAmount, takerFeePaid: transferAmounts.leftTakerFeeAssetPaidByTakerAmount,
}, },
@ -398,8 +429,8 @@ function simulateFillEvents(
orderHash: orderHashUtils.getOrderHashHex(orders.rightOrder), orderHash: orderHashUtils.getOrderHashHex(orders.rightOrder),
makerAddress: orders.rightOrder.makerAddress, makerAddress: orders.rightOrder.makerAddress,
takerAddress, takerAddress,
makerAssetFilledAmount: transferAmounts.rightMakerAssetReceivedByLeftMakerAmount, makerAssetFilledAmount: transferAmounts.rightMakerAssetSoldByRightMakerAmount,
takerAssetFilledAmount: transferAmounts.leftMakerAssetReceivedByRightMakerAmount, takerAssetFilledAmount: transferAmounts.leftMakerAssetBoughtByRightMakerAmount,
makerFeePaid: transferAmounts.rightMakerFeeAssetPaidByRightMakerAmount, makerFeePaid: transferAmounts.rightMakerFeeAssetPaidByRightMakerAmount,
takerFeePaid: transferAmounts.rightTakerFeeAssetPaidByTakerAmount, takerFeePaid: transferAmounts.rightTakerFeeAssetPaidByTakerAmount,
}, },
@ -505,20 +536,35 @@ async function assertPostExchangeStateAsync(
] as Array<[SignedOrder, BigNumber]>; ] as Array<[SignedOrder, BigNumber]>;
await Promise.all(pairs.map(async ([ order, expectedFilledAmount ]) => { await Promise.all(pairs.map(async ([ order, expectedFilledAmount ]) => {
const side = order === matchResults.orders.leftOrder ? 'left' : 'right'; const side = order === matchResults.orders.leftOrder ? 'left' : 'right';
const orderHash = orderHashUtils.getOrderHashHex(order); const orderInfo = await exchangeWrapper.getOrderInfoAsync(order);
// Check filled amount of order. // Check filled amount of order.
const actualFilledAmount = await exchangeWrapper.getTakerAssetFilledAmountAsync( const actualFilledAmount = orderInfo.orderTakerAssetFilledAmount;
orderHash,
);
expect(actualFilledAmount, `${side} order final filled amount`) expect(actualFilledAmount, `${side} order final filled amount`)
.to.be.bignumber.equal(expectedFilledAmount); .to.be.bignumber.equal(expectedFilledAmount);
// Check status of order. // Check status of order.
const expectedStatus = const expectedStatus =
expectedFilledAmount.isGreaterThanOrEqualTo(order.takerAssetAmount) ? expectedFilledAmount.isGreaterThanOrEqualTo(order.takerAssetAmount) ?
OrderStatus.FullyFilled : OrderStatus.Fillable; OrderStatus.FullyFilled : OrderStatus.Fillable;
const actualStatus = (await exchangeWrapper.getOrderInfoAsync(order)).orderStatus; const actualStatus = orderInfo.orderStatus;
expect(actualStatus, `${side} order final status`).to.equal(expectedStatus); expect(actualStatus, `${side} order final status`).to.equal(expectedStatus);
})); }));
} }
/**
* @dev Retrive the current token balances of all known addresses.
*/
export async function getTokenBalancesAsync(
erc20Wrapper: ERC20Wrapper,
erc721Wrapper: ERC721Wrapper,
): Promise<TokenBalancesByOwner> {
const [ erc20, erc721 ] = await Promise.all([
erc20Wrapper.getBalancesAsync(),
erc721Wrapper.getBalancesAsync(),
]);
return {
erc20,
erc721,
};
}
// tslint:disable-line:max-file-line-count // tslint:disable-line:max-file-line-count