@@ -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
6671type 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.
607622func (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+
884903func (b * Txm [CID , HEAD , ADDR , THASH , BHASH , R , SEQ , FEE ]) pruneQueueAndCreateTxn (
885904 ctx context.Context ,
886905 txRequest txmgrtypes.TxRequest [ADDR , THASH ],
0 commit comments