@@ -156,6 +156,8 @@ const formatTransaction = {
156156 blockNumber : allowNull ( checkNumber , null ) ,
157157 transactionIndex : allowNull ( checkNumber , null ) ,
158158
159+ confirmations : allowNull ( checkNumber , null ) ,
160+
159161 from : getAddress ,
160162
161163 gasPrice : bigNumberify ,
@@ -236,7 +238,7 @@ function checkTransactionResponse(transaction: any): TransactionResponse {
236238 if ( typeof ( networkId ) !== 'number' ) { networkId = 0 ; }
237239
238240 result . networkId = networkId ;
239-
241+
240242 // 0x0000... should actually be null
241243 if ( result . blockHash && result . blockHash . replace ( / 0 / g, '' ) === 'x' ) {
242244 result . blockHash = null ;
@@ -377,6 +379,7 @@ function checkLog(log: any): any {
377379 return check ( formatLog , log ) ;
378380}
379381
382+
380383//////////////////////////////
381384// Event Serializeing
382385
@@ -438,6 +441,13 @@ function getEventTag(eventName: EventType): string {
438441 throw new Error ( 'invalid event - ' + eventName ) ;
439442}
440443
444+ //////////////////////////////
445+ // Helper Object
446+
447+ function getTime ( ) {
448+ return ( new Date ( ) ) . getTime ( ) ;
449+ }
450+
441451//////////////////////////////
442452// Provider Object
443453
@@ -473,6 +483,10 @@ export class BaseProvider extends Provider {
473483 // string => BigNumber
474484 private _balances : any ;
475485
486+ private _fastBlockNumber : number ;
487+ private _fastBlockNumberPromise : Promise < number > ;
488+ private _fastQueryDate : number ;
489+
476490
477491 /**
478492 * ready
@@ -521,10 +535,13 @@ export class BaseProvider extends Provider {
521535 // until we get a response. This provides devs with a consistent view. Similarly for
522536 // transaction hashes.
523537 this . _emitted = { block : this . _lastBlockNumber } ;
538+
539+ this . _fastQueryDate = 0 ;
524540 }
525541
526542 private _doPoll ( ) : void {
527543 this . getBlockNumber ( ) . then ( ( blockNumber ) => {
544+ this . _setFastBlockNumber ( blockNumber ) ;
528545
529546 // If the block hasn't changed, meh.
530547 if ( blockNumber === this . _lastBlockNumber ) { return ; }
@@ -665,6 +682,38 @@ export class BaseProvider extends Provider {
665682 }
666683 }
667684
685+ _getFastBlockNumber ( ) : Promise < number > {
686+ let now = getTime ( ) ;
687+
688+ // Stale block number, request a newer value
689+ if ( ( now - this . _fastQueryDate ) > 2 * this . _pollingInterval ) {
690+ console . log ( 're-poll fbn' ) ;
691+ this . _fastQueryDate = now ;
692+ this . _fastBlockNumberPromise = this . getBlockNumber ( ) . then ( ( blockNumber ) => {
693+ if ( blockNumber > this . _fastBlockNumber ) {
694+ this . _fastBlockNumber = blockNumber ;
695+ }
696+ return this . _fastBlockNumber ;
697+ } ) ;
698+ }
699+
700+ return this . _fastBlockNumberPromise ;
701+ }
702+
703+ _setFastBlockNumber ( blockNumber : number ) : void {
704+ // Older block, maybe a stale request
705+ if ( blockNumber < this . _fastBlockNumber ) { return ; }
706+
707+ // Update the time we updated the blocknumber
708+ this . _fastQueryDate = getTime ( ) ;
709+
710+ // Newer block number, use it
711+ if ( blockNumber > this . _fastBlockNumber ) {
712+ this . _fastBlockNumber = blockNumber ;
713+ this . _fastBlockNumberPromise = Promise . resolve ( blockNumber ) ;
714+ }
715+ }
716+
668717 // @TODO : Add .poller which must be an event emitter with a 'start', 'stop' and 'block' event;
669718 // this will be used once we move to the WebSocket or other alternatives to polling
670719
@@ -680,8 +729,9 @@ export class BaseProvider extends Provider {
680729 getBlockNumber ( ) : Promise < number > {
681730 return this . ready . then ( ( ) => {
682731 return this . perform ( 'getBlockNumber' , { } ) . then ( ( result ) => {
683- var value = parseInt ( result ) ;
732+ let value = parseInt ( result ) ;
684733 if ( value != result ) { throw new Error ( 'invalid response - getBlockNumber' ) ; }
734+ this . _setFastBlockNumber ( value ) ;
685735 return value ;
686736 } ) ;
687737 } ) ;
@@ -892,7 +942,19 @@ export class BaseProvider extends Provider {
892942 }
893943 return undefined ;
894944 }
895- return BaseProvider . checkTransactionResponse ( result ) ;
945+
946+ let seq = Promise . resolve ( ) ;
947+ if ( result . blockNumber != null && result . confirmations == null ) {
948+ seq = this . _getFastBlockNumber ( ) . then ( ( blockNumber ) => {
949+ let confirmations = ( blockNumber - result . blockNumber ) + 1 ;
950+ if ( confirmations <= 0 ) { confirmations = 1 ; }
951+ result . confirmations = confirmations ;
952+ } ) ;
953+ }
954+
955+ return seq . then ( ( ) => {
956+ return BaseProvider . checkTransactionResponse ( result ) ;
957+ } ) ;
896958 } ) ;
897959 } , { onceBlock : this } ) ;
898960 } ) ;
0 commit comments