From 2a25ece3636015e8429fe4556b62fc84545dc7c7 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 30 Oct 2017 15:01:20 +0200 Subject: Add empty implementation of order state watcher --- src/mempool/order_state_watcher.ts | 70 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/mempool/order_state_watcher.ts (limited to 'src/mempool/order_state_watcher.ts') diff --git a/src/mempool/order_state_watcher.ts b/src/mempool/order_state_watcher.ts new file mode 100644 index 000000000..89f84647d --- /dev/null +++ b/src/mempool/order_state_watcher.ts @@ -0,0 +1,70 @@ +import * as _ from 'lodash'; +import {schemas} from '0x-json-schemas'; +import {ZeroEx} from '../'; +import {EventWatcher} from './event_watcher'; +import {assert} from '../utils/assert'; +import {artifacts} from '../artifacts'; +import {AbiDecoder} from '../utils/abi_decoder'; +import {orderWatcherConfigSchema} from '../schemas/order_watcher_config_schema'; +import { + LogEvent, + SignedOrder, + Web3Provider, + LogWithDecodedArgs, + OrderWatcherConfig, + OnOrderStateChangeCallback, +} from '../types'; +import {Web3Wrapper} from '../web3_wrapper'; + +export class OrderStateWatcher { + private _orders = new Map(); + private _web3Wrapper: Web3Wrapper; + private _config: OrderWatcherConfig; + private _callback?: OnOrderStateChangeCallback; + private _eventWatcher?: EventWatcher; + private _abiDecoder: AbiDecoder; + constructor(provider: Web3Provider, config?: OrderWatcherConfig) { + assert.isWeb3Provider('provider', provider); + if (!_.isUndefined(config)) { + assert.doesConformToSchema('config', config, orderWatcherConfigSchema); + } + this._web3Wrapper = new Web3Wrapper(provider); + this._config = config || {}; + const artifactJSONs = _.values(artifacts); + const abiArrays = _.map(artifactJSONs, artifact => artifact.abi); + this._abiDecoder = new AbiDecoder(abiArrays); + } + public addOrder(signedOrder: SignedOrder): void { + assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema); + const orderHash = ZeroEx.getOrderHashHex(signedOrder); + this._orders.set(orderHash, signedOrder); + } + public removeOrder(signedOrder: SignedOrder): void { + assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema); + const orderHash = ZeroEx.getOrderHashHex(signedOrder); + this._orders.delete(orderHash); + } + public subscribe(callback: OnOrderStateChangeCallback): void { + assert.isFunction('callback', callback); + this._callback = callback; + this._eventWatcher = new EventWatcher( + this._web3Wrapper, this._config.mempoolPollingIntervalMs, + ); + this._eventWatcher.subscribe(this._onMempoolEventCallbackAsync.bind(this)); + } + public unsubscribe(): void { + delete this._callback; + if (!_.isUndefined(this._eventWatcher)) { + this._eventWatcher.unsubscribe(); + } + } + private async _onMempoolEventCallbackAsync(log: LogEvent): Promise { + const maybeDecodedLog = this._abiDecoder.tryToDecodeLogOrNoop(log); + if (!_.isUndefined((maybeDecodedLog as LogWithDecodedArgs).event)) { + await this._revalidateOrdersAsync(); + } + } + private async _revalidateOrdersAsync(): Promise { + _.noop(); + } +} -- cgit v1.2.3