100 lines
3.6 KiB
TypeScript
100 lines
3.6 KiB
TypeScript
import { ERC20TokenEvents, ERC20TokenTransferEventArgs } from '@0x/contracts-erc20';
|
|
import { ExchangeEvents, ExchangeFillEventArgs } from '@0x/contracts-exchange';
|
|
import { constants, expect, orderHashUtils, verifyEvents } from '@0x/contracts-test-utils';
|
|
import { FillResults, Order } from '@0x/types';
|
|
import { BigNumber, logUtils } from '@0x/utils';
|
|
import { TransactionReceiptWithDecodedLogs, TxData } from 'ethereum-types';
|
|
import * as _ from 'lodash';
|
|
|
|
import { DeploymentManager } from '../deployment_manager';
|
|
|
|
import { FunctionAssertion, FunctionResult } from './function_assertion';
|
|
|
|
function verifyFillEvents(
|
|
takerAddress: string,
|
|
order: Order,
|
|
receipt: TransactionReceiptWithDecodedLogs,
|
|
deployment: DeploymentManager,
|
|
): void {
|
|
// Ensure that the fill event was correct.
|
|
verifyEvents<ExchangeFillEventArgs>(
|
|
receipt,
|
|
[
|
|
{
|
|
makerAddress: order.makerAddress,
|
|
feeRecipientAddress: order.feeRecipientAddress,
|
|
makerAssetData: order.makerAssetData,
|
|
takerAssetData: order.takerAssetData,
|
|
makerFeeAssetData: order.makerFeeAssetData,
|
|
takerFeeAssetData: order.takerFeeAssetData,
|
|
orderHash: orderHashUtils.getOrderHashHex(order),
|
|
takerAddress,
|
|
senderAddress: takerAddress,
|
|
makerAssetFilledAmount: order.makerAssetAmount,
|
|
takerAssetFilledAmount: order.takerAssetAmount,
|
|
makerFeePaid: constants.ZERO_AMOUNT,
|
|
takerFeePaid: constants.ZERO_AMOUNT,
|
|
protocolFeePaid: DeploymentManager.protocolFee,
|
|
},
|
|
],
|
|
ExchangeEvents.Fill,
|
|
);
|
|
|
|
// Ensure that the transfer events were correctly emitted.
|
|
verifyEvents<ERC20TokenTransferEventArgs>(
|
|
receipt,
|
|
[
|
|
{
|
|
_from: takerAddress,
|
|
_to: order.makerAddress,
|
|
_value: order.takerAssetAmount,
|
|
},
|
|
{
|
|
_from: order.makerAddress,
|
|
_to: takerAddress,
|
|
_value: order.makerAssetAmount,
|
|
},
|
|
{
|
|
_from: takerAddress,
|
|
_to: deployment.staking.stakingProxy.address,
|
|
_value: DeploymentManager.protocolFee,
|
|
},
|
|
],
|
|
ERC20TokenEvents.Transfer,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* A function assertion that verifies that a complete and valid fill succeeded and emitted the correct logs.
|
|
*/
|
|
/* tslint:disable:no-unnecessary-type-assertion */
|
|
/* tslint:disable:no-non-null-assertion */
|
|
export function validFillOrderCompleteFillAssertion(
|
|
deployment: DeploymentManager,
|
|
): FunctionAssertion<[Order, BigNumber, string], {}, FillResults> {
|
|
const exchange = deployment.exchange;
|
|
|
|
return new FunctionAssertion<[Order, BigNumber, string], {}, FillResults>(exchange.fillOrder.bind(exchange), {
|
|
after: async (
|
|
_beforeInfo,
|
|
result: FunctionResult,
|
|
args: [Order, BigNumber, string],
|
|
txData: Partial<TxData>,
|
|
) => {
|
|
const [order] = args;
|
|
|
|
// Ensure that the tx succeeded.
|
|
expect(result.success).to.be.true();
|
|
|
|
// Ensure that the correct events were emitted.
|
|
verifyFillEvents(txData.from!, order, result.receipt!, deployment);
|
|
|
|
logUtils.log(`Order filled by ${txData.from}`);
|
|
|
|
// TODO: Add validation for on-chain state (like balances)
|
|
},
|
|
});
|
|
}
|
|
/* tslint:enable:no-non-null-assertion */
|
|
/* tslint:enable:no-unnecessary-type-assertion */
|