aboutsummaryrefslogtreecommitdiffstats
path: root/packages/contracts/src/utils/order_utils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/contracts/src/utils/order_utils.ts')
-rw-r--r--packages/contracts/src/utils/order_utils.ts69
1 files changed, 46 insertions, 23 deletions
diff --git a/packages/contracts/src/utils/order_utils.ts b/packages/contracts/src/utils/order_utils.ts
index 8adc6b735..78ac934a1 100644
--- a/packages/contracts/src/utils/order_utils.ts
+++ b/packages/contracts/src/utils/order_utils.ts
@@ -1,10 +1,9 @@
+import { Order, SignedOrder, UnsignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
import ethUtil = require('ethereumjs-util');
-import * as _ from 'lodash';
import { crypto } from './crypto';
-import { CancelOrder, MatchOrder, OrderStruct, SignatureType, SignedOrder, UnsignedOrder } from './types';
+import { CancelOrder, MatchOrder, OrderStruct, SignedOrder, UnsignedOrder } from './types';
export const orderUtils = {
createFill: (signedOrder: SignedOrder, takerAssetFillAmount?: BigNumber) => {
@@ -22,7 +21,7 @@ export const orderUtils = {
};
return cancel;
},
- getOrderStruct(signedOrder: SignedOrder): OrderStruct {
+ getOrderStruct(signedOrder: SignedOrder): Order {
const orderStruct = {
senderAddress: signedOrder.senderAddress,
makerAddress: signedOrder.makerAddress,
@@ -39,24 +38,41 @@ export const orderUtils = {
};
return orderStruct;
},
- getOrderHashBuff(order: SignedOrder | UnsignedOrder): Buffer {
+ getDomainSeparatorSchemaHex(): string {
+ const domainSeparatorSchemaHashBuff = crypto.solSHA3(['DomainSeparator(address contract)']);
+ const schemaHashHex = `0x${domainSeparatorSchemaHashBuff.toString('hex')}`;
+ return schemaHashHex;
+ },
+ getDomainSeparatorHashHex(exchangeAddress: string): string {
+ const domainSeparatorHashBuff = crypto.solSHA3([exchangeAddress]);
+ const domainSeparatorHashHex = `0x${domainSeparatorHashBuff.toString('hex')}`;
+ return domainSeparatorHashHex;
+ },
+ getOrderSchemaHex(): string {
const orderSchemaHashBuff = crypto.solSHA3([
- 'address exchangeAddress',
- 'address makerAddress',
- 'address takerAddress',
- 'address feeRecipientAddress',
- 'address senderAddress',
- 'uint256 makerAssetAmount',
- 'uint256 takerAssetAmount',
- 'uint256 makerFee',
- 'uint256 takerFee',
- 'uint256 expirationTimeSeconds',
- 'uint256 salt',
- 'bytes makerAssetData',
- 'bytes takerAssetData',
+ 'Order(',
+ 'address makerAddress,',
+ 'address takerAddress,',
+ 'address feeRecipientAddress,',
+ 'address senderAddress,',
+ 'uint256 makerAssetAmount,',
+ 'uint256 takerAssetAmount,',
+ 'uint256 makerFee,',
+ 'uint256 takerFee,',
+ 'uint256 expirationTimeSeconds,',
+ 'uint256 salt,',
+ 'bytes makerAssetData,',
+ 'bytes takerAssetData,',
+ ')',
]);
+ const schemaHashHex = `0x${orderSchemaHashBuff.toString('hex')}`;
+ return schemaHashHex;
+ },
+ getOrderHashBuff(order: SignedOrder | UnsignedOrder): Buffer {
+ const makerAssetDataHash = crypto.solSHA3([ethUtil.toBuffer(order.makerAssetData)]);
+ const takerAssetDataHash = crypto.solSHA3([ethUtil.toBuffer(order.takerAssetData)]);
+
const orderParamsHashBuff = crypto.solSHA3([
- order.exchangeAddress,
order.makerAddress,
order.takerAddress,
order.feeRecipientAddress,
@@ -67,12 +83,19 @@ export const orderUtils = {
order.takerFee,
order.expirationTimeSeconds,
order.salt,
- ethUtil.toBuffer(order.makerAssetData),
- ethUtil.toBuffer(order.takerAssetData),
+ makerAssetDataHash,
+ takerAssetDataHash,
]);
- const orderSchemaHashHex = `0x${orderSchemaHashBuff.toString('hex')}`;
const orderParamsHashHex = `0x${orderParamsHashBuff.toString('hex')}`;
- const orderHashBuff = crypto.solSHA3([new BigNumber(orderSchemaHashHex), new BigNumber(orderParamsHashHex)]);
+ const orderSchemaHashHex = orderUtils.getOrderSchemaHex();
+ const domainSeparatorHashHex = this.getDomainSeparatorHashHex(order.exchangeAddress);
+ const domainSeparatorSchemaHex = this.getDomainSeparatorSchemaHex();
+ const orderHashBuff = crypto.solSHA3([
+ new BigNumber(domainSeparatorSchemaHex),
+ new BigNumber(domainSeparatorHashHex),
+ new BigNumber(orderSchemaHashHex),
+ new BigNumber(orderParamsHashHex),
+ ]);
return orderHashBuff;
},
getOrderHashHex(order: SignedOrder | UnsignedOrder): string {