Skip to content

Commit 7b9f72c

Browse files
authored
fix: catch potential errors enqueuing gov/slashing signals (#16662)
These promises could throw before the code got to the `await` for them (where `catch` handlers were attached) leading to an unhandled rejection and a full process crash.
2 parents 77675f2 + 75c90fc commit 7b9f72c

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

yarn-project/sequencer-client/src/sequencer/sequencer.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ describe('sequencer', () => {
267267
validatorClient.createBlockProposal.mockImplementation(() => Promise.resolve(createBlockProposal()));
268268

269269
slasherClient = mock<SlasherClientInterface>();
270+
slasherClient.getProposerActions.mockResolvedValue([]);
270271

271272
dateProvider = new TestDateProvider();
272273

yarn-project/sequencer-client/src/sequencer/sequencer.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -412,18 +412,23 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
412412

413413
const enqueueGovernanceSignalPromise =
414414
this.governanceProposerPayload && !this.governanceProposerPayload.isZero()
415-
? publisher.enqueueGovernanceCastSignal(
416-
this.governanceProposerPayload,
417-
slot,
418-
timestamp,
419-
attestorAddress,
420-
signerFn,
421-
)
422-
: Promise.resolve();
415+
? publisher
416+
.enqueueGovernanceCastSignal(this.governanceProposerPayload, slot, timestamp, attestorAddress, signerFn)
417+
.catch(err => {
418+
this.log.error(`Error enqueuing governance vote`, err, { blockNumber: newBlockNumber, slot });
419+
return false;
420+
})
421+
: Promise.resolve(false);
423422

424423
const enqueueSlashingActionsPromise = this.slasherClient
425-
?.getProposerActions(slot)
426-
?.then(actions => publisher.enqueueSlashingActions(actions, slot, timestamp, attestorAddress, signerFn));
424+
? this.slasherClient
425+
.getProposerActions(slot)
426+
.then(actions => publisher.enqueueSlashingActions(actions, slot, timestamp, attestorAddress, signerFn))
427+
.catch(err => {
428+
this.log.error(`Error enqueuing slashing actions`, err, { blockNumber: newBlockNumber, slot });
429+
return false;
430+
})
431+
: Promise.resolve(false);
427432

428433
if (invalidateBlock && !this.config.skipInvalidateBlockAsProposer) {
429434
publisher.enqueueInvalidateBlock(invalidateBlock);
@@ -482,12 +487,7 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
482487
this.emit('tx-count-check-failed', { minTxs: this.minTxsPerBlock, availableTxs: pendingTxCount });
483488
}
484489

485-
await enqueueGovernanceSignalPromise?.catch(err => {
486-
this.log.error(`Error enqueuing governance vote`, err, { blockNumber: newBlockNumber, slot });
487-
});
488-
await enqueueSlashingActionsPromise?.catch(err => {
489-
this.log.error(`Error enqueuing slashing actions`, err, { blockNumber: newBlockNumber, slot });
490-
});
490+
await Promise.all([enqueueGovernanceSignalPromise, enqueueSlashingActionsPromise]);
491491

492492
const l1Response = await publisher.sendRequests();
493493
const proposedBlock = l1Response?.successfulActions.find(a => a === 'propose');

0 commit comments

Comments
 (0)