Skip to content

Commit 68399ea

Browse files
committed
fixing DI for TxStatusWaiter
1 parent 70d884d commit 68399ea

File tree

4 files changed

+25
-20
lines changed

4 files changed

+25
-20
lines changed

packages/sequencer/src/protocol/baselayer/MinaBaseLayer.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
SequencerModule,
1414
} from "../../sequencer/builder/SequencerModule";
1515
import { MinaTransactionSender } from "../../settlement/transactions/MinaTransactionSender";
16+
import { TxStatusWaiter } from "../../settlement/transactions/TxStatusWaiter";
1617
import { DefaultOutgoingMessageAdapter } from "../../settlement/messages/outgoing/DefaultOutgoingMessageAdapter";
1718

1819
import { BaseLayer } from "./BaseLayer";
@@ -93,6 +94,10 @@ export class MinaBaseLayer
9394
useClass: MinaTransactionSender,
9495
},
9596

97+
TxStatusWaiter: {
98+
useClass: TxStatusWaiter,
99+
},
100+
96101
L1TransactionDispatcherConfig: {
97102
useValue: {
98103
...DEFAULT_L1_TRANSACTION_DISPATCHER_CONFIG,

packages/sequencer/src/settlement/transactions/L1TransactionDispatcher.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export class L1TransactionDispatcher {
3535
@inject("L1TransactionRetryStrategy")
3636
private readonly retryStrategy: L1TransactionRetryStrategy,
3737
@inject("SettlementSigner") private readonly signer: MinaSigner,
38-
private readonly waiter: TxStatusWaiter,
38+
@inject("TxStatusWaiter") private readonly waiter: TxStatusWaiter,
3939
@inject("L1TransactionDispatcherConfig")
4040
private readonly config: Required<DispatcherConfig>,
4141
@inject("BaseLayer")

packages/sequencer/src/settlement/transactions/MinaTransactionSender.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export class MinaTransactionSender implements Closeable {
3434
@inject("SettlementSigner") private readonly signer: MinaSigner,
3535
@inject("FeeStrategy") private readonly feeStrategy: FeeStrategy,
3636
private readonly dispatcher: L1TransactionDispatcher,
37-
private readonly waiter: TxStatusWaiter
37+
@inject("TxStatusWaiter") private readonly waiter: TxStatusWaiter
3838
) {
3939
this.dispatcher.start();
4040
}
@@ -90,6 +90,9 @@ export class MinaTransactionSender implements Closeable {
9090
queuedAt: now,
9191
nextActionAt: now,
9292
});
93+
log.info(
94+
`MinaTransactionSender: queued transaction ${txnId} for sender ${sender} nonce ${nonceNum}`
95+
);
9396

9497
this.dispatcher.requestDispatch(sender);
9598

packages/sequencer/src/settlement/transactions/TxStatusWaiter.ts

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { inject, injectable } from "tsyringe";
22
import {
33
EventsRecord,
44
ReplayingSingleUseEventEmitter,
5+
log,
56
} from "@proto-kit/common";
67

78
import {
@@ -50,10 +51,12 @@ export class TxStatusWaiter {
5051

5152
public notifyIncluded(txId: string, hash: string) {
5253
this.getEmitter(txId).emit("included", { hash });
54+
this.emitters.delete(txId);
5355
}
5456

5557
public notifyFailed(txId: string, error: unknown) {
5658
this.getEmitter(txId).emit("failed", { error });
59+
this.emitters.delete(txId);
5760
}
5861

5962
private static isSatisfied(
@@ -77,6 +80,9 @@ export class TxStatusWaiter {
7780
): Promise<void> {
7881
const initial = await this.pendingStorage.findById(txId);
7982
if (!initial) {
83+
log.info(
84+
`TxStatusWaiter: waitFor(${desiredStatus}) unknown txId=${txId}`
85+
);
8086
throw new Error(`Unknown pending L1 transaction id ${txId}`);
8187
}
8288
if (initial.status === "failed") {
@@ -89,25 +95,20 @@ export class TxStatusWaiter {
8995
const emitter = this.getEmitter(txId);
9096
const eventPromise = new Promise<void>((resolve, reject) => {
9197
emitter.on(desiredStatus, () => {
98+
log.info(
99+
`TxStatusWaiter: waitFor(${desiredStatus}) resolved by event txId=${txId}`
100+
);
92101
resolve();
93102
});
94103
emitter.on("failed", ({ error }) => {
104+
log.info(
105+
`TxStatusWaiter: waitFor(${desiredStatus}) rejected by failed event txId=${txId}`,
106+
error
107+
);
95108
reject(error instanceof Error ? error : new Error(String(error)));
96109
});
97110
});
98111

99-
// if the status change happened between the first DB read and listener registration
100-
const afterSubscribe = await this.pendingStorage.findById(txId);
101-
if (!afterSubscribe) {
102-
throw new Error(`Unknown pending L1 transaction id ${txId}`);
103-
}
104-
if (afterSubscribe.status === "failed") {
105-
throw TxStatusWaiter.toError(afterSubscribe);
106-
}
107-
if (TxStatusWaiter.isSatisfied(afterSubscribe, desiredStatus)) {
108-
return;
109-
}
110-
111112
if (options.timeoutMs !== undefined) {
112113
const timeoutPromise = new Promise<void>((_, reject) => {
113114
const t = setTimeout(() => {
@@ -119,13 +120,9 @@ export class TxStatusWaiter {
119120
}, options.timeoutMs);
120121
t.unref?.();
121122
});
122-
await Promise.race([eventPromise, timeoutPromise]).finally(() => {
123-
this.emitters.delete(txId);
124-
});
123+
await Promise.race([eventPromise, timeoutPromise]);
125124
} else {
126-
await eventPromise.finally(() => {
127-
this.emitters.delete(txId);
128-
});
125+
await eventPromise;
129126
}
130127
}
131128
}

0 commit comments

Comments
 (0)