Update Order-utils to check magic values

This commit is contained in:
Jacob Evans
2019-08-19 11:14:35 +10:00
parent bddfdacfad
commit f528a3e1de
4 changed files with 23 additions and 20 deletions

View File

@@ -38,7 +38,7 @@ export class IValidatorContract extends BaseContract {
* @param hash Message hash that is signed. * @param hash Message hash that is signed.
* @param signerAddress Address that should have signed the given hash. * @param signerAddress Address that should have signed the given hash.
* @param signature Proof of signing. * @param signature Proof of signing.
* @returns Validity of order signature. * @returns Magic bytes4 value if the signature is valid. Magic value is bytes4(keccak256("isValidValidatorSignature(address,bytes32,address,bytes)"))
*/ */
async callAsync( async callAsync(
hash: string, hash: string,
@@ -46,7 +46,7 @@ export class IValidatorContract extends BaseContract {
signature: string, signature: string,
callData: Partial<CallData> = {}, callData: Partial<CallData> = {},
defaultBlock?: BlockParam, defaultBlock?: BlockParam,
): Promise<boolean> { ): Promise<string> {
assert.isString('hash', hash); assert.isString('hash', hash);
assert.isString('signerAddress', signerAddress); assert.isString('signerAddress', signerAddress);
assert.isString('signature', signature); assert.isString('signature', signature);
@@ -80,7 +80,7 @@ export class IValidatorContract extends BaseContract {
BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); BaseContract._throwIfRevertWithReasonCallResult(rawCallResult);
const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,address,bytes)'); const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,address,bytes)');
// tslint:disable boolean-naming // tslint:disable boolean-naming
const result = abiEncoder.strictDecodeReturnValue<boolean>(rawCallResult); const result = abiEncoder.strictDecodeReturnValue<string>(rawCallResult);
// tslint:enable boolean-naming // tslint:enable boolean-naming
return result; return result;
}, },
@@ -104,18 +104,18 @@ export class IValidatorContract extends BaseContract {
]); ]);
return abiEncodedTransactionData; return abiEncodedTransactionData;
}, },
getABIDecodedTransactionData(callData: string): boolean { getABIDecodedTransactionData(callData: string): string {
const self = (this as any) as IValidatorContract; const self = (this as any) as IValidatorContract;
const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,address,bytes)'); const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,address,bytes)');
// tslint:disable boolean-naming // tslint:disable boolean-naming
const abiDecodedCallData = abiEncoder.strictDecode<boolean>(callData); const abiDecodedCallData = abiEncoder.strictDecode<string>(callData);
return abiDecodedCallData; return abiDecodedCallData;
}, },
getABIDecodedReturnData(returnData: string): boolean { getABIDecodedReturnData(returnData: string): string {
const self = (this as any) as IValidatorContract; const self = (this as any) as IValidatorContract;
const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,address,bytes)'); const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,address,bytes)');
// tslint:disable boolean-naming // tslint:disable boolean-naming
const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<boolean>(returnData); const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<string>(returnData);
return abiDecodedReturnData; return abiDecodedReturnData;
}, },
}; };
@@ -208,7 +208,7 @@ export class IValidatorContract extends BaseContract {
outputs: [ outputs: [
{ {
name: 'isValid', name: 'isValid',
type: 'bool', type: 'bytes4',
}, },
], ],
payable: false, payable: false,

View File

@@ -37,14 +37,14 @@ export class IWalletContract extends BaseContract {
* since they don't modify state. * since they don't modify state.
* @param hash Message hash that is signed. * @param hash Message hash that is signed.
* @param signature Proof of signing. * @param signature Proof of signing.
* @returns Validity of order signature. * @returns Magic bytes4 value if the signature is valid. Magic value is bytes4(keccak256(&quot;isValidWalletSignature(bytes32,address,bytes)&quot;))
*/ */
async callAsync( async callAsync(
hash: string, hash: string,
signature: string, signature: string,
callData: Partial<CallData> = {}, callData: Partial<CallData> = {},
defaultBlock?: BlockParam, defaultBlock?: BlockParam,
): Promise<boolean> { ): Promise<string> {
assert.isString('hash', hash); assert.isString('hash', hash);
assert.isString('signature', signature); assert.isString('signature', signature);
assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [
@@ -73,7 +73,7 @@ export class IWalletContract extends BaseContract {
BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); BaseContract._throwIfRevertWithReasonCallResult(rawCallResult);
const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,bytes)'); const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,bytes)');
// tslint:disable boolean-naming // tslint:disable boolean-naming
const result = abiEncoder.strictDecodeReturnValue<boolean>(rawCallResult); const result = abiEncoder.strictDecodeReturnValue<string>(rawCallResult);
// tslint:enable boolean-naming // tslint:enable boolean-naming
return result; return result;
}, },
@@ -94,18 +94,18 @@ export class IWalletContract extends BaseContract {
]); ]);
return abiEncodedTransactionData; return abiEncodedTransactionData;
}, },
getABIDecodedTransactionData(callData: string): boolean { getABIDecodedTransactionData(callData: string): string {
const self = (this as any) as IWalletContract; const self = (this as any) as IWalletContract;
const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,bytes)'); const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,bytes)');
// tslint:disable boolean-naming // tslint:disable boolean-naming
const abiDecodedCallData = abiEncoder.strictDecode<boolean>(callData); const abiDecodedCallData = abiEncoder.strictDecode<string>(callData);
return abiDecodedCallData; return abiDecodedCallData;
}, },
getABIDecodedReturnData(returnData: string): boolean { getABIDecodedReturnData(returnData: string): string {
const self = (this as any) as IWalletContract; const self = (this as any) as IWalletContract;
const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,bytes)'); const abiEncoder = self._lookupAbiEncoder('isValidSignature(bytes32,bytes)');
// tslint:disable boolean-naming // tslint:disable boolean-naming
const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<boolean>(returnData); const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<string>(returnData);
return abiDecodedReturnData; return abiDecodedReturnData;
}, },
}; };
@@ -194,7 +194,7 @@ export class IWalletContract extends BaseContract {
outputs: [ outputs: [
{ {
name: 'isValid', name: 'isValid',
type: 'bool', type: 'bytes4',
}, },
], ],
payable: false, payable: false,

View File

@@ -150,4 +150,6 @@ export const constants = {
MULTI_ASSET_METHOD_ABI, MULTI_ASSET_METHOD_ABI,
ERC1155_METHOD_ABI, ERC1155_METHOD_ABI,
STATIC_CALL_METHOD_ABI, STATIC_CALL_METHOD_ABI,
IS_VALID_WALLET_SIGNATURE_MAGIC_VALUE: '0xb0671381',
IS_VALID_VALIDATOR_SIGNATURE_MAGIC_VALUE: '0x42b38674',
}; };

View File

@@ -17,6 +17,7 @@ import * as ethUtil from 'ethereumjs-util';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { assert } from './assert'; import { assert } from './assert';
import { constants } from './constants';
import { eip712Utils } from './eip712_utils'; import { eip712Utils } from './eip712_utils';
import { orderHashUtils } from './order_hash'; import { orderHashUtils } from './order_hash';
import { transactionHashUtils } from './transaction_hash'; import { transactionHashUtils } from './transaction_hash';
@@ -135,8 +136,8 @@ export const signatureUtils = {
// tslint:disable-next-line:custom-no-magic-numbers // tslint:disable-next-line:custom-no-magic-numbers
const signatureWithoutType = signature.slice(0, -2); const signatureWithoutType = signature.slice(0, -2);
const walletContract = new IWalletContract(signerAddress, provider); const walletContract = new IWalletContract(signerAddress, provider);
const isValid = await walletContract.isValidSignature.callAsync(data, signatureWithoutType); const magicValue = await walletContract.isValidSignature.callAsync(data, signatureWithoutType);
return isValid; return magicValue === constants.IS_VALID_WALLET_SIGNATURE_MAGIC_VALUE;
}, },
/** /**
* Verifies that the provided validator signature is valid according to the 0x Protocol smart contracts * Verifies that the provided validator signature is valid according to the 0x Protocol smart contracts
@@ -169,12 +170,12 @@ export const signatureUtils = {
} }
const validatorContract = new IValidatorContract(signerAddress, provider); const validatorContract = new IValidatorContract(signerAddress, provider);
const isValid = await validatorContract.isValidSignature.callAsync( const magicValue = await validatorContract.isValidSignature.callAsync(
data, data,
signerAddress, signerAddress,
validatorSignature.signature, validatorSignature.signature,
); );
return isValid; return magicValue === constants.IS_VALID_VALIDATOR_SIGNATURE_MAGIC_VALUE;
}, },
/** /**
* Checks if the supplied elliptic curve signature corresponds to signing `data` with * Checks if the supplied elliptic curve signature corresponds to signing `data` with