Skip to main content

espresso_utils/
env_compat.rs

1/// Backward-compatible environment variable migration.
2///
3/// Maps deprecated `ESPRESSO_SEQUENCER_*` env vars to their new names.
4/// If a new env var is already set, the old one is ignored. Otherwise the old value is
5/// copied to the new name and a deprecation warning is emitted.
6///
7/// Call this function early in `main()`, before clap parsing.
8/// Returns the list of migrated `(old, new)` pairs. Pass to [`log_migrated_env_vars`]
9/// after tracing is initialized.
10pub fn migrate_legacy_env_vars() -> Vec<(&'static str, &'static str)> {
11    const MAPPINGS: &[(&str, &str)] = &[
12        // ── contracts/rust/deployment-info/src/addresses.rs ──
13        // ESP token proxy contract address
14        (
15            "ESP_TOKEN_PROXY_ADDRESS",
16            "ESPRESSO_SEQUENCER_ESP_TOKEN_PROXY_ADDRESS",
17        ),
18        // Fee contract proxy address
19        (
20            "ESPRESSO_FEE_CONTRACT_PROXY_ADDRESS",
21            "ESPRESSO_SEQUENCER_FEE_CONTRACT_PROXY_ADDRESS",
22        ),
23        // Reward claim proxy contract address
24        (
25            "ESPRESSO_REWARD_CLAIM_PROXY_ADDRESS",
26            "ESPRESSO_SEQUENCER_REWARD_CLAIM_PROXY_ADDRESS",
27        ),
28        // Operations timelock contract address
29        (
30            "ESPRESSO_OPS_TIMELOCK_ADDRESS",
31            "ESPRESSO_SEQUENCER_OPS_TIMELOCK_ADDRESS",
32        ),
33        // Safe exit timelock contract address
34        (
35            "ESPRESSO_SAFE_EXIT_TIMELOCK_ADDRESS",
36            "ESPRESSO_SEQUENCER_SAFE_EXIT_TIMELOCK_ADDRESS",
37        ),
38        // ── crates/builder/src/bin/permissionless-builder.rs ──
39        // Peer nodes used to fetch missing state
40        (
41            "ESPRESSO_NODE_STATE_PEERS",
42            "ESPRESSO_SEQUENCER_STATE_PEERS",
43        ),
44        // Espresso node API URL
45        ("ESPRESSO_API_NODE_URL", "ESPRESSO_SEQUENCER_URL"),
46        // ── crates/espresso/dev-node/src/main.rs ──
47        // Max concurrent HTTP API connections
48        (
49            "ESPRESSO_NODE_API_MAX_CONNECTIONS",
50            "ESPRESSO_SEQUENCER_MAX_CONNECTIONS",
51        ),
52        // Alternate account indices for multi-chain deployment
53        (
54            "ESPRESSO_DEPLOYER_ALT_INDICES",
55            "ESPRESSO_SEQUENCER_DEPLOYER_ALT_INDICES",
56        ),
57        // Multisig admin address for contract operations
58        (
59            "ESPRESSO_ETH_MULTISIG_ADDRESS",
60            "ESPRESSO_SEQUENCER_ETH_MULTISIG_ADDRESS",
61        ),
62        // ── crates/espresso/dev-node/tests/dev_node_tests.rs ──
63        // Port for the HTTP API server
64        ("ESPRESSO_NODE_API_PORT", "ESPRESSO_SEQUENCER_API_PORT"),
65        // Maximum database connections
66        (
67            "ESPRESSO_NODE_DATABASE_MAX_CONNECTIONS",
68            "ESPRESSO_SEQUENCER_DATABASE_MAX_CONNECTIONS",
69        ),
70        // L1 JSON-RPC provider URL
71        ("ESPRESSO_L1_PROVIDER", "ESPRESSO_SEQUENCER_L1_PROVIDER"),
72        // Mnemonic for the deployer wallet
73        ("ESPRESSO_ETH_MNEMONIC", "ESPRESSO_SEQUENCER_ETH_MNEMONIC"),
74        // ── crates/espresso/node/src/api/options.rs ──
75        // Peer URLs for fetching missing query service data
76        ("ESPRESSO_NODE_API_PEERS", "ESPRESSO_SEQUENCER_API_PEERS"),
77        // ── crates/espresso/node/src/bin/deploy.rs ──
78        // Number of blocks per epoch for HotShot consensus
79        (
80            "ESPRESSO_NETWORK_BLOCKS_PER_EPOCH",
81            "ESPRESSO_SEQUENCER_BLOCKS_PER_EPOCH",
82        ),
83        // Epoch start block number
84        (
85            "ESPRESSO_NETWORK_EPOCH_START_BLOCK",
86            "ESPRESSO_SEQUENCER_EPOCH_START_BLOCK",
87        ),
88        // Multisig pauser address for emergency actions
89        (
90            "ESPRESSO_ETH_MULTISIG_PAUSER_ADDRESS",
91            "ESPRESSO_SEQUENCER_ETH_MULTISIG_PAUSER_ADDRESS",
92        ),
93        // Stake table capacity for the prover circuit
94        (
95            "ESPRESSO_STAKE_TABLE_CAPACITY",
96            "ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY",
97        ),
98        // Exit escrow period for the stake table
99        (
100            "ESPRESSO_STAKE_TABLE_EXIT_ESCROW_PERIOD",
101            "ESPRESSO_SEQUENCER_STAKE_TABLE_EXIT_ESCROW_PERIOD",
102        ),
103        // Address of the permissioned prover
104        (
105            "ESPRESSO_PERMISSIONED_PROVER",
106            "ESPRESSO_SEQUENCER_PERMISSIONED_PROVER",
107        ),
108        // ── crates/espresso/node/src/bin/submit-transactions.rs ──
109        // Comma-separated list of Espresso node API URLs
110        ("ESPRESSO_API_NODE_URLS", "ESPRESSO_SEQUENCER_URLS"),
111        // ── crates/espresso/node/src/keyset.rs ──
112        // Path to file containing private keys
113        ("ESPRESSO_NODE_KEY_FILE", "ESPRESSO_SEQUENCER_KEY_FILE"),
114        // Index for generating multiple keysets from one mnemonic
115        ("ESPRESSO_NODE_KEY_INDEX", "ESPRESSO_SEQUENCER_KEY_INDEX"),
116        // Mnemonic phrase for key generation
117        (
118            "ESPRESSO_NODE_KEY_MNEMONIC",
119            "ESPRESSO_SEQUENCER_KEY_MNEMONIC",
120        ),
121        // Private BLS staking key
122        (
123            "ESPRESSO_NODE_PRIVATE_STAKING_KEY",
124            "ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY",
125        ),
126        // Private Schnorr state signing key
127        (
128            "ESPRESSO_NODE_PRIVATE_STATE_KEY",
129            "ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY",
130        ),
131        // Private x25519 encryption key
132        (
133            "ESPRESSO_NODE_PRIVATE_X25519_KEY",
134            "ESPRESSO_SEQUENCER_PRIVATE_X25519_KEY",
135        ),
136        // ── crates/espresso/node/src/options.rs ──
137        // Base timeout for catchup requests to peers
138        (
139            "ESPRESSO_NODE_CATCHUP_BASE_TIMEOUT",
140            "ESPRESSO_SEQUENCER_CATCHUP_BASE_TIMEOUT",
141        ),
142        // CDN endpoint for consensus messaging
143        (
144            "ESPRESSO_NODE_CDN_ENDPOINT",
145            "ESPRESSO_SEQUENCER_CDN_ENDPOINT",
146        ),
147        // Bind address for cliquenet protocol
148        (
149            "ESPRESSO_NODE_CLIQUENET_BIND_ADDRESS",
150            "ESPRESSO_SEQUENCER_CLIQUENET_BIND_ADDRESS",
151        ),
152        // Peer nodes used to fetch missing config
153        (
154            "ESPRESSO_NODE_CONFIG_PEERS",
155            "ESPRESSO_SEQUENCER_CONFIG_PEERS",
156        ),
157        // Path to the genesis TOML file
158        (
159            "ESPRESSO_NODE_GENESIS_FILE",
160            "ESPRESSO_SEQUENCER_GENESIS_FILE",
161        ),
162        // Node operator company name
163        (
164            "ESPRESSO_NODE_IDENTITY_COMPANY_NAME",
165            "ESPRESSO_SEQUENCER_IDENTITY_COMPANY_NAME",
166        ),
167        // Node operator company website
168        (
169            "ESPRESSO_NODE_IDENTITY_COMPANY_WEBSITE",
170            "ESPRESSO_SEQUENCER_IDENTITY_COMPANY_WEBSITE",
171        ),
172        // Node operator country code
173        (
174            "ESPRESSO_NODE_IDENTITY_COUNTRY_CODE",
175            "ESPRESSO_SEQUENCER_IDENTITY_COUNTRY_CODE",
176        ),
177        // Node icon 14x14 1x
178        (
179            "ESPRESSO_NODE_IDENTITY_ICON_14x14_1x",
180            "ESPRESSO_SEQUENCER_IDENTITY_ICON_14x14_1x",
181        ),
182        // Node icon 14x14 2x
183        (
184            "ESPRESSO_NODE_IDENTITY_ICON_14x14_2x",
185            "ESPRESSO_SEQUENCER_IDENTITY_ICON_14x14_2x",
186        ),
187        // Node icon 14x14 3x
188        (
189            "ESPRESSO_NODE_IDENTITY_ICON_14x14_3x",
190            "ESPRESSO_SEQUENCER_IDENTITY_ICON_14x14_3x",
191        ),
192        // Node icon 24x24 1x
193        (
194            "ESPRESSO_NODE_IDENTITY_ICON_24x24_1x",
195            "ESPRESSO_SEQUENCER_IDENTITY_ICON_24x24_1x",
196        ),
197        // Node icon 24x24 2x
198        (
199            "ESPRESSO_NODE_IDENTITY_ICON_24x24_2x",
200            "ESPRESSO_SEQUENCER_IDENTITY_ICON_24x24_2x",
201        ),
202        // Node icon 24x24 3x
203        (
204            "ESPRESSO_NODE_IDENTITY_ICON_24x24_3x",
205            "ESPRESSO_SEQUENCER_IDENTITY_ICON_24x24_3x",
206        ),
207        // Node operator latitude
208        (
209            "ESPRESSO_NODE_IDENTITY_LATITUDE",
210            "ESPRESSO_SEQUENCER_IDENTITY_LATITUDE",
211        ),
212        // Node operator longitude
213        (
214            "ESPRESSO_NODE_IDENTITY_LONGITUDE",
215            "ESPRESSO_SEQUENCER_IDENTITY_LONGITUDE",
216        ),
217        // Network type (e.g. local, testnet, mainnet)
218        (
219            "ESPRESSO_NODE_IDENTITY_NETWORK_TYPE",
220            "ESPRESSO_SEQUENCER_IDENTITY_NETWORK_TYPE",
221        ),
222        // Node description
223        (
224            "ESPRESSO_NODE_IDENTITY_NODE_DESCRIPTION",
225            "ESPRESSO_SEQUENCER_IDENTITY_NODE_DESCRIPTION",
226        ),
227        // Node display name
228        (
229            "ESPRESSO_NODE_IDENTITY_NODE_NAME",
230            "ESPRESSO_SEQUENCER_IDENTITY_NODE_NAME",
231        ),
232        // Node type
233        (
234            "ESPRESSO_NODE_IDENTITY_NODE_TYPE",
235            "ESPRESSO_SEQUENCER_IDENTITY_NODE_TYPE",
236        ),
237        // Node operating system
238        (
239            "ESPRESSO_NODE_IDENTITY_OPERATING_SYSTEM",
240            "ESPRESSO_SEQUENCER_IDENTITY_OPERATING_SYSTEM",
241        ),
242        // Whether this node participates in DA
243        ("ESPRESSO_NODE_IS_DA", "ESPRESSO_SEQUENCER_IS_DA"),
244        // Public address advertised to libp2p peers
245        (
246            "ESPRESSO_NODE_LIBP2P_ADVERTISE_ADDRESS",
247            "ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS",
248        ),
249        // Local address for the libp2p listener
250        (
251            "ESPRESSO_NODE_LIBP2P_BIND_ADDRESS",
252            "ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS",
253        ),
254        // Bootstrap nodes for libp2p peer discovery
255        (
256            "ESPRESSO_NODE_LIBP2P_BOOTSTRAP_NODES",
257            "ESPRESSO_SEQUENCER_LIBP2P_BOOTSTRAP_NODES",
258        ),
259        // Cache duration for libp2p message hashes
260        (
261            "ESPRESSO_NODE_LIBP2P_DUPLICATE_CACHE_TIME",
262            "ESPRESSO_SEQUENCER_LIBP2P_DUPLICATE_CACHE_TIME",
263        ),
264        // TTL for libp2p fanout peers
265        (
266            "ESPRESSO_NODE_LIBP2P_FANOUT_TTL",
267            "ESPRESSO_SEQUENCER_LIBP2P_FANOUT_TTL",
268        ),
269        // Flood publish messages in libp2p
270        (
271            "ESPRESSO_NODE_LIBP2P_FLOOD_PUBLISH",
272            "ESPRESSO_SEQUENCER_LIBP2P_FLOOD_PUBLISH",
273        ),
274        // Gossip sub protocol factor
275        (
276            "ESPRESSO_NODE_LIBP2P_GOSSIP_FACTOR",
277            "ESPRESSO_SEQUENCER_LIBP2P_GOSSIP_FACTOR",
278        ),
279        // Number of lazy gossip messages
280        (
281            "ESPRESSO_NODE_LIBP2P_GOSSIP_LAZY",
282            "ESPRESSO_SEQUENCER_LIBP2P_GOSSIP_LAZY",
283        ),
284        // Gossip retransmission count
285        (
286            "ESPRESSO_NODE_LIBP2P_GOSSIP_RETRANSMISSION",
287            "ESPRESSO_SEQUENCER_LIBP2P_GOSSIP_RETRANSMISSION",
288        ),
289        // Initial delay for libp2p heartbeat
290        (
291            "ESPRESSO_NODE_LIBP2P_HEARTBEAT_INITIAL_DELAY",
292            "ESPRESSO_SEQUENCER_LIBP2P_HEARTBEAT_INITIAL_DELAY",
293        ),
294        // Interval between libp2p heartbeats
295        (
296            "ESPRESSO_NODE_LIBP2P_HEARTBEAT_INTERVAL",
297            "ESPRESSO_SEQUENCER_LIBP2P_HEARTBEAT_INTERVAL",
298        ),
299        // Gossip history length
300        (
301            "ESPRESSO_NODE_LIBP2P_HISTORY_GOSSIP",
302            "ESPRESSO_SEQUENCER_LIBP2P_HISTORY_GOSSIP",
303        ),
304        // History length for libp2p
305        (
306            "ESPRESSO_NODE_LIBP2P_HISTORY_LENGTH",
307            "ESPRESSO_SEQUENCER_LIBP2P_HISTORY_LENGTH",
308        ),
309        // Max direct transmit message size
310        (
311            "ESPRESSO_NODE_LIBP2P_MAX_DIRECT_TRANSMIT_SIZE",
312            "ESPRESSO_SEQUENCER_LIBP2P_MAX_DIRECT_TRANSMIT_SIZE",
313        ),
314        // Max gossip transmit message size
315        (
316            "ESPRESSO_NODE_LIBP2P_MAX_GOSSIP_TRANSMIT_SIZE",
317            "ESPRESSO_SEQUENCER_LIBP2P_MAX_GOSSIP_TRANSMIT_SIZE",
318        ),
319        // Max IHAVE message length
320        (
321            "ESPRESSO_NODE_LIBP2P_MAX_IHAVE_LENGTH",
322            "ESPRESSO_SEQUENCER_LIBP2P_MAX_IHAVE_LENGTH",
323        ),
324        // Max number of IHAVE messages
325        (
326            "ESPRESSO_NODE_LIBP2P_MAX_IHAVE_MESSAGES",
327            "ESPRESSO_SEQUENCER_LIBP2P_MAX_IHAVE_MESSAGES",
328        ),
329        // Max IWANT follow-up time
330        (
331            "ESPRESSO_NODE_LIBP2P_MAX_IWANT_FOLLOWUP_TIME",
332            "ESPRESSO_SEQUENCER_LIBP2P_MAX_IWANT_FOLLOWUP_TIME",
333        ),
334        // Max messages per libp2p RPC
335        (
336            "ESPRESSO_NODE_LIBP2P_MAX_MESSAGES_PER_RPC",
337            "ESPRESSO_SEQUENCER_LIBP2P_MAX_MESSAGES_PER_RPC",
338        ),
339        // Target mesh network peer count
340        (
341            "ESPRESSO_NODE_LIBP2P_MESH_N",
342            "ESPRESSO_SEQUENCER_LIBP2P_MESH_N",
343        ),
344        // Upper bound for mesh peers
345        (
346            "ESPRESSO_NODE_LIBP2P_MESH_N_HIGH",
347            "ESPRESSO_SEQUENCER_LIBP2P_MESH_N_HIGH",
348        ),
349        // Lower bound for mesh peers
350        (
351            "ESPRESSO_NODE_LIBP2P_MESH_N_LOW",
352            "ESPRESSO_SEQUENCER_LIBP2P_MESH_N_LOW",
353        ),
354        // Minimum outbound mesh peers
355        (
356            "ESPRESSO_NODE_LIBP2P_MESH_OUTBOUND_MIN",
357            "ESPRESSO_SEQUENCER_LIBP2P_MESH_OUTBOUND_MIN",
358        ),
359        // Cache duration for published message IDs
360        (
361            "ESPRESSO_NODE_LIBP2P_PUBLISHED_MESSAGE_IDS_CACHE_TIME",
362            "ESPRESSO_SEQUENCER_LIBP2P_PUBLISHED_MESSAGE_IDS_CACHE_TIME",
363        ),
364        // Orchestrator URL for consensus coordination
365        (
366            "ESPRESSO_NODE_ORCHESTRATOR_URL",
367            "ESPRESSO_SEQUENCER_ORCHESTRATOR_URL",
368        ),
369        // Public API URL advertised to other nodes
370        (
371            "ESPRESSO_NODE_PUBLIC_API_URL",
372            "ESPRESSO_SEQUENCER_PUBLIC_API_URL",
373        ),
374        // Builder URLs for submitting transactions
375        ("ESPRESSO_BUILDER_URLS", "ESPRESSO_SEQUENCER_BUILDER_URLS"),
376        // Remote providers fallback timeout
377        (
378            "ESPRESSO_NODE_LOCAL_CATCHUP_TIMEOUT",
379            "ESPRESSO_SEQUENCER_LOCAL_CATCHUP_TIMEOUT",
380        ),
381        // ── crates/espresso/node/src/persistence/fs.rs ──
382        // Number of consensus views to retain
383        (
384            "ESPRESSO_NODE_CONSENSUS_VIEW_RETENTION",
385            "ESPRESSO_SEQUENCER_CONSENSUS_VIEW_RETENTION",
386        ),
387        // ── crates/espresso/node/src/persistence/sql.rs ──
388        // Minimum delay between active fetches in a stream
389        (
390            "ESPRESSO_NODE_ACTIVE_FETCH_DELAY",
391            "ESPRESSO_SEQUENCER_ACTIVE_FETCH_DELAY",
392        ),
393        // Duration to cache sync status results for.
394        (
395            "ESPRESSO_NODE_SYNC_STATUS_TTL",
396            "ESPRESSO_SEQUENCER_SYNC_STATUS_TTL",
397        ),
398        // Disable pruning and reconstruct previously pruned data
399        ("ESPRESSO_NODE_ARCHIVE", "ESPRESSO_SEQUENCER_ARCHIVE"),
400        // Minimum delay between loading chunks in a stream
401        (
402            "ESPRESSO_NODE_CHUNK_FETCH_DELAY",
403            "ESPRESSO_SEQUENCER_CHUNK_FETCH_DELAY",
404        ),
405        // Minimum retention for consensus storage
406        (
407            "ESPRESSO_NODE_CONSENSUS_STORAGE_MINIMUM_RETENTION",
408            "ESPRESSO_SEQUENCER_CONSENSUS_STORAGE_MINIMUM_RETENTION",
409        ),
410        // Target retention for consensus storage
411        (
412            "ESPRESSO_NODE_CONSENSUS_STORAGE_TARGET_RETENTION",
413            "ESPRESSO_SEQUENCER_CONSENSUS_STORAGE_TARGET_RETENTION",
414        ),
415        // Target disk usage for consensus storage
416        (
417            "ESPRESSO_NODE_CONSENSUS_STORAGE_TARGET_USAGE",
418            "ESPRESSO_SEQUENCER_CONSENSUS_STORAGE_TARGET_USAGE",
419        ),
420        // Maximum lifetime of a database connection
421        (
422            "ESPRESSO_NODE_DATABASE_CONNECTION_TIMEOUT",
423            "ESPRESSO_SEQUENCER_DATABASE_CONNECTION_TIMEOUT",
424        ),
425        // Maximum idle time of a database connection
426        (
427            "ESPRESSO_NODE_DATABASE_IDLE_CONNECTION_TIMEOUT",
428            "ESPRESSO_SEQUENCER_DATABASE_IDLE_CONNECTION_TIMEOUT",
429        ),
430        // Minimum database connections
431        (
432            "ESPRESSO_NODE_DATABASE_MIN_CONNECTIONS",
433            "ESPRESSO_SEQUENCER_DATABASE_MIN_CONNECTIONS",
434        ),
435        // Enable pruning with default parameters
436        (
437            "ESPRESSO_NODE_DATABASE_PRUNE",
438            "ESPRESSO_SEQUENCER_DATABASE_PRUNE",
439        ),
440        // Max connections for query operations
441        (
442            "ESPRESSO_NODE_DATABASE_QUERY_MAX_CONNECTIONS",
443            "ESPRESSO_SEQUENCER_DATABASE_QUERY_MAX_CONNECTIONS",
444        ),
445        // Min connections for query operations
446        (
447            "ESPRESSO_NODE_DATABASE_QUERY_MIN_CONNECTIONS",
448            "ESPRESSO_SEQUENCER_DATABASE_QUERY_MIN_CONNECTIONS",
449        ),
450        // Threshold for logging slow SQL statements
451        (
452            "ESPRESSO_NODE_DATABASE_SLOW_STATEMENT_THRESHOLD",
453            "ESPRESSO_SEQUENCER_DATABASE_SLOW_STATEMENT_THRESHOLD",
454        ),
455        // Max time for a single SQL statement before cancellation
456        (
457            "ESPRESSO_NODE_DATABASE_STATEMENT_TIMEOUT",
458            "ESPRESSO_SEQUENCER_DATABASE_STATEMENT_TIMEOUT",
459        ),
460        // Disable the proactive scanner task
461        (
462            "ESPRESSO_NODE_DISABLE_PROACTIVE_FETCHING",
463            "ESPRESSO_SEQUENCER_DISABLE_PROACTIVE_FETCHING",
464        ),
465        // Max concurrent fetch requests from peers
466        (
467            "ESPRESSO_NODE_FETCH_RATE_LIMIT",
468            "ESPRESSO_SEQUENCER_FETCH_RATE_LIMIT",
469        ),
470        // Run in lightweight mode (no DA participation)
471        (
472            "ESPRESSO_NODE_LIGHTWEIGHT",
473            "ESPRESSO_SEQUENCER_LIGHTWEIGHT",
474        ),
475        // Postgres database name
476        (
477            "ESPRESSO_NODE_POSTGRES_DATABASE",
478            "ESPRESSO_SEQUENCER_POSTGRES_DATABASE",
479        ),
480        // Postgres server hostname
481        (
482            "ESPRESSO_NODE_POSTGRES_HOST",
483            "ESPRESSO_SEQUENCER_POSTGRES_HOST",
484        ),
485        // Postgres password
486        (
487            "ESPRESSO_NODE_POSTGRES_PASSWORD",
488            "ESPRESSO_SEQUENCER_POSTGRES_PASSWORD",
489        ),
490        // Postgres server port
491        (
492            "ESPRESSO_NODE_POSTGRES_PORT",
493            "ESPRESSO_SEQUENCER_POSTGRES_PORT",
494        ),
495        // Use TLS for Postgres connection
496        (
497            "ESPRESSO_NODE_POSTGRES_USE_TLS",
498            "ESPRESSO_SEQUENCER_POSTGRES_USE_TLS",
499        ),
500        // Postgres user
501        (
502            "ESPRESSO_NODE_POSTGRES_USER",
503            "ESPRESSO_SEQUENCER_POSTGRES_USER",
504        ),
505        // Chunk size for proactive fetch scanning
506        (
507            "ESPRESSO_NODE_PROACTIVE_SCAN_CHUNK_SIZE",
508            "ESPRESSO_SEQUENCER_PROACTIVE_SCAN_CHUNK_SIZE",
509        ),
510        // Interval between proactive fetch scans
511        (
512            "ESPRESSO_NODE_PROACTIVE_SCAN_INTERVAL",
513            "ESPRESSO_SEQUENCER_PROACTIVE_SCAN_INTERVAL",
514        ),
515        // Batch size for pruning operations
516        (
517            "ESPRESSO_NODE_PRUNER_BATCH_SIZE",
518            "ESPRESSO_SEQUENCER_PRUNER_BATCH_SIZE",
519        ),
520        // SQLite pages to vacuum per cycle
521        (
522            "ESPRESSO_NODE_PRUNER_INCREMENTAL_VACUUM_PAGES",
523            "ESPRESSO_SEQUENCER_PRUNER_INCREMENTAL_VACUUM_PAGES",
524        ),
525        // Interval between pruning runs
526        (
527            "ESPRESSO_NODE_PRUNER_INTERVAL",
528            "ESPRESSO_SEQUENCER_PRUNER_INTERVAL",
529        ),
530        // Max disk usage in basis points
531        (
532            "ESPRESSO_NODE_PRUNER_MAX_USAGE",
533            "ESPRESSO_SEQUENCER_PRUNER_MAX_USAGE",
534        ),
535        // Minimum data retention period
536        (
537            "ESPRESSO_NODE_PRUNER_MINIMUM_RETENTION",
538            "ESPRESSO_SEQUENCER_PRUNER_MINIMUM_RETENTION",
539        ),
540        // Pruning threshold in bytes
541        (
542            "ESPRESSO_NODE_PRUNER_PRUNING_THRESHOLD",
543            "ESPRESSO_SEQUENCER_PRUNER_PRUNING_THRESHOLD",
544        ),
545        // Target data retention period
546        (
547            "ESPRESSO_NODE_PRUNER_TARGET_RETENTION",
548            "ESPRESSO_SEQUENCER_PRUNER_TARGET_RETENTION",
549        ),
550        // Path for node storage (filesystem backend)
551        (
552            "ESPRESSO_NODE_STORAGE_PATH",
553            "ESPRESSO_SEQUENCER_STORAGE_PATH",
554        ),
555        // Chunk size for sync status scanning
556        (
557            "ESPRESSO_NODE_SYNC_STATUS_CHUNK_SIZE",
558            "ESPRESSO_SEQUENCER_SYNC_STATUS_CHUNK_SIZE",
559        ),
560        // ── crates/espresso/node/src/proposal_fetcher.rs ──
561        // Timeout for proposal fetch requests
562        (
563            "ESPRESSO_NODE_PROPOSAL_FETCHER_FETCH_TIMEOUT",
564            "ESPRESSO_SEQUENCER_PROPOSAL_FETCHER_FETCH_TIMEOUT",
565        ),
566        // Number of proposal fetcher workers
567        (
568            "ESPRESSO_NODE_PROPOSAL_FETCHER_NUM_WORKERS",
569            "ESPRESSO_SEQUENCER_PROPOSAL_FETCHER_NUM_WORKERS",
570        ),
571        // ── crates/espresso/types/src/v0/v0_4/state.rs ──
572        // Reward merkle tree concurrent update permits
573        (
574            "ESPRESSO_NODE_REWARD_MERKLE_TREE_PERMITS",
575            "ESPRESSO_SEQUENCER_REWARD_MERKLE_TREE_PERMITS",
576        ),
577        // ── crates/espresso/types/src/v0/utils.rs ──
578        // Disable catchup retries after first failure
579        (
580            "ESPRESSO_NODE_CATCHUP_BACKOFF_DISABLE",
581            "ESPRESSO_SEQUENCER_CATCHUP_BACKOFF_DISABLE",
582        ),
583        // Exponential backoff factor for catchup retries
584        (
585            "ESPRESSO_NODE_CATCHUP_BACKOFF_FACTOR",
586            "ESPRESSO_SEQUENCER_CATCHUP_BACKOFF_FACTOR",
587        ),
588        // Jitter for catchup retry backoff
589        (
590            "ESPRESSO_NODE_CATCHUP_BACKOFF_JITTER",
591            "ESPRESSO_SEQUENCER_CATCHUP_BACKOFF_JITTER",
592        ),
593        // Base delay between catchup retries
594        (
595            "ESPRESSO_NODE_CATCHUP_BASE_RETRY_DELAY",
596            "ESPRESSO_SEQUENCER_CATCHUP_BASE_RETRY_DELAY",
597        ),
598        // Maximum delay between catchup retries
599        (
600            "ESPRESSO_NODE_CATCHUP_MAX_RETRY_DELAY",
601            "ESPRESSO_SEQUENCER_CATCHUP_MAX_RETRY_DELAY",
602        ),
603        // ── crates/espresso/types/src/v0/v0_1/l1.rs ──
604        // Interval for polling L1 stake table updates
605        (
606            "ESPRESSO_NODE_L1_STAKE_TABLE_UPDATE_INTERVAL",
607            "ESPRESSO_SEQUENCER_L1_STAKE_TABLE_UPDATE_INTERVAL",
608        ),
609        // Number of L1 blocks to cache
610        (
611            "ESPRESSO_L1_BLOCKS_CACHE_SIZE",
612            "ESPRESSO_SEQUENCER_L1_BLOCKS_CACHE_SIZE",
613        ),
614        // Consecutive L1 failures before failover
615        (
616            "ESPRESSO_L1_CONSECUTIVE_FAILURE_TOLERANCE",
617            "ESPRESSO_SEQUENCER_L1_CONSECUTIVE_FAILURE_TOLERANCE",
618        ),
619        // Channel capacity for L1 event processing
620        (
621            "ESPRESSO_L1_EVENTS_CHANNEL_CAPACITY",
622            "ESPRESSO_SEQUENCER_L1_EVENTS_CHANNEL_CAPACITY",
623        ),
624        // Max block range per L1 event query
625        (
626            "ESPRESSO_L1_EVENTS_MAX_BLOCK_RANGE",
627            "ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE",
628        ),
629        // Max retry duration for L1 event fetching
630        (
631            "ESPRESSO_L1_EVENTS_MAX_RETRY_DURATION",
632            "ESPRESSO_SEQUENCER_L1_EVENTS_MAX_RETRY_DURATION",
633        ),
634        // Revert to primary L1 provider after failover
635        (
636            "ESPRESSO_L1_FAILOVER_REVERT",
637            "ESPRESSO_SEQUENCER_L1_FAILOVER_REVERT",
638        ),
639        // Safety margin for L1 finalized block lookback
640        (
641            "ESPRESSO_L1_FINALIZED_SAFETY_MARGIN",
642            "ESPRESSO_SEQUENCER_L1_FINALIZED_SAFETY_MARGIN",
643        ),
644        // Frequent L1 failures before failover
645        (
646            "ESPRESSO_L1_FREQUENT_FAILURE_TOLERANCE",
647            "ESPRESSO_SEQUENCER_L1_FREQUENT_FAILURE_TOLERANCE",
648        ),
649        // L1 polling interval
650        (
651            "ESPRESSO_L1_POLLING_INTERVAL",
652            "ESPRESSO_SEQUENCER_L1_POLLING_INTERVAL",
653        ),
654        // Delay between L1 RPC requests for rate limiting
655        (
656            "ESPRESSO_L1_RATE_LIMIT_DELAY",
657            "ESPRESSO_SEQUENCER_L1_RATE_LIMIT_DELAY",
658        ),
659        // Delay before retrying a failed L1 request
660        (
661            "ESPRESSO_L1_RETRY_DELAY",
662            "ESPRESSO_SEQUENCER_L1_RETRY_DELAY",
663        ),
664        // Timeout for L1 WebSocket subscriptions
665        (
666            "ESPRESSO_L1_SUBSCRIPTION_TIMEOUT",
667            "ESPRESSO_SEQUENCER_L1_SUBSCRIPTION_TIMEOUT",
668        ),
669        // L1 WebSocket provider URL for subscriptions
670        (
671            "ESPRESSO_L1_WS_PROVIDER",
672            "ESPRESSO_SEQUENCER_L1_WS_PROVIDER",
673        ),
674        // ── crates/hotshot-state-prover/src/bin/state-prover.rs ──
675        // Light client proxy contract address
676        (
677            "ESPRESSO_LIGHT_CLIENT_PROXY_ADDRESS",
678            "ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS",
679        ),
680        // Account index for the state prover wallet
681        (
682            "ESPRESSO_STATE_PROVER_ACCOUNT_INDEX",
683            "ESPRESSO_SEQUENCER_STATE_PROVER_ACCOUNT_INDEX",
684        ),
685        // ── crates/staking-cli/src/lib.rs ──
686        // Stake table proxy contract address
687        (
688            "ESPRESSO_STAKE_TABLE_PROXY_ADDRESS",
689            "ESPRESSO_SEQUENCER_STAKE_TABLE_PROXY_ADDRESS",
690        ),
691        // ── unknown ──
692        // Light client contract address
693        (
694            "ESPRESSO_LIGHT_CLIENT_ADDRESS",
695            "ESPRESSO_SEQUENCER_LIGHT_CLIENT_ADDRESS",
696        ),
697        // Light client V2 contract address
698        (
699            "ESPRESSO_LIGHT_CLIENT_V2_ADDRESS",
700            "ESPRESSO_SEQUENCER_LIGHT_CLIENT_V2_ADDRESS",
701        ),
702        // Light client V3 contract address
703        (
704            "ESPRESSO_LIGHT_CLIENT_V3_ADDRESS",
705            "ESPRESSO_SEQUENCER_LIGHT_CLIENT_V3_ADDRESS",
706        ),
707        // Stake table contract address
708        (
709            "ESPRESSO_STAKE_TABLE_ADDRESS",
710            "ESPRESSO_SEQUENCER_STAKE_TABLE_ADDRESS",
711        ),
712        // Stake table V2 contract address
713        (
714            "ESPRESSO_STAKE_TABLE_V2_ADDRESS",
715            "ESPRESSO_SEQUENCER_STAKE_TABLE_V2_ADDRESS",
716        ),
717        // ESP token contract address
718        ("ESP_TOKEN_ADDRESS", "ESPRESSO_SEQUENCER_ESP_TOKEN_ADDRESS"),
719        // ESP token V2 contract address
720        (
721            "ESP_TOKEN_V2_ADDRESS",
722            "ESPRESSO_SEQUENCER_ESP_TOKEN_V2_ADDRESS",
723        ),
724        // Fee contract address
725        (
726            "ESPRESSO_FEE_CONTRACT_ADDRESS",
727            "ESPRESSO_SEQUENCER_FEE_CONTRACT_ADDRESS",
728        ),
729        // Reward claim contract address
730        (
731            "ESPRESSO_REWARD_CLAIM_ADDRESS",
732            "ESPRESSO_SEQUENCER_REWARD_CLAIM_ADDRESS",
733        ),
734        // PlonkVerifier contract address
735        (
736            "ESPRESSO_PLONK_VERIFIER_ADDRESS",
737            "ESPRESSO_SEQUENCER_PLONK_VERIFIER_ADDRESS",
738        ),
739        // PlonkVerifier V2 contract address
740        (
741            "ESPRESSO_PLONK_VERIFIER_V2_ADDRESS",
742            "ESPRESSO_SEQUENCER_PLONK_VERIFIER_V2_ADDRESS",
743        ),
744        // PlonkVerifier V3 contract address
745        (
746            "ESPRESSO_PLONK_VERIFIER_V3_ADDRESS",
747            "ESPRESSO_SEQUENCER_PLONK_VERIFIER_V3_ADDRESS",
748        ),
749    ];
750
751    let mut migrated = Vec::new();
752    for &(new, old) in MAPPINGS {
753        if std::env::var(new).is_err()
754            && let Ok(val) = std::env::var(old)
755        {
756            eprintln!("WARNING: {old} is deprecated, use {new} instead");
757            // SAFETY: called from sync fn main() before tokio runtime starts,
758            // guaranteeing single-threaded execution.
759            unsafe { std::env::set_var(new, val) };
760            migrated.push((old, new));
761        }
762    }
763    migrated
764}
765
766/// Log migrated env vars via tracing. Call after tracing is initialized.
767pub fn log_migrated_env_vars(migrated: &[(&str, &str)]) {
768    if migrated.is_empty() {
769        return;
770    }
771
772    for &(old, new) in migrated {
773        tracing::warn!(old, new, "migrated deprecated env var");
774    }
775}