Skip to content

Commit 2481581

Browse files
committed
Added automatic event parsing for contract transaction receipts from tx.wait.
1 parent f5c7ccb commit 2481581

File tree

4 files changed

+49
-5
lines changed

4 files changed

+49
-5
lines changed

src.ts/contract.ts

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ export interface Event extends Log {
5353
getTransactionReceipt: () => Promise<TransactionReceipt>;
5454
}
5555

56+
export interface ContractReceipt extends TransactionReceipt {
57+
events?: Array<Event>;
58+
}
59+
60+
export interface ContractTransaction extends TransactionResponse {
61+
wait(confirmations?: number): Promise<ContractReceipt>;
62+
}
63+
5664
///////////////////////////////
5765

5866
export class VoidSigner extends Signer {
@@ -256,7 +264,42 @@ function runMethod(contract: Contract, functionName: string, estimateOnly: boole
256264
errors.throwError('cannot override from in a transaction', errors.UNSUPPORTED_OPERATION, { operation: 'sendTransaction' })
257265
}
258266

259-
return contract.signer.sendTransaction(tx);
267+
return contract.signer.sendTransaction(tx).then((tx) => {
268+
let wait = tx.wait.bind(tx);
269+
270+
tx.wait = (confirmations?: number) => {
271+
return wait(confirmations).then((receipt: ContractReceipt) => {
272+
receipt.events = receipt.logs.map((log) => {
273+
let event: Event = (<Event>deepCopy(log));
274+
275+
let parsed = this.interface.parseLog(log);
276+
if (parsed) {
277+
event.args = parsed.values;
278+
event.decode = parsed.decode;
279+
event.event = parsed.name;
280+
event.eventSignature = parsed.signature;
281+
}
282+
283+
event.removeListener = () => { return this.provider; }
284+
event.getBlock = () => {
285+
return this.provider.getBlock(receipt.blockHash);
286+
}
287+
event.getTransaction = () => {
288+
return this.provider.getTransaction(receipt.transactionHash);
289+
}
290+
event.getTransactionReceipt = () => {
291+
return Promise.resolve(receipt);
292+
}
293+
294+
return event;
295+
});
296+
297+
return receipt;
298+
});
299+
};
300+
301+
return tx;
302+
});
260303
}
261304

262305
throw new Error('invalid type - ' + method.type);

src.ts/ethers.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { version } from './_version';
2626
////////////////////////
2727
// Types
2828

29-
import { ContractFunction, Event, EventFilter } from './contract';
29+
import { ContractFunction, ContractTransaction, Event, EventFilter } from './contract';
3030

3131

3232
////////////////////////
@@ -72,6 +72,7 @@ export {
7272
// Types
7373

7474
ContractFunction,
75+
ContractTransaction,
7576
Event,
7677
EventFilter
7778
};

src.ts/providers/abstract-provider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export interface TransactionResponse extends Transaction {
103103
raw?: string,
104104

105105
// This function waits until the transaction has been mined
106-
wait: (timeout?: number) => Promise<TransactionReceipt>
106+
wait: (confirmations?: number) => Promise<TransactionReceipt>
107107
};
108108

109109
export type EventType = string | Array<string> | Filter;

src.ts/providers/base-provider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -702,13 +702,13 @@ export class BaseProvider extends Provider {
702702

703703
_setFastBlockNumber(blockNumber: number): void {
704704
// Older block, maybe a stale request
705-
if (blockNumber < this._fastBlockNumber) { return; }
705+
if (this._fastBlockNumber != null && blockNumber < this._fastBlockNumber) { return; }
706706

707707
// Update the time we updated the blocknumber
708708
this._fastQueryDate = getTime();
709709

710710
// Newer block number, use it
711-
if (blockNumber > this._fastBlockNumber) {
711+
if (this._fastBlockNumber == null || blockNumber > this._fastBlockNumber) {
712712
this._fastBlockNumber = blockNumber;
713713
this._fastBlockNumberPromise = Promise.resolve(blockNumber);
714714
}

0 commit comments

Comments
 (0)