From d4ee0e862297c16f8ee62efccd31f1193052c64e Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Mon, 18 Jun 2018 20:59:23 +1000 Subject: Rebase and update feedback Cache the domain separator data with address this Use the EIP712Types enum for types everywhere Rename EIP712 struct ExecuteTransaction to ZeroExTransaction --- packages/order-utils/src/eip712_utils.ts | 24 ++++++------------------ packages/order-utils/src/index.ts | 2 +- packages/order-utils/src/order_hash.ts | 26 +++++++++++++------------- packages/order-utils/src/types.ts | 10 +++++++++- 4 files changed, 29 insertions(+), 33 deletions(-) (limited to 'packages/order-utils/src') diff --git a/packages/order-utils/src/eip712_utils.ts b/packages/order-utils/src/eip712_utils.ts index e54ca0e83..00edd2531 100644 --- a/packages/order-utils/src/eip712_utils.ts +++ b/packages/order-utils/src/eip712_utils.ts @@ -4,7 +4,7 @@ import * as _ from 'lodash'; import { assetProxyUtils } from './asset_proxy_utils'; import { crypto } from './crypto'; -import { EIP712Schema } from './types'; +import { EIP712Schema, EIP712Types } from './types'; const EIP191_PREFIX = '\x19\x01'; const EIP712_DOMAIN_NAME = '0x Protocol'; @@ -12,22 +12,14 @@ const EIP712_DOMAIN_VERSION = '2'; const EIP712_VALUE_LENGTH = 32; const EIP712_DOMAIN_SCHEMA: EIP712Schema = { - name: 'DomainSeparator', + name: 'EIP712Domain', parameters: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'contract', type: 'address' }, + { name: 'name', type: EIP712Types.String }, + { name: 'version', type: EIP712Types.String }, + { name: 'verifyingContract', type: EIP712Types.Address }, ], }; -enum EIP712Types { - String = 'string', - Bytes = 'bytes', - Address = 'address', - Bytes32 = 'bytes32', - Uint256 = 'uint256', -} - export const EIP712Utils = { /** * Compiles the EIP712Schema and returns the hash of the schema. @@ -67,7 +59,7 @@ export const EIP712Utils = { const encodedData = EIP712Utils._encodeData(EIP712_DOMAIN_SCHEMA, { name: EIP712_DOMAIN_NAME, version: EIP712_DOMAIN_VERSION, - contract: exchangeAddress, + verifyingContract: exchangeAddress, }); const domainSeparatorHashBuff2 = crypto.solSHA3([domainSeparatorSchemaBuffer, ...encodedData]); return domainSeparatorHashBuff2; @@ -79,18 +71,14 @@ export const EIP712Utils = { return encodedType; }, _encodeData(schema: EIP712Schema, data: { [key: string]: any }): any { - const encodedTypes = []; const encodedValues = []; for (const parameter of schema.parameters) { const value = data[parameter.name]; if (parameter.type === EIP712Types.String || parameter.type === EIP712Types.Bytes) { - encodedTypes.push(EIP712Types.Bytes32); encodedValues.push(crypto.solSHA3([ethUtil.toBuffer(value)])); } else if (parameter.type === EIP712Types.Uint256) { - encodedTypes.push(EIP712Types.Uint256); encodedValues.push(value); } else if (parameter.type === EIP712Types.Address) { - encodedTypes.push(EIP712Types.Address); encodedValues.push(EIP712Utils.pad32Address(value)); } else { throw new Error(`Unable to encode ${parameter.type}`); diff --git a/packages/order-utils/src/index.ts b/packages/order-utils/src/index.ts index caa996621..5122e60fc 100644 --- a/packages/order-utils/src/index.ts +++ b/packages/order-utils/src/index.ts @@ -4,7 +4,7 @@ export { orderFactory } from './order_factory'; export { constants } from './constants'; export { crypto } from './crypto'; export { generatePseudoRandomSalt } from './salt'; -export { OrderError, MessagePrefixType, MessagePrefixOpts, EIP712Parameter, EIP712Schema } from './types'; +export { OrderError, MessagePrefixType, MessagePrefixOpts, EIP712Parameter, EIP712Schema, EIP712Types } from './types'; export { AbstractBalanceAndProxyAllowanceFetcher } from './abstract/abstract_balance_and_proxy_allowance_fetcher'; export { AbstractOrderFilledCancelledFetcher } from './abstract/abstract_order_filled_cancelled_fetcher'; export { RemainingFillableCalculator } from './remaining_fillable_calculator'; diff --git a/packages/order-utils/src/order_hash.ts b/packages/order-utils/src/order_hash.ts index 46cce4b3b..61f6c978f 100644 --- a/packages/order-utils/src/order_hash.ts +++ b/packages/order-utils/src/order_hash.ts @@ -10,25 +10,25 @@ import * as _ from 'lodash'; import { assert } from './assert'; import { crypto } from './crypto'; import { EIP712Utils } from './eip712_utils'; -import { EIP712Schema } from './types'; +import { EIP712Schema, EIP712Types } from './types'; const INVALID_TAKER_FORMAT = 'instance.takerAddress is not of a type(s) string'; const EIP712_ORDER_SCHEMA: EIP712Schema = { name: 'Order', parameters: [ - { name: 'makerAddress', type: 'address' }, - { name: 'takerAddress', type: 'address' }, - { name: 'feeRecipientAddress', type: 'address' }, - { name: 'senderAddress', type: 'address' }, - { name: 'makerAssetAmount', type: 'uint256' }, - { name: 'takerAssetAmount', type: 'uint256' }, - { name: 'makerFee', type: 'uint256' }, - { name: 'takerFee', type: 'uint256' }, - { name: 'expirationTimeSeconds', type: 'uint256' }, - { name: 'salt', type: 'uint256' }, - { name: 'makerAssetData', type: 'bytes' }, - { name: 'takerAssetData', type: 'bytes' }, + { name: 'makerAddress', type: EIP712Types.Address }, + { name: 'takerAddress', type: EIP712Types.Address }, + { name: 'feeRecipientAddress', type: EIP712Types.Address }, + { name: 'senderAddress', type: EIP712Types.Address }, + { name: 'makerAssetAmount', type: EIP712Types.Uint256 }, + { name: 'takerAssetAmount', type: EIP712Types.Uint256 }, + { name: 'makerFee', type: EIP712Types.Uint256 }, + { name: 'takerFee', type: EIP712Types.Uint256 }, + { name: 'expirationTimeSeconds', type: EIP712Types.Uint256 }, + { name: 'salt', type: EIP712Types.Uint256 }, + { name: 'makerAssetData', type: EIP712Types.Bytes }, + { name: 'takerAssetData', type: EIP712Types.Bytes }, ], }; diff --git a/packages/order-utils/src/types.ts b/packages/order-utils/src/types.ts index 858c0e18b..daa4aee11 100644 --- a/packages/order-utils/src/types.ts +++ b/packages/order-utils/src/types.ts @@ -26,10 +26,18 @@ export interface MessagePrefixOpts { export interface EIP712Parameter { name: string; - type: string; + type: EIP712Types; } export interface EIP712Schema { name: string; parameters: EIP712Parameter[]; } + +export enum EIP712Types { + String = 'string', + Bytes = 'bytes', + Address = 'address', + Bytes32 = 'bytes32', + Uint256 = 'uint256', +} -- cgit v1.2.3