Add ability to tweak the relevant balances/allowances for the maker and taker for a fillScenario. Convert more of the core tests to the declarative form.
This commit is contained in:
		@@ -38,13 +38,13 @@ import {
 | 
			
		||||
    OrderScenario,
 | 
			
		||||
    TakerAssetFillAmountScenario,
 | 
			
		||||
    TakerScenario,
 | 
			
		||||
    TokenAmountScenario,
 | 
			
		||||
    TraderStateScenario,
 | 
			
		||||
} from '../utils/types';
 | 
			
		||||
 | 
			
		||||
chaiSetup.configure();
 | 
			
		||||
const expect = chai.expect;
 | 
			
		||||
 | 
			
		||||
const ERC721_PROXY_ID = 2;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Instantiates a new instance of CoreCombinatorialUtils. Since this method has some
 | 
			
		||||
 * required async setup, a factory method is required.
 | 
			
		||||
@@ -192,6 +192,18 @@ export class CoreCombinatorialUtils {
 | 
			
		||||
                    takerAssetDataScenario: fillScenarioArray[8] as AssetDataScenario,
 | 
			
		||||
                },
 | 
			
		||||
                takerAssetFillAmountScenario: fillScenarioArray[9] as TakerAssetFillAmountScenario,
 | 
			
		||||
                makerStateScenario: {
 | 
			
		||||
                    traderAssetBalance: TokenAmountScenario.Higher,
 | 
			
		||||
                    traderAssetAllowance: TokenAmountScenario.Higher,
 | 
			
		||||
                    zrxFeeBalance: TokenAmountScenario.Higher,
 | 
			
		||||
                    zrxFeeAllowance: TokenAmountScenario.Higher,
 | 
			
		||||
                },
 | 
			
		||||
                takerStateScenario: {
 | 
			
		||||
                    traderAssetBalance: TokenAmountScenario.Higher,
 | 
			
		||||
                    traderAssetAllowance: TokenAmountScenario.Higher,
 | 
			
		||||
                    zrxFeeBalance: TokenAmountScenario.Higher,
 | 
			
		||||
                    zrxFeeAllowance: TokenAmountScenario.Higher,
 | 
			
		||||
                },
 | 
			
		||||
            };
 | 
			
		||||
            return fillScenario;
 | 
			
		||||
        });
 | 
			
		||||
@@ -248,53 +260,28 @@ export class CoreCombinatorialUtils {
 | 
			
		||||
            signature: `0x${signature.toString('hex')}`,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        // 3. Permutate the maker and taker balance/allowance scenarios
 | 
			
		||||
        // TODO(fabio)
 | 
			
		||||
 | 
			
		||||
        // 4. Figure out fill amount
 | 
			
		||||
        const balanceAndProxyAllowanceFetcher = new SimpleAssetBalanceAndProxyAllowanceFetcher(this.assetWrapper);
 | 
			
		||||
        const orderFilledCancelledFetcher = new SimpleOrderFilledCancelledFetcher(
 | 
			
		||||
            this.exchangeWrapper,
 | 
			
		||||
            this.zrxAssetData,
 | 
			
		||||
        );
 | 
			
		||||
        const orderStateUtils = new OrderStateUtils(balanceAndProxyAllowanceFetcher, orderFilledCancelledFetcher);
 | 
			
		||||
 | 
			
		||||
        const fillableTakerAssetAmount = await orderStateUtils.getMaxFillableTakerAssetAmountAsync(
 | 
			
		||||
        // 3. Figure out fill amount
 | 
			
		||||
        const takerAssetFillAmount = await this._getTakerAssetFillAmountAsync(
 | 
			
		||||
            signedOrder,
 | 
			
		||||
            this.takerAddress,
 | 
			
		||||
            fillScenario.takerAssetFillAmountScenario,
 | 
			
		||||
            balanceAndProxyAllowanceFetcher,
 | 
			
		||||
            orderFilledCancelledFetcher,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        let takerAssetFillAmount;
 | 
			
		||||
        const takerAssetFillAmountScenario = fillScenario.takerAssetFillAmountScenario;
 | 
			
		||||
        switch (takerAssetFillAmountScenario) {
 | 
			
		||||
            case TakerAssetFillAmountScenario.Zero:
 | 
			
		||||
                takerAssetFillAmount = new BigNumber(0);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TakerAssetFillAmountScenario.ExactlyRemainingFillableTakerAssetAmount:
 | 
			
		||||
                takerAssetFillAmount = fillableTakerAssetAmount;
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TakerAssetFillAmountScenario.GreaterThanRemainingFillableTakerAssetAmount:
 | 
			
		||||
                takerAssetFillAmount = fillableTakerAssetAmount.add(1);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount:
 | 
			
		||||
                const takerAssetProxyId = assetProxyUtils.decodeAssetDataId(signedOrder.takerAssetData);
 | 
			
		||||
                const makerAssetProxyId = assetProxyUtils.decodeAssetDataId(signedOrder.makerAssetData);
 | 
			
		||||
                const isEitherAssetERC721 =
 | 
			
		||||
                    takerAssetProxyId === ERC721_PROXY_ID || makerAssetProxyId === ERC721_PROXY_ID;
 | 
			
		||||
                if (isEitherAssetERC721) {
 | 
			
		||||
                    throw new Error(
 | 
			
		||||
                        'Cannot test `TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount` together with ERC721 assets since orders involving ERC721 must always be filled exactly.',
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
                takerAssetFillAmount = fillableTakerAssetAmount.div(2).floor();
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr('TakerAssetFillAmountScenario', takerAssetFillAmountScenario);
 | 
			
		||||
        }
 | 
			
		||||
        // 4. Permutate the maker and taker balance/allowance scenarios
 | 
			
		||||
        await this._modifyTraderStateAsync(
 | 
			
		||||
            fillScenario.makerStateScenario,
 | 
			
		||||
            fillScenario.takerStateScenario,
 | 
			
		||||
            signedOrder,
 | 
			
		||||
            takerAssetFillAmount,
 | 
			
		||||
            balanceAndProxyAllowanceFetcher,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // 5. If I fill it by X, what are the resulting balances/allowances/filled amounts exp?
 | 
			
		||||
        const orderValidationUtils = new OrderValidationUtils(orderFilledCancelledFetcher);
 | 
			
		||||
@@ -323,6 +310,287 @@ export class CoreCombinatorialUtils {
 | 
			
		||||
            provider,
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    private async _modifyTraderStateAsync(
 | 
			
		||||
        makerStateScenario: TraderStateScenario,
 | 
			
		||||
        takerStateScenario: TraderStateScenario,
 | 
			
		||||
        signedOrder: SignedOrder,
 | 
			
		||||
        takerAssetFillAmount: BigNumber,
 | 
			
		||||
        balanceAndProxyAllowanceFetcher: SimpleAssetBalanceAndProxyAllowanceFetcher,
 | 
			
		||||
    ): Promise<void> {
 | 
			
		||||
        const makerAssetFillAmount = orderUtils.getPartialAmount(
 | 
			
		||||
            takerAssetFillAmount,
 | 
			
		||||
            signedOrder.takerAssetAmount,
 | 
			
		||||
            signedOrder.makerAssetAmount,
 | 
			
		||||
        );
 | 
			
		||||
        switch (makerStateScenario.traderAssetBalance) {
 | 
			
		||||
            case TokenAmountScenario.Higher:
 | 
			
		||||
                break; // Noop since this is already the default
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.TooLow:
 | 
			
		||||
                if (makerAssetFillAmount.eq(0)) {
 | 
			
		||||
                    throw new Error(`Cannot set makerAssetBalanceOfMaker TooLow if makerAssetFillAmount is 0`);
 | 
			
		||||
                }
 | 
			
		||||
                const tooLowBalance = makerAssetFillAmount.minus(1);
 | 
			
		||||
                await this.assetWrapper.setBalanceAsync(
 | 
			
		||||
                    signedOrder.makerAddress,
 | 
			
		||||
                    signedOrder.makerAssetData,
 | 
			
		||||
                    tooLowBalance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.Exact:
 | 
			
		||||
                const exactBalance = makerAssetFillAmount;
 | 
			
		||||
                await this.assetWrapper.setBalanceAsync(
 | 
			
		||||
                    signedOrder.makerAddress,
 | 
			
		||||
                    signedOrder.makerAssetData,
 | 
			
		||||
                    exactBalance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr(
 | 
			
		||||
                    'makerStateScenario.traderAssetBalance',
 | 
			
		||||
                    makerStateScenario.traderAssetBalance,
 | 
			
		||||
                );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const makerFee = orderUtils.getPartialAmount(
 | 
			
		||||
            takerAssetFillAmount,
 | 
			
		||||
            signedOrder.takerAssetAmount,
 | 
			
		||||
            signedOrder.makerFee,
 | 
			
		||||
        );
 | 
			
		||||
        switch (makerStateScenario.zrxFeeBalance) {
 | 
			
		||||
            case TokenAmountScenario.Higher:
 | 
			
		||||
                break; // Noop since this is already the default
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.TooLow:
 | 
			
		||||
                if (makerFee.eq(0)) {
 | 
			
		||||
                    throw new Error(`Cannot set zrxAsserBalanceOfMaker TooLow if makerFee is 0`);
 | 
			
		||||
                }
 | 
			
		||||
                const tooLowBalance = makerFee.minus(1);
 | 
			
		||||
                await this.assetWrapper.setBalanceAsync(signedOrder.makerAddress, this.zrxAssetData, tooLowBalance);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.Exact:
 | 
			
		||||
                const exactBalance = makerFee;
 | 
			
		||||
                await this.assetWrapper.setBalanceAsync(signedOrder.makerAddress, this.zrxAssetData, exactBalance);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr('makerStateScenario.zrxFeeBalance', makerStateScenario.zrxFeeBalance);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (makerStateScenario.traderAssetAllowance) {
 | 
			
		||||
            case TokenAmountScenario.Higher:
 | 
			
		||||
                break; // Noop since this is already the default
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.TooLow:
 | 
			
		||||
                const tooLowAllowance = makerAssetFillAmount.minus(1);
 | 
			
		||||
                await this.assetWrapper.setProxyAllowanceAsync(
 | 
			
		||||
                    signedOrder.makerAddress,
 | 
			
		||||
                    signedOrder.makerAssetData,
 | 
			
		||||
                    tooLowAllowance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.Exact:
 | 
			
		||||
                const exactAllowance = makerAssetFillAmount;
 | 
			
		||||
                await this.assetWrapper.setProxyAllowanceAsync(
 | 
			
		||||
                    signedOrder.makerAddress,
 | 
			
		||||
                    signedOrder.makerAssetData,
 | 
			
		||||
                    exactAllowance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr(
 | 
			
		||||
                    'makerStateScenario.traderAssetAllowance',
 | 
			
		||||
                    makerStateScenario.traderAssetAllowance,
 | 
			
		||||
                );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (makerStateScenario.zrxFeeAllowance) {
 | 
			
		||||
            case TokenAmountScenario.Higher:
 | 
			
		||||
                break; // Noop since this is already the default
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.TooLow:
 | 
			
		||||
                const tooLowAllowance = makerFee.minus(1);
 | 
			
		||||
                await this.assetWrapper.setProxyAllowanceAsync(
 | 
			
		||||
                    signedOrder.makerAddress,
 | 
			
		||||
                    this.zrxAssetData,
 | 
			
		||||
                    tooLowAllowance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.Exact:
 | 
			
		||||
                const exactAllowance = makerFee;
 | 
			
		||||
                await this.assetWrapper.setProxyAllowanceAsync(
 | 
			
		||||
                    signedOrder.makerAddress,
 | 
			
		||||
                    this.zrxAssetData,
 | 
			
		||||
                    exactAllowance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr(
 | 
			
		||||
                    'makerStateScenario.zrxFeeAllowance',
 | 
			
		||||
                    makerStateScenario.zrxFeeAllowance,
 | 
			
		||||
                );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (takerStateScenario.traderAssetBalance) {
 | 
			
		||||
            case TokenAmountScenario.Higher:
 | 
			
		||||
                break; // Noop since this is already the default
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.TooLow:
 | 
			
		||||
                if (takerAssetFillAmount.eq(0)) {
 | 
			
		||||
                    throw new Error(`Cannot set takerAssetBalanceOfTaker TooLow if takerAssetFillAmount is 0`);
 | 
			
		||||
                }
 | 
			
		||||
                const tooLowBalance = takerAssetFillAmount.minus(1);
 | 
			
		||||
                await this.assetWrapper.setBalanceAsync(this.takerAddress, signedOrder.takerAssetData, tooLowBalance);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.Exact:
 | 
			
		||||
                const exactBalance = takerAssetFillAmount;
 | 
			
		||||
                await this.assetWrapper.setBalanceAsync(this.takerAddress, signedOrder.takerAssetData, exactBalance);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr(
 | 
			
		||||
                    'takerStateScenario.traderAssetBalance',
 | 
			
		||||
                    takerStateScenario.traderAssetBalance,
 | 
			
		||||
                );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const takerFee = orderUtils.getPartialAmount(
 | 
			
		||||
            takerAssetFillAmount,
 | 
			
		||||
            signedOrder.takerAssetAmount,
 | 
			
		||||
            signedOrder.takerFee,
 | 
			
		||||
        );
 | 
			
		||||
        switch (takerStateScenario.zrxFeeBalance) {
 | 
			
		||||
            case TokenAmountScenario.Higher:
 | 
			
		||||
                break; // Noop since this is already the default
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.TooLow:
 | 
			
		||||
                if (takerFee.eq(0)) {
 | 
			
		||||
                    throw new Error(`Cannot set zrxAssetBalanceOfTaker TooLow if takerFee is 0`);
 | 
			
		||||
                }
 | 
			
		||||
                const tooLowBalance = takerFee.minus(1);
 | 
			
		||||
                await this.assetWrapper.setBalanceAsync(this.takerAddress, this.zrxAssetData, tooLowBalance);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.Exact:
 | 
			
		||||
                const exactBalance = takerFee;
 | 
			
		||||
                await this.assetWrapper.setBalanceAsync(this.takerAddress, this.zrxAssetData, exactBalance);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr('takerStateScenario.zrxFeeBalance', takerStateScenario.zrxFeeBalance);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (takerStateScenario.traderAssetAllowance) {
 | 
			
		||||
            case TokenAmountScenario.Higher:
 | 
			
		||||
                break; // Noop since this is already the default
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.TooLow:
 | 
			
		||||
                const tooLowAllowance = takerAssetFillAmount.minus(1);
 | 
			
		||||
                await this.assetWrapper.setProxyAllowanceAsync(
 | 
			
		||||
                    this.takerAddress,
 | 
			
		||||
                    signedOrder.takerAssetData,
 | 
			
		||||
                    tooLowAllowance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.Exact:
 | 
			
		||||
                const exactAllowance = takerAssetFillAmount;
 | 
			
		||||
                await this.assetWrapper.setProxyAllowanceAsync(
 | 
			
		||||
                    this.takerAddress,
 | 
			
		||||
                    signedOrder.takerAssetData,
 | 
			
		||||
                    exactAllowance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr(
 | 
			
		||||
                    'takerStateScenario.traderAssetAllowance',
 | 
			
		||||
                    takerStateScenario.traderAssetAllowance,
 | 
			
		||||
                );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (takerStateScenario.zrxFeeAllowance) {
 | 
			
		||||
            case TokenAmountScenario.Higher:
 | 
			
		||||
                break; // Noop since this is already the default
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.TooLow:
 | 
			
		||||
                const tooLowAllowance = takerFee.minus(1);
 | 
			
		||||
                await this.assetWrapper.setProxyAllowanceAsync(
 | 
			
		||||
                    signedOrder.takerAddress,
 | 
			
		||||
                    this.zrxAssetData,
 | 
			
		||||
                    tooLowAllowance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TokenAmountScenario.Exact:
 | 
			
		||||
                const exactAllowance = takerFee;
 | 
			
		||||
                await this.assetWrapper.setProxyAllowanceAsync(
 | 
			
		||||
                    signedOrder.takerAddress,
 | 
			
		||||
                    this.zrxAssetData,
 | 
			
		||||
                    exactAllowance,
 | 
			
		||||
                );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr(
 | 
			
		||||
                    'takerStateScenario.zrxFeeAllowance',
 | 
			
		||||
                    takerStateScenario.zrxFeeAllowance,
 | 
			
		||||
                );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    private async _getTakerAssetFillAmountAsync(
 | 
			
		||||
        signedOrder: SignedOrder,
 | 
			
		||||
        takerAssetFillAmountScenario: TakerAssetFillAmountScenario,
 | 
			
		||||
        balanceAndProxyAllowanceFetcher: SimpleAssetBalanceAndProxyAllowanceFetcher,
 | 
			
		||||
        orderFilledCancelledFetcher: SimpleOrderFilledCancelledFetcher,
 | 
			
		||||
    ): Promise<BigNumber> {
 | 
			
		||||
        const orderStateUtils = new OrderStateUtils(balanceAndProxyAllowanceFetcher, orderFilledCancelledFetcher);
 | 
			
		||||
        const fillableTakerAssetAmount = await orderStateUtils.getMaxFillableTakerAssetAmountAsync(
 | 
			
		||||
            signedOrder,
 | 
			
		||||
            this.takerAddress,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        let takerAssetFillAmount;
 | 
			
		||||
        switch (takerAssetFillAmountScenario) {
 | 
			
		||||
            case TakerAssetFillAmountScenario.Zero:
 | 
			
		||||
                takerAssetFillAmount = new BigNumber(0);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TakerAssetFillAmountScenario.ExactlyRemainingFillableTakerAssetAmount:
 | 
			
		||||
                takerAssetFillAmount = fillableTakerAssetAmount;
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TakerAssetFillAmountScenario.GreaterThanRemainingFillableTakerAssetAmount:
 | 
			
		||||
                takerAssetFillAmount = fillableTakerAssetAmount.add(1);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount:
 | 
			
		||||
                const takerAssetProxyId = assetProxyUtils.decodeAssetDataId(signedOrder.takerAssetData);
 | 
			
		||||
                const makerAssetProxyId = assetProxyUtils.decodeAssetDataId(signedOrder.makerAssetData);
 | 
			
		||||
                const isEitherAssetERC721 =
 | 
			
		||||
                    takerAssetProxyId === constants.ERC721_PROXY_ID || makerAssetProxyId === constants.ERC721_PROXY_ID;
 | 
			
		||||
                if (isEitherAssetERC721) {
 | 
			
		||||
                    throw new Error(
 | 
			
		||||
                        'Cannot test `TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount` together with ERC721 assets since orders involving ERC721 must always be filled exactly.',
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
                takerAssetFillAmount = fillableTakerAssetAmount.div(2).floor();
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw errorUtils.spawnSwitchErr('TakerAssetFillAmountScenario', takerAssetFillAmountScenario);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return takerAssetFillAmount;
 | 
			
		||||
    }
 | 
			
		||||
    private async _fillOrderAndAssertOutcomeAsync(
 | 
			
		||||
        signedOrder: SignedOrder,
 | 
			
		||||
        takerAssetFillAmount: BigNumber,
 | 
			
		||||
@@ -369,6 +637,11 @@ export class CoreCombinatorialUtils {
 | 
			
		||||
            signedOrder.makerAssetAmount,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        const beforeMakerAssetAllowanceOfMaker = await this.assetWrapper.getProxyAllowanceAsync(
 | 
			
		||||
            makerAddress,
 | 
			
		||||
            makerAssetData,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // - Let's fill the order!
 | 
			
		||||
        const txReceipt = await this.exchangeWrapper.fillOrderAsync(signedOrder, this.takerAddress, {
 | 
			
		||||
            takerAssetFillAmount,
 | 
			
		||||
 
 | 
			
		||||
@@ -201,7 +201,22 @@ export interface OrderScenario {
 | 
			
		||||
    takerAssetDataScenario: AssetDataScenario;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export enum TokenAmountScenario {
 | 
			
		||||
    Exact = 'EXACT',
 | 
			
		||||
    TooLow = 'TOO_LOW',
 | 
			
		||||
    Higher = 'HIGHER',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface TraderStateScenario {
 | 
			
		||||
    traderAssetBalance: TokenAmountScenario;
 | 
			
		||||
    traderAssetAllowance: TokenAmountScenario;
 | 
			
		||||
    zrxFeeBalance: TokenAmountScenario;
 | 
			
		||||
    zrxFeeAllowance: TokenAmountScenario;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface FillScenario {
 | 
			
		||||
    orderScenario: OrderScenario;
 | 
			
		||||
    takerAssetFillAmountScenario: TakerAssetFillAmountScenario;
 | 
			
		||||
    makerStateScenario: TraderStateScenario;
 | 
			
		||||
    takerStateScenario: TraderStateScenario;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -148,49 +148,6 @@ describe('Exchange core', () => {
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if maker erc20Balances are too low to fill order', async () => {
 | 
			
		||||
            signedOrder = orderFactory.newSignedOrder({
 | 
			
		||||
                makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18),
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            return expectRevertOrAlwaysFailingTransactionAsync(
 | 
			
		||||
                exchangeWrapper.fillOrderAsync(signedOrder, takerAddress),
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if taker erc20Balances are too low to fill order', async () => {
 | 
			
		||||
            signedOrder = orderFactory.newSignedOrder({
 | 
			
		||||
                takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18),
 | 
			
		||||
            });
 | 
			
		||||
            return expectRevertOrAlwaysFailingTransactionAsync(
 | 
			
		||||
                exchangeWrapper.fillOrderAsync(signedOrder, takerAddress),
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if maker allowances are too low to fill order', async () => {
 | 
			
		||||
            await web3Wrapper.awaitTransactionSuccessAsync(
 | 
			
		||||
                await erc20TokenA.approve.sendTransactionAsync(erc20Proxy.address, new BigNumber(0), {
 | 
			
		||||
                    from: makerAddress,
 | 
			
		||||
                }),
 | 
			
		||||
                constants.AWAIT_TRANSACTION_MINED_MS,
 | 
			
		||||
            );
 | 
			
		||||
            return expectRevertOrAlwaysFailingTransactionAsync(
 | 
			
		||||
                exchangeWrapper.fillOrderAsync(signedOrder, takerAddress),
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if taker allowances are too low to fill order', async () => {
 | 
			
		||||
            await web3Wrapper.awaitTransactionSuccessAsync(
 | 
			
		||||
                await erc20TokenB.approve.sendTransactionAsync(erc20Proxy.address, new BigNumber(0), {
 | 
			
		||||
                    from: takerAddress,
 | 
			
		||||
                }),
 | 
			
		||||
                constants.AWAIT_TRANSACTION_MINED_MS,
 | 
			
		||||
            );
 | 
			
		||||
            return expectRevertOrAlwaysFailingTransactionAsync(
 | 
			
		||||
                exchangeWrapper.fillOrderAsync(signedOrder, takerAddress),
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if no value is filled', async () => {
 | 
			
		||||
            signedOrder = orderFactory.newSignedOrder();
 | 
			
		||||
            await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress);
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ import {
 | 
			
		||||
    OrderScenario,
 | 
			
		||||
    TakerAssetFillAmountScenario,
 | 
			
		||||
    TakerScenario,
 | 
			
		||||
    TokenAmountScenario,
 | 
			
		||||
} from '../../src/utils/types';
 | 
			
		||||
 | 
			
		||||
chaiSetup.configure();
 | 
			
		||||
@@ -31,6 +32,18 @@ const defaultFillScenario = {
 | 
			
		||||
        takerAssetDataScenario: AssetDataScenario.ERC20NonZRXEighteenDecimals,
 | 
			
		||||
    },
 | 
			
		||||
    takerAssetFillAmountScenario: TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount,
 | 
			
		||||
    makerStateScenario: {
 | 
			
		||||
        traderAssetBalance: TokenAmountScenario.Higher,
 | 
			
		||||
        traderAssetAllowance: TokenAmountScenario.Higher,
 | 
			
		||||
        zrxFeeBalance: TokenAmountScenario.Higher,
 | 
			
		||||
        zrxFeeAllowance: TokenAmountScenario.Higher,
 | 
			
		||||
    },
 | 
			
		||||
    takerStateScenario: {
 | 
			
		||||
        traderAssetBalance: TokenAmountScenario.Higher,
 | 
			
		||||
        traderAssetAllowance: TokenAmountScenario.Higher,
 | 
			
		||||
        zrxFeeBalance: TokenAmountScenario.Higher,
 | 
			
		||||
        zrxFeeAllowance: TokenAmountScenario.Higher,
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
describe('FillOrder Tests', () => {
 | 
			
		||||
@@ -144,6 +157,50 @@ describe('FillOrder Tests', () => {
 | 
			
		||||
            };
 | 
			
		||||
            await coreCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if maker erc20Balances are too low to fill order', async () => {
 | 
			
		||||
            const fillScenario = {
 | 
			
		||||
                ...defaultFillScenario,
 | 
			
		||||
                makerStateScenario: {
 | 
			
		||||
                    ...defaultFillScenario.makerStateScenario,
 | 
			
		||||
                    traderAssetBalance: TokenAmountScenario.TooLow,
 | 
			
		||||
                },
 | 
			
		||||
            };
 | 
			
		||||
            await coreCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if taker erc20Balances are too low to fill order', async () => {
 | 
			
		||||
            const fillScenario = {
 | 
			
		||||
                ...defaultFillScenario,
 | 
			
		||||
                takerStateScenario: {
 | 
			
		||||
                    ...defaultFillScenario.makerStateScenario,
 | 
			
		||||
                    traderAssetBalance: TokenAmountScenario.TooLow,
 | 
			
		||||
                },
 | 
			
		||||
            };
 | 
			
		||||
            await coreCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if maker allowances are too low to fill order', async () => {
 | 
			
		||||
            const fillScenario = {
 | 
			
		||||
                ...defaultFillScenario,
 | 
			
		||||
                makerStateScenario: {
 | 
			
		||||
                    ...defaultFillScenario.makerStateScenario,
 | 
			
		||||
                    traderAssetAllowance: TokenAmountScenario.TooLow,
 | 
			
		||||
                },
 | 
			
		||||
            };
 | 
			
		||||
            await coreCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if taker allowances are too low to fill order', async () => {
 | 
			
		||||
            const fillScenario = {
 | 
			
		||||
                ...defaultFillScenario,
 | 
			
		||||
                takerStateScenario: {
 | 
			
		||||
                    ...defaultFillScenario.makerStateScenario,
 | 
			
		||||
                    traderAssetAllowance: TokenAmountScenario.TooLow,
 | 
			
		||||
                },
 | 
			
		||||
            };
 | 
			
		||||
            await coreCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('Testing Exchange of ERC721 Tokens', () => {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user