11package txm
22
33import (
4+ "encoding/json"
45 "strconv"
56 "testing"
67
@@ -10,6 +11,7 @@ import (
1011 "github.com/stretchr/testify/require"
1112
1213 "github.com/smartcontractkit/chainlink-common/pkg/beholder/beholdertest"
14+ "github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
1315 "github.com/smartcontractkit/chainlink-evm/pkg/testutils"
1416 "github.com/smartcontractkit/chainlink-evm/pkg/txm/types"
1517 svrv1 "github.com/smartcontractkit/chainlink-protos/svr/v1"
@@ -115,6 +117,87 @@ func TestEmitTxMessage(t *testing.T) {
115117 assert .Equal (t , expectedChain .String (), actualMessage .ChainId )
116118 assert .Equal (t , "" , actualMessage .FeedAddress )
117119 })
120+
121+ t .Run ("populates dual_broadcast_params when tx is a dual-broadcast secondary tx" , func (t * testing.T ) {
122+ // GIVEN
123+ ctx := t .Context ()
124+ beholderTester := beholdertest .NewObserver (t )
125+
126+ toAddress := testutils .NewAddress ()
127+ fromAddress := testutils .NewAddress ()
128+ expectedNonce := uint64 (7 )
129+ expectedChain := testutils .FixtureChainID
130+ expectedParams := "hint=calldata&hint=logs&builder=flashbots"
131+ isDualBroadcast := true
132+
133+ metaBytes , err := json .Marshal (types.TxMeta {
134+ DualBroadcast : & isDualBroadcast ,
135+ DualBroadcastParams : & expectedParams ,
136+ })
137+ require .NoError (t , err )
138+ meta := sqlutil .JSON (metaBytes )
139+
140+ txmMetrics , err := NewTxmMetrics (expectedChain )
141+ require .NoError (t , err )
142+
143+ tx := & types.Transaction {
144+ IsPurgeable : false ,
145+ FromAddress : fromAddress ,
146+ ToAddress : toAddress ,
147+ Nonce : & expectedNonce ,
148+ Meta : & meta ,
149+ }
150+
151+ // WHEN
152+ err = txmMetrics .EmitTxMessage (ctx , common.Hash {}, fromAddress , tx )
153+ require .NoError (t , err )
154+
155+ // THEN
156+ messages := beholderTester .Messages (t )
157+ assert .Len (t , messages , 1 )
158+
159+ var actualMessage svrv1.TxMessage
160+ err = proto .Unmarshal (messages [0 ].Body , & actualMessage )
161+ require .NoError (t , err )
162+
163+ require .NotNil (t , actualMessage .DualBroadcastParams )
164+ assert .Equal (t , expectedParams , * actualMessage .DualBroadcastParams )
165+ })
166+
167+ t .Run ("does not set dual_broadcast_params for a primary (non-dual-broadcast) tx" , func (t * testing.T ) {
168+ // GIVEN
169+ ctx := t .Context ()
170+ beholderTester := beholdertest .NewObserver (t )
171+
172+ toAddress := testutils .NewAddress ()
173+ fromAddress := testutils .NewAddress ()
174+ expectedNonce := uint64 (3 )
175+ expectedChain := testutils .FixtureChainID
176+
177+ txmMetrics , err := NewTxmMetrics (expectedChain )
178+ require .NoError (t , err )
179+
180+ tx := & types.Transaction {
181+ IsPurgeable : false ,
182+ FromAddress : fromAddress ,
183+ ToAddress : toAddress ,
184+ Nonce : & expectedNonce ,
185+ }
186+
187+ // WHEN
188+ err = txmMetrics .EmitTxMessage (ctx , common.Hash {}, fromAddress , tx )
189+ require .NoError (t , err )
190+
191+ // THEN
192+ messages := beholderTester .Messages (t )
193+ assert .Len (t , messages , 1 )
194+
195+ var actualMessage svrv1.TxMessage
196+ err = proto .Unmarshal (messages [0 ].Body , & actualMessage )
197+ require .NoError (t , err )
198+
199+ assert .Nil (t , actualMessage .DualBroadcastParams )
200+ })
118201}
119202
120203func TestReachedMaxAttempts (t * testing.T ) {
0 commit comments