Validate maker balance and allowance & tests

This commit is contained in:
Leonid Logvinov 2017-06-02 12:20:18 +02:00
parent 9d9b6f7cc0
commit 2a0c6abbe7
No known key found for this signature in database
GPG Key ID: 0DD294BFDE8C95D4
2 changed files with 39 additions and 4 deletions

View File

@ -120,9 +120,9 @@ export class ExchangeWrapper extends ContractWrapper {
); );
this.throwErrorLogsAsErrors(response.logs); this.throwErrorLogsAsErrors(response.logs);
} }
private async validateFillOrderAsync(signedOrder: SignedOrder, fillAmount: BigNumber.BigNumber, private async validateFillOrderAsync(signedOrder: SignedOrder, fillTakerAmountInBaseUnits: BigNumber.BigNumber,
senderAddress: string) { senderAddress: string) {
if (fillAmount.eq(0)) { if (fillTakerAmountInBaseUnits.eq(0)) {
throw new Error(FillOrderValidationErrs.FILL_AMOUNT_IS_ZERO); throw new Error(FillOrderValidationErrs.FILL_AMOUNT_IS_ZERO);
} }
if (signedOrder.taker !== constants.NULL_ADDRESS && signedOrder.taker !== senderAddress) { if (signedOrder.taker !== constants.NULL_ADDRESS && signedOrder.taker !== senderAddress) {
@ -138,12 +138,22 @@ export class ExchangeWrapper extends ContractWrapper {
signedOrder.maker); signedOrder.maker);
const takerAllowance = await this.tokenWrapper.getProxyAllowanceAsync(signedOrder.takerTokenAddress, const takerAllowance = await this.tokenWrapper.getProxyAllowanceAsync(signedOrder.takerTokenAddress,
senderAddress); senderAddress);
if (fillAmount.greaterThan(takerBalance)) { // How many taker tokens would you get for 1 maker token;
const exchangeRate = signedOrder.takerTokenAmount.div(signedOrder.makerTokenAmount);
const fillMakerAmountInBaseUnits = fillTakerAmountInBaseUnits.div(exchangeRate);
if (fillTakerAmountInBaseUnits.greaterThan(takerBalance)) {
throw new Error(FillOrderValidationErrs.NOT_ENOUGH_TAKER_BALANCE); throw new Error(FillOrderValidationErrs.NOT_ENOUGH_TAKER_BALANCE);
} }
if (fillAmount.greaterThan(takerAllowance)) { if (fillTakerAmountInBaseUnits.greaterThan(takerAllowance)) {
throw new Error(FillOrderValidationErrs.NOT_ENOUGH_TAKER_ALLOWANCE); throw new Error(FillOrderValidationErrs.NOT_ENOUGH_TAKER_ALLOWANCE);
} }
if (fillMakerAmountInBaseUnits.greaterThan(makerBalance)) {
throw new Error(FillOrderValidationErrs.NOT_ENOUGH_MAKER_BALANCE);
}
if (fillMakerAmountInBaseUnits.greaterThan(makerAllowance)) {
throw new Error(FillOrderValidationErrs.NOT_ENOUGH_MAKER_ALLOWANCE);
}
} }
private throwErrorLogsAsErrors(logs: ContractEvent[]): void { private throwErrorLogsAsErrors(logs: ContractEvent[]): void {
const errEvent = _.find(logs, {event: 'LogError'}); const errEvent = _.find(logs, {event: 'LogError'});

View File

@ -180,6 +180,31 @@ describe('ExchangeWrapper', () => {
signedOrder, fillTakerAmountInBaseUnits, shouldCheckTransfer, signedOrder, fillTakerAmountInBaseUnits, shouldCheckTransfer,
)).to.be.rejectedWith(FillOrderValidationErrs.NOT_ENOUGH_TAKER_ALLOWANCE); )).to.be.rejectedWith(FillOrderValidationErrs.NOT_ENOUGH_TAKER_ALLOWANCE);
}); });
it('should throw when maker balance is less than maker fill amount', async () => {
const fillableAmount = new BigNumber(5);
const signedOrder = await fillScenarios.createAFillableSignedOrderAsync(
makerTokenAddress, takerTokenAddress, makerAddress, takerAddress, fillableAmount,
);
const lackingMakerBalance = new BigNumber(3);
await zeroEx.token.transferAsync(makerTokenAddress, makerAddress, coinBase, lackingMakerBalance);
zeroEx.setTransactionSenderAccount(takerAddress);
return expect(zeroEx.exchange.fillOrderAsync(
signedOrder, fillTakerAmountInBaseUnits, shouldCheckTransfer,
)).to.be.rejectedWith(FillOrderValidationErrs.NOT_ENOUGH_MAKER_BALANCE);
});
it('should throw when maker allowance is less than maker fill amount', async () => {
const fillableAmount = new BigNumber(5);
const signedOrder = await fillScenarios.createAFillableSignedOrderAsync(
makerTokenAddress, takerTokenAddress, makerAddress, takerAddress, fillableAmount,
);
const newAllowanceWhichIsLessThanFillAmount = fillTakerAmountInBaseUnits.minus(1);
await zeroEx.token.setProxyAllowanceAsync(makerTokenAddress, makerAddress,
newAllowanceWhichIsLessThanFillAmount);
zeroEx.setTransactionSenderAccount(takerAddress);
return expect(zeroEx.exchange.fillOrderAsync(
signedOrder, fillTakerAmountInBaseUnits, shouldCheckTransfer,
)).to.be.rejectedWith(FillOrderValidationErrs.NOT_ENOUGH_MAKER_ALLOWANCE);
});
}); });
describe('successful fills', () => { describe('successful fills', () => {
it('should fill the valid order', async () => { it('should fill the valid order', async () => {