Skip to content

Commit e8bc2c7

Browse files
authored
INC-2328 Add supportsDualBroadcast to txmgr (#87)
1 parent 3ee91a6 commit e8bc2c7

2 files changed

Lines changed: 54 additions & 31 deletions

File tree

chains/txmgr/txmgr.go

Lines changed: 50 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ type TxManager[CID chains.ID, HEAD chains.Head[BHASH], ADDR chains.Hashable, THA
6161
GetTransactionFee(ctx context.Context, transactionID string) (fee *evmtypes.TransactionFee, err error)
6262
GetTransactionReceipt(ctx context.Context, transactionID string) (receipt *txmgrtypes.ChainReceipt[THASH, BHASH], err error)
6363
CalculateFee(feeParts FeeParts) *big.Int
64+
// SupportsDualBroadcast reports whether this TXM will route transactions marked with
65+
// DualBroadcast=true to an OFA rather than the public mempool.
66+
// Jobs that configure a secondary EOA check this at startup and refuse to run if it
67+
// returns false, preventing accidental public-mempool exposure of secondary transactions.
68+
SupportsDualBroadcast() bool
6469
}
6570

6671
type TxmV2Wrapper[CID chains.ID, HEAD chains.Head[BHASH], ADDR chains.Hashable, THASH chains.Hashable, BHASH chains.Hashable, SEQ chains.Sequence, FEE fees.Fee] interface {
@@ -98,16 +103,17 @@ type Txm[CID chains.ID, HEAD chains.Head[BHASH], ADDR chains.Hashable, THASH cha
98103
chSubbed chan struct{}
99104
wg sync.WaitGroup
100105

101-
reaper *Reaper[CID]
102-
resender *Resender[CID, ADDR, THASH, BHASH, R, SEQ, FEE]
103-
broadcaster *Broadcaster[CID, HEAD, ADDR, THASH, BHASH, SEQ, FEE]
104-
confirmer *Confirmer[CID, HEAD, ADDR, THASH, BHASH, R, SEQ, FEE]
105-
tracker *Tracker[CID, ADDR, THASH, BHASH, R, SEQ, FEE]
106-
finalizer txmgrtypes.Finalizer[BHASH, HEAD]
107-
fwdMgr txmgrtypes.ForwarderManager[ADDR]
108-
txAttemptBuilder txmgrtypes.TxAttemptBuilder[CID, HEAD, ADDR, THASH, BHASH, SEQ, FEE]
109-
newErrorClassifier NewErrorClassifier
110-
txmv2wrapper TxmV2Wrapper[CID, HEAD, ADDR, THASH, BHASH, SEQ, FEE]
106+
reaper *Reaper[CID]
107+
resender *Resender[CID, ADDR, THASH, BHASH, R, SEQ, FEE]
108+
broadcaster *Broadcaster[CID, HEAD, ADDR, THASH, BHASH, SEQ, FEE]
109+
confirmer *Confirmer[CID, HEAD, ADDR, THASH, BHASH, R, SEQ, FEE]
110+
tracker *Tracker[CID, ADDR, THASH, BHASH, R, SEQ, FEE]
111+
finalizer txmgrtypes.Finalizer[BHASH, HEAD]
112+
fwdMgr txmgrtypes.ForwarderManager[ADDR]
113+
txAttemptBuilder txmgrtypes.TxAttemptBuilder[CID, HEAD, ADDR, THASH, BHASH, SEQ, FEE]
114+
newErrorClassifier NewErrorClassifier
115+
txmv2wrapper TxmV2Wrapper[CID, HEAD, ADDR, THASH, BHASH, SEQ, FEE]
116+
dualBroadcastEnabled bool
111117

112118
enabledAddrs []ADDR // sorted as strings
113119
}
@@ -137,29 +143,31 @@ func NewTxm[CID chains.ID, HEAD chains.Head[BHASH], ADDR chains.Hashable, THASH
137143
finalizer txmgrtypes.Finalizer[BHASH, HEAD],
138144
newErrorClassifierFunc NewErrorClassifier,
139145
txmv2wrapper TxmV2Wrapper[CID, HEAD, ADDR, THASH, BHASH, SEQ, FEE],
146+
dualBroadcastEnabled bool,
140147
) *Txm[CID, HEAD, ADDR, THASH, BHASH, R, SEQ, FEE] {
141148
b := Txm[CID, HEAD, ADDR, THASH, BHASH, R, SEQ, FEE]{
142-
logger: logger.Sugared(lggr),
143-
txStore: txStore,
144-
config: cfg,
145-
txConfig: txCfg,
146-
keyStore: keyStore,
147-
chainID: chainID,
148-
checkerFactory: checkerFactory,
149-
chHeads: make(chan HEAD),
150-
trigger: make(chan ADDR),
151-
chStop: make(chan struct{}),
152-
chSubbed: make(chan struct{}),
153-
reset: make(chan reset),
154-
fwdMgr: fwdMgr,
155-
txAttemptBuilder: txAttemptBuilder,
156-
broadcaster: broadcaster,
157-
confirmer: confirmer,
158-
resender: resender,
159-
tracker: tracker,
160-
newErrorClassifier: newErrorClassifierFunc,
161-
finalizer: finalizer,
162-
txmv2wrapper: txmv2wrapper,
149+
logger: logger.Sugared(lggr),
150+
txStore: txStore,
151+
config: cfg,
152+
txConfig: txCfg,
153+
keyStore: keyStore,
154+
chainID: chainID,
155+
checkerFactory: checkerFactory,
156+
chHeads: make(chan HEAD),
157+
trigger: make(chan ADDR),
158+
chStop: make(chan struct{}),
159+
chSubbed: make(chan struct{}),
160+
reset: make(chan reset),
161+
fwdMgr: fwdMgr,
162+
txAttemptBuilder: txAttemptBuilder,
163+
broadcaster: broadcaster,
164+
confirmer: confirmer,
165+
resender: resender,
166+
tracker: tracker,
167+
newErrorClassifier: newErrorClassifierFunc,
168+
finalizer: finalizer,
169+
txmv2wrapper: txmv2wrapper,
170+
dualBroadcastEnabled: dualBroadcastEnabled,
163171
}
164172

165173
if txCfg.ResendAfterThreshold() <= 0 {
@@ -603,6 +611,13 @@ func (b *Txm[CID, HEAD, ADDR, THASH, BHASH, R, SEQ, FEE]) GetForwarderForEOA(ctx
603611
return
604612
}
605613

614+
// SupportsDualBroadcast reports whether this TXM will route DualBroadcast transactions to an
615+
// OFA rather than the public mempool. The value is set at construction time by the
616+
// txmgr builder based on node config.
617+
func (b *Txm[CID, HEAD, ADDR, THASH, BHASH, R, SEQ, FEE]) SupportsDualBroadcast() bool {
618+
return b.dualBroadcastEnabled
619+
}
620+
606621
// GetForwarderForEOAOCR2Feeds calls forwarderMgr to get a proper forwarder for a given EOA and checks if its set as a transmitter on the OCR2Aggregator contract.
607622
func (b *Txm[CID, HEAD, ADDR, THASH, BHASH, R, SEQ, FEE]) GetForwarderForEOAOCR2Feeds(ctx context.Context, eoa, ocr2Aggregator ADDR) (forwarder ADDR, err error) {
608623
if !b.txConfig.ForwardersEnabled() {
@@ -881,6 +896,10 @@ func (n *NullTxManager[CID, HEAD, ADDR, THASH, BHASH, SEQ, FEE]) GetTransactionR
881896
return
882897
}
883898

899+
func (n *NullTxManager[CID, HEAD, ADDR, THASH, BHASH, SEQ, FEE]) SupportsDualBroadcast() bool {
900+
return false
901+
}
902+
884903
func (b *Txm[CID, HEAD, ADDR, THASH, BHASH, R, SEQ, FEE]) pruneQueueAndCreateTxn(
885904
ctx context.Context,
886905
txRequest txmgrtypes.TxRequest[ADDR, THASH],

chains/txmgr/txmgrtest/err.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,7 @@ func (n *ErrTxManager[CHAIN_ID, HEAD, ADDR, TX_HASH, BLOCK_HASH, SEQ, FEE]) Coun
9999
func (n *ErrTxManager[CHAIN_ID, HEAD, ADDR, TX_HASH, BLOCK_HASH, SEQ, FEE]) GetTransactionStatus(ctx context.Context, transactionID string) (status commontypes.TransactionStatus, err error) {
100100
return
101101
}
102+
103+
func (n *ErrTxManager[CHAIN_ID, HEAD, ADDR, TX_HASH, BLOCK_HASH, SEQ, FEE]) SupportsDualBroadcast() bool {
104+
return false
105+
}

0 commit comments

Comments
 (0)