@@ -35,6 +35,7 @@ import (
3535 "github.com/libp2p/go-libp2p/core/peer"
3636 "github.com/libp2p/go-libp2p/core/protocol"
3737 "github.com/multiformats/go-multiaddr"
38+ manet "github.com/multiformats/go-multiaddr/net"
3839 "github.com/patrickmn/go-cache"
3940 "github.com/pkg/errors"
4041 "github.com/sirupsen/logrus"
@@ -589,13 +590,54 @@ func (s *Service) subscribeReachabilityEvents() error {
589590 "unreachable" : multiaddrsToStrings (event .Unreachable ),
590591 "unknown" : multiaddrsToStrings (event .Unknown ),
591592 }).Info ("Address reachability changed" )
593+
594+ // Update ENR with reachable addresses if ENR has no addresses configured
595+ if len (event .Reachable ) > 0 {
596+ s .updateENRFromReachableAddrs (event .Reachable )
597+ }
592598 }
593599 }
594600 }
595601 }()
602+
596603 return nil
597604}
598605
606+ // updateENRFromReachableAddrs updates the ENR with IP addresses discovered
607+ // by AutoNAT if the ENR doesn't already have a static/fallback IP configured.
608+ func (s * Service ) updateENRFromReachableAddrs (reachableAddrs []multiaddr.Multiaddr ) {
609+ // Skip if HostAddress was already configured
610+ if s .cfg != nil && s .cfg .HostAddress != "" {
611+ return
612+ }
613+
614+ if s .dv5Listener == nil {
615+ return
616+ }
617+
618+ localNode := s .dv5Listener .LocalNode ()
619+
620+ // Extract the first valid IP from reachable addresses
621+ for _ , addr := range reachableAddrs {
622+ ip , err := manet .ToIP (addr )
623+ if err != nil {
624+ continue
625+ }
626+
627+ // Validate the IP is either IPv4 or IPv6
628+ if ip .To4 () == nil && ip .To16 () == nil {
629+ continue
630+ }
631+
632+ // Set fallback and static IP like we do for HostAddress
633+ localNode .SetFallbackIP (ip )
634+ localNode .SetStaticIP (ip )
635+
636+ log .WithField ("ip" , ip .String ()).Info ("Updated ENR IP from AutoNAT reachability" )
637+ return
638+ }
639+ }
640+
599641func multiaddrsToStrings (addrs []multiaddr.Multiaddr ) []string {
600642 strs := make ([]string , len (addrs ))
601643 for i , a := range addrs {
0 commit comments