Move signature validation into OrderValidationUtils.validateOrderFillableOrThrowAsync

This commit is contained in:
Fabio Berger
2018-11-10 00:14:48 +01:00
parent 773cf3cd14
commit 1f0ac47bd9
3 changed files with 16 additions and 15 deletions

View File

@@ -1120,17 +1120,6 @@ export class ExchangeWrapper extends ContractWrapper {
assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema); assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
assert.doesConformToSchema('opts', opts, validateOrderFillableOptsSchema); assert.doesConformToSchema('opts', opts, validateOrderFillableOptsSchema);
const orderHash = await orderHashUtils.getOrderHashHex(signedOrder);
const isValidSignature = await signatureUtils.isValidSignatureAsync(
this._web3Wrapper.getProvider(),
orderHash,
signedOrder.signature,
signedOrder.makerAddress,
);
if (!isValidSignature) {
throw new Error('INVALID_ORDER_SIGNATURE');
}
const balanceAllowanceFetcher = new AssetBalanceAndProxyAllowanceFetcher( const balanceAllowanceFetcher = new AssetBalanceAndProxyAllowanceFetcher(
this._erc20TokenWrapper, this._erc20TokenWrapper,
this._erc721TokenWrapper, this._erc721TokenWrapper,
@@ -1141,7 +1130,7 @@ export class ExchangeWrapper extends ContractWrapper {
const expectedFillTakerTokenAmountIfExists = opts.expectedFillTakerTokenAmount; const expectedFillTakerTokenAmountIfExists = opts.expectedFillTakerTokenAmount;
const filledCancelledFetcher = new OrderFilledCancelledFetcher(this, BlockParamLiteral.Latest); const filledCancelledFetcher = new OrderFilledCancelledFetcher(this, BlockParamLiteral.Latest);
const orderValidationUtils = new OrderValidationUtils(filledCancelledFetcher); const orderValidationUtils = new OrderValidationUtils(filledCancelledFetcher, this._web3Wrapper.getProvider());
await orderValidationUtils.validateOrderFillableOrThrowAsync( await orderValidationUtils.validateOrderFillableOrThrowAsync(
exchangeTradeSimulator, exchangeTradeSimulator,
signedOrder, signedOrder,
@@ -1169,7 +1158,7 @@ export class ExchangeWrapper extends ContractWrapper {
const exchangeTradeSimulator = new ExchangeTransferSimulator(balanceAllowanceStore); const exchangeTradeSimulator = new ExchangeTransferSimulator(balanceAllowanceStore);
const filledCancelledFetcher = new OrderFilledCancelledFetcher(this, BlockParamLiteral.Latest); const filledCancelledFetcher = new OrderFilledCancelledFetcher(this, BlockParamLiteral.Latest);
const orderValidationUtils = new OrderValidationUtils(filledCancelledFetcher); const orderValidationUtils = new OrderValidationUtils(filledCancelledFetcher, this._web3Wrapper.getProvider());
await orderValidationUtils.validateFillOrderThrowIfInvalidAsync( await orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
exchangeTradeSimulator, exchangeTradeSimulator,
this._web3Wrapper.getProvider(), this._web3Wrapper.getProvider(),

View File

@@ -392,7 +392,7 @@ export class FillOrderCombinatorialUtils {
); );
// 5. If I fill it by X, what are the resulting balances/allowances/filled amounts expected? // 5. If I fill it by X, what are the resulting balances/allowances/filled amounts expected?
const orderValidationUtils = new OrderValidationUtils(orderFilledCancelledFetcher); const orderValidationUtils = new OrderValidationUtils(orderFilledCancelledFetcher, provider);
const lazyStore = new BalanceAndProxyAllowanceLazyStore(balanceAndProxyAllowanceFetcher); const lazyStore = new BalanceAndProxyAllowanceLazyStore(balanceAndProxyAllowanceFetcher);
const exchangeTransferSimulator = new ExchangeTransferSimulator(lazyStore); const exchangeTransferSimulator = new ExchangeTransferSimulator(lazyStore);

View File

@@ -17,6 +17,7 @@ import { utils } from './utils';
*/ */
export class OrderValidationUtils { export class OrderValidationUtils {
private readonly _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher; private readonly _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher;
private readonly _provider: Provider;
/** /**
* A Typescript implementation mirroring the implementation of isRoundingError in the * A Typescript implementation mirroring the implementation of isRoundingError in the
* Exchange smart contract * Exchange smart contract
@@ -116,8 +117,9 @@ export class OrderValidationUtils {
* @param orderFilledCancelledFetcher A module that implements the AbstractOrderFilledCancelledFetcher * @param orderFilledCancelledFetcher A module that implements the AbstractOrderFilledCancelledFetcher
* @return An instance of OrderValidationUtils * @return An instance of OrderValidationUtils
*/ */
constructor(orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher) { constructor(orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher, provider: Provider) {
this._orderFilledCancelledFetcher = orderFilledCancelledFetcher; this._orderFilledCancelledFetcher = orderFilledCancelledFetcher;
this._provider = provider;
} }
// TODO(fabio): remove this method once the smart contracts have been refactored // TODO(fabio): remove this method once the smart contracts have been refactored
// to return helpful revert reasons instead of ORDER_UNFILLABLE. Instruct devs // to return helpful revert reasons instead of ORDER_UNFILLABLE. Instruct devs
@@ -137,6 +139,16 @@ export class OrderValidationUtils {
expectedFillTakerTokenAmount?: BigNumber, expectedFillTakerTokenAmount?: BigNumber,
): Promise<void> { ): Promise<void> {
const orderHash = orderHashUtils.getOrderHashHex(signedOrder); const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
const isValidSignature = await signatureUtils.isValidSignatureAsync(
this._provider,
orderHash,
signedOrder.signature,
signedOrder.makerAddress,
);
if (!isValidSignature) {
throw new Error('INVALID_ORDER_SIGNATURE');
}
const isCancelled = await this._orderFilledCancelledFetcher.isOrderCancelledAsync(signedOrder); const isCancelled = await this._orderFilledCancelledFetcher.isOrderCancelledAsync(signedOrder);
if (isCancelled) { if (isCancelled) {
throw new Error('CANCELLED'); throw new Error('CANCELLED');