Update order hash to match latest eip712

This commit is contained in:
Jacob Evans
2018-05-08 15:31:56 +10:00
committed by Fabio Berger
parent bc550c3265
commit 65676c22f9
4 changed files with 57 additions and 34 deletions

View File

@@ -21,19 +21,21 @@ pragma solidity ^0.4.24;
contract LibOrder {
bytes32 constant ORDER_SCHEMA_HASH = keccak256(
"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 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,",
")"
);
struct Order {
@@ -84,8 +86,8 @@ contract LibOrder {
order.takerFee,
order.expirationTimeSeconds,
order.salt,
order.makerAssetData,
order.takerAssetData
keccak256(order.makerAssetData),
keccak256(order.takerAssetData)
)
);
return orderHash;

View File

@@ -69,6 +69,14 @@ contract TestLibs is
return orderHash;
}
function publicGetOrderSchemaHash()
public
view
returns (bytes32)
{
return ORDER_SCHEMA_HASH;
}
function publicAddFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)
public
pure

View File

@@ -1,7 +1,5 @@
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';
@@ -39,22 +37,31 @@ export const orderUtils = {
};
return orderStruct;
},
getOrderHashBuff(order: SignedOrder | UnsignedOrder): Buffer {
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 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,',
')',
]);
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,
@@ -67,11 +74,11 @@ 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 orderSchemaHashHex = orderUtils.getOrderSchemaHex();
const orderHashBuff = crypto.solSHA3([new BigNumber(orderSchemaHashHex), new BigNumber(orderParamsHashHex)]);
return orderHashBuff;
},

View File

@@ -56,6 +56,12 @@ describe('Exchange libs', () => {
});
describe('LibOrder', () => {
describe('getOrderSchema', () => {
it('should output the correct orderHash', async () => {
const orderSchema = await libs.publicGetOrderSchemaHash.callAsync();
expect(orderUtils.getOrderSchemaHex()).to.be.equal(orderSchema);
});
});
describe('getOrderHash', () => {
it('should output the correct orderHash', async () => {
const orderHashHex = await libs.publicGetOrderHash.callAsync(signedOrder);