aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/0x.js.ts69
-rw-r--r--test/0x.js_test.ts43
-rw-r--r--test/utils/order_factory.ts8
3 files changed, 66 insertions, 54 deletions
diff --git a/src/0x.js.ts b/src/0x.js.ts
index a29c25e0c..19e38aafe 100644
--- a/src/0x.js.ts
+++ b/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();
@@ -33,34 +34,6 @@ export class ZeroEx {
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.
*/
@@ -151,6 +124,35 @@ export class ZeroEx {
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;
+ }
}
diff --git a/test/0x.js_test.ts b/test/0x.js_test.ts
index f2bb40d75..8c5e9c929 100644
--- a/test/0x.js_test.ts
+++ b/test/0x.js_test.ts
@@ -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(() => {
diff --git a/test/utils/order_factory.ts b/test/utils/order_factory.ts
index 3195803ad..c0d70f39b 100644
--- a/test/utils/order_factory.ts
+++ b/test/utils/order_factory.ts
@@ -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,9 +33,9 @@ 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;
- }
-}
+ },
+};