static tests
This commit is contained in:
@@ -221,7 +221,6 @@ blockchainTests.resets('Exchange core', () => {
|
||||
};
|
||||
fillOrderWrapper = new FillOrderWrapper(
|
||||
exchange,
|
||||
devUtils,
|
||||
{ makerAddress, takerAddress, feeRecipientAddress },
|
||||
tokenContracts,
|
||||
tokenIds,
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { ExchangeContract } from '@0x/contracts-exchange';
|
||||
import { ReferenceFunctions as LibReferenceFunctions } from '@0x/contracts-exchange-libs';
|
||||
import {
|
||||
@@ -56,65 +55,6 @@ export class FillOrderWrapper {
|
||||
return events.map(event => _.pick(event, fieldsOfInterest)) as FillEventArgs[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Locally simulates filling an order.
|
||||
* @param txReceipt Transaction receipt from the actual fill, needed to update eth balance
|
||||
* @param signedOrder The order being filled.
|
||||
* @param takerAddress Address of taker (the address who matched the two orders)
|
||||
* @param opts Optionally specifies the amount to fill.
|
||||
* @param initBalanceStore Account balances prior to the fill.
|
||||
* @return The expected account balances, fill results, and fill events.
|
||||
*/
|
||||
public async simulateFillOrderAsync(
|
||||
txReceipt: TransactionReceiptWithDecodedLogs,
|
||||
signedOrder: SignedOrder,
|
||||
takerAddress: string,
|
||||
initBalanceStore: BalanceStore,
|
||||
opts: { takerAssetFillAmount?: BigNumber } = {},
|
||||
): Promise<[FillResults, FillEventArgs, BalanceStore]> {
|
||||
const balanceStore = LocalBalanceStore.create(initBalanceStore);
|
||||
const takerAssetFillAmount =
|
||||
opts.takerAssetFillAmount !== undefined ? opts.takerAssetFillAmount : signedOrder.takerAssetAmount;
|
||||
// TODO(jalextowle): Change this if the integration tests take protocol fees into account.
|
||||
const fillResults = LibReferenceFunctions.calculateFillResults(
|
||||
signedOrder,
|
||||
takerAssetFillAmount,
|
||||
constants.ZERO_AMOUNT,
|
||||
constants.ZERO_AMOUNT,
|
||||
);
|
||||
const fillEvent = FillOrderWrapper.simulateFillEvent(signedOrder, takerAddress, fillResults);
|
||||
// Taker -> Maker
|
||||
await balanceStore.transferAssetAsync(
|
||||
takerAddress,
|
||||
signedOrder.makerAddress,
|
||||
fillResults.takerAssetFilledAmount,
|
||||
signedOrder.takerAssetData,
|
||||
);
|
||||
// Maker -> Taker
|
||||
await balanceStore.transferAssetAsync(
|
||||
signedOrder.makerAddress,
|
||||
takerAddress,
|
||||
fillResults.makerAssetFilledAmount,
|
||||
signedOrder.makerAssetData,
|
||||
);
|
||||
// Taker -> Fee Recipient
|
||||
await balanceStore.transferAssetAsync(
|
||||
takerAddress,
|
||||
signedOrder.feeRecipientAddress,
|
||||
fillResults.takerFeePaid,
|
||||
signedOrder.takerFeeAssetData,
|
||||
);
|
||||
// Maker -> Fee Recipient
|
||||
await balanceStore.transferAssetAsync(
|
||||
signedOrder.makerAddress,
|
||||
signedOrder.feeRecipientAddress,
|
||||
fillResults.makerFeePaid,
|
||||
signedOrder.makerFeeAssetData,
|
||||
);
|
||||
balanceStore.burnGas(txReceipt.from, constants.DEFAULT_GAS_PRICE * txReceipt.gasUsed);
|
||||
return [fillResults, fillEvent, balanceStore];
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param exchangeContract Instance of the deployed exchange contract.
|
||||
@@ -124,7 +64,6 @@ export class FillOrderWrapper {
|
||||
*/
|
||||
public constructor(
|
||||
private readonly _exchange: ExchangeContract,
|
||||
private readonly _devUtils: DevUtilsContract,
|
||||
tokenOwnersByName: TokenOwnersByName,
|
||||
tokenContractsByName: Partial<TokenContractsByName>,
|
||||
tokenIds: Partial<TokenIds>,
|
||||
@@ -160,11 +99,13 @@ export class FillOrderWrapper {
|
||||
await this._assertOrderStateAsync(signedOrder, initTakerAssetFilledAmount);
|
||||
// Simulate and execute fill then assert outputs
|
||||
const [fillResults, fillEvent, txReceipt] = await this._fillOrderAsync(signedOrder, from, opts);
|
||||
const [
|
||||
simulatedFillResults,
|
||||
simulatedFillEvent,
|
||||
simulatedFinalBalanceStore,
|
||||
] = await this.simulateFillOrderAsync(txReceipt, signedOrder, from, this._blockchainBalanceStore, opts);
|
||||
const [simulatedFillResults, simulatedFillEvent, simulatedFinalBalanceStore] = await simulateFillOrderAsync(
|
||||
txReceipt,
|
||||
signedOrder,
|
||||
from,
|
||||
this._blockchainBalanceStore,
|
||||
opts,
|
||||
);
|
||||
// Assert state transition
|
||||
expect(simulatedFillResults, 'Fill Results').to.be.deep.equal(fillResults);
|
||||
expect(simulatedFillEvent, 'Fill Events').to.be.deep.equal(fillEvent);
|
||||
@@ -218,3 +159,62 @@ export class FillOrderWrapper {
|
||||
expect(actualStatus, 'order status').to.equal(expectedStatus);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Locally simulates filling an order.
|
||||
* @param txReceipt Transaction receipt from the actual fill, needed to update eth balance
|
||||
* @param signedOrder The order being filled.
|
||||
* @param takerAddress Address of taker (the address who matched the two orders)
|
||||
* @param opts Optionally specifies the amount to fill.
|
||||
* @param initBalanceStore Account balances prior to the fill.
|
||||
* @return The expected account balances, fill results, and fill events.
|
||||
*/
|
||||
async function simulateFillOrderAsync(
|
||||
txReceipt: TransactionReceiptWithDecodedLogs,
|
||||
signedOrder: SignedOrder,
|
||||
takerAddress: string,
|
||||
initBalanceStore: BalanceStore,
|
||||
opts: { takerAssetFillAmount?: BigNumber } = {},
|
||||
): Promise<[FillResults, FillEventArgs, BalanceStore]> {
|
||||
const balanceStore = LocalBalanceStore.create(initBalanceStore);
|
||||
const takerAssetFillAmount =
|
||||
opts.takerAssetFillAmount !== undefined ? opts.takerAssetFillAmount : signedOrder.takerAssetAmount;
|
||||
// TODO(jalextowle): Change this if the integration tests take protocol fees into account.
|
||||
const fillResults = LibReferenceFunctions.calculateFillResults(
|
||||
signedOrder,
|
||||
takerAssetFillAmount,
|
||||
constants.ZERO_AMOUNT,
|
||||
constants.ZERO_AMOUNT,
|
||||
);
|
||||
const fillEvent = FillOrderWrapper.simulateFillEvent(signedOrder, takerAddress, fillResults);
|
||||
// Taker -> Maker
|
||||
await balanceStore.transferAssetAsync(
|
||||
takerAddress,
|
||||
signedOrder.makerAddress,
|
||||
fillResults.takerAssetFilledAmount,
|
||||
signedOrder.takerAssetData,
|
||||
);
|
||||
// Maker -> Taker
|
||||
await balanceStore.transferAssetAsync(
|
||||
signedOrder.makerAddress,
|
||||
takerAddress,
|
||||
fillResults.makerAssetFilledAmount,
|
||||
signedOrder.makerAssetData,
|
||||
);
|
||||
// Taker -> Fee Recipient
|
||||
await balanceStore.transferAssetAsync(
|
||||
takerAddress,
|
||||
signedOrder.feeRecipientAddress,
|
||||
fillResults.takerFeePaid,
|
||||
signedOrder.takerFeeAssetData,
|
||||
);
|
||||
// Maker -> Fee Recipient
|
||||
await balanceStore.transferAssetAsync(
|
||||
signedOrder.makerAddress,
|
||||
signedOrder.feeRecipientAddress,
|
||||
fillResults.makerFeePaid,
|
||||
signedOrder.makerFeeAssetData,
|
||||
);
|
||||
balanceStore.burnGas(txReceipt.from, constants.DEFAULT_GAS_PRICE * txReceipt.gasUsed);
|
||||
return [fillResults, fillEvent, balanceStore];
|
||||
}
|
||||
|
||||
@@ -168,7 +168,7 @@ export class MatchOrderTester {
|
||||
// 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._deployment.devUtils, this._blockchainBalanceStore);
|
||||
const localBalanceStore = LocalBalanceStore.create(this._blockchainBalanceStore);
|
||||
|
||||
// Execute `batchMatchOrders()`
|
||||
let actualBatchMatchResults;
|
||||
@@ -253,7 +253,7 @@ export class MatchOrderTester {
|
||||
// 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._deployment.devUtils, this._blockchainBalanceStore);
|
||||
const localBalanceStore = LocalBalanceStore.create(this._blockchainBalanceStore);
|
||||
|
||||
// Execute `matchOrders()`
|
||||
let actualMatchResults;
|
||||
|
||||
Reference in New Issue
Block a user