Stop passing exchangeAddress into getOrderHash and instead get it from the artifacts
This commit is contained in:
69
src/0x.js.ts
69
src/0x.js.ts
@@ -19,6 +19,7 @@ import {TokenWrapper} from './contract_wrappers/token_wrapper';
|
||||
import {SolidityTypes, ECSignature, ZeroExError} from './types';
|
||||
import {Order} from './types';
|
||||
import {orderSchema} from './schemas/order_schemas';
|
||||
import * as ExchangeArtifacts from '../artifacts/Exchange.json';
|
||||
|
||||
// Customize our BigNumber instances
|
||||
bigNumberConfigs.configure();
|
||||
@@ -32,34 +33,6 @@ export class ZeroEx {
|
||||
public tokenRegistry: TokenRegistryWrapper;
|
||||
public token: TokenWrapper;
|
||||
private web3Wrapper: Web3Wrapper;
|
||||
/**
|
||||
* Computes the orderHash given the order parameters and returns it as a hex encoded string.
|
||||
*/
|
||||
public static getOrderHashHex(exchangeContractAddr: string, order: Order): string {
|
||||
assert.doesConformToSchema('order',
|
||||
SchemaValidator.convertToJSONSchemaCompatibleObject(order as object),
|
||||
orderSchema);
|
||||
|
||||
const orderParts = [
|
||||
{value: exchangeContractAddr, type: SolidityTypes.address},
|
||||
{value: order.maker, type: SolidityTypes.address},
|
||||
{value: order.taker, type: SolidityTypes.address},
|
||||
{value: order.makerTokenAddress, type: SolidityTypes.address},
|
||||
{value: order.takerTokenAddress, type: SolidityTypes.address},
|
||||
{value: order.feeRecipient, type: SolidityTypes.address},
|
||||
{value: utils.bigNumberToBN(order.makerTokenAmount), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.takerTokenAmount), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.makerFee), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.takerFee), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.expirationUnixTimestampSec), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.salt), type: SolidityTypes.uint256},
|
||||
];
|
||||
const types = _.map(orderParts, o => o.type);
|
||||
const values = _.map(orderParts, o => o.value);
|
||||
const hashBuff = ethABI.soliditySHA3(types, values);
|
||||
const hashHex = ethUtil.bufferToHex(hashBuff);
|
||||
return hashHex;
|
||||
}
|
||||
/**
|
||||
* Verifies that the elliptic curve signature `signature` was generated
|
||||
* by signing `data` with the private key corresponding to the `signerAddressHex` address.
|
||||
@@ -150,6 +123,35 @@ export class ZeroEx {
|
||||
public setDefaultAccount(account: string): void {
|
||||
this.web3Wrapper.setDefaultAccount(account);
|
||||
}
|
||||
/**
|
||||
* Computes the orderHash given the order parameters and returns it as a hex encoded string.
|
||||
*/
|
||||
public async getOrderHashHexAsync(order: Order): Promise<string> {
|
||||
const exchangeContractAddr = await this.getExchangeAddressAsync();
|
||||
assert.doesConformToSchema('order',
|
||||
SchemaValidator.convertToJSONSchemaCompatibleObject(order as object),
|
||||
orderSchema);
|
||||
|
||||
const orderParts = [
|
||||
{value: exchangeContractAddr, type: SolidityTypes.address},
|
||||
{value: order.maker, type: SolidityTypes.address},
|
||||
{value: order.taker, type: SolidityTypes.address},
|
||||
{value: order.makerTokenAddress, type: SolidityTypes.address},
|
||||
{value: order.takerTokenAddress, type: SolidityTypes.address},
|
||||
{value: order.feeRecipient, type: SolidityTypes.address},
|
||||
{value: utils.bigNumberToBN(order.makerTokenAmount), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.takerTokenAmount), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.makerFee), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.takerFee), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.expirationUnixTimestampSec), type: SolidityTypes.uint256},
|
||||
{value: utils.bigNumberToBN(order.salt), type: SolidityTypes.uint256},
|
||||
];
|
||||
const types = _.map(orderParts, o => o.type);
|
||||
const values = _.map(orderParts, o => o.value);
|
||||
const hashBuff = ethABI.soliditySHA3(types, values);
|
||||
const hashHex = ethUtil.bufferToHex(hashBuff);
|
||||
return hashHex;
|
||||
}
|
||||
/**
|
||||
* Signs an orderHash and returns it's elliptic curve signature
|
||||
* This method currently supports TestRPC, Geth and Parity above and below V1.6.6
|
||||
@@ -207,4 +209,15 @@ export class ZeroEx {
|
||||
}
|
||||
return ecSignature;
|
||||
}
|
||||
private async getExchangeAddressAsync() {
|
||||
const networkIdIfExists = await this.web3Wrapper.getNetworkIdIfExistsAsync();
|
||||
const exchangeNetworkConfigsIfExists = _.isUndefined(networkIdIfExists) ?
|
||||
undefined :
|
||||
(ExchangeArtifacts as any).networks[networkIdIfExists];
|
||||
if (_.isUndefined(exchangeNetworkConfigsIfExists)) {
|
||||
throw new Error(ZeroExError.CONTRACT_NOT_DEPLOYED_ON_NETWORK);
|
||||
}
|
||||
const exchangeAddress = exchangeNetworkConfigsIfExists.address;
|
||||
return exchangeAddress;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,27 +43,6 @@ describe('ZeroEx library', () => {
|
||||
expect((tokenRegistryWeb3WrapperProvider as any).zeroExTestId).to.be.a('number');
|
||||
});
|
||||
});
|
||||
describe('#getOrderHash', () => {
|
||||
const expectedOrderHash = '0x103a5e97dab5dbeb8f385636f86a7d1e458a7ccbe1bd194727f0b2f85ab116c7';
|
||||
const order: Order = {
|
||||
maker: constants.NULL_ADDRESS,
|
||||
taker: constants.NULL_ADDRESS,
|
||||
feeRecipient: constants.NULL_ADDRESS,
|
||||
makerTokenAddress: constants.NULL_ADDRESS,
|
||||
takerTokenAddress: constants.NULL_ADDRESS,
|
||||
salt: new BigNumber(0),
|
||||
makerFee: new BigNumber(0),
|
||||
takerFee: new BigNumber(0),
|
||||
makerTokenAmount: new BigNumber(0),
|
||||
takerTokenAmount: new BigNumber(0),
|
||||
expirationUnixTimestampSec: new BigNumber(0),
|
||||
};
|
||||
const exchangeAddress = constants.NULL_ADDRESS;
|
||||
it('calculates the order hash', () => {
|
||||
const orderHash = ZeroEx.getOrderHashHex(exchangeAddress, order);
|
||||
expect(orderHash).to.be.equal(expectedOrderHash);
|
||||
});
|
||||
});
|
||||
describe('#isValidSignature', () => {
|
||||
// This test data was borrowed from the JSON RPC documentation
|
||||
// Source: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign
|
||||
@@ -174,6 +153,28 @@ describe('ZeroEx library', () => {
|
||||
expect(baseUnitAmount).to.be.bignumber.equal(expectedUnitAmount);
|
||||
});
|
||||
});
|
||||
describe('#getOrderHashAsync', () => {
|
||||
const expectedOrderHash = '0x103a5e97dab5dbeb8f385636f86a7d1e458a7ccbe1bd194727f0b2f85ab116c7';
|
||||
const order: Order = {
|
||||
maker: constants.NULL_ADDRESS,
|
||||
taker: constants.NULL_ADDRESS,
|
||||
feeRecipient: constants.NULL_ADDRESS,
|
||||
makerTokenAddress: constants.NULL_ADDRESS,
|
||||
takerTokenAddress: constants.NULL_ADDRESS,
|
||||
salt: new BigNumber(0),
|
||||
makerFee: new BigNumber(0),
|
||||
takerFee: new BigNumber(0),
|
||||
makerTokenAmount: new BigNumber(0),
|
||||
takerTokenAmount: new BigNumber(0),
|
||||
expirationUnixTimestampSec: new BigNumber(0),
|
||||
};
|
||||
it('calculates the order hash', async () => {
|
||||
const web3 = web3Factory.create();
|
||||
const zeroEx = new ZeroEx(web3);
|
||||
const orderHash = await zeroEx.getOrderHashHexAsync(order);
|
||||
expect(orderHash).to.be.equal(expectedOrderHash);
|
||||
});
|
||||
});
|
||||
describe('#signOrderHashAsync', () => {
|
||||
let stubs: Sinon.SinonStub[] = [];
|
||||
afterEach(() => {
|
||||
|
||||
@@ -16,8 +16,6 @@ export const orderFactory = {
|
||||
takerTokenAmount: BigNumber.BigNumber|number,
|
||||
takerTokenAddress: string,
|
||||
expirationUnixTimestampSec?: BigNumber.BigNumber): Promise<SignedOrder> {
|
||||
// TODO refactor and check
|
||||
const exchangeAddress: string = (ExchangeArtifacts as any).networks[networkId].address;
|
||||
const INF_TIMESTAMP = new BigNumber(2524604400);
|
||||
expirationUnixTimestampSec = _.isUndefined(expirationUnixTimestampSec) ?
|
||||
INF_TIMESTAMP :
|
||||
@@ -35,7 +33,7 @@ export const orderFactory = {
|
||||
feeRecipient: constants.NULL_ADDRESS,
|
||||
expirationUnixTimestampSec,
|
||||
};
|
||||
const orderHash = ZeroEx.getOrderHashHex(exchangeAddress, order);
|
||||
const orderHash = await zeroEx.getOrderHashHexAsync(order);
|
||||
const ecSignature = await zeroEx.signOrderHashAsync(orderHash);
|
||||
const signedOrder: SignedOrder = _.assign(order, {ecSignature});
|
||||
return signedOrder;
|
||||
|
||||
Reference in New Issue
Block a user