aboutsummaryrefslogtreecommitdiffstats
path: root/packages/contracts
diff options
context:
space:
mode:
authorJacob Evans <jacob@dekz.net>2018-05-24 08:27:49 +0800
committerFabio Berger <me@fabioberger.com>2018-05-25 07:00:22 +0800
commit3cc8af819c9f62f42e7cb3d03f896b35cfc10d05 (patch)
treea03f912c39990d7925390d02cdef73b8ef1b3ea9 /packages/contracts
parentfcf4a958c3daa4dd7911de48001a8e235c9eb5ac (diff)
downloaddexon-0x-contracts-3cc8af819c9f62f42e7cb3d03f896b35cfc10d05.tar.gz
dexon-0x-contracts-3cc8af819c9f62f42e7cb3d03f896b35cfc10d05.tar.zst
dexon-0x-contracts-3cc8af819c9f62f42e7cb3d03f896b35cfc10d05.zip
Use domain separator for exchange address
Diffstat (limited to 'packages/contracts')
-rw-r--r--packages/contracts/src/contracts/current/protocol/Exchange/libs/LibOrder.sol8
-rw-r--r--packages/contracts/src/contracts/current/test/TestLibs/TestLibs.sol8
-rw-r--r--packages/contracts/src/utils/order_utils.ts23
-rw-r--r--packages/contracts/test/exchange/libs.ts10
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);
});