Skip to content

Commit 9797b36

Browse files
committed
Added confirmations to TransactionResponse (ethers-io#156, ethers-io#238).
1 parent 731f189 commit 9797b36

File tree

2 files changed

+67
-3
lines changed

2 files changed

+67
-3
lines changed

src.ts/providers/abstract-provider.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ export interface TransactionResponse extends Transaction {
9393
blockHash?: string,
9494
timestamp?: number,
9595

96+
confirmations: number,
97+
9698
// Not optional (as it is in Transaction)
9799
from: string;
98100

src.ts/providers/base-provider.ts

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)