@@ -25,6 +25,8 @@ import { getCoreTopics } from "./gossip/topic.js";
2525import { Discv5Worker } from "./discv5/index.js" ;
2626import { NetworkProcessor } from "./processor/index.js" ;
2727import { pooledUserOpHashes , pooledUserOpsByHash } from "./reqresp/index.js" ;
28+ import fs from "node:fs" ;
29+ import path from "node:path" ;
2830
2931type NetworkModules = {
3032 libp2p : Libp2p ;
@@ -47,6 +49,8 @@ export type NetworkInitOptions = {
4749 executor : Executor ;
4850 peerStoreDir ?: string ;
4951 metrics : AllChainsMetrics | null ;
52+ dataDir ?: string ;
53+ retainPeerId ?: boolean ;
5054} ;
5155
5256export class Network implements INetwork {
@@ -66,6 +70,8 @@ export class Network implements INetwork {
6670
6771 relayersConfig : Config ;
6872 subscribedMempools = new Set < string > ( ) ;
73+ dataDir ?: string ;
74+ retainPeerId ?: boolean ;
6975
7076 constructor ( opts : NetworkModules ) {
7177 const {
@@ -97,7 +103,7 @@ export class Network implements INetwork {
97103 }
98104
99105 static async init ( options : NetworkInitOptions ) : Promise < Network > {
100- const { peerId, relayersConfig, executor, metrics } = options ;
106+ const { peerId, relayersConfig, executor, metrics, dataDir , retainPeerId } = options ;
101107 const libp2p = await createNodeJsLibp2p ( peerId , options . opts , {
102108 peerStoreDir : options . peerStoreDir ,
103109 } ) ;
@@ -150,7 +156,7 @@ export class Network implements INetwork {
150156 } ;
151157 const peerManager = new PeerManager ( peerManagerModules , options . opts ) ;
152158
153- return new Network ( {
159+ const network = new Network ( {
154160 libp2p,
155161 gossip,
156162 reqResp,
@@ -163,6 +169,9 @@ export class Network implements INetwork {
163169 executor,
164170 metrics,
165171 } ) ;
172+ network . dataDir = dataDir ;
173+ network . retainPeerId = retainPeerId ;
174+ return network ;
166175 }
167176
168177 /** Shutdown the bundler node */
@@ -185,6 +194,19 @@ export class Network implements INetwork {
185194 const setEnrValue = discv5 ?. setEnrValue . bind ( discv5 ) ;
186195 this . metadata . start ( setEnrValue ) ;
187196
197+ // Save ENR after metadata updates if retainPeerId is enabled
198+ if ( this . retainPeerId && this . dataDir ) {
199+ try {
200+ const enr = await this . getEnr ( ) ;
201+ if ( enr ) {
202+ const enrFile = path . join ( this . dataDir , "enr" ) ;
203+ fs . writeFileSync ( enrFile , enr . encodeTxt ( ) , { mode : 0o600 } ) ;
204+ }
205+ } catch ( error ) {
206+ this . logger . warn ( "Failed to save ENR after metadata update" , error ) ;
207+ }
208+ }
209+
188210 await this . gossip . start ( ) ;
189211
190212 const multiaddresses = this . libp2p
0 commit comments