diff options
Diffstat (limited to 'packages/contracts')
4 files changed, 41 insertions, 8 deletions
diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/libs/LibOrder.sol b/packages/contracts/src/contracts/current/protocol/Exchange/libs/LibOrder.sol index 34ea62ef1..ed7f9391d 100644 --- a/packages/contracts/src/contracts/current/protocol/Exchange/libs/LibOrder.sol +++ b/packages/contracts/src/contracts/current/protocol/Exchange/libs/LibOrder.sol @@ -20,9 +20,12 @@ pragma solidity ^0.4.24; contract LibOrder { + bytes32 constant DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256( + "DomainSeparator(address contract)" + ); + bytes32 constant ORDER_SCHEMA_HASH = keccak256( "Order(", - "address exchangeAddress,", "address makerAddress,", "address takerAddress,", "address feeRecipientAddress,", @@ -73,9 +76,10 @@ contract LibOrder { // TODO: EIP712 is not finalized yet // Source: https://github.com/ethereum/EIPs/pull/712 orderHash = keccak256( + DOMAIN_SEPARATOR_SCHEMA_HASH, + keccak256(address(this)), ORDER_SCHEMA_HASH, keccak256( - address(this), order.makerAddress, order.takerAddress, order.feeRecipientAddress, diff --git a/packages/contracts/src/contracts/current/test/TestLibs/TestLibs.sol b/packages/contracts/src/contracts/current/test/TestLibs/TestLibs.sol index c791fa0f9..bd01277dd 100644 --- a/packages/contracts/src/contracts/current/test/TestLibs/TestLibs.sol +++ b/packages/contracts/src/contracts/current/test/TestLibs/TestLibs.sol @@ -77,6 +77,14 @@ contract TestLibs is return ORDER_SCHEMA_HASH; } + function getDomainSeparatorSchemaHash() + public + view + returns (bytes32) + { + return DOMAIN_SEPARATOR_SCHEMA_HASH; + } + function publicAddFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults) public pure diff --git a/packages/contracts/src/utils/order_utils.ts b/packages/contracts/src/utils/order_utils.ts index 688259b6c..969d43dd1 100644 --- a/packages/contracts/src/utils/order_utils.ts +++ b/packages/contracts/src/utils/order_utils.ts @@ -2,7 +2,7 @@ import { BigNumber } from '@0xproject/utils'; import ethUtil = require('ethereumjs-util'); 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) => { @@ -37,10 +37,19 @@ export const orderUtils = { }; return orderStruct; }, + 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([ 'Order(', - 'address exchangeAddress,', 'address makerAddress,', 'address takerAddress,', 'address feeRecipientAddress,', @@ -63,7 +72,6 @@ export const orderUtils = { const takerAssetDataHash = crypto.solSHA3([ethUtil.toBuffer(order.takerAssetData)]); const orderParamsHashBuff = crypto.solSHA3([ - order.exchangeAddress, order.makerAddress, order.takerAddress, order.feeRecipientAddress, @@ -79,7 +87,14 @@ export const orderUtils = { ]); const orderParamsHashHex = `0x${orderParamsHashBuff.toString('hex')}`; const orderSchemaHashHex = orderUtils.getOrderSchemaHex(); - const orderHashBuff = crypto.solSHA3([new BigNumber(orderSchemaHashHex), new BigNumber(orderParamsHashHex)]); + 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 { diff --git a/packages/contracts/test/exchange/libs.ts b/packages/contracts/test/exchange/libs.ts index e48e7cc33..ad971e08a 100644 --- a/packages/contracts/test/exchange/libs.ts +++ b/packages/contracts/test/exchange/libs.ts @@ -57,13 +57,19 @@ describe('Exchange libs', () => { describe('LibOrder', () => { describe('getOrderSchema', () => { - it('should output the correct orderHash', async () => { + it('should output the correct order schema hash', async () => { const orderSchema = await libs.getOrderSchemaHash.callAsync(); expect(orderUtils.getOrderSchemaHex()).to.be.equal(orderSchema); }); }); + describe('getDomainSeparatorSchema', () => { + it('should output the correct domain separator schema hash', async () => { + const domainSeparatorSchema = await libs.getDomainSeparatorSchemaHash.callAsync(); + expect(orderUtils.getDomainSeparatorSchemaHex()).to.be.equal(domainSeparatorSchema); + }); + }); describe('getOrderHash', () => { - it('should output the correct orderHash', async () => { + it('should output the correct order hash', async () => { const orderHashHex = await libs.publicGetOrderHash.callAsync(signedOrder); expect(orderUtils.getOrderHashHex(signedOrder)).to.be.equal(orderHashHex); }); |