From 5a8eb77ff0a6b00e4df5d933426e451c8ef09f7b Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 3 Jul 2017 11:39:26 -0700 Subject: Add initial implementation and tests for zeroEx.token.subscribeAsync --- src/utils/event_utils.ts | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/utils/event_utils.ts (limited to 'src/utils') diff --git a/src/utils/event_utils.ts b/src/utils/event_utils.ts new file mode 100644 index 000000000..c9d725a42 --- /dev/null +++ b/src/utils/event_utils.ts @@ -0,0 +1,44 @@ +import * as _ from 'lodash'; +import * as Web3 from 'web3'; +import {EventCallback, ContractEventArg, ContractEvent, ContractEventObj, ContractEventEmitter} from '../types'; +import * as BigNumber from 'bignumber.js'; +import promisify = require('es6-promisify'); + +export const eventUtils = { + /** + * Wrappes eventCallback function so that all the BigNumber arguments are wrapped in nwwer version of BigNumber + * @param eventCallback event callback function to be wrapped + * @return Wrapped event callback function + */ + getBigNumberWrappingEventCallback(eventCallback: EventCallback): EventCallback { + const bignumberWrappingEventCallback = (err: Error, event: ContractEvent) => { + if (_.isNull(err)) { + const wrapIfBigNumber = (value: ContractEventArg): ContractEventArg => { + // HACK: The old version of BigNumber used by Web3@0.19.0 does not support the `isBigNumber` + // and checking for a BigNumber instance using `instanceof` does not work either. We therefore + // compare the constructor functions of the possible BigNumber instance and the BigNumber used by + // Web3. + const web3BigNumber = (Web3.prototype as any).BigNumber; + const isWeb3BigNumber = web3BigNumber.toString() === value.constructor.toString(); + return isWeb3BigNumber ? new BigNumber(value) : value; + }; + event.args = _.mapValues(event.args, wrapIfBigNumber); + } + eventCallback(err, event); + }; + return bignumberWrappingEventCallback; + }, + wrapEventEmitter(event: ContractEventObj): ContractEventEmitter { + const watch = (eventCallback: EventCallback) => { + const bignumberWrappingEventCallback = eventUtils.getBigNumberWrappingEventCallback(eventCallback); + event.watch(bignumberWrappingEventCallback); + }; + const zeroExEvent = { + watch, + stopWatchingAsync: async () => { + await promisify(event.stopWatching, event)(); + }, + }; + return zeroExEvent; + }, +}; -- cgit v1.2.3 From 4fae4b449352ac73480a366dbae6d871f1c4fc61 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 3 Jul 2017 16:49:37 -0700 Subject: Fix comments --- src/utils/event_utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/utils') diff --git a/src/utils/event_utils.ts b/src/utils/event_utils.ts index c9d725a42..d3eeaecac 100644 --- a/src/utils/event_utils.ts +++ b/src/utils/event_utils.ts @@ -6,8 +6,8 @@ import promisify = require('es6-promisify'); export const eventUtils = { /** - * Wrappes eventCallback function so that all the BigNumber arguments are wrapped in nwwer version of BigNumber - * @param eventCallback event callback function to be wrapped + * Wraps eventCallback function so that all the BigNumber arguments are wrapped in a newer version of BigNumber. + * @param eventCallback Event callback function to be wrapped * @return Wrapped event callback function */ getBigNumberWrappingEventCallback(eventCallback: EventCallback): EventCallback { -- cgit v1.2.3 From 7b248096988e70c01cb6960846a27e9ad5a7ffda Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 3 Jul 2017 18:24:11 -0700 Subject: Register new schemas within schema validator --- src/utils/schema_validator.ts | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/utils') diff --git a/src/utils/schema_validator.ts b/src/utils/schema_validator.ts index e3f911adb..609d11a1a 100644 --- a/src/utils/schema_validator.ts +++ b/src/utils/schema_validator.ts @@ -3,6 +3,8 @@ import {ecSignatureSchema, ecSignatureParameterSchema} from '../schemas/ec_signa import {orderSchema, signedOrderSchema} from '../schemas/order_schemas'; import {addressSchema, numberSchema} from '../schemas/basic_type_schemas'; import {tokenSchema} from '../schemas/token_schema'; +import {subscriptionOptsSchema, blockParamSchema} from '../schemas/subscription_opts_schema'; +import {indexFilterValuesSchema} from '../schemas/index_filter_values_schema'; import {orderFillOrKillRequestsSchema} from '../schemas/order_fill_or_kill_requests_schema'; export class SchemaValidator { @@ -13,8 +15,11 @@ export class SchemaValidator { this.validator.addSchema(orderSchema, orderSchema.id); this.validator.addSchema(numberSchema, numberSchema.id); this.validator.addSchema(addressSchema, addressSchema.id); + this.validator.addSchema(blockParamSchema, blockParamSchema.id); this.validator.addSchema(ecSignatureSchema, ecSignatureSchema.id); this.validator.addSchema(signedOrderSchema, signedOrderSchema.id); + this.validator.addSchema(subscriptionOptsSchema, subscriptionOptsSchema.id); + this.validator.addSchema(indexFilterValuesSchema, indexFilterValuesSchema.id); this.validator.addSchema(ecSignatureParameterSchema, ecSignatureParameterSchema.id); this.validator.addSchema(orderFillOrKillRequestsSchema, orderFillOrKillRequestsSchema.id); } -- cgit v1.2.3 From 551b6db35e07907ad4dec767c8e76953fe98bb72 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 3 Jul 2017 22:31:59 -0700 Subject: Add orderHashSchema --- src/utils/schema_validator.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/utils') diff --git a/src/utils/schema_validator.ts b/src/utils/schema_validator.ts index 609d11a1a..20c160068 100644 --- a/src/utils/schema_validator.ts +++ b/src/utils/schema_validator.ts @@ -1,6 +1,6 @@ import {Validator, ValidatorResult, Schema} from 'jsonschema'; import {ecSignatureSchema, ecSignatureParameterSchema} from '../schemas/ec_signature_schema'; -import {orderSchema, signedOrderSchema} from '../schemas/order_schemas'; +import {orderSchema, signedOrderSchema, orderHashSchema} from '../schemas/order_schemas'; import {addressSchema, numberSchema} from '../schemas/basic_type_schemas'; import {tokenSchema} from '../schemas/token_schema'; import {subscriptionOptsSchema, blockParamSchema} from '../schemas/subscription_opts_schema'; @@ -15,6 +15,7 @@ export class SchemaValidator { this.validator.addSchema(orderSchema, orderSchema.id); this.validator.addSchema(numberSchema, numberSchema.id); this.validator.addSchema(addressSchema, addressSchema.id); + this.validator.addSchema(orderHashSchema, orderHashSchema.id); this.validator.addSchema(blockParamSchema, blockParamSchema.id); this.validator.addSchema(ecSignatureSchema, ecSignatureSchema.id); this.validator.addSchema(signedOrderSchema, signedOrderSchema.id); -- cgit v1.2.3 From b1c7291d3cfffb11a13c50a518f2b895bcdc9fc5 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 4 Jul 2017 10:27:31 -0700 Subject: Use orderHashSchema to validate order hash --- src/utils/assert.ts | 5 +---- src/utils/utils.ts | 4 ---- 2 files changed, 1 insertion(+), 8 deletions(-) (limited to 'src/utils') diff --git a/src/utils/assert.ts b/src/utils/assert.ts index 38c1d4aae..ec3790870 100644 --- a/src/utils/assert.ts +++ b/src/utils/assert.ts @@ -45,13 +45,10 @@ export const assert = { isNumber(variableName: string, value: number): void { this.assert(_.isFinite(value), this.typeAssertionMessage(variableName, 'number', value)); }, - isValidOrderHash(variableName: string, value: string): void { - this.assert(utils.isValidOrderHash(value), this.typeAssertionMessage(variableName, 'orderHash', value)); - }, isBoolean(variableName: string, value: boolean): void { this.assert(_.isBoolean(value), this.typeAssertionMessage(variableName, 'boolean', value)); }, - doesConformToSchema(variableName: string, value: object, schema: Schema): void { + doesConformToSchema(variableName: string, value: any, schema: Schema): void { const schemaValidator = new SchemaValidator(); const validationResult = schemaValidator.validate(value, schema); const hasValidationErrors = validationResult.errors.length > 0; diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 061e9f99a..ecc171bfe 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -25,10 +25,6 @@ export const utils = { isTestRpc(nodeVersion: string): boolean { return _.includes(nodeVersion, 'TestRPC'); }, - isValidOrderHash(orderHashHex: string): boolean { - const isValid = /^0x[0-9A-F]{64}$/i.test(orderHashHex); - return isValid; - }, spawnSwitchErr(name: string, value: any): Error { return new Error(`Unexpected switch value: ${value} encountered for ${name}`); }, -- cgit v1.2.3 From 40d1d30b5816c9631fd4a0aa9824c6fea0d11bec Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 4 Jul 2017 10:59:11 -0700 Subject: Add assert.doesBelongToStringEnum --- src/utils/assert.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/utils') diff --git a/src/utils/assert.ts b/src/utils/assert.ts index ec3790870..029b69321 100644 --- a/src/utils/assert.ts +++ b/src/utils/assert.ts @@ -5,6 +5,7 @@ import {Web3Wrapper} from '../web3_wrapper'; import {Schema} from 'jsonschema'; import {SchemaValidator} from './schema_validator'; import {utils} from './utils'; +import {StringEnum} from '../types'; const HEX_REGEX = /^0x[0-9A-F]*$/i; @@ -27,6 +28,16 @@ export const assert = { const web3 = new Web3(); this.assert(web3.isAddress(value), this.typeAssertionMessage(variableName, 'ETHAddressHex', value)); }, + doesBelongToStringEnum(variableName: string, value: string, stringEnum: StringEnum): void { + const doesBelongToStringEnum = !_.isUndefined(stringEnum[value]); + const enumValues = _.keys(stringEnum); + const enumValuesAsStrings = _.map(enumValues, enumValue => '\'' + enumValue + '\''); + const enumValuesAsString = enumValuesAsStrings.join(', '); + assert.assert( + doesBelongToStringEnum, + `Expected ${variableName} to be one of: ${enumValuesAsString}, encountered: ${value}`, + ); + }, async isSenderAddressAsync(variableName: string, senderAddressHex: string, web3Wrapper: Web3Wrapper): Promise { assert.isETHAddressHex(variableName, senderAddressHex); -- cgit v1.2.3 From 464c16be73bddce1ed675f642937b164f7add9d8 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 4 Jul 2017 17:33:35 -0700 Subject: move order hash schema to a separate file --- src/utils/schema_validator.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/utils') diff --git a/src/utils/schema_validator.ts b/src/utils/schema_validator.ts index 20c160068..58450ff20 100644 --- a/src/utils/schema_validator.ts +++ b/src/utils/schema_validator.ts @@ -1,6 +1,7 @@ import {Validator, ValidatorResult, Schema} from 'jsonschema'; import {ecSignatureSchema, ecSignatureParameterSchema} from '../schemas/ec_signature_schema'; -import {orderSchema, signedOrderSchema, orderHashSchema} from '../schemas/order_schemas'; +import {orderHashSchema} from '../schemas/order_hash_schema'; +import {orderSchema, signedOrderSchema} from '../schemas/order_schemas'; import {addressSchema, numberSchema} from '../schemas/basic_type_schemas'; import {tokenSchema} from '../schemas/token_schema'; import {subscriptionOptsSchema, blockParamSchema} from '../schemas/subscription_opts_schema'; -- cgit v1.2.3 From 6f73589d4075ff89717f12c04e28fea7131c40e5 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 4 Jul 2017 17:35:51 -0700 Subject: Use string template --- src/utils/assert.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/utils') diff --git a/src/utils/assert.ts b/src/utils/assert.ts index 029b69321..b3c30c11d 100644 --- a/src/utils/assert.ts +++ b/src/utils/assert.ts @@ -31,7 +31,7 @@ export const assert = { doesBelongToStringEnum(variableName: string, value: string, stringEnum: StringEnum): void { const doesBelongToStringEnum = !_.isUndefined(stringEnum[value]); const enumValues = _.keys(stringEnum); - const enumValuesAsStrings = _.map(enumValues, enumValue => '\'' + enumValue + '\''); + const enumValuesAsStrings = _.map(enumValues, enumValue => `'${enumValue}'`); const enumValuesAsString = enumValuesAsStrings.join(', '); assert.assert( doesBelongToStringEnum, -- cgit v1.2.3 From 4cb544f4f57c62ae40b8eb2dae1515c52f9a7ebf Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 4 Jul 2017 17:36:33 -0700 Subject: Add underscore in front of _getBigNumberWrappingEventCallback --- src/utils/event_utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/utils') diff --git a/src/utils/event_utils.ts b/src/utils/event_utils.ts index d3eeaecac..5829ffe99 100644 --- a/src/utils/event_utils.ts +++ b/src/utils/event_utils.ts @@ -10,7 +10,7 @@ export const eventUtils = { * @param eventCallback Event callback function to be wrapped * @return Wrapped event callback function */ - getBigNumberWrappingEventCallback(eventCallback: EventCallback): EventCallback { + _getBigNumberWrappingEventCallback(eventCallback: EventCallback): EventCallback { const bignumberWrappingEventCallback = (err: Error, event: ContractEvent) => { if (_.isNull(err)) { const wrapIfBigNumber = (value: ContractEventArg): ContractEventArg => { @@ -30,7 +30,7 @@ export const eventUtils = { }, wrapEventEmitter(event: ContractEventObj): ContractEventEmitter { const watch = (eventCallback: EventCallback) => { - const bignumberWrappingEventCallback = eventUtils.getBigNumberWrappingEventCallback(eventCallback); + const bignumberWrappingEventCallback = eventUtils._getBigNumberWrappingEventCallback(eventCallback); event.watch(bignumberWrappingEventCallback); }; const zeroExEvent = { -- cgit v1.2.3 From 9c4f3b2cbae3c00b3189f3043e50c0caacfd9186 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 4 Jul 2017 17:37:02 -0700 Subject: Rearrange methods in event utils --- src/utils/event_utils.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src/utils') diff --git a/src/utils/event_utils.ts b/src/utils/event_utils.ts index 5829ffe99..07418cbc4 100644 --- a/src/utils/event_utils.ts +++ b/src/utils/event_utils.ts @@ -5,6 +5,19 @@ import * as BigNumber from 'bignumber.js'; import promisify = require('es6-promisify'); export const eventUtils = { + wrapEventEmitter(event: ContractEventObj): ContractEventEmitter { + const watch = (eventCallback: EventCallback) => { + const bignumberWrappingEventCallback = eventUtils._getBigNumberWrappingEventCallback(eventCallback); + event.watch(bignumberWrappingEventCallback); + }; + const zeroExEvent = { + watch, + stopWatchingAsync: async () => { + await promisify(event.stopWatching, event)(); + }, + }; + return zeroExEvent; + }, /** * Wraps eventCallback function so that all the BigNumber arguments are wrapped in a newer version of BigNumber. * @param eventCallback Event callback function to be wrapped @@ -28,17 +41,4 @@ export const eventUtils = { }; return bignumberWrappingEventCallback; }, - wrapEventEmitter(event: ContractEventObj): ContractEventEmitter { - const watch = (eventCallback: EventCallback) => { - const bignumberWrappingEventCallback = eventUtils._getBigNumberWrappingEventCallback(eventCallback); - event.watch(bignumberWrappingEventCallback); - }; - const zeroExEvent = { - watch, - stopWatchingAsync: async () => { - await promisify(event.stopWatching, event)(); - }, - }; - return zeroExEvent; - }, }; -- cgit v1.2.3