@@ -152,3 +152,83 @@ func TestTopology(t *testing.T) {
152152 t .Fatal ("wrong peer in disconnect notification" )
153153 }
154154}
155+
156+ func TestBidderDedupChecksCorrectMap (t * testing.T ) {
157+ t .Parallel ()
158+
159+ notifier := & testNotifier {}
160+ topo := topology .New (& testAddressbook {}, notifier , util .NewTestLogger (io .Discard ))
161+
162+ // Provider and bidder with the same eth address
163+ addr := common .HexToAddress ("0xABC" )
164+
165+ provider := p2p.Peer {EthAddress : addr , Type : p2p .PeerTypeProvider }
166+ bidder := p2p.Peer {EthAddress : addr , Type : p2p .PeerTypeBidder }
167+
168+ topo .Connected (provider )
169+
170+ // Before the fix, this bidder would be silently dropped because `add`
171+ // checked t.providers (wrong map) for the bidder dedup.
172+ topo .Connected (bidder )
173+
174+ providers := topo .GetPeers (topology.Query {Type : p2p .PeerTypeProvider })
175+ bidders := topo .GetPeers (topology.Query {Type : p2p .PeerTypeBidder })
176+
177+ if len (providers ) != 1 {
178+ t .Fatalf ("expected 1 provider, got %d" , len (providers ))
179+ }
180+ if len (bidders ) != 1 {
181+ t .Fatalf ("expected 1 bidder, got %d" , len (bidders ))
182+ }
183+
184+ // Duplicate bidder should be deduped
185+ topo .Connected (bidder )
186+ bidders = topo .GetPeers (topology.Query {Type : p2p .PeerTypeBidder })
187+ if len (bidders ) != 1 {
188+ t .Fatalf ("expected 1 bidder after duplicate connect, got %d" , len (bidders ))
189+ }
190+ }
191+
192+ func TestNewProviderBroadcastsToAllBidders (t * testing.T ) {
193+ t .Parallel ()
194+
195+ ann := & announcer {}
196+ notifier := & testNotifier {}
197+ topo := topology .New (& testAddressbook {}, notifier , util .NewTestLogger (io .Discard ))
198+ topo .SetAnnouncer (ann )
199+
200+ // Connect 3 bidders first
201+ bidders := []p2p.Peer {
202+ {EthAddress : common .HexToAddress ("0xB1" ), Type : p2p .PeerTypeBidder },
203+ {EthAddress : common .HexToAddress ("0xB2" ), Type : p2p .PeerTypeBidder },
204+ {EthAddress : common .HexToAddress ("0xB3" ), Type : p2p .PeerTypeBidder },
205+ }
206+ for _ , b := range bidders {
207+ topo .Connected (b )
208+ }
209+
210+ ann .mu .Lock ()
211+ ann .broadcasts = nil // clear broadcasts from bidder connections
212+ ann .mu .Unlock ()
213+
214+ // Now connect a new provider — it should be broadcast to all 3 bidders
215+ provider := p2p.Peer {EthAddress : common .HexToAddress ("0xP1" ), Type : p2p .PeerTypeProvider }
216+ topo .Connected (provider )
217+
218+ ann .mu .Lock ()
219+ defer ann .mu .Unlock ()
220+
221+ if len (ann .broadcasts ) != 3 {
222+ t .Fatalf ("expected new provider to be broadcast to 3 bidders, got %d" , len (ann .broadcasts ))
223+ }
224+
225+ broadcastAddrs := make (map [common.Address ]bool )
226+ for _ , b := range ann .broadcasts {
227+ broadcastAddrs [b .EthAddress ] = true
228+ }
229+ for _ , b := range bidders {
230+ if ! broadcastAddrs [b .EthAddress ] {
231+ t .Fatalf ("bidder %s did not receive provider broadcast" , b .EthAddress .Hex ())
232+ }
233+ }
234+ }
0 commit comments