aboutsummaryrefslogtreecommitdiffstats
path: root/src/order_watcher/order_state_watcher.ts
diff options
context:
space:
mode:
authorLeonid Logvinov <logvinov.leon@gmail.com>2017-11-11 06:30:55 +0800
committerLeonid Logvinov <logvinov.leon@gmail.com>2017-11-13 09:06:13 +0800
commit009f81fe4f8dd8ed6b671d309553a6d04edd90ca (patch)
tree56524cf7b3e1933d69acd29535346fe930b155e4 /src/order_watcher/order_state_watcher.ts
parent81ce4a02290cc38e6dc30873c18b0f9c8c9c4db3 (diff)
downloaddexon-sol-tools-009f81fe4f8dd8ed6b671d309553a6d04edd90ca.tar
dexon-sol-tools-009f81fe4f8dd8ed6b671d309553a6d04edd90ca.tar.gz
dexon-sol-tools-009f81fe4f8dd8ed6b671d309553a6d04edd90ca.tar.bz2
dexon-sol-tools-009f81fe4f8dd8ed6b671d309553a6d04edd90ca.tar.lz
dexon-sol-tools-009f81fe4f8dd8ed6b671d309553a6d04edd90ca.tar.xz
dexon-sol-tools-009f81fe4f8dd8ed6b671d309553a6d04edd90ca.tar.zst
dexon-sol-tools-009f81fe4f8dd8ed6b671d309553a6d04edd90ca.zip
Clear store cache on events
Diffstat (limited to 'src/order_watcher/order_state_watcher.ts')
-rw-r--r--src/order_watcher/order_state_watcher.ts101
1 files changed, 71 insertions, 30 deletions
diff --git a/src/order_watcher/order_state_watcher.ts b/src/order_watcher/order_state_watcher.ts
index affb350a3..c4914fc64 100644
--- a/src/order_watcher/order_state_watcher.ts
+++ b/src/order_watcher/order_state_watcher.ts
@@ -14,8 +14,13 @@ import {
Web3Provider,
BlockParamLiteral,
LogWithDecodedArgs,
+ ContractEventArgs,
OnOrderStateChangeCallback,
OrderStateWatcherConfig,
+ ApprovalContractEventArgs,
+ TransferContractEventArgs,
+ LogFillContractEventArgs,
+ LogCancelContractEventArgs,
ExchangeEvents,
TokenEvents,
ZeroExError,
@@ -54,25 +59,46 @@ export class OrderStateWatcher {
private _token: TokenWrapper;
private _exchange: ExchangeWrapper;
private _abiDecoder: AbiDecoder;
- private _orderStateUtils?: OrderStateUtils;
- private _blockStore?: BlockStore;
+ private _orderStateUtils: OrderStateUtils;
+ private _blockStore: BlockStore;
private _numConfirmations: number;
- private _orderFilledCancelledLazyStore?: OrderFilledCancelledLazyStore;
- private _balanceAndProxyAllowanceLazyStore?: BalanceAndProxyAllowanceLazyStore;
+ private _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
+ private _balanceAndProxyAllowanceLazyStore: BalanceAndProxyAllowanceLazyStore;
constructor(
web3Wrapper: Web3Wrapper, abiDecoder: AbiDecoder, token: TokenWrapper, exchange: ExchangeWrapper,
config?: OrderStateWatcherConfig,
) {
+<<<<<<< HEAD
const eventPollingIntervalMs = _.isUndefined(config) ? undefined : config.pollingIntervalMs;
this._numConfirmations = _.isUndefined(config) ?
DEFAULT_NUM_CONFIRMATIONS
: config.numConfirmations;
- this._eventWatcher = new EventWatcher(
- web3Wrapper, eventPollingIntervalMs, this._numConfirmations,
- );
+=======
+ this._orders = {};
this._abiDecoder = abiDecoder;
this._token = token;
this._exchange = exchange;
+ this._web3Wrapper = web3Wrapper;
+ this._dependentOrderHashes = {};
+ const eventPollingIntervalMs = _.isUndefined(config) ? undefined : config.eventPollingIntervalMs;
+ const blockPollingIntervalMs = _.isUndefined(config) ? undefined : config.blockPollingIntervalMs;
+ this._numConfirmations = (_.isUndefined(config) || _.isUndefined(config.numConfirmations)) ?
+ DEFAULT_NUM_CONFIRMATIONS :
+ config.numConfirmations;
+>>>>>>> Clear store cache on events
+ this._eventWatcher = new EventWatcher(
+ web3Wrapper, eventPollingIntervalMs, this._numConfirmations,
+ );
+ this._blockStore = new BlockStore(this._web3Wrapper, blockPollingIntervalMs);
+ this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(
+ this._token, this._blockStore, this._numConfirmations,
+ );
+ this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(
+ this._exchange, this._blockStore, this._numConfirmations,
+ );
+ this._orderStateUtils = new OrderStateUtils(
+ this._balanceAndProxyAllowanceLazyStore, this._orderFilledCancelledLazyStore,
+ );
}
/**
* Add an order to the orderStateWatcher. Before the order is added, it's
@@ -110,17 +136,7 @@ export class OrderStateWatcher {
if (!_.isUndefined(this._callbackIfExistsAsync)) {
throw new Error(ZeroExError.SubscriptionAlreadyPresent);
}
- this._blockStore = new BlockStore(this._web3Wrapper);
await this._blockStore.startAsync();
- this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(
- this._token, this._blockStore, this._numConfirmations,
- );
- this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(
- this._exchange, this._blockStore, this._numConfirmations,
- );
- this._orderStateUtils = new OrderStateUtils(
- this._balanceAndProxyAllowanceLazyStore, this._orderFilledCancelledLazyStore,
- );
this._callbackIfExistsAsync = callback;
this._eventWatcher.subscribe(this._onEventWatcherCallbackAsync.bind(this));
}
@@ -128,15 +144,11 @@ export class OrderStateWatcher {
* Ends an orderStateWatcher subscription.
*/
public unsubscribe(): void {
- if (_.isUndefined(this._blockStore)) {
+ if (_.isUndefined(this._callbackIfExistsAsync)) {
throw new Error(ZeroExError.SubscriptionNotFound);
}
this._blockStore.stop();
- delete this._blockStore;
delete this._callbackIfExistsAsync;
- delete this._balanceAndProxyAllowanceLazyStore;
- delete this._orderFilledCancelledLazyStore;
- delete this._orderStateUtils;
this._eventWatcher.unsubscribe();
}
private async _onEventWatcherCallbackAsync(log: LogEvent): Promise<void> {
@@ -145,40 +157,69 @@ export class OrderStateWatcher {
if (!isLogDecoded) {
return; // noop
}
- const decodedLog = maybeDecodedLog as LogWithDecodedArgs<any>;
+ const decodedLog = maybeDecodedLog as LogWithDecodedArgs<ContractEventArgs>;
let makerToken: string;
let makerAddress: string;
let orderHashesSet: Set<string>;
switch (decodedLog.event) {
case TokenEvents.Approval:
+ {
+ // Invalidate cache
+ const args = decodedLog.args as ApprovalContractEventArgs;
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(decodedLog.address, args._owner);
makerToken = decodedLog.address;
- makerAddress = decodedLog.args._owner;
+ makerAddress = args._owner;
orderHashesSet = _.get(this._dependentOrderHashes, [makerAddress, makerToken]);
if (!_.isUndefined(orderHashesSet)) {
const orderHashes = Array.from(orderHashesSet);
await this._emitRevalidateOrdersAsync(orderHashes);
}
break;
-
+ }
case TokenEvents.Transfer:
+ {
+ // Invalidate cache
+ const args = decodedLog.args as TransferContractEventArgs;
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._from);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._to);
+ // Revalidate orders
makerToken = decodedLog.address;
- makerAddress = decodedLog.args._from;
+ makerAddress = args._from;
orderHashesSet = _.get(this._dependentOrderHashes, [makerAddress, makerToken]);
if (!_.isUndefined(orderHashesSet)) {
const orderHashes = Array.from(orderHashesSet);
await this._emitRevalidateOrdersAsync(orderHashes);
}
break;
-
+ }
case ExchangeEvents.LogFill:
+ {
+ // Invalidate cache
+ const args = decodedLog.args as LogFillContractEventArgs;
+ this._orderFilledCancelledLazyStore.deleteFilledTakerAmount(args.orderHash);
+ this._orderFilledCancelledLazyStore.deleteFilledTakerAmount(args.orderHash);
+ // Revalidate orders
+ const orderHash = args.orderHash;
+ const isOrderWatched = !_.isUndefined(this._orders[orderHash]);
+ if (isOrderWatched) {
+ await this._emitRevalidateOrdersAsync([orderHash]);
+ }
+ break;
+ }
case ExchangeEvents.LogCancel:
- const orderHash = decodedLog.args.orderHash;
- const isOrderWatched = !_.isUndefined(this._orderByOrderHash[orderHash]);
+ {
+ // Invalidate cache
+ const args = decodedLog.args as LogCancelContractEventArgs;
+ this._orderFilledCancelledLazyStore.deleteCancelledTakerAmount(args.orderHash);
+ this._orderFilledCancelledLazyStore.deleteCancelledTakerAmount(args.orderHash);
+ // Revalidate orders
+ const orderHash = args.orderHash;
+ const isOrderWatched = !_.isUndefined(this._orders[orderHash]);
if (isOrderWatched) {
await this._emitRevalidateOrdersAsync([orderHash]);
}
break;
-
+ }
case ExchangeEvents.LogError:
return; // noop