diff options
-rw-r--r-- | src/stores/block_store.ts | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/stores/block_store.ts b/src/stores/block_store.ts new file mode 100644 index 000000000..d1b4d3c54 --- /dev/null +++ b/src/stores/block_store.ts @@ -0,0 +1,38 @@ +import * as _ from 'lodash'; +import * as Web3 from 'web3'; +import {BigNumber} from 'bignumber.js'; +import {BlockParamLiteral, InternalZeroExError} from '../types'; +import {Web3Wrapper} from '../web3_wrapper'; + +/** + * Store for a current latest block number + */ +export class BlockStore { + private web3Wrapper?: Web3Wrapper; + private latestBlockNumber?: number; + constructor(web3Wrapper?: Web3Wrapper) { + this.web3Wrapper = web3Wrapper; + // TODO start a subscription + } + public getBlockNumberWithNConfirmations(numConfirmations: number): Web3.BlockParam { + let blockNumber; + if (numConfirmations === 0) { + blockNumber = BlockParamLiteral.Pending; + } else if (numConfirmations === 1) { + // HACK: We special-case `numConfirmations === 1` so that we can use this block store without actually + // setting `latestBlockNumber` when block number is latest (in order validation) whhich allows us to omit + // an async call in a constructor of `ExchangeTransferSimulator` + blockNumber = BlockParamLiteral.Latest; + } else { + if (_.isUndefined(this.latestBlockNumber)) { + throw new Error(InternalZeroExError.LatestBlockNumberNotSet); + } + // Latest block already has 1 confirmation + blockNumber = this.latestBlockNumber - numConfirmations + 1; + } + return blockNumber; + } + public setLatestBlock(latestBlockNumber: number): void { + this.latestBlockNumber = latestBlockNumber; + } +} |